fix: don't allow Stock Reconciliation for items having reserved stock

This commit is contained in:
s-aga-r 2023-04-14 15:22:41 +05:30
parent dc9bb772cb
commit 2ed7d8a1fb

View File

@ -47,6 +47,7 @@ class StockReconciliation(StockController):
self.validate_putaway_capacity()
if self._action == "submit":
self.validate_reserved_stock()
self.make_batches("warehouse")
def on_submit(self):
@ -60,6 +61,7 @@ class StockReconciliation(StockController):
def on_cancel(self):
self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Repost Item Valuation")
self.validate_reserved_stock()
self.make_sle_on_cancel()
self.make_gl_entries_on_cancel()
self.repost_future_sle_and_gle()
@ -224,6 +226,46 @@ class StockReconciliation(StockController):
except Exception as e:
self.validation_messages.append(_("Row #") + " " + ("%d: " % (row.idx)) + cstr(e))
def validate_reserved_stock(self) -> None:
"""Raises an exception if there is any reserved stock for the items in the Stock Reconciliation."""
from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry import (
get_sre_reserved_qty_details_for_item_and_warehouse as get_sre_reserved_qty_details,
)
item_code_list, warehouse_list = [], []
for item in self.items:
item_code_list.append(item.item_code)
warehouse_list.append(item.warehouse)
sre_reserved_qty_details = get_sre_reserved_qty_details(item_code_list, warehouse_list)
if sre_reserved_qty_details:
data = []
for (item_code, warehouse), reserved_qty in sre_reserved_qty_details.items():
data.append([item_code, warehouse, reserved_qty])
msg = ""
if len(data) == 1:
msg = _(
"{0} units are reserved for Item {1} in Warehouse {2}, please un-reserve the same to {3} the Stock Reconciliation."
).format(bold(data[0][2]), bold(data[0][0]), bold(data[0][1]), self._action)
else:
items_html = ""
for d in data:
items_html += "<li>{0} units of Item {1} in Warehouse {2}</li>".format(
bold(d[2]), bold(d[0]), bold(d[1])
)
msg = _(
"The stock has been reserved for the following Items and Warehouses, un-reserve the same to {0} the Stock Reconciliation: <br /><br /> {1}"
).format(self._action, items_html)
frappe.throw(
msg,
title=_("Stock Reservation"),
)
def update_stock_ledger(self):
"""find difference between current and expected entries
and create stock ledger entries based on the difference"""