From 323ea2d33acff1ca138cb2e3889a2b2ea2cd63ee Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Tue, 21 May 2019 22:39:42 +0530 Subject: [PATCH] feat: change SLA as well as priorities --- erpnext/support/doctype/issue/issue.py | 13 +++---- .../doctype/service_level/service_level.json | 22 ++++++++++- .../doctype/service_level/service_level.py | 30 ++++++--------- .../service_level_agreement.json | 22 +++++++++-- .../service_level_agreement.py | 37 ++++++++++++++----- .../service_level_priority.json | 7 ++-- 6 files changed, 90 insertions(+), 41 deletions(-) diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py index deeb8ae845..c50a288330 100644 --- a/erpnext/support/doctype/issue/issue.py +++ b/erpnext/support/doctype/issue/issue.py @@ -128,9 +128,7 @@ class Issue(Document): return replicated_issue.name def before_insert(self): - if not self.priority: - self.priority = frappe.db.get_value("Issue Priority", {"default_priority": 1}) - self.set_response_and_resolution_time(priority=self.priority) + self.set_response_and_resolution_time() def set_response_and_resolution_time(self, priority=None, service_level_agreement=None): service_level_agreement = get_active_service_level_agreement_for(priority=priority, @@ -143,12 +141,13 @@ class Issue(Document): frappe.throw(_("This Service Level Agreement is specific to Customer {0}".format(service_level_agreement.customer))) self.service_level_agreement = service_level_agreement.name + self.priority = service_level_agreement.default_priority if not priority else priority - service_level = frappe.get_doc("Service Level", service_level_agreement.service_level) - priority = service_level.get_service_level_priority(priority) + service_level_agreement = frappe.get_doc("Service Level Agreement", service_level_agreement.name) + priority = service_level_agreement.get_service_level_agreement_priority(self.priority) priority.update({ - "support_and_resolution": service_level.support_and_resolution, - "holiday_list": service_level.holiday_list + "support_and_resolution": service_level_agreement.support_and_resolution, + "holiday_list": service_level_agreement.holiday_list }) if not self.creation: diff --git a/erpnext/support/doctype/service_level/service_level.json b/erpnext/support/doctype/service_level/service_level.json index 6718514712..71e12c04ce 100644 --- a/erpnext/support/doctype/service_level/service_level.json +++ b/erpnext/support/doctype/service_level/service_level.json @@ -9,6 +9,7 @@ "employee_group", "column_break_2", "holiday_list", + "default_priority", "response_and_resoution_time", "priorities", "section_break_01", @@ -65,9 +66,16 @@ "label": "Priorities", "options": "Service Level Priority", "reqd": 1 + }, + { + "fieldname": "default_priority", + "fieldtype": "Link", + "label": "Default Priority", + "options": "Issue Priority", + "read_only": 1 } ], - "modified": "2019-05-05 19:29:56.975951", + "modified": "2019-05-21 20:53:11.731727", "modified_by": "Administrator", "module": "Support", "name": "Service Level", @@ -84,6 +92,18 @@ "role": "System Manager", "share": 1, "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "share": 1, + "write": 1 } ], "sort_field": "modified", diff --git a/erpnext/support/doctype/service_level/service_level.py b/erpnext/support/doctype/service_level/service_level.py index a968ffeec6..857a21614c 100644 --- a/erpnext/support/doctype/service_level/service_level.py +++ b/erpnext/support/doctype/service_level/service_level.py @@ -12,7 +12,6 @@ from frappe.utils import get_weekdays class ServiceLevel(Document): def validate(self): - self.check_default_priority() self.check_priorities() self.check_support_and_resolution() @@ -26,7 +25,9 @@ class ServiceLevel(Document): frappe.throw(_("Set Response Time and Resolution for Priority {0} at index {1}.".format(priority.priority, priority.idx))) priorities.append(priority.priority) - #priorities.append(priority.priority) + + if priority.default_priority: + default_priority.append(priority.default_priority) if priority.response_time_period == "Hour": response = priority.response_time * 0.0416667 @@ -50,6 +51,13 @@ class ServiceLevel(Document): repeated_priority = get_repeated(priorities) frappe.throw(_("Priority {0} has been repeated.".format(repeated_priority))) + # Check if repeated default priority + if not len(set(default_priority)) == len(default_priority): + frappe.throw(_("Select only one Priority as Default.")) + + # set default priority from priorities + self.default_priority = next(d.priority for d in self.priorities if d.default_priority) + def check_support_and_resolution(self): week = get_weekdays() support_days = [] @@ -72,27 +80,13 @@ class ServiceLevel(Document): repeated_days = get_repeated(support_days) frappe.throw(_("Workday {0} has been repeated.".format(repeated_days))) - def get_service_level_priority(self, priority): - priority = frappe.get_doc("Service Level Priority", {"priority": priority, "parent": self.name}) - - if priority: - return frappe._dict({ - "priority": priority.priority, - "response_time": priority.response_time, - "response_time_period": priority.response_time_period, - "resolution_time": priority.resolution_time, - "resolution_time_period": priority.resolution_time_period - }) - else: - frappe.throw(_("Service Level {0} doesn't have Priority {1}.".format(self.name, priority))) - def get_repeated(values): unique_list = [] diff = [] for value in values: if value not in unique_list: - unique_list.append(value) + unique_list.append(str(value)) else: if value not in diff: - diff.append(value) + diff.append(str(value)) return " ".join(diff) diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement.json b/erpnext/support/doctype/service_level_agreement/service_level_agreement.json index fb7b4ea49b..b3166f0002 100644 --- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.json +++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.json @@ -8,10 +8,12 @@ "service_level_agreement_name", "customer", "default_service_level_agreement", + "ignore_customer_and_default_sla", "holiday_list", "column_break_2", "service_level", "employee_group", + "default_priority", "agreement_details_section", "start_date", "agreement_status", @@ -25,7 +27,7 @@ ], "fields": [ { - "depends_on": "eval: !doc.default_service_level_agreement", + "depends_on": "eval: !doc.default_service_level_agreement;\neval: !doc.ignore_customer_and_default_sla;", "fieldname": "customer", "fieldtype": "Link", "in_list_view": 1, @@ -35,7 +37,7 @@ }, { "default": "0", - "depends_on": "eval: !doc.customer", + "depends_on": "eval: !doc.customer;\neval: !doc.ignore_customer_and_default_sla;", "fieldname": "default_service_level_agreement", "fieldtype": "Check", "in_list_view": 1, @@ -139,9 +141,23 @@ "fieldtype": "Check", "label": "Ignore Start and End Date", "set_only_once": 1 + }, + { + "fetch_from": "service_level.default_priority", + "fieldname": "default_priority", + "fieldtype": "Link", + "label": "Default Priority", + "options": "Issue Priority", + "read_only": 1 + }, + { + "default": "0", + "fieldname": "ignore_customer_and_default_sla", + "fieldtype": "Check", + "label": "Ignore Customer and Default SLA" } ], - "modified": "2019-05-20 15:36:00.326471", + "modified": "2019-05-21 21:53:12.686806", "modified_by": "Administrator", "module": "Support", "name": "Service Level Agreement", 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 11c510f7f8..61c6cac1f2 100644 --- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py +++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py @@ -23,6 +23,17 @@ class ServiceLevelAgreement(Document): if not self.ignore_start_and_end_date and self.end_date < frappe.utils.getdate(): frappe.throw(_("End Date of Agreement can't be less than today.")) + def get_service_level_agreement_priority(self, priority): + priority = frappe.get_doc("Service Level Priority", {"priority": priority, "parent": self.name}) + + return frappe._dict({ + "priority": priority.priority, + "response_time": priority.response_time, + "response_time_period": priority.response_time_period, + "resolution_time": priority.resolution_time, + "resolution_time_period": priority.resolution_time_period + }) + def check_agreement_status(): service_level_agreements = frappe.get_list("Service Level Agreement", filters=[ {"agreement_status": "Active"}, @@ -34,17 +45,25 @@ def check_agreement_status(): frappe.db.set_value("Service Level Agreement", service_level_agreement.name, "agreement_status", "Expired") -@frappe.whitelist() def get_active_service_level_agreement_for(priority, customer=None, service_level_agreement=None): + filters = [ + ["Service Level Agreement", "agreement_status", "=", "Active"] + ] - if customer and frappe.db.exists("Service Level Agreement", {"customer": customer}) and not service_level_agreement: - or_filter = {"customer": customer} - elif service_level_agreement: - or_filter = {"name": service_level_agreement} - else: - or_filter = {"default_service_level_agreement": 1} + if priority: + filters.append(["Service Level Priority", "priority", "=", priority]) - agreement = frappe.get_list("Service Level Agreement", filters={"agreement_status": "Active"}, - or_filters=or_filter, fields=["name", "service_level", "customer"]) + or_filters = [ + ["Service Level Agreement", "customer", "=", customer], + ] + if service_level_agreement: + or_filters = [ + ["Service Level Agreement", "name", "=", service_level_agreement], + ] + + or_filters.append(["Service Level Agreement", "default_service_level_agreement", "=", 1]) + + agreement = frappe.get_list("Service Level Agreement", filters=filters, or_filters=or_filters, + fields=["name", "default_priority", "customer"], debug=True) return agreement[0] if agreement else None \ No newline at end of file diff --git a/erpnext/support/doctype/service_level_priority/service_level_priority.json b/erpnext/support/doctype/service_level_priority/service_level_priority.json index fae225c8d6..cd87a1c113 100644 --- a/erpnext/support/doctype/service_level_priority/service_level_priority.json +++ b/erpnext/support/doctype/service_level_priority/service_level_priority.json @@ -28,14 +28,14 @@ "fieldtype": "Section Break" }, { - "columns": 2, + "columns": 1, "fieldname": "response_time", "fieldtype": "Int", "in_list_view": 1, "label": "Response Time" }, { - "columns": 2, + "columns": 1, "fieldname": "resolution_time", "fieldtype": "Int", "in_list_view": 1, @@ -69,11 +69,12 @@ "default": "0", "fieldname": "default_priority", "fieldtype": "Check", + "in_list_view": 1, "label": "Default Priority" } ], "istable": 1, - "modified": "2019-05-20 17:10:43.687547", + "modified": "2019-05-21 06:54:42.674377", "modified_by": "Administrator", "module": "Support", "name": "Service Level Priority",