diff --git a/db/handlers/__init__.py b/db/handlers/__init__.py index 82861c7..9fd910d 100644 --- a/db/handlers/__init__.py +++ b/db/handlers/__init__.py @@ -5,6 +5,7 @@ from .categories import * from .stock import * from .toolkit import * from .records import * +from .actions import * class InitializeDatabase: @@ -17,6 +18,7 @@ class InitializeDatabase: self.toolkitHandler = ToolkitHandler() self.stocksRecordHandler = StocksRecordsHandler() self.servicesRecordHandler = ServiceRecordsHandler() + self.actionsHandler = StocksActions() async def initialize(self): await self.accessHandler.initialize() @@ -24,7 +26,7 @@ class InitializeDatabase: await self.toolboxHandler.initialize() await self.categoryHandler.initialize() await self.toolkitHandler.initialize() - await self.stockHandler.initialize() + await self.actionsHandler.initialize() __all__ = [ @@ -36,4 +38,8 @@ __all__ = [ "ToolkitHandler", "StocksRecords", "ServicesRecords", + "StocksRecordsHandler", + "ServiceRecordsHandler", + "StocksActions", + "InitializeDatabase", ] diff --git a/db/handlers/access.py b/db/handlers/access.py index 3a1b70b..9744979 100644 --- a/db/handlers/access.py +++ b/db/handlers/access.py @@ -146,6 +146,7 @@ class AccessLevelHandler: "available_own_toolbox": True, }, } + logger.info("Инициализация уровней доступа") for accessLevel in baseAcessLevels.values(): await self.add(**accessLevel) diff --git a/db/handlers/actions.py b/db/handlers/actions.py index 3bb42a8..0bacf6e 100644 --- a/db/handlers/actions.py +++ b/db/handlers/actions.py @@ -40,11 +40,21 @@ class StocksActions: reason=reason, quantity=quantity, price=price, + return_record_id=True, ) logger.info( f"Оприходование инструмента {toolkit_id} на складе {toolbox_id} прошло {'успешно' if recorded else 'не успешно'}" ) - return recorded + if recorded: + accepted = await StocksRecordsHandler.accept( + recorded, user_id, None, quantity, price + ) + if not accepted: + logger.error( + f"Принятие записи о оприходовании инструмента {toolkit_id} на складе {toolbox_id} не удалось" + ) + return accepted + return False async def moving( action: str, @@ -74,7 +84,7 @@ class StocksActions: return False totalTakeQuantity = 0 - writeDownLIst = [] + writeDownList = [] for stock in availability: if quantity == totalTakeQuantity: @@ -99,7 +109,7 @@ class StocksActions: ) if not target_toolbox_id: - writeDownLIst.append( + writeDownList.append( { "id": sourceEdit["id"], "quantity": takeQuantity, @@ -169,45 +179,45 @@ class StocksActions: logger.info( f"{action} инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id} прошло успешно" ) - return True if target_toolbox_id else writeDownLIst + return True if target_toolbox_id else writeDownList - async def writeDownRequest( + async def movingRequest( + action: str, toolkit_id: int, - toolbox_id: int, + source_toolbox_id: int, + target_toolbox_id: int, quantity: int, reason: str, user_id: int, price: int = 0, + return_record_id: bool = False, ): logger.info( - f"Запрос на списание инструмента {toolkit_id} со склада {toolbox_id} в количестве {quantity} по цене {price} ..." + f"Запрос на {action} инструмента {toolkit_id} со склада {source_toolbox_id} в количестве {quantity} по цене {price} ..." ) recorded = await StocksRecordsHandler.add( - action="Списание", + action=action, source_stock_id=None, target_stock_id=None, - source_toolbox_id=toolbox_id, - target_toolbox_id=None, + source_toolbox_id=source_toolbox_id, + target_toolbox_id=target_toolbox_id, toolkit_id=toolkit_id, init_user_id=user_id, reason=reason, quantity=quantity, price=price, + return_record_id=return_record_id, ) logger.info( - f"Запрос на списание инструмента {toolkit_id} со склада {toolbox_id} в количестве {quantity} по цене {price} {'успешно завершен' if recorded else 'завершен с ошибкой'}" + f"Запрос на {action} инструмента {toolkit_id} со склада {source_toolbox_id} в количестве {quantity} по цене {price} {'успешно завершен' if recorded else 'завершен с ошибкой'}" ) return recorded - async def writeDownAcceptance(self, record_id: int, user_id: int): - logger.info(f"Принятие записи о списании инструмента {record_id} ...") + async def movingAcceptance(self, record_id: int, user_id: int): + logger.info(f"Принятие записи о движении инструмента {record_id} ...") writeDownARecord = await StocksRecordsHandler.getById(record_id, True) if not writeDownARecord: - return False - if writeDownARecord.action != "Списание": - logger.error( - f"Запись {record_id} не является записью о списании инструмента" - ) + logger.error(f"Запись {record_id} не найдена") return False if writeDownARecord.accepted_at is not None: logger.error(f"Запись {record_id} уже была принята") @@ -222,7 +232,7 @@ class StocksActions: reason=writeDownARecord.reason, ) if not stocksMovements: - logger.error(f"Ошибка при списании инструмента") + logger.error(f"Ошибка при {writeDownARecord.action} инструмента") return False accept = await StocksRecordsHandler.accept( @@ -266,11 +276,57 @@ class StocksActions: totalRecordsIds.append(recorded) logger.info( - f"Записи {', '.join(map(str, totalRecordsIds))} о списании инструмента успешно приняты {user_id}" + f"Записи {', '.join(map(str, totalRecordsIds))} о {writeDownARecord.action} инструмента успешно приняты {user_id}" ) return True - # TODO Дописать возврат на склад + async def takeToolkit( + self, + source_toolbox_id: int, + target_toolbox_id: int, + toolkit_id: int, + quantity: int, + reason: str, + user_id: int, + price: int = 0, + ): + logger.info( + f"Формирование запроса на получение инструмента {toolkit_id} на склад {target_toolbox_id} со склада {source_toolbox_id} в количестве {quantity} ..." + ) + takeRequest = await self.movingRequest( + action="Получение", + source_toolbox_id=source_toolbox_id, + target_toolbox_id=target_toolbox_id, + toolkit_id=toolkit_id, + quantity=quantity, + user_id=user_id, + reason=reason, + price=price, + return_record_id=True, + ) + if not takeRequest: + logger.error( + f"Формирование запроса на получение инструмента {toolkit_id} не удалось" + ) + return False + logger.info( + f"Формирование запроса на получение инструмента {toolkit_id} успешно завершено" + ) + logger.info( + f"Принятие запроса {takeRequest} на получение инструмента {toolkit_id} ..." + ) + accepted = await self.movingAcceptance(takeRequest, user_id) + if not accepted: + logger.error( + f"Принятие запроса {takeRequest} на получение инструмента {toolkit_id} не удалось" + ) + return False + logger.info( + f"Принятие запроса {takeRequest} на получение инструмента {toolkit_id} успешно завершено" + ) + return True async def initialize(): + # TODO прописать наполнение общих складов, получение на личные, возвраты и списания. + # Не все запросы на возвраты и списания нужно принять автоматически, нужно оставить несколько для демонстрации pass diff --git a/db/handlers/categories.py b/db/handlers/categories.py index 014adcf..ed6cb25 100644 --- a/db/handlers/categories.py +++ b/db/handlers/categories.py @@ -85,6 +85,7 @@ class CategoryHandler: {"title": "Слесарка", "description": "Инструмент для слесарного цеха"}, ] + logger.info("Создание базовых категорий") for categoryData in baseCategories: await CategoryHandler.add(categoryData) diff --git a/db/handlers/stock.py b/db/handlers/stock.py index 1dcb741..6c874a4 100644 --- a/db/handlers/stock.py +++ b/db/handlers/stock.py @@ -110,6 +110,3 @@ class StockHandler: f"Запись об остатках {stockInfo} успешно обновлена, изменены данные: {kwargs.keys()}" ) return editedStock.toDict() - - async def initialize(): - pass diff --git a/db/handlers/toolbox.py b/db/handlers/toolbox.py index 9acf859..c78e834 100644 --- a/db/handlers/toolbox.py +++ b/db/handlers/toolbox.py @@ -1,7 +1,7 @@ from utils import logger from db import CRUD from db.schemas import Toolbox -from sqlalchemy import select +from sqlalchemy import or_, select from db.handlers import ServiceRecordsHandler @@ -70,6 +70,13 @@ class ToolboxHandler: return {} return toolbox.toDict() + async def getByOwner(ownerId: int) -> list: + query = select(Toolbox).where( + or_(Toolbox.owner_id == ownerId, Toolbox.owner_id == None) + ) + toolboxes = await CRUD.read(query, True) + return [toolbox.toDict() for toolbox in toolboxes] if toolboxes else [] + async def delete(toolboxId: int, user_id: int = None): query = select(Toolbox).where(Toolbox.id == toolboxId) toolbox = await CRUD.read(query) @@ -106,6 +113,7 @@ class ToolboxHandler: }, ] + logger.info("Создание базовых тулбоксов") for toolboxData in baseToolsboxes: await ToolboxHandler.add(toolboxData) diff --git a/db/handlers/toolkit.py b/db/handlers/toolkit.py index ed8a193..d6a8549 100644 --- a/db/handlers/toolkit.py +++ b/db/handlers/toolkit.py @@ -158,6 +158,7 @@ class ToolkitHandler: async def initialize(self): from .categories import CategoryHandler + logger.info("Инициализация инструментов") categoriesList = await CategoryHandler.getAll() categories = {category["title"]: category["id"] for category in categoriesList} diff --git a/db/handlers/user.py b/db/handlers/user.py index 591a544..4955875 100644 --- a/db/handlers/user.py +++ b/db/handlers/user.py @@ -185,6 +185,7 @@ class UserHandler: async def initialize(self): from .access import AccessLevelHandler + logger.info("Инициализация пользователей") accessLevelsList = await AccessLevelHandler.getAll() acessLevels = { accessLevel["title"]: accessLevel["id"] for accessLevel in accessLevelsList @@ -218,5 +219,5 @@ class UserHandler: for user in baseUsers.values(): await self.add(user) - logger.info("Инициализация модуля пользователей завершена") + logger.info("Инициализация пользователей завершена") return