feat: filtering and grouping by manager
This commit is contained in:
@@ -7,3 +7,4 @@ class ProfitTableGroupBy(IntEnum):
|
|||||||
BY_STATUSES = 2
|
BY_STATUSES = 2
|
||||||
BY_WAREHOUSES = 3
|
BY_WAREHOUSES = 3
|
||||||
BY_MARKETPLACES = 4
|
BY_MARKETPLACES = 4
|
||||||
|
BY_MANAGERS = 5
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ class CommonProfitFilters(BaseSchema):
|
|||||||
client_id: int
|
client_id: int
|
||||||
base_marketplace_key: str
|
base_marketplace_key: str
|
||||||
deal_status_id: int
|
deal_status_id: int
|
||||||
|
manager_id: int
|
||||||
|
|
||||||
|
|
||||||
class GetProfitChartDataRequest(CommonProfitFilters):
|
class GetProfitChartDataRequest(CommonProfitFilters):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from sqlalchemy import select, and_, union_all, func, Subquery
|
|||||||
|
|
||||||
from enums.profit_table_group_by import ProfitTableGroupBy
|
from enums.profit_table_group_by import ProfitTableGroupBy
|
||||||
from models import DealService, Deal, DealStatusHistory, DealProductService, DealProduct, Service, Client, \
|
from models import DealService, Deal, DealStatusHistory, DealProductService, DealProduct, Service, Client, \
|
||||||
ShippingWarehouse, BaseMarketplace
|
ShippingWarehouse, BaseMarketplace, User
|
||||||
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
|
||||||
@@ -126,6 +126,10 @@ class StatisticsService(BaseService):
|
|||||||
stmt_deal_services = stmt_deal_services.where(Deal.current_status == request.deal_status_id)
|
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)
|
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
|
return stmt_deal_services, stmt_deal_product_services
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -248,6 +252,26 @@ class StatisticsService(BaseService):
|
|||||||
.group_by(BaseMarketplace.name)
|
.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(
|
async def _get_data_rows_grouped_by_date(
|
||||||
self,
|
self,
|
||||||
stmt_deal_services,
|
stmt_deal_services,
|
||||||
@@ -376,15 +400,21 @@ class StatisticsService(BaseService):
|
|||||||
|
|
||||||
async def _get_table_grouped_by_warehouses(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
|
async def _get_table_grouped_by_warehouses(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
|
||||||
sub_grouped_by_deals = self._get_common_table_grouped(request)
|
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:
|
async def _get_table_grouped_by_marketplace(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
|
||||||
sub_grouped_by_deals = self._get_common_table_grouped(request)
|
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:
|
async def get_profit_table_data(self, request: GetProfitTableDataRequest) -> GetProfitTableDataResponse:
|
||||||
match request.group_table_by:
|
match request.group_table_by:
|
||||||
@@ -398,5 +428,7 @@ class StatisticsService(BaseService):
|
|||||||
return await self._get_table_grouped_by_warehouses(request)
|
return await self._get_table_grouped_by_warehouses(request)
|
||||||
case ProfitTableGroupBy.BY_MARKETPLACES:
|
case ProfitTableGroupBy.BY_MARKETPLACES:
|
||||||
return await self._get_table_grouped_by_marketplace(request)
|
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='Указана некорректная группировка')
|
raise HTTPException(status_code=400, detail='Указана некорректная группировка')
|
||||||
|
|||||||
Reference in New Issue
Block a user