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='Товар успешно обновлен')

14
services/marketplace.py Normal file
View 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
)

View File

@@ -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))

View File

@@ -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()