From 25edac451d5e837dd87cee5d711fe320ad42add5 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 <42651287+deepeshgarg007@users.noreply.github.com> Date: Thu, 18 Oct 2018 17:43:41 +0530 Subject: [PATCH] Production Analytics Query Report (#15673) * Production Analytics Query Report * Changes in production analytics report * Updated json file and other changes --- .../report/production_analytics/__init__.py | 0 .../production_analytics.js | 46 +++++ .../production_analytics.json | 27 +++ .../production_analytics.py | 162 ++++++++++++++++++ 4 files changed, 235 insertions(+) create mode 100644 erpnext/manufacturing/report/production_analytics/__init__.py create mode 100644 erpnext/manufacturing/report/production_analytics/production_analytics.js create mode 100644 erpnext/manufacturing/report/production_analytics/production_analytics.json create mode 100644 erpnext/manufacturing/report/production_analytics/production_analytics.py diff --git a/erpnext/manufacturing/report/production_analytics/__init__.py b/erpnext/manufacturing/report/production_analytics/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/manufacturing/report/production_analytics/production_analytics.js b/erpnext/manufacturing/report/production_analytics/production_analytics.js new file mode 100644 index 0000000000..b7b8f05d89 --- /dev/null +++ b/erpnext/manufacturing/report/production_analytics/production_analytics.js @@ -0,0 +1,46 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.query_reports["Production Analytics"] = { + "filters": [ + { + fieldname: "company", + label: __("Company"), + fieldtype: "Link", + options: "Company", + default: frappe.defaults.get_user_default("Company"), + reqd: 1 + }, + { + fieldname: "from_date", + label: __("From Date"), + fieldtype: "Date", + default: frappe.defaults.get_user_default("year_start_date"), + reqd: 1 + }, + { + fieldname:"to_date", + label: __("To Date"), + fieldtype: "Date", + default: frappe.defaults.get_user_default("year_end_date"), + reqd: 1 + }, + { + fieldname: "range", + label: __("Range"), + fieldtype: "Select", + options: [ + { "value": "Weekly", "label": __("Weekly") }, + { "value": "Monthly", "label": __("Monthly") }, + { "value": "Quarterly", "label": __("Quarterly") }, + { "value": "Yearly", "label": __("Yearly") } + ], + default: "Monthly", + reqd: 1 + } + ], + "formatter": function(value, row, column, data) { + return value; + } +} diff --git a/erpnext/manufacturing/report/production_analytics/production_analytics.json b/erpnext/manufacturing/report/production_analytics/production_analytics.json new file mode 100644 index 0000000000..023e0a8929 --- /dev/null +++ b/erpnext/manufacturing/report/production_analytics/production_analytics.json @@ -0,0 +1,27 @@ +{ + "add_total_row": 0, + "creation": "2018-10-11 19:28:37.085066", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "letter_head": "", + "modified": "2018-10-11 19:28:37.085066", + "modified_by": "Administrator", + "module": "Manufacturing", + "name": "Production Analytics", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Work Order", + "report_name": "Production Analytics", + "report_type": "Script Report", + "roles": [ + { + "role": "Manufacturing User" + }, + { + "role": "Stock User" + } + ] +} \ No newline at end of file diff --git a/erpnext/manufacturing/report/production_analytics/production_analytics.py b/erpnext/manufacturing/report/production_analytics/production_analytics.py new file mode 100644 index 0000000000..1dc821c6e1 --- /dev/null +++ b/erpnext/manufacturing/report/production_analytics/production_analytics.py @@ -0,0 +1,162 @@ +# 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 getdate +from erpnext.selling.report.sales_analytics.sales_analytics import (get_period_date_ranges,get_period) + +def execute(filters=None): + columns = get_columns(filters) + data, chart = get_data(filters,columns) + return columns, data,None ,chart + +def get_columns(filters): + + columns =[ + { + "label": _("Status"), + "fieldname": "Status", + "fieldtype": "Data", + "width": 140 + }] + + ranges = get_period_date_ranges(period=filters["range"], year_start_date = filters["from_date"],year_end_date=filters["to_date"]) + + for dummy, end_date in ranges: + + label = field_name = get_period(end_date,filters["range"]) + + columns.append( + { + "label": _(label), + "field_name":field_name, + "fieldtype": "Float", + "width": 120 + }, + ) + + return columns + +def get_data_list(filters,entry): + + data_list = { + "All Work Orders" : {}, + "Not Started" : {}, + "Overdue" : {}, + "Pending" : {}, + "Completed" : {} + } + + ranges = get_period_date_ranges(period=filters["range"], year_start_date = filters["from_date"],year_end_date=filters["to_date"]) + + for from_date,end_date in ranges: + period = get_period(end_date,filters["range"]) + for d in entry: + if getdate(d.creation) <= getdate(from_date) or getdate(d.creation) <= getdate(end_date) : + data_list = update_data_list(data_list,"All Work Orders",period) + + if d.status == 'Completed': + if getdate(d.actual_end_date) < getdate(from_date) or getdate(d.modified) < getdate(from_date): + data_list = update_data_list(data_list, "Completed",period) + + elif getdate(d.actual_start_date) < getdate(from_date) : + data_list = update_data_list(data_list, "Pending", period) + + elif getdate(d.planned_start_date) < getdate(from_date) : + data_list = update_data_list(data_list, "Overdue", period) + + else: + data_list = update_data_list(data_list, "Not Started", period) + + elif d.status == 'In Process': + if getdate(d.actual_start_date) < getdate(from_date) : + data_list = update_data_list(data_list, "Pending", period) + + elif getdate(d.planned_start_date) < getdate(from_date) : + data_list = update_data_list(data_list, "Overdue", period) + + else: + data_list = update_data_list(data_list, "Not Started", period) + + elif d.status == 'Not Started': + if getdate(d.planned_start_date) < getdate(from_date) : + data_list = update_data_list(data_list, "Overdue", period) + + else: + data_list = update_data_list(data_list, "Not Started", period) + return data_list + +def update_data_list(data_list, status, period): + if data_list.get(status).get(period): + data_list[status][period] += 1 + else: + data_list[status][period] = 1 + + return data_list + +def get_data(filters,columns): + + data = [] + + entry = frappe.get_all("Work Order", + fields=["creation", "modified", "actual_start_date", "actual_end_date", "planned_start_date", "planned_end_date", "status"], + filters={"docstatus" : 1, "company" : filters["company"] }) + + data_list = get_data_list(filters,entry) + + labels = ["All Work Orders", "Not Started", "Overdue", "Pending", "Completed"] + + chart_data = get_chart_data(data_list,columns) + + ranges = get_period_date_ranges(period=filters["range"], year_start_date = filters["from_date"],year_end_date=filters["to_date"]) + + for label in labels: + work = {} + work["Status"] = label + for dummy,end_date in ranges: + period = get_period(end_date,filters["range"]) + if data_list.get(label).get(period): + work[period] = data_list.get(label).get(period) + else: + work[period] = 0.0 + data.append(work) + + return data, chart_data + +def get_chart_data(data_list,columns): + + labels = [d.get("label") for d in columns[1:]] + + all_data, not_start, overdue, pending, completed = [], [], [] , [], [] + datasets = [] + + for d in labels: + all_data.append(data_list.get("All Work Orders").get(d)) + not_start.append(data_list.get("Not Started").get(d)) + overdue.append(data_list.get("Overdue").get(d)) + pending.append(data_list.get("Pending").get(d)) + completed.append(data_list.get("Completed").get(d)) + + datasets.append({'name':'All Work Orders', 'values': all_data}) + datasets.append({'name':'Not Started', 'values': not_start}) + datasets.append({'name':'Overdue', 'values': overdue}) + datasets.append({'name':'Pending', 'values': pending}) + datasets.append({'name':'Completed', 'values': completed}) + + chart = { + "data": { + 'labels': labels, + 'datasets':datasets + } + } + + chart["type"] = "line" + + return chart + + + + +