feat: вфыв
This commit is contained in:
@@ -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='Товар успешно обновлен')
|
||||
|
||||
|
||||
14
services/marketplace.py
Normal file
14
services/marketplace.py
Normal file
@@ -0,0 +1,14 @@
|
||||
from sqlalchemy import select
|
||||
|
||||
from models import BaseMarketplace
|
||||
from schemas.marketplace import GetAllBaseMarketplacesResponse
|
||||
from services.base import BaseService
|
||||
|
||||
|
||||
class MarketplaceService(BaseService):
|
||||
async def get_all_base_marketplaces(self) -> GetAllBaseMarketplacesResponse:
|
||||
stmt = (select(BaseMarketplace).order_by(BaseMarketplace.key))
|
||||
base_marketplaces = (await self.session.scalars(stmt)).all()
|
||||
return GetAllBaseMarketplacesResponse(
|
||||
base_marketplaces=base_marketplaces
|
||||
)
|
||||
@@ -1,8 +1,8 @@
|
||||
from typing import Union
|
||||
|
||||
from sqlalchemy import select, insert
|
||||
from sqlalchemy import select, insert, delete
|
||||
|
||||
from models import Position
|
||||
from models import Position, user_position
|
||||
from schemas.position import *
|
||||
from services.base import BaseService
|
||||
|
||||
@@ -19,7 +19,6 @@ class PositionService(BaseService):
|
||||
stmt = select(Position).where(Position.key == key)
|
||||
return await self.session.scalar(stmt)
|
||||
|
||||
|
||||
async def create(self, request: CreatePositionRequest) -> CreatePositionResponse:
|
||||
try:
|
||||
if await self.get_by_key(request.data.key):
|
||||
@@ -30,3 +29,30 @@ class PositionService(BaseService):
|
||||
return CreatePositionResponse(ok=True, message='Должность успешно создана')
|
||||
except Exception as e:
|
||||
return CreatePositionResponse(ok=False, message=str(e))
|
||||
|
||||
async def delete(self, request: DeletePositionRequest) -> DeletePositionResponse:
|
||||
try:
|
||||
# Prevent deleting if existing on users
|
||||
stmt = (
|
||||
select(
|
||||
user_position
|
||||
)
|
||||
.where(
|
||||
user_position.c.position_key == request.position_key
|
||||
)
|
||||
)
|
||||
if await self.session.scalar(stmt):
|
||||
return DeletePositionResponse(ok=False, message='Должность привязана к существующим сотрудникам')
|
||||
delete_stmt = (
|
||||
delete(
|
||||
Position
|
||||
)
|
||||
.where(
|
||||
Position.key == request.position_key
|
||||
)
|
||||
)
|
||||
await self.session.execute(delete_stmt)
|
||||
await self.session.commit()
|
||||
return DeletePositionResponse(ok=True, message="Должность успешно удалена!")
|
||||
except Exception as e:
|
||||
return DeletePositionResponse(ok=False, message=str(e))
|
||||
|
||||
@@ -10,7 +10,7 @@ class UserService(BaseService):
|
||||
stmt = (
|
||||
select(User)
|
||||
.order_by(User.id.desc())
|
||||
# .where(User.is_deleted == False)
|
||||
.where(User.is_deleted == False)
|
||||
)
|
||||
users = (await self.session.scalars(stmt)).all()
|
||||
users_schemas = [UserSchema.model_validate(user) for user in users]
|
||||
@@ -25,6 +25,7 @@ class UserService(BaseService):
|
||||
return UpdateUserResponse(ok=False, message='Указанный пользователь не найден')
|
||||
base_fields = request.data.model_dump_parent()
|
||||
stmt = update(User).values(**base_fields).where(User.id == request.data.id)
|
||||
print(stmt)
|
||||
await self.session.execute(stmt)
|
||||
await self.session.flush()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user