124 lines
4.8 KiB
Python
124 lines
4.8 KiB
Python
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
|
|
|