From 2ff1dcc3911f5387a065eb36d1bca3094c69dd40 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 --- 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 7a472b1b816..d534e63209c 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.py +++ b/erpnext/stock/doctype/warehouse/warehouse.py @@ -253,19 +253,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