from django.db import transaction from rest_framework import serializers from core.apps.counterparty.models import Counterparty, CounterpartyFolder, CounterpartyBalance from core.apps.shared.models import Region, District from core.apps.counterparty.serializers.counterparty_balance import ( CounterpartyBalanceSerializer, CounterpartyBalanceCreateSerializer, CounterpartyBalanceUpdateSerializer ) class CounterpartyListSerializer(serializers.ModelSerializer): balance = CounterpartyBalanceSerializer() class Meta: model = Counterparty fields = [ 'id', 'inn', 'name', 'phone', 'type', 'folder', 'type', 'region', 'district', 'comment', 'is_archived', 'balance', ] class CounterpartySerializer(serializers.ModelSerializer): class Meta: model = Counterparty fields = [ 'id', 'name' ] class CounterpartyCreateSerializer(serializers.Serializer): inn = serializers.CharField() name = serializers.CharField() phone = serializers.CharField() type = serializers.ChoiceField(choices=Counterparty.TYPE, required=False) folder_id = serializers.UUIDField(required=False) region_id = serializers.UUIDField(required=False) district_id = serializers.UUIDField(required=False) comment = serializers.CharField(required=False) balance = CounterpartyBalanceCreateSerializer(required=False) def validate(self, data): if data.get('folder_id'): folder = CounterpartyFolder.objects.filter(id=data.get('folder_id')).first() if not folder: raise serializers.ValidationError("Counterparty Folder not found") data['folder'] = folder if data.get('region_id'): region = Region.objects.filter(id=data.get('region_id')).first() if not region: raise serializers.ValidationError("Region not found") data['region'] = region if data.get('district_id'): district = District.objects.filter(id=data.get('district_id')).first() if not district: raise serializers.ValidationError("District not found") return data def create(self, validated_data): balance_data = validated_data.pop('balance', {}) or {} with transaction.atomic(): counterparty = Counterparty.objects.create( inn=validated_data.get('inn'), name=validated_data.get('name'), phone=validated_data.get('phone'), type=validated_data.get('type'), folder=validated_data.get('folder'), region=validated_data.get('region'), district=validated_data.get('district'), comment=validated_data.get('comment'), ) CounterpartyBalance.objects.create( counterparty=counterparty, balance_uzs=balance_data.get('balance_uzs', 0), balance_usd=balance_data.get('balance_usd', 0), balance_date=balance_data.get('balance_date'), kredit_usd=0, kredit_uzs=0, debit_usd=0, debit_uzs=0, ) return counterparty class CounterpartyUpdateSerializer(serializers.ModelSerializer): balance = CounterpartyBalanceUpdateSerializer(required=False) class Meta: model = Counterparty fields = [ 'inn', 'name', 'phone', 'type', 'folder', 'region', 'district', 'balance', 'comment' ] extra_kwargs = { 'name': {'required': False}, 'type': {'required': False}, 'folder': {'required': False}, 'region': {'required': False}, 'district': {'required': False}, 'comment': {'required': False} } def update(self, instance, validated_data): instance.inn = validated_data.get('inn', instance.inn) instance.name = validated_data.get('name', instance.name) instance.phone = validated_data.get('phone', instance.phone) instance.type = validated_data.get('type', instance.type) instance.folder = validated_data.get('folder', instance.folder) instance.region = validated_data.get('region', instance.region) instance.district = validated_data.get('district', instance.district) instance.comment = validated_data.get('district', instance.comment) # balance balance_data = validated_data.get('balance') instance.balance.balance_uzs = balance_data.get('balance_uzs', instance.balance.balance_uzs) instance.balance.balance_usd = balance_data.get('balance_usd', instance.balance.balance_usd) instance.balance.balance_date = balance_data.get('balance_date', instance.balance.balance_date) instance.balance.save() instance.save() return instance