From 264855e5e1b3e812c1495bbb3bb40c0d5e78d418 Mon Sep 17 00:00:00 2001 From: ljain112 Date: Tue, 20 Jan 2026 17:33:01 +0530 Subject: [PATCH] fix: throw if item order field is not set in subcontracting controller (cherry picked from commit d256365f4a49f195ff9e98587442b49f3d2a6f27) --- .../controllers/subcontracting_controller.py | 59 ++++++++++++------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/erpnext/controllers/subcontracting_controller.py b/erpnext/controllers/subcontracting_controller.py index 33c1edbcb72..c825159df71 100644 --- a/erpnext/controllers/subcontracting_controller.py +++ b/erpnext/controllers/subcontracting_controller.py @@ -166,29 +166,46 @@ class SubcontractingController(StockController): _("Row {0}: Item {1} must be a subcontracted item.").format(item.idx, item.item_name) ) - if self.doctype != "Subcontracting Receipt" and item.qty > flt( - get_pending_subcontracted_quantity( - self.doctype, - self.purchase_order if self.doctype == "Subcontracting Order" else self.sales_order, - ).get( - item.purchase_order_item - if self.doctype == "Subcontracting Order" - else item.sales_order_item - ) - / item.subcontracting_conversion_factor, - frappe.get_precision( + if self.doctype != "Subcontracting Receipt": + order_item_doctype = ( "Purchase Order Item" if self.doctype == "Subcontracting Order" - else "Sales Order Item", - "qty", - ), - ): - frappe.throw( - _( - "Row {0}: Item {1}'s quantity cannot be higher than the available quantity." - ).format(item.idx, item.item_name) + else "Sales Order Item" ) + order_name = ( + self.purchase_order if self.doctype == "Subcontracting Order" else self.sales_order + ) + order_item_field = frappe.scrub(order_item_doctype) + + if not item.get(order_item_field): + frappe.throw( + _("Row {0}: Item {1} must be linked to a {2}.").format( + item.idx, item.item_name, order_item_doctype + ) + ) + + pending_qty = flt( + flt( + get_pending_subcontracted_quantity( + order_item_doctype, + order_name, + ).get(item.get(order_item_field)) + ) + / item.subcontracting_conversion_factor, + frappe.get_precision( + order_item_doctype, + "qty", + ), + ) + + if item.qty > pending_qty: + frappe.throw( + _( + "Row {0}: Item {1}'s quantity cannot be higher than the available quantity." + ).format(item.idx, item.item_name) + ) + if self.doctype != "Subcontracting Inward Order": item.amount = item.qty * item.rate @@ -1333,9 +1350,7 @@ def get_item_details(items): def get_pending_subcontracted_quantity(doctype, name): - table = frappe.qb.DocType( - "Purchase Order Item" if doctype == "Subcontracting Order" else "Sales Order Item" - ) + table = frappe.qb.DocType(doctype) query = ( frappe.qb.from_(table) .select(table.name, table.stock_qty, table.subcontracted_qty)