From 5668795884919f6fee4703ce9da2d6386148f3fd Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 5 Mar 2025 13:48:34 +0530 Subject: [PATCH 1/3] fix: production analytics report (cherry picked from commit 772e9ecfaab0b71a51b3769e2f621ffae11e7095) --- .../production_analytics.py | 57 +++++++------------ 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/erpnext/manufacturing/report/production_analytics/production_analytics.py b/erpnext/manufacturing/report/production_analytics/production_analytics.py index e511612d3a3..0a69cd5b1c0 100644 --- a/erpnext/manufacturing/report/production_analytics/production_analytics.py +++ b/erpnext/manufacturing/report/production_analytics/production_analytics.py @@ -4,7 +4,7 @@ import frappe from frappe import _, scrub -from frappe.utils import getdate +from frappe.utils import getdate, today from erpnext.stock.report.stock_analytics.stock_analytics import get_period, get_period_date_ranges @@ -30,7 +30,6 @@ def get_columns(filters): def get_periodic_data(filters, entry): periodic_data = { - "All Work Orders": {}, "Not Started": {}, "Overdue": {}, "Pending": {}, @@ -42,33 +41,26 @@ def get_periodic_data(filters, entry): for from_date, end_date in ranges: period = get_period(end_date, filters) for d in entry: - if getdate(d.creation) <= getdate(from_date) or getdate(d.creation) <= getdate(end_date): - periodic_data = update_periodic_data(periodic_data, "All Work Orders", period) - if d.status == "Completed": - if getdate(d.actual_end_date) < getdate(from_date) or getdate(d.modified) < getdate( - from_date - ): - periodic_data = update_periodic_data(periodic_data, "Completed", period) - elif getdate(d.actual_start_date) < getdate(from_date): - periodic_data = update_periodic_data(periodic_data, "Pending", period) - elif getdate(d.planned_start_date) < getdate(from_date): - periodic_data = update_periodic_data(periodic_data, "Overdue", period) - else: - periodic_data = update_periodic_data(periodic_data, "Not Started", period) + if getdate(from_date) <= getdate(d.creation) <= getdate(end_date) and d.status not in [ + "Draft", + "Submitted", + "Completed", + "Stopped", + "Closed", + "Cancelled", + ]: + if d.status == "Not Started": + periodic_data = update_periodic_data(periodic_data, "Not Started", period) + elif today() > getdate(d.planned_end_date): + periodic_data = update_periodic_data(periodic_data, "Overdue", period) + elif today() < getdate(d.planned_end_date): + periodic_data = update_periodic_data(periodic_data, "Pending", period) - elif d.status == "In Process": - if getdate(d.actual_start_date) < getdate(from_date): - periodic_data = update_periodic_data(periodic_data, "Pending", period) - elif getdate(d.planned_start_date) < getdate(from_date): - periodic_data = update_periodic_data(periodic_data, "Overdue", period) - else: - periodic_data = update_periodic_data(periodic_data, "Not Started", period) - - elif d.status == "Not Started": - if getdate(d.planned_start_date) < getdate(from_date): - periodic_data = update_periodic_data(periodic_data, "Overdue", period) - else: - periodic_data = update_periodic_data(periodic_data, "Not Started", period) + if ( + getdate(from_date) <= getdate(d.actual_end_date) <= getdate(end_date) + and d.status == "Completed" + ): + periodic_data = update_periodic_data(periodic_data, "Completed", period) return periodic_data @@ -88,10 +80,7 @@ def get_data(filters, columns): "Work Order", fields=[ "creation", - "modified", - "actual_start_date", "actual_end_date", - "planned_start_date", "planned_end_date", "status", ], @@ -100,7 +89,7 @@ def get_data(filters, columns): periodic_data = get_periodic_data(filters, entry) - labels = ["All Work Orders", "Not Started", "Overdue", "Pending", "Completed"] + labels = ["Not Started", "Overdue", "Pending", "Completed"] chart_data = get_chart_data(periodic_data, columns) ranges = get_period_date_ranges(filters) @@ -121,17 +110,15 @@ def get_data(filters, columns): def get_chart_data(periodic_data, columns): labels = [d.get("label") for d in columns[1:]] - all_data, not_start, overdue, pending, completed = [], [], [], [], [] + not_start, overdue, pending, completed = [], [], [], [] datasets = [] for d in labels: - all_data.append(periodic_data.get("All Work Orders").get(d)) not_start.append(periodic_data.get("Not Started").get(d)) overdue.append(periodic_data.get("Overdue").get(d)) pending.append(periodic_data.get("Pending").get(d)) completed.append(periodic_data.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}) From 6f760d197d9620aac598ec8b2cbe509723f71d04 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 5 Mar 2025 13:56:10 +0530 Subject: [PATCH 2/3] fix: use else instead of unnecessary elif (cherry picked from commit 961258a4ce5116b0b93ba6a538aa750012560267) --- .../report/production_analytics/production_analytics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/report/production_analytics/production_analytics.py b/erpnext/manufacturing/report/production_analytics/production_analytics.py index 0a69cd5b1c0..4b09de87ba6 100644 --- a/erpnext/manufacturing/report/production_analytics/production_analytics.py +++ b/erpnext/manufacturing/report/production_analytics/production_analytics.py @@ -53,7 +53,7 @@ def get_periodic_data(filters, entry): periodic_data = update_periodic_data(periodic_data, "Not Started", period) elif today() > getdate(d.planned_end_date): periodic_data = update_periodic_data(periodic_data, "Overdue", period) - elif today() < getdate(d.planned_end_date): + else: periodic_data = update_periodic_data(periodic_data, "Pending", period) if ( From 7749814571d8f373ada0c99111d483a47718bd51 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 5 Mar 2025 15:14:54 +0530 Subject: [PATCH 3/3] feat: add new Closed and Stopped rows (cherry picked from commit 6cc3d678352fad2c7cdc349cf90562b50091b611) --- .../production_analytics.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/erpnext/manufacturing/report/production_analytics/production_analytics.py b/erpnext/manufacturing/report/production_analytics/production_analytics.py index 4b09de87ba6..1c4082233e1 100644 --- a/erpnext/manufacturing/report/production_analytics/production_analytics.py +++ b/erpnext/manufacturing/report/production_analytics/production_analytics.py @@ -34,6 +34,8 @@ def get_periodic_data(filters, entry): "Overdue": {}, "Pending": {}, "Completed": {}, + "Closed": {}, + "Stopped": {}, } ranges = get_period_date_ranges(filters) @@ -45,15 +47,13 @@ def get_periodic_data(filters, entry): "Draft", "Submitted", "Completed", - "Stopped", - "Closed", "Cancelled", ]: - if d.status == "Not Started": - periodic_data = update_periodic_data(periodic_data, "Not Started", period) + if d.status in ["Not Started", "Closed", "Stopped"]: + periodic_data = update_periodic_data(periodic_data, d.status, period) elif today() > getdate(d.planned_end_date): periodic_data = update_periodic_data(periodic_data, "Overdue", period) - else: + elif today() < getdate(d.planned_end_date): periodic_data = update_periodic_data(periodic_data, "Pending", period) if ( @@ -89,7 +89,7 @@ def get_data(filters, columns): periodic_data = get_periodic_data(filters, entry) - labels = ["Not Started", "Overdue", "Pending", "Completed"] + labels = ["Not Started", "Overdue", "Pending", "Completed", "Closed", "Stopped"] chart_data = get_chart_data(periodic_data, columns) ranges = get_period_date_ranges(filters) @@ -110,7 +110,7 @@ def get_data(filters, columns): def get_chart_data(periodic_data, columns): labels = [d.get("label") for d in columns[1:]] - not_start, overdue, pending, completed = [], [], [], [] + not_start, overdue, pending, completed, closed, stopped = [], [], [], [], [], [] datasets = [] for d in labels: @@ -118,11 +118,15 @@ def get_chart_data(periodic_data, columns): overdue.append(periodic_data.get("Overdue").get(d)) pending.append(periodic_data.get("Pending").get(d)) completed.append(periodic_data.get("Completed").get(d)) + closed.append(periodic_data.get("Closed").get(d)) + stopped.append(periodic_data.get("Stopped").get(d)) 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}) + datasets.append({"name": _("Closed"), "values": closed}) + datasets.append({"name": _("Stopped"), "values": stopped}) chart = {"data": {"labels": labels, "datasets": datasets}} chart["type"] = "line"