From f0e24e2f53bb09554f2eda56601d99c57484e3d9 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 21 Jul 2026 15:04:42 +0530 Subject: [PATCH 1/2] fix: sync process loss percentage when fg qty changes (cherry picked from commit beeffee8f99023ff53eb3e54d1f5e248f03e053c) # Conflicts: # erpnext/stock/doctype/stock_entry/test_stock_entry.py --- .../stock/doctype/stock_entry/stock_entry.py | 2 +- .../doctype/stock_entry/test_stock_entry.py | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index ebfa7269912..d601dc093b8 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -2648,7 +2648,7 @@ class StockEntry(StockController): self.process_loss_qty = flt( (flt(self.fg_completed_qty) * flt(self.process_loss_percentage)) / 100 ) - elif self.process_loss_qty and not self.process_loss_percentage: + elif self.process_loss_qty and self.fg_completed_qty: self.process_loss_percentage = flt( (flt(self.process_loss_qty) / flt(self.fg_completed_qty)) * 100 ) diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index ea231ff466c..29e92986563 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -2730,7 +2730,60 @@ class TestStockEntry(FrappeTestCase): frappe.delete_doc("Document Naming Rule", qc_naming_rule.name) +<<<<<<< HEAD def make_serialized_item(**args): +======= + frappe.set_value("UOM", "Nos", "must_be_whole_number", 0) + + fg_item = make_item("FG Item", properties={"is_stock_item": 1}).name + rm_item = make_item("RM Item", properties={"is_stock_item": 1}).name + scrap_item = make_item("Scrap Item", properties={"is_stock_item": 1}).name + warehouse = "_Test Warehouse - _TC" + make_stock_entry(item_code=rm_item, target=warehouse, qty=5, rate=10, purpose="Material Receipt") + + bom_no = make_bom( + item=fg_item, raw_materials=[rm_item], scrap_items=[scrap_item], process_loss_percentage=10 + ).name + se = make_stock_entry(item_code=fg_item, qty=5, purpose="Manufacture", do_not_save=True) + se.from_bom = 1 + se.bom_no = bom_no + se.fg_completed_qty = 5 + se.from_warehouse = warehouse + se.to_warehouse = "_Test Warehouse 1 - _TC" + se.get_items() + se.save() + se.reload() + + self.assertEqual(se.items[1].qty, 4.5) + self.assertEqual(se.items[1].amount, 45) + self.assertEqual(se.items[2].qty, 4.5) + self.assertEqual(se.items[2].amount, 5) + + def test_process_loss_percentage_resyncs_from_qty(self): + # changing fg qty recomputes process_loss_qty + se = frappe.new_doc("Stock Entry") + se.purpose = "Manufacture" + se.fg_completed_qty = 200 + se.process_loss_qty = 100 + se.process_loss_percentage = 80 + + se.set_process_loss_qty() + + self.assertEqual(se.process_loss_percentage, 50) + + def test_process_loss_qty_derived_from_percentage_when_qty_blank(self): + se = frappe.new_doc("Stock Entry") + se.purpose = "Manufacture" + se.fg_completed_qty = 200 + se.process_loss_percentage = 25 + + se.set_process_loss_qty() + + self.assertEqual(se.process_loss_qty, 50) + + +def make_serialized_item(self, **args): +>>>>>>> beeffee8f9 (fix: sync process loss percentage when fg qty changes) args = frappe._dict(args) se = frappe.copy_doc(test_records[0]) From 81e865f6c78d522dda01d1fc7df1c5b30effc555 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 21 Jul 2026 17:03:41 +0530 Subject: [PATCH 2/2] fix: resolve merge conflicts --- .../doctype/stock_entry/test_stock_entry.py | 33 +------------------ 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index 29e92986563..79a353ace30 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -2729,36 +2729,6 @@ class TestStockEntry(FrappeTestCase): # delete naming rule frappe.delete_doc("Document Naming Rule", qc_naming_rule.name) - -<<<<<<< HEAD -def make_serialized_item(**args): -======= - frappe.set_value("UOM", "Nos", "must_be_whole_number", 0) - - fg_item = make_item("FG Item", properties={"is_stock_item": 1}).name - rm_item = make_item("RM Item", properties={"is_stock_item": 1}).name - scrap_item = make_item("Scrap Item", properties={"is_stock_item": 1}).name - warehouse = "_Test Warehouse - _TC" - make_stock_entry(item_code=rm_item, target=warehouse, qty=5, rate=10, purpose="Material Receipt") - - bom_no = make_bom( - item=fg_item, raw_materials=[rm_item], scrap_items=[scrap_item], process_loss_percentage=10 - ).name - se = make_stock_entry(item_code=fg_item, qty=5, purpose="Manufacture", do_not_save=True) - se.from_bom = 1 - se.bom_no = bom_no - se.fg_completed_qty = 5 - se.from_warehouse = warehouse - se.to_warehouse = "_Test Warehouse 1 - _TC" - se.get_items() - se.save() - se.reload() - - self.assertEqual(se.items[1].qty, 4.5) - self.assertEqual(se.items[1].amount, 45) - self.assertEqual(se.items[2].qty, 4.5) - self.assertEqual(se.items[2].amount, 5) - def test_process_loss_percentage_resyncs_from_qty(self): # changing fg qty recomputes process_loss_qty se = frappe.new_doc("Stock Entry") @@ -2782,8 +2752,7 @@ def make_serialized_item(**args): self.assertEqual(se.process_loss_qty, 50) -def make_serialized_item(self, **args): ->>>>>>> beeffee8f9 (fix: sync process loss percentage when fg qty changes) +def make_serialized_item(**args): args = frappe._dict(args) se = frappe.copy_doc(test_records[0])