From 801cda38136fc7c95419092137ed2780d70fc2f1 Mon Sep 17 00:00:00 2001 From: Karm Soni Date: Thu, 3 Jul 2025 16:24:27 +0530 Subject: [PATCH] feat: enhance apply_warehouse_filter to support multiple warehouses in filters (cherry picked from commit 2ff1dcc3911f5387a065eb36d1bca3094c69dd40) --- erpnext/stock/doctype/warehouse/warehouse.py | 42 ++++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py index aa9dfd2048e..e38c44032ad 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.py +++ b/erpnext/stock/doctype/warehouse/warehouse.py @@ -242,19 +242,35 @@ def get_warehouses_based_on_account(account, company=None): # Will be use for frappe.qb def apply_warehouse_filter(query, sle, filters): - if warehouse := filters.get("warehouse"): - warehouse_table = frappe.qb.DocType("Warehouse") + if not (warehouses := filters.get("warehouse")): + return query - lft, rgt = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"]) - chilren_subquery = ( - frappe.qb.from_(warehouse_table) - .select(warehouse_table.name) - .where( - (warehouse_table.lft >= lft) - & (warehouse_table.rgt <= rgt) - & (warehouse_table.name == sle.warehouse) - ) - ) - query = query.where(ExistsCriterion(chilren_subquery)) + warehouse_table = frappe.qb.DocType("Warehouse") + + if isinstance(warehouses, str): + warehouses = [warehouses] + + warehouse_range = frappe.get_all( + "Warehouse", + filters={ + "name": ("in", warehouses), + }, + fields=["lft", "rgt"], + as_list=True, + ) + + child_query = frappe.qb.from_(warehouse_table).select(warehouse_table.name) + + range_conditions = [ + (warehouse_table.lft >= lft) & (warehouse_table.rgt <= rgt) for lft, rgt in warehouse_range + ] + + combined_condition = range_conditions[0] + for condition in range_conditions[1:]: + combined_condition = combined_condition | condition + + child_query = child_query.where(combined_condition & (warehouse_table.name == sle.warehouse)) + + query = query.where(ExistsCriterion(child_query)) return query