Files
Crm-Backend/services/deal_group.py

52 lines
2.3 KiB
Python

import lexorank
from models import DealGroup, Deal
from repositories import DealGroupRepository, DealRepository, DealTagRepository
from schemas.deal_group import *
from services.mixins import *
class DealGroupService(
ServiceUpdateMixin[DealGroup, UpdateDealGroupRequest],
ServiceDeleteMixin[DealGroup],
):
entity_updated_msg = "Группа сделок обновлена"
def __init__(self, session: AsyncSession):
self.repository = DealGroupRepository(session)
async def sync_deals_with_main_deal(self, main_deal: Deal, other_deals: list[Deal]):
deal_repo = DealRepository(self.repository.session)
for deal in other_deals:
if deal.status_id != main_deal.status_id:
await deal_repo.update_status(deal, main_deal.status_id)
await DealTagRepository(self.repository.session).sync_deals_tags(
[main_deal, *other_deals]
)
async def create(self, request: CreateDealGroupRequest) -> CreateDealGroupResponse:
deal_repo = DealRepository(self.repository.session)
main_deal: Deal = await deal_repo.get_by_id(request.main_deal_id)
other_deals: list[Deal] = await deal_repo.get_by_ids(request.other_deal_ids)
await self.sync_deals_with_main_deal(main_deal, other_deals)
group_lexorank = main_deal.lexorank
main_deal.lexorank = lexorank.middle(lexorank.Bucket.BUCEKT_0).__str__()
group = await self.repository.create([main_deal, *other_deals], group_lexorank)
return CreateDealGroupResponse(entity=DealGroupSchema.model_validate(group))
async def update_deals_in_group(
self, group_id: int, request: UpdateDealsInGroupRequest
) -> UpdateDealsInGroupResponse:
deal_repo = DealRepository(self.repository.session)
old_deals = await deal_repo.get_by_group_id(group_id)
new_deals = await deal_repo.get_by_ids(request.deal_ids)
await self.sync_deals_with_main_deal(old_deals[0], new_deals)
await self.repository.update_group_deals(group_id, old_deals, new_deals)
return UpdateDealsInGroupResponse(ok=True, message=self.entity_updated_msg)
async def delete(self, group_id: int) -> DeleteDealGroupResponse:
await self.repository.delete(group_id)
return DeleteDealGroupResponse(ok=True, message="Группа сделок удалена")