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)