From 209f06728750797fa509e81f0b30e48324feaafa Mon Sep 17 00:00:00 2001 From: Mojtaba-z Date: Sat, 20 Sep 2025 16:58:24 +0330 Subject: [PATCH] pre sale system deployment --- Rasaddam_Backend/asgi.py | 6 +-- apps/herd/services/services.py | 3 +- .../0074_quota_limit_by_herd_size.py | 18 ++++++++ apps/product/models.py | 1 + .../migrations/0028_quotapresaleitem.py | 36 +++++++++++++++ ...aletransaction_free_sale_state_and_more.py | 44 +++++++++++++++++++ apps/warehouse/models.py | 37 ++++++++++++++++ apps/warehouse/pos/api/v1/api.py | 7 +++ apps/warehouse/pos/api/v1/serializers.py | 6 +++ 9 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 apps/product/migrations/0074_quota_limit_by_herd_size.py create mode 100644 apps/warehouse/migrations/0028_quotapresaleitem.py create mode 100644 apps/warehouse/migrations/0029_inventoryquotasaletransaction_free_sale_state_and_more.py diff --git a/Rasaddam_Backend/asgi.py b/Rasaddam_Backend/asgi.py index 7a739a7..41b0eb3 100644 --- a/Rasaddam_Backend/asgi.py +++ b/Rasaddam_Backend/asgi.py @@ -9,11 +9,11 @@ https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/ # import os # -# from django.core.asgi import get_asgi_application +# from django.core.asgi import get_asgi_application # noqa # -# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Rasaddam_Backend.settings') +# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Rasaddam_Backend.settings') # noqa # -# application = get_asgi_application() +# application = get_asgi_application() # noqa import os from channels.routing import ProtocolTypeRouter, URLRouter diff --git a/apps/herd/services/services.py b/apps/herd/services/services.py index b74332e..6e53ba7 100644 --- a/apps/herd/services/services.py +++ b/apps/herd/services/services.py @@ -78,9 +78,10 @@ def rancher_quota_weight(rancher, inventory_entry: InventoryEntry = None, distri return { "total_weight": total_weight, + "remaining_weight": 20, "by_type": [{ "name": key, "weight": value['weight'], "type": value['type'] - }for key, value in merged.items()] + } for key, value in merged.items()] } diff --git a/apps/product/migrations/0074_quota_limit_by_herd_size.py b/apps/product/migrations/0074_quota_limit_by_herd_size.py new file mode 100644 index 0000000..cf51df9 --- /dev/null +++ b/apps/product/migrations/0074_quota_limit_by_herd_size.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0 on 2025-09-20 13:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0073_historicalquotadistribution_free_sale_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='quota', + name='limit_by_herd_size', + field=models.BooleanField(default=True), + ), + ] diff --git a/apps/product/models.py b/apps/product/models.py index 634d19b..e99cd71 100644 --- a/apps/product/models.py +++ b/apps/product/models.py @@ -361,6 +361,7 @@ class Quota(BaseModel): base_price_factory = models.PositiveBigIntegerField(default=0) base_price_cooperative = models.PositiveBigIntegerField(default=0) final_price = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank=True) + limit_by_herd_size = models.BooleanField(default=True) is_closed = models.BooleanField(default=False) closed_at = models.DateTimeField(null=True, blank=True) diff --git a/apps/warehouse/migrations/0028_quotapresaleitem.py b/apps/warehouse/migrations/0028_quotapresaleitem.py new file mode 100644 index 0000000..bd92809 --- /dev/null +++ b/apps/warehouse/migrations/0028_quotapresaleitem.py @@ -0,0 +1,36 @@ +# Generated by Django 5.0 on 2025-09-20 10:25 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0036_organization_phone'), + ('product', '0073_historicalquotadistribution_free_sale_and_more'), + ('warehouse', '0027_extrasale_sale_item'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='QuotaPreSaleItem', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('creator_info', models.CharField(max_length=100, null=True)), + ('modifier_info', models.CharField(max_length=100, null=True)), + ('trash', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)), + ('distribution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pre_sales', to='product.quotadistribution')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ('organization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pre_sales', to='authentication.organization')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/warehouse/migrations/0029_inventoryquotasaletransaction_free_sale_state_and_more.py b/apps/warehouse/migrations/0029_inventoryquotasaletransaction_free_sale_state_and_more.py new file mode 100644 index 0000000..3c8344b --- /dev/null +++ b/apps/warehouse/migrations/0029_inventoryquotasaletransaction_free_sale_state_and_more.py @@ -0,0 +1,44 @@ +# Generated by Django 5.0 on 2025-09-20 13:26 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('warehouse', '0028_quotapresaleitem'), + ] + + operations = [ + migrations.AddField( + model_name='inventoryquotasaletransaction', + name='free_sale_state', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='inventoryquotasaletransaction', + name='pre_sale', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='quotapresaleitem', + name='sale_item', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pre_sale', to='warehouse.inventoryquotasaleitem'), + ), + migrations.AddField( + model_name='quotapresaleitem', + name='settlement_state', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='quotapresaleitem', + name='transaction', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pre_sales', to='warehouse.inventoryquotasaletransaction'), + ), + migrations.AddField( + model_name='quotapresaleitem', + name='weight', + field=models.IntegerField(default=0), + ), + ] diff --git a/apps/warehouse/models.py b/apps/warehouse/models.py index 3a66fff..637b69c 100644 --- a/apps/warehouse/models.py +++ b/apps/warehouse/models.py @@ -113,6 +113,8 @@ class InventoryQuotaSaleTransaction(BaseModel): ref_num = models.CharField(max_length=50, null=True) terminal = models.CharField(max_length=50, null=True) payer_cart = models.CharField(max_length=50, null=True) + free_sale_state = models.BooleanField(default=False) + pre_sale = models.BooleanField(default=False) additional = models.JSONField(default=dict) @property @@ -190,3 +192,38 @@ class ExtraSale(BaseModel): def save(self, *args, **kwargs): return super(ExtraSale, self).save(*args, **kwargs) + + +class QuotaPreSaleItem(BaseModel): + organization = models.ForeignKey( + Organization, + on_delete=models.CASCADE, + related_name='pre_sales', + null=True + ) + distribution = models.ForeignKey( + product_models.QuotaDistribution, + on_delete=models.CASCADE, + related_name='pre_sales', + null=True + ) + transaction = models.ForeignKey( + InventoryQuotaSaleTransaction, + on_delete=models.CASCADE, + related_name='pre_sales', + null=True + ) + sale_item = models.ForeignKey( + InventoryQuotaSaleItem, + on_delete=models.CASCADE, + related_name='pre_sale', + null=True + ) + weight = models.IntegerField(default=0) + settlement_state = models.BooleanField(default=False) + + def __str__(self): + return f'Distribution {self.distribution.distribution_id} - Transaction {self.transaction.transaction_id}' + + def save(self, *args, **kwargs): + return super(QuotaPreSaleItem, self).save(*args, **kwargs) diff --git a/apps/warehouse/pos/api/v1/api.py b/apps/warehouse/pos/api/v1/api.py index 6da53a7..a78a873 100644 --- a/apps/warehouse/pos/api/v1/api.py +++ b/apps/warehouse/pos/api/v1/api.py @@ -126,3 +126,10 @@ class InventoryQuotaSaleTransactionViewSet(viewsets.ModelViewSet, DynamicSearchM if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) + + +class QuotaPreSaleItemViewSet(viewsets.ModelViewSet): + queryset = warehouse_models.QuotaPreSaleItem.objects.all().select_related( + 'organization', 'transaction', 'sale_item' + ) + serializer_class = warehouse_serializers diff --git a/apps/warehouse/pos/api/v1/serializers.py b/apps/warehouse/pos/api/v1/serializers.py index c45e3a2..bc750cd 100644 --- a/apps/warehouse/pos/api/v1/serializers.py +++ b/apps/warehouse/pos/api/v1/serializers.py @@ -202,3 +202,9 @@ class InventoryQuotaSaleItemSerializer(serializers.ModelSerializer): "total_price", ] + + +class QuotaPreSaleItemSerializer(serializers.ModelSerializer): + class Meta: + model = warehouse_models.QuotaPreSaleItem + fields = '__all__'