from django.db.models import Sum from django.db.models.signals import post_save, post_delete from django.dispatch import receiver from apps.product.models import QuotaDistribution from .models import InventoryEntry, InventoryQuotaSaleItem def calculate_warehouse_entry(quota_distribution): total_entry = quota_distribution.inventory_entry.aggregate( total=Sum('weight') )['total'] or 0 quota_distribution.warehouse_entry = total_entry quota_distribution.save(update_fields=['warehouse_entry']) def warehouse_sold_and_balance(quota_distribution: QuotaDistribution): total_sold = quota_distribution.sale_items.aggregate( total=Sum('weight') )['total'] or 0 quota_distribution.been_sold = total_sold quota_distribution.warehouse_balance = quota_distribution.warehouse_entry - total_sold if quota_distribution.warehouse_balance >= 0: extra_sales = quota_distribution.extra_sales.all() total_extra_sales_weight = extra_sales.aggregate(total=Sum('weight'))['total'] or 0 if total_extra_sales_weight != 0: quota_distribution.warehouse_balance = quota_distribution.warehouse_entry - total_extra_sales_weight quota_distribution.save(update_fields=['been_sold', 'warehouse_balance']) @receiver(post_save, sender=InventoryEntry) @receiver(post_delete, sender=InventoryEntry) def update_distribution_warehouse_entry(sender, instance, **kwargs): calculate_warehouse_entry(instance.distribution) warehouse_sold_and_balance(instance.distribution) @receiver(post_save, sender=InventoryQuotaSaleItem) @receiver(post_delete, sender=InventoryQuotaSaleItem) def update_distribution_warehouse_sold_and_balance(sender, instance, **kwargs): if instance.quota_distribution: warehouse_sold_and_balance( quota_distribution=instance.quota_distribution, ) else: print("quota distribution is null - warehouse app signals")