fix: statistics fix
This commit is contained in:
@@ -31,12 +31,10 @@ class CommonProfitFilters(BaseSchema):
|
|||||||
base_marketplace_key: str
|
base_marketplace_key: str
|
||||||
project_id: int
|
project_id: int
|
||||||
board_id: int
|
board_id: int
|
||||||
card_status_id: int
|
|
||||||
card_tag_id: int
|
card_tag_id: int
|
||||||
manager_id: int
|
manager_id: int
|
||||||
expense_tag_id: int
|
expense_tag_id: int
|
||||||
income_tag_id: int
|
income_tag_id: int
|
||||||
is_completed_only: bool
|
|
||||||
|
|
||||||
|
|
||||||
class GetProfitChartDataRequest(CommonProfitFilters):
|
class GetProfitChartDataRequest(CommonProfitFilters):
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from fastapi import HTTPException
|
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 enums.profit_table_group_by import ProfitTableGroupBy
|
||||||
from models import CardService, Card, CardStatusHistory, CardProductService, CardProduct, Service, Client, \
|
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, \
|
from schemas.statistics import GetProfitChartDataResponse, GetProfitChartDataRequest, ProfitChartDataItem, \
|
||||||
GetProfitTableDataResponse, GetProfitTableDataRequest, ProfitTableDataItem, CommonProfitFilters
|
GetProfitTableDataResponse, GetProfitTableDataRequest, ProfitTableDataItem, CommonProfitFilters
|
||||||
from services.base import BaseService
|
from services.base import BaseService
|
||||||
@@ -15,25 +13,6 @@ from services.statistics.transactions_statistics import TransactionsStatisticsSe
|
|||||||
|
|
||||||
|
|
||||||
class ProfitStatisticsService(BaseService):
|
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
|
@staticmethod
|
||||||
def _get_sub_status_history():
|
def _get_sub_status_history():
|
||||||
last_statuses = (
|
last_statuses = (
|
||||||
@@ -54,23 +33,24 @@ class ProfitStatisticsService(BaseService):
|
|||||||
Card.current_status_id,
|
Card.current_status_id,
|
||||||
)
|
)
|
||||||
.join(last_statuses, last_statuses.c.card_id == Card.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()
|
.subquery()
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
def _get_cards_dates(self):
|
||||||
def _get_filtered_sub_status_history(date_from: datetime.date, date_to: datetime.date):
|
|
||||||
sub_status_history = ProfitStatisticsService._get_sub_status_history()
|
sub_status_history = ProfitStatisticsService._get_sub_status_history()
|
||||||
return (
|
return (
|
||||||
select(sub_status_history)
|
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()
|
.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
|
@staticmethod
|
||||||
def _to_schema(rows, is_chart: bool = True) -> (
|
def _to_schema(rows, is_chart: bool = True) -> (
|
||||||
list[ProfitChartDataItem] | list[ProfitTableDataItem]
|
list[ProfitChartDataItem] | list[ProfitTableDataItem]
|
||||||
@@ -114,7 +94,6 @@ class ProfitStatisticsService(BaseService):
|
|||||||
.where(
|
.where(
|
||||||
Card.is_deleted == False,
|
Card.is_deleted == False,
|
||||||
Card.is_services_profit_accounted == True,
|
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)
|
.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_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)
|
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:
|
if request.card_tag_id != -1:
|
||||||
stmt_card_services = ProfitStatisticsService._apply_tag_filter(request.card_tag_id, stmt_card_services)
|
stmt_card_services = ProfitStatisticsService._apply_tag_filter(request.card_tag_id, stmt_card_services)
|
||||||
stmt_card_product_services = ProfitStatisticsService._apply_tag_filter(
|
stmt_card_product_services = ProfitStatisticsService._apply_tag_filter(
|
||||||
@@ -195,7 +169,6 @@ class ProfitStatisticsService(BaseService):
|
|||||||
and_(
|
and_(
|
||||||
Card.is_deleted == False,
|
Card.is_deleted == False,
|
||||||
Card.is_services_profit_accounted == True,
|
Card.is_services_profit_accounted == True,
|
||||||
Card.is_completed == True if self.is_completed_only else True,
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.group_by(Card.id)
|
.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):
|
async def _get_data_grouped_by_date(self, request: CommonProfitFilters, is_chart: bool = True):
|
||||||
self.date_from, self.date_to = request.date_range
|
self.date_from, self.date_to = request.date_range
|
||||||
self.is_completed_only = request.is_completed_only
|
|
||||||
self.filters = request
|
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_services = self._get_stmt_card_services(sub_cards_dates)
|
||||||
stmt_card_product_services = self._get_stmt_product_services()
|
stmt_card_product_services = self._get_stmt_product_services()
|
||||||
@@ -454,10 +426,9 @@ class ProfitStatisticsService(BaseService):
|
|||||||
|
|
||||||
def _get_common_table_grouped(self, request: GetProfitTableDataRequest):
|
def _get_common_table_grouped(self, request: GetProfitTableDataRequest):
|
||||||
self.date_from, self.date_to = request.date_range
|
self.date_from, self.date_to = request.date_range
|
||||||
self.is_completed_only = request.is_completed_only
|
|
||||||
self.filters = request
|
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_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)
|
return await self._table_data_from_stmt(stmt_grouped_by_boards)
|
||||||
|
|
||||||
async def _get_table_grouped_by_statuses(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
|
async def _get_table_grouped_by_statuses(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
|
||||||
date_from, date_to = request.date_range
|
self.date_from, self.date_to = request.date_range
|
||||||
self.is_completed_only = request.is_completed_only
|
|
||||||
|
|
||||||
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_services = self._get_stmt_card_services(sub_cards_dates)
|
||||||
stmt_card_product_services = self._get_stmt_product_services()
|
stmt_card_product_services = self._get_stmt_product_services()
|
||||||
|
|||||||
Reference in New Issue
Block a user