from django.db.models import Sum from core.apps.finance.models import Expence, Income from core.apps.orders.models import Party def update_counterparty_balance(counterparty): if not counterparty: return expences = Expence.objects.filter( counterparty=counterparty, is_deleted=False, status='CONFIRMED' ) debit_usd = expences.filter(currency='usd').aggregate( total=Sum('price') )['total'] or 0 debit_uzs = expences.filter(currency='uzs').aggregate( total=Sum('price') )['total'] or 0 parties = Party.objects.filter( orders__counterparty=counterparty, is_deleted=False ).distinct() party_payment_usd = parties.filter(currency='usd').aggregate( total=Sum('party_amount__payment_amount') )['total'] or 0 party_payment_uzs = parties.filter(currency='uzs').aggregate( total=Sum('party_amount__payment_amount') )['total'] or 0 debit_usd = debit_usd - party_payment_usd debit_uzs = debit_uzs - party_payment_uzs incomes = Income.objects.filter( counterparty=counterparty, is_deleted=False ) kredit_usd = incomes.filter(currency='usd').aggregate( total=Sum('price') )['total'] or 0 kredit_uzs = incomes.filter(currency='uzs').aggregate( total=Sum('price') )['total'] or 0 total_debit = debit_usd + debit_uzs total_kredit = kredit_usd + kredit_uzs counterparty.debit_usd = debit_usd counterparty.debit_uzs = debit_uzs counterparty.total_debit = total_debit counterparty.kredit_usd = kredit_usd counterparty.kredit_uzs = kredit_uzs counterparty.total_kredit = total_kredit counterparty.save(update_fields=[ 'debit_usd', 'debit_uzs', 'total_debit', 'kredit_usd', 'kredit_uzs', 'total_kredit' ])