@@ -21,7 +21,7 @@ class CashTransactionEmployeeListSerializer(serializers.ModelSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
fields = [
|
fields = [
|
||||||
'id', 'profile_image', 'first_name', 'last_name', 'username'
|
'id', 'profile_image', 'full_name', 'username'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 5.2.4 on 2025-10-07 16:28
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('orders', '0026_alter_order_qqs_alter_order_qqs_price_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='partyamount',
|
||||||
|
name='calculated_amount',
|
||||||
|
field=models.BigIntegerField(default=0),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='partyamount',
|
||||||
|
name='cost_amount',
|
||||||
|
field=models.BigIntegerField(default=0),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='partyamount',
|
||||||
|
name='paid_amount',
|
||||||
|
field=models.BigIntegerField(default=0),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -59,6 +59,25 @@ class Party(BaseModel):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'P - {self.number}'
|
return f'P - {self.number}'
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
if self.status in ['NEW', 'CANCELLED', 'DRAFT']:
|
||||||
|
self.process = 0
|
||||||
|
elif self.status == 'EXPECTED':
|
||||||
|
self.process = 25
|
||||||
|
elif self.status == 'PROCESS':
|
||||||
|
self.process = 50
|
||||||
|
elif self.status == 'PURCHASED':
|
||||||
|
self.process = 75
|
||||||
|
elif self.status == 'PARTY_IS_MADE':
|
||||||
|
self.process = 100
|
||||||
|
if hasattr(self, 'party_amount') and self.party_amount.paid_amount > 0 and self.party_amount.payment_amount > 0:
|
||||||
|
self.payment_percentage = (self.party_amount.paid_amount / self.party_amount.payment_amount) * 100
|
||||||
|
self.party_amount.save()
|
||||||
|
else:
|
||||||
|
self.payment_percentage = 100.0
|
||||||
|
self.status == 'PURCHASED'
|
||||||
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = 'Partiya'
|
verbose_name = 'Partiya'
|
||||||
verbose_name_plural = 'Partiyalar'
|
verbose_name_plural = 'Partiyalar'
|
||||||
@@ -67,9 +86,9 @@ class Party(BaseModel):
|
|||||||
class PartyAmount(BaseModel):
|
class PartyAmount(BaseModel):
|
||||||
party = models.OneToOneField(Party, on_delete=models.CASCADE, related_name='party_amount')
|
party = models.OneToOneField(Party, on_delete=models.CASCADE, related_name='party_amount')
|
||||||
total_price = models.PositiveBigIntegerField()
|
total_price = models.PositiveBigIntegerField()
|
||||||
cost_amount = models.PositiveBigIntegerField(default=0)
|
cost_amount = models.BigIntegerField(default=0)
|
||||||
calculated_amount = models.PositiveBigIntegerField(default=0)
|
calculated_amount = models.BigIntegerField(default=0)
|
||||||
paid_amount = models.PositiveBigIntegerField(default=0)
|
paid_amount = models.BigIntegerField(default=0)
|
||||||
payment_amount = models.BigIntegerField(default=0)
|
payment_amount = models.BigIntegerField(default=0)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|||||||
@@ -64,10 +64,9 @@ class PartyCreateSerializer(serializers.Serializer):
|
|||||||
qqs=resource.get("qqs"),
|
qqs=resource.get("qqs"),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if validated_data.get("currency") != "uzs":
|
if resource.get("currency") == "usd":
|
||||||
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)
|
||||||
@@ -123,6 +122,7 @@ class PartyDetailSerializer(serializers.ModelSerializer):
|
|||||||
"payment_date",
|
"payment_date",
|
||||||
"status",
|
"status",
|
||||||
"payment_status",
|
"payment_status",
|
||||||
|
"payment_percentage",
|
||||||
"process",
|
"process",
|
||||||
"confirmation",
|
"confirmation",
|
||||||
"comment",
|
"comment",
|
||||||
@@ -166,6 +166,7 @@ class PartyListSerializer(serializers.ModelSerializer):
|
|||||||
"payment_date",
|
"payment_date",
|
||||||
"status",
|
"status",
|
||||||
"payment_status",
|
"payment_status",
|
||||||
|
"payment_percentage",
|
||||||
"process",
|
"process",
|
||||||
"confirmation",
|
"confirmation",
|
||||||
"comment",
|
"comment",
|
||||||
@@ -381,6 +382,7 @@ class PartyExpenceCreateSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
|
usd_value = UsdCourse.objects.first().value
|
||||||
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"),
|
||||||
@@ -426,8 +428,14 @@ class PartyExpenceCreateSerializer(serializers.ModelSerializer):
|
|||||||
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
|
||||||
|
print(expence.party.party_amount.payment_amount)
|
||||||
|
print(expence.party.party_amount.paid_amount)
|
||||||
|
expence.party.party_amount.save()
|
||||||
|
expence.party.save()
|
||||||
|
elif expence.party.currency == 'usd':
|
||||||
|
expence.party.party_amount.payment_amount -= round(expence.price / usd_value)
|
||||||
|
expence.party.party_amount.paid_amount += round(expence.price / usd_value)
|
||||||
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.total_balance_usd = (
|
||||||
@@ -451,6 +459,7 @@ class PartyExpenceCreateSerializer(serializers.ModelSerializer):
|
|||||||
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(
|
expence.party.party_amount.payment_amount -= validated_data.get(
|
||||||
"price"
|
"price"
|
||||||
@@ -459,7 +468,15 @@ class PartyExpenceCreateSerializer(serializers.ModelSerializer):
|
|||||||
"price"
|
"price"
|
||||||
)
|
)
|
||||||
expence.party.save()
|
expence.party.save()
|
||||||
|
elif expence.party.currency == "uzs":
|
||||||
|
expence.party.party_amount.payment_amount -= validated_data.get(
|
||||||
|
"price"
|
||||||
|
) * usd_value
|
||||||
|
expence.party.party_amount.paid_amount += validated_data.get(
|
||||||
|
"price"
|
||||||
|
) * usd_value
|
||||||
|
expence.party.save()
|
||||||
|
expence.party.party_amount.save()
|
||||||
cash_transaction.save()
|
cash_transaction.save()
|
||||||
payment_type.save()
|
payment_type.save()
|
||||||
return expence
|
return expence
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class PartyCreateApiView(generics.GenericAPIView):
|
|||||||
|
|
||||||
class PartyListApiView(generics.GenericAPIView):
|
class PartyListApiView(generics.GenericAPIView):
|
||||||
serializer_class = serializers.PartyListSerializer
|
serializer_class = serializers.PartyListSerializer
|
||||||
queryset = Party.objects.select_related('party_amount').exclude(is_deleted=True).order_by('number')
|
queryset = Party.objects.select_related('party_amount').exclude(is_deleted=True).order_by('-number')
|
||||||
permission_classes = [HasRolePermission]
|
permission_classes = [HasRolePermission]
|
||||||
filter_backends = [DjangoFilterBackend]
|
filter_backends = [DjangoFilterBackend]
|
||||||
filterset_class = PartyFilter
|
filterset_class = PartyFilter
|
||||||
|
|||||||
11
core/apps/shared/serializers/usd_course.py
Normal file
11
core/apps/shared/serializers/usd_course.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from core.apps.shared.models import UsdCourse
|
||||||
|
|
||||||
|
|
||||||
|
class UsdCourseSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = UsdCourse
|
||||||
|
fields = [
|
||||||
|
'id', 'value'
|
||||||
|
]
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
|
|
||||||
from core.apps.shared.views import region as region_views
|
from core.apps.shared.views import region as region_views
|
||||||
|
from core.apps.shared.views.usd_course import UsdCourseApiView
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('region/list/', region_views.RegionListApiView.as_view()),
|
path('region/list/', region_views.RegionListApiView.as_view()),
|
||||||
path('region/<uuid:id>/districts/', region_views.DistrictListApiView.as_view()),
|
path('region/<uuid:id>/districts/', region_views.DistrictListApiView.as_view()),
|
||||||
|
path('usd_course/', UsdCourseApiView.as_view()),
|
||||||
]
|
]
|
||||||
29
core/apps/shared/views/usd_course.py
Normal file
29
core/apps/shared/views/usd_course.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
from django.shortcuts import get_object_or_404
|
||||||
|
|
||||||
|
from rest_framework import generics
|
||||||
|
from rest_framework.response import Response
|
||||||
|
|
||||||
|
from core.apps.shared.models import UsdCourse
|
||||||
|
from core.apps.shared.serializers.usd_course import UsdCourseSerializer
|
||||||
|
from core.apps.accounts.permissions.permissions import HasRolePermission
|
||||||
|
|
||||||
|
|
||||||
|
class UsdCourseApiView(generics.GenericAPIView):
|
||||||
|
serializer_class = UsdCourseSerializer
|
||||||
|
queryset = UsdCourse.objects.all()
|
||||||
|
permission_classes = [HasRolePermission]
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
value = UsdCourse.objects.first()
|
||||||
|
serializer = self.serializer_class(value)
|
||||||
|
return Response(serializer.data, status=200)
|
||||||
|
|
||||||
|
def patch(self, request, id):
|
||||||
|
usd_cource = get_object_or_404(UsdCourse, id=id)
|
||||||
|
serializer = self.serializer_class(data=request.data)
|
||||||
|
if serializer.is_valid():
|
||||||
|
return Response(serializer.errors, status=400)
|
||||||
|
value = serializer.validated_data.get('value')
|
||||||
|
usd_cource.value = value
|
||||||
|
usd_cource.save()
|
||||||
|
return Response({'new_value': usd_cource.value, 'old_value': value}, status=200)
|
||||||
Reference in New Issue
Block a user