mirror of
https://github.com/himool/HimoolERP.git
synced 2026-01-10 19:34:07 +08:00
324 lines
14 KiB
Python
324 lines
14 KiB
Python
from extensions.common.base import *
|
|
from extensions.serializers import *
|
|
from extensions.exceptions import *
|
|
from apps.finance.models import *
|
|
from apps.data.models import *
|
|
from apps.system.models import *
|
|
|
|
|
|
class ClientArrearsSerializer(BaseSerializer):
|
|
"""应收欠款"""
|
|
|
|
level_display = CharField(source='get_level_display', read_only=True, label='等级')
|
|
|
|
class Meta:
|
|
model = Client
|
|
fields = ['id', 'number', 'name', 'level', 'level_display',
|
|
'contact', 'phone', 'email', 'address', 'remark', 'is_active',
|
|
'initial_arrears_amount', 'arrears_amount', 'has_arrears']
|
|
|
|
|
|
class SupplierArrearsSerializer(BaseSerializer):
|
|
"""应付欠款"""
|
|
|
|
|
|
class Meta:
|
|
model = Supplier
|
|
fields = ['id', 'number', 'name', 'contact', 'phone', 'email',
|
|
'address', 'bank_account', 'bank_name', 'remark', 'is_active',
|
|
'initial_arrears_amount', 'arrears_amount', 'has_arrears']
|
|
|
|
|
|
class PaymentOrderSerializer(BaseSerializer):
|
|
"""付款单据"""
|
|
|
|
class PaymentAccountSerializer(BaseSerializer):
|
|
"""付款账户"""
|
|
|
|
account_number = CharField(source='account.number', read_only=True, label='账户编号')
|
|
account_name = CharField(source='account.name', read_only=True, label='账户名称')
|
|
|
|
class Meta:
|
|
model = PaymentAccount
|
|
read_only_fields = ['id', 'account_number', 'account_name']
|
|
fields = ['account', 'payment_amount', *read_only_fields]
|
|
|
|
def validate_account(self, instance):
|
|
instance = self.validate_foreign_key(Account, instance, message='账户不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'账户[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate_payment_amount(self, value):
|
|
if value <= 0:
|
|
raise ValidationError('付款金额小于或等于零')
|
|
return value
|
|
|
|
supplier_number = CharField(source='supplier.number', read_only=True, label='供应商编号')
|
|
supplier_name = CharField(source='supplier.name', read_only=True, label='供应商名称')
|
|
handler_name = CharField(source='handler.name', read_only=True, label='经手人名称')
|
|
creator_name = CharField(source='creator.name', read_only=True, label='创建人名称')
|
|
payment_account_items = PaymentAccountSerializer(source='payment_accounts', many=True, label='付款账户')
|
|
|
|
class Meta:
|
|
model = PaymentOrder
|
|
read_only_fields = ['id', 'supplier_number', 'supplier_name', 'handler_name', 'is_void',
|
|
'creator', 'handler_name', 'creator_name', 'create_time']
|
|
fields = ['number', 'supplier', 'handler', 'handle_time', 'remark', 'discount_amount',
|
|
'payment_account_items', *read_only_fields]
|
|
|
|
def validate_number(self, value):
|
|
self.validate_unique({'number': value}, message=f'编号[{value}]已存在')
|
|
return value
|
|
|
|
def validate_supplier(self, instance):
|
|
instance = self.validate_foreign_key(Supplier, instance, message='供应商不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'供应商[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate_handler(self, instance):
|
|
instance = self.validate_foreign_key(User, instance, message='经手人不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'经手人[{instance.name}]未激活')
|
|
return instance
|
|
|
|
@transaction.atomic
|
|
def create(self, validated_data):
|
|
payment_account_items = validated_data.pop('payment_accounts')
|
|
|
|
validated_data['creator'] = self.user
|
|
payment_order = super().create(validated_data)
|
|
|
|
total_payment_amount = 0
|
|
|
|
# 创建付款账户
|
|
payment_accounts = []
|
|
for payment_account_item in payment_account_items:
|
|
payment_amount = payment_account_item['payment_amount']
|
|
payment_accounts.append(PaymentAccount(
|
|
payment_order=payment_order, account=payment_account_item['account'],
|
|
payment_amount=payment_amount, team=self.team
|
|
))
|
|
|
|
total_payment_amount = NP.plus(total_payment_amount, payment_amount)
|
|
else:
|
|
PaymentAccount.objects.bulk_create(payment_accounts)
|
|
total_payment_amount = NP.plus(total_payment_amount, payment_order.discount_amount)
|
|
payment_order.total_amount = total_payment_amount
|
|
payment_order.save(update_fields=['total_amount'])
|
|
|
|
return payment_order
|
|
|
|
|
|
class CollectionOrderSerializer(BaseSerializer):
|
|
"""收款单据"""
|
|
|
|
class CollectionAccountSerializer(BaseSerializer):
|
|
"""收款账户"""
|
|
|
|
account_number = CharField(source='account.number', read_only=True, label='账户编号')
|
|
account_name = CharField(source='account.name', read_only=True, label='账户名称')
|
|
|
|
class Meta:
|
|
model = CollectionAccount
|
|
read_only_fields = ['id', 'account_number', 'account_name']
|
|
fields = ['account', 'collection_amount', *read_only_fields]
|
|
|
|
def validate_account(self, instance):
|
|
instance = self.validate_foreign_key(Account, instance, message='账户不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'账户[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate_collection_amount(self, value):
|
|
if value <= 0:
|
|
raise ValidationError('收款金额小于或等于零')
|
|
return value
|
|
|
|
client_number = CharField(source='client.number', read_only=True, label='客户编号')
|
|
client_name = CharField(source='client.name', read_only=True, label='客户名称')
|
|
handler_name = CharField(source='handler.name', read_only=True, label='经手人名称')
|
|
creator_name = CharField(source='creator.name', read_only=True, label='创建人名称')
|
|
collection_account_items = CollectionAccountSerializer(
|
|
source='collection_accounts', many=True, label='收款账户')
|
|
|
|
class Meta:
|
|
model = CollectionOrder
|
|
read_only_fields = ['id', 'client_number', 'client_name', 'handler_name', 'is_void',
|
|
'creator', 'handler_name', 'creator_name', 'create_time']
|
|
fields = ['number', 'client', 'handler', 'handle_time', 'remark', 'discount_amount',
|
|
'collection_account_items', *read_only_fields]
|
|
|
|
def validate_number(self, value):
|
|
self.validate_unique({'number': value}, message=f'编号[{value}]已存在')
|
|
return value
|
|
|
|
def validate_client(self, instance):
|
|
instance = self.validate_foreign_key(Client, instance, message='客户不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'客户[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate_handler(self, instance):
|
|
instance = self.validate_foreign_key(User, instance, message='经手人不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'经手人[{instance.name}]未激活')
|
|
return instance
|
|
|
|
@transaction.atomic
|
|
def create(self, validated_data):
|
|
collection_account_items = validated_data.pop('collection_accounts')
|
|
|
|
validated_data['creator'] = self.user
|
|
collection_order = super().create(validated_data)
|
|
|
|
total_collection_amount = 0
|
|
|
|
# 创建收款账户
|
|
collection_accounts = []
|
|
for collection_account_item in collection_account_items:
|
|
collection_amount = collection_account_item['collection_amount']
|
|
collection_accounts.append(CollectionAccount(
|
|
collection_order=collection_order, account=collection_account_item['account'],
|
|
collection_amount=collection_amount, team=self.team
|
|
))
|
|
|
|
total_collection_amount = NP.plus(total_collection_amount, collection_amount)
|
|
else:
|
|
CollectionAccount.objects.bulk_create(collection_accounts)
|
|
total_collection_amount = NP.plus(total_collection_amount, collection_order.discount_amount)
|
|
collection_order.total_amount = total_collection_amount
|
|
collection_order.save(update_fields=['total_amount'])
|
|
|
|
return collection_order
|
|
|
|
|
|
class ChargeOrderSerializer(BaseSerializer):
|
|
"""收支单据"""
|
|
|
|
type_display = CharField(source='get_type_display', read_only=True, label='收支类型')
|
|
supplier_number = CharField(source='supplier.number', read_only=True, label='供应商编号')
|
|
supplier_name = CharField(source='supplier.name', read_only=True, label='供应商名称')
|
|
client_number = CharField(source='client.number', read_only=True, label='客户编号')
|
|
client_name = CharField(source='client.name', read_only=True, label='客户名称')
|
|
handler_name = CharField(source='handler.name', read_only=True, label='经手人名称')
|
|
account_number = CharField(source='account.number', read_only=True, label='账户编号')
|
|
account_name = CharField(source='account.name', read_only=True, label='账户名称')
|
|
creator_name = CharField(source='creator.name', read_only=True, label='创建人名称')
|
|
|
|
class Meta:
|
|
model = ChargeOrder
|
|
read_only_fields = ['id', 'type_display', 'supplier_number', 'supplier_name', 'client_number',
|
|
'client_name', 'handler_name', 'charge_item_name', 'account_number',
|
|
'account_name', 'is_void', 'creator', 'creator_name', 'create_time']
|
|
fields = ['number', 'type', 'client', 'supplier', 'handler', 'handle_time', 'charge_item',
|
|
'account', 'total_amount', 'charge_amount', 'remark', *read_only_fields]
|
|
|
|
def validate_number(self, value):
|
|
self.validate_unique({'number': value}, message=f'编号[{value}]已存在')
|
|
return value
|
|
|
|
def validate_supplier(self, instance):
|
|
instance = self.validate_foreign_key(Supplier, instance, message='供应商不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'供应商[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate_client(self, instance):
|
|
instance = self.validate_foreign_key(Client, instance, message='客户不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'客户[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate_handler(self, instance):
|
|
instance = self.validate_foreign_key(User, instance, message='经手人不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'经手人[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate_charge_item(self, instance):
|
|
instance = self.validate_foreign_key(ChargeItem, instance, message='收支项目不存在')
|
|
return instance
|
|
|
|
def validate_account(self, instance):
|
|
instance = self.validate_foreign_key(Account, instance, message='结算账户不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'结算账户[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate(self, attrs):
|
|
supplier = attrs.get('supplier')
|
|
client = attrs.get('client')
|
|
if (supplier and client) or not (supplier or client):
|
|
raise ValidationError('供应商或客户选择重复')
|
|
|
|
if attrs['type'] != attrs['charge_item'].type:
|
|
raise ValidationError('收支类型与收支项目不匹配')
|
|
|
|
if attrs['charge_amount'] > attrs['total_amount']:
|
|
raise ValidationError('实收/付金额大于应收/付金额')
|
|
return super().validate(attrs)
|
|
|
|
def create(self, validated_data):
|
|
validated_data['charge_item_name'] = validated_data['charge_item'].name
|
|
validated_data['creator'] = self.user
|
|
|
|
return super().create(validated_data)
|
|
|
|
|
|
class AccountTransferRecordSerializer(BaseSerializer):
|
|
"""收支单据"""
|
|
|
|
out_account_number = CharField(source='out_account.number', read_only=True, label='转出账户编号')
|
|
out_account_name = CharField(source='out_account.name', read_only=True, label='转出账户名称')
|
|
in_account_number = CharField(source='out_account.number', read_only=True, label='转入账户编号')
|
|
in_account_name = CharField(source='out_account.name', read_only=True, label='转入账户名称')
|
|
service_charge_payer_display = CharField(
|
|
source='get_service_charge_payer_display', read_only=True, label='手续费支付方')
|
|
handler_name = CharField(source='handler.name', read_only=True, label='经手人名称')
|
|
creator_name = CharField(source='creator.name', read_only=True, label='创建人名称')
|
|
|
|
class Meta:
|
|
model = AccountTransferRecord
|
|
read_only_fields = ['id', 'out_account_number', 'out_account_name', 'in_account_number',
|
|
'in_account_name', 'service_charge_payer_display', 'handler_name',
|
|
'is_void', 'creator', 'creator_name', 'create_time']
|
|
fields = ['out_account', 'transfer_out_time', 'in_account', 'transfer_in_time',
|
|
'transfer_amount', 'service_charge_amount', 'service_charge_payer', 'handler',
|
|
'handle_time', 'remark', *read_only_fields]
|
|
|
|
def validate_out_account(self, instance):
|
|
instance = self.validate_foreign_key(Account, instance, message='转出账户不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'转出账户[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate_in_account(self, instance):
|
|
instance = self.validate_foreign_key(Account, instance, message='转入账户不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'转入账户[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate_handler(self, instance):
|
|
instance = self.validate_foreign_key(User, instance, message='经手人不存在')
|
|
if not instance.is_active:
|
|
raise ValidationError(f'经手人[{instance.name}]未激活')
|
|
return instance
|
|
|
|
def validate(self, attrs):
|
|
if attrs['out_account'] == attrs['in_account']:
|
|
raise ValidationError('转出转入账户相同')
|
|
return super().validate(attrs)
|
|
|
|
def create(self, validated_data):
|
|
validated_data['creator'] = self.user
|
|
|
|
return super().create(validated_data)
|
|
|
|
|
|
__all__ = [
|
|
'ClientArrearsSerializer', 'SupplierArrearsSerializer',
|
|
'PaymentOrderSerializer', 'CollectionOrderSerializer',
|
|
'ChargeOrderSerializer', 'AccountTransferRecordSerializer',
|
|
]
|