feat: filtering and grouping by manager

This commit is contained in:
2024-11-21 18:10:37 +04:00
parent 8733e6d94b
commit e36fad70c5
3 changed files with 40 additions and 5 deletions

View File

@@ -7,3 +7,4 @@ class ProfitTableGroupBy(IntEnum):
BY_STATUSES = 2
BY_WAREHOUSES = 3
BY_MARKETPLACES = 4
BY_MANAGERS = 5

View File

@@ -28,6 +28,8 @@ class CommonProfitFilters(BaseSchema):
client_id: int
base_marketplace_key: str
deal_status_id: int
manager_id: int
class GetProfitChartDataRequest(CommonProfitFilters):
pass

View File

@@ -6,7 +6,7 @@ from sqlalchemy import select, and_, union_all, func, Subquery
from enums.profit_table_group_by import ProfitTableGroupBy
from models import DealService, Deal, DealStatusHistory, DealProductService, DealProduct, Service, Client, \
ShippingWarehouse, BaseMarketplace
ShippingWarehouse, BaseMarketplace, User
from schemas.statistics import GetProfitChartDataResponse, GetProfitChartDataRequest, ProfitChartDataItem, \
GetProfitTableDataResponse, GetProfitTableDataRequest, ProfitTableDataItem, CommonProfitFilters
from services.base import BaseService
@@ -126,6 +126,10 @@ class StatisticsService(BaseService):
stmt_deal_services = stmt_deal_services.where(Deal.current_status == request.deal_status_id)
stmt_deal_product_services = stmt_deal_product_services.where(Deal.current_status == request.deal_status_id)
if request.manager_id != -1:
stmt_deal_services = stmt_deal_services.where(Deal.manager_id == request.manager_id)
stmt_deal_product_services = stmt_deal_product_services.where(Deal.manager_id == request.manager_id)
return stmt_deal_services, stmt_deal_product_services
@staticmethod
@@ -248,6 +252,26 @@ class StatisticsService(BaseService):
.group_by(BaseMarketplace.name)
)
@staticmethod
def _join_and_group_by_managers(stmt):
managers = (
select(User)
.where(User.role_key == "employee")
.subquery()
)
return (
select(
managers.c.id,
(managers.c.first_name + " " + managers.c.second_name).label("grouped_value"),
func.count(stmt.c.deal_id).label("deals_count"),
func.sum(stmt.c.revenue).label("revenue"),
func.sum(stmt.c.profit).label("profit"),
)
.join(Deal, Deal.id == stmt.c.deal_id)
.join(managers, managers.c.id == Deal.manager_id)
.group_by(managers.c.id, "grouped_value")
)
async def _get_data_rows_grouped_by_date(
self,
stmt_deal_services,
@@ -376,15 +400,21 @@ class StatisticsService(BaseService):
async def _get_table_grouped_by_warehouses(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
sub_grouped_by_deals = self._get_common_table_grouped(request)
stmt_grouped_by_clients = self._join_and_group_by_warehouses(sub_grouped_by_deals)
stmt_grouped_by_warehouses = self._join_and_group_by_warehouses(sub_grouped_by_deals)
return await self._table_data_from_stmt(stmt_grouped_by_clients)
return await self._table_data_from_stmt(stmt_grouped_by_warehouses)
async def _get_table_grouped_by_marketplace(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
sub_grouped_by_deals = self._get_common_table_grouped(request)
stmt_grouped_by_clients = self._join_and_group_by_marketplaces(sub_grouped_by_deals)
stmt_grouped_by_marketplaces = self._join_and_group_by_marketplaces(sub_grouped_by_deals)
return await self._table_data_from_stmt(stmt_grouped_by_clients)
return await self._table_data_from_stmt(stmt_grouped_by_marketplaces)
async def _get_table_grouped_by_managers(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
sub_grouped_by_deals = self._get_common_table_grouped(request)
stmt_grouped_by_managers = self._join_and_group_by_managers(sub_grouped_by_deals)
return await self._table_data_from_stmt(stmt_grouped_by_managers)
async def get_profit_table_data(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
match request.group_table_by:
@@ -398,5 +428,7 @@ class StatisticsService(BaseService):
return await self._get_table_grouped_by_warehouses(request)
case ProfitTableGroupBy.BY_MARKETPLACES:
return await self._get_table_grouped_by_marketplace(request)
case ProfitTableGroupBy.BY_MANAGERS:
return await self._get_table_grouped_by_managers(request)
raise HTTPException(status_code=400, detail='Указана некорректная группировка')