From caeaa3f94086c03154e7a9ee369ce6a4c80f030a Mon Sep 17 00:00:00 2001 From: Sagar Sharma Date: Sat, 2 Jul 2022 06:20:09 +0530 Subject: [PATCH] fix: multiple SCO against a PO --- erpnext/buying/doctype/purchase_order/purchase_order.py | 9 +++++++++ .../doctype/subcontracting_order/subcontracting_order.py | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 6f960a2c65..cd58d25136 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -691,3 +691,12 @@ def get_mapped_subcontracting_order(source_name, target_doc=None): item.warehouse = source_doc.items[idx].warehouse return target_doc + + +@frappe.whitelist() +def is_subcontracting_order_created(po_name) -> bool: + count = frappe.db.count( + "Subcontracting Order", {"purchase_order": po_name, "status": ["not in", ["Draft", "Cancelled"]]} + ) + + return True if count else False diff --git a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py index 3655910efb..73ab43401b 100644 --- a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py +++ b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py @@ -6,6 +6,7 @@ from frappe import _ from frappe.model.mapper import get_mapped_doc from frappe.utils import flt +from erpnext.buying.doctype.purchase_order.purchase_order import is_subcontracting_order_created from erpnext.controllers.subcontracting_controller import SubcontractingController from erpnext.stock.stock_balance import get_ordered_qty, update_bin_qty from erpnext.stock.utils import get_bin @@ -36,7 +37,15 @@ class SubcontractingOrder(SubcontractingController): def validate_purchase_order_for_subcontracting(self): if self.purchase_order: + if is_subcontracting_order_created(self.purchase_order): + frappe.throw( + _( + "Only one Subcontracting Order can be created against a Purchase Order, cancel the existing Subcontracting Order to create a new one." + ) + ) + po = frappe.get_doc("Purchase Order", self.purchase_order) + if not po.is_subcontracted: frappe.throw(_("Please select a valid Purchase Order that is configured for Subcontracting."))