fix: on closed unreserved the production plan qty (backport #38848) (#38859)
fix: on closed unreserved the production plan qty (#38848)
(cherry picked from commit 2184e8ef58379f53ef8f1d069afa26e64796b073)
Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py
index c201c4f..4b72a83 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py
@@ -583,6 +583,7 @@
if close:
self.db_set("status", "Closed")
+ self.update_bin_qty()
return
if self.total_produced_qty > 0:
@@ -597,6 +598,9 @@
if close is not None:
self.db_set("status", self.status)
+ if self.docstatus == 1 and self.status != "Completed":
+ self.update_bin_qty()
+
def update_ordered_status(self):
update_status = False
for d in self.po_items:
diff --git a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py
index cc9d9a0..f86725d 100644
--- a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py
@@ -1458,6 +1458,47 @@
self.assertEqual(row.get("uom"), "Nos")
self.assertEqual(row.get("conversion_factor"), 10.0)
+ def test_unreserve_qty_on_closing_of_pp(self):
+ from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
+ from erpnext.stock.utils import get_or_make_bin
+
+ fg_item = make_item(properties={"is_stock_item": 1, "stock_uom": "_Test UOM 1"}).name
+ rm_item = make_item(properties={"is_stock_item": 1, "stock_uom": "_Test UOM 1"}).name
+
+ store_warehouse = create_warehouse("Store Warehouse", company="_Test Company")
+ rm_warehouse = create_warehouse("RM Warehouse", company="_Test Company")
+
+ make_bom(item=fg_item, raw_materials=[rm_item], source_warehouse="_Test Warehouse - _TC")
+
+ pln = create_production_plan(
+ item_code=fg_item, planned_qty=10, stock_uom="_Test UOM 1", do_not_submit=1
+ )
+
+ pln.for_warehouse = rm_warehouse
+ mr_items = get_items_for_material_requests(pln.as_dict())
+ for d in mr_items:
+ pln.append("mr_items", d)
+
+ pln.save()
+ pln.submit()
+
+ bin_name = get_or_make_bin(rm_item, rm_warehouse)
+ before_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
+
+ pln.reload()
+ pln.set_status(close=True)
+
+ bin_name = get_or_make_bin(rm_item, rm_warehouse)
+ after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
+ self.assertAlmostEqual(after_qty, before_qty - 10)
+
+ pln.reload()
+ pln.set_status(close=False)
+
+ bin_name = get_or_make_bin(rm_item, rm_warehouse)
+ after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
+ self.assertAlmostEqual(after_qty, before_qty)
+
def create_production_plan(**args):
"""