From e35ff6bda7ffbc0edf26aae5d8d0e742be026b43 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Tue, 11 Nov 2025 15:24:39 +0500 Subject: [PATCH] finance: add user field to expence delete model --- core/apps/finance/admin/expence.py | 2 +- .../migrations/0033_deletedexpence_user.py | 21 ++++++++ core/apps/finance/models/expence.py | 1 + .../finance/serializers/deleted_expence.py | 13 ++++- core/apps/finance/views/deleted_expence.py | 2 +- core/apps/finance/views/expence.py | 3 +- core/test.py | 49 +++++++++++++++++++ 7 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 core/apps/finance/migrations/0033_deletedexpence_user.py create mode 100644 core/test.py diff --git a/core/apps/finance/admin/expence.py b/core/apps/finance/admin/expence.py index 68a48c9..aeba11e 100644 --- a/core/apps/finance/admin/expence.py +++ b/core/apps/finance/admin/expence.py @@ -6,7 +6,7 @@ from core.apps.finance.models import Expence, DeletedExpence @admin.register(Expence) class ExpenceAdmin(admin.ModelAdmin): list_display = ['id', 'price', 'cash_transaction', 'status'] - + search_fields = ['party__number'] @admin.register(DeletedExpence) class DeletedExpenceAdmin(admin.ModelAdmin): diff --git a/core/apps/finance/migrations/0033_deletedexpence_user.py b/core/apps/finance/migrations/0033_deletedexpence_user.py new file mode 100644 index 0000000..a62560f --- /dev/null +++ b/core/apps/finance/migrations/0033_deletedexpence_user.py @@ -0,0 +1,21 @@ +# Generated by Django 5.2.4 on 2025-11-11 15:21 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('finance', '0032_alter_cashtransaction_expence_balance_usd_and_more'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='deletedexpence', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='deleted_expences', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/core/apps/finance/models/expence.py b/core/apps/finance/models/expence.py index 794902d..6d25426 100644 --- a/core/apps/finance/models/expence.py +++ b/core/apps/finance/models/expence.py @@ -57,6 +57,7 @@ class Expence(BaseModel): class DeletedExpence(BaseModel): expence = models.ForeignKey(Expence, on_delete=models.CASCADE, related_name='deleted_expences') comment = models.CharField(max_length=200) + user = models.ForeignKey(User, on_delete=models.SET_NULL, related_name='deleted_expences', null=True) def __str__(self): return f'{self.expence} is deleted' diff --git a/core/apps/finance/serializers/deleted_expence.py b/core/apps/finance/serializers/deleted_expence.py index 712374f..18ae30c 100644 --- a/core/apps/finance/serializers/deleted_expence.py +++ b/core/apps/finance/serializers/deleted_expence.py @@ -7,7 +7,8 @@ from core.apps.finance.serializers.expence import ExpenceListSerializer class DeletedExpenceListSerializer(serializers.ModelSerializer): expence = ExpenceListSerializer() - + user = serializers.SerializerMethodField(method_name='get_user') + class Meta: model = DeletedExpence fields = [ @@ -15,4 +16,12 @@ class DeletedExpenceListSerializer(serializers.ModelSerializer): 'created_at', 'comment', 'expence', - ] \ No newline at end of file + 'user' + ] + + def get_user(self, obj): + return { + "id": obj.user.id, + "full_name": obj.user.full_name, + "profile_image": obj.user.profile_image + } if obj.user else None \ No newline at end of file diff --git a/core/apps/finance/views/deleted_expence.py b/core/apps/finance/views/deleted_expence.py index 18bd905..53d80e5 100644 --- a/core/apps/finance/views/deleted_expence.py +++ b/core/apps/finance/views/deleted_expence.py @@ -8,7 +8,7 @@ from core.apps.accounts.permissions.permissions import HasRolePermission class DeletedExpenceListApiView(generics.GenericAPIView): serializer_class = DeletedExpenceListSerializer - queryset = DeletedExpence.objects.select_related('expence').order_by('-created_at') + queryset = DeletedExpence.objects.select_related('expence', 'user').order_by('-created_at') permission_classes = [HasRolePermission] def get(self, request): diff --git a/core/apps/finance/views/expence.py b/core/apps/finance/views/expence.py index 17b60ff..289236b 100644 --- a/core/apps/finance/views/expence.py +++ b/core/apps/finance/views/expence.py @@ -127,7 +127,8 @@ class ExpenceDeleteApiView(generics.GenericAPIView): DeletedExpence.objects.create( expence=expence, - comment=comment + comment=comment, + user=request.user, ) cash_transaction = expence.cash_transaction diff --git a/core/test.py b/core/test.py new file mode 100644 index 0000000..0cf2aca --- /dev/null +++ b/core/test.py @@ -0,0 +1,49 @@ +from decimal import Decimal + +from django.db.models import Sum + +from core.apps.finance.models import Expence +from core.apps.orders.models import Party +from core.apps.counterparty.models import Counterparty + + +def find_tafavvut(): + tafavvut = [] + party_total_price = 0 + expence_total_price = 0 + + counterparty = Counterparty.objects.filter(name__icontains="Сардор карта 7664").first() + + if not counterparty: + print("Counterparty topilmadi") + return + + for party in Party.objects.filter(orders__counterparty=counterparty): + price_result = Expence.objects.filter(party=party, currency='uzs').aggregate(total_price=Sum("price")) + expence_total_price_value = price_result['total_price'] or 0 + + party_total = party.party_amount.total_price or 0 + + if party_total != expence_total_price_value: + print(f"Party: {party.id}, Party Total: {party_total}, Expence Total: {expence_total_price_value}") + tafavvut.append({ + 'party': party, + 'party_total': party_total, + 'expence_total': expence_total_price_value, + 'tafavvut': party_total - expence_total_price_value + }) + party_total_price += party_total + expence_total_price += expence_total_price_value + + print("\n=== NATIJA ===") + print(f"Tafavvut topilgan: {len(tafavvut)}") + print(f"Party jami: {party_total_price}") + print(f"Expence jami: {expence_total_price}") + print(f"Farq: {party_total_price - expence_total_price}") + + for item in tafavvut: + print(f"Party {item['party'].id}: +{item['tafavvut']}") + + return tafavvut + +find_tafavvut() \ No newline at end of file