fix: statistics fix

This commit is contained in:
2025-03-19 18:52:16 +04:00
parent a466e46f28
commit ecb8d88b4f
2 changed files with 15 additions and 47 deletions

View File

@@ -31,12 +31,10 @@ class CommonProfitFilters(BaseSchema):
base_marketplace_key: str
project_id: int
board_id: int
card_status_id: int
card_tag_id: int
manager_id: int
expense_tag_id: int
income_tag_id: int
is_completed_only: bool
class GetProfitChartDataRequest(CommonProfitFilters):

View File

@@ -1,11 +1,9 @@
from datetime import datetime
from fastapi import HTTPException
from sqlalchemy import select, and_, union_all, func, Subquery, literal
from sqlalchemy import select, and_, union_all, func, Subquery, literal, or_
from enums.profit_table_group_by import ProfitTableGroupBy
from models import CardService, Card, CardStatusHistory, CardProductService, CardProduct, Service, Client, \
ShippingWarehouse, BaseMarketplace, User, Project, Board, CardTag, cards_card_tags, user_position
ShippingWarehouse, BaseMarketplace, User, Project, Board, CardTag, cards_card_tags, user_position, CardStatus
from schemas.statistics import GetProfitChartDataResponse, GetProfitChartDataRequest, ProfitChartDataItem, \
GetProfitTableDataResponse, GetProfitTableDataRequest, ProfitTableDataItem, CommonProfitFilters
from services.base import BaseService
@@ -15,25 +13,6 @@ from services.statistics.transactions_statistics import TransactionsStatisticsSe
class ProfitStatisticsService(BaseService):
@staticmethod
def _get_sub_cards_created_at(date_from: datetime.date, date_to: datetime.date):
cards_created_at = (
select(
Card.id.label('card_id'),
func.date_trunc(
'day',
Card.created_at,
).label('date'),
Card.current_status_id,
)
.subquery()
)
return (
select(cards_created_at)
.where(cards_created_at.c.date.between(date_from, date_to))
.subquery()
)
@staticmethod
def _get_sub_status_history():
last_statuses = (
@@ -54,23 +33,24 @@ class ProfitStatisticsService(BaseService):
Card.current_status_id,
)
.join(last_statuses, last_statuses.c.card_id == Card.id)
.join(CardStatus, CardStatus.id == Card.current_status_id)
.where(
or_(
CardStatus.is_finishing == True,
Card.is_completed == True,
)
)
.subquery()
)
@staticmethod
def _get_filtered_sub_status_history(date_from: datetime.date, date_to: datetime.date):
def _get_cards_dates(self):
sub_status_history = ProfitStatisticsService._get_sub_status_history()
return (
select(sub_status_history)
.where(sub_status_history.c.date.between(date_from, date_to))
.where(sub_status_history.c.date.between(self.date_from, self.date_to))
.subquery()
)
def _get_cards_dates(self, card_status_id: int):
if card_status_id == -1:
return ProfitStatisticsService._get_sub_cards_created_at(self.date_from, self.date_to)
return ProfitStatisticsService._get_filtered_sub_status_history(self.date_from, self.date_to)
@staticmethod
def _to_schema(rows, is_chart: bool = True) -> (
list[ProfitChartDataItem] | list[ProfitTableDataItem]
@@ -114,7 +94,6 @@ class ProfitStatisticsService(BaseService):
.where(
Card.is_deleted == False,
Card.is_services_profit_accounted == True,
Card.is_completed == True if self.is_completed_only else True,
)
.group_by(Card.id, sub_filtered_status_history.c.date)
)
@@ -157,11 +136,6 @@ class ProfitStatisticsService(BaseService):
stmt_card_services = stmt_card_services.where(Card.board_id == request.board_id)
stmt_card_product_services = stmt_card_product_services.where(Card.board_id == request.board_id)
if request.card_status_id != -1:
stmt_card_services = stmt_card_services.where(Card.current_status_id == request.card_status_id)
stmt_card_product_services = stmt_card_product_services.where(
Card.current_status_id == request.card_status_id)
if request.card_tag_id != -1:
stmt_card_services = ProfitStatisticsService._apply_tag_filter(request.card_tag_id, stmt_card_services)
stmt_card_product_services = ProfitStatisticsService._apply_tag_filter(
@@ -195,7 +169,6 @@ class ProfitStatisticsService(BaseService):
and_(
Card.is_deleted == False,
Card.is_services_profit_accounted == True,
Card.is_completed == True if self.is_completed_only else True,
)
)
.group_by(Card.id)
@@ -412,10 +385,9 @@ class ProfitStatisticsService(BaseService):
async def _get_data_grouped_by_date(self, request: CommonProfitFilters, is_chart: bool = True):
self.date_from, self.date_to = request.date_range
self.is_completed_only = request.is_completed_only
self.filters = request
sub_cards_dates = self._get_cards_dates(request.card_status_id)
sub_cards_dates = self._get_cards_dates()
stmt_card_services = self._get_stmt_card_services(sub_cards_dates)
stmt_card_product_services = self._get_stmt_product_services()
@@ -454,10 +426,9 @@ class ProfitStatisticsService(BaseService):
def _get_common_table_grouped(self, request: GetProfitTableDataRequest):
self.date_from, self.date_to = request.date_range
self.is_completed_only = request.is_completed_only
self.filters = request
sub_cards_dates = self._get_cards_dates(request.card_status_id)
sub_cards_dates = self._get_cards_dates()
stmt_card_services = self._get_stmt_card_services(sub_cards_dates)
@@ -506,10 +477,9 @@ class ProfitStatisticsService(BaseService):
return await self._table_data_from_stmt(stmt_grouped_by_boards)
async def _get_table_grouped_by_statuses(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
date_from, date_to = request.date_range
self.is_completed_only = request.is_completed_only
self.date_from, self.date_to = request.date_range
sub_cards_dates = self._get_filtered_sub_status_history(date_from, date_to)
sub_cards_dates = self._get_sub_status_history()
stmt_card_services = self._get_stmt_card_services(sub_cards_dates)
stmt_card_product_services = self._get_stmt_product_services()