From 114f2b432628b55201dfbfcac8c4e6a65c577cc7 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sun, 14 Jan 2024 23:23:55 +0530 Subject: [PATCH] fix: batches not coming correctly in the batch selector --- erpnext/controllers/queries.py | 39 +++++++++++++++------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 2650753275cc..8ebdcc587523 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -421,23 +421,14 @@ def get_batch_no(doctype, txt, searchfield, start, page_len, filters): meta = frappe.get_meta(doctype, cached=True) searchfields = meta.get_search_fields() - query = get_batches_from_stock_ledger_entries(searchfields, txt, filters) - bundle_query = get_batches_from_serial_and_batch_bundle(searchfields, txt, filters) - - data = ( - frappe.qb.from_((query) + (bundle_query)) - .select("batch_no", "qty", "manufacturing_date", "expiry_date") - .offset(start) - .limit(page_len) + batches = get_batches_from_stock_ledger_entries(searchfields, txt, filters, start, page_len) + batches.extend( + get_batches_from_serial_and_batch_bundle(searchfields, txt, filters, start, page_len) ) - for field in searchfields: - data = data.select(field) - - data = data.run() - data = get_filterd_batches(data) + filtered_batches = get_filterd_batches(batches) - return data + return filtered_batches def get_filterd_batches(data): @@ -457,7 +448,7 @@ def get_filterd_batches(data): return filterd_batch -def get_batches_from_stock_ledger_entries(searchfields, txt, filters): +def get_batches_from_stock_ledger_entries(searchfields, txt, filters, start=0, page_len=100): stock_ledger_entry = frappe.qb.DocType("Stock Ledger Entry") batch_table = frappe.qb.DocType("Batch") @@ -479,6 +470,8 @@ def get_batches_from_stock_ledger_entries(searchfields, txt, filters): & (stock_ledger_entry.batch_no.isnotnull()) ) .groupby(stock_ledger_entry.batch_no, stock_ledger_entry.warehouse) + .offset(start) + .limit(page_len) ) query = query.select( @@ -493,16 +486,16 @@ def get_batches_from_stock_ledger_entries(searchfields, txt, filters): query = query.select(batch_table[field]) if txt: - txt_condition = batch_table.name.like(txt) + txt_condition = batch_table.name.like("%{0}%".format(txt)) for field in searchfields + ["name"]: - txt_condition |= batch_table[field].like(txt) + txt_condition |= batch_table[field].like("%{0}%".format(txt)) query = query.where(txt_condition) - return query + return query.run(as_list=1) or [] -def get_batches_from_serial_and_batch_bundle(searchfields, txt, filters): +def get_batches_from_serial_and_batch_bundle(searchfields, txt, filters, start=0, page_len=100): bundle = frappe.qb.DocType("Serial and Batch Entry") stock_ledger_entry = frappe.qb.DocType("Stock Ledger Entry") batch_table = frappe.qb.DocType("Batch") @@ -527,6 +520,8 @@ def get_batches_from_serial_and_batch_bundle(searchfields, txt, filters): & (stock_ledger_entry.serial_and_batch_bundle.isnotnull()) ) .groupby(bundle.batch_no, bundle.warehouse) + .offset(start) + .limit(page_len) ) bundle_query = bundle_query.select( @@ -541,13 +536,13 @@ def get_batches_from_serial_and_batch_bundle(searchfields, txt, filters): bundle_query = bundle_query.select(batch_table[field]) if txt: - txt_condition = batch_table.name.like(txt) + txt_condition = batch_table.name.like("%{0}%".format(txt)) for field in searchfields + ["name"]: - txt_condition |= batch_table[field].like(txt) + txt_condition |= batch_table[field].like("%{0}%".format(txt)) bundle_query = bundle_query.where(txt_condition) - return bundle_query + return bundle_query.run(as_list=1) @frappe.whitelist()