counterparty: counterparty akt api added
This commit is contained in:
@@ -18,6 +18,7 @@ urlpatterns = [
|
||||
path("<uuid:id>/", cp_views.CounterpartyDetailApiView.as_view()),
|
||||
path('<uuid:id>/un_archive/', cp_views.UnArchiveCounterpartyApiView.as_view()),
|
||||
path("<uuid:id>/statistics/", cp_views.CounterPartyIncomeExpenceStatisticsApiView.as_view()),
|
||||
path('<uuid:id>/akt_statistics/', cp_views.CounterpartyAKTApiView.as_view()),
|
||||
]
|
||||
)),
|
||||
path('counterparty_folder/', include(
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user