diff --git a/home/page/latest_updates/latest_updates.js b/home/page/latest_updates/latest_updates.js index 926d607e8fe..80d3d5ff7e4 100644 --- a/home/page/latest_updates/latest_updates.js +++ b/home/page/latest_updates/latest_updates.js @@ -1,4 +1,8 @@ erpnext.updates = [ + ["4th January 2013", [ + "Support Analytics: Simple Tool to Plot Number Tickets and time to Closing", + "Workflow: Added Workflow Help", + ]], ["2nd January 2013", [ "Permission Manager: New Design with better help and better advanced permission selection.", "User Properties: Better way to set User Properties (defaults).", diff --git a/startup/report_data_map.py b/startup/report_data_map.py index c7a8ab7e7ef..41d6cb868aa 100644 --- a/startup/report_data_map.py +++ b/startup/report_data_map.py @@ -215,6 +215,13 @@ data_map = { "parent": ["Purchase Invoice", "name"], "item_code": ["Item", "name"] } + }, + + # Support + "Support Ticket": { + "columns": ["name","status","creation","modified"], + "conditions": ["docstatus < 2"], + "order_by": "creation" } } diff --git a/support/page/support_analytics/__init__.py b/support/page/support_analytics/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/support/page/support_analytics/support_analytics.js b/support/page/support_analytics/support_analytics.js new file mode 100644 index 00000000000..e310df30a3a --- /dev/null +++ b/support/page/support_analytics/support_analytics.js @@ -0,0 +1,91 @@ +wn.pages['support-analytics'].onload = function(wrapper) { + wn.ui.make_app_page({ + parent: wrapper, + title: 'Support Analytics', + single_column: true + }); + + new erpnext.SupportAnalytics(wrapper); + + wrapper.appframe.add_home_breadcrumb() + wrapper.appframe.add_module_breadcrumb("Support") + wrapper.appframe.add_breadcrumb("icon-bar-chart") +} + +erpnext.SupportAnalytics = wn.views.GridReportWithPlot.extend({ + init: function(wrapper) { + this._super({ + title: "Support Analtyics", + page: wrapper, + parent: $(wrapper).find('.layout-main'), + appframe: wrapper.appframe, + doctypes: ["Support Ticket", "Fiscal Year"], + }); + }, + + filters: [ + {fieldtype:"Select", label: "Fiscal Year", link:"Fiscal Year", + default_value: "Select Fiscal Year..."}, + {fieldtype:"Date", label: "From Date"}, + {fieldtype:"Label", label: "To"}, + {fieldtype:"Date", label: "To Date"}, + {fieldtype:"Select", label: "Range", + options:["Daily", "Weekly", "Monthly", "Quarterly", "Yearly"]}, + {fieldtype:"Button", label: "Refresh", icon:"icon-refresh icon-white", cssClass:"btn-info"}, + {fieldtype:"Button", label: "Reset Filters"} + ], + + setup_columns: function() { + var std_columns = [ + {id: "check", name: "Plot", field: "check", width: 30, + formatter: this.check_formatter}, + {id: "status", name: "Status", field: "status", width: 100}, + ]; + this.make_date_range_columns(); + this.columns = std_columns.concat(this.columns); + }, + + prepare_data: function() { + // add Opening, Closing, Totals rows + // if filtered by account and / or voucher + var me = this; + var total_tickets = {status:"All Tickets", "id": "all-tickets", + checked:true}; + var days_to_close = {status:"Days to Close", "id":"days-to-close", + checked:false}; + var hours_to_close = {status:"Hours to Close", "id":"hours-to-close", + checked:false}; + + + $.each(wn.report_dump.data["Support Ticket"], function(i, d) { + var dateobj = dateutil.str_to_obj(d.creation); + var date = d.creation.split(" ")[0]; + var col = me.column_map[date]; + if(col) { + // just count + var day_diff = dateutil.get_diff(d.modified, d.creation); + var hour_diff = dateutil.get_hour_diff(d.modified, d.creation); + + total_tickets[col.field] = flt(total_tickets[col.field]) + 1; + days_to_close[col.field] = flt(days_to_close[col.field]) + day_diff; + hours_to_close[col.field] = flt(hours_to_close[col.field]) + hour_diff; + } + }); + + // make averages + $.each(this.columns, function(i, col) { + if(col.formatter==me.currency_formatter && total_tickets[col.field]) { + days_to_close[col.field] = flt(days_to_close[col.field]) / flt(total_tickets[col.field]); + hours_to_close[col.field] = flt(hours_to_close[col.field]) / flt(total_tickets[col.field]); + } + }) + + this.data = [total_tickets, days_to_close, hours_to_close]; + }, + + get_plot_points: function(item, col, idx) { + return [[dateutil.str_to_obj(col.id).getTime(), item[col.field]], + [dateutil.user_to_obj(col.name).getTime(), item[col.field]]]; + } + +}); \ No newline at end of file diff --git a/support/page/support_analytics/support_analytics.txt b/support/page/support_analytics/support_analytics.txt new file mode 100644 index 00000000000..587bd935473 --- /dev/null +++ b/support/page/support_analytics/support_analytics.txt @@ -0,0 +1,32 @@ +[ + { + "owner": "Administrator", + "docstatus": 0, + "creation": "2013-01-04 15:31:45", + "modified_by": "Administrator", + "modified": "2013-01-04 15:38:44" + }, + { + "name": "__common__", + "title": "Support Analytics", + "doctype": "Page", + "module": "Support", + "standard": "Yes", + "page_name": "support-analytics" + }, + { + "name": "__common__", + "parent": "support-analytics", + "doctype": "Page Role", + "parenttype": "Page", + "role": "Support Team", + "parentfield": "roles" + }, + { + "name": "support-analytics", + "doctype": "Page" + }, + { + "doctype": "Page Role" + } +] \ No newline at end of file diff --git a/support/page/support_home/support_home.html b/support/page/support_home/support_home.html index ed01fa094e3..d444d73dcef 100644 --- a/support/page/support_home/support_home.html +++ b/support/page/support_home/support_home.html @@ -27,6 +27,17 @@

Reports

+
+
+ Support Analytics +
+

Support Ticket trends and response.

+
+
+
+
+
+

Reports