From 14dc870d476e20f92b964e9cafee97dfb47f37da Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 15 Sep 2025 17:41:20 +0500 Subject: [PATCH] add: add two new api for finance --- .../finance/serializers/expence_contract.py | 4 ++++ .../finance/serializers/income_contract.py | 4 +++- core/apps/finance/urls.py | 2 ++ core/apps/finance/views/expence_contract.py | 22 +++++++++++++++++- core/apps/finance/views/income_contract.py | 23 +++++++++++++++++-- 5 files changed, 51 insertions(+), 4 deletions(-) diff --git a/core/apps/finance/serializers/expence_contract.py b/core/apps/finance/serializers/expence_contract.py index 7677afd..25df45f 100644 --- a/core/apps/finance/serializers/expence_contract.py +++ b/core/apps/finance/serializers/expence_contract.py @@ -81,3 +81,7 @@ class ExpenceContractCreateSerializer(serializers.ModelSerializer): ) return expence_contract + + +class ExpenceContractCalculatePriceSerializer(serializers.Serializer): + price = serializers.IntegerField() \ No newline at end of file diff --git a/core/apps/finance/serializers/income_contract.py b/core/apps/finance/serializers/income_contract.py index a57ad4e..5166e61 100644 --- a/core/apps/finance/serializers/income_contract.py +++ b/core/apps/finance/serializers/income_contract.py @@ -76,4 +76,6 @@ class IncomeContractCreateSerializer(serializers.ModelSerializer): ) return income_contract - \ No newline at end of file + +class IncomeContractCalculatePriceSerializer(serializers.Serializer): + price = serializers.IntegerField() \ No newline at end of file diff --git a/core/apps/finance/urls.py b/core/apps/finance/urls.py index b4bed88..93e77fd 100644 --- a/core/apps/finance/urls.py +++ b/core/apps/finance/urls.py @@ -72,6 +72,7 @@ urlpatterns = [ path('list/', ic_views.IncomeContractListApiView.as_view()), path('create/', ic_views.IncomeContractCreateApiView.as_view()), path('statistics/', ic_views.IncomeContractStatisticsApiView.as_view()), + path('/calculate_price/', ic_views.IncomeContractCalculatePriceApiView.as_view()), ] )), path('expence_contract/', include( @@ -79,6 +80,7 @@ urlpatterns = [ path('list/', ec_views.ExpenceContractListApiView.as_view()), path('create/', ec_views.ExpenceContractCreateApiView.as_view()), path('statistics/', ec_views.ExpenceContractStatisticsApiView.as_view()), + path('/calculate_price/', ec_views.ExpenceContractCalculatePriceApiView.as_view()), ] )) ] \ No newline at end of file diff --git a/core/apps/finance/views/expence_contract.py b/core/apps/finance/views/expence_contract.py index 07e3624..78fb84e 100644 --- a/core/apps/finance/views/expence_contract.py +++ b/core/apps/finance/views/expence_contract.py @@ -1,5 +1,6 @@ from django.utils.timezone import now from django.db.models import Sum, Q, F +from django.shortcuts import get_object_or_404 from django_filters.rest_framework.backends import DjangoFilterBackend @@ -7,7 +8,7 @@ from rest_framework import generics, views, filters from rest_framework.response import Response from core.apps.finance.models import ExpenceContract -from core.apps.finance.serializers.expence_contract import ExpenceContractSerializer, ExpenceContractCreateSerializer +from core.apps.finance.serializers.expence_contract import ExpenceContractSerializer, ExpenceContractCreateSerializer, ExpenceContractCalculatePriceSerializer from core.apps.accounts.permissions.permissions import HasRolePermission @@ -99,3 +100,22 @@ class ExpenceContractStatisticsApiView(views.APIView): 'usd': usd } return Response(res, status=200) + + +class ExpenceContractCalculatePriceApiView(generics.GenericAPIView): + serializer_class = ExpenceContractCalculatePriceSerializer + queryset = ExpenceContract.objects.all() + permission_classes = [HasRolePermission] + + def get(self, request, id): + expence_contract = get_object_or_404(ExpenceContract, id=id) + serializer = self.serializer_class(data=request.data) + serializer.is_valid() + price = serializer.validated_data.get('price') + expence_contract.price -= price + expence_contract.paid_price += price + expence_contract.save() + return Response({ + 'success': True, + 'message': 'price calculated', + }, status=200) \ No newline at end of file diff --git a/core/apps/finance/views/income_contract.py b/core/apps/finance/views/income_contract.py index 42e1e89..866e817 100644 --- a/core/apps/finance/views/income_contract.py +++ b/core/apps/finance/views/income_contract.py @@ -9,7 +9,7 @@ from rest_framework.response import Response from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.finance.models import IncomeContract -from core.apps.finance.serializers.income_contract import IncomeContractSerializer, IncomeContractCreateSerializer +from core.apps.finance.serializers.income_contract import IncomeContractSerializer, IncomeContractCreateSerializer, IncomeContractCalculatePriceSerializer class IncomeContractCreateApiView(generics.GenericAPIView): @@ -99,4 +99,23 @@ class IncomeContractStatisticsApiView(views.APIView): 'uzs': uzs, 'usd': usd } - return Response(res, status=200) \ No newline at end of file + return Response(res, status=200) + + +class IncomeContractCalculatePriceApiView(generics.GenericAPIView): + serializer_class = IncomeContractCalculatePriceSerializer + queryset = IncomeContract.objects.all() + permission_classes = [HasRolePermission] + + def get(self, request, id): + income_contract = get_object_or_404(IncomeContract, id=id) + serializer = self.serializer_class(data=request.data) + serializer.is_valid() + price = serializer.validated_data.get('price') + income_contract.price -= price + income_contract.paid_price += price + income_contract.save() + return Response({ + 'success': True, + 'message': 'price calculated', + }, status=200) \ No newline at end of file