mirror of
https://github.com/frappe/erpnext.git
synced 2026-02-25 15:49:31 +00:00
fix: use query builder instead of raw SQL in get_material_requests_based_on_supplier
(cherry picked from commit de919568b4)
This commit is contained in:
@@ -10,6 +10,7 @@ import json
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _, msgprint
|
from frappe import _, msgprint
|
||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
from frappe.query_builder import Order
|
||||||
from frappe.query_builder.functions import Sum
|
from frappe.query_builder.functions import Sum
|
||||||
from frappe.utils import cint, cstr, flt, get_link_to_form, getdate, new_line_sep, nowdate
|
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.whitelist()
|
||||||
@frappe.validate_and_sanitize_search_inputs
|
@frappe.validate_and_sanitize_search_inputs
|
||||||
def get_material_requests_based_on_supplier(doctype, txt, searchfield, start, page_len, filters):
|
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 = filters.get("supplier")
|
||||||
supplier_items = get_items_based_on_default_supplier(supplier)
|
supplier_items = get_items_based_on_default_supplier(supplier)
|
||||||
|
|
||||||
if not supplier_items:
|
if not supplier_items:
|
||||||
frappe.throw(_("{0} is not the default supplier for any items.").format(supplier))
|
frappe.throw(_("{0} is not the default supplier for any items.").format(supplier))
|
||||||
|
|
||||||
material_requests = frappe.db.sql(
|
mr = frappe.qb.DocType("Material Request")
|
||||||
"""select distinct mr.name, transaction_date,company
|
mr_item = frappe.qb.DocType("Material Request Item")
|
||||||
from `tabMaterial Request` mr, `tabMaterial Request Item` mr_item
|
|
||||||
where mr.name = mr_item.parent
|
query = (
|
||||||
and mr_item.item_code in ({})
|
frappe.qb.from_(mr)
|
||||||
and mr.material_request_type = 'Purchase'
|
.from_(mr_item)
|
||||||
and mr.per_ordered < 99.99
|
.select(mr.name)
|
||||||
and mr.docstatus = 1
|
.distinct()
|
||||||
and mr.status != 'Stopped'
|
.select(mr.transaction_date, mr.company)
|
||||||
and mr.company = %s
|
.where(
|
||||||
{}
|
(mr.name == mr_item.parent)
|
||||||
order by mr_item.item_code ASC
|
& (mr_item.item_code.isin(supplier_items))
|
||||||
limit {} offset {} """.format(
|
& (mr.material_request_type == "Purchase")
|
||||||
", ".join(["%s"] * len(supplier_items)), conditions, cint(page_len), cint(start)
|
& (mr.per_ordered < 99.99)
|
||||||
),
|
& (mr.docstatus == 1)
|
||||||
(*tuple(supplier_items), filters.get("company")),
|
& (mr.status != "Stopped")
|
||||||
as_dict=1,
|
& (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
|
return material_requests
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user