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