diff --git a/core/apps/finance/serializers/expence_contract.py b/core/apps/finance/serializers/expence_contract.py index 1866d26..809152a 100644 --- a/core/apps/finance/serializers/expence_contract.py +++ b/core/apps/finance/serializers/expence_contract.py @@ -27,7 +27,7 @@ class ExpenceContractSerializer(serializers.ModelSerializer): return { 'id': obj.user.id, 'full_name': obj.user.full_name - } + } if obj.user else None def get_counterparty(self, obj): return { diff --git a/core/apps/finance/serializers/income_contract.py b/core/apps/finance/serializers/income_contract.py index 43d398b..a57ad4e 100644 --- a/core/apps/finance/serializers/income_contract.py +++ b/core/apps/finance/serializers/income_contract.py @@ -10,6 +10,7 @@ class IncomeContractSerializer(serializers.ModelSerializer): project = serializers.SerializerMethodField(method_name='get_project') income_type = serializers.SerializerMethodField(method_name='get_income_type') counterparty = serializers.SerializerMethodField(method_name='get_counterparty') + user = serializers.SerializerMethodField(method_name='get_user') class Meta: model = IncomeContract @@ -23,7 +24,7 @@ class IncomeContractSerializer(serializers.ModelSerializer): return { 'id': obj.user.id, 'full_name': obj.user.full_name, - } + } if obj.user else None def get_counterparty(self, obj): return { diff --git a/core/apps/orders/urls.py b/core/apps/orders/urls.py index 58d5f29..8712735 100644 --- a/core/apps/orders/urls.py +++ b/core/apps/orders/urls.py @@ -38,6 +38,7 @@ urlpatterns = [ ), path('/is_made/', party_views.PartyChangeStatusToIsMadeApiView.as_view()), path('pay/', party_views.PartyPaymentApiView.as_view()), + path('statistics/', party_views.PartyStatisticsApiView.as_view()), ] )), ] \ No newline at end of file diff --git a/core/apps/orders/views/party.py b/core/apps/orders/views/party.py index d34c54c..e0900c7 100644 --- a/core/apps/orders/views/party.py +++ b/core/apps/orders/views/party.py @@ -1,4 +1,5 @@ from django.shortcuts import get_object_or_404 +from django.db.models import Sum, Q from rest_framework import generics, views from rest_framework.response import Response @@ -190,4 +191,35 @@ class PartyPaymentApiView(generics.GenericAPIView): 'error': ser.errors, }, status=400 - ) \ No newline at end of file + ) + + +class PartyStatisticsApiView(generics.GenericAPIView): + permission_classes = [HasRolePermission] + serializer_class = None + queryset = Party.objects.all() + filter_backends = [DjangoFilterBackend] + filterset_class = PartyFilter + pagination_class = None + + def get(self, request): + qeryset = self.filter_queryset(self.queryset) + usd = qeryset.filter(currency='usd').aggregate( + total_price_usd=Sum('party_amount__total_price'), + cost_amount_usd=Sum('party_amount__cost_amount'), + calculated_amount_usd=Sum('party_amount__calculated_amount'), + paid_amount_usd=Sum('party_amount__paid_amount'), + payment_amount_usd=Sum('party_amount__payment_amount'), + ) + uzs = qeryset.filter(currency='uzs').aggregate( + total_price_uzs=Sum('party_amount__total_price'), + cost_amount_uzs=Sum('party_amount__cost_amount'), + calculated_amount_uzs=Sum('party_amount__calculated_amount'), + paid_amount_uzs=Sum('party_amount__paid_amount'), + payment_amount_uzs=Sum('party_amount__payment_amount'), + ) + res = { + 'usd': usd, + 'uzs': uzs + } + return Response(res, status=200) \ No newline at end of file