feat: change SLA as well as priorities
diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py
index deeb8ae..c50a288 100644
--- a/erpnext/support/doctype/issue/issue.py
+++ b/erpnext/support/doctype/issue/issue.py
@@ -128,9 +128,7 @@
 		return replicated_issue.name
 
 	def before_insert(self):
-		if not self.priority:
-			self.priority = frappe.db.get_value("Issue Priority", {"default_priority": 1})
-		self.set_response_and_resolution_time(priority=self.priority)
+		self.set_response_and_resolution_time()
 
 	def set_response_and_resolution_time(self, priority=None, service_level_agreement=None):
 		service_level_agreement = get_active_service_level_agreement_for(priority=priority,
@@ -143,12 +141,13 @@
 			frappe.throw(_("This Service Level Agreement is specific to Customer {0}".format(service_level_agreement.customer)))
 
 		self.service_level_agreement = service_level_agreement.name
+		self.priority = service_level_agreement.default_priority if not priority else priority
 
-		service_level = frappe.get_doc("Service Level", service_level_agreement.service_level)
-		priority = service_level.get_service_level_priority(priority)
+		service_level_agreement = frappe.get_doc("Service Level Agreement", service_level_agreement.name)
+		priority = service_level_agreement.get_service_level_agreement_priority(self.priority)
 		priority.update({
-			"support_and_resolution": service_level.support_and_resolution,
-			"holiday_list": service_level.holiday_list
+			"support_and_resolution": service_level_agreement.support_and_resolution,
+			"holiday_list": service_level_agreement.holiday_list
 		})
 
 		if not self.creation:
diff --git a/erpnext/support/doctype/service_level/service_level.json b/erpnext/support/doctype/service_level/service_level.json
index 6718514..71e12c0 100644
--- a/erpnext/support/doctype/service_level/service_level.json
+++ b/erpnext/support/doctype/service_level/service_level.json
@@ -9,6 +9,7 @@
   "employee_group",
   "column_break_2",
   "holiday_list",
+  "default_priority",
   "response_and_resoution_time",
   "priorities",
   "section_break_01",
@@ -65,9 +66,16 @@
    "label": "Priorities",
    "options": "Service Level Priority",
    "reqd": 1
+  },
+  {
+   "fieldname": "default_priority",
+   "fieldtype": "Link",
+   "label": "Default Priority",
+   "options": "Issue Priority",
+   "read_only": 1
   }
  ],
- "modified": "2019-05-05 19:29:56.975951",
+ "modified": "2019-05-21 20:53:11.731727",
  "modified_by": "Administrator",
  "module": "Support",
  "name": "Service Level",
@@ -84,6 +92,18 @@
    "role": "System Manager",
    "share": 1,
    "write": 1
+  },
+  {
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "All",
+   "share": 1,
+   "write": 1
   }
  ],
  "sort_field": "modified",
diff --git a/erpnext/support/doctype/service_level/service_level.py b/erpnext/support/doctype/service_level/service_level.py
index a968ffe..857a216 100644
--- a/erpnext/support/doctype/service_level/service_level.py
+++ b/erpnext/support/doctype/service_level/service_level.py
@@ -12,7 +12,6 @@
 class ServiceLevel(Document):
 
 	def validate(self):
-		self.check_default_priority()
 		self.check_priorities()
 		self.check_support_and_resolution()
 
@@ -26,7 +25,9 @@
 				frappe.throw(_("Set Response Time and Resolution for Priority {0} at index {1}.".format(priority.priority, priority.idx)))
 
 			priorities.append(priority.priority)
-			#priorities.append(priority.priority)
+
+			if priority.default_priority:
+				default_priority.append(priority.default_priority)
 
 			if priority.response_time_period == "Hour":
 				response = priority.response_time * 0.0416667
@@ -50,6 +51,13 @@
 			repeated_priority = get_repeated(priorities)
 			frappe.throw(_("Priority {0} has been repeated.".format(repeated_priority)))
 
+		# Check if repeated default priority
+		if not len(set(default_priority)) == len(default_priority):
+			frappe.throw(_("Select only one Priority as Default."))
+
+		# set default priority from priorities
+		self.default_priority = next(d.priority for d in self.priorities if d.default_priority)
+
 	def check_support_and_resolution(self):
 		week = get_weekdays()
 		support_days = []
@@ -72,27 +80,13 @@
 			repeated_days = get_repeated(support_days)
 			frappe.throw(_("Workday {0} has been repeated.".format(repeated_days)))
 
-	def get_service_level_priority(self, priority):
-		priority = frappe.get_doc("Service Level Priority", {"priority": priority, "parent": self.name})
-
-		if priority:
-			return frappe._dict({
-						"priority": priority.priority,
-						"response_time": priority.response_time,
-						"response_time_period": priority.response_time_period,
-						"resolution_time": priority.resolution_time,
-						"resolution_time_period": priority.resolution_time_period
-					})
-		else:
-			frappe.throw(_("Service Level {0} doesn't have Priority {1}.".format(self.name, priority)))
-
 def get_repeated(values):
 	unique_list = []
 	diff = []
 	for value in values:
 		if value not in unique_list:
-			unique_list.append(value)
+			unique_list.append(str(value))
 		else:
 			if value not in diff:
-				diff.append(value)
+				diff.append(str(value))
 	return " ".join(diff)
diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement.json b/erpnext/support/doctype/service_level_agreement/service_level_agreement.json
index fb7b4ea..b3166f0 100644
--- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.json
+++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.json
@@ -8,10 +8,12 @@
   "service_level_agreement_name",
   "customer",
   "default_service_level_agreement",
+  "ignore_customer_and_default_sla",
   "holiday_list",
   "column_break_2",
   "service_level",
   "employee_group",
+  "default_priority",
   "agreement_details_section",
   "start_date",
   "agreement_status",
@@ -25,7 +27,7 @@
  ],
  "fields": [
   {
-   "depends_on": "eval: !doc.default_service_level_agreement",
+   "depends_on": "eval: !doc.default_service_level_agreement;\neval: !doc.ignore_customer_and_default_sla;",
    "fieldname": "customer",
    "fieldtype": "Link",
    "in_list_view": 1,
@@ -35,7 +37,7 @@
   },
   {
    "default": "0",
-   "depends_on": "eval: !doc.customer",
+   "depends_on": "eval: !doc.customer;\neval: !doc.ignore_customer_and_default_sla;",
    "fieldname": "default_service_level_agreement",
    "fieldtype": "Check",
    "in_list_view": 1,
@@ -139,9 +141,23 @@
    "fieldtype": "Check",
    "label": "Ignore Start and End Date",
    "set_only_once": 1
+  },
+  {
+   "fetch_from": "service_level.default_priority",
+   "fieldname": "default_priority",
+   "fieldtype": "Link",
+   "label": "Default Priority",
+   "options": "Issue Priority",
+   "read_only": 1
+  },
+  {
+   "default": "0",
+   "fieldname": "ignore_customer_and_default_sla",
+   "fieldtype": "Check",
+   "label": "Ignore Customer and Default SLA"
   }
  ],
- "modified": "2019-05-20 15:36:00.326471",
+ "modified": "2019-05-21 21:53:12.686806",
  "modified_by": "Administrator",
  "module": "Support",
  "name": "Service Level Agreement",
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 11c510f..61c6cac 100644
--- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
+++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
@@ -23,6 +23,17 @@
 			if not self.ignore_start_and_end_date and self.end_date < frappe.utils.getdate():
 				frappe.throw(_("End Date of Agreement can't be less than today."))
 
+	def get_service_level_agreement_priority(self, priority):
+		priority = frappe.get_doc("Service Level Priority", {"priority": priority, "parent": self.name})
+
+		return frappe._dict({
+			"priority": priority.priority,
+			"response_time": priority.response_time,
+			"response_time_period": priority.response_time_period,
+			"resolution_time": priority.resolution_time,
+			"resolution_time_period": priority.resolution_time_period
+		})
+
 def check_agreement_status():
 	service_level_agreements = frappe.get_list("Service Level Agreement", filters=[
 		{"agreement_status": "Active"},
@@ -34,17 +45,25 @@
 			frappe.db.set_value("Service Level Agreement", service_level_agreement.name,
 				"agreement_status", "Expired")
 
-@frappe.whitelist()
 def get_active_service_level_agreement_for(priority, customer=None, service_level_agreement=None):
+	filters = [
+		["Service Level Agreement", "agreement_status", "=", "Active"]
+	]
 
-	if customer and frappe.db.exists("Service Level Agreement", {"customer": customer}) and not service_level_agreement:
-		or_filter = {"customer": customer}
-	elif service_level_agreement:
-		or_filter = {"name": service_level_agreement}
-	else:
-		or_filter = {"default_service_level_agreement": 1}
+	if priority:
+		filters.append(["Service Level Priority", "priority", "=", priority])
 
-	agreement = frappe.get_list("Service Level Agreement", filters={"agreement_status": "Active"},
-		or_filters=or_filter, fields=["name", "service_level", "customer"])
+	or_filters = [
+		["Service Level Agreement", "customer", "=", customer],
+	]
+	if service_level_agreement:
+		or_filters = [
+			["Service Level Agreement", "name", "=", service_level_agreement],
+		]
+
+	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", "customer"], debug=True)
 
 	return agreement[0] if agreement else None
\ No newline at end of file
diff --git a/erpnext/support/doctype/service_level_priority/service_level_priority.json b/erpnext/support/doctype/service_level_priority/service_level_priority.json
index fae225c..cd87a1c 100644
--- a/erpnext/support/doctype/service_level_priority/service_level_priority.json
+++ b/erpnext/support/doctype/service_level_priority/service_level_priority.json
@@ -28,14 +28,14 @@
    "fieldtype": "Section Break"
   },
   {
-   "columns": 2,
+   "columns": 1,
    "fieldname": "response_time",
    "fieldtype": "Int",
    "in_list_view": 1,
    "label": "Response Time"
   },
   {
-   "columns": 2,
+   "columns": 1,
    "fieldname": "resolution_time",
    "fieldtype": "Int",
    "in_list_view": 1,
@@ -69,11 +69,12 @@
    "default": "0",
    "fieldname": "default_priority",
    "fieldtype": "Check",
+   "in_list_view": 1,
    "label": "Default Priority"
   }
  ],
  "istable": 1,
- "modified": "2019-05-20 17:10:43.687547",
+ "modified": "2019-05-21 06:54:42.674377",
  "modified_by": "Administrator",
  "module": "Support",
  "name": "Service Level Priority",