From 136d26352d7d9f706027b7b6b7396dade648d61f Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 14 May 2026 13:56:51 +0530 Subject: [PATCH] fix: status not changing for dropshipped POs and SOs (#54934) * fix: status not changing for dropshipped POs and SOs * test: change test case to accomodate new flow (cherry picked from commit 78a79120ea99379aab0b64ed46d281ee58abac5f) --- .../doctype/purchase_order/purchase_order.py | 13 ++++++++++--- .../purchase_order_item.json | 3 +-- .../selling/doctype/sales_order/sales_order.py | 18 ++++++------------ .../doctype/sales_order/test_sales_order.py | 7 ++++++- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 5a4d1db2a6c..ebd7c03bb52 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -491,7 +491,6 @@ class PurchaseOrder(BuyingController): self.update_status_updater_if_from_pp() if self.has_drop_ship_item(): - self.update_delivered_qty_in_sales_order() self.set_received_qty_to_zero_for_drop_ship_items() self.update_receiving_percentage() @@ -623,9 +622,17 @@ class PurchaseOrder(BuyingController): ) ) - item.received_qty += d.get("qty_change") + qty_change = item.received_qty + d.get("qty_change") + item.db_set("received_qty", qty_change, update_modified=True) + self.add_comment( + "Label", + _("updated delivered quantity for item {0} to {1}").format( + frappe.bold(item.item_code), frappe.bold(qty_change) + ), + ) self.update_receiving_percentage() - self.save() + self.set_status(update=True) + self.update_delivered_qty_in_sales_order() def is_against_so(self): return any(d.sales_order for d in self.items if d.sales_order) diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json index 7770b3b572d..daeb262ba7c 100644 --- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json +++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json @@ -622,7 +622,6 @@ "width": "100px" }, { - "allow_on_submit": 1, "depends_on": "received_qty", "fieldname": "received_qty", "fieldtype": "Float", @@ -952,7 +951,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2026-05-08 20:40:10.683023", + "modified": "2026-05-14 12:16:16.192936", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order Item", diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 4b38369d048..74262ab0873 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -684,18 +684,12 @@ class SalesOrder(SellingController): for item in self.items: if item.delivered_by_supplier: - item_delivered_qty = frappe.db.sql( - """select sum(qty) - from `tabPurchase Order Item` poi, `tabPurchase Order` po - where poi.sales_order_item = %s - and poi.item_code = %s - and poi.parent = po.name - and po.docstatus = 1 - and po.status = 'Delivered'""", - (item.name, item.item_code), - ) - - item_delivered_qty = item_delivered_qty[0][0] if item_delivered_qty else 0 + item_delivered_qty = frappe.get_all( + "Purchase Order Item", + {"sales_order_item": item.name, "docstatus": 1}, + [{"SUM": "received_qty", "AS": "received_qty"}], + pluck="received_qty", + )[0] item.db_set("delivered_qty", flt(item_delivered_qty), update_modified=False) delivered_qty += min(item.delivered_qty, item.qty) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index d74f849facd..c7585df93fd 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -1224,9 +1224,14 @@ class TestSalesOrder(ERPNextTestSuite): self.assertEqual(abs(flt(reserved_qty)), 0) # test per_delivered status - update_status("Delivered", po.name) + self.assertEqual(po.status, "To Receive and Bill") + self.assertEqual(so.status, "To Deliver and Bill") + po.update_dropship_received_qty([{"name": po.items[0].name, "qty_change": 2}]) self.assertEqual(flt(frappe.db.get_value("Sales Order", so.name, "per_delivered"), 2), 100.00) po.load_from_db() + so.reload() + self.assertEqual(po.status, "To Bill") + self.assertEqual(so.status, "To Bill") # test after closing so so.db_set("status", "Closed")