counterparty: update counterparty balance fixed

This commit is contained in:
behruz-dev
2025-11-03 13:42:27 +05:00
parent 2769b3cc37
commit 85853c2e7d

View File

@@ -1,39 +1,28 @@
from django.db.models import Sum, Case, F, DecimalField, When from django.db.models import Sum
from core.apps.finance.models import Expence, Income
from core.apps.finance.models import Expence
from core.apps.finance.models import Income
def update_counterparty_balance(counterparty): def update_counterparty_balance(counterparty):
if not counterparty: if not counterparty:
return return
# EXPENCE -> DEBIT
expences = Expence.objects.filter( expences = Expence.objects.filter(
counterparty=counterparty, counterparty=counterparty,
is_deleted=False, is_deleted=False,
) )
# Valutasi bo'yicha qo'shish
debit_usd = expences.filter(currency='usd').aggregate( debit_usd = expences.filter(currency='usd').aggregate(
total=Sum('price') total=Sum('price')
)['total'] or 0 )['total'] or 0
debit_uzs_direct = expences.filter(currency='uzs').aggregate( debit_uzs = expences.filter(currency='uzs').aggregate(
total=Sum('price') total=Sum('price')
)['total'] or 0 )['total'] or 0
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( incomes = Income.objects.filter(
counterparty=counterparty, counterparty=counterparty,
is_deleted=False is_deleted=False
@@ -43,32 +32,23 @@ def update_counterparty_balance(counterparty):
total=Sum('price') total=Sum('price')
)['total'] or 0 )['total'] or 0
kredit_uzs_direct = incomes.filter(currency='uzs').aggregate( kredit_uzs = incomes.filter(currency='uzs').aggregate(
total=Sum('price') total=Sum('price')
)['total'] or 0 )['total'] or 0
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 (faqat bir valutada qo'shish)
total_debit = debit_usd + debit_uzs total_debit = debit_usd + debit_uzs
total_kredit = kredit_usd + kredit_uzs total_kredit = kredit_usd + kredit_uzs
# Modelni yangilash
counterparty.debit_usd = debit_usd counterparty.debit_usd = debit_usd
counterparty.debit_uzs = int(debit_uzs) counterparty.debit_uzs = debit_uzs
counterparty.total_debit = int(total_debit) counterparty.total_debit = total_debit
counterparty.kredit_usd = kredit_usd counterparty.kredit_usd = kredit_usd
counterparty.kredit_uzs = int(kredit_uzs) counterparty.kredit_uzs = kredit_uzs
counterparty.total_kredit = int(total_kredit) counterparty.total_kredit = total_kredit
counterparty.save(update_fields=[ counterparty.save(update_fields=[
'debit_usd', 'debit_uzs', 'total_debit', 'debit_usd', 'debit_uzs', 'total_debit',
'kredit_usd', 'kredit_uzs', 'total_kredit' 'kredit_usd', 'kredit_uzs', 'total_kredit'