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)