feat(Issue): Reset SLA (#18244)
* feat: reset sla
* fix: db.get_single_value
* feat: timeline entry for reset sla
* fix: remove communication from support config
* fix: reset sla on split_issue
diff --git a/erpnext/config/support.py b/erpnext/config/support.py
index 36b4214..151c4f7 100644
--- a/erpnext/config/support.py
+++ b/erpnext/config/support.py
@@ -21,13 +21,7 @@
"type": "doctype",
"name": "Issue Priority",
"description": _("Issue Priority."),
- },
- {
- "type": "doctype",
- "name": "Communication",
- "description": _("Communication log."),
- "onboard": 1,
- },
+ }
]
},
{
diff --git a/erpnext/support/doctype/issue/issue.js b/erpnext/support/doctype/issue/issue.js
index 2d9650c..aec9db9 100644
--- a/erpnext/support/doctype/issue/issue.js
+++ b/erpnext/support/doctype/issue/issue.js
@@ -2,6 +2,12 @@
onload: function(frm) {
frm.email_field = "raised_by";
+ frappe.db.get_value("Support Settings", {name: "Support Settings"}, "allow_resetting_service_level_agreement", (r) => {
+ if (!r.allow_resetting_service_level_agreement) {
+ frm.set_df_property("reset_service_level_agreement", "hidden", 1) ;
+ }
+ });
+
if (frm.doc.service_level_agreement) {
frappe.call({
method: "erpnext.support.doctype.service_level_agreement.service_level_agreement.get_service_level_agreement_filters",
@@ -73,6 +79,42 @@
}
},
+ reset_service_level_agreement: function(frm) {
+ let reset_sla = new frappe.ui.Dialog({
+ title: __("Reset Service Level Agreement"),
+ fields: [
+ {
+ fieldtype: "Data",
+ fieldname: "reason",
+ label: __("Reason"),
+ reqd: 1
+ }
+ ],
+ primary_action_label: __("Reset"),
+ primary_action: (values) => {
+ reset_sla.disable_primary_action();
+ reset_sla.hide();
+ reset_sla.clear();
+
+ frappe.show_alert({
+ indicator: 'green',
+ message: __('Resetting Service Level Agreement.')
+ });
+
+ frm.call("reset_service_level_agreement", {
+ reason: values.reason,
+ user: frappe.session.user_email
+ }, () => {
+ reset_sla.enable_primary_action();
+ frm.refresh();
+ frappe.msgprint(__("Service Level Agreement Reset."));
+ });
+ }
+ });
+
+ reset_sla.show();
+ },
+
timeline_refresh: function(frm) {
// create button for "Help Article"
if(frappe.model.can_create('Help Article')) {
diff --git a/erpnext/support/doctype/issue/issue.json b/erpnext/support/doctype/issue/issue.json
index 72153dc..41fe380 100644
--- a/erpnext/support/doctype/issue/issue.json
+++ b/erpnext/support/doctype/issue/issue.json
@@ -22,10 +22,12 @@
"service_level_agreement",
"response_by",
"response_by_variance",
+ "reset_service_level_agreement",
"cb",
"agreement_fulfilled",
"resolution_by",
"resolution_by_variance",
+ "service_level_agreement_creation",
"response",
"mins_to_first_response",
"first_responded_on",
@@ -68,9 +70,9 @@
"fieldname": "subject",
"fieldtype": "Data",
"in_global_search": 1,
+ "in_standard_filter": 1,
"label": "Subject",
- "reqd": 1,
- "in_standard_filter": 1
+ "reqd": 1
},
{
"fieldname": "customer",
@@ -336,11 +338,24 @@
"fieldtype": "Float",
"label": "Resolution By Variance",
"read_only": 1
+ },
+ {
+ "fieldname": "service_level_agreement_creation",
+ "fieldtype": "Datetime",
+ "hidden": 1,
+ "label": "Service Level Agreement Creation",
+ "read_only": 1
+ },
+ {
+ "depends_on": "eval: doc.service_level_agreement",
+ "fieldname": "reset_service_level_agreement",
+ "fieldtype": "Button",
+ "label": "Reset Service Level Agreement"
}
],
"icon": "fa fa-ticket",
"idx": 7,
- "modified": "2019-06-30 13:19:38.215525",
+ "modified": "2019-07-11 23:57:22.015881",
"modified_by": "Administrator",
"module": "Support",
"name": "Issue",
@@ -365,4 +380,4 @@
"timeline_field": "customer",
"title_field": "subject",
"track_seen": 1
-}
+}
\ No newline at end of file
diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py
index 226676f..ce9fb12 100644
--- a/erpnext/support/doctype/issue/issue.py
+++ b/erpnext/support/doctype/issue/issue.py
@@ -121,6 +121,7 @@
# Reset SLA
if replicated_issue.service_level_agreement:
+ replicated_issue.service_level_agreement_creation = now_datetime()
replicated_issue.service_level_agreement = None
replicated_issue.agreement_fulfilled = "Ongoing"
replicated_issue.response_by = None
@@ -173,8 +174,9 @@
if not self.creation:
self.creation = now_datetime()
+ self.service_level_agreement_creation = now_datetime()
- start_date_time = get_datetime(self.creation)
+ start_date_time = get_datetime(self.service_level_agreement_creation)
self.response_by = get_expected_time_for(parameter='response', service_level=priority, start_date_time=start_date_time)
self.resolution_by = get_expected_time_for(parameter='resolution', service_level=priority, start_date_time=start_date_time)
@@ -193,6 +195,23 @@
self.set_response_and_resolution_time(priority=self.priority, service_level_agreement=self.service_level_agreement)
frappe.msgprint(_("Service Level Agreement has been changed to {0}.").format(self.service_level_agreement))
+ def reset_service_level_agreement(self, reason, user):
+ if not frappe.db.get_single_value("Support Settings", "allow_resetting_service_level_agreement"):
+ frappe.throw(_("Allow Resetting Service Level Agreement from Support Settings."))
+
+ frappe.get_doc({
+ "doctype": "Comment",
+ "comment_type": "Info",
+ "reference_doctype": self.doctype,
+ "reference_name": self.name,
+ "comment_email": user,
+ "content": " resetted Service Level Agreement - {0}".format(_(reason)),
+ }).insert(ignore_permissions=True)
+
+ self.service_level_agreement_creation = now_datetime()
+ self.set_response_and_resolution_time(priority=self.priority, service_level_agreement=self.service_level_agreement)
+ self.save()
+
def get_expected_time_for(parameter, service_level, start_date_time):
current_date_time = start_date_time
expected_time = current_date_time
diff --git a/erpnext/support/doctype/issue/test_issue.py b/erpnext/support/doctype/issue/test_issue.py
index eb1736e..7a5e3e3 100644
--- a/erpnext/support/doctype/issue/test_issue.py
+++ b/erpnext/support/doctype/issue/test_issue.py
@@ -80,7 +80,8 @@
"customer": customer,
"raised_by": "test@example.com",
"description": "Service Level Agreement Issue",
- "creation": creation
+ "creation": creation,
+ "service_level_agreement_creation": creation
}).insert(ignore_permissions=True)
return 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 68b82d1..4a741ea 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
@@ -76,6 +76,7 @@
service_level_agreement = frappe.get_doc({
"doctype": "Service Level Agreement",
+ "enable": 1,
"default_service_level_agreement": default_service_level_agreement,
"service_level": service_level,
"holiday_list": holiday_list,
diff --git a/erpnext/support/doctype/support_settings/support_settings.json b/erpnext/support/doctype/support_settings/support_settings.json
index 2dced15..be9e064 100644
--- a/erpnext/support/doctype/support_settings/support_settings.json
+++ b/erpnext/support/doctype/support_settings/support_settings.json
@@ -6,6 +6,7 @@
"field_order": [
"sb_00",
"track_service_level_agreement",
+ "allow_resetting_service_level_agreement",
"issues_sb",
"close_issue_after_days",
"portal_sb",
@@ -118,10 +119,16 @@
"fieldname": "track_service_level_agreement",
"fieldtype": "Check",
"label": "Track Service Level Agreement"
+ },
+ {
+ "default": "0",
+ "fieldname": "allow_resetting_service_level_agreement",
+ "fieldtype": "Check",
+ "label": "Allow Resetting Service Level Agreement"
}
],
"issingle": 1,
- "modified": "2019-07-09 17:11:38.216732",
+ "modified": "2019-07-10 22:52:39.663873",
"modified_by": "Administrator",
"module": "Support",
"name": "Support Settings",