From 67526f244ec66f9557c6ff387c43c7939136f9db Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 23 Jun 2017 20:20:01 +0530 Subject: [PATCH] [enhance] Report for analysis of support hours count --- erpnext/config/support.py | 6 ++ .../docs/assets/img/support/support_hours.png | Bin 0 -> 48805 bytes .../user/manual/en/support/support_reports.md | 8 ++ .../support/report/support_hours/__init__.py | 0 .../report/support_hours/support_hours.js | 39 ++++++++++ .../report/support_hours/support_hours.json | 27 +++++++ .../report/support_hours/support_hours.py | 73 ++++++++++++++++++ 7 files changed, 153 insertions(+) create mode 100644 erpnext/docs/assets/img/support/support_hours.png create mode 100644 erpnext/docs/user/manual/en/support/support_reports.md create mode 100644 erpnext/support/report/support_hours/__init__.py create mode 100644 erpnext/support/report/support_hours/support_hours.js create mode 100644 erpnext/support/report/support_hours/support_hours.json create mode 100644 erpnext/support/report/support_hours/support_hours.py diff --git a/erpnext/config/support.py b/erpnext/config/support.py index c1f56f0516..b85c430899 100644 --- a/erpnext/config/support.py +++ b/erpnext/config/support.py @@ -49,6 +49,12 @@ def get_data(): "doctype": "Issue", "is_query_report": True }, + { + "type": "report", + "name": "Support Hours", + "doctype": "Issue", + "is_query_report": True + }, ] }, ] diff --git a/erpnext/docs/assets/img/support/support_hours.png b/erpnext/docs/assets/img/support/support_hours.png new file mode 100644 index 0000000000000000000000000000000000000000..44cfbbbdaabf9bcd061c46c89043293a74b5cd64 GIT binary patch literal 48805 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 literal 0 HcmV?d00001 diff --git a/erpnext/docs/user/manual/en/support/support_reports.md b/erpnext/docs/user/manual/en/support/support_reports.md new file mode 100644 index 0000000000..2be72e10ef --- /dev/null +++ b/erpnext/docs/user/manual/en/support/support_reports.md @@ -0,0 +1,8 @@ + + +### Support Hours +This report provide the information about the time slot along with the count of issues has been reported during the slot daywise. + +> Support > Reports > Support Hours + +Maintenance Visit diff --git a/erpnext/support/report/support_hours/__init__.py b/erpnext/support/report/support_hours/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/support/report/support_hours/support_hours.js b/erpnext/support/report/support_hours/support_hours.js new file mode 100644 index 0000000000..439b7678ee --- /dev/null +++ b/erpnext/support/report/support_hours/support_hours.js @@ -0,0 +1,39 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.query_reports["Support Hours"] = { + "filters": [ + { + 'lable': __("From Date"), + 'fieldname': 'from_date', + 'fieldtype': 'Date', + 'default': frappe.datetime.nowdate(), + 'reqd': 1 + }, + { + 'lable': __("To Date"), + 'fieldname': 'to_date', + 'fieldtype': 'Date', + 'default': frappe.datetime.nowdate(), + 'reqd': 1 + } + ], + get_chart_data: function(columns, result) { + return { + data: { + x: 'Date', + columns: [ + ['Date'].concat($.map(result, function(d) { return d.date; })), + [columns[3].label].concat($.map(result, function(d) { return d[columns[3].label]; })), + [columns[4].label].concat($.map(result, function(d) { return d[columns[4].label]; })), + [columns[5].label].concat($.map(result, function(d) { return d[columns[5].label]; })), + [columns[6].label].concat($.map(result, function(d) { return d[columns[6].label]; })), + [columns[7].label].concat($.map(result, function(d) { return d[columns[7].label]; })) + ] + }, + chart_type: 'bar', + + } + } +} diff --git a/erpnext/support/report/support_hours/support_hours.json b/erpnext/support/report/support_hours/support_hours.json new file mode 100644 index 0000000000..01e4bb44cb --- /dev/null +++ b/erpnext/support/report/support_hours/support_hours.json @@ -0,0 +1,27 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2017-06-23 14:21:37.558691", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "letter_head": "", + "modified": "2017-06-23 16:33:31.211390", + "modified_by": "Administrator", + "module": "Support", + "name": "Support Hours", + "owner": "Administrator", + "ref_doctype": "Issue", + "report_name": "Support Hours", + "report_type": "Script Report", + "roles": [ + { + "role": "Support Team" + }, + { + "role": "System Manager" + } + ] +} \ No newline at end of file diff --git a/erpnext/support/report/support_hours/support_hours.py b/erpnext/support/report/support_hours/support_hours.py new file mode 100644 index 0000000000..f1606cd646 --- /dev/null +++ b/erpnext/support/report/support_hours/support_hours.py @@ -0,0 +1,73 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.utils import add_to_date, getdate, get_datetime + +time_slots = { + '12AM - 3AM': '00:00:00-03:00:00', + '3AM - 6AM': '03:00:00-06:00:00', + '6AM - 9AM': '06:00:00-09:00:00', + '9AM - 12PM': '09:00:00-12:00:00', + '12PM - 3PM': '12:00:00-15:00:00', + '3PM - 6PM': '15:00:00-18:00:00', + '6PM - 9PM': '18:00:00-21:00:00', + '9PM - 12AM': '21:00:00-23:00:00' +} + +def execute(filters=None): + columns, data = [], [] + if not filters.get('periodicity'): + filters['periodicity'] = 'Daily' + + columns = get_columns() + data = get_data(filters) + return columns, data + +def get_data(filters): + start_date = getdate(filters.from_date) + data = [] + while(start_date <= getdate(filters.to_date)): + hours_count = {'date': start_date} + for key, value in time_slots.items(): + start_time, end_time = value.split('-') + start_time = get_datetime("{0} {1}".format(start_date.strftime("%Y-%m-%d"), start_time)) + end_time = get_datetime("{0} {1}".format(start_date.strftime("%Y-%m-%d"), end_time)) + hours_count[key] = get_hours_count(start_time, end_time) + + if hours_count: + data.append(hours_count) + + start_date = add_to_date(start_date, days=1) + + return data + +def get_hours_count(start_time, end_time): + data = frappe.db.sql(""" select count(*) from `tabIssue` where creation + between %(start_time)s and %(end_time)s""", { + 'start_time': start_time, + 'end_time': end_time + }, as_list=1) or [] + + return data[0][0] if len(data) > 0 else 0 + +def get_columns(): + columns = [{ + "fieldname": "date", + "label": _("Date"), + "fieldtype": "Date", + "width": 100 + }] + + for label in ['12AM - 3AM', '3AM - 6AM', '6AM - 9AM', + '9AM - 12PM', '12PM - 3PM', '3PM - 6PM', '6PM - 9PM', '9PM - 12AM']: + columns.append({ + "fieldname": label, + "label": _(label), + "fieldtype": "Data", + "width": 120 + }) + + return columns \ No newline at end of file