feat: dynamic conditions for applying SLA (#26662)
This commit is contained in:
parent
15df0ad6a0
commit
fbc163cea6
@ -181,11 +181,6 @@
|
|||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Apply SLA for Resolution Time"
|
"label": "Apply SLA for Resolution Time"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"label": "Pause SLA On",
|
|
||||||
"fieldname": "pause_sla_on",
|
|
||||||
"options": "Pause SLA On Status"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"fieldname": "filters_section",
|
"fieldname": "filters_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
@ -208,7 +203,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-07-09 12:28:46.283334",
|
"modified": "2021-07-27 11:16:45.596579",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Support",
|
"module": "Support",
|
||||||
"name": "Service Level Agreement",
|
"name": "Service Level Agreement",
|
||||||
|
@ -11,6 +11,7 @@ from frappe.core.utils import get_parent_doc
|
|||||||
from frappe.utils import time_diff_in_seconds, getdate, get_weekdays, add_to_date, get_time, get_datetime, \
|
from frappe.utils import time_diff_in_seconds, getdate, get_weekdays, add_to_date, get_time, get_datetime, \
|
||||||
get_time_zone, to_timedelta, get_datetime_str, get_link_to_form, cint, nowdate
|
get_time_zone, to_timedelta, get_datetime_str, get_link_to_form, cint, nowdate
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from frappe.utils.safe_exec import get_safe_globals
|
||||||
from erpnext.support.doctype.issue.issue import get_holidays
|
from erpnext.support.doctype.issue.issue import get_holidays
|
||||||
from frappe.utils.safe_exec import get_safe_globals
|
from frappe.utils.safe_exec import get_safe_globals
|
||||||
|
|
||||||
@ -100,7 +101,7 @@ class ServiceLevelAgreement(Document):
|
|||||||
frappe.bold(self.document_type)))
|
frappe.bold(self.document_type)))
|
||||||
|
|
||||||
def validate_condition(self):
|
def validate_condition(self):
|
||||||
temp_doc = frappe.new_doc('Issue')
|
temp_doc = frappe.new_doc(self.document_type)
|
||||||
if self.condition:
|
if self.condition:
|
||||||
try:
|
try:
|
||||||
frappe.safe_eval(self.condition, None, get_context(temp_doc))
|
frappe.safe_eval(self.condition, None, get_context(temp_doc))
|
||||||
@ -227,24 +228,25 @@ def get_active_service_level_agreement_for(doc):
|
|||||||
if doc.get('priority'):
|
if doc.get('priority'):
|
||||||
filters.append(["Service Level Priority", "priority", "=", doc.get('priority')])
|
filters.append(["Service Level Priority", "priority", "=", doc.get('priority')])
|
||||||
|
|
||||||
customer = doc.get('customer')
|
or_filters = []
|
||||||
or_filters = [
|
if doc.get('service_level_agreement'):
|
||||||
["Service Level Agreement", "entity", "in", [customer, get_customer_group(customer), get_customer_territory(customer)]]
|
|
||||||
]
|
|
||||||
|
|
||||||
service_level_agreement = doc.get('service_level_agreement')
|
|
||||||
if service_level_agreement:
|
|
||||||
or_filters = [
|
or_filters = [
|
||||||
["Service Level Agreement", "name", "=", doc.get('service_level_agreement')],
|
["Service Level Agreement", "name", "=", doc.get('service_level_agreement')],
|
||||||
]
|
]
|
||||||
|
|
||||||
|
customer = doc.get('customer')
|
||||||
|
if customer:
|
||||||
|
or_filters.append(
|
||||||
|
["Service Level Agreement", "entity", "in", [customer, get_customer_group(customer), get_customer_territory(customer)]]
|
||||||
|
)
|
||||||
|
|
||||||
default_sla_filter = filters + [["Service Level Agreement", "default_service_level_agreement", "=", 1]]
|
default_sla_filter = filters + [["Service Level Agreement", "default_service_level_agreement", "=", 1]]
|
||||||
default_sla = frappe.get_all("Service Level Agreement", filters=default_sla_filter,
|
default_sla = frappe.get_all("Service Level Agreement", filters=default_sla_filter,
|
||||||
fields=["name", "default_priority", "condition"])
|
fields=["name", "default_priority", "apply_sla_for_resolution", "condition"])
|
||||||
|
|
||||||
filters += [["Service Level Agreement", "default_service_level_agreement", "=", 0]]
|
filters += [["Service Level Agreement", "default_service_level_agreement", "=", 0]]
|
||||||
agreements = frappe.get_all("Service Level Agreement", filters=filters, or_filters=or_filters,
|
agreements = frappe.get_all("Service Level Agreement", filters=filters, or_filters=or_filters,
|
||||||
fields=["name", "default_priority", "condition"])
|
fields=["name", "default_priority", "apply_sla_for_resolution", "condition"])
|
||||||
|
|
||||||
# check if the current document on which SLA is to be applied fulfills all the conditions
|
# check if the current document on which SLA is to be applied fulfills all the conditions
|
||||||
filtered_agreements = []
|
filtered_agreements = []
|
||||||
@ -261,7 +263,6 @@ def get_active_service_level_agreement_for(doc):
|
|||||||
def get_context(doc):
|
def get_context(doc):
|
||||||
return {"doc": doc.as_dict(), "nowdate": nowdate, "frappe": frappe._dict(utils=get_safe_globals().get("frappe").get("utils"))}
|
return {"doc": doc.as_dict(), "nowdate": nowdate, "frappe": frappe._dict(utils=get_safe_globals().get("frappe").get("utils"))}
|
||||||
|
|
||||||
|
|
||||||
def get_customer_group(customer):
|
def get_customer_group(customer):
|
||||||
return frappe.db.get_value("Customer", customer, "customer_group") if customer else None
|
return frappe.db.get_value("Customer", customer, "customer_group") if customer else None
|
||||||
|
|
||||||
|
@ -253,6 +253,26 @@ class TestServiceLevelAgreement(unittest.TestCase):
|
|||||||
lead.reload()
|
lead.reload()
|
||||||
self.assertEqual(lead.response_by_variance, 1800.0)
|
self.assertEqual(lead.response_by_variance, 1800.0)
|
||||||
|
|
||||||
|
def test_service_level_agreement_filters(self):
|
||||||
|
doctype = "Lead"
|
||||||
|
lead_sla = create_service_level_agreement(
|
||||||
|
default_service_level_agreement=0,
|
||||||
|
doctype=doctype,
|
||||||
|
holiday_list="__Test Holiday List",
|
||||||
|
entity_type=None, entity=None,
|
||||||
|
condition='doc.source == "Test Source"',
|
||||||
|
response_time=14400,
|
||||||
|
sla_fulfilled_on=[{"status": "Replied"}],
|
||||||
|
apply_sla_for_resolution=0
|
||||||
|
)
|
||||||
|
creation = datetime.datetime(2019, 3, 4, 12, 0)
|
||||||
|
lead = make_lead(creation=creation, index=4)
|
||||||
|
self.assertFalse(lead.service_level_agreement)
|
||||||
|
|
||||||
|
lead.source = "Test Source"
|
||||||
|
lead.save()
|
||||||
|
self.assertEqual(lead.service_level_agreement, lead_sla.name)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
for d in frappe.get_all("Service Level Agreement"):
|
for d in frappe.get_all("Service Level Agreement"):
|
||||||
frappe.delete_doc("Service Level Agreement", d.name, force=1)
|
frappe.delete_doc("Service Level Agreement", d.name, force=1)
|
||||||
@ -268,7 +288,7 @@ def get_service_level_agreement(default_service_level_agreement=None, entity_typ
|
|||||||
return service_level_agreement
|
return service_level_agreement
|
||||||
|
|
||||||
def create_service_level_agreement(default_service_level_agreement, holiday_list, response_time, entity_type,
|
def create_service_level_agreement(default_service_level_agreement, holiday_list, response_time, entity_type,
|
||||||
entity, resolution_time=0, doctype="Issue", sla_fulfilled_on=[], pause_sla_on=[], apply_sla_for_resolution=1):
|
entity, resolution_time=0, doctype="Issue", condition="", sla_fulfilled_on=[], pause_sla_on=[], apply_sla_for_resolution=1):
|
||||||
|
|
||||||
make_holiday_list()
|
make_holiday_list()
|
||||||
make_priorities()
|
make_priorities()
|
||||||
@ -287,6 +307,7 @@ def create_service_level_agreement(default_service_level_agreement, holiday_list
|
|||||||
"document_type": doctype,
|
"document_type": doctype,
|
||||||
"service_level": "__Test {} SLA".format(entity_type if entity_type else "Default"),
|
"service_level": "__Test {} SLA".format(entity_type if entity_type else "Default"),
|
||||||
"default_service_level_agreement": default_service_level_agreement,
|
"default_service_level_agreement": default_service_level_agreement,
|
||||||
|
"condition": condition,
|
||||||
"default_priority": "Medium",
|
"default_priority": "Medium",
|
||||||
"holiday_list": holiday_list,
|
"holiday_list": holiday_list,
|
||||||
"entity_type": entity_type,
|
"entity_type": entity_type,
|
||||||
@ -488,5 +509,6 @@ def make_lead(creation=None, index=0):
|
|||||||
"lead_name": "_Test Lead {0}".format(index),
|
"lead_name": "_Test Lead {0}".format(index),
|
||||||
"status": "Open",
|
"status": "Open",
|
||||||
"creation": creation,
|
"creation": creation,
|
||||||
"service_level_agreement_creation": creation
|
"service_level_agreement_creation": creation,
|
||||||
|
"priority": "Medium"
|
||||||
}).insert(ignore_permissions=True)
|
}).insert(ignore_permissions=True)
|
Loading…
x
Reference in New Issue
Block a user