diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index cc3f27724e2..88600e88cc2 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe from frappe.desk.reportview import get_match_cond, get_filters_cond from frappe.utils import nowdate +from collections import defaultdict # searches for active employees @@ -348,3 +349,46 @@ def get_expense_account(doctype, txt, searchfield, start, page_len, filters): 'company': filters.get("company", ""), 'txt': "%%%s%%" % frappe.db.escape(txt) }) + + +@frappe.whitelist() +def warehouse_query(doctype, txt, searchfield, start, page_len, filters): + # Should be used when item code is passed in filters. + conditions, bin_conditions = [], [] + filter_dict = get_doctype_wise_filters(filters) + + sub_query = """ select round(`tabBin`.actual_qty, 2) from `tabBin` + where `tabBin`.warehouse = `tabWarehouse`.name + {bin_conditions} """.format( + bin_conditions=get_filters_cond(doctype, filter_dict.get("Bin"), bin_conditions)) + + response = frappe.db.sql("""select `tabWarehouse`.name, + CONCAT_WS(" : ", "Actual Qty", ifnull( ({sub_query}), 0) ) as actual_qty + from `tabWarehouse` + where + `tabWarehouse`.`{key}` like %(txt)s + {fcond} {mcond} + order by + `tabWarehouse`.name desc + limit + %(start)s, %(page_len)s + """.format( + sub_query=sub_query, + key=frappe.db.escape(searchfield), + fcond=get_filters_cond(doctype, filter_dict.get("Warehouse"), conditions), + mcond=get_match_cond(doctype) + ), + { + "txt": "%%%s%%" % frappe.db.escape(txt), + "start": start, + "page_len": page_len + }) + return response + + +def get_doctype_wise_filters(filters): + # Helper function to seperate filters doctype_wise + filter_dict = defaultdict(list) + for row in filters: + filter_dict[row[0]].append(row) + return filter_dict diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js index f3167bb620c..bf7143a10ec 100644 --- a/erpnext/public/js/queries.js +++ b/erpnext/public/js/queries.js @@ -133,3 +133,19 @@ erpnext.queries.setup_queries = function(frm, options, query_fn) { set_query(df.options, df.fieldname); }); } + +/* if item code is selected in child table + then list down warehouses with its quantity + else apply default filters. +*/ +erpnext.queries.setup_warehouse_query = function(frm){ + frm.set_query('warehouse', 'items', function(doc, cdt, cdn) { + var row = locals[cdt][cdn]; + var filters = erpnext.queries.warehouse(frm.doc); + if(row.item_code){ + $.extend(filters, {"query":"erpnext.controllers.queries.warehouse_query"}); + filters["filters"].push(["Bin", "item_code", "=", row.item_code]); + } + return filters + }); +} diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index f01e4848e3a..8130ce848b5 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -24,6 +24,8 @@ frappe.ui.form.on("Sales Order", { // formatter for material request item frm.set_indicator_formatter('item_code', function(doc) { return (doc.qty<=doc.delivered_qty) ? "green" : "orange" }) + + erpnext.queries.setup_warehouse_query(frm); } }); diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 8f871987f00..23806d48c34 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -13,14 +13,7 @@ frappe.ui.form.on("Delivery Note", { return (doc.docstatus==1 || doc.qty<=doc.actual_qty) ? "green" : "orange" }) - frm.set_query("warehouse", "items", function() { - return { - filters: [ - ["Warehouse", "company", "in", ["", cstr(frm.doc.company)]], - ["Warehouse", "is_group", "=", 0] - ] - } - }) + erpnext.queries.setup_warehouse_query(frm); } }); diff --git a/erpnext/stock/doctype/warehouse/warehouse.json b/erpnext/stock/doctype/warehouse/warehouse.json index 7272da1b581..9beea6c734d 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.json +++ b/erpnext/stock/doctype/warehouse/warehouse.json @@ -807,6 +807,7 @@ "quick_entry": 1, "read_only": 0, "read_only_onload": 0, + "search_fields": "", "show_name_in_global_search": 1, "sort_order": "DESC", "title_field": "warehouse_name",