277 lines
11 KiB
Python
277 lines
11 KiB
Python
from db.handlers import StockHandler, StocksRecordsHandler
|
||
from utils import logger
|
||
|
||
|
||
class StocksActions:
|
||
|
||
async def registration(
|
||
toolkit_id: int,
|
||
toolbox_id: int,
|
||
user_id: int,
|
||
quantity: int,
|
||
price: int,
|
||
placement: str,
|
||
reason: str,
|
||
):
|
||
logger.info(
|
||
f"Оприходование инструмента {toolkit_id} на складе {toolbox_id} ..."
|
||
)
|
||
newStocks = await StockHandler.add(
|
||
toolkit_id=toolkit_id,
|
||
toolbox_id=toolbox_id,
|
||
quantity=quantity,
|
||
price=price,
|
||
placement=placement,
|
||
)
|
||
if newStocks is None:
|
||
logger.error(
|
||
f"Оприходование инструмента {toolkit_id} на складе {toolbox_id} не удалось"
|
||
)
|
||
return False
|
||
|
||
recorded = await StocksRecordsHandler.add(
|
||
action="Оприходование",
|
||
source_stock_id=None,
|
||
target_stock_id=newStocks.id,
|
||
source_toolbox_id=None,
|
||
target_toolbox_id=toolbox_id,
|
||
toolkit_id=toolkit_id,
|
||
init_user_id=user_id,
|
||
reason=reason,
|
||
quantity=quantity,
|
||
price=price,
|
||
)
|
||
logger.info(
|
||
f"Оприходование инструмента {toolkit_id} на складе {toolbox_id} прошло {'успешно' if recorded else 'не успешно'}"
|
||
)
|
||
return recorded
|
||
|
||
async def moving(
|
||
action: str,
|
||
source_toolbox_id: int,
|
||
target_toolbox_id: int,
|
||
toolkit_id: int,
|
||
quantity: int,
|
||
user_id: int,
|
||
reason: str,
|
||
target_placement: str = None,
|
||
):
|
||
logger.info(
|
||
f"{action} инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id} ..."
|
||
)
|
||
availability = await StockHandler.getByToolboxIdAndToolkitId(
|
||
source_toolbox_id, toolkit_id
|
||
)
|
||
if len(availability) == 0:
|
||
logger.error(f"На складе {source_toolbox_id} нет инструмента {toolkit_id}")
|
||
return False
|
||
|
||
totalQuantity = sum([stock["quantity"] for stock in availability])
|
||
if quantity > totalQuantity:
|
||
logger.error(
|
||
f"На складе {source_toolbox_id} нет в количестве {quantity} инструмента {toolkit_id}"
|
||
)
|
||
return False
|
||
|
||
totalTakeQuantity = 0
|
||
writeDownLIst = []
|
||
|
||
for stock in availability:
|
||
if quantity == totalTakeQuantity:
|
||
break
|
||
takeQuantity = min(stock["quantity"], quantity - totalTakeQuantity)
|
||
totalTakeQuantity += takeQuantity
|
||
|
||
logger.info(
|
||
f"Списание инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id} в количестве {takeQuantity} по цене {stock['price']} ..."
|
||
)
|
||
sourceEdit = await StockHandler.edit(
|
||
stock["id"], quantity=stock["quantity"] - takeQuantity
|
||
)
|
||
if not sourceEdit:
|
||
logger.error(
|
||
f"Ошибка обновления записи об остатках инструмента {toolkit_id} на складе {source_toolbox_id}"
|
||
)
|
||
return False
|
||
|
||
logger.info(
|
||
f"Списание инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id} в количестве {takeQuantity} по цене {stock['price']} успешно завершена"
|
||
)
|
||
|
||
if not target_toolbox_id:
|
||
writeDownLIst.append(
|
||
{
|
||
"id": sourceEdit["id"],
|
||
"quantity": takeQuantity,
|
||
"price": stock["price"],
|
||
}
|
||
)
|
||
continue
|
||
|
||
existing = await StockHandler.getByToolboxIdAndToolkitIdAndQPrice(
|
||
target_toolbox_id, toolkit_id, stock["price"]
|
||
)
|
||
if len(existing) == 0:
|
||
logger.info(
|
||
f"Добавление инструмента {toolkit_id} на склад {target_toolbox_id} по цене {stock['price']} ..."
|
||
)
|
||
targetStock = await StockHandler.add(
|
||
toolkit_id=toolkit_id,
|
||
toolbox_id=target_toolbox_id,
|
||
quantity=takeQuantity,
|
||
price=stock["price"],
|
||
placement=target_placement,
|
||
)
|
||
if not targetStock:
|
||
logger.error(
|
||
f"Ошибка добавления инструмента {toolkit_id} на склад {target_toolbox_id}"
|
||
)
|
||
return False
|
||
logger.info(
|
||
f"Добавление инструмента {toolkit_id} на склад {target_toolbox_id} по цене {stock['price']} успешно завершено"
|
||
)
|
||
else:
|
||
logger.info(
|
||
f"Изменение остатков инструмента {toolkit_id} на склад {target_toolbox_id} по цене {stock['price']} ..."
|
||
)
|
||
targetStock = await StockHandler.edit(
|
||
existing[0]["id"],
|
||
quantity=existing[0]["quantity"] + takeQuantity,
|
||
)
|
||
if not targetStock:
|
||
logger.error(
|
||
f"Ошибка обновления записи об остатках инструмента {toolkit_id} на складе {target_toolbox_id}"
|
||
)
|
||
return False
|
||
logger.info(
|
||
f"Изменение остатков инструмента {toolkit_id} на склад {target_toolbox_id} по цене {stock['price']} успешно завершено"
|
||
)
|
||
|
||
recorded = await StocksRecordsHandler.add(
|
||
action=action,
|
||
source_stock_id=stock["id"],
|
||
target_stock_id=targetStock.get("id"),
|
||
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=stock["price"],
|
||
target_placement=target_placement,
|
||
)
|
||
if not recorded:
|
||
logger.error(
|
||
f"Ошибка создания записи о {action} инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id}"
|
||
)
|
||
return False
|
||
|
||
logger.info(
|
||
f"{action} инструмента {toolkit_id} со склада {source_toolbox_id} на склад {target_toolbox_id} прошло успешно"
|
||
)
|
||
return True if target_toolbox_id else writeDownLIst
|
||
|
||
async def writeDownRequest(
|
||
toolkit_id: int,
|
||
toolbox_id: int,
|
||
quantity: int,
|
||
reason: str,
|
||
user_id: int,
|
||
price: int = 0,
|
||
):
|
||
logger.info(
|
||
f"Запрос на списание инструмента {toolkit_id} со склада {toolbox_id} в количестве {quantity} по цене {price} ..."
|
||
)
|
||
recorded = await StocksRecordsHandler.add(
|
||
action="Списание",
|
||
source_stock_id=None,
|
||
target_stock_id=None,
|
||
source_toolbox_id=toolbox_id,
|
||
target_toolbox_id=None,
|
||
toolkit_id=toolkit_id,
|
||
init_user_id=user_id,
|
||
reason=reason,
|
||
quantity=quantity,
|
||
price=price,
|
||
)
|
||
logger.info(
|
||
f"Запрос на списание инструмента {toolkit_id} со склада {toolbox_id} в количестве {quantity} по цене {price} {'успешно завершен' if recorded else 'завершен с ошибкой'}"
|
||
)
|
||
return recorded
|
||
|
||
async def writeDownAcceptance(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} не является записью о списании инструмента"
|
||
)
|
||
return False
|
||
if writeDownARecord.accepted_at is not None:
|
||
logger.error(f"Запись {record_id} уже была принята")
|
||
return False
|
||
stocksMovements = await self.moving(
|
||
action=writeDownARecord.action,
|
||
source_toolbox_id=writeDownARecord.source_toolbox_id,
|
||
target_toolbox_id=writeDownARecord.target_toolbox_id,
|
||
toolkit_id=writeDownARecord.toolkit_id,
|
||
quantity=writeDownARecord.quantity,
|
||
user_id=user_id,
|
||
reason=writeDownARecord.reason,
|
||
)
|
||
if not stocksMovements:
|
||
logger.error(f"Ошибка при списании инструмента")
|
||
return False
|
||
|
||
accept = await StocksRecordsHandler.accept(
|
||
record_id,
|
||
user_id,
|
||
stocksMovements[0].get("id"),
|
||
stocksMovements[0].get("quantity"),
|
||
stocksMovements[0].get("price"),
|
||
)
|
||
if not accept:
|
||
return accept
|
||
|
||
totalRecordsIds = [record_id]
|
||
|
||
if len(stocksMovements) > 1:
|
||
for stock in stocksMovements[1:]:
|
||
recorded = await StocksRecordsHandler.add(
|
||
action=writeDownARecord.action,
|
||
source_stock_id=stock.get("id"),
|
||
target_stock_id=None,
|
||
source_toolbox_id=writeDownARecord.source_toolbox_id,
|
||
target_toolbox_id=writeDownARecord.target_toolbox_id,
|
||
toolkit_id=writeDownARecord.toolkit_id,
|
||
init_user_id=writeDownARecord.init_user_id,
|
||
reason=writeDownARecord.reason,
|
||
quantity=stock.get("quantity"),
|
||
price=stock.get("price"),
|
||
return_record_id=True,
|
||
)
|
||
if not recorded:
|
||
return False
|
||
accept = await StocksRecordsHandler.accept(
|
||
record_id=recorded,
|
||
accept_user_id=user_id,
|
||
source_stock_id=stock.get("id"),
|
||
quantity=stock.get("quantity"),
|
||
price=stock.get("price"),
|
||
)
|
||
if not accept:
|
||
return False
|
||
totalRecordsIds.append(recorded)
|
||
|
||
logger.info(
|
||
f"Записи {', '.join(map(str, totalRecordsIds))} о списании инструмента успешно приняты {user_id}"
|
||
)
|
||
return True
|
||
|
||
# TODO Дописать возврат на склад
|
||
|
||
async def initialize():
|
||
pass
|