fix: statistics fix
This commit is contained in:
		@@ -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):
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user