feat: change sla on the fly
This commit is contained in:
parent
ab596c7236
commit
f77fe313e3
@ -47,8 +47,13 @@ frappe.ui.form.on("Issue", {
|
|||||||
|
|
||||||
priority: function(frm) {
|
priority: function(frm) {
|
||||||
if (frm.doc.service_level_agreement) {
|
if (frm.doc.service_level_agreement) {
|
||||||
frm.call('change_sla_priority', {
|
frappe.show_alert({
|
||||||
"priority": frm.doc.priority
|
indicator: 'green',
|
||||||
|
message: __('Changing Priority.')
|
||||||
|
});
|
||||||
|
frm.call('change_service_level_agreement_and_priority', {
|
||||||
|
"priority": frm.doc.priority,
|
||||||
|
"service_level_agreement": frm.doc.service_level_agreement
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
frappe.msgprint(__("Issue Priority changed to {0}.", [frm.doc.priority]))
|
frappe.msgprint(__("Issue Priority changed to {0}.", [frm.doc.priority]))
|
||||||
frm.refresh();
|
frm.refresh();
|
||||||
@ -56,6 +61,20 @@ frappe.ui.form.on("Issue", {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
service_level_agreement: function(frm) {
|
||||||
|
frappe.show_alert({
|
||||||
|
indicator: 'green',
|
||||||
|
message: __('Changing Service Level Agreement.')
|
||||||
|
});
|
||||||
|
frm.call('change_service_level_agreement_and_priority', {
|
||||||
|
"priority": frm.doc.priority,
|
||||||
|
"service_level_agreement": frm.doc.service_level_agreement
|
||||||
|
}).then(() => {
|
||||||
|
frappe.msgprint(__("Service Level Agreement changed to {0}.", [frm.doc.service_level_agreement]))
|
||||||
|
frm.refresh();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
timeline_refresh: function(frm) {
|
timeline_refresh: function(frm) {
|
||||||
// create button for "Help Article"
|
// create button for "Help Article"
|
||||||
if(frappe.model.can_create('Help Article')) {
|
if(frappe.model.can_create('Help Article')) {
|
||||||
|
|||||||
@ -152,8 +152,7 @@
|
|||||||
"fieldname": "service_level_agreement",
|
"fieldname": "service_level_agreement",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Service Level Agreement",
|
"label": "Service Level Agreement",
|
||||||
"options": "Service Level Agreement",
|
"options": "Service Level Agreement"
|
||||||
"read_only": 1
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "response_by",
|
"fieldname": "response_by",
|
||||||
@ -308,6 +307,7 @@
|
|||||||
"label": "Attachment"
|
"label": "Attachment"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"default": "0",
|
||||||
"fieldname": "via_customer_portal",
|
"fieldname": "via_customer_portal",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Via Customer Portal"
|
"label": "Via Customer Portal"
|
||||||
@ -316,28 +316,28 @@
|
|||||||
"default": "Ongoing",
|
"default": "Ongoing",
|
||||||
"fieldname": "agreement_fulfilled",
|
"fieldname": "agreement_fulfilled",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"label": "Agreement Fulfilled",
|
"label": "Service Level Agreement Fulfilled",
|
||||||
"options": "Ongoing\nFulfilled\nFailed",
|
"options": "Ongoing\nFulfilled\nFailed",
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "in hours",
|
"description": "in hours",
|
||||||
"fieldname": "response_by_variance",
|
"fieldname": "response_by_variance",
|
||||||
"fieldtype": "Int",
|
"fieldtype": "Float",
|
||||||
"label": "Response By Variance",
|
"label": "Response By Variance",
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "in hours",
|
"description": "in hours",
|
||||||
"fieldname": "resolution_by_variance",
|
"fieldname": "resolution_by_variance",
|
||||||
"fieldtype": "Int",
|
"fieldtype": "Float",
|
||||||
"label": "Resolution By Variance",
|
"label": "Resolution By Variance",
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-ticket",
|
"icon": "fa fa-ticket",
|
||||||
"idx": 7,
|
"idx": 7,
|
||||||
"modified": "2019-05-10 22:31:09.391044",
|
"modified": "2019-05-19 11:02:10.962090",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Support",
|
"module": "Support",
|
||||||
"name": "Issue",
|
"name": "Issue",
|
||||||
@ -357,6 +357,7 @@
|
|||||||
],
|
],
|
||||||
"quick_entry": 1,
|
"quick_entry": 1,
|
||||||
"search_fields": "status,customer,subject,raised_by",
|
"search_fields": "status,customer,subject,raised_by",
|
||||||
|
"sort_field": "modified",
|
||||||
"sort_order": "ASC",
|
"sort_order": "ASC",
|
||||||
"timeline_field": "customer",
|
"timeline_field": "customer",
|
||||||
"title_field": "subject",
|
"title_field": "subject",
|
||||||
|
|||||||
@ -130,13 +130,18 @@ class Issue(Document):
|
|||||||
def before_insert(self):
|
def before_insert(self):
|
||||||
self.set_response_and_resolution_time(priority=self.priority)
|
self.set_response_and_resolution_time(priority=self.priority)
|
||||||
|
|
||||||
def set_response_and_resolution_time(self, priority):
|
def set_response_and_resolution_time(self, priority=None, service_level_agreement=None):
|
||||||
service_level_agreement = get_active_service_level_agreement_for(priority=priority, customer=self.customer)
|
service_level_agreement = get_active_service_level_agreement_for(priority=priority,
|
||||||
if service_level_agreement:
|
customer=self.customer, service_level_agreement=service_level_agreement)
|
||||||
self.service_level_agreement = service_level_agreement.name
|
|
||||||
else:
|
if not service_level_agreement:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if service_level_agreement.customer and self.customer and not service_level_agreement.customer == self.customer:
|
||||||
|
frappe.throw(_("This Service Level Agreement is specific to Customer {0}".format(service_level_agreement.customer)))
|
||||||
|
|
||||||
|
self.service_level_agreement = service_level_agreement.name
|
||||||
|
|
||||||
service_level = frappe.get_doc("Service Level", service_level_agreement.service_level)
|
service_level = frappe.get_doc("Service Level", service_level_agreement.service_level)
|
||||||
priority = service_level.get_service_level_priority(priority)
|
priority = service_level.get_service_level_priority(priority)
|
||||||
priority.update({
|
priority.update({
|
||||||
@ -156,8 +161,8 @@ class Issue(Document):
|
|||||||
self.resolution_by_variance = round(time_diff_in_hours(self.resolution_by, now_datetime()))
|
self.resolution_by_variance = round(time_diff_in_hours(self.resolution_by, now_datetime()))
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def change_sla_priority(self, priority):
|
def change_service_level_agreement_and_priority(self, priority, service_level_agreement):
|
||||||
self.set_response_and_resolution_time(priority=priority)
|
self.set_response_and_resolution_time(priority=priority, service_level_agreement=service_level_agreement)
|
||||||
self.save(ignore_permissions=True)
|
self.save(ignore_permissions=True)
|
||||||
|
|
||||||
def get_expected_time_for(parameter, service_level, start_date_time):
|
def get_expected_time_for(parameter, service_level, start_date_time):
|
||||||
@ -241,16 +246,18 @@ def set_service_level_agreement_variance(issue=None):
|
|||||||
filters = {"status": "Open", "agreement_fulfilled": "Ongoing"}
|
filters = {"status": "Open", "agreement_fulfilled": "Ongoing"}
|
||||||
|
|
||||||
if issue:
|
if issue:
|
||||||
filters = {"status": issue}
|
filters = {"name": issue}
|
||||||
|
|
||||||
issues = frappe.get_list("Issue", filters=filters)
|
issues = frappe.get_list("Issue", filters=filters)
|
||||||
for issue in issues:
|
for issue in issues:
|
||||||
doc = frappe.get_doc("Issue", issue.name)
|
doc = frappe.get_doc("Issue", issue.name)
|
||||||
if not doc.first_responded_on and not doc.agreement_fulfilled == "Ongoing":
|
if not doc.first_responded_on:
|
||||||
variance = round(time_diff_in_hours(doc.response_by, now_datetime()))
|
variance = round(time_diff_in_hours(doc.response_by, now_datetime()), 2)
|
||||||
|
print(variance)
|
||||||
frappe.db.set_value("Issue", doc.name, "response_by_variance", variance)
|
frappe.db.set_value("Issue", doc.name, "response_by_variance", variance)
|
||||||
if not doc.resolution_dateand and not doc.agreement_fulfilled == "Ongoing":
|
if not doc.resolution_date:
|
||||||
variance = round(time_diff_in_hours(self.resolution_by, now_datetime()))
|
variance = round(time_diff_in_hours(doc.resolution_by, now_datetime()), 2)
|
||||||
|
print(variance)
|
||||||
frappe.db.set_value("Issue", doc.name, "resolution_by_variance", variance)
|
frappe.db.set_value("Issue", doc.name, "resolution_by_variance", variance)
|
||||||
|
|
||||||
def get_list_context(context=None):
|
def get_list_context(context=None):
|
||||||
|
|||||||
@ -26,13 +26,4 @@ frappe.ui.form.on('Service Level Agreement', {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
validate: function(frm) {
|
|
||||||
frm.doc.sla_name = null;
|
|
||||||
var sla_name = 'Default Service Level Agreement';
|
|
||||||
if (frm.doc.customer){
|
|
||||||
sla_name = frm.doc.customer;
|
|
||||||
}
|
|
||||||
frm.doc.sla_name = sla_name;
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"autoname": "format:SLA-{sla_name}",
|
"autoname": "format:SLA-{service_level_agreement_name}",
|
||||||
"creation": "2018-12-26 21:08:15.448812",
|
"creation": "2018-12-26 21:08:15.448812",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"editable_grid": 1,
|
"editable_grid": 1,
|
||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"field_order": [
|
"field_order": [
|
||||||
"sla_name",
|
"service_level_agreement_name",
|
||||||
"customer",
|
"customer",
|
||||||
"default_service_level_agreement",
|
"default_service_level_agreement",
|
||||||
"holiday_list",
|
"holiday_list",
|
||||||
@ -17,6 +17,7 @@
|
|||||||
"agreement_status",
|
"agreement_status",
|
||||||
"column_break_7",
|
"column_break_7",
|
||||||
"end_date",
|
"end_date",
|
||||||
|
"ignore_start_and_end_date",
|
||||||
"response_and_resolution_time_section",
|
"response_and_resolution_time_section",
|
||||||
"priorities",
|
"priorities",
|
||||||
"support_and_resolution_section_break",
|
"support_and_resolution_section_break",
|
||||||
@ -33,6 +34,7 @@
|
|||||||
"set_only_once": 1
|
"set_only_once": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"default": "0",
|
||||||
"depends_on": "eval: !doc.customer",
|
"depends_on": "eval: !doc.customer",
|
||||||
"fieldname": "default_service_level_agreement",
|
"fieldname": "default_service_level_agreement",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
@ -75,7 +77,7 @@
|
|||||||
"label": "Agreement Details"
|
"label": "Agreement Details"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"depends_on": "eval: !doc.default_service_level_agreement",
|
"depends_on": "eval: !doc.default_service_level_agreement && !doc.ignore_start_and_end_date",
|
||||||
"fieldname": "start_date",
|
"fieldname": "start_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"label": "Start Date"
|
"label": "Start Date"
|
||||||
@ -94,7 +96,7 @@
|
|||||||
"fieldtype": "Column Break"
|
"fieldtype": "Column Break"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"depends_on": "eval: !doc.default_service_level_agreement",
|
"depends_on": "eval: !doc.default_service_level_agreement && !doc.ignore_start_and_end_date",
|
||||||
"fieldname": "end_date",
|
"fieldname": "end_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"label": "End Date"
|
"label": "End Date"
|
||||||
@ -124,14 +126,21 @@
|
|||||||
"options": "Service Level Priority"
|
"options": "Service Level Priority"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "sla_name",
|
"fieldname": "service_level_agreement_name",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"label": "Service Level Agreement Name",
|
"label": "Service Level Agreement Name",
|
||||||
"read_only": 1,
|
"reqd": 1,
|
||||||
"unique": 1
|
"unique": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "ignore_start_and_end_date",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Ignore Start and End Date",
|
||||||
|
"set_only_once": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"modified": "2019-05-06 22:00:44.623128",
|
"modified": "2019-05-19 09:41:55.498800",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Support",
|
"module": "Support",
|
||||||
"name": "Service Level Agreement",
|
"name": "Service Level Agreement",
|
||||||
|
|||||||
@ -10,20 +10,17 @@ from frappe import _
|
|||||||
class ServiceLevelAgreement(Document):
|
class ServiceLevelAgreement(Document):
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
if not (self.customer or self.default_service_level_agreement):
|
|
||||||
frappe.throw(_("Select a Customer or set as Default Service Level Agreement."))
|
|
||||||
|
|
||||||
if self.default_service_level_agreement:
|
if self.default_service_level_agreement:
|
||||||
if frappe.db.exists("Service Level Agreement", {"default_service_level_agreement": "1", "name": ["!=", self.name]}):
|
if frappe.db.exists("Service Level Agreement", {"default_service_level_agreement": "1", "name": ["!=", self.name]}):
|
||||||
frappe.throw(_("A Default Service Level Agreement already exists."))
|
frappe.throw(_("A Default Service Level Agreement already exists."))
|
||||||
else:
|
else:
|
||||||
if not (self.start_date and self.end_date):
|
if not (self.start_date and self.end_date and self.ignore_start_and_end_date):
|
||||||
frappe.throw(_("Enter Start and End Date for the Agreement."))
|
frappe.throw(_("Enter Start and End Date for the Agreement."))
|
||||||
|
|
||||||
if self.start_date >= self.end_date:
|
if self.start_date >= self.end_date and not self.ignore_start_and_end_date:
|
||||||
frappe.throw(_("Start Date of Agreement can't be greater than or equal to End Date."))
|
frappe.throw(_("Start Date of Agreement can't be greater than or equal to End Date."))
|
||||||
|
|
||||||
if self.end_date < frappe.utils.getdate():
|
if self.end_date < frappe.utils.nowdate() and not self.ignore_start_and_end_date:
|
||||||
frappe.throw(_("End Date of Agreement can't be less than today."))
|
frappe.throw(_("End Date of Agreement can't be less than today."))
|
||||||
|
|
||||||
def check_agreement_status():
|
def check_agreement_status():
|
||||||
@ -38,14 +35,16 @@ def check_agreement_status():
|
|||||||
"agreement_status", "Expired")
|
"agreement_status", "Expired")
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_active_service_level_agreement_for(priority, customer=None):
|
def get_active_service_level_agreement_for(priority, customer=None, service_level_agreement=None):
|
||||||
|
|
||||||
if customer and frappe.db.exists("Service Level Agreement", {"customer": customer}):
|
if customer and frappe.db.exists("Service Level Agreement", {"customer": customer}) and not service_level_agreement:
|
||||||
or_filter = {"customer": customer}
|
or_filter = {"customer": customer}
|
||||||
|
elif service_level_agreement:
|
||||||
|
or_filter = {"name": service_level_agreement}
|
||||||
else:
|
else:
|
||||||
or_filter = {"default_service_level_agreement": 1}
|
or_filter = {"default_service_level_agreement": 1}
|
||||||
|
|
||||||
agreement = frappe.get_list("Service Level Agreement", filters={"agreement_status": "Active"},
|
agreement = frappe.get_list("Service Level Agreement", filters={"agreement_status": "Active"},
|
||||||
or_filters=or_filter, fields=["name", "service_level"])
|
or_filters=or_filter, fields=["name", "service_level", "customer"])
|
||||||
|
|
||||||
return agreement[0] if agreement else None
|
return agreement[0] if agreement else None
|
||||||
Loading…
x
Reference in New Issue
Block a user