othr
This commit is contained in:
@@ -1,18 +1,35 @@
|
||||
import datetime
|
||||
from typing import Type, Union
|
||||
|
||||
from sqlalchemy import select
|
||||
|
||||
from models import User
|
||||
from models import User, Deal
|
||||
from models.deal import *
|
||||
from schemas.deal import *
|
||||
from services.base import BaseService
|
||||
from services.client import ClientService
|
||||
|
||||
|
||||
class DealService(BaseService):
|
||||
|
||||
async def _get_deal_by_id(self, deal_id) -> Deal:
|
||||
async def _get_deal_by_id(self, deal_id) -> Union[Deal, None]:
|
||||
return await self.session.get(Deal, deal_id)
|
||||
|
||||
async def change_status(self, deal: Deal, status: DealStatus, user: User,
|
||||
deadline: datetime.datetime = None) -> DealStatusHistory:
|
||||
deadline = deadline
|
||||
status_change = DealStatusHistory(
|
||||
deal_id=deal.id,
|
||||
user_id=user.id,
|
||||
changed_at=datetime.datetime.now(),
|
||||
from_status=deal.current_status,
|
||||
to_status=status,
|
||||
next_status_deadline=deadline
|
||||
)
|
||||
self.session.add(status_change)
|
||||
await self.session.flush()
|
||||
return status_change
|
||||
|
||||
async def create(self, request: DealCreateRequest, user: User) -> DealCreateResponse:
|
||||
deal = Deal(
|
||||
name=request.name,
|
||||
@@ -23,32 +40,33 @@ class DealService(BaseService):
|
||||
await self.session.flush()
|
||||
|
||||
# Append status history
|
||||
status_change = DealStatusHistory(
|
||||
deal_id=request.deal_id,
|
||||
user_id=user.id,
|
||||
changed_at=datetime.datetime.now(),
|
||||
from_status=deal.current_status,
|
||||
to_status=DealStatus.CREATED.AWAITING_ACCEPTANCE
|
||||
)
|
||||
self.session.add(status_change)
|
||||
await self.change_status(deal, DealStatus.AWAITING_ACCEPTANCE, user)
|
||||
|
||||
await self.session.commit()
|
||||
return DealCreateResponse(ok=True)
|
||||
|
||||
async def change_status(self, request: DealChangeStatusRequest, user: User) -> DealChangeStatusResponse:
|
||||
async def quick_create(self, request: DealQuickCreateRequest, user: User) -> DealQuickCreateResponse:
|
||||
client_service = ClientService(self.session)
|
||||
client = await client_service.get_by_name(request.client_name)
|
||||
if not client:
|
||||
client = await client_service.create_client_raw(request.client_name, request.client_address)
|
||||
deal = Deal(
|
||||
name=request.name,
|
||||
created_at=datetime.datetime.now(),
|
||||
client_id=client.id,
|
||||
current_status=DealStatus.CREATED
|
||||
)
|
||||
self.session.add(deal)
|
||||
await self.session.flush()
|
||||
await self.change_status(deal, DealStatus.AWAITING_ACCEPTANCE, user, deadline=request.acceptance_date)
|
||||
await self.session.commit()
|
||||
return DealQuickCreateResponse(deal_id=deal.id)
|
||||
|
||||
async def change_status_manual(self, request: DealChangeStatusRequest, user: User) -> DealChangeStatusResponse:
|
||||
# Changing current status
|
||||
deal = await self._get_deal_by_id(request.deal_id)
|
||||
from_status = deal.current_status
|
||||
deal.current_status = request.new_status
|
||||
|
||||
# Append status history
|
||||
status_change = DealStatusHistory(
|
||||
deal_id=request.deal_id,
|
||||
user_id=user.id,
|
||||
changed_at=datetime.datetime.now(),
|
||||
from_status=from_status,
|
||||
to_status=request.new_status
|
||||
)
|
||||
self.session.add(status_change)
|
||||
if not deal:
|
||||
return DealChangeStatusResponse(ok=False)
|
||||
await self.change_status(deal, DealStatus(request.new_status), user)
|
||||
await self.session.commit()
|
||||
return DealChangeStatusResponse(ok=True)
|
||||
|
||||
Reference in New Issue
Block a user