mirror of
https://github.com/frappe/erpnext.git
synced 2026-02-16 16:15:02 +00:00
feat: enhance apply_warehouse_filter to support multiple warehouses in filters
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user