110 lines
4.3 KiB
Python
110 lines
4.3 KiB
Python
from idlelib.rpc import response_queue
|
||
from typing import Union
|
||
|
||
from sqlalchemy import select, update, delete
|
||
|
||
import models
|
||
from models import ShippingWarehouse
|
||
from schemas.shipping_warehouse import GetAllShippingWarehousesResponse, ShippingWarehouseSchema, \
|
||
CreateShippingWarehouseResponse, CreateShippingWarehouseRequest, UpdateShippingWarehouseRequest, \
|
||
UpdateShippingWarehouseResponse, DeleteShippingWarehouseRequest, DeleteShippingWarehouseResponse
|
||
from services.base import BaseService
|
||
|
||
|
||
class ShippingWarehouseService(BaseService):
|
||
async def get_all(self) -> GetAllShippingWarehousesResponse:
|
||
stmt = (
|
||
select(
|
||
models.ShippingWarehouse
|
||
)
|
||
.where(
|
||
models.ShippingWarehouse.is_deleted == False
|
||
)
|
||
.order_by(
|
||
models.ShippingWarehouse.id
|
||
)
|
||
)
|
||
shipping_warehouses = (await self.session.scalars(stmt)).all()
|
||
result = []
|
||
for shipping_warehouse in shipping_warehouses:
|
||
result.append(ShippingWarehouseSchema.model_validate(shipping_warehouse))
|
||
return GetAllShippingWarehousesResponse(shipping_warehouses=result)
|
||
|
||
async def get_by_name(self, name: str) -> Union[models.ShippingWarehouse, None]:
|
||
stmt = (
|
||
select(
|
||
models.ShippingWarehouse
|
||
)
|
||
.where(
|
||
models.ShippingWarehouse.name == name,
|
||
models.ShippingWarehouse.is_deleted == False
|
||
)
|
||
)
|
||
shipping_warehouse = await self.session.scalar(stmt)
|
||
return shipping_warehouse
|
||
|
||
async def create_by_name(self, name: str) -> models.ShippingWarehouse:
|
||
shipping_warehouse = models.ShippingWarehouse(
|
||
name=name
|
||
)
|
||
self.session.add(shipping_warehouse)
|
||
await self.session.flush()
|
||
return shipping_warehouse
|
||
|
||
async def create(self, request: CreateShippingWarehouseRequest) -> CreateShippingWarehouseResponse:
|
||
try:
|
||
if await self.get_by_name(request.shipping_warehouse.name):
|
||
return CreateShippingWarehouseResponse(ok=False,
|
||
message="Склад отгрузки с таким названием уже существует")
|
||
await self.create_by_name(request.shipping_warehouse.name)
|
||
await self.session.commit()
|
||
return CreateShippingWarehouseResponse(
|
||
ok=True,
|
||
message="Склад отгрузки успешно создан"
|
||
)
|
||
except Exception as e:
|
||
return CreateShippingWarehouseResponse(ok=False,
|
||
message=str(e))
|
||
|
||
async def update(self, request: UpdateShippingWarehouseRequest) -> UpdateShippingWarehouseResponse:
|
||
try:
|
||
stmt = (
|
||
update(
|
||
ShippingWarehouse
|
||
)
|
||
.values(
|
||
request.shipping_warehouse.model_dump(
|
||
by_alias=False
|
||
)
|
||
)
|
||
.where(
|
||
ShippingWarehouse.id == request.shipping_warehouse.id
|
||
)
|
||
)
|
||
await self.session.execute(
|
||
stmt
|
||
)
|
||
await self.session.commit()
|
||
return UpdateShippingWarehouseResponse(ok=True, message='Склад отгрузки успешно обновлен')
|
||
except Exception as e:
|
||
return UpdateShippingWarehouseResponse(ok=False, message=str(e))
|
||
|
||
async def delete(self, request: DeleteShippingWarehouseRequest) -> DeleteShippingWarehouseResponse:
|
||
try:
|
||
stmt = (
|
||
update(
|
||
ShippingWarehouse
|
||
)
|
||
.values({
|
||
'is_deleted': True
|
||
})
|
||
.where(
|
||
ShippingWarehouse.id == request.shipping_warehouse_id
|
||
)
|
||
)
|
||
await self.session.execute(stmt)
|
||
await self.session.commit()
|
||
return DeleteShippingWarehouseResponse(ok=True, message='Склад отгрузки успешно удален')
|
||
except Exception as e:
|
||
return DeleteShippingWarehouseResponse(ok=False, message=str(e))
|