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