From 98c2ec528c7f6e44503e9497f81bddd62bffb992 Mon Sep 17 00:00:00 2001 From: Loic Oberle Date: Fri, 22 May 2026 13:56:10 +0200 Subject: [PATCH] refactor(territory_wise_sales): replace sql with query builder (#55175) --- .../territory_wise_sales.py | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/erpnext/selling/report/territory_wise_sales/territory_wise_sales.py b/erpnext/selling/report/territory_wise_sales/territory_wise_sales.py index f07550c9091..a134bd2915a 100644 --- a/erpnext/selling/report/territory_wise_sales/territory_wise_sales.py +++ b/erpnext/selling/report/territory_wise_sales/territory_wise_sales.py @@ -137,17 +137,21 @@ def get_sales_orders(quotations): if not quotations: return [] - quotation_names = [q.name for q in quotations] + quotation_names = [q.get("name") for q in quotations] - return frappe.db.sql( - """ - SELECT so.`name`, so.`base_grand_total`, soi.prevdoc_docname as quotation - FROM `tabSales Order` so, `tabSales Order Item` soi - WHERE so.docstatus=1 AND so.name = soi.parent AND soi.prevdoc_docname in ({}) - """.format(", ".join(["%s"] * len(quotation_names))), - tuple(quotation_names), - as_dict=1, - ) # nosec + SalesOrder = frappe.qb.DocType("Sales Order") + SalesOrderItem = frappe.qb.DocType("Sales Order Item") + + query = ( + frappe.qb.from_(SalesOrder) + .join(SalesOrderItem) + .on(SalesOrder.name == SalesOrderItem.parent) + .select(SalesOrder.name, SalesOrder.base_grand_total, SalesOrderItem.prevdoc_docname.as_("quotation")) + .where(SalesOrder.docstatus == 1) + .where(SalesOrderItem.prevdoc_docname.isin(quotation_names)) + ) + + return query.run(as_dict=True) def get_sales_invoice(sales_orders):