mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-17 10:36:31 +00:00
fix: conflicts while merging brnach version-13 to develop
This commit is contained in:
@@ -116,7 +116,7 @@ class Issue(Document):
|
||||
}).insert(ignore_permissions=True)
|
||||
|
||||
return replicated_issue.name
|
||||
|
||||
|
||||
def reset_issue_metrics(self):
|
||||
self.db_set("resolution_time", None)
|
||||
self.db_set("user_resolution_time", None)
|
||||
@@ -231,7 +231,7 @@ def set_first_response_time(communication, method):
|
||||
|
||||
def is_first_response(issue):
|
||||
responses = frappe.get_all('Communication', filters = {'reference_name': issue.name, 'sent_or_received': 'Sent'})
|
||||
if len(responses) == 1:
|
||||
if len(responses) == 1:
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -260,7 +260,7 @@ def calculate_first_response_time(issue, first_responded_on):
|
||||
# both issue creation and first response were after working hours
|
||||
else:
|
||||
return 1.0 # this should ideally be zero, but it gets reset when the next response is sent if the value is zero
|
||||
|
||||
|
||||
else:
|
||||
return 1.0
|
||||
|
||||
|
||||
@@ -18,6 +18,10 @@
|
||||
"entity_type",
|
||||
"column_break_10",
|
||||
"entity",
|
||||
"filters_section",
|
||||
"condition",
|
||||
"column_break_15",
|
||||
"condition_description",
|
||||
"agreement_details_section",
|
||||
"start_date",
|
||||
"column_break_7",
|
||||
@@ -176,10 +180,34 @@
|
||||
"fieldname": "apply_sla_for_resolution",
|
||||
"fieldtype": "Check",
|
||||
"label": "Apply SLA for Resolution Time"
|
||||
},
|
||||
{
|
||||
"label": "Pause SLA On",
|
||||
"options": "Pause SLA On Status"
|
||||
},
|
||||
{
|
||||
"fieldname": "filters_section",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Assignment Condition"
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_15",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "condition",
|
||||
"fieldtype": "Code",
|
||||
"label": "Condition",
|
||||
"options": "Python"
|
||||
},
|
||||
{
|
||||
"fieldname": "condition_description",
|
||||
"fieldtype": "HTML",
|
||||
"options": "<p><strong>Condition Examples:</strong></p>\n<pre>doc.status==\"Open\"<br>doc.due_date==nowdate()<br>doc.total > 40000\n</pre>"
|
||||
}
|
||||
],
|
||||
"links": [],
|
||||
"modified": "2021-07-08 12:28:46.283334",
|
||||
"modified": "2021-07-09 12:28:46.283334",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Support",
|
||||
"name": "Service Level Agreement",
|
||||
@@ -213,4 +241,4 @@
|
||||
"sort_field": "modified",
|
||||
"sort_order": "DESC",
|
||||
"track_changes": 1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,14 +3,16 @@
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
from frappe.model.document import Document
|
||||
from frappe import _
|
||||
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, \
|
||||
get_time_zone, to_timedelta, get_datetime_str, get_link_to_form, cint
|
||||
get_time_zone, to_timedelta, get_datetime_str, get_link_to_form, cint, nowdate
|
||||
from datetime import datetime
|
||||
from erpnext.support.doctype.issue.issue import get_holidays
|
||||
from frappe.utils.safe_exec import get_safe_globals
|
||||
|
||||
class ServiceLevelAgreement(Document):
|
||||
def validate(self):
|
||||
@@ -18,6 +20,7 @@ class ServiceLevelAgreement(Document):
|
||||
self.validate_status_field()
|
||||
self.check_priorities()
|
||||
self.check_support_and_resolution()
|
||||
self.validate_condition()
|
||||
|
||||
def check_priorities(self):
|
||||
priorities = []
|
||||
@@ -96,6 +99,14 @@ class ServiceLevelAgreement(Document):
|
||||
frappe.throw(_("The Document Type {0} must have a Status field to configure Service Level Agreement").format(
|
||||
frappe.bold(self.document_type)))
|
||||
|
||||
def validate_condition(self):
|
||||
temp_doc = frappe.new_doc('Issue')
|
||||
if self.condition:
|
||||
try:
|
||||
frappe.safe_eval(self.condition, None, get_context(temp_doc))
|
||||
except Exception:
|
||||
frappe.throw(_("The Condition '{0}' is invalid").format(self.condition))
|
||||
|
||||
def get_service_level_agreement_priority(self, priority):
|
||||
priority = frappe.get_doc("Service Level Priority", {"priority": priority, "parent": self.name})
|
||||
|
||||
@@ -204,34 +215,51 @@ def check_agreement_status():
|
||||
if doc.end_date and getdate(doc.end_date) < getdate(frappe.utils.getdate()):
|
||||
frappe.db.set_value("Service Level Agreement", service_level_agreement.name, "enabled", 0)
|
||||
|
||||
|
||||
def get_active_service_level_agreement_for(doctype, priority, customer=None, service_level_agreement=None):
|
||||
if doctype == "Issue" and not frappe.db.get_single_value("Support Settings", "track_service_level_agreement"):
|
||||
def get_active_service_level_agreement_for(doc):
|
||||
if not frappe.db.get_single_value("Support Settings", "track_service_level_agreement"):
|
||||
return
|
||||
|
||||
filters = [
|
||||
["Service Level Agreement", "document_type", "=", doctype],
|
||||
["Service Level Agreement", "enabled", "=", 1]
|
||||
]
|
||||
if priority:
|
||||
filters.append(["Service Level Priority", "priority", "=", priority])
|
||||
|
||||
or_filters = []
|
||||
if doc.get('priority'):
|
||||
filters.append(["Service Level Priority", "priority", "=", doc.get('priority')])
|
||||
|
||||
customer = doc.get('customer')
|
||||
or_filters = [
|
||||
["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 = [
|
||||
["Service Level Agreement", "name", "=", service_level_agreement],
|
||||
["Service Level Agreement", "name", "=", doc.get('service_level_agreement')],
|
||||
]
|
||||
|
||||
if customer:
|
||||
or_filters.append(
|
||||
["Service Level Agreement", "entity", "in", [customer, get_customer_group(customer), get_customer_territory(customer)]]
|
||||
)
|
||||
or_filters.append(["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,
|
||||
fields=["name", "default_priority", "condition"])
|
||||
|
||||
agreement = frappe.get_all("Service Level Agreement", filters=filters, or_filters=or_filters,
|
||||
fields=["name", "default_priority", "apply_sla_for_resolution"])
|
||||
filters += [["Service Level Agreement", "default_service_level_agreement", "=", 0]]
|
||||
agreements = frappe.get_all("Service Level Agreement", filters=filters, or_filters=or_filters,
|
||||
fields=["name", "default_priority", "condition"])
|
||||
|
||||
return agreement[0] if agreement else None
|
||||
# check if the current document on which SLA is to be applied fulfills all the conditions
|
||||
filtered_agreements = []
|
||||
for agreement in agreements:
|
||||
condition = agreement.get('condition')
|
||||
if not condition or (condition and frappe.safe_eval(condition, None, get_context(doc))):
|
||||
filtered_agreements.append(agreement)
|
||||
|
||||
# if any default sla
|
||||
filtered_agreements += default_sla
|
||||
|
||||
return filtered_agreements[0] if filtered_agreements else None
|
||||
|
||||
def get_context(doc):
|
||||
return {"doc": doc.as_dict(), "nowdate": nowdate, "frappe": frappe._dict(utils=get_safe_globals().get("frappe").get("utils"))}
|
||||
|
||||
|
||||
def get_customer_group(customer):
|
||||
@@ -301,8 +329,7 @@ def apply(doc, method=None):
|
||||
doc.doctype not in get_documents_with_active_service_level_agreement():
|
||||
return
|
||||
|
||||
service_level_agreement = get_active_service_level_agreement_for(doctype=doc.get("doctype"), priority=doc.get("priority"),
|
||||
customer=doc.get("customer"), service_level_agreement=doc.get("service_level_agreement"))
|
||||
service_level_agreement = get_active_service_level_agreement_for(doc)
|
||||
|
||||
if not service_level_agreement:
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user