From 9e2229fd86700debea8923349a688f22a28cfb08 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 10 Nov 2025 17:22:17 +0500 Subject: [PATCH] fucking counterparty statistics not done yet! fuck --- core/apps/counterparty/models/conterparty.py | 54 +++++++++++++++++-- core/apps/counterparty/views/counterparty.py | 13 ++--- .../management/commands/import_expence.py | 2 +- .../management/commands/import_income.py | 2 +- core/apps/orders/models/order.py | 13 ++--- 5 files changed, 63 insertions(+), 21 deletions(-) diff --git a/core/apps/counterparty/models/conterparty.py b/core/apps/counterparty/models/conterparty.py index b79ae1a..c809c81 100644 --- a/core/apps/counterparty/models/conterparty.py +++ b/core/apps/counterparty/models/conterparty.py @@ -1,9 +1,10 @@ from decimal import Decimal from django.db import models +from django.apps import apps from core.apps.shared.models import BaseModel, Region, District -from core.apps.accounts.models import User +from core.apps.accounts.models import User class CounterpartyFolder(BaseModel): @@ -99,18 +100,61 @@ class CounterpartyBalance(BaseModel): @property def total_balance_usd(self): + Party = apps.get_model('orders', 'Party') + debit = Decimal(self.debit_usd or 0) kredit = Decimal(self.kredit_usd or 0) - return debit - kredit + + party_payment = Party.objects.filter( + orders__counterparty=self.counterparty, + is_deleted=False, + currency='usd' + ).aggregate( + payment_amount=models.Sum('party_amount__payment_amount') + )['payment_amount'] or 0 + + party_overdue = Party.objects.filter( + orders__counterparty=self.counterparty, + is_deleted=False, + currency='usd' + ).aggregate( + overdue_amount=models.Sum('party_amount__overdue_amount') + )['overdue_amount'] or 0 + + party_amount = Decimal(party_payment or 0) - Decimal(party_overdue or 0) + + return debit - kredit + party_amount + @property def total_balance_uzs(self): + Party = apps.get_model('orders', 'Party') + debit = Decimal(self.debit_uzs or 0) kredit = Decimal(self.kredit_uzs or 0) - return debit - kredit - + + party_payment = Party.objects.filter( + orders__counterparty=self.counterparty, + is_deleted=False, + currency='uzs' + ).aggregate( + payment_amount=models.Sum('party_amount__payment_amount') + )['payment_amount'] or 0 + + party_overdue = Party.objects.filter( + orders__counterparty=self.counterparty, + is_deleted=False, + currency='uzs' + ).aggregate( + overdue_amount=models.Sum('party_amount__overdue_amount') + )['overdue_amount'] or 0 + + party_amount = Decimal(party_payment or 0) - Decimal(party_overdue or 0) + + return debit - kredit + party_amount + def __str__(self): - return f"{self.counterparty.name} | USD: {self.total_balance_usd} | UZS: {self.total_balance_uzs}" + return f"{self.counterparty.name}" class Meta: verbose_name = "Kontragent Balansi" diff --git a/core/apps/counterparty/views/counterparty.py b/core/apps/counterparty/views/counterparty.py index 2498d95..296ac91 100644 --- a/core/apps/counterparty/views/counterparty.py +++ b/core/apps/counterparty/views/counterparty.py @@ -199,11 +199,9 @@ class CounterPartyIncomeExpenceStatisticsApiView(views.APIView): def get(self, request, id): counterparty = get_object_or_404(Counterparty, id=id) - # Income va Expence querysetlari incomes = Income.objects.filter(counterparty=counterparty, is_deleted=False) expences = Expence.objects.filter(counterparty=counterparty, is_deleted=False) - # Balanslar valyutalar bo'yicha income_by_currency = {'uzs': {'total': Decimal(0), 'count': 0, 'amount_uzs': Decimal(0)}, 'usd': {'total': Decimal(0), 'count': 0, 'amount_uzs': Decimal(0)}} for income in incomes: @@ -224,18 +222,17 @@ class CounterPartyIncomeExpenceStatisticsApiView(views.APIView): expence_by_currency[currency]['count'] += 1 expence_by_currency[currency]['amount_uzs'] += amount * rate if currency == 'usd' else amount - # Income/Expence summalari total_income_uzs = sum(v['amount_uzs'] for v in income_by_currency.values()) total_expence_uzs = sum(v['amount_uzs'] for v in expence_by_currency.values()) total_income_usd = income_by_currency['usd']['total'] total_expence_usd = expence_by_currency['usd']['total'] - # Kontragent balansi - balance_obj, _ = CounterpartyBalance.objects.get_or_create(counterparty=counterparty) - balance_uzs = balance_obj.total_balance_uzs + (total_income_uzs - total_expence_uzs) - balance_usd = balance_obj.total_balance_usd + (total_income_usd - total_expence_usd) + # balance_obj, _ = CounterpartyBalance.objects.get_or_create(counterparty=counterparty) + # balance_uzs = balance_obj.total_balance_uzs + (total_income_uzs - total_expence_uzs) + # balance_usd = balance_obj.total_balance_usd + (total_income_usd - total_expence_usd) + balance_uzs = counterparty.balance.total_balance_uzs + balance_usd = counterparty.balance.total_balance_usd - # Status aniqlash if balance_uzs > 0: status = 'positive' elif balance_uzs < 0: diff --git a/core/apps/finance/management/commands/import_expence.py b/core/apps/finance/management/commands/import_expence.py index 7864abd..42905f3 100644 --- a/core/apps/finance/management/commands/import_expence.py +++ b/core/apps/finance/management/commands/import_expence.py @@ -19,7 +19,7 @@ from core.apps.orders.models import Party headers = { - "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JhY2tlbmQuYXBwLnV5cXVyLnV6L21haW4vYXV0aC9sb2dpbiIsImlhdCI6MTc2MjUxMDQyMywiZXhwIjoxNzYyNTk2ODIzLCJuYmYiOjE3NjI1MTA0MjMsImp0aSI6IlNPMmx5VjJ3Mllmb3BlSXEiLCJzdWIiOiIxMDQiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.3DemwyRz2FMzMm-JRBOqGPSgu_m4s4ndWz56e_ROp8A" + "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JhY2tlbmQuYXBwLnV5cXVyLnV6L21haW4vYXV0aC9sb2dpbiIsImlhdCI6MTc2Mjc3NTkzNCwiZXhwIjoxNzYyODYyMzM0LCJuYmYiOjE3NjI3NzU5MzQsImp0aSI6ImZwOFlWMmJ1MEdPdmpXeHUiLCJzdWIiOiIxMDQiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.sii0OxzYjY8hQPojwoTa9B7O1jTPcowQ_kPOafJM4ho" } diff --git a/core/apps/finance/management/commands/import_income.py b/core/apps/finance/management/commands/import_income.py index f8940f4..213431b 100644 --- a/core/apps/finance/management/commands/import_income.py +++ b/core/apps/finance/management/commands/import_income.py @@ -19,7 +19,7 @@ from core.apps.orders.models import Party headers = { - "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JhY2tlbmQuYXBwLnV5cXVyLnV6L21haW4vYXV0aC9sb2dpbiIsImlhdCI6MTc2MjUxMDQyMywiZXhwIjoxNzYyNTk2ODIzLCJuYmYiOjE3NjI1MTA0MjMsImp0aSI6IlNPMmx5VjJ3Mllmb3BlSXEiLCJzdWIiOiIxMDQiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.3DemwyRz2FMzMm-JRBOqGPSgu_m4s4ndWz56e_ROp8A" + "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JhY2tlbmQuYXBwLnV5cXVyLnV6L21haW4vYXV0aC9sb2dpbiIsImlhdCI6MTc2Mjc3NTkzNCwiZXhwIjoxNzYyODYyMzM0LCJuYmYiOjE3NjI3NzU5MzQsImp0aSI6ImZwOFlWMmJ1MEdPdmpXeHUiLCJzdWIiOiIxMDQiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.sii0OxzYjY8hQPojwoTa9B7O1jTPcowQ_kPOafJM4ho" } diff --git a/core/apps/orders/models/order.py b/core/apps/orders/models/order.py index de01fc1..293b16f 100644 --- a/core/apps/orders/models/order.py +++ b/core/apps/orders/models/order.py @@ -1,12 +1,13 @@ from django.db import models from django.utils.translation import gettext_lazy as _ -from core.apps.shared.models import BaseModel -from core.apps.products.models import Product, Unity -from core.apps.projects.models import Project, ProjectFolder -from core.apps.accounts.models import User -from core.apps.wherehouse.models import WhereHouse -from core.apps.counterparty.models import Counterparty +from core.apps.shared.models.base import BaseModel +from core.apps.products.models.product import Product +from core.apps.products.models.unity import Unity +from core.apps.projects.models.project import Project, ProjectFolder +from core.apps.accounts.models.user import User +from core.apps.wherehouse.models.wherehouse import WhereHouse +from core.apps.counterparty.models.conterparty import Counterparty class Order(BaseModel):