feat: enhance apply_warehouse_filter to support multiple warehouses in filters

This commit is contained in:
Karm Soni
2025-07-03 16:24:27 +05:30
parent 0d2a88bafc
commit 2ff1dcc391

View File

@@ -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