counterparty: counterparty akt api added

This commit is contained in:
behruz-dev
2025-11-13 16:28:00 +05:00
parent acd4bfd30d
commit d7b9264546
8 changed files with 133 additions and 42 deletions

View File

@@ -18,6 +18,11 @@ from core.apps.counterparty.serializers import counterparty as serializers
from core.apps.counterparty.filters.counterparty import CounterpartyFilter
# finance
from core.apps.finance.models import Expence, Income
from core.apps.finance.serializers.income import IncomeListSerializer
from core.apps.finance.serializers.expence import ExpenceListSerializer
# orders
from core.apps.orders.models import Party
from core.apps.orders.serializers.party import PartyDetailSerializer
class CounterpartyListApiView(generics.ListAPIView):
@@ -264,4 +269,79 @@ class CounterPartyIncomeExpenceStatisticsApiView(views.APIView):
}
}
return Response(data, status=200)
return Response(data, status=200)
class CounterpartyAKTApiView(views.APIView):
permission_classes = [HasRolePermission]
def get(self, request, id):
# TODO: filterlar
date = request.query_params.get('date', None)
end_date = request.query_params.get('end_date', None)
project_folder = request.query_params.getlist('folder', None)
project = request.query_params.getlist('project', None)
currency = request.query_params.get('currency', 'uzs')
counterparty = get_object_or_404(Counterparty, id=id)
parties = Party.objects.filter(
orders__counterparty=counterparty, is_deleted=False, process=100, payment_percentage=100
).distinct().order_by('-created_at')
expences = Expence.objects.filter(counterparty=counterparty, is_deleted=False).distinct().order_by('-created_at')
incomes = Income.objects.filter(counterparty=counterparty, is_deleted=False).distinct().order_by('-created_at')
# TODO: date va end date boyicha filter
if date:
parties = parties.filter(close_date__gte=date)
expences = expences.filter(created_at__gte=date)
incomes = incomes.filter(created_at__gte=date)
if end_date:
parties = parties.filter(close_date__lte=end_date)
expences = expences.filter(created_at__lte=end_date)
incomes = incomes.filter(created_at__lte=end_date)
# TODO: project folder va project boyicha filter
if project_folder:
parties = parties.filter(orders__project_folder=project_folder).distinct()
expences = expences.filter(project_folder=project_folder)
incomes = incomes.filter(project_folder=project_folder)
if project:
parties = parties.filter(orders__project=project).distinct()
expences = expences.filter(project=project)
incomes = incomes.filter(project=project)
# TODO: currency boyicha filter
if currency:
parties = parties.filter(currency=currency)
expences = expences.filter(currency=currency)
incomes = incomes.filter(currency=currency)
# TODO: total kreditni hisoblash kerak: Sum(party total_price) + Sum(income total_price)
parties_total_price = parties.aggregate(total_price=Sum('party_amount__total_price'))['total_price'] or 0
income_total_price = incomes.aggregate(total_price=Sum('price'))['total_price'] or 0
total_kredit = Decimal(parties_total_price) + Decimal(income_total_price)
# TODO: total debitni hisoblash kerak: Sum(expence total_price)
expence_total_balance = expences.aggregate(total_price=Sum('price'))['total_price'] or 0
total_debit = expence_total_balance
# TODO: final balanceni hisoblash kerak: total_kredit - total_debit = final balance => negative or positive
final_balance = total_kredit - total_debit
# TODO: final balance typeni topish kerak -> debit or kredit: if negative == debit, positive == kredit
type = 'debit' if final_balance < 0 else 'kredit'
response = {
"parties": PartyDetailSerializer(parties, many=True).data,
"expences": ExpenceListSerializer(expences, many=True).data,
"incomes": IncomeListSerializer(incomes, many=True).data,
"total_kredit": str(total_kredit),
"total_debit": str(total_debit),
"final_balance": {
"balance": str(final_balance) if not str(final_balance).startswith('-') else str(final_balance).replace('-', ''),
"type": type,
}
}
return Response(response, status=200)