From b9b2304ce3ca46f71a5b3a67069cb2882624c499 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Tue, 28 Nov 2023 13:01:53 +0530 Subject: [PATCH 1/2] fix: update ordered_qty for SO when PO items removed --- .../doctype/purchase_order/purchase_order.py | 14 ++++++++++++++ erpnext/controllers/accounts_controller.py | 3 +++ 2 files changed, 17 insertions(+) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 961697c0ac23..2343a3161689 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -484,6 +484,20 @@ def can_update_items(self) -> bool: return result + def update_ordered_qty_in_so_for_removed_items(self, removed_items): + """ + Updates ordered_qty in linked SO when item rows are removed using Update Items + """ + if not self.is_against_so(): + return + for item in removed_items: + prev_ordered_qty = frappe.db.get_value( + "Sales Order Item", item.get("sales_order_item"), "ordered_qty" + ) + frappe.db.set_value( + "Sales Order Item", item.get("sales_order_item"), "ordered_qty", prev_ordered_qty - item.qty + ) + def item_last_purchase_rate(name, conversion_rate, item_code, conversion_factor=1.0): """get last purchase rate for an item""" diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index f551133a2893..414f98c9615d 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -2958,6 +2958,9 @@ def validate_and_delete_children(parent, data) -> bool: d.cancel() d.delete() + if parent.doctype == "Purchase Order": + parent.update_ordered_qty_in_so_for_removed_items(deleted_children) + # need to update ordered qty in Material Request first # bin uses Material Request Items to recalculate & update parent.update_prevdoc_status() From abdc5745c03533e66dae168222d6d404cdcd5441 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Tue, 28 Nov 2023 13:03:57 +0530 Subject: [PATCH 2/2] refactor: use cached value --- erpnext/buying/doctype/purchase_order/purchase_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 2343a3161689..b30e7018003c 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -491,7 +491,7 @@ def update_ordered_qty_in_so_for_removed_items(self, removed_items): if not self.is_against_so(): return for item in removed_items: - prev_ordered_qty = frappe.db.get_value( + prev_ordered_qty = frappe.get_cached_value( "Sales Order Item", item.get("sales_order_item"), "ordered_qty" ) frappe.db.set_value(