feat: enhance apply_warehouse_filter to support multiple warehouses in filters

(cherry picked from commit 2ff1dcc391)
This commit is contained in:
Karm Soni
2025-07-03 16:24:27 +05:30
committed by Mergify
parent 2b08c5b769
commit 801cda3813

View File

@@ -242,19 +242,35 @@ def get_warehouses_based_on_account(account, company=None):
# Will be use for frappe.qb # Will be use for frappe.qb
def apply_warehouse_filter(query, sle, filters): def apply_warehouse_filter(query, sle, filters):
if warehouse := filters.get("warehouse"): if not (warehouses := filters.get("warehouse")):
return query
warehouse_table = frappe.qb.DocType("Warehouse") warehouse_table = frappe.qb.DocType("Warehouse")
lft, rgt = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"]) if isinstance(warehouses, str):
chilren_subquery = ( warehouses = [warehouses]
frappe.qb.from_(warehouse_table)
.select(warehouse_table.name) warehouse_range = frappe.get_all(
.where( "Warehouse",
(warehouse_table.lft >= lft) filters={
& (warehouse_table.rgt <= rgt) "name": ("in", warehouses),
& (warehouse_table.name == sle.warehouse) },
fields=["lft", "rgt"],
as_list=True,
) )
)
query = query.where(ExistsCriterion(chilren_subquery)) 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 return query