From 931c07e66d53a783d5a31c0e0c736589f9e42ada Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Sat, 23 Aug 2025 13:49:25 +0500 Subject: [PATCH] add party update api --- core/apps/orders/models/order.py | 9 ++- core/apps/orders/serializers/party.py | 101 +++++++++++++++++++++++++- 2 files changed, 103 insertions(+), 7 deletions(-) diff --git a/core/apps/orders/models/order.py b/core/apps/orders/models/order.py index ce4ebff..b0e1fc7 100644 --- a/core/apps/orders/models/order.py +++ b/core/apps/orders/models/order.py @@ -31,14 +31,15 @@ class Order(BaseModel): wherehouse = models.ForeignKey( WhereHouse, on_delete=models.CASCADE, related_name='orders' ) - date = models.DateField(null=True, blank=True) - quantity = models.PositiveBigIntegerField(default=1) - status = models.CharField(max_length=20, choices=STATUS, default="NEW") employee = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders', null=True) - unit_amount = models.PositiveBigIntegerField(default=0, null=True, blank=True) counterparty = models.ForeignKey( Counterparty, on_delete=models.SET_NULL, null=True, blank=True, related_name='order' ) + + date = models.DateField(null=True, blank=True) + quantity = models.PositiveBigIntegerField(default=1) + status = models.CharField(max_length=20, choices=STATUS, default="NEW") + unit_amount = models.PositiveBigIntegerField(default=0, null=True, blank=True) currency = models.CharField( choices=[('uzs', 'uzs'), ('usd', 'usd')], default='uzs', null=True, blank=True, max_length=3 ) diff --git a/core/apps/orders/serializers/party.py b/core/apps/orders/serializers/party.py index 14920e0..07d1270 100644 --- a/core/apps/orders/serializers/party.py +++ b/core/apps/orders/serializers/party.py @@ -7,6 +7,10 @@ from core.apps.orders.serializers.order import MultipleOrderAddSerializer, Order from core.apps.accounts.models import User from core.apps.counterparty.serializers.counterparty import CounterpartyListPartySerializer from core.apps.shared.models import UsdCourse +from core.apps.products.models import Product, Unity +from core.apps.projects.models import Project, ProjectFolder +from core.apps.wherehouse.models import WhereHouse +from core.apps.counterparty.models import Counterparty class PartyCreateSerializer(serializers.Serializer): @@ -171,22 +175,113 @@ class DeletedPartyListSerializer(serializers.ModelSerializer): } +class PartyOrderUpdateSerializer(serializers.Serializer): + order_id = serializers.UUIDField() + product_id = serializers.UUIDField() + unity_id = serializers.UUIDField() + project_folder_id = serializers.UUIDField(required=False) + project_id = serializers.UUIDField(required=False) + wherehouse_id = serializers.UUIDField() + counterparty_id = serializers.UUIDField() + quantity = serializers.IntegerField() + unit_amount = serializers.IntegerField() + currency = serializers.ChoiceField(choices=[('uzs', 'uzs'), ('usd', 'usd')]) + total_price = serializers.IntegerField() + + def validate(self, data): + order = Order.objects.filter(id=data['order_id']).first() + if not order: + raise serializers.ValidationError("Order not found") + product = Product.objects.filter(id=data['product_id']).first() + if not product: + raise serializers.ValidationError(f"Product not found on {order.id}") + unity = Unity.objects.filter(id=data['unity_id']).first() + if not unity: + raise serializers.ValidationError(f"Unity not found on {order.id}") + if data.get('project_folder_id'): + project_folder = ProjectFolder.objects.filter(id=data['project_folder_id']).first() + if not project_folder: + raise serializers.ValidationError(f"Project Folder not found on {order.id}") + data['project_folder'] = project_folder + if data.get('project_id'): + project = Project.objects.filter(id=data['project_id']).first() + if not project: + raise serializers.ValidationError(f"Project not found on {order.id}") + data['project'] = project + wherehouse = WhereHouse.objects.filter(id=data['wherehouse_id']).first() + if not wherehouse: + raise serializers.ValidationError(f"WhereHouse not found on {order.id}") + counterparty = Counterparty.objects.filter(id=data['counterparty_id']).first() + if not counterparty: + raise serializers.ValidationError(f"Counterparty not found on {order.id}") + + data['order'] = order + data['product'] = product + data['unity'] = unity + data['wherehouse'] = wherehouse + data['counterparty'] = counterparty + return data + + class PartyUpdateSerializer(serializers.ModelSerializer): + orders = PartyOrderUpdateSerializer(many=True, required=False) + class Meta: model = Party fields = [ - 'mediator', 'delivery_date', 'payment_date', + 'mediator', 'delivery_date', 'payment_date', 'orders', 'comment', 'audit', 'audit_comment', + 'discount', 'discount_currency', ] extra_kwargs = { - 'mediator': {'required': False}, + 'mediator': {'required': False}, 'delivery_date': {'required': False}, - 'payment_date': {'required':False} + 'payment_date': {'required':False}, + 'comment': {'required': False}, + 'audit': {'required': False}, + 'audit_comment': {'required': False}, + 'discount': {'required': False}, + 'discount_currency': {'required': False}, } def update(self, instance, validated_data): + orders_data = validated_data.pop('orders') + update_orders = [] with transaction.atomic(): instance.mediator = validated_data.get('mediator', instance.mediator) instance.delivery_date = validated_data.get('delivery_date', instance.delivery_date) instance.payment_date = validated_data.get('payment_date', instance.payment_date) instance.save() + + for order_data in orders_data: + order = order_data['order'] + order.product = order_data['product'] + order.unity = order_data['unity'] + order.wherehouse = order_data['wherehouse'] + order.counterparty = order_data['counterparty'] + order.quantity = order_data['quantity'] + order.currency = order_data['currency'] + order.unit_amount = order_data['unit_amount'] + order.total_price = order_data['total_price'] + if 'project_folder' in order_data: + order.project_folder = order_data['project_folder'] + if 'project' in order_data: + order.project = order_data['project'] + + update_orders.append(order) + + Order.objects.bulk_update( + update_orders, + fields=[ + 'product', + 'unity', + 'wherehouse', + 'counterparty', + 'quantity', + 'unit_amount', + 'currency', + 'total_price', + 'project_folder', + 'project' + ] + ) return instance \ No newline at end of file