feat: вфыв

This commit is contained in:
2024-07-21 10:56:59 +03:00
parent 6b09251141
commit 7c10d8777e
26 changed files with 497 additions and 43 deletions

View File

@@ -4,7 +4,7 @@ import models.secondary
from typing import Union
import models.deal
from fastapi import HTTPException
from sqlalchemy import select, func, update
from sqlalchemy import select, func, update, delete, insert
from sqlalchemy.orm import joinedload, selectinload
from models import User, Service, Client
@@ -103,7 +103,8 @@ class DealService(BaseService):
client_id=client.id,
current_status=DealStatus.CREATED,
lexorank=rank,
shipping_warehouse_id=shipping_warehouse.id
shipping_warehouse_id=shipping_warehouse.id,
base_marketplace_key=request.base_marketplace.key
)
self.session.add(deal)
await self.session.flush()
@@ -183,6 +184,9 @@ class DealService(BaseService):
deal: Deal
last_status: DealStatusHistory = max(deal.status_history, key=lambda status: status.changed_at)
deadline = last_status.next_status_deadline
base_marketplace = None
if deal.base_marketplace:
base_marketplace = BaseMarketplaceSchema.model_validate(deal.base_marketplace)
summaries.append(
DealSummary(
id=deal.id,
@@ -192,7 +196,8 @@ class DealService(BaseService):
deadline=deadline,
status=last_status.to_status,
total_price=total_price,
rank=rank
rank=rank,
base_marketplace=base_marketplace
)
)
return DealSummaryResponse(summaries=summaries)
@@ -214,8 +219,10 @@ class DealService(BaseService):
joinedload(Deal.client)
.joinedload(Client.details),
selectinload(Deal.services)
.joinedload(models.secondary.DealService.service)
.joinedload(Service.category),
.options(
joinedload(models.secondary.DealService.service).joinedload(Service.category),
selectinload(models.secondary.DealService.employees)
),
selectinload(Deal.products)
.joinedload(models.secondary.DealProduct.product)
.joinedload(models.Product.client),
@@ -224,7 +231,10 @@ class DealService(BaseService):
.joinedload(models.Product.barcodes),
selectinload(Deal.products)
.joinedload(models.secondary.DealProduct.services)
.joinedload(models.secondary.DealProductService.service),
.options(
joinedload(models.secondary.DealProductService.service),
selectinload(models.secondary.DealProductService.employees)
),
selectinload(Deal.status_history)
.joinedload(DealStatusHistory.user),
selectinload(Deal.status_history)
@@ -439,13 +449,43 @@ class DealService(BaseService):
raise HTTPException(status_code=404, detail="Сделка не найдена")
service_dict = request.service.dict()
del service_dict['service']
del service_dict['employees']
service_dict['service_id'] = request.service.service.id
await self.session.execute(
update(models.secondary.DealService)
.where(models.secondary.DealService.deal_id == request.deal_id,
models.secondary.DealService.service_id == request.service.service.id)
.values(**service_dict)
)
# Updating deleting previous employees
delete_stmt = (
delete(
models.deal_service_employees
)
.where(
models.deal_service_employees.c.deal_id == request.deal_id,
models.deal_service_employees.c.service_id == request.service.service.id,
)
)
await self.session.execute(delete_stmt)
await self.session.flush()
insert_data = []
for employee in request.service.employees:
insert_data.append({
'deal_id': request.deal_id,
'service_id': request.service.service.id,
'user_id': employee.id
})
if insert_data:
await self.session.execute(
insert(models.deal_service_employees),
insert_data
)
await self.session.flush()
await self.session.commit()
return DealUpdateServiceQuantityResponse(ok=True, message='Услуга успешно обновлена')
except Exception as e:
@@ -586,6 +626,35 @@ class DealService(BaseService):
# Updating product
deal_product.quantity = request.product.quantity
# Updating deleting old employees
delete_stmt = (
delete(
models.deal_product_service_employees
)
.where(
models.deal_product_service_employees.c.deal_id == request.deal_id,
models.deal_product_service_employees.c.service_id.in_(request_services.union(database_services)),
models.deal_product_service_employees.c.product_id == request.product.product.id
)
)
await self.session.execute(delete_stmt)
await self.session.flush()
insert_data = []
for service in request.product.services:
service: DealProductServiceSchema
for employee in service.employees:
insert_data.append({
'deal_id': request.deal_id,
'service_id': service.service.id,
'product_id': request.product.product.id,
'user_id': employee.id
})
if insert_data:
await self.session.execute(insert(models.deal_product_service_employees),
insert_data)
await self.session.flush()
await self.session.commit()
return DealUpdateProductResponse(ok=True, message='Товар успешно обновлен')