diff --git a/schemas/statistics.py b/schemas/statistics.py index bf64cec..6879234 100644 --- a/schemas/statistics.py +++ b/schemas/statistics.py @@ -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): diff --git a/services/statistics/profit_statistics.py b/services/statistics/profit_statistics.py index 48a7a5e..00fa38a 100644 --- a/services/statistics/profit_statistics.py +++ b/services/statistics/profit_statistics.py @@ -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()