From dc079480e6bc01bc918a4a030e740ac6149e767b Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Thu, 25 Sep 2025 17:16:45 +0500 Subject: [PATCH] add: income-expence update api --- core/apps/finance/serializers/expence.py | 52 +++++++++++++++++++++++- core/apps/finance/serializers/income.py | 52 +++++++++++++++++++++++- core/apps/finance/urls.py | 2 + core/apps/finance/views/expence.py | 26 +++++++++++- core/apps/finance/views/income.py | 26 +++++++++++- 5 files changed, 154 insertions(+), 4 deletions(-) diff --git a/core/apps/finance/serializers/expence.py b/core/apps/finance/serializers/expence.py index accecc5..605f071 100644 --- a/core/apps/finance/serializers/expence.py +++ b/core/apps/finance/serializers/expence.py @@ -136,4 +136,54 @@ class ExpenceListSerializer(serializers.ModelSerializer): class ExpenceDeleteSerializer(serializers.Serializer): - comment = serializers.CharField() \ No newline at end of file + comment = serializers.CharField() + + +class ExpenceUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = Expence + fields = [ + 'project_folder', 'project', 'price', 'expence_type', 'counterparty', + 'date', 'comment', 'audit', 'file', + ] + extra_kwargs = { + 'price': {'required': False}, + } + + def update(self, instance, validated_data): + old_price = instance.price + instance.project_folder = validated_data.get('project_folder', instance.project_folder) + instance.project = validated_data.get('project', instance.project) + instance.price = validated_data.get('price', instance.price) + instance.expence_type = validated_data.get('expence_type', instance.expence_type) + instance.counterparty = validated_data.get('counterparty', instance.counterparty) + instance.date = validated_data.get('date', instance.date) + instance.comment = validated_data.get('comment', instance.comment) + instance.audit = validated_data.get('audit', instance.audit) + instance.file = validated_data.get('file', instance.file) + if validated_data.get('price'): + cash_transaction = instance.cash_transaction + payment_type = instance.payment_type + if old_price > validated_data.get('price'): + if instance.currency == 'uzs': + cash_transaction.expence_balance_uzs -= (old_price - validated_data.get('price')) + cash_transaction.total_balance_uzs -= (old_price - validated_data.get('price')) + payment_type.total_uzs -= (old_price - validated_data.get('price')) + else: + cash_transaction.expence_balance_usd -= (old_price - validated_data.get('price')) + cash_transaction.total_balance_usd -= (old_price - validated_data.get('price')) + payment_type.total_usd -= (old_price - validated_data.get('price')) + + elif old_price < validated_data.get('price'): + if instance.currency == 'uzs': + cash_transaction.expence_balance_uzs += (old_price - validated_data.get('price')) + cash_transaction.total_balance_uzs += (old_price - validated_data.get('price')) + payment_type.total_uzs += (old_price - validated_data.get('price')) + else: + cash_transaction.expence_balance_usd += (old_price - validated_data.get('price')) + cash_transaction.total_balance_usd += (old_price - validated_data.get('price')) + payment_type.total_usd += (old_price - validated_data.get('price')) + cash_transaction.save() + payment_type.save() + instance.save() + return instance \ No newline at end of file diff --git a/core/apps/finance/serializers/income.py b/core/apps/finance/serializers/income.py index 8ae71f6..3e801e4 100644 --- a/core/apps/finance/serializers/income.py +++ b/core/apps/finance/serializers/income.py @@ -134,4 +134,54 @@ class IncomeCreateSerializer(serializers.ModelSerializer): class IncomeDeleteSerializer(serializers.Serializer): - comment = serializers.CharField() \ No newline at end of file + comment = serializers.CharField() + + +class IncomeUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = Income + fields = [ + 'project_folder', 'project', 'price', 'type_income', 'counterparty', + 'date', 'comment', 'audit', 'file', + ] + extra_kwargs = { + 'price': {'required': False}, + } + + def update(self, instance, validated_data): + old_price = instance.price + instance.project_folder = validated_data.get('project_folder', instance.project_folder) + instance.project = validated_data.get('project', instance.project) + instance.price = validated_data.get('price', instance.price) + instance.type_income = validated_data.get('type_income', instance.type_income) + instance.counterparty = validated_data.get('counterparty', instance.counterparty) + instance.date = validated_data.get('date', instance.date) + instance.comment = validated_data.get('comment', instance.comment) + instance.audit = validated_data.get('audit', instance.audit) + instance.file = validated_data.get('file', instance.file) + if validated_data.get('price'): + cash_transaction = instance.cash_transaction + payment_type = instance.payment_type + if old_price > validated_data.get('price'): + if instance.currency == 'uzs': + cash_transaction.income_balance_uzs -= (old_price - validated_data.get('price')) + cash_transaction.total_balance_uzs -= (old_price - validated_data.get('price')) + payment_type.total_uzs -= (old_price - validated_data.get('price')) + else: + cash_transaction.income_balance_usd -= (old_price - validated_data.get('price')) + cash_transaction.total_balance_usd -= (old_price - validated_data.get('price')) + payment_type.total_usd -= (old_price - validated_data.get('price')) + + elif old_price < validated_data.get('price'): + if instance.currency == 'uzs': + cash_transaction.income_balance_uzs += (old_price - validated_data.get('price')) + cash_transaction.total_balance_uzs += (old_price - validated_data.get('price')) + payment_type.total_uzs += (old_price - validated_data.get('price')) + else: + cash_transaction.income_balance_usd += (old_price - validated_data.get('price')) + cash_transaction.total_balance_usd += (old_price - validated_data.get('price')) + payment_type.total_usd += (old_price - validated_data.get('price')) + cash_transaction.save() + payment_type.save() + instance.save() + return instance \ No newline at end of file diff --git a/core/apps/finance/urls.py b/core/apps/finance/urls.py index a6e1452..b9e026b 100644 --- a/core/apps/finance/urls.py +++ b/core/apps/finance/urls.py @@ -51,6 +51,7 @@ urlpatterns = [ path('create/', income_views.IncomeCreateApiView.as_view()), path('/list/', income_views.CounterpartyIncomeListApiView.as_view()), path('/delete/', income_views.IncomeDeleteApiView.as_view()), + path('/update/', income_views.IncomeUpdateApiView.as_view()), ] )), path('expence_type/', include( @@ -68,6 +69,7 @@ urlpatterns = [ path('/list/', expence_views.CounterpartyExpenceListApiView.as_view()), path('/change-status/', expence_views.ChangeExpenceStatusApiView.as_view()), path('/delete/', expence_views.ExpenceDeleteApiView.as_view()), + path('/update/', expence_views.ExpenceUpdateApiView.as_view()), ] )), path('income_contract/', include( diff --git a/core/apps/finance/views/expence.py b/core/apps/finance/views/expence.py index 8a92834..c196722 100644 --- a/core/apps/finance/views/expence.py +++ b/core/apps/finance/views/expence.py @@ -142,4 +142,28 @@ class ExpenceDeleteApiView(generics.GenericAPIView): 'success': True, 'message': 'Expence deleted', }, status=200 - ) \ No newline at end of file + ) + + +class ExpenceUpdateApiView(generics.GenericAPIView): + serializer_class = serializers.ExpenceUpdateSerializer + queryset = Expence.objects.all() + permission_classes = [HasRolePermission] + + def patch(self, request, id): + expence = get_object_or_404(Expence, id=id) + serializer = self.serializer_class(data=request.data, instance=expence) + if serializer.is_valid(raise_exception=True): + serializer.save() + return Response( + { + 'success': True, + 'message': 'Expence updated' + }, status=200 + ) + return Response( + { + 'success': False, + 'message': serializer.errors, + }, status=400 + ) \ No newline at end of file diff --git a/core/apps/finance/views/income.py b/core/apps/finance/views/income.py index 155566b..86b32f9 100644 --- a/core/apps/finance/views/income.py +++ b/core/apps/finance/views/income.py @@ -110,4 +110,28 @@ class IncomeDeleteApiView(generics.GenericAPIView): 'success': True, 'message': 'Income deleted', }, status=200 - ) \ No newline at end of file + ) + + +class IncomeUpdateApiView(generics.GenericAPIView): + serializer_class = serializers.IncomeUpdateSerializer + queryset = Income.objects.all() + permission_classes = [HasRolePermission] + + def patch(self, request, id): + income = get_object_or_404(Income, id=id) + serializer = self.serializer_class(data=request.data, instance=income) + if serializer.is_valid(raise_exception=True): + serializer.save() + return Response( + { + 'success': True, + 'message': 'Income updated' + }, status=200 + ) + return Response( + { + 'success': False, + 'message': serializer.errors, + }, status=400 + ) \ No newline at end of file