Add invoice cancelled status, treasury event name, and voucher number backfill.
EOF Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -73,14 +73,29 @@ class VoucherLineSerializer(serializers.ModelSerializer):
|
||||
|
||||
class VoucherSerializer(serializers.ModelSerializer):
|
||||
lines = VoucherLineSerializer(many=True)
|
||||
regarding = serializers.CharField(required=False, allow_blank=True)
|
||||
|
||||
class Meta:
|
||||
model = Voucher
|
||||
fields = ['id', 'number', 'date', 'description', 'status', 'source', 'lines']
|
||||
fields = ['id', 'number', 'date', 'regarding', 'description', 'status', 'source', 'lines']
|
||||
read_only_fields = ['number']
|
||||
|
||||
@staticmethod
|
||||
def _next_number() -> int:
|
||||
last_number = (
|
||||
Voucher.objects.select_for_update()
|
||||
.order_by('-number')
|
||||
.values_list('number', flat=True)
|
||||
.first()
|
||||
or 0
|
||||
)
|
||||
return last_number + 1
|
||||
|
||||
@transaction.atomic
|
||||
def create(self, validated_data):
|
||||
lines = validated_data.pop('lines', [])
|
||||
validated_data.setdefault('regarding', '')
|
||||
validated_data['number'] = self._next_number()
|
||||
voucher = Voucher.objects.create(**validated_data)
|
||||
for line in lines:
|
||||
line.pop('id', None)
|
||||
@@ -90,6 +105,12 @@ class VoucherSerializer(serializers.ModelSerializer):
|
||||
@transaction.atomic
|
||||
def update(self, instance, validated_data):
|
||||
lines = validated_data.pop('lines', None)
|
||||
# Keep voucher numbers immutable after creation.
|
||||
validated_data.pop('number', None)
|
||||
if 'regarding' in validated_data and validated_data['regarding'] is None:
|
||||
validated_data['regarding'] = ''
|
||||
if instance.number <= 0:
|
||||
instance.number = self._next_number()
|
||||
for attr, value in validated_data.items():
|
||||
setattr(instance, attr, value)
|
||||
instance.save()
|
||||
@@ -123,10 +144,11 @@ class InvoiceLineSerializer(serializers.ModelSerializer):
|
||||
)
|
||||
unitPrice = serializers.FloatField(source='unit_price', required=False)
|
||||
taxRate = serializers.FloatField(source='tax_rate', required=False)
|
||||
eventName = serializers.CharField(source='event_name', required=False, allow_blank=True)
|
||||
|
||||
class Meta:
|
||||
model = InvoiceLine
|
||||
fields = ['id', 'productId', 'quantity', 'unitPrice', 'discount', 'taxRate']
|
||||
fields = ['id', 'productId', 'quantity', 'unitPrice', 'discount', 'taxRate', 'eventName']
|
||||
|
||||
|
||||
class InvoiceSerializer(serializers.ModelSerializer):
|
||||
@@ -155,6 +177,7 @@ class InvoiceSerializer(serializers.ModelSerializer):
|
||||
invoice = Invoice.objects.create(**validated_data)
|
||||
for line in lines:
|
||||
line.pop('id', None)
|
||||
line.setdefault('event_name', '')
|
||||
InvoiceLine.objects.create(invoice=invoice, **line)
|
||||
return invoice
|
||||
|
||||
@@ -168,6 +191,7 @@ class InvoiceSerializer(serializers.ModelSerializer):
|
||||
instance.lines.all().delete()
|
||||
for line in lines:
|
||||
line.pop('id', None)
|
||||
line.setdefault('event_name', '')
|
||||
InvoiceLine.objects.create(invoice=instance, **line)
|
||||
return instance
|
||||
|
||||
@@ -181,13 +205,14 @@ class TreasuryTxnSerializer(serializers.ModelSerializer):
|
||||
taxAmount = serializers.FloatField(source='tax_amount', required=False)
|
||||
platformProfitAmount = serializers.FloatField(source='platform_profit_amount', required=False)
|
||||
ownerNetAmount = serializers.FloatField(source='owner_net_amount', required=False)
|
||||
eventName = serializers.CharField(source='event_name', required=False, allow_blank=True)
|
||||
|
||||
class Meta:
|
||||
model = TreasuryTxn
|
||||
fields = [
|
||||
'id', 'number', 'kind', 'method', 'date', 'partyId', 'amount',
|
||||
'taxAmount', 'platformProfitAmount', 'ownerNetAmount',
|
||||
'reference', 'description', 'source',
|
||||
'reference', 'description', 'eventName', 'source',
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user