From 4afc34ace8035d784ef329de94b3c56192a9ad04 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Sat, 1 Nov 2025 17:01:01 +0500 Subject: [PATCH] fix --- core/apps/counterparty/utils/counterparty.py | 52 +++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/core/apps/counterparty/utils/counterparty.py b/core/apps/counterparty/utils/counterparty.py index e66e1d3..e9f005d 100644 --- a/core/apps/counterparty/utils/counterparty.py +++ b/core/apps/counterparty/utils/counterparty.py @@ -6,45 +6,83 @@ from core.apps.finance.models import Income def update_counterparty_balance(counterparty): + """Counterpartyning debit va kredit balanslarini exchange_rate bilan hisoblash""" if not counterparty: return + # EXPENCE -> DEBIT expences = Expence.objects.filter( counterparty=counterparty, is_deleted=False, + status='CONFIRMED' ) + # USD bo'lganlari debit_usd = expences.filter(currency='usd').aggregate( total=Sum('price') )['total'] or 0 - debit_uzs = expences.filter(currency='uzs').aggregate( + # UZS bo'lganlari (to'g'ridan-to'g'ri) + debit_uzs_direct = expences.filter(currency='uzs').aggregate( total=Sum('price') )['total'] or 0 + # USD -> UZS konversiyasi (exchange_rate bilan ko'paytirish) + debit_uzs_from_usd = expences.filter(currency='usd').aggregate( + total=Sum( + Case( + When(exchange_rate__gt=0, then=F('price') * F('exchange_rate') / 100), + default=0, + output_field=DecimalField() + ) + ) + )['total'] or 0 + + debit_uzs = debit_uzs_direct + debit_uzs_from_usd + + + # INCOME -> KREDIT incomes = Income.objects.filter( counterparty=counterparty, is_deleted=False ) + # USD bo'lganlari kredit_usd = incomes.filter(currency='usd').aggregate( total=Sum('price') )['total'] or 0 - kredit_uzs = incomes.filter(currency='uzs').aggregate( + # UZS bo'lganlari (to'g'ridan-to'g'ri) + kredit_uzs_direct = incomes.filter(currency='uzs').aggregate( total=Sum('price') )['total'] or 0 + # USD -> UZS konversiyasi + kredit_uzs_from_usd = incomes.filter(currency='usd').aggregate( + total=Sum( + Case( + When(exchange_rate__gt=0, then=F('price') * F('exchange_rate') / 100), + default=0, + output_field=DecimalField() + ) + ) + )['total'] or 0 + + kredit_uzs = kredit_uzs_direct + kredit_uzs_from_usd + + + # Total hisoblash total_debit = debit_usd + debit_uzs total_kredit = kredit_usd + kredit_uzs + # Modelni yangilash counterparty.debit_usd = debit_usd - counterparty.debit_uzs = debit_uzs - counterparty.total_debit = total_debit + counterparty.debit_uzs = int(debit_uzs) + counterparty.total_debit = int(total_debit) counterparty.kredit_usd = kredit_usd - counterparty.kredit_uzs = kredit_uzs - counterparty.total_kredit = total_kredit + counterparty.kredit_uzs = int(kredit_uzs) + counterparty.total_kredit = int(total_kredit) counterparty.save(update_fields=[ 'debit_usd', 'debit_uzs', 'total_debit', 'kredit_usd', 'kredit_uzs', 'total_kredit' - ]) \ No newline at end of file + ])