From 5a0e690307fd9de1be343f434aab131d17cb141a Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Fri, 15 Aug 2025 19:04:31 +0530 Subject: [PATCH] fix: use query builder instead of raw SQL in get_material_requests_based_on_supplier (cherry picked from commit de919568b4f7a86c8d418c0c3fd88e1f3101696c) --- .../material_request/material_request.py | 56 ++++++++++--------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 310d26a52cc..568f7030907 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -10,6 +10,7 @@ import json import frappe from frappe import _, msgprint from frappe.model.mapper import get_mapped_doc +from frappe.query_builder import Order from frappe.query_builder.functions import Sum from frappe.utils import cint, cstr, flt, get_link_to_form, getdate, new_line_sep, nowdate @@ -498,39 +499,44 @@ def get_items_based_on_default_supplier(supplier): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs def get_material_requests_based_on_supplier(doctype, txt, searchfield, start, page_len, filters): - conditions = "" - if txt: - conditions += "and mr.name like '%%" + txt + "%%' " - - if filters.get("transaction_date"): - date = filters.get("transaction_date")[1] - conditions += f"and mr.transaction_date between '{date[0]}' and '{date[1]}' " - supplier = filters.get("supplier") supplier_items = get_items_based_on_default_supplier(supplier) if not supplier_items: frappe.throw(_("{0} is not the default supplier for any items.").format(supplier)) - material_requests = frappe.db.sql( - """select distinct mr.name, transaction_date,company - from `tabMaterial Request` mr, `tabMaterial Request Item` mr_item - where mr.name = mr_item.parent - and mr_item.item_code in ({}) - and mr.material_request_type = 'Purchase' - and mr.per_ordered < 99.99 - and mr.docstatus = 1 - and mr.status != 'Stopped' - and mr.company = %s - {} - order by mr_item.item_code ASC - limit {} offset {} """.format( - ", ".join(["%s"] * len(supplier_items)), conditions, cint(page_len), cint(start) - ), - (*tuple(supplier_items), filters.get("company")), - as_dict=1, + mr = frappe.qb.DocType("Material Request") + mr_item = frappe.qb.DocType("Material Request Item") + + query = ( + frappe.qb.from_(mr) + .from_(mr_item) + .select(mr.name) + .distinct() + .select(mr.transaction_date, mr.company) + .where( + (mr.name == mr_item.parent) + & (mr_item.item_code.isin(supplier_items)) + & (mr.material_request_type == "Purchase") + & (mr.per_ordered < 99.99) + & (mr.docstatus == 1) + & (mr.status != "Stopped") + & (mr.company == filters.get("company")) + ) + .orderby(mr_item.item_code, order=Order.asc) + .limit(cint(page_len)) + .offset(cint(start)) ) + if txt: + query = query.where(mr.name.like(f"%%{txt}%%")) + + if filters.get("transaction_date"): + date = filters.get("transaction_date")[1] + query = query.where(mr.transaction_date[date[0] : date[1]]) + + material_requests = query.run(as_dict=True) + return material_requests