From b7fe163de5ece72a91862695537274c6aeb7eb06 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 09:35:51 +0530 Subject: [PATCH] fix: SO ordered qty on PO item removal (#38378) * fix: SO ordered qty on PO item removal (#38378) * fix: update ordered_qty for SO when PO items removed * refactor: use cached value --------- Co-authored-by: Deepesh Garg (cherry picked from commit 9087e1443e4719ef07888ba43b167fe24bd352e1) # Conflicts: # erpnext/buying/doctype/purchase_order/purchase_order.py * chore: resolve conflicts --------- Co-authored-by: Gursheen Kaur Anand <40693548+GursheenK@users.noreply.github.com> --- .../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 51b3a4771a0..c1c813db044 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -441,6 +441,20 @@ class PurchaseOrder(BuyingController): else: self.db_set("per_received", 0, update_modified=False) + 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.get_cached_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 bf792c5e896..393ad171d52 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -2874,6 +2874,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()