This commit is contained in:
behruz-dev
2025-11-05 18:33:02 +05:00
parent 512bdff708
commit 8ae2cce79e
2 changed files with 84 additions and 0 deletions

View File

@@ -18,6 +18,7 @@ urlpatterns = [
path("<uuid:id>/", cp_views.CounterpartyDetailApiView.as_view()), path("<uuid:id>/", cp_views.CounterpartyDetailApiView.as_view()),
path('<uuid:id>/un_archive/', cp_views.UnArchiveCounterpartyApiView.as_view()), path('<uuid:id>/un_archive/', cp_views.UnArchiveCounterpartyApiView.as_view()),
path('all/', cp_views.AllCounterpartyListApiView.as_view()), path('all/', cp_views.AllCounterpartyListApiView.as_view()),
path("<uuid:id>/statistics/", cp_views.CounterpartyStatisticsApiView.as_view()),
] ]
)), )),
path('counterparty_folder/', include( path('counterparty_folder/', include(

View File

@@ -10,6 +10,7 @@ from core.apps.shared.paginations.custom import CustomPageNumberPagination
from core.apps.counterparty.models import Counterparty, CounterpartyFolder from core.apps.counterparty.models import Counterparty, CounterpartyFolder
from core.apps.counterparty.serializers import counterparty as serializers from core.apps.counterparty.serializers import counterparty as serializers
from core.apps.counterparty.filters.counterparty import CounterpartyFilter from core.apps.counterparty.filters.counterparty import CounterpartyFilter
from core.apps.finance.models import Expence, Income
class CounterpartyListApiView(generics.ListAPIView): class CounterpartyListApiView(generics.ListAPIView):
@@ -176,3 +177,85 @@ class AllCounterpartyListApiView(generics.GenericAPIView):
if page is not None: if page is not None:
serializer = self.serializer_class(page, many=True) serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data) return self.get_paginated_response(serializer.data)
class CounterPartyIncomeExpenceStatisticsApiView(views.APIView):
permission_classes = [HasRolePermission]
def get(self, request, id):
counterparty = get_object_or_404(Counterparty, id=id)
incomes = Income.objects.filter(
counterparty=counterparty,
is_deleted=False
)
expences = Expence.objects.filter(
counterparty=counterparty,
is_deleted=False,
)
income_by_currency = {}
expence_by_currency = {}
for income in incomes:
currency = income.currency
amount = income.price
if currency not in income_by_currency:
income_by_currency[currency] = {
'total': 0,
'count': 0,
'amount_uzs': 0
}
income_by_currency[currency]['total'] += amount
income_by_currency[currency]['count'] += 1
if currency == 'usd':
income_by_currency[currency]['amount_uzs'] += amount * income.exchange_rate
else:
income_by_currency[currency]['amount_uzs'] += amount
for expence in expences:
currency = expence.currency
amount = expence.price
if currency not in expence_by_currency:
expence_by_currency[currency] = {
'total': 0,
'count': 0,
'amount_uzs': 0
}
expence_by_currency[currency]['total'] += amount
expence_by_currency[currency]['count'] += 1
if currency == 'usd':
expence_by_currency[currency]['amount_uzs'] += amount * expence.exchange_rate
else:
expence_by_currency[currency]['amount_uzs'] += amount
total_income_uzs = sum(data['amount_uzs'] for data in income_by_currency.values())
total_expence_uzs = sum(data['amount_uzs'] for data in expence_by_currency.values())
balance = total_income_uzs - total_expence_uzs
data = {
'counterparty': {
'id': counterparty.id,
'name': counterparty.name,
},
'income': {
'by_currency': income_by_currency,
'total_uzs': total_income_uzs,
'total_count': sum(data['count'] for data in income_by_currency.values())
},
'expence': {
'by_currency': expence_by_currency,
'total_uzs': total_expence_uzs,
'total_count': sum(data['count'] for data in expence_by_currency.values())
},
'balance': {
'uzs': balance,
'status': 'positive' if balance > 0 else 'negative' if balance < 0 else 'zero'
}
}
return Response(data, status=status.HTTP_200_OK)