From 049a88cc403efca6ffc0c32551684421f311bb14 Mon Sep 17 00:00:00 2001 From: suyashphadtare Date: Thu, 12 Jan 2017 17:49:37 +0530 Subject: [PATCH 1/3] [minor] Show item quantity in warehouse set query --- erpnext/controllers/queries.py | 27 +++++++++++++++++++ erpnext/public/js/queries.js | 16 +++++++++++ .../doctype/sales_order/sales_order.js | 2 ++ .../doctype/delivery_note/delivery_note.js | 9 +------ .../stock/doctype/warehouse/warehouse.json | 4 ++- 5 files changed, 49 insertions(+), 9 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index cc3f27724e..be0cb02417 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -348,3 +348,30 @@ 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 = [] + response = frappe.db.sql("""select distinct `tabWarehouse`.name, + CONCAT_WS(" : ", "Actual Qty", ifnull(round(`tabBin`.actual_qty, 2), 0)) + from `tabWarehouse` INNER JOIN `tabBin` + on `tabWarehouse`.name = `tabBin`.warehouse + where + `tabWarehouse`.`{key}` like %(txt)s + {fcond} {mcond} + order by + `tabWarehouse`.name, `tabBin`.actual_qty desc + limit + %(start)s, %(page_len)s """.format( + key=frappe.db.escape(searchfield), + fcond=get_filters_cond(doctype, filters, conditions), + mcond=get_match_cond(doctype) + ), + { + "txt": "%%%s%%" % frappe.db.escape(txt), + "start": start, + "page_len": page_len, + }) + return response diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js index f3167bb620..bf7143a10e 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 f01e4848e3..8130ce848b 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 8f871987f0..23806d48c3 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 477041fc66..913d133b8c 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.json +++ b/erpnext/stock/doctype/warehouse/warehouse.json @@ -655,7 +655,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-11-07 05:06:39.128312", + "modified": "2017-01-12 16:08:01.207466", "modified_by": "Administrator", "module": "Stock", "name": "Warehouse", @@ -791,7 +791,9 @@ "quick_entry": 1, "read_only": 0, "read_only_onload": 0, + "search_fields": "", "sort_order": "DESC", "title_field": "warehouse_name", + "track_changes": 0, "track_seen": 0 } \ No newline at end of file From 750a067688bde1b6210ed296f3831ced231be3b4 Mon Sep 17 00:00:00 2001 From: suyashphadtare Date: Wed, 18 Jan 2017 15:35:01 +0530 Subject: [PATCH 2/3] [minor][fix] Show all warehouses with item actual qty in warehouse set query --- erpnext/controllers/queries.py | 59 ++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index be0cb02417..626c20e1ae 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 @@ -353,25 +354,41 @@ def get_expense_account(doctype, txt, searchfield, start, page_len, filters): @frappe.whitelist() def warehouse_query(doctype, txt, searchfield, start, page_len, filters): # Should be used when item code is passed in filters. - conditions = [] - response = frappe.db.sql("""select distinct `tabWarehouse`.name, - CONCAT_WS(" : ", "Actual Qty", ifnull(round(`tabBin`.actual_qty, 2), 0)) - from `tabWarehouse` INNER JOIN `tabBin` - on `tabWarehouse`.name = `tabBin`.warehouse - where - `tabWarehouse`.`{key}` like %(txt)s - {fcond} {mcond} - order by - `tabWarehouse`.name, `tabBin`.actual_qty desc - limit - %(start)s, %(page_len)s """.format( - key=frappe.db.escape(searchfield), - fcond=get_filters_cond(doctype, filters, conditions), - mcond=get_match_cond(doctype) - ), - { - "txt": "%%%s%%" % frappe.db.escape(txt), - "start": start, - "page_len": page_len, - }) + 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 From 34ab136b46a5d2aba885fd172c5e066e4703a198 Mon Sep 17 00:00:00 2001 From: suyashphadtare Date: Tue, 31 Jan 2017 15:14:44 +0530 Subject: [PATCH 3/3] [fix] Remove un-necessary Whitespace --- erpnext/controllers/queries.py | 46 +++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 626c20e1ae..88600e88cc 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -358,31 +358,31 @@ def warehouse_query(doctype, txt, searchfield, start, page_len, filters): 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)) + 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 - }) + 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