From b3928ac3cbe4e7e4f3c745c9f6563b874f39d984 Mon Sep 17 00:00:00 2001 From: Ninad1306 Date: Mon, 24 Feb 2025 12:42:05 +0530 Subject: [PATCH 1/3] fix(report): allow `Closed` purchase orders to be visible --- .../purchase_order_analysis.js | 24 ++++++++++++------- .../purchase_order_analysis.py | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js index 91506c0ab3..58bfef32d6 100644 --- a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js +++ b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js @@ -49,14 +49,22 @@ frappe.query_reports["Purchase Order Analysis"] = { } }, { - "fieldname": "status", - "label": __("Status"), - "fieldtype": "MultiSelectList", - "width": "80", - get_data: function(txt) { - let status = ["To Bill", "To Receive", "To Receive and Bill", "Completed"] - let options = [] - for (let option of status){ + fieldname: "status", + label: __("Status"), + fieldtype: "MultiSelectList", + width: "80", + options: ["To Pay", "To Bill", "To Receive", "To Receive and Bill", "Completed", "Closed"], + get_data: function (txt) { + let status = [ + "To Pay", + "To Bill", + "To Receive", + "To Receive and Bill", + "Completed", + "Closed", + ]; + let options = []; + for (let option of status) { options.push({ "value": option, "label": __(option), diff --git a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py index 2f55cb4215..daaef5fdd7 100644 --- a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py +++ b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py @@ -70,7 +70,7 @@ def get_data(filters): po.company, po_item.name, ) - .where((po_item.parent == po.name) & (po.status.notin(("Stopped", "Closed"))) & (po.docstatus == 1)) + .where((po_item.parent == po.name) & (po.status.notin(("Stopped", "On Hold"))) & (po.docstatus == 1)) .groupby(po_item.name) .orderby(po.transaction_date) ) -- GitLab From 365f311877f0bf1de0dbb368e11d35a47bf500fa Mon Sep 17 00:00:00 2001 From: Ninad1306 Date: Tue, 25 Feb 2025 15:59:46 +0530 Subject: [PATCH 2/3] fix(report): allow `Closed` sales orders to be visible --- .../sales_order_analysis.js | 24 ++++++++++++------- .../sales_order_analysis.py | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js index 8951cf68a7..b9e104fef5 100644 --- a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js +++ b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js @@ -45,14 +45,22 @@ frappe.query_reports["Sales Order Analysis"] = { } }, { - "fieldname": "status", - "label": __("Status"), - "fieldtype": "MultiSelectList", - "width": "80", - get_data: function(txt) { - let status = ["To Bill", "To Deliver", "To Deliver and Bill", "Completed"] - let options = [] - for (let option of status){ + fieldname: "status", + label: __("Status"), + fieldtype: "MultiSelectList", + options: ["To Pay", "To Bill", "To Deliver", "To Deliver and Bill", "Completed", "Closed"], + width: "80", + get_data: function (txt) { + let status = [ + "To Pay", + "To Bill", + "To Deliver", + "To Deliver and Bill", + "Completed", + "Closed", + ]; + let options = []; + for (let option of status) { options.push({ "value": option, "label": __(option), diff --git a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py index b225dc6c76..e41c075ba4 100644 --- a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py +++ b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py @@ -83,7 +83,7 @@ def get_data(conditions, filters): ON sii.so_detail = soi.name and sii.docstatus = 1 WHERE soi.parent = so.name - and so.status not in ('Stopped', 'Closed', 'On Hold') + and so.status not in ('Stopped', 'On Hold') and so.docstatus = 1 {conditions} GROUP BY soi.name -- GitLab From c04b9d0943ded94a7548c3a626253ef209afd434 Mon Sep 17 00:00:00 2001 From: Ninad1306 Date: Tue, 25 Feb 2025 17:13:09 +0530 Subject: [PATCH 3/3] fix(report): filter sales / purchase orders based on date filters --- .../purchase_order_analysis.js | 56 +++++++++++------- .../purchase_order_analysis.py | 8 ++- .../sales_order_analysis.js | 57 +++++++++++-------- 3 files changed, 72 insertions(+), 49 deletions(-) diff --git a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js index 58bfef32d6..43c25cd96d 100644 --- a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js +++ b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js @@ -14,20 +14,28 @@ frappe.query_reports["Purchase Order Analysis"] = { "default": frappe.defaults.get_default("company") }, { - "fieldname":"from_date", - "label": __("From Date"), - "fieldtype": "Date", - "width": "80", - "reqd": 1, - "default": frappe.datetime.add_months(frappe.datetime.get_today(), -1), + fieldname: "from_date", + label: __("From Date"), + fieldtype: "Date", + width: "80", + reqd: 1, + default: frappe.datetime.add_months(frappe.datetime.get_today(), -1), + on_change: (report) => { + report.set_filter_value("name", []); + report.refresh(); + }, }, { - "fieldname":"to_date", - "label": __("To Date"), - "fieldtype": "Date", - "width": "80", - "reqd": 1, - "default": frappe.datetime.get_today() + fieldname: "to_date", + label: __("To Date"), + fieldtype: "Date", + width: "80", + reqd: 1, + default: frappe.datetime.get_today(), + on_change: (report) => { + report.set_filter_value("name", []); + report.refresh(); + }, }, { "fieldname":"project", @@ -37,16 +45,20 @@ frappe.query_reports["Purchase Order Analysis"] = { "options": "Project" }, { - "fieldname": "name", - "label": __("Purchase Order"), - "fieldtype": "Link", - "width": "80", - "options": "Purchase Order", - "get_query": () =>{ - return { - filters: { "docstatus": 1 } - } - } + fieldname: "name", + label: __("Purchase Order"), + fieldtype: "MultiSelectList", + width: "80", + options: "Purchase Order", + get_data: function (txt) { + let filters = { docstatus: 1 }; + + const from_date = frappe.query_report.get_filter_value("from_date"); + const to_date = frappe.query_report.get_filter_value("to_date"); + if (from_date && to_date) filters["transaction_date"] = ["between", [from_date, to_date]]; + + return frappe.db.get_link_options("Purchase Order", txt, filters); + }, }, { fieldname: "status", diff --git a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py index daaef5fdd7..261f5c052a 100644 --- a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py +++ b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py @@ -75,9 +75,11 @@ def get_data(filters): .orderby(po.transaction_date) ) - for field in ("company", "name"): - if filters.get(field): - query = query.where(po[field] == filters.get(field)) + if filters.get("company"): + query = query.where(po.company == filters.get("company")) + + if filters.get("name"): + query = query.where(po.name.isin(filters.get("name"))) if filters.get("from_date") and filters.get("to_date"): query = query.where(po.transaction_date.between(filters.get("from_date"), filters.get("to_date"))) diff --git a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js index b9e104fef5..d067b5afb1 100644 --- a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js +++ b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js @@ -14,35 +14,44 @@ frappe.query_reports["Sales Order Analysis"] = { "default": frappe.defaults.get_default("company") }, { - "fieldname":"from_date", - "label": __("From Date"), - "fieldtype": "Date", - "width": "80", - "reqd": 1, - "default": frappe.datetime.add_months(frappe.datetime.get_today(), -1), + fieldname: "from_date", + label: __("From Date"), + fieldtype: "Date", + width: "80", + reqd: 1, + default: frappe.datetime.add_months(frappe.datetime.get_today(), -1), + on_change: (report) => { + report.set_filter_value("sales_order", []); + report.refresh(); + }, }, { - "fieldname":"to_date", - "label": __("To Date"), - "fieldtype": "Date", - "width": "80", - "reqd": 1, - "default": frappe.datetime.get_today() + fieldname: "to_date", + label: __("To Date"), + fieldtype: "Date", + width: "80", + reqd: 1, + default: frappe.datetime.get_today(), + on_change: (report) => { + report.set_filter_value("sales_order", []); + report.refresh(); + }, }, { - "fieldname": "sales_order", - "label": __("Sales Order"), - "fieldtype": "MultiSelectList", - "width": "80", - "options": "Sales Order", - "get_data": function(txt) { - return frappe.db.get_link_options("Sales Order", txt); + fieldname: "sales_order", + label: __("Sales Order"), + fieldtype: "MultiSelectList", + width: "80", + options: "Sales Order", + get_data: function (txt) { + let filters = { docstatus: 1 }; + + const from_date = frappe.query_report.get_filter_value("from_date"); + const to_date = frappe.query_report.get_filter_value("to_date"); + if (from_date && to_date) filters["transaction_date"] = ["between", [from_date, to_date]]; + + return frappe.db.get_link_options("Sales Order", txt, filters); }, - "get_query": () =>{ - return { - filters: { "docstatus": 1 } - } - } }, { fieldname: "status", -- GitLab