From 2769b3cc37387a90dd18f7a693cce763882ceb41 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 3 Nov 2025 13:32:48 +0500 Subject: [PATCH] finance: change import income and expence commands --- core/apps/counterparty/utils/counterparty.py | 12 -- .../management/commands/import_expence.py | 80 ++++++++++++ .../management/commands/import_income.py | 68 ++++++++++ .../commands/import_income_expence.py | 121 ------------------ 4 files changed, 148 insertions(+), 133 deletions(-) create mode 100644 core/apps/finance/management/commands/import_expence.py create mode 100644 core/apps/finance/management/commands/import_income.py delete mode 100644 core/apps/finance/management/commands/import_income_expence.py diff --git a/core/apps/counterparty/utils/counterparty.py b/core/apps/counterparty/utils/counterparty.py index 8cc78e8..231c877 100644 --- a/core/apps/counterparty/utils/counterparty.py +++ b/core/apps/counterparty/utils/counterparty.py @@ -5,28 +5,22 @@ 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 - # 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( @@ -40,23 +34,19 @@ def update_counterparty_balance(counterparty): 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 - # 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( @@ -70,11 +60,9 @@ def update_counterparty_balance(counterparty): 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 = int(debit_uzs) counterparty.total_debit = int(total_debit) diff --git a/core/apps/finance/management/commands/import_expence.py b/core/apps/finance/management/commands/import_expence.py new file mode 100644 index 0000000..d367115 --- /dev/null +++ b/core/apps/finance/management/commands/import_expence.py @@ -0,0 +1,80 @@ +import requests +from datetime import datetime + +from django.core.management import BaseCommand + +from core.apps.finance.models import ( + Income, + Expence, + TypeIncome, + ExpenceType, + CashTransaction, + PaymentType +) +from core.apps.projects.models import 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.orders.models import Party + + +headers = { + "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JhY2tlbmQuYXBwLnV5cXVyLnV6L21haW4vYXV0aC9sb2dpbiIsImlhdCI6MTc2MjE1NzIzNywiZXhwIjoxNzYyMjQzNjM3LCJuYmYiOjE3NjIxNTcyMzcsImp0aSI6Ijh3WXVpbHBIUU43eVdhdE4iLCJzdWIiOiIxMDQiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.uAebDLZUDKbImw8M9ZLEYApc2Li19a1XD6RJRcMvchY" +} + + +def get_data(page): + url = f"https://backend.app.uyqur.uz/main/payment/view?type=expense&size=1000&page={page}" + + response = requests.get(url, headers=headers) + if response.status_code == 200: + return response.json() + return response.json() + + +def create_expense(data): + statuses = { + "passive": "PENDING", + "active": "CONFIRMED", + "cancel": "CANCELLED" + } + user = User.objects.filter(full_name=data['creator']['full_name']).first() + cash_transaction = CashTransaction.objects.filter(name=data['cash']['name']).first() + expence_type = None + if data.get('financila'): + expence_type = ExpenceType.objects.filter(name=data['financial']['name']).first() + project_folder = None + if data.get('project'): + project_folder = ProjectFolder.objects.filter(name=data['project']['name']).first() + payment_type, created = PaymentType.objects.get_or_create(name=data['payment_type']['name']) + counterparty = None + if data.get('company_person'): + counterparty = Counterparty.objects.filter(name=data['company_person']['name']).first() + party = None + if data.get('order_ids'): + party_number = data.get('order_ids')[0] + party = Party.objects.filter(number=party_number).first() + Expence.objects.update_or_create( + user=user, + cash_transaction=cash_transaction, + expence_type=expence_type, + price=data['amount'], + currency=data['currency']['symbol'].lower(), + payment_type=payment_type, + project_folder= project_folder, + counterparty= counterparty, + exchange_rate= data['currency_amount'], + date=datetime.strptime(data['date'], "%d.%m.%Y").date(), + comment=data['description'], + status=statuses.get(data['status']), + party=party, + ) + +class Command(BaseCommand): + def handle(self, *args, **options): + for page in range(1,13): + data = get_data(page) + for item in data['data']['data']: + create_expense(item) + print(f"{page} is done") + self.stdout.write(self.style.SUCCESS("Expenselar qo'shildi")) diff --git a/core/apps/finance/management/commands/import_income.py b/core/apps/finance/management/commands/import_income.py new file mode 100644 index 0000000..8a51108 --- /dev/null +++ b/core/apps/finance/management/commands/import_income.py @@ -0,0 +1,68 @@ +import requests +from datetime import datetime + +from django.core.management import BaseCommand + +from core.apps.finance.models import ( + Income, + Expence, + TypeIncome, + ExpenceType, + CashTransaction, + PaymentType +) +from core.apps.projects.models import 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.orders.models import Party + + +headers = { + "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JhY2tlbmQuYXBwLnV5cXVyLnV6L21haW4vYXV0aC9sb2dpbiIsImlhdCI6MTc2MjE1NzIzNywiZXhwIjoxNzYyMjQzNjM3LCJuYmYiOjE3NjIxNTcyMzcsImp0aSI6Ijh3WXVpbHBIUU43eVdhdE4iLCJzdWIiOiIxMDQiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.uAebDLZUDKbImw8M9ZLEYApc2Li19a1XD6RJRcMvchY" +} + + +def get_data(): + url = f"https://backend.app.uyqur.uz/main/payment/view?type=income&size=1506" + + response = requests.get(url, headers=headers) + if response.status_code == 200: + return response.json() + return response.json() + + +def create_income(data): + user = User.objects.filter(full_name=data['creator']['full_name']).first() + cash_transaction = CashTransaction.objects.filter(name=data['cash']['name']).first() + payment_type, created = PaymentType.objects.get_or_create(name=data['payment_type']['name']) + income_type = None + if data.get('financiel'): + income_type = TypeIncome.objects.filter(name=data['financial']['name']).first() + project_folder = None + if data.get('project'): + project_folder = ProjectFolder.objects.filter(name=data['project']['name']).first() + counterparty = None + if data.get('company_person'): + counterparty = Counterparty.objects.filter(name=data['company_person']['name']).first() + Income.objects.update_or_create( + price=data['amount'], + currency=data['currency']['symbol'].lower(), + cash_transaction=cash_transaction, + user=user, + type_income= income_type, + payment_type= payment_type, + project_folder= project_folder, + counterparty= counterparty, + exchange_rate= data['currency_amount'], + date= datetime.strptime(data['date'], "%d.%m.%Y").date(), + comment= data['description'], + ) + + +class Command(BaseCommand): + def handle(self, *args, **options): + data = get_data() + for item in data['data']['data']: + create_income(item) + self.stdout.write(self.style.SUCCESS("Income qo'shildi")) diff --git a/core/apps/finance/management/commands/import_income_expence.py b/core/apps/finance/management/commands/import_income_expence.py deleted file mode 100644 index 481f5e4..0000000 --- a/core/apps/finance/management/commands/import_income_expence.py +++ /dev/null @@ -1,121 +0,0 @@ -import requests -from datetime import datetime - -from django.core.management import BaseCommand - -from core.apps.finance.models import ( - Income, - Expence, - TypeIncome, - ExpenceType, - CashTransaction, - PaymentType -) -from core.apps.projects.models import 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.orders.models import Party - - -headers = { - "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JhY2tlbmQuYXBwLnV5cXVyLnV6L21haW4vYXV0aC9sb2dpbiIsImlhdCI6MTc2MTkyMDM2MSwiZXhwIjoxNzYyMDA2NzYxLCJuYmYiOjE3NjE5MjAzNjEsImp0aSI6Inhqak81azJLc2pSaEJJOGUiLCJzdWIiOiIxMDQiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.ZcREfvT21qpd9eK_-zBumKBtaKKJ-l9QoudSLZ3IpP4" -} - - -def get_data(page): - url = f"https://backend.app.uyqur.uz/main/payment/view?size=500&page={page}" - - response = requests.get(url, headers=headers) - if response.status_code == 200: - return response.json() - return response.json() - - -def create_expense(data): - statuses = { - "passive": "PENDING", - "active": "CONFIRMED", - "cancel": "CANCELLED" - } - user = User.objects.filter(full_name=data['creator']['full_name']).first() - cash_transaction = CashTransaction.objects.filter(name=data['cash']['name']).first() - expence_type = None - if data.get('financila'): - expence_type = ExpenceType.objects.filter(name=data['financial']['name']).first() - project_folder = None - if data.get('project'): - project_folder = ProjectFolder.objects.filter(name=data['project']['name']).first() - payment_type, created = PaymentType.objects.get_or_create(name=data['payment_type']['name']) - counterparty = None - if data.get('company_person'): - counterparty = Counterparty.objects.filter(name=data['company_person']['name']).first() - party = None - if data.get('order_ids'): - party_number = data.get('order_ids')[0] - party = Party.objects.filter(number=party_number).first() - Expence.objects.get_or_create( - user=user, - cash_transaction=cash_transaction, - expence_type=expence_type, - price=data['amount'], - currency=data['currency']['symbol'].lower(), - defaults={ - "payment_type": payment_type, - "project_folder": project_folder, - "counterparty": counterparty, - "exchange_rate": data['currency_amount'], - "date": datetime.strptime(data['date'], "%d.%m.%Y").date(), - "comment": data['description'], - "status": statuses.get(data['status']), - "party": party, - } - ) - -def create_income(data): - user = User.objects.filter(full_name=data['creator']['full_name']).first() - cash_transaction = CashTransaction.objects.filter(name=data['cash']['name']).first() - payment_type, created = PaymentType.objects.get_or_create(name=data['payment_type']['name']) - income_type = None - if data.get('financiel'): - income_type = TypeIncome.objects.filter(name=data['financial']['name']).first() - project_folder = None - if data.get('project'): - project_folder = ProjectFolder.objects.filter(name=data['project']['name']).first() - counterparty = None - if data.get('company_person'): - counterparty = Counterparty.objects.filter(name=data['company_person']['name']).first() - Income.objects.get_or_create( - user=user, - cash_transaction=cash_transaction, - type_income=income_type, - price=data['amount'], - currency=data['currency']['symbol'].lower(), - defaults={ - "payment_type": payment_type, - "project_folder": project_folder, - "counterparty": counterparty, - "exchange_rate": data['currency_amount'], - "date": datetime.strptime(data['date'], "%d.%m.%Y").date(), - "comment": data['description'], - } - ) - - -class Command(BaseCommand): - def handle(self, *args, **options): - total_data = 13756 - page = 1 - size = 500 - count = 0 - for page in range(round(total_data / size)): - data = get_data(page) - for item in data['data']['data']: - match item['type']: - case "expense": - create_expense(item) - case "income": - create_income(item) - count += 1 - page += 1 - self.stdout.write(self.style.SUCCESS(f"{count} ta Income va Expenselar qo'shildi"))