from fastapi import APIRouter, Depends from db.handlers.categories import CategoryHandler from db.handlers.stock import PlacementHandler, StockHandler from db.handlers.toolbox import ToolboxHandler from db.handlers.toolkit import ToolkitHandler from utils import requestDict, logger router = APIRouter() @router.post("/", summary="Запрос остатка инструмента") async def toolkit_request( reqData: dict = Depends(requestDict), ): response = {"status": "error", "data": {}} toolkitId = reqData.get("body").get("toolkitId") logger.info(f"Получение запроса остатка инструмента #{toolkitId}") # logger.info(request_data) stocks = await StockHandler.getByToolkitId(toolkitId) if not stocks: return response userId = reqData.get("body").get("userId") allToolboxes = reqData.get("body").get("allToolboxes") toolboxes = ( await ToolboxHandler.getByOwner(userId) if not allToolboxes else await ToolboxHandler.getAll() ) if not toolboxes: return response toolboxesTitles = {toolbox["id"]: toolbox["title"] for toolbox in toolboxes} toolboxesOwners = {toolbox["id"]: toolbox["owner_id"] for toolbox in toolboxes} stocksData = {"count": 0, "toolboxes": {}} for stock in stocks: toolboxTitle = toolboxesTitles.get(stock["toolbox_id"], None) if not toolboxTitle: continue stocksData["count"] += stock["quantity"] if toolboxTitle not in stocksData["toolboxes"]: stocksData["toolboxes"][toolboxTitle] = { "count": stock["quantity"], "placement": stock["placement"], } if not toolboxesOwners.get(stock["toolbox_id"]): stocksData["toolboxes"][toolboxTitle]["id"] = stock["toolbox_id"] stocksData["toolboxes"][toolboxTitle]["totalCost"] = ( stock["price"] * stock["quantity"] ) else: stocksData["toolboxes"][toolboxTitle]["count"] += stock["quantity"] if not toolboxesOwners.get(stock["toolbox_id"]): stocksData["toolboxes"][toolboxTitle]["totalCost"] += ( stock["price"] * stock["quantity"] ) response["status"] = "ok" response["data"] = stocksData return response @router.post("/fill_prepare", summary="Подготовка заполнения ящика") async def fill_toolbox(): logger.info(f"Подготовка заполнения ящика") response = {"status": "error"} toolkits = await ToolkitHandler.getAll() categories = await CategoryHandler.getAll() placements = await PlacementHandler.getAll() if toolkits and categories: response["status"] = "ok" response["data"] = { "toolkits": sorted(toolkits, key=lambda toolkit: toolkit["title"]), "categories": sorted(categories, key=lambda category: category["title"]), "placements": [placement.toDict() for placement in placements], } return response @router.post("/categories_batch", summary="Управление категориями") async def categories_batch(reqData: dict = Depends(requestDict)): logger.info(f"Управление категориями") response = {"status": "error"} userId = reqData.get("body").get("userId") changesData = reqData.get("body").get("changes") success = True for newCategoryData in changesData.get("create", []): logger.info(f"Добавление категории: {newCategoryData.get('title')}") result = await CategoryHandler.add(newCategoryData, userId) if not result: success = False for updateCategoryData in changesData.get("update", []): logger.info(f"Обновление категории: {updateCategoryData.get('title')}") result = await CategoryHandler.edit(updateCategoryData, userId) if not result: success = False for deleteCategoryId in changesData.get("delete", []): logger.info(f"Удаление категории: {deleteCategoryId}") result = await CategoryHandler.delete(deleteCategoryId, userId) if not result: success = False if success: response["status"] = "ok" return response