test: new test cases for sla
diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py
index 525f829..773e61a 100644
--- a/erpnext/support/doctype/issue/issue.py
+++ b/erpnext/support/doctype/issue/issue.py
@@ -11,7 +11,7 @@
from datetime import datetime, timedelta
from frappe.model.mapper import get_mapped_doc
from frappe.utils.user import is_website_user
-from ..service_level_agreement.service_level_agreement import get_active_service_level_agreement_for
+from erpnext.support.doctype.service_level_agreement.service_level_agreement import get_active_service_level_agreement_for
from erpnext.crm.doctype.opportunity.opportunity import assign_to_user
from frappe.email.inbox import link_communication_to_document
@@ -63,10 +63,10 @@
def update_status(self):
status = frappe.db.get_value("Issue", self.name, "status")
if self.status!="Open" and status =="Open" and not self.first_responded_on:
- self.first_responded_on = now_datetime()
+ self.first_responded_on = frappe.flags.current_time or now_datetime()
if self.status=="Closed" and status !="Closed":
- self.resolution_date = now_datetime()
+ self.resolution_date = frappe.flags.current_time or now_datetime()
if frappe.db.get_value("Issue", self.name, "agreement_fulfilled") == "Ongoing":
set_service_level_agreement_variance(issue=self.name)
self.update_agreement_status()
@@ -79,7 +79,9 @@
current_time = frappe.flags.current_time or now_datetime()
if self.service_level_agreement and self.agreement_fulfilled == "Ongoing":
- if self.response_by_variance < 0 or self.resolution_by_variance < 0:
+ if frappe.db.get_value("Issue", self.name, "response_by_variance") < 0 or \
+ frappe.db.get_value("Issue", self.name, "resolution_by_variance") < 0:
+
self.agreement_fulfilled = "Failed"
else:
self.agreement_fulfilled = "Fulfilled"
diff --git a/erpnext/support/doctype/issue/test_issue.py b/erpnext/support/doctype/issue/test_issue.py
index 565c603..22e00c6 100644
--- a/erpnext/support/doctype/issue/test_issue.py
+++ b/erpnext/support/doctype/issue/test_issue.py
@@ -4,7 +4,7 @@
import frappe
import unittest
-from erpnext.support.doctype.service_level_agreement.test_service_level_agreement import make_service_level_agreement
+from erpnext.support.doctype.service_level_agreement.test_service_level_agreement import create_service_level_agreements_for_issues
from frappe.utils import now_datetime
import datetime
from datetime import timedelta
@@ -18,15 +18,30 @@
def test_response_time_and_resolution_time_based_on_different_sla(self):
- make_service_level_agreement()
+ create_service_level_agreements_for_issues()
creation = "2019-03-04 12:00:00"
# make issue with customer specific SLA
- issue = make_issue(creation, '_Test Customer')
+ customer = create_customer("_Test Customer", "__Test SLA Customer Group", "__Test SLA Territory")
+ issue = make_issue(creation, "_Test Customer")
- self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 7, 18, 0))
- self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 9, 18, 0))
+ self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0))
+ self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 4, 15, 0))
+
+ # make issue with customer_group specific SLA
+ customer = create_customer("__Test Customer", "_Test SLA Customer Group", "__Test SLA Territory")
+ issue = make_issue(creation, "__Test Customer")
+
+ self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0))
+ self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 4, 15, 0))
+
+ # make issue with territory specific SLA
+ customer = create_customer("___Test Customer", "__Test SLA Customer Group", "_Test SLA Territory")
+ issue = make_issue(creation, "___Test Customer")
+
+ self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0))
+ self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 4, 15, 0))
# make issue with default SLA
issue = make_issue(creation)
@@ -41,7 +56,7 @@
self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 4, 18, 0))
self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 6, 12, 0))
- frappe.flags.current_time = datetime.datetime(2019, 3, 3, 12, 0)
+ frappe.flags.current_time = datetime.datetime(2019, 3, 4, 15, 0)
issue.status = 'Closed'
issue.save()
@@ -52,10 +67,39 @@
issue = frappe.get_doc({
"doctype": "Issue",
- "subject": "Issue 1",
+ "subject": "Service Level Agreement Issue",
"customer": customer,
"raised_by": "test@example.com",
"creation": creation
}).insert(ignore_permissions=True)
- return issue
\ No newline at end of file
+ return issue
+
+def create_customer(name, customer_group, territory):
+
+ create_customer_group(customer_group)
+ create_territory(territory)
+
+ if not frappe.db.exists("Customer", {"customer_name": name}):
+ frappe.get_doc({
+ "doctype": "Customer",
+ "customer_name": name,
+ "customer_group": customer_group,
+ "territory": territory
+ }).insert(ignore_permissions=True)
+
+def create_customer_group(customer_group):
+
+ if not frappe.db.exists("Customer Group", {"customer_group_name": customer_group}):
+ frappe.get_doc({
+ "doctype": "Customer Group",
+ "customer_group_name": customer_group
+ }).insert(ignore_permissions=True)
+
+def create_territory(territory):
+
+ if not frappe.db.exists("Territory", {"territory_name": territory}):
+ frappe.get_doc({
+ "doctype": "Territory",
+ "territory_name": territory,
+ }).insert(ignore_permissions=True)
diff --git a/erpnext/support/doctype/service_level/test_service_level.py b/erpnext/support/doctype/service_level/test_service_level.py
index 9131d80..09577df 100644
--- a/erpnext/support/doctype/service_level/test_service_level.py
+++ b/erpnext/support/doctype/service_level/test_service_level.py
@@ -4,9 +4,6 @@
from __future__ import unicode_literals
from erpnext.hr.doctype.employee_group.test_employee_group import make_employee_group
from erpnext.support.doctype.issue_priority.test_issue_priority import make_priorities
-from frappe.utils import now_datetime
-import datetime
-from datetime import timedelta
import frappe
import unittest
@@ -14,45 +11,54 @@
class TestServiceLevel(unittest.TestCase):
def test_service_level(self):
- test_make_service_level = make_service_level()
- get_make_service_level = get_service_level()
+ employee_group = make_employee_group()
+ make_holiday_list()
+ make_priorities()
+
+ # Default Service Level
+ test_make_service_level = create_service_level("__Test Service Level", "__Test Holiday List", employee_group, 4, 6)
+ get_make_service_level = get_service_level("__Test Service Level")
self.assertEqual(test_make_service_level.name, get_make_service_level.name)
self.assertEqual(test_make_service_level.holiday_list, get_make_service_level.holiday_list)
self.assertEqual(test_make_service_level.employee_group, get_make_service_level.employee_group)
-def make_service_level():
- employee_group = make_employee_group()
- make_holiday_list()
- make_priorities()
+ # Service Level
+ test_make_service_level = create_service_level("_Test Service Level", "__Test Holiday List", employee_group, 2, 3)
+ get_make_service_level = get_service_level("_Test Service Level")
- # Default Service Level Agreement
- default_service_level = frappe.get_doc({
+ self.assertEqual(test_make_service_level.name, get_make_service_level.name)
+ self.assertEqual(test_make_service_level.holiday_list, get_make_service_level.holiday_list)
+ self.assertEqual(test_make_service_level.employee_group, get_make_service_level.employee_group)
+
+
+def create_service_level(service_level, holiday_list, employee_group, response_time, resolution_time):
+ sl = frappe.get_doc({
"doctype": "Service Level",
- "service_level": "__Test Service Level",
- "holiday_list": "__Test Holiday List",
+ "service_level": service_level,
+ "holiday_list": holiday_list,
"employee_group": employee_group,
"priorities": [
{
"priority": "Low",
- "response_time": 4,
+ "response_time": response_time,
"response_time_period": "Hour",
- "resolution_time": 6,
+ "resolution_time": resolution_time,
"resolution_time_period": "Hour",
},
{
"priority": "Medium",
- "response_time": 4,
+ "response_time": response_time,
"default_priority": 1,
"response_time_period": "Hour",
- "resolution_time": 6,
+ "resolution_time": resolution_time,
"resolution_time_period": "Hour",
},
{
"priority": "High",
- "response_time": 4,
+ "response_time": response_time,
"response_time_period": "Hour",
- "resolution_time": 6,
+ "resolution_time": resolution_time,
"resolution_time_period": "Hour",
}
],
@@ -95,92 +101,21 @@
]
})
- default_service_level_exists = frappe.db.exists("Service Level", "__Test Service Level")
- if not default_service_level_exists:
- default_service_level.insert()
+ sl_exists = frappe.db.exists("Service Level", {"service_level": service_level})
- service_level = frappe.get_doc({
- "doctype": "Service Level",
- "service_level": "_Test Service Level",
- "holiday_list": "__Test Holiday List",
- "employee_group": employee_group,
- "priorities": [
- {
- "priority": "Low",
- "response_time": 2,
- "response_time_period": "Day",
- "resolution_time": 3,
- "resolution_time_period": "Day",
- },
- {
- "priority": "Medium",
- "response_time": 2,
- "default_priority": 1,
- "response_time_period": "Day",
- "resolution_time": 3,
- "resolution_time_period": "Day",
- },
- {
- "priority": "High",
- "response_time": 2,
- "response_time_period": "Day",
- "resolution_time": 3,
- "resolution_time_period": "Day",
- }
- ],
- "support_and_resolution": [
- {
- "workday": "Monday",
- "start_time": "10:00:00",
- "end_time": "18:00:00",
- },
- {
- "workday": "Tuesday",
- "start_time": "10:00:00",
- "end_time": "18:00:00",
- },
- {
- "workday": "Wednesday",
- "start_time": "10:00:00",
- "end_time": "18:00:00",
- },
- {
- "workday": "Thursday",
- "start_time": "10:00:00",
- "end_time": "18:00:00",
- },
- {
- "workday": "Friday",
- "start_time": "10:00:00",
- "end_time": "18:00:00",
- },
- {
- "workday": "Saturday",
- "start_time": "10:00:00",
- "end_time": "18:00:00",
- },
- {
- "workday": "Sunday",
- "start_time": "10:00:00",
- "end_time": "18:00:00",
- }
- ]
- })
- service_level_exist = frappe.db.exists("Service Level", {"service_level": "_Test Service Level"})
-
- if not service_level_exist:
- service_level.insert()
- return service_level
+ if not sl_exists:
+ sl.insert()
+ return sl
else:
- return frappe.get_doc("Service Level", "_Test Service Level")
+ return frappe.get_doc("Service Level", {"service_level": service_level})
-def get_service_level():
- return frappe.get_doc("Service Level", "_Test Service Level")
+def get_service_level(service_level):
+ return frappe.get_doc("Service Level", service_level)
def make_holiday_list():
holiday_list = frappe.db.exists("Holiday List", "__Test Holiday List")
if not holiday_list:
- now = datetime.datetime.now()
+ now = frappe.utils.now_datetime()
holiday_list = frappe.get_doc({
"doctype": "Holiday List",
"holiday_list_name": "__Test Holiday List",
@@ -200,4 +135,15 @@
"holiday_date": "2019-02-11"
},
]
- }).insert()
\ No newline at end of file
+ }).insert()
+
+def create_service_level_for_sla():
+ employee_group = make_employee_group()
+ make_holiday_list()
+ make_priorities()
+
+ # Default Service Level
+ create_service_level("__Test Service Level", "__Test Holiday List", employee_group, 4, 6)
+
+ # Service Level
+ create_service_level("_Test Service Level", "__Test Holiday List", employee_group, 2, 3)
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 ccc287b..aeeb86d 100644
--- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
+++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
@@ -62,7 +62,7 @@
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"], debug=True)
+ fields=["name", "default_priority"])
return agreement[0] if agreement else None
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 214fe4b..e04265f 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
@@ -5,12 +5,12 @@
import frappe
import unittest
-from erpnext.support.doctype.service_level.test_service_level import make_service_level
+from erpnext.support.doctype.service_level.test_service_level import create_service_level_for_sla
class TestServiceLevelAgreement(unittest.TestCase):
def test_service_level_agreement(self):
- make_service_level()
+ create_service_level_for_sla()
# Default Service Level Agreement
create_default_service_level_agreement = create_service_level_agreement(default_service_level_agreement=1,
@@ -26,7 +26,7 @@
# Service Level Agreement for Customer
customer = create_customer()
create_customer_service_level_agreement = create_service_level_agreement(default_service_level_agreement=0,
- service_level="__Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
+ service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
apply_to="Customer", entity=customer, response_time=2, resolution_time=3)
get_customer_service_level_agreement = get_service_level_agreement(apply_to="Customer", entity=customer)
@@ -38,8 +38,8 @@
# Service Level Agreement for Customer Group
customer_group = create_customer_group()
create_customer_group_service_level_agreement = create_service_level_agreement(default_service_level_agreement=0,
- service_level="__Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
- apply_to="Customer Group", entity=customer_group, response_time=4, resolution_time=6)
+ service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
+ apply_to="Customer Group", entity=customer_group, response_time=2, resolution_time=3)
get_customer_group_service_level_agreement = get_service_level_agreement(apply_to="Customer Group", entity=customer_group)
self.assertEqual(create_customer_group_service_level_agreement.name, get_customer_group_service_level_agreement.name)
@@ -50,7 +50,7 @@
# Service Level Agreement for Territory
territory = create_territory()
create_territory_service_level_agreement = create_service_level_agreement(default_service_level_agreement=0,
- service_level="__Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
+ service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
apply_to="Territory", entity=territory, response_time=2, resolution_time=3)
get_territory_service_level_agreement = get_service_level_agreement(apply_to="Territory", entity=territory)
@@ -67,7 +67,6 @@
filters = {"apply_to": apply_to, "entity": entity}
service_level_agreement = frappe.get_doc("Service Level Agreement", filters)
- print(service_level_agreement)
return service_level_agreement
def create_service_level_agreement(default_service_level_agreement, service_level, holiday_list, employee_group,
@@ -146,13 +145,24 @@
]
})
- service_level_agreement_exists = frappe.db.exists("Service Level Agreement", service_level_agreement.name)
+ filters = {
+ "default_service_level_agreement": service_level_agreement.default_service_level_agreement,
+ "service_level": service_level_agreement.service_level
+ }
+
+ if not default_service_level_agreement:
+ filters.update({
+ "apply_to": apply_to,
+ "entity": entity
+ })
+
+ service_level_agreement_exists = frappe.db.exists("Service Level Agreement", filters)
if not service_level_agreement_exists:
service_level_agreement.insert(ignore_permissions=True)
return service_level_agreement
else:
- return frappe.get_doc("Service Level Agreement", service_level_agreement.name)
+ return frappe.get_doc("Service Level Agreement", service_level_agreement_exists)
def create_customer():
customer = frappe.get_doc({
@@ -190,4 +200,26 @@
territory.insert()
return territory.name
else:
- return frappe.db.exists("Territory", {"territory_name": "_Test SLA Territory"})
\ No newline at end of file
+ return frappe.db.exists("Territory", {"territory_name": "_Test SLA Territory"})
+
+def create_service_level_agreements_for_issues():
+ create_service_level_for_sla()
+
+ create_service_level_agreement(default_service_level_agreement=1,
+ service_level="__Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
+ apply_to=None, entity=None, response_time=4, resolution_time=6)
+
+ create_customer()
+ create_service_level_agreement(default_service_level_agreement=0,
+ service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
+ apply_to="Customer", entity="_Test Customer", response_time=2, resolution_time=3)
+
+ create_customer_group()
+ create_service_level_agreement(default_service_level_agreement=0,
+ service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
+ apply_to="Customer Group", entity="_Test SLA Customer Group", response_time=2, resolution_time=3)
+
+ create_territory()
+ create_service_level_agreement(default_service_level_agreement=0,
+ service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group",
+ apply_to="Territory", entity="_Test SLA Territory", response_time=2, resolution_time=3)