From 82d19677edac526f6b56b55fa740535d591a3cd9 Mon Sep 17 00:00:00 2001 From: Loic Oberle Date: Fri, 22 May 2026 12:35:33 +0200 Subject: [PATCH] refactor(supplier_scorecard_variable): replace sql with query builder (#55164) --- .../supplier_scorecard_variable.py | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 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 5728aa81925..23ce6c56f01 100644 --- a/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py +++ b/erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py @@ -82,29 +82,25 @@ def get_item_workdays(scorecard): def get_total_cost_of_shipments(scorecard): """Gets the total cost of all shipments in the period (based on Purchase Orders)""" - supplier = frappe.get_doc("Supplier", scorecard.supplier) - # Look up all PO Items with delivery dates between our dates - data = frappe.db.sql( - """ - SELECT - SUM(po_item.base_amount) - FROM - `tabPurchase Order Item` po_item, - `tabPurchase Order` po - WHERE - po.supplier = %(supplier)s - AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s - AND po_item.docstatus = 1 - AND po_item.parent = po.name""", - {"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, - as_dict=0, - )[0][0] + from frappe.query_builder.functions import Sum - if data: - return data - else: - return 0 + PO = frappe.qb.DocType("Purchase Order") + PO_Item = frappe.qb.DocType("Purchase Order Item") + + query = ( + frappe.qb.from_(PO_Item) + .join(PO) + .on(PO_Item.parent == PO.name) + .select(Sum(PO_Item.base_amount)) + .where(PO.supplier == scorecard.supplier) + .where(PO_Item.schedule_date[scorecard.start_date : scorecard.end_date]) # Syntaxe BETWEEN + .where(PO_Item.docstatus == 1) + ) + + result = query.run(as_list=True) + total_cost = result[0][0] if result and result[0][0] is not None else 0 + return total_cost def get_cost_of_delayed_shipments(scorecard):