refactor: handle special cases on communication creation

This commit is contained in:
Saqib Ansari 2021-12-06 14:34:59 +05:30
parent f9408d170a
commit c1d8877a83
2 changed files with 28 additions and 8 deletions

View File

@ -234,7 +234,7 @@ doc_events = {
},
"Communication": {
"on_update": [
"erpnext.support.doctype.service_level_agreement.service_level_agreement.update_hold_time",
"erpnext.support.doctype.service_level_agreement.service_level_agreement.on_communication_update",
"erpnext.support.doctype.issue.issue.set_first_response_time"
]
},

View File

@ -376,14 +376,14 @@ def process_sla(doc, sla):
doc.service_level_agreement = sla.name
doc.priority = doc.get("priority") or sla.default_priority
prev_status = frappe.db.get_value(doc.doctype, doc.name, 'status')
handle_status_change(doc, prev_status, sla.apply_sla_for_resolution)
handle_status_change(doc, sla.apply_sla_for_resolution)
update_response_and_resolution_metrics(doc, sla.apply_sla_for_resolution)
update_agreement_status(doc, sla.apply_sla_for_resolution)
def handle_status_change(doc, prev_status, apply_sla_for_resolution):
def handle_status_change(doc, apply_sla_for_resolution):
now_time = frappe.flags.current_time or now_datetime(doc.get("owner"))
prev_status = frappe.db.get_value(doc.doctype, doc.name, 'status')
hold_statuses = get_hold_statuses(doc.service_level_agreement)
fulfillment_statuses = get_fulfillment_statuses(doc.service_level_agreement)
@ -407,7 +407,7 @@ def handle_status_change(doc, prev_status, apply_sla_for_resolution):
doc.total_hold_time = (doc.total_hold_time or 0) + current_hold_hours
doc.on_hold_since = None
if is_open_status(prev_status) and not is_open_status(doc.status):
if ((is_open_status(prev_status) and not is_open_status(doc.status)) or doc.flags.on_first_reply):
# status changed from Open to something else
if doc.meta.has_field("first_responded_on") and not doc.get('first_responded_on'):
doc.first_responded_on = now_time
@ -625,8 +625,8 @@ def reset_resolution_metrics(doc):
# called via hooks on communication update
def update_hold_time(doc, status):
if doc.communication_type == "Comment" or doc.sent_or_received != "Received":
def on_communication_update(doc, status):
if doc.communication_type == "Comment":
return
parent = get_parent_doc(doc)
@ -638,7 +638,27 @@ def update_hold_time(doc, status):
for_resolution = frappe.db.get_value('Service Level Agreement', parent.service_level_agreement, 'apply_sla_for_resolution')
handle_status_change(parent, 'Replied', for_resolution)
if (
doc.sent_or_received == "Received" # a reply is received
and parent.get('status') == 'Open' # issue status is set as open from communication.py
and parent._doc_before_save
and parent.get('status') != parent._doc_before_save.get('status') # status changed
):
# undo the status change in db
# since prev status is fetched from db
frappe.db.set_value(parent.doctype, parent.name, 'status', parent._doc_before_save.get('status'))
elif (
doc.sent_or_received == "Sent" # a reply is sent
and parent.get('first_responded_on') # first_responded_on is set from communication.py
and parent._doc_before_save
and not parent._doc_before_save.get('first_responded_on') # first_responded_on was not set
):
# reset first_responded_on since it will be handled/set later on
parent.first_responded_on = None
parent.flags.on_first_reply = True
handle_status_change(parent, for_resolution)
update_response_and_resolution_metrics(parent, for_resolution)
update_agreement_status(parent, for_resolution)