from datetime import date, datetime, time from sqlalchemy import func, select from db import CRUD from db.schemas.orders import Orders from utils.loggers import logger class OrdersHandler: @staticmethod async def new(user_id: int, order: str): try: await Orders(customer_id=user_id, customer_comment=order).save() except Exception as e: logger.error(f"Ошибка создания заказа: {str(e)}") return {"errorMessage": f"Ошибка создания заказа: {str(e)}"} return {"status": "ok"} @staticmethod async def get_all_by_consumer( user_id: int, startDate: date, endDate: date, toDict: bool = True ): try: startDate = datetime.combine(startDate, time.min) endDate = datetime.combine(endDate, time.max) query = ( select(Orders) .where( Orders.customer_id == user_id, Orders.created_at.between(startDate, endDate), ) .order_by(Orders.created_at.asc()) ) orders = await CRUD.read(query, True) ordresList = [order.toDict() for order in orders] if toDict else orders return {"orders": ordresList} except Exception as e: logger.error(f"Ошибка получения заказов: {str(e)}") return {"errorMessage": f"Ошибка получения заказов: {str(e)}"} @staticmethod async def get_all(startDate: date, endDate: date, toDict: bool = True): try: startDate = datetime.combine(startDate, time.min) endDate = datetime.combine(endDate, time.max) query = ( select(Orders) .where( Orders.created_at.between(startDate, endDate), ) .order_by(Orders.created_at.asc()) ) orders = await CRUD.read(query, True) ordresList = [order.toDict() for order in orders] if toDict else orders return {"orders": ordresList} except Exception as e: logger.error(f"Ошибка получения заказов: {str(e)}") return {"errorMessage": f"Ошибка получения заказов: {str(e)}"} @staticmethod async def countNew(): try: query = select(func.count(Orders.id)).where(Orders.status == "new") return {"orders": await CRUD.read(query)} except Exception as e: logger.error(f"Ошибка получения количества заказов: {str(e)}") return {"errorMessage": f"Ошибка получения количества заказов: {str(e)}"} @staticmethod async def get(order_id: int, toDict: bool = False): try: order = await CRUD.read(select(Orders).where(Orders.id == order_id)) return order.toDict() if toDict else order except Exception as e: logger.error(f"Ошибка получения заказа: {str(e)}") return {"errorMessage": f"Ошибка получения заказа: {str(e)}"} @staticmethod async def update( order_id: int, user_id: int, status: str = None, comment: str = None ): try: if status is None and comment is None: logger.error("Не указан статус и комментарий") return {"errorMessage": "Не указан статус и комментарий"} order = await OrdersHandler.get(order_id) if not order or isinstance(order, dict): logger.error("Заказ не найден") return {"errorMessage": "Заказ не найден"} changeData = {"executor_id": user_id} if status: changeData["status"] = status if comment: changeData["executor_comment"] = comment await order.edit(**changeData) except Exception as e: logger.error(f"Ошибка обновления заказа: {str(e)}") return {"errorMessage": f"Ошибка обновления заказа: {str(e)}"} return {"status": "ok"}