From 20d6b54590bb081a00457dcba5aebfe9b0d8a424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Oberle?= Date: Tue, 12 May 2026 19:06:07 +0200 Subject: [PATCH] refactor(supplier): Using query builder for get_total_received_items (#54870) Use the query builder for get_total_received_items 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 0cce16edef2..ba2d09a91d0 100644 --- a/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py +++ b/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py @@ -270,28 +270,21 @@ def get_total_received_amount(scorecard): def get_total_received_items(scorecard): """Gets the total number of received shipments 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.received_qty) - 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.received_qty)) + .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_amount(scorecard):