fix: commonify SLA and Service Level Doctypes
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 1d486f4..7aeaae4 100644
--- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.js
+++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.js
@@ -2,28 +2,5 @@
// For license information, please see license.txt
frappe.ui.form.on('Service Level Agreement', {
- service_level: function(frm) {
- frm.fields_dict.support_and_resolution.grid.remove_all();
- frappe.call({
- "method": "frappe.client.get",
- args: {
- doctype: "Service Level",
- name: frm.doc.service_level
- },
- callback: function(data){
- let count = Math.max(data.message.priorities.length, data.message.support_and_resolution.length);
- let i = 0;
- while (i < count){
- if (data.message.priorities[i]) {
- frm.add_child("priorities", data.message.priorities[i]);
- }
- if (data.message.support_and_resolution[i]) {
- frm.add_child("support_and_resolution", data.message.support_and_resolution[i]);
- }
- i++;
- }
- frm.refresh();
- }
- });
- },
+
});
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 9a83ca7..3725e15 100644
--- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.json
+++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.json
@@ -1,4 +1,5 @@
{
+ "actions": [],
"autoname": "format:SLA-{service_level}-{####}",
"creation": "2018-12-26 21:08:15.448812",
"doctype": "DocType",
@@ -6,12 +7,12 @@
"engine": "InnoDB",
"field_order": [
"enable",
+ "section_break_2",
"service_level",
"default_service_level_agreement",
- "holiday_list",
"column_break_2",
"employee_group",
- "default_priority",
+ "holiday_list",
"entity_section",
"entity_type",
"column_break_10",
@@ -28,42 +29,30 @@
],
"fields": [
{
- "default": "0",
- "depends_on": "eval: !doc.customer;",
- "fieldname": "default_service_level_agreement",
- "fieldtype": "Check",
- "label": "Default Service Level Agreement"
- },
- {
"fieldname": "service_level",
- "fieldtype": "Link",
+ "fieldtype": "Data",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Service Level",
- "options": "Service Level",
"reqd": 1
},
{
- "fetch_from": "service_level.holiday_list",
"fieldname": "holiday_list",
"fieldtype": "Link",
"label": "Holiday List",
- "options": "Holiday List",
- "read_only": 1
+ "options": "Holiday List"
},
{
"fieldname": "column_break_2",
"fieldtype": "Column Break"
},
{
- "fetch_from": "service_level.employee_group",
"fieldname": "employee_group",
"fieldtype": "Link",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Employee Group",
- "options": "Employee Group",
- "read_only": 1
+ "options": "Employee Group"
},
{
"fieldname": "agreement_details_section",
@@ -112,14 +101,6 @@
"options": "Service Level Priority"
},
{
- "fetch_from": "service_level.default_priority",
- "fieldname": "default_priority",
- "fieldtype": "Link",
- "label": "Default Priority",
- "options": "Issue Priority",
- "read_only": 1
- },
- {
"default": "1",
"fieldname": "active",
"fieldtype": "Check",
@@ -156,9 +137,20 @@
"fieldname": "enable",
"fieldtype": "Check",
"label": "Enable"
+ },
+ {
+ "fieldname": "section_break_2",
+ "fieldtype": "Section Break"
+ },
+ {
+ "default": "0",
+ "fieldname": "default_service_level_agreement",
+ "fieldtype": "Check",
+ "label": "Default Service Level Agreement"
}
],
- "modified": "2019-07-09 17:22:16.402939",
+ "links": [],
+ "modified": "2020-04-28 14:10:18.767202",
"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 a399c58..9fa0e23 100644
--- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
+++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
@@ -6,11 +6,85 @@
import frappe
from frappe.model.document import Document
from frappe import _
-from frappe.utils import getdate
+from frappe.utils import getdate, get_weekdays
+from datetime import datetime
class ServiceLevelAgreement(Document):
def validate(self):
+ self.validate_doc()
+ self.check_priorities()
+ self.check_support_and_resolution()
+
+ def check_priorities(self):
+ default_priority = []
+ priorities = []
+
+ for priority in self.priorities:
+ # Check if response and resolution time is set for every priority
+ if not (priority.response_time or priority.resolution_time):
+ frappe.throw(_("Set Response Time and Resolution for Priority {0} at index {1}.").format(priority.priority, priority.idx))
+
+ 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
+ elif priority.response_time_period == "Day":
+ response = priority.response_time
+ elif priority.response_time_period == "Week":
+ response = priority.response_time * 7
+
+ if priority.resolution_time_period == "Hour":
+ resolution = priority.resolution_time * 0.0416667
+ elif priority.resolution_time_period == "Day":
+ resolution = priority.resolution_time
+ elif priority.resolution_time_period == "Week":
+ resolution = priority.resolution_time * 7
+
+ if response > resolution:
+ frappe.throw(_("Response Time for {0} at index {1} can't be greater than Resolution Time.").format(priority.priority, priority.idx))
+
+ # Check if repeated priority
+ if not len(set(priorities)) == len(priorities):
+ 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
+ try:
+ self.default_priority = next(d.priority for d in self.priorities if d.default_priority)
+ except Exception:
+ frappe.throw(_("Select a Default Priority."))
+
+ def check_support_and_resolution(self):
+ week = get_weekdays()
+ support_days = []
+
+ for support_and_resolution in self.support_and_resolution:
+ # Check if start and end time is set for every support day
+ if not (support_and_resolution.start_time or support_and_resolution.end_time):
+ frappe.throw(_("Set Start Time and End Time for \
+ Support Day {0} at index {1}.".format(support_and_resolution.workday, support_and_resolution.idx)))
+
+ support_days.append(support_and_resolution.workday)
+ support_and_resolution.idx = week.index(support_and_resolution.workday) + 1
+
+ if support_and_resolution.start_time >= support_and_resolution.end_time:
+ frappe.throw(_("Start Time can't be greater than or equal to End Time \
+ for {0}.".format(support_and_resolution.workday)))
+
+ # Check for repeated workday
+ if not len(set(support_days)) == len(support_days):
+ repeated_days = get_repeated(support_days)
+ frappe.throw(_("Workday {0} has been repeated.").format(repeated_days))
+
+ def validate_doc(self):
if not frappe.db.get_single_value("Support Settings", "track_service_level_agreement"):
frappe.throw(_("Service Level Agreement tracking is not enabled."))
@@ -110,4 +184,15 @@
return {
"priority": [priority.priority for priority in frappe.get_list("Service Level Priority", filters={"parent": name}, fields=["priority"])],
"service_level_agreements": [d.name for d in frappe.get_list("Service Level Agreement", filters=filters, or_filters=or_filters)]
- }
\ No newline at end of file
+ }
+
+def get_repeated(values):
+ unique_list = []
+ diff = []
+ for value in values:
+ if value not in unique_list:
+ unique_list.append(str(value))
+ else:
+ if value not in diff:
+ diff.append(str(value))
+ return " ".join(diff)
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 cd87a1c..f56008e 100644
--- a/erpnext/support/doctype/service_level_priority/service_level_priority.json
+++ b/erpnext/support/doctype/service_level_priority/service_level_priority.json
@@ -1,4 +1,5 @@
{
+ "actions": [],
"creation": "2019-05-04 05:54:03.658991",
"doctype": "DocType",
"editable_grid": 1,
@@ -16,7 +17,7 @@
],
"fields": [
{
- "columns": 2,
+ "columns": 1,
"fieldname": "priority",
"fieldtype": "Link",
"in_list_view": 1,
@@ -28,14 +29,7 @@
"fieldtype": "Section Break"
},
{
- "columns": 1,
- "fieldname": "response_time",
- "fieldtype": "Int",
- "in_list_view": 1,
- "label": "Response Time"
- },
- {
- "columns": 1,
+ "columns": 2,
"fieldname": "resolution_time",
"fieldtype": "Int",
"in_list_view": 1,
@@ -66,15 +60,24 @@
"fieldtype": "Column Break"
},
{
+ "columns": 1,
"default": "0",
"fieldname": "default_priority",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Default Priority"
+ },
+ {
+ "columns": 2,
+ "fieldname": "response_time",
+ "fieldtype": "Int",
+ "in_list_view": 1,
+ "label": "First Response Time"
}
],
"istable": 1,
- "modified": "2019-05-21 06:54:42.674377",
+ "links": [],
+ "modified": "2020-04-24 14:50:13.774308",
"modified_by": "Administrator",
"module": "Support",
"name": "Service Level Priority",
diff --git a/erpnext/support/doctype/support_settings/support_settings.json b/erpnext/support/doctype/support_settings/support_settings.json
index be9e064..3f52181 100644
--- a/erpnext/support/doctype/support_settings/support_settings.json
+++ b/erpnext/support/doctype/support_settings/support_settings.json
@@ -1,4 +1,5 @@
{
+ "actions": [],
"creation": "2017-02-17 13:07:35.686409",
"doctype": "DocType",
"editable_grid": 1,
@@ -128,7 +129,8 @@
}
],
"issingle": 1,
- "modified": "2019-07-10 22:52:39.663873",
+ "links": [],
+ "modified": "2020-04-28 14:11:15.117019",
"modified_by": "Administrator",
"module": "Support",
"name": "Support Settings",