feat: filtering and grouping by manager
This commit is contained in:
@@ -7,3 +7,4 @@ class ProfitTableGroupBy(IntEnum):
|
||||
BY_STATUSES = 2
|
||||
BY_WAREHOUSES = 3
|
||||
BY_MARKETPLACES = 4
|
||||
BY_MANAGERS = 5
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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='Указана некорректная группировка')
|
||||
|
||||
Reference in New Issue
Block a user