Open lost opportunity again if quotation made against it (#8854)
diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py
index 4034306..cede8f4 100644
--- a/erpnext/controllers/status_updater.py
+++ b/erpnext/controllers/status_updater.py
@@ -19,7 +19,7 @@
["Converted", "has_customer"],
],
"Opportunity": [
- ["Quotation", "has_quotation"],
+ ["Quotation", "has_active_quotation"],
["Converted", "has_ordered_quotation"],
["Lost", "eval:self.status=='Lost'"],
["Lost", "has_lost_quotation"],
diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py
index 3c553a5..8a21e7c 100644
--- a/erpnext/crm/doctype/opportunity/opportunity.py
+++ b/erpnext/crm/doctype/opportunity/opportunity.py
@@ -84,20 +84,31 @@
def on_trash(self):
self.delete_events()
- def has_quotation(self):
- return frappe.db.get_value("Quotation Item", {"prevdoc_docname": self.name, "docstatus": 1})
+ def has_active_quotation(self):
+ return frappe.db.sql("""
+ select q.name
+ from `tabQuotation` q, `tabQuotation Item` qi
+ where q.name = qi.parent and q.docstatus=1 and qi.prevdoc_docname =%s
+ and q.status not in ('Lost', 'Closed')""", self.name)
def has_ordered_quotation(self):
- return frappe.db.sql("""select q.name from `tabQuotation` q, `tabQuotation Item` qi
- where q.name = qi.parent and q.docstatus=1 and qi.prevdoc_docname =%s and q.status = 'Ordered'""", self.name)
+ return frappe.db.sql("""
+ select q.name
+ from `tabQuotation` q, `tabQuotation Item` qi
+ where q.name = qi.parent and q.docstatus=1 and qi.prevdoc_docname =%s
+ and q.status = 'Ordered'""", self.name)
def has_lost_quotation(self):
- return frappe.db.sql("""
+ lost_quotation = frappe.db.sql("""
select q.name
from `tabQuotation` q, `tabQuotation Item` qi
where q.name = qi.parent and q.docstatus=1
and qi.prevdoc_docname =%s and q.status = 'Lost'
""", self.name)
+ if lost_quotation:
+ if self.has_active_quotation():
+ return False
+ return True
def validate_cust_name(self):
if self.customer:
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index b5b24f8..b102e1d 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -44,7 +44,9 @@
def update_opportunity(self):
for opportunity in list(set([d.prevdoc_docname for d in self.get("items")])):
if opportunity:
- frappe.get_doc("Opportunity", opportunity).set_status(update=True)
+ opp = frappe.get_doc("Opportunity", opportunity)
+ opp.status = None
+ opp.set_status(update=True)
def declare_order_lost(self, arg):
if not self.has_sales_order():