diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement.js b/erpnext/support/doctype/service_level_agreement/service_level_agreement.js index bfbffe22ad7..4dbb0e7e86f 100644 --- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.js +++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.js @@ -111,6 +111,7 @@ frappe.ui.form.on('Service Level Agreement', { filters: [ ['DocType', 'issingle', '=', 0], ['DocType', 'istable', '=', 0], + ['DocType', 'is_submittable', '=', 0], ['DocType', 'name', 'not in', invalid_doctypes], ['DocType', 'module', 'not in', ["Email", "Core", "Custom", "Event Streaming", "Social", "Data Migration", "Geo", "Desk"]] ] diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py index ea617fd1eb5..de8f5067878 100644 --- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py +++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py @@ -29,6 +29,7 @@ from erpnext.support.doctype.issue.issue import get_holidays class ServiceLevelAgreement(Document): def validate(self): + self.validate_selected_doctype() self.validate_doc() self.validate_status_field() self.check_priorities() @@ -106,6 +107,23 @@ class ServiceLevelAgreement(Document): frappe.throw(_("Service Level Agreement for {0} {1} already exists.").format( frappe.bold(self.entity_type), frappe.bold(self.entity))) + def validate_selected_doctype(self): + invalid_doctypes = list(frappe.model.core_doctypes_list) + invalid_doctypes.extend(['Cost Center', 'Company']) + valid_document_types = frappe.get_all('DocType', { + 'issingle': 0, + 'istable': 0, + 'is_submittable': 0, + 'name': ['not in', invalid_doctypes], + 'module': ['not in', ["Email", "Core", "Custom", "Event Streaming", "Social", "Data Migration", "Geo", "Desk"]] + }, pluck="name") + + if self.document_type not in valid_document_types: + frappe.throw( + msg=_("Please select valid document type."), + title=_("Invalid Document Type") + ) + def validate_status_field(self): meta = frappe.get_meta(self.document_type) if not meta.get_field("status"): @@ -247,9 +265,15 @@ def get_active_service_level_agreement_for(doc): ] customer = doc.get('customer') - or_filters.append( - ["Service Level Agreement", "entity", "in", [customer] + get_customer_group(customer) + get_customer_territory(customer)] - ) + if customer: + or_filters.extend([ + ["Service Level Agreement", "entity", "in", [customer] + get_customer_group(customer) + get_customer_territory(customer)], + ["Service Level Agreement", "entity_type", "is", "not set"] + ]) + else: + or_filters.append( + ["Service Level Agreement", "entity_type", "is", "not set"] + ) default_sla_filter = filters + [["Service Level Agreement", "default_service_level_agreement", "=", 1]] default_sla = frappe.get_all("Service Level Agreement", filters=default_sla_filter, @@ -361,11 +385,18 @@ def apply(doc, method=None): sla = get_active_service_level_agreement_for(doc) if not sla: + remove_sla_if_applied(doc) return process_sla(doc, sla) +def remove_sla_if_applied(doc): + doc.service_level_agreement = None + doc.response_by = None + doc.resolution_by = None + + def process_sla(doc, sla): if not doc.creation: diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement_dashboard.py b/erpnext/support/doctype/service_level_agreement/service_level_agreement_dashboard.py deleted file mode 100644 index 22e2c374e12..00000000000 --- a/erpnext/support/doctype/service_level_agreement/service_level_agreement_dashboard.py +++ /dev/null @@ -1,13 +0,0 @@ -from frappe import _ - - -def get_data(): - return { - 'fieldname': 'service_level_agreement', - 'transactions': [ - { - 'label': _('Issue'), - 'items': ['Issue'] - } - ] - } diff --git a/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py b/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py index b07c862c7b0..a34124fba20 100644 --- a/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py +++ b/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py @@ -244,6 +244,13 @@ class TestServiceLevelAgreement(unittest.TestCase): applied_sla = frappe.db.get_value('Lead', lead.name, 'service_level_agreement') self.assertEqual(applied_sla, lead_sla.name) + # check if SLA is removed if condition fails + lead.reload() + lead.source = None + lead.save() + applied_sla = frappe.db.get_value('Lead', lead.name, 'service_level_agreement') + self.assertFalse(applied_sla) + def tearDown(self): for d in frappe.get_all("Service Level Agreement"): frappe.delete_doc("Service Level Agreement", d.name, force=1)