Merge pull request #9 from xoliqberdiyev/test

Test
This commit is contained in:
xoliqberdiyev
2025-10-06 16:29:53 +05:00
committed by GitHub

View File

@@ -1,18 +1,20 @@
from django.db import transaction from django.db import transaction
from rest_framework import serializers from rest_framework import serializers
from core.apps.orders.models import Party, PartyAmount, Order, DeletedParty
from core.apps.orders.serializers.order import MultipleOrderAddSerializer, OrderListSerializer
from core.apps.accounts.models import User from core.apps.accounts.models import User
from core.apps.counterparty.models import Counterparty
from core.apps.counterparty.serializers.counterparty import CounterpartySerializer from core.apps.counterparty.serializers.counterparty import CounterpartySerializer
from core.apps.finance.models import Expence
from core.apps.orders.models import DeletedParty, Order, Party, PartyAmount
from core.apps.orders.serializers.order import (
MultipleOrderAddSerializer,
OrderListSerializer,
)
from core.apps.orders.tasks.order import create_inventory from core.apps.orders.tasks.order import create_inventory
from core.apps.shared.models import UsdCourse
from core.apps.products.models import Product, Unity from core.apps.products.models import Product, Unity
from core.apps.projects.models import Project, ProjectFolder from core.apps.projects.models import Project, ProjectFolder
from core.apps.shared.models import UsdCourse
from core.apps.wherehouse.models import WhereHouse from core.apps.wherehouse.models import WhereHouse
from core.apps.counterparty.models import Counterparty
from core.apps.finance.models import Expence
class PartyCreateSerializer(serializers.Serializer): class PartyCreateSerializer(serializers.Serializer):
@@ -22,67 +24,71 @@ class PartyCreateSerializer(serializers.Serializer):
payment_date = serializers.DateField() payment_date = serializers.DateField()
comment = serializers.CharField(required=False) comment = serializers.CharField(required=False)
discount = serializers.IntegerField(required=False) discount = serializers.IntegerField(required=False)
discount_currency = serializers.ChoiceField(choices=[('uzs', 'uzs'), ('usd', 'usd')], required=False) discount_currency = serializers.ChoiceField(
choices=[("uzs", "uzs"), ("usd", "usd")], required=False
)
audit = serializers.ChoiceField( audit = serializers.ChoiceField(
choices=[('CHECKED', 'tekshirildi'),('PROCESS', 'jarayonda')], required=False choices=[("CHECKED", "tekshirildi"), ("PROCESS", "jarayonda")], required=False
) )
audit_comment = serializers.CharField(required=False) audit_comment = serializers.CharField(required=False)
currency = serializers.ChoiceField(choices=[('uzs', 'uzs'), ('usd', 'usd')]) currency = serializers.ChoiceField(choices=[("uzs", "uzs"), ("usd", "usd")])
def validate(self, data): def validate(self, data):
user = User.objects.filter(id=data['mediator_id']).first() user = User.objects.filter(id=data["mediator_id"]).first()
if not user: if not user:
raise serializers.ValidationError("User not found") raise serializers.ValidationError("User not found")
data['user'] = user data["user"] = user
return data return data
def create(self, validated_data): def create(self, validated_data):
with transaction.atomic(): with transaction.atomic():
resources = validated_data.pop('resources') resources = validated_data.pop("resources")
orders = [] orders = []
total_price = 0 total_price = 0
for resource in resources: for resource in resources:
orders.append(Order( orders.append(
product=resource['product'], Order(
unity=resource['unity'], product=resource["product"],
project_folder=resource.get('project_folder'), unity=resource["unity"],
project=resource.get('project'), project_folder=resource.get("project_folder"),
counterparty=resource.get('counterparty'), project=resource.get("project"),
wherehouse=resource.get('wherehouse'), counterparty=resource.get("counterparty"),
quantity=resource.get('quantity'), wherehouse=resource.get("wherehouse"),
unit_amount=resource.get('unit_amount'), quantity=resource.get("quantity"),
currency=resource.get('currency'), unit_amount=resource.get("unit_amount"),
amount=resource.get('amount'), currency=resource.get("currency"),
employee=self.context.get('user'), amount=resource.get("amount"),
qqs_price=resource.get('qqs_price'), employee=self.context.get("user"),
total_price=resource.get('total_price'), qqs_price=resource.get("qqs_price"),
qqs=resource.get('qqs'), total_price=resource.get("total_price"),
)) qqs=resource.get("qqs"),
if validated_data.get('currency') == 'uzs': )
if resource.get('currency') == 'usd': )
if validated_data.get("currency") != "uzs":
if resource.get("currency") == "usd":
usd_value = UsdCourse.objects.first().value usd_value = UsdCourse.objects.first().value
total_price += resource.get('amount') * usd_value total_price += resource.get("amount") * usd_value
else: else:
total_price += resource.get('amount') total_price += resource.get("amount")
created_orders = Order.objects.bulk_create(orders) created_orders = Order.objects.bulk_create(orders)
party = Party.objects.create( party = Party.objects.create(
mediator=validated_data.get('user'), mediator=validated_data.get("user"),
delivery_date=validated_data.get('delivery_date'), delivery_date=validated_data.get("delivery_date"),
payment_date=validated_data.get('payment_date'), payment_date=validated_data.get("payment_date"),
comment=validated_data.get('comment'), comment=validated_data.get("comment"),
audit=validated_data.get('audit'), audit=validated_data.get("audit"),
audit_comment=validated_data.get('audit_comment'), audit_comment=validated_data.get("audit_comment"),
discount=validated_data.get('discount'), discount=validated_data.get("discount"),
discount_currency=validated_data.get('discount_currency'), discount_currency=validated_data.get("discount_currency"),
currency=validated_data.get('currency'), currency=validated_data.get("currency"),
) )
party.orders.add(*created_orders) party.orders.add(*created_orders)
party.save() party.save()
PartyAmount.objects.create( PartyAmount.objects.create(
total_price=total_price, total_price=total_price,
party=party, party=party,
payment_amount=total_price-validated_data.get('discount', 0), payment_amount=total_price - validated_data.get("discount", 0),
cost_amount=total_price-validated_data.get('discount', 0), cost_amount=total_price - validated_data.get("discount", 0),
) )
return party return party
@@ -91,32 +97,52 @@ class PartyAmountSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = PartyAmount model = PartyAmount
fields = [ fields = [
'id', 'total_price', 'cost_amount', 'calculated_amount', 'paid_amount', 'payment_amount' "id",
"total_price",
"cost_amount",
"calculated_amount",
"paid_amount",
"payment_amount",
] ]
class PartyDetailSerializer(serializers.ModelSerializer): class PartyDetailSerializer(serializers.ModelSerializer):
orders = OrderListSerializer(many=True) orders = OrderListSerializer(many=True)
party_amount = PartyAmountSerializer() party_amount = PartyAmountSerializer()
mediator = serializers.SerializerMethodField(method_name='get_mediator') mediator = serializers.SerializerMethodField(method_name="get_mediator")
counterparty = serializers.SerializerMethodField(method_name='get_counterparty') counterparty = serializers.SerializerMethodField(method_name="get_counterparty")
class Meta: class Meta:
model = Party model = Party
fields = [ fields = [
'id', 'number', 'delivery_date', 'closed_date', 'order_date', 'payment_date', 'status', "id",
'payment_status', 'process', 'confirmation', 'comment', 'audit', 'audit_comment', "number",
'orders', 'party_amount', 'mediator', 'currency', 'counterparty' "delivery_date",
"closed_date",
"order_date",
"payment_date",
"status",
"payment_status",
"process",
"confirmation",
"comment",
"audit",
"audit_comment",
"orders",
"party_amount",
"mediator",
"currency",
"counterparty",
"discount",
] ]
def get_mediator(self, obj): def get_mediator(self, obj):
return { return {"id": obj.mediator.id, "full_name": obj.mediator.full_name}
'id': obj.mediator.id,
'full_name': obj.mediator.full_name
}
def get_counterparty(self, obj): def get_counterparty(self, obj):
counterparties = obj.orders.values("counterparty__id", "counterparty__name").distinct() counterparties = obj.orders.values(
"counterparty__id", "counterparty__name"
).distinct()
counterparties = [ counterparties = [
{"id": c["counterparty__id"], "name": c["counterparty__name"]} {"id": c["counterparty__id"], "name": c["counterparty__name"]}
for c in counterparties for c in counterparties
@@ -126,25 +152,39 @@ class PartyDetailSerializer(serializers.ModelSerializer):
class PartyListSerializer(serializers.ModelSerializer): class PartyListSerializer(serializers.ModelSerializer):
party_amount = PartyAmountSerializer() party_amount = PartyAmountSerializer()
mediator = serializers.SerializerMethodField(method_name='get_mediator') mediator = serializers.SerializerMethodField(method_name="get_mediator")
counterparty = serializers.SerializerMethodField(method_name='get_counterparty') counterparty = serializers.SerializerMethodField(method_name="get_counterparty")
class Meta: class Meta:
model = Party model = Party
fields = [ fields = [
'id','number', 'delivery_date', 'closed_date', 'order_date', 'payment_date', 'status', "id",
'payment_status', 'process', 'confirmation', 'comment', 'audit', 'audit_comment', "number",
'party_amount', 'mediator', 'counterparty', 'currency' "delivery_date",
"closed_date",
"order_date",
"payment_date",
"status",
"payment_status",
"process",
"confirmation",
"comment",
"audit",
"audit_comment",
"party_amount",
"mediator",
"counterparty",
"currency",
"discount",
] ]
def get_mediator(self, obj): def get_mediator(self, obj):
return { return {"id": obj.mediator.id, "full_name": obj.mediator.full_name}
'id': obj.mediator.id,
'full_name': obj.mediator.full_name
}
def get_counterparty(self, obj): def get_counterparty(self, obj):
counterparties = obj.orders.values("counterparty__id", "counterparty__name").distinct() counterparties = obj.orders.values(
"counterparty__id", "counterparty__name"
).distinct()
counterparties = [ counterparties = [
{"id": c["counterparty__id"], "name": c["counterparty__name"]} {"id": c["counterparty__id"], "name": c["counterparty__name"]}
for c in counterparties for c in counterparties
@@ -156,36 +196,32 @@ class DeletedPartyCreateSerializer(serializers.Serializer):
comment = serializers.CharField(required=False) comment = serializers.CharField(required=False)
def validate(self, data): def validate(self, data):
party = Party.objects.filter(id=self.context.get('party_id')).first() party = Party.objects.filter(id=self.context.get("party_id")).first()
if not party: if not party:
raise serializers.ValidationError("Party not found") raise serializers.ValidationError("Party not found")
data['party'] = party data["party"] = party
return data return data
def create(self, validated_data): def create(self, validated_data):
with transaction.atomic(): with transaction.atomic():
return DeletedParty.objects.create( return DeletedParty.objects.create(
comment=validated_data.get('comment'), comment=validated_data.get("comment"), party=validated_data.get("party")
party=validated_data.get('party')
) )
class DeletedPartyListSerializer(serializers.ModelSerializer): class DeletedPartyListSerializer(serializers.ModelSerializer):
party_number = serializers.IntegerField(source='party.number') party_number = serializers.IntegerField(source="party.number")
party_total_price = serializers.IntegerField(source='party.party_amount.total_price') party_total_price = serializers.IntegerField(
mediator = serializers.SerializerMethodField(method_name='get_mediator') source="party.party_amount.total_price"
)
mediator = serializers.SerializerMethodField(method_name="get_mediator")
class Meta: class Meta:
model = DeletedParty model = DeletedParty
fields = [ fields = ["id", "deleted_date", "party_number", "party_total_price", "mediator"]
'id', 'deleted_date', 'party_number', 'party_total_price', 'mediator'
]
def get_mediator(self, obj): def get_mediator(self, obj):
return { return {"id": obj.party.mediator.id, "name": obj.party.mediator.full_name}
'id': obj.party.mediator.id,
'name': obj.party.mediator.full_name
}
class PartyOrderUpdateSerializer(serializers.Serializer): class PartyOrderUpdateSerializer(serializers.Serializer):
@@ -198,41 +234,45 @@ class PartyOrderUpdateSerializer(serializers.Serializer):
counterparty_id = serializers.UUIDField() counterparty_id = serializers.UUIDField()
quantity = serializers.IntegerField() quantity = serializers.IntegerField()
unit_amount = serializers.IntegerField() unit_amount = serializers.IntegerField()
currency = serializers.ChoiceField(choices=[('uzs', 'uzs'), ('usd', 'usd')]) currency = serializers.ChoiceField(choices=[("uzs", "uzs"), ("usd", "usd")])
total_price = serializers.IntegerField() total_price = serializers.IntegerField()
def validate(self, data): def validate(self, data):
order = Order.objects.filter(id=data['order_id']).first() order = Order.objects.filter(id=data["order_id"]).first()
if not order: if not order:
raise serializers.ValidationError("Order not found") raise serializers.ValidationError("Order not found")
product = Product.objects.filter(id=data['product_id']).first() product = Product.objects.filter(id=data["product_id"]).first()
if not product: if not product:
raise serializers.ValidationError(f"Product not found on {order.id}") raise serializers.ValidationError(f"Product not found on {order.id}")
unity = Unity.objects.filter(id=data['unity_id']).first() unity = Unity.objects.filter(id=data["unity_id"]).first()
if not unity: if not unity:
raise serializers.ValidationError(f"Unity not found on {order.id}") raise serializers.ValidationError(f"Unity not found on {order.id}")
if data.get('project_folder_id'): if data.get("project_folder_id"):
project_folder = ProjectFolder.objects.filter(id=data['project_folder_id']).first() project_folder = ProjectFolder.objects.filter(
id=data["project_folder_id"]
).first()
if not project_folder: if not project_folder:
raise serializers.ValidationError(f"Project Folder not found on {order.id}") raise serializers.ValidationError(
data['project_folder'] = project_folder f"Project Folder not found on {order.id}"
if data.get('project_id'): )
project = Project.objects.filter(id=data['project_id']).first() data["project_folder"] = project_folder
if data.get("project_id"):
project = Project.objects.filter(id=data["project_id"]).first()
if not project: if not project:
raise serializers.ValidationError(f"Project not found on {order.id}") raise serializers.ValidationError(f"Project not found on {order.id}")
data['project'] = project data["project"] = project
wherehouse = WhereHouse.objects.filter(id=data['wherehouse_id']).first() wherehouse = WhereHouse.objects.filter(id=data["wherehouse_id"]).first()
if not wherehouse: if not wherehouse:
raise serializers.ValidationError(f"WhereHouse not found on {order.id}") raise serializers.ValidationError(f"WhereHouse not found on {order.id}")
counterparty = Counterparty.objects.filter(id=data['counterparty_id']).first() counterparty = Counterparty.objects.filter(id=data["counterparty_id"]).first()
if not counterparty: if not counterparty:
raise serializers.ValidationError(f"Counterparty not found on {order.id}") raise serializers.ValidationError(f"Counterparty not found on {order.id}")
data['order'] = order data["order"] = order
data['product'] = product data["product"] = product
data['unity'] = unity data["unity"] = unity
data['wherehouse'] = wherehouse data["wherehouse"] = wherehouse
data['counterparty'] = counterparty data["counterparty"] = counterparty
return data return data
@@ -242,136 +282,173 @@ class PartyUpdateSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Party model = Party
fields = [ fields = [
'mediator', 'delivery_date', 'payment_date', 'orders', 'comment', 'audit', 'audit_comment', "mediator",
'discount', 'discount_currency', "delivery_date",
"payment_date",
"orders",
"comment",
"audit",
"audit_comment",
"discount",
"discount_currency",
] ]
extra_kwargs = { extra_kwargs = {
'mediator': {'required': False}, "mediator": {"required": False},
'delivery_date': {'required': False}, "delivery_date": {"required": False},
'payment_date': {'required':False}, "payment_date": {"required": False},
'comment': {'required': False}, "comment": {"required": False},
'audit': {'required': False}, "audit": {"required": False},
'audit_comment': {'required': False}, "audit_comment": {"required": False},
'discount': {'required': False}, "discount": {"required": False},
'discount_currency': {'required': False}, "discount_currency": {"required": False},
} }
def update(self, instance, validated_data): def update(self, instance, validated_data):
orders_data = validated_data.pop('orders') orders_data = validated_data.pop("orders")
update_orders = [] update_orders = []
with transaction.atomic(): with transaction.atomic():
instance.mediator = validated_data.get('mediator', instance.mediator) instance.mediator = validated_data.get("mediator", instance.mediator)
instance.delivery_date = validated_data.get('delivery_date', instance.delivery_date) instance.delivery_date = validated_data.get(
instance.payment_date = validated_data.get('payment_date', instance.payment_date) "delivery_date", instance.delivery_date
)
instance.payment_date = validated_data.get(
"payment_date", instance.payment_date
)
instance.save() instance.save()
for order_data in orders_data: for order_data in orders_data:
order = order_data['order'] order = order_data["order"]
order.product = order_data['product'] order.product = order_data["product"]
order.unity = order_data['unity'] order.unity = order_data["unity"]
order.wherehouse = order_data['wherehouse'] order.wherehouse = order_data["wherehouse"]
order.counterparty = order_data['counterparty'] order.counterparty = order_data["counterparty"]
order.quantity = order_data['quantity'] order.quantity = order_data["quantity"]
order.currency = order_data['currency'] order.currency = order_data["currency"]
order.unit_amount = order_data['unit_amount'] order.unit_amount = order_data["unit_amount"]
order.total_price = order_data['total_price'] order.total_price = order_data["total_price"]
if 'project_folder' in order_data: if "project_folder" in order_data:
order.project_folder = order_data['project_folder'] order.project_folder = order_data["project_folder"]
if 'project' in order_data: if "project" in order_data:
order.project = order_data['project'] order.project = order_data["project"]
update_orders.append(order) update_orders.append(order)
Order.objects.bulk_update( Order.objects.bulk_update(
update_orders, update_orders,
fields=[ fields=[
'product', "product",
'unity', "unity",
'wherehouse', "wherehouse",
'counterparty', "counterparty",
'quantity', "quantity",
'unit_amount', "unit_amount",
'currency', "currency",
'total_price', "total_price",
'project_folder', "project_folder",
'project' "project",
] ],
) )
return instance return instance
class PartyExpenceCreateSerializer(serializers.ModelSerializer): class PartyExpenceCreateSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Expence model = Expence
fields = [ fields = [
'cash_transaction', 'payment_type', 'project_folder', 'project', 'counterparty', "cash_transaction",
'price', 'exchange_rate', 'currency', 'date', 'comment', 'party' "payment_type",
"project_folder",
"project",
"counterparty",
"price",
"exchange_rate",
"currency",
"date",
"comment",
"party",
] ]
def create(self, validated_data): def create(self, validated_data):
with transaction.atomic(): with transaction.atomic():
expence = Expence.objects.create( expence = Expence.objects.create(
cash_transaction=validated_data.get('cash_transaction'), cash_transaction=validated_data.get("cash_transaction"),
payment_type=validated_data.get('payment_type'), payment_type=validated_data.get("payment_type"),
project_folder=validated_data.get('project_folder'), project_folder=validated_data.get("project_folder"),
project=validated_data.get('project'), project=validated_data.get("project"),
counterparty=validated_data.get('counterparty'), counterparty=validated_data.get("counterparty"),
price=validated_data.get('price') * validated_data.get('exchange_rate') if validated_data.get('exchange_rate') else validated_data.get('price'), price=(
exchange_rate=validated_data.get('exchange_rate'), validated_data.get("price") * validated_data.get("exchange_rate")
currency=validated_data.get('currency'), if validated_data.get("exchange_rate")
date=validated_data.get('date'), else validated_data.get("price")
comment=validated_data.get('comment'), ),
party=validated_data.get('party'), exchange_rate=validated_data.get("exchange_rate"),
currency=validated_data.get("currency"),
date=validated_data.get("date"),
comment=validated_data.get("comment"),
party=validated_data.get("party"),
) )
cash_transaction = expence.cash_transaction cash_transaction = expence.cash_transaction
payment_type = expence.payment_type payment_type = expence.payment_type
if validated_data.get('currency') == 'uzs': if validated_data.get("currency") == "uzs":
cash_transaction.expence_balance_uzs += expence.price cash_transaction.expence_balance_uzs += expence.price
cash_transaction.total_balance_uzs = cash_transaction.income_balance_uzs - cash_transaction.expence_balance_uzs cash_transaction.total_balance_uzs = (
cash_transaction.income_balance_uzs
- cash_transaction.expence_balance_uzs
)
if payment_type.total_uzs > expence.price: if payment_type.total_uzs > expence.price:
payment_type.total_uzs -= expence.price payment_type.total_uzs -= expence.price
if expence.counterparty: if expence.counterparty:
if expence.counterparty.kredit_uzs != 0: if expence.counterparty.kredit_uzs != 0:
expence.counterparty.kredit_uzs -= expence.price expence.counterparty.kredit_uzs -= expence.price
expence.counterparty.total_kredit -= expence.price expence.counterparty.total_kredit -= expence.price
expence.counterparty.debit_uzs += expence.counterparty.kredit_uzs - expence.price expence.counterparty.debit_uzs += (
expence.counterparty.kredit_uzs - expence.price
)
expence.counterparty.total_debit += expence.price expence.counterparty.total_debit += expence.price
else: else:
expence.counterparty.debit_uzs += expence.price expence.counterparty.debit_uzs += expence.price
expence.counterparty.total_debit += expence.price expence.counterparty.total_debit += expence.price
expence.counterparty.save() expence.counterparty.save()
if expence.party.currency == 'uzs': if expence.party.currency == "uzs":
expence.party.party_amount.payment_amount -= expence.price expence.party.party_amount.payment_amount -= expence.price
expence.party.party_amount.paid_amount += expence.price expence.party.party_amount.paid_amount += expence.price
expence.party.save() expence.party.save()
elif validated_data.get('currency') == 'usd': elif validated_data.get("currency") == "usd":
cash_transaction.expence_balance_usd += expence.price cash_transaction.expence_balance_usd += expence.price
cash_transaction.total_balance_usd = cash_transaction.income_balance_usd - cash_transaction.expence_balance_usd cash_transaction.total_balance_usd = (
cash_transaction.income_balance_usd
- cash_transaction.expence_balance_usd
)
if payment_type.total_usd > expence.price: if payment_type.total_usd > expence.price:
payment_type.total_usd -= expence.price payment_type.total_usd -= expence.price
if expence.counterparty: if expence.counterparty:
if expence.counterparty.kredit_usd != 0: if expence.counterparty.kredit_usd != 0:
expence.counterparty.kredit_usd -= validated_data.get('price') expence.counterparty.kredit_usd -= validated_data.get("price")
expence.counterparty.total_kredit -= expence.price expence.counterparty.total_kredit -= expence.price
expence.counterparty.debit_usd += expence.counterparty.kredit_usd - validated_data.get('price') expence.counterparty.debit_usd += (
expence.counterparty.kredit_usd
- validated_data.get("price")
)
expence.counterparty.total_debit += expence.price expence.counterparty.total_debit += expence.price
else: else:
expence.counterparty.debit_usd += validated_data.get('price') expence.counterparty.debit_usd += validated_data.get("price")
expence.counterparty.total_debit += expence.price expence.counterparty.total_debit += expence.price
expence.counterparty.save() expence.counterparty.save()
if expence.party.currency == 'usd': if expence.party.currency == "usd":
expence.party.party_amount.payment_amount -= validated_data.get('price') expence.party.party_amount.payment_amount -= validated_data.get(
expence.party.party_amount.paid_amount += validated_data.get('price') "price"
)
expence.party.party_amount.paid_amount += validated_data.get(
"price"
)
expence.party.save() expence.party.save()
cash_transaction.save() cash_transaction.save()
payment_type.save() payment_type.save()
return expence return expence