brotherton-erpnext/erpnext/patches/v13_0/update_sla_enhancements.py
2022-03-28 18:52:46 +05:30

110 lines
3.5 KiB
Python

# Copyright (c) 2018, Frappe and Contributors
# License: GNU General Public License v3. See license.txt
import frappe
def execute():
# add holiday list and employee group fields in SLA
# change response and resolution time in priorities child table
if frappe.db.exists("DocType", "Service Level Agreement"):
sla_details = frappe.db.get_all("Service Level Agreement", fields=["name", "service_level"])
priorities = frappe.db.get_all(
"Service Level Priority",
fields=["*"],
filters={"parenttype": ("in", ["Service Level Agreement", "Service Level"])},
)
frappe.reload_doc("support", "doctype", "service_level_agreement")
frappe.reload_doc("support", "doctype", "pause_sla_on_status")
frappe.reload_doc("support", "doctype", "service_level_priority")
frappe.reload_doc("support", "doctype", "service_day")
for entry in sla_details:
values = frappe.db.get_value(
"Service Level", entry.service_level, ["holiday_list", "employee_group"]
)
if values:
holiday_list = values[0]
employee_group = values[1]
frappe.db.set_value(
"Service Level Agreement",
entry.name,
{"holiday_list": holiday_list, "employee_group": employee_group},
)
priority_dict = {}
for priority in priorities:
if priority.parenttype == "Service Level Agreement":
response_time = convert_to_seconds(priority.response_time, priority.response_time_period)
resolution_time = convert_to_seconds(priority.resolution_time, priority.resolution_time_period)
frappe.db.set_value(
"Service Level Priority",
priority.name,
{"response_time": response_time, "resolution_time": resolution_time},
)
if priority.parenttype == "Service Level":
if not priority.parent in priority_dict:
priority_dict[priority.parent] = []
priority_dict[priority.parent].append(priority)
# copy Service Levels to Service Level Agreements
sl = [entry.service_level for entry in sla_details]
if frappe.db.exists("DocType", "Service Level"):
service_levels = frappe.db.get_all(
"Service Level", filters={"service_level": ("not in", sl)}, fields=["*"]
)
for entry in service_levels:
sla = frappe.new_doc("Service Level Agreement")
sla.service_level = entry.service_level
sla.holiday_list = entry.holiday_list
sla.employee_group = entry.employee_group
sla.flags.ignore_validate = True
sla = sla.insert(ignore_mandatory=True)
frappe.db.sql(
"""
UPDATE
`tabService Day`
SET
parent = %(new_parent)s , parentfield = 'support_and_resolution', parenttype = 'Service Level Agreement'
WHERE
parent = %(old_parent)s
""",
{"new_parent": sla.name, "old_parent": entry.name},
as_dict=1,
)
priority_list = priority_dict.get(entry.name)
if priority_list:
sla = frappe.get_doc("Service Level Agreement", sla.name)
for priority in priority_list:
row = sla.append(
"priorities",
{
"priority": priority.priority,
"default_priority": priority.default_priority,
"response_time": convert_to_seconds(priority.response_time, priority.response_time_period),
"resolution_time": convert_to_seconds(
priority.resolution_time, priority.resolution_time_period
),
},
)
row.db_update()
sla.db_update()
frappe.delete_doc_if_exists("DocType", "Service Level")
def convert_to_seconds(value, unit):
seconds = 0
if unit == "Hour":
seconds = value * 3600
if unit == "Day":
seconds = value * 3600 * 24
if unit == "Week":
seconds = value * 3600 * 24 * 7
return seconds