mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-01 04:28:27 +00:00
fix: calculate first_response_time based on working hours (#26520)
This commit is contained in:
@@ -243,6 +243,11 @@ doc_events = {
|
||||
"on_update": ["erpnext.hr.doctype.employee.employee.update_user_permissions",
|
||||
"erpnext.portal.utils.set_default_role"]
|
||||
},
|
||||
"Communication": {
|
||||
"on_update": [
|
||||
"erpnext.support.doctype.issue.issue.set_first_response_time"
|
||||
]
|
||||
},
|
||||
"Sales Taxes and Charges Template": {
|
||||
"on_update": "erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings.validate_cart_settings"
|
||||
},
|
||||
|
||||
@@ -5,10 +5,10 @@ from __future__ import unicode_literals
|
||||
import frappe
|
||||
import json
|
||||
from frappe import _
|
||||
from frappe import utils
|
||||
from frappe.model.document import Document
|
||||
from frappe.utils import cint, now_datetime, getdate, get_weekdays, add_to_date, get_time, get_datetime, time_diff_in_seconds
|
||||
from datetime import datetime, timedelta
|
||||
from frappe.utils import now_datetime, time_diff_in_seconds, get_datetime, date_diff, get_weekdays, add_to_date, cint, getdate, get_time
|
||||
from frappe.core.utils import get_parent_doc
|
||||
from datetime import timedelta, datetime
|
||||
from frappe.model.mapper import get_mapped_doc
|
||||
from frappe.utils.user import is_website_user
|
||||
from erpnext.support.doctype.service_level_agreement.service_level_agreement import get_active_service_level_agreement_for
|
||||
@@ -24,11 +24,9 @@ class Issue(Document):
|
||||
|
||||
if not self.raised_by:
|
||||
self.raised_by = frappe.session.user
|
||||
|
||||
self.change_service_level_agreement_and_priority()
|
||||
self.update_status()
|
||||
self.set_lead_contact(self.raised_by)
|
||||
|
||||
if not self.service_level_agreement:
|
||||
self.reset_sla_fields()
|
||||
|
||||
@@ -524,5 +522,120 @@ def get_time_in_timedelta(time):
|
||||
"""
|
||||
Converts datetime.time(10, 36, 55, 961454) to datetime.timedelta(seconds=38215)
|
||||
"""
|
||||
import datetime
|
||||
return datetime.timedelta(hours=time.hour, minutes=time.minute, seconds=time.second)
|
||||
return timedelta(hours=time.hour, minutes=time.minute, seconds=time.second)
|
||||
|
||||
def set_first_response_time(communication, method):
|
||||
if communication.get('reference_doctype') == "Issue":
|
||||
issue = get_parent_doc(communication)
|
||||
if is_first_response(issue):
|
||||
first_response_time = calculate_first_response_time(issue, get_datetime(issue.first_responded_on))
|
||||
issue.db_set("first_response_time", first_response_time)
|
||||
|
||||
def is_first_response(issue):
|
||||
responses = frappe.get_all('Communication', filters = {'reference_name': issue.name, 'sent_or_received': 'Sent'})
|
||||
if len(responses) == 1:
|
||||
return True
|
||||
return False
|
||||
|
||||
def calculate_first_response_time(issue, first_responded_on):
|
||||
issue_creation_date = issue.creation
|
||||
issue_creation_time = get_time_in_seconds(issue_creation_date)
|
||||
first_responded_on_in_seconds = get_time_in_seconds(first_responded_on)
|
||||
support_hours = frappe.get_cached_doc("Service Level Agreement", issue.service_level_agreement).support_and_resolution
|
||||
|
||||
if issue_creation_date.day == first_responded_on.day:
|
||||
if is_work_day(issue_creation_date, support_hours):
|
||||
start_time, end_time = get_working_hours(issue_creation_date, support_hours)
|
||||
|
||||
# issue creation and response on the same day during working hours
|
||||
if is_during_working_hours(issue_creation_date, support_hours) and is_during_working_hours(first_responded_on, support_hours):
|
||||
return get_elapsed_time(issue_creation_date, first_responded_on)
|
||||
|
||||
# issue creation is during working hours, but first response was after working hours
|
||||
elif is_during_working_hours(issue_creation_date, support_hours):
|
||||
return get_elapsed_time(issue_creation_time, end_time)
|
||||
|
||||
# issue creation was before working hours but first response is during working hours
|
||||
elif is_during_working_hours(first_responded_on, support_hours):
|
||||
return get_elapsed_time(start_time, first_responded_on_in_seconds)
|
||||
|
||||
# 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
|
||||
|
||||
else:
|
||||
# response on the next day
|
||||
if date_diff(first_responded_on, issue_creation_date) == 1:
|
||||
first_response_time = 0
|
||||
else:
|
||||
first_response_time = calculate_initial_frt(issue_creation_date, date_diff(first_responded_on, issue_creation_date)- 1, support_hours)
|
||||
|
||||
# time taken on day of issue creation
|
||||
if is_work_day(issue_creation_date, support_hours):
|
||||
start_time, end_time = get_working_hours(issue_creation_date, support_hours)
|
||||
|
||||
if is_during_working_hours(issue_creation_date, support_hours):
|
||||
first_response_time += get_elapsed_time(issue_creation_time, end_time)
|
||||
elif is_before_working_hours(issue_creation_date, support_hours):
|
||||
first_response_time += get_elapsed_time(start_time, end_time)
|
||||
|
||||
# time taken on day of first response
|
||||
if is_work_day(first_responded_on, support_hours):
|
||||
start_time, end_time = get_working_hours(first_responded_on, support_hours)
|
||||
|
||||
if is_during_working_hours(first_responded_on, support_hours):
|
||||
first_response_time += get_elapsed_time(start_time, first_responded_on_in_seconds)
|
||||
elif not is_before_working_hours(first_responded_on, support_hours):
|
||||
first_response_time += get_elapsed_time(start_time, end_time)
|
||||
|
||||
if first_response_time:
|
||||
return first_response_time
|
||||
else:
|
||||
return 1.0
|
||||
|
||||
def get_time_in_seconds(date):
|
||||
return timedelta(hours=date.hour, minutes=date.minute, seconds=date.second)
|
||||
|
||||
def get_working_hours(date, support_hours):
|
||||
if is_work_day(date, support_hours):
|
||||
weekday = frappe.utils.get_weekday(date)
|
||||
for day in support_hours:
|
||||
if day.workday == weekday:
|
||||
return day.start_time, day.end_time
|
||||
|
||||
def is_work_day(date, support_hours):
|
||||
weekday = frappe.utils.get_weekday(date)
|
||||
for day in support_hours:
|
||||
if day.workday == weekday:
|
||||
return True
|
||||
return False
|
||||
|
||||
def is_during_working_hours(date, support_hours):
|
||||
start_time, end_time = get_working_hours(date, support_hours)
|
||||
time = get_time_in_seconds(date)
|
||||
if time >= start_time and time <= end_time:
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_elapsed_time(start_time, end_time):
|
||||
return round(time_diff_in_seconds(end_time, start_time), 2)
|
||||
|
||||
def calculate_initial_frt(issue_creation_date, days_in_between, support_hours):
|
||||
initial_frt = 0
|
||||
for i in range(days_in_between):
|
||||
date = issue_creation_date + timedelta(days = (i+1))
|
||||
if is_work_day(date, support_hours):
|
||||
start_time, end_time = get_working_hours(date, support_hours)
|
||||
initial_frt += get_elapsed_time(start_time, end_time)
|
||||
|
||||
return initial_frt
|
||||
|
||||
def is_before_working_hours(date, support_hours):
|
||||
start_time, end_time = get_working_hours(date, support_hours)
|
||||
time = get_time_in_seconds(date)
|
||||
if time < start_time:
|
||||
return True
|
||||
return False
|
||||
@@ -5,69 +5,69 @@ from __future__ import unicode_literals
|
||||
import frappe
|
||||
import unittest
|
||||
from erpnext.support.doctype.service_level_agreement.test_service_level_agreement import create_service_level_agreements_for_issues
|
||||
from frappe.utils import now_datetime, get_datetime, flt
|
||||
import datetime
|
||||
from datetime import timedelta
|
||||
from frappe.core.doctype.user_permission.test_user_permission import create_user
|
||||
from frappe.utils import get_datetime, flt
|
||||
|
||||
class TestIssue(unittest.TestCase):
|
||||
class TestSetUp(unittest.TestCase):
|
||||
def setUp(self):
|
||||
frappe.db.sql("delete from `tabService Level Agreement`")
|
||||
frappe.db.set_value("Support Settings", None, "track_service_level_agreement", 1)
|
||||
create_service_level_agreements_for_issues()
|
||||
|
||||
class TestIssue(TestSetUp):
|
||||
def test_response_time_and_resolution_time_based_on_different_sla(self):
|
||||
creation = datetime.datetime(2019, 3, 4, 12, 0)
|
||||
creation = get_datetime("2019-03-04 12:00")
|
||||
|
||||
# make issue with customer specific SLA
|
||||
customer = create_customer("_Test Customer", "__Test SLA Customer Group", "__Test SLA Territory")
|
||||
issue = make_issue(creation, "_Test Customer", 1)
|
||||
|
||||
self.assertEqual(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0))
|
||||
self.assertEqual(issue.resolution_by, datetime.datetime(2019, 3, 4, 15, 0))
|
||||
self.assertEqual(issue.response_by, get_datetime("2019-03-04 14:00"))
|
||||
self.assertEqual(issue.resolution_by, get_datetime("2019-03-04 15:00"))
|
||||
|
||||
# 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", 2)
|
||||
|
||||
self.assertEqual(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0))
|
||||
self.assertEqual(issue.resolution_by, datetime.datetime(2019, 3, 4, 15, 0))
|
||||
self.assertEqual(issue.response_by, get_datetime("2019-03-04 14:00"))
|
||||
self.assertEqual(issue.resolution_by, get_datetime("2019-03-04 15:00"))
|
||||
|
||||
|
||||
# make issue with territory specific SLA
|
||||
customer = create_customer("___Test Customer", "__Test SLA Customer Group", "_Test SLA Territory")
|
||||
issue = make_issue(creation, "___Test Customer", 3)
|
||||
|
||||
self.assertEqual(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0))
|
||||
self.assertEqual(issue.resolution_by, datetime.datetime(2019, 3, 4, 15, 0))
|
||||
self.assertEqual(issue.response_by, get_datetime("2019-03-04 14:00"))
|
||||
self.assertEqual(issue.resolution_by, get_datetime("2019-03-04 15:00"))
|
||||
|
||||
# make issue with default SLA
|
||||
issue = make_issue(creation=creation, index=4)
|
||||
|
||||
self.assertEqual(issue.response_by, datetime.datetime(2019, 3, 4, 16, 0))
|
||||
self.assertEqual(issue.resolution_by, datetime.datetime(2019, 3, 4, 18, 0))
|
||||
self.assertEqual(issue.response_by, get_datetime("2019-03-04 16:00"))
|
||||
self.assertEqual(issue.resolution_by, get_datetime("2019-03-04 18:00"))
|
||||
|
||||
# make issue with default SLA before working hours
|
||||
creation = datetime.datetime(2019, 3, 4, 7, 0)
|
||||
creation = get_datetime("2019-03-04 7:00")
|
||||
issue = make_issue(creation=creation, index=5)
|
||||
|
||||
self.assertEqual(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0))
|
||||
self.assertEqual(issue.resolution_by, datetime.datetime(2019, 3, 4, 16, 0))
|
||||
self.assertEqual(issue.response_by, get_datetime("2019-03-04 14:00"))
|
||||
self.assertEqual(issue.resolution_by, get_datetime("2019-03-04 16:00"))
|
||||
|
||||
# make issue with default SLA after working hours
|
||||
creation = datetime.datetime(2019, 3, 4, 20, 0)
|
||||
creation = get_datetime("2019-03-04 20:00")
|
||||
issue = make_issue(creation, index=6)
|
||||
|
||||
self.assertEqual(issue.response_by, datetime.datetime(2019, 3, 6, 14, 0))
|
||||
self.assertEqual(issue.resolution_by, datetime.datetime(2019, 3, 6, 16, 0))
|
||||
self.assertEqual(issue.response_by, get_datetime("2019-03-06 14:00"))
|
||||
self.assertEqual(issue.resolution_by, get_datetime("2019-03-06 16:00"))
|
||||
|
||||
# make issue with default SLA next day
|
||||
creation = datetime.datetime(2019, 3, 4, 14, 0)
|
||||
creation = get_datetime("2019-03-04 14:00")
|
||||
issue = make_issue(creation=creation, index=7)
|
||||
|
||||
self.assertEqual(issue.response_by, datetime.datetime(2019, 3, 4, 18, 0))
|
||||
self.assertEqual(issue.resolution_by, datetime.datetime(2019, 3, 6, 12, 0))
|
||||
self.assertEqual(issue.response_by, get_datetime("2019-03-04 18:00"))
|
||||
self.assertEqual(issue.resolution_by, get_datetime("2019-03-06 12:00"))
|
||||
|
||||
frappe.flags.current_time = datetime.datetime(2019, 3, 4, 15, 0)
|
||||
frappe.flags.current_time = get_datetime("2019-03-04 15:00")
|
||||
|
||||
issue.status = 'Closed'
|
||||
issue.save()
|
||||
@@ -75,21 +75,21 @@ class TestIssue(unittest.TestCase):
|
||||
self.assertEqual(issue.agreement_status, 'Fulfilled')
|
||||
|
||||
def test_issue_metrics(self):
|
||||
creation = datetime.datetime(2020, 3, 4, 4, 0)
|
||||
creation = get_datetime("2020-03-04 4:00")
|
||||
|
||||
issue = make_issue(creation, index=1)
|
||||
create_communication(issue.name, "test@example.com", "Received", creation)
|
||||
|
||||
creation = datetime.datetime(2020, 3, 4, 4, 15)
|
||||
creation = get_datetime("2020-03-04 4:15")
|
||||
create_communication(issue.name, "test@admin.com", "Sent", creation)
|
||||
|
||||
creation = datetime.datetime(2020, 3, 4, 5, 0)
|
||||
creation = get_datetime("2020-03-04 5:00")
|
||||
create_communication(issue.name, "test@example.com", "Received", creation)
|
||||
|
||||
creation = datetime.datetime(2020, 3, 4, 5, 5)
|
||||
creation = get_datetime("2020-03-04 5:05")
|
||||
create_communication(issue.name, "test@admin.com", "Sent", creation)
|
||||
|
||||
frappe.flags.current_time = datetime.datetime(2020, 3, 4, 5, 5)
|
||||
frappe.flags.current_time = get_datetime("2020-03-04 5:05")
|
||||
issue.reload()
|
||||
issue.status = 'Closed'
|
||||
issue.save()
|
||||
@@ -99,33 +99,33 @@ class TestIssue(unittest.TestCase):
|
||||
self.assertEqual(issue.user_resolution_time, 1200)
|
||||
|
||||
def test_hold_time_on_replied(self):
|
||||
creation = datetime.datetime(2020, 3, 4, 4, 0)
|
||||
creation = get_datetime("2020-03-04 4:00")
|
||||
|
||||
issue = make_issue(creation, index=1)
|
||||
create_communication(issue.name, "test@example.com", "Received", creation)
|
||||
|
||||
creation = datetime.datetime(2020, 3, 4, 4, 15)
|
||||
creation = get_datetime("2020-03-04 4:15")
|
||||
create_communication(issue.name, "test@admin.com", "Sent", creation)
|
||||
|
||||
frappe.flags.current_time = datetime.datetime(2020, 3, 4, 4, 15)
|
||||
frappe.flags.current_time = get_datetime("2020-03-04 4:15")
|
||||
issue.reload()
|
||||
issue.status = 'Replied'
|
||||
issue.save()
|
||||
|
||||
self.assertEqual(issue.on_hold_since, frappe.flags.current_time)
|
||||
|
||||
creation = datetime.datetime(2020, 3, 4, 5, 0)
|
||||
frappe.flags.current_time = datetime.datetime(2020, 3, 4, 5, 0)
|
||||
creation = get_datetime("2020-03-04 5:00")
|
||||
frappe.flags.current_time = get_datetime("2020-03-04 5:00")
|
||||
create_communication(issue.name, "test@example.com", "Received", creation)
|
||||
|
||||
issue.reload()
|
||||
self.assertEqual(flt(issue.total_hold_time, 2), 2700)
|
||||
self.assertEqual(issue.resolution_by, datetime.datetime(2020, 3, 4, 16, 45))
|
||||
self.assertEqual(issue.resolution_by, get_datetime("2020-03-04 16:45"))
|
||||
|
||||
creation = datetime.datetime(2020, 3, 4, 5, 5)
|
||||
creation = get_datetime("2020-03-04 5:05")
|
||||
create_communication(issue.name, "test@admin.com", "Sent", creation)
|
||||
|
||||
frappe.flags.current_time = datetime.datetime(2020, 3, 4, 5, 5)
|
||||
frappe.flags.current_time = get_datetime("2020-03-04 5:05")
|
||||
issue.reload()
|
||||
issue.status = 'Closed'
|
||||
issue.save()
|
||||
@@ -133,6 +133,223 @@ class TestIssue(unittest.TestCase):
|
||||
issue.reload()
|
||||
self.assertEqual(flt(issue.total_hold_time, 2), 2700)
|
||||
|
||||
class TestFirstResponseTime(TestSetUp):
|
||||
# working hours used in all cases: Mon-Fri, 10am to 6pm
|
||||
# all dates are in the mm-dd-yyyy format
|
||||
|
||||
# issue creation and first response are on the same day
|
||||
def test_first_response_time_case1(self):
|
||||
"""
|
||||
Test frt when issue creation and first response are during working hours on the same day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 11:00"), get_datetime("06-28-2021 12:00"))
|
||||
self.assertEqual(issue.first_response_time, 3600.0)
|
||||
|
||||
def test_first_response_time_case2(self):
|
||||
"""
|
||||
Test frt when issue creation was during working hours, but first response is sent after working hours on the same day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("06-28-2021 20:00"))
|
||||
self.assertEqual(issue.first_response_time, 21600.0)
|
||||
|
||||
def test_first_response_time_case3(self):
|
||||
"""
|
||||
Test frt when issue creation was before working hours but first response is sent during working hours on the same day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("06-28-2021 12:00"))
|
||||
self.assertEqual(issue.first_response_time, 7200.0)
|
||||
|
||||
def test_first_response_time_case4(self):
|
||||
"""
|
||||
Test frt when both issue creation and first response were after working hours on the same day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 19:00"), get_datetime("06-28-2021 20:00"))
|
||||
self.assertEqual(issue.first_response_time, 1.0)
|
||||
|
||||
def test_first_response_time_case5(self):
|
||||
"""
|
||||
Test frt when both issue creation and first response are on the same day, but it's not a work day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-27-2021 10:00"), get_datetime("06-27-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 1.0)
|
||||
|
||||
# issue creation and first response are on consecutive days
|
||||
def test_first_response_time_case6(self):
|
||||
"""
|
||||
Test frt when the issue was created before working hours and the first response is also sent before working hours, but on the next day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("06-29-2021 6:00"))
|
||||
self.assertEqual(issue.first_response_time, 28800.0)
|
||||
|
||||
def test_first_response_time_case7(self):
|
||||
"""
|
||||
Test frt when the issue was created before working hours and the first response is sent during working hours, but on the next day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("06-29-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 32400.0)
|
||||
|
||||
def test_first_response_time_case8(self):
|
||||
"""
|
||||
Test frt when the issue was created before working hours and the first response is sent after working hours, but on the next day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("06-29-2021 20:00"))
|
||||
self.assertEqual(issue.first_response_time, 57600.0)
|
||||
|
||||
def test_first_response_time_case9(self):
|
||||
"""
|
||||
Test frt when the issue was created before working hours and the first response is sent on the next day, which is not a work day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-25-2021 6:00"), get_datetime("06-26-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 28800.0)
|
||||
|
||||
def test_first_response_time_case10(self):
|
||||
"""
|
||||
Test frt when the issue was created during working hours and the first response is sent before working hours, but on the next day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("06-29-2021 6:00"))
|
||||
self.assertEqual(issue.first_response_time, 21600.0)
|
||||
|
||||
def test_first_response_time_case11(self):
|
||||
"""
|
||||
Test frt when the issue was created during working hours and the first response is also sent during working hours, but on the next day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("06-29-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 25200.0)
|
||||
|
||||
def test_first_response_time_case12(self):
|
||||
"""
|
||||
Test frt when the issue was created during working hours and the first response is sent after working hours, but on the next day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("06-29-2021 20:00"))
|
||||
self.assertEqual(issue.first_response_time, 50400.0)
|
||||
|
||||
def test_first_response_time_case13(self):
|
||||
"""
|
||||
Test frt when the issue was created during working hours and the first response is sent on the next day, which is not a work day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-25-2021 12:00"), get_datetime("06-26-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 21600.0)
|
||||
|
||||
def test_first_response_time_case14(self):
|
||||
"""
|
||||
Test frt when the issue was created after working hours and the first response is sent before working hours, but on the next day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("06-29-2021 6:00"))
|
||||
self.assertEqual(issue.first_response_time, 1.0)
|
||||
|
||||
def test_first_response_time_case15(self):
|
||||
"""
|
||||
Test frt when the issue was created after working hours and the first response is sent during working hours, but on the next day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("06-29-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 3600.0)
|
||||
|
||||
def test_first_response_time_case16(self):
|
||||
"""
|
||||
Test frt when the issue was created after working hours and the first response is also sent after working hours, but on the next day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("06-29-2021 20:00"))
|
||||
self.assertEqual(issue.first_response_time, 28800.0)
|
||||
|
||||
def test_first_response_time_case17(self):
|
||||
"""
|
||||
Test frt when the issue was created after working hours and the first response is sent on the next day, which is not a work day.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-25-2021 20:00"), get_datetime("06-26-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 1.0)
|
||||
|
||||
# issue creation and first response are a few days apart
|
||||
def test_first_response_time_case18(self):
|
||||
"""
|
||||
Test frt when the issue was created before working hours and the first response is also sent before working hours, but after a few days.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("07-01-2021 6:00"))
|
||||
self.assertEqual(issue.first_response_time, 86400.0)
|
||||
|
||||
def test_first_response_time_case19(self):
|
||||
"""
|
||||
Test frt when the issue was created before working hours and the first response is sent during working hours, but after a few days.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("07-01-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 90000.0)
|
||||
|
||||
def test_first_response_time_case20(self):
|
||||
"""
|
||||
Test frt when the issue was created before working hours and the first response is sent after working hours, but after a few days.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 6:00"), get_datetime("07-01-2021 20:00"))
|
||||
self.assertEqual(issue.first_response_time, 115200.0)
|
||||
|
||||
def test_first_response_time_case21(self):
|
||||
"""
|
||||
Test frt when the issue was created before working hours and the first response is sent after a few days, on a holiday.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-25-2021 6:00"), get_datetime("06-27-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 28800.0)
|
||||
|
||||
def test_first_response_time_case22(self):
|
||||
"""
|
||||
Test frt when the issue was created during working hours and the first response is sent before working hours, but after a few days.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("07-01-2021 6:00"))
|
||||
self.assertEqual(issue.first_response_time, 79200.0)
|
||||
|
||||
def test_first_response_time_case23(self):
|
||||
"""
|
||||
Test frt when the issue was created during working hours and the first response is also sent during working hours, but after a few days.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("07-01-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 82800.0)
|
||||
|
||||
def test_first_response_time_case24(self):
|
||||
"""
|
||||
Test frt when the issue was created during working hours and the first response is sent after working hours, but after a few days.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 12:00"), get_datetime("07-01-2021 20:00"))
|
||||
self.assertEqual(issue.first_response_time, 108000.0)
|
||||
|
||||
def test_first_response_time_case25(self):
|
||||
"""
|
||||
Test frt when the issue was created during working hours and the first response is sent after a few days, on a holiday.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-25-2021 12:00"), get_datetime("06-27-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 21600.0)
|
||||
|
||||
def test_first_response_time_case26(self):
|
||||
"""
|
||||
Test frt when the issue was created after working hours and the first response is sent before working hours, but after a few days.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("07-01-2021 6:00"))
|
||||
self.assertEqual(issue.first_response_time, 57600.0)
|
||||
|
||||
def test_first_response_time_case27(self):
|
||||
"""
|
||||
Test frt when the issue was created after working hours and the first response is sent during working hours, but after a few days.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("07-01-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 61200.0)
|
||||
|
||||
def test_first_response_time_case28(self):
|
||||
"""
|
||||
Test frt when the issue was created after working hours and the first response is also sent after working hours, but after a few days.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-28-2021 20:00"), get_datetime("07-01-2021 20:00"))
|
||||
self.assertEqual(issue.first_response_time, 86400.0)
|
||||
|
||||
def test_first_response_time_case29(self):
|
||||
"""
|
||||
Test frt when the issue was created after working hours and the first response is sent after a few days, on a holiday.
|
||||
"""
|
||||
issue = create_issue_and_communication(get_datetime("06-25-2021 20:00"), get_datetime("06-27-2021 11:00"))
|
||||
self.assertEqual(issue.first_response_time, 1.0)
|
||||
|
||||
def create_issue_and_communication(issue_creation, first_responded_on):
|
||||
issue = make_issue(issue_creation, index=1)
|
||||
sender = create_user("test@admin.com")
|
||||
create_communication(issue.name, sender.email, "Sent", first_responded_on)
|
||||
issue.reload()
|
||||
|
||||
return issue
|
||||
|
||||
def make_issue(creation=None, customer=None, index=0, priority=None, issue_type=None):
|
||||
issue = frappe.get_doc({
|
||||
@@ -185,7 +402,7 @@ def create_territory(territory):
|
||||
|
||||
|
||||
def create_communication(reference_name, sender, sent_or_received, creation):
|
||||
issue = frappe.get_doc({
|
||||
communication = frappe.get_doc({
|
||||
"doctype": "Communication",
|
||||
"communication_type": "Communication",
|
||||
"communication_medium": "Email",
|
||||
@@ -199,4 +416,4 @@ def create_communication(reference_name, sender, sent_or_received, creation):
|
||||
"creation": creation,
|
||||
"reference_name": reference_name
|
||||
})
|
||||
issue.save()
|
||||
communication.save()
|
||||
@@ -145,16 +145,6 @@ def create_service_level_agreement(default_service_level_agreement, holiday_list
|
||||
"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",
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user