From 573e37a78dbea08aef7bbd6fa0ae8c0fae1dabb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Oberle?= Date: Tue, 12 May 2026 19:05:47 +0200 Subject: [PATCH] refactor(supplier): Using query builder for get_total_rejected_amount (#54871) Use the query builder for get_total_rejected_amount to assure compatibility with PostgreSQL. --- .../supplier_scorecard_variable.py | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py b/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py index 75ca2fbbea9..0cce16edef2 100644 --- a/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py +++ b/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py @@ -296,28 +296,21 @@ def get_total_received_items(scorecard): def get_total_rejected_amount(scorecard): """Gets the total amount (in company currency) rejected in the period (based on Purchase Receipts)""" - supplier = frappe.get_doc("Supplier", scorecard.supplier) + pr = frappe.qb.DocType("Purchase Receipt") + pr_item = frappe.qb.DocType("Purchase Receipt Item") - # Look up all PO Items with delivery dates between our dates - data = frappe.db.sql( - """ - SELECT - SUM(pr_item.rejected_qty * pr_item.base_rate) - FROM - `tabPurchase Receipt Item` pr_item, - `tabPurchase Receipt` pr - WHERE - pr.supplier = %(supplier)s - AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s - AND pr_item.docstatus = 1 - AND pr_item.parent = pr.name""", - {"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, - as_dict=0, - )[0][0] + query = ( + frappe.qb.from_(pr) + .join(pr_item) + .on(pr_item.parent == pr.name) + .select(frappe.qb.fn.Sum(pr_item.rejected_qty * pr_item.base_rate)) + .where(pr.supplier == scorecard.supplier) + .where(pr.posting_date[scorecard.start_date : scorecard.end_date]) + .where(pr_item.docstatus == 1) + ) - if not data: - data = 0 - return data + result = query.run() + return frappe.utils.flt(result[0][0]) if result else 0.0 def get_total_rejected_items(scorecard):