zalupka
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user