fix update organization - set signal for calculate remaining quota weight after distribution

This commit is contained in:
2025-06-16 10:44:12 +03:30
parent 2164c4415b
commit 1471e31aa4
6 changed files with 55 additions and 9 deletions

View File

@@ -246,6 +246,7 @@ class Quota(BaseModel):
quota_id = models.PositiveBigIntegerField(null=True, blank=True)
quota_code = models.CharField(max_length=15, null=True)
quota_weight = models.PositiveIntegerField(default=0)
remaining_quota_weight = models.PositiveBigIntegerField(default=0)
quota_distributed = models.PositiveIntegerField(default=0)
quota_balance = models.PositiveIntegerField(default=0)
product = models.ForeignKey(

19
apps/product/signals.py Normal file
View File

@@ -0,0 +1,19 @@
from django.db.models import Sum
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from .models import QuotaDistribution, Quota
def recalculate_remaining_amount(quota):
total_distributed = quota.distributions.aggregate(
total=Sum('amount_kg')
)['total'] or 0
quota.remaining_amount_kg = quota.total_amount_kg - total_distributed
quota.save(update_fields=["remaining_amount_kg"])
@receiver(post_save, sender=QuotaDistribution)
@receiver(post_delete, sender=QuotaDistribution)
def update_quota_remaining(sender, instance, **kwargs):
recalculate_remaining_amount(instance.quota)

View File

@@ -352,6 +352,7 @@ class QuotaViewSet(viewsets.ModelViewSet): # noqa
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
quota = serializer.save()
quota.remaining_quota_weight = quota.quota_weight
# create incentive plan
if 'incentive_plan_data' in request.data.keys():

View File

@@ -20,7 +20,7 @@ class QuotaDistributionSerializer(serializers.ModelSerializer):
""" to validate if distribution weight
more than quota weight raise exception """
quota = product_models.Quota.objects.get(id=data['quota'])
quota = data['quota']
amount = data['weight']
instance_id = self.instance.id if self.instance else None
@@ -29,8 +29,7 @@ class QuotaDistributionSerializer(serializers.ModelSerializer):
).exclude(id=instance_id).aggregate(
total=models.Sum('weight')
)['total'] or 0
print(total)
if total + amount > self.instance.weight:
if total + amount > quota.quota_weight:
raise QuotaWeightException()
return data