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