This commit is contained in:
2024-04-24 01:19:46 +03:00
parent be623a3555
commit 4e7626d2e6
12 changed files with 114 additions and 39 deletions

View File

@@ -1,3 +1,5 @@
import lexorank
import models.secondary
from typing import Union
import models.deal
@@ -19,6 +21,14 @@ class DealService(BaseService):
async def _get_deal_by_id(self, deal_id) -> Union[Deal, None]:
return await self.session.get(Deal, deal_id)
async def _get_rank(self):
query = await self.session.execute(select(Deal.rank).order_by(Deal.rank.desc()))
result = query.scalar_one_or_none()
if not result:
return str(lexorank.Bucket.BUCEKT_0.next())
rank = lexorank.parse(result)
return str(rank.next())
async def change_status(self, deal: Deal,
status: DealStatus,
user: User,
@@ -37,10 +47,12 @@ class DealService(BaseService):
return status_change
async def create(self, request: DealCreateRequest, user: User) -> DealCreateResponse:
rank = await self._get_rank()
deal = Deal(
name=request.name,
created_at=datetime.datetime.now(),
current_status=DealStatus.CREATED
current_status=DealStatus.CREATED,
rank=rank
)
self.session.add(deal)
await self.session.flush()
@@ -60,11 +72,13 @@ class DealService(BaseService):
request.client_name,
ClientDetailsSchema(address=request.client_address))
await client_service.update_details(user, client, ClientDetailsSchema(address=request.client_address))
rank = await self._get_rank()
deal = Deal(
name=request.name,
created_at=datetime.datetime.now(),
client_id=client.id,
current_status=DealStatus.CREATED
current_status=DealStatus.CREATED,
rank=rank
)
self.session.add(deal)
await self.session.flush()
@@ -91,15 +105,25 @@ class DealService(BaseService):
.group_by(models.secondary.DealService.deal_id)
.subquery()
)
q = (select(
Deal,
func.coalesce(service_subquery.c.total_price, 0)
q = (
select(
Deal,
func.coalesce(service_subquery.c.total_price, 0)
)
.order_by(
Deal.rank.desc()
)
.options(
selectinload(Deal.status_history),
joinedload(Deal.client)
)
.outerjoin(
service_subquery, Deal.id == service_subquery.c.deal_id)
.where(
Deal.is_deleted == False,
Deal.is_completed == False
)
)
.options(selectinload(Deal.status_history),
joinedload(Deal.client))
.outerjoin(service_subquery, Deal.id == service_subquery.c.deal_id)
.where(Deal.is_deleted == False,
Deal.is_completed == False))
deals_query = await self.session.execute(q)
summaries = []
for deal, total_price in deals_query.all():
@@ -112,7 +136,8 @@ class DealService(BaseService):
name=deal.name,
changed_at=last_status.changed_at,
status=last_status.to_status,
total_price=total_price
total_price=total_price,
rank=deal.rank
)
)
return DealSummaryResponse(summaries=summaries)
@@ -156,6 +181,7 @@ class DealService(BaseService):
if not deal:
raise HTTPException(status_code=404, detail="Сделка не найдена")
deal.name = request.data.name
deal.comment = request.data.comment
deal.is_deleted = request.data.is_deleted
deal.is_completed = request.data.is_completed
await self.session.commit()
@@ -164,6 +190,9 @@ class DealService(BaseService):
await self.session.rollback()
return DealUpdateGeneralInfoResponse(ok=False, message=str(e))
async def reorder(self, request: DealSummaryReorderRequest, user: User) -> DealSummaryReorderResponse:
pass
# endregion
# region Deal services