109 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import Union
 | 
						||
 | 
						||
from sqlalchemy import select, update
 | 
						||
 | 
						||
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))
 |