diff --git a/erpnext/buying/report/procurement_tracker/procurement_tracker.py b/erpnext/buying/report/procurement_tracker/procurement_tracker.py index 10169c554fb..fd30ddf6884 100644 --- a/erpnext/buying/report/procurement_tracker/procurement_tracker.py +++ b/erpnext/buying/report/procurement_tracker/procurement_tracker.py @@ -305,7 +305,9 @@ def get_po_entries(filters): & (parent.name == child.parent) & (parent.status.notin(("Closed", "Completed", "Cancelled"))) ) - .groupby(parent.name, child.material_request_item) + # This is one row per PO item; the selected child.* columns are only functionally dependent + # on the child PK, which postgres requires in the GROUP BY (MariaDB allows omitting it). + .groupby(parent.name, child.material_request_item, child.name) ) query = apply_filters_on_query(filters, parent, child, query) diff --git a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py index 1577bf2cbf6..f1781c15e05 100644 --- a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py +++ b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py @@ -6,4 +6,16 @@ from erpnext.tests.utils import ERPNextTestSuite class TestProcurementTracker(ERPNextTestSuite): - pass + def test_report_executes_and_lists_po(self): + # get_po_entries groups by (Purchase Order, material_request_item, Purchase Order Item) + # while selecting other child columns; this exercises that GROUP BY so the report stays + # valid on Postgres (which rejects selecting non-grouped columns). + from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order + from erpnext.buying.report.procurement_tracker.procurement_tracker import execute + + po = create_purchase_order(company="_Test Company") + + columns, data = execute({"company": "_Test Company"}) + + self.assertTrue(columns) + self.assertIn(po.name, {row.get("purchase_order") for row in data})