работа с перемещением и списанием

This commit is contained in:
2025-12-01 22:32:57 +03:00
parent dc85e7c0c9
commit f3213c696f
6 changed files with 404 additions and 13 deletions
+276
View File
@@ -0,0 +1,276 @@
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