From c7e3a8d266795ee195e0d6e10bdba7fc9537b7ce Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 29 Sep 2025 14:49:23 +0500 Subject: [PATCH 1/4] add: add filter for party list --- core/apps/orders/filters/party.py | 27 +++++++++++++++++- ...rder_qqs_alter_order_qqs_price_and_more.py | 28 +++++++++++++++++++ core/apps/orders/models/order.py | 6 ++-- core/apps/orders/models/party.py | 2 +- 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 core/apps/orders/migrations/0026_alter_order_qqs_alter_order_qqs_price_and_more.py diff --git a/core/apps/orders/filters/party.py b/core/apps/orders/filters/party.py index 23a8332..310e765 100644 --- a/core/apps/orders/filters/party.py +++ b/core/apps/orders/filters/party.py @@ -33,13 +33,38 @@ class PartyFilter(django_filters.FilterSet): order_start_date = django_filters.DateFilter(field_name='order_date', lookup_expr='gte') order_end_date = django_filters.DateFilter(field_name='order_date', lookup_expr='lte') + # total price filter (range) + min_price = django_filters.NumberFilter(field_name='party_amount__total_price', lookup_expr='gte') + max_price = django_filters.NumberFilter(field_name='party_amount__total_price', lookup_expr='lte') + + # qqs and discount + qqs = django_filters.BooleanFilter(method='filter_by_qqs') + discount = django_filters.BooleanFilter(method='filter_by_discount') + + # payment_type + payment_type = django_filters.UUIDFilter(field_name='expences__payment_type') + class Meta: model = Party fields = [ 'status', 'payment_status', 'confirmation', 'orders__wherehouse', 'orders__project', 'orders__project_folder', - 'mediator', 'orders__counterparty', + 'mediator', 'orders__counterparty', 'min_price', 'max_price', + 'qqs', 'discount', 'payment_type' ] + + def filter_by_qqs(self, queryset, name, value): + if value == True: + queryset = queryset.filter(orders__qqs__isnull=True) + return queryset + else: + return queryset + + def filter_by_discount(self, queryset, name, value): + if value == True: + return queryset.filter(discount__isnull=True) + else: + return queryset def filter_by_delivery_date(self, queryset, name, value): today = now().date() diff --git a/core/apps/orders/migrations/0026_alter_order_qqs_alter_order_qqs_price_and_more.py b/core/apps/orders/migrations/0026_alter_order_qqs_alter_order_qqs_price_and_more.py new file mode 100644 index 0000000..821b665 --- /dev/null +++ b/core/apps/orders/migrations/0026_alter_order_qqs_alter_order_qqs_price_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 5.2.4 on 2025-09-29 14:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0025_alter_offer_status'), + ] + + operations = [ + migrations.AlterField( + model_name='order', + name='qqs', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='order', + name='qqs_price', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='party', + name='discount', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + ] diff --git a/core/apps/orders/models/order.py b/core/apps/orders/models/order.py index b0e1fc7..3e48c75 100644 --- a/core/apps/orders/models/order.py +++ b/core/apps/orders/models/order.py @@ -44,10 +44,10 @@ class Order(BaseModel): choices=[('uzs', 'uzs'), ('usd', 'usd')], default='uzs', null=True, blank=True, max_length=3 ) total_price = models.PositiveBigIntegerField(default=0, null=True, blank=True) - qqs_price = models.PositiveBigIntegerField(default=0, null=True, blank=True) + qqs_price = models.PositiveBigIntegerField(null=True, blank=True) amount = models.PositiveBigIntegerField(default=0, null=True, blank=True) - qqs = models.PositiveBigIntegerField(default=0, null=True, blank=True) - + qqs = models.PositiveBigIntegerField(null=True, blank=True) + def __str__(self): return f"{self.product} {self.unity} quantity order" diff --git a/core/apps/orders/models/party.py b/core/apps/orders/models/party.py index adbb82c..51b318b 100644 --- a/core/apps/orders/models/party.py +++ b/core/apps/orders/models/party.py @@ -50,7 +50,7 @@ class Party(BaseModel): null=True, blank=True ) audit_comment = models.TextField(null=True, blank=True) - discount = models.PositiveBigIntegerField(default=0, null=True, blank=True) + discount = models.PositiveBigIntegerField(null=True, blank=True) discount_currency = models.CharField( max_length=3, choices=[('uzs', 'uzs'), ('usd', 'usd')], default='uzs', null=True, blank=True ) From 9a74eb2253a5628eb62b3400af79b19175a380df Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 29 Sep 2025 14:52:50 +0500 Subject: [PATCH 2/4] add: add new field for filter --- core/apps/orders/filters/party.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/apps/orders/filters/party.py b/core/apps/orders/filters/party.py index 310e765..e0270fe 100644 --- a/core/apps/orders/filters/party.py +++ b/core/apps/orders/filters/party.py @@ -50,7 +50,7 @@ class PartyFilter(django_filters.FilterSet): 'status', 'payment_status', 'confirmation', 'orders__wherehouse', 'orders__project', 'orders__project_folder', 'mediator', 'orders__counterparty', 'min_price', 'max_price', - 'qqs', 'discount', 'payment_type' + 'qqs', 'discount', 'payment_type', 'audit' ] def filter_by_qqs(self, queryset, name, value): From 2fd5d685e2b4407fab0f0e936e8e3b1ab97d6de3 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 29 Sep 2025 15:24:50 +0500 Subject: [PATCH 3/4] fix: fix party filter --- core/apps/orders/filters/party.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/apps/orders/filters/party.py b/core/apps/orders/filters/party.py index e0270fe..f3eee1d 100644 --- a/core/apps/orders/filters/party.py +++ b/core/apps/orders/filters/party.py @@ -55,14 +55,14 @@ class PartyFilter(django_filters.FilterSet): def filter_by_qqs(self, queryset, name, value): if value == True: - queryset = queryset.filter(orders__qqs__isnull=True) + queryset = queryset.filter(orders__qqs__isnull=False) return queryset else: return queryset def filter_by_discount(self, queryset, name, value): if value == True: - return queryset.filter(discount__isnull=True) + return queryset.filter(discount__isnull=False) else: return queryset From f4f54801db43572ecef4c21f49f431ae68d46b40 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 29 Sep 2025 15:31:06 +0500 Subject: [PATCH 4/4] add: add new field for expence income, and add to filter new fields --- core/apps/finance/filters/expence.py | 3 ++- core/apps/finance/filters/income.py | 3 ++- ..._alter_expence_audit_alter_income_audit.py | 23 +++++++++++++++++++ core/apps/finance/models/expence.py | 5 +++- core/apps/finance/models/income.py | 5 +++- 5 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 core/apps/finance/migrations/0031_alter_expence_audit_alter_income_audit.py diff --git a/core/apps/finance/filters/expence.py b/core/apps/finance/filters/expence.py index 5c68f99..f4d8412 100644 --- a/core/apps/finance/filters/expence.py +++ b/core/apps/finance/filters/expence.py @@ -13,7 +13,8 @@ class ExpenceFilter(django_filters.FilterSet): class Meta: model = Expence fields = [ - 'payment_type', 'project_folder', 'project', 'user', 'expence_type', 'cash_transaction', 'date' + 'payment_type', 'project_folder', 'project', 'user', 'expence_type', 'cash_transaction', 'date', + 'audit', 'counterparty' ] def filter_by_created_at(self, queryset, name, value): diff --git a/core/apps/finance/filters/income.py b/core/apps/finance/filters/income.py index 6adf4ce..0184ed2 100644 --- a/core/apps/finance/filters/income.py +++ b/core/apps/finance/filters/income.py @@ -13,7 +13,8 @@ class IncomeFilter(django_filters.FilterSet): class Meta: model = Income fields = [ - 'payment_type', 'project_folder', 'project', 'user', 'type_income', 'date', 'cash_transaction' + 'payment_type', 'project_folder', 'project', 'user', 'type_income', 'date', 'cash_transaction', + 'audit', 'counterparty' ] def filter_by_created_at(self, queryset, name, value): diff --git a/core/apps/finance/migrations/0031_alter_expence_audit_alter_income_audit.py b/core/apps/finance/migrations/0031_alter_expence_audit_alter_income_audit.py new file mode 100644 index 0000000..46a9a53 --- /dev/null +++ b/core/apps/finance/migrations/0031_alter_expence_audit_alter_income_audit.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.4 on 2025-09-29 15:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('finance', '0030_incomechat_incomemessage'), + ] + + operations = [ + migrations.AlterField( + model_name='expence', + name='audit', + field=models.CharField(blank=True, choices=[('CHECKED', 'tekshirildi'), ('PROCESS', 'jarayonda')], max_length=20, null=True), + ), + migrations.AlterField( + model_name='income', + name='audit', + field=models.CharField(blank=True, choices=[('CHECKED', 'tekshirildi'), ('PROCESS', 'jarayonda')], max_length=20, null=True), + ), + ] diff --git a/core/apps/finance/models/expence.py b/core/apps/finance/models/expence.py index ecf3ec8..c12c4e1 100644 --- a/core/apps/finance/models/expence.py +++ b/core/apps/finance/models/expence.py @@ -38,7 +38,10 @@ class Expence(BaseModel): ) date = models.DateField(null=True, blank=True) comment = models.TextField(null=True, blank=True) - audit = models.CharField(max_length=200, null=True, blank=True) + audit = models.CharField( + max_length=20, choices=[('CHECKED', 'tekshirildi'),('PROCESS', 'jarayonda')], + null=True, blank=True + ) file = models.FileField(null=True, blank=True, upload_to='finance/expence/files/') status = models.CharField(max_length=20, choices=STATUS, default='PENDING', null=True, blank=True) is_deleted = models.BooleanField(default=False) diff --git a/core/apps/finance/models/income.py b/core/apps/finance/models/income.py index d1902a9..970baa2 100644 --- a/core/apps/finance/models/income.py +++ b/core/apps/finance/models/income.py @@ -31,7 +31,10 @@ class Income(BaseModel): date = models.DateField(null=True, blank=True) comment = models.TextField(null=True, blank=True) file = models.FileField(upload_to='finance/income/file/', null=True, blank=True) - audit = models.CharField(max_length=200, null=True, blank=True) + audit = models.CharField( + max_length=20, choices=[('CHECKED', 'tekshirildi'),('PROCESS', 'jarayonda')], + null=True, blank=True + ) is_deleted = models.BooleanField(default=False) def __str__(self):