77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
from django.db.models import Sum, F
|
|
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__paid_amount')
|
|
)['total'] or 0
|
|
|
|
party_payment_uzs = parties.filter(currency='uzs').aggregate(
|
|
total=Sum('party_amount__paid_amount')
|
|
)['total'] or 0
|
|
|
|
# total_price - paid_amount ni hisoblash
|
|
party_remain_usd = parties.filter(currency='usd').aggregate(
|
|
total=Sum(F('party_amount__total_price') - F('party_amount__paid_amount'))
|
|
)['total'] or 0
|
|
|
|
party_remain_uzs = parties.filter(currency='uzs').aggregate(
|
|
total=Sum(F('party_amount__total_price') - F('party_amount__paid_amount'))
|
|
)['total'] or 0
|
|
|
|
debit_usd = debit_usd - party_payment_usd + party_remain_usd
|
|
debit_uzs = debit_uzs - party_payment_uzs + party_remain_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'
|
|
]) |