if transaction status is success update item & if not, update everything

This commit is contained in:
2025-09-28 15:04:21 +03:30
parent 3ce5d9b543
commit 305bd4ec0b

View File

@@ -30,6 +30,7 @@ from apps.warehouse.exceptions import (
) )
from rest_framework import serializers from rest_framework import serializers
from apps.herd.models import Rancher from apps.herd.models import Rancher
from django.db.models import Q
from django.db import models from django.db import models
@@ -121,29 +122,69 @@ class InventoryQuotaSaleTransactionSerializer(serializers.ModelSerializer):
def create(self, validated_data): def create(self, validated_data):
items_data = self.context['request'].data['items'] items_data = self.context['request'].data['items']
rancher_code = validated_data.pop('rancher_national_code')
with atomic(): with atomic():
# get rancher with national code # get rancher with national code
if 'rancher_national_code' in validated_data.keys(): rancher = None
rancher = Rancher.objects.get(national_code=validated_data.pop('rancher_national_code')) if rancher_code:
validated_data.update({'rancher': rancher}) rancher = Rancher.objects.get(national_code=rancher_code)
validated_data['rancher'] = rancher
# if transaction exists, update transaction status # if transaction exists, update transaction status
transaction = self.Meta.model.objects.filter( transaction = self.Meta.model.objects.filter(
transaction_id=validated_data.get('transaction_id') transaction_id=validated_data.get('transaction_id')
) )
if transaction.exists(): if transaction.exists():
obj = transaction.first() transaction = transaction.first()
obj.transaction_status = validated_data.get('transaction_status')
obj.transaction_status_code = validated_data.get('transaction_status_code')
obj.result_text = validated_data.get('result_text')
obj.ref_num = validated_data.get('ref_num')
obj.terminal = validated_data.get('terminal')
obj.payer_cart = validated_data.get('payer_cart')
obj.save(update_fields=['transaction_status'])
return obj # --- Case 1: success => only update items
if transaction.transaction_status == 'success':
for item_data in items_data:
warehouse_models.InventoryQuotaSaleItem.objects.filter(
Q(transaction=transaction) & (
Q(free_product_id=item_data['free_product']) |
Q(gov_product_id=item_data['gov_product'])
)
).update(**item_data)
return transaction
# create transaction record # --- Case 2: not success => update transaction fields + items
for field in [
'transaction_status',
'transaction_status_code',
'result_text',
'ref_num',
'terminal',
'payer_cart',
'pos_date',
'transaction_date',
]:
if field in validated_data:
setattr(transaction, field, validated_data)
transaction.save(update_fields=[
'transaction_status',
'transaction_status_code',
'result_text',
'ref_num',
'terminal',
'payer_cart',
'pos_date',
'transaction_date',
])
# items can change
for item_data in items_data:
warehouse_models.InventoryQuotaSaleItem.objects.filter(
Q(transaction=transaction) & (
Q(free_product_id=item_data['free_product']) |
Q(gov_product_id=item_data['gov_product'])
)
).update(**item_data)
return transaction
# --- Case 3: create new transaction
transaction = warehouse_models.InventoryQuotaSaleTransaction.objects.create( transaction = warehouse_models.InventoryQuotaSaleTransaction.objects.create(
seller_organization=self.context['organization'], seller_organization=self.context['organization'],
pos_device=self.context['pos_device'], pos_device=self.context['pos_device'],
@@ -154,12 +195,12 @@ class InventoryQuotaSaleTransactionSerializer(serializers.ModelSerializer):
total_price = 0 total_price = 0
for item_data in items_data: for item_data in items_data:
# get product by type # get product by type
gov_product = item_data.pop('gov_product') if 'gov_product' in item_data.keys() else None gov_product = item_data.pop('gov_product', None)
free_product = item_data.pop('free_product') if 'free_product' in item_data.keys() else None free_product = item_data.pop('free_product', None)
distribution = QuotaDistribution.objects.get( distribution = QuotaDistribution.objects.filter(
id=item_data.pop('quota_distribution') id=item_data.pop('quota_distribution')
) if 'quota_distribution' in item_data.keys() else None ).first() if 'quota_distribution' in item_data.keys() else None
# create item for transaction # create item for transaction
item = warehouse_models.InventoryQuotaSaleItem.objects.create( item = warehouse_models.InventoryQuotaSaleItem.objects.create(