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="Группа сделок удалена")