From 19a5a5dcf495e0a33e31d985419b2a6b2e090683 Mon Sep 17 00:00:00 2001 From: Sachin Mane Date: Thu, 21 Jun 2018 13:01:48 +0530 Subject: [PATCH] =?UTF-8?q?improve=20performance=20of=20stock=5Fvalue=20re?= =?UTF-8?q?trieval=20using=20tabBin=20instead=20of=20=E2=80=A6=20(#14584)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * improve performance of stock_value retrieval using tabBin instead of stock ledger * rename fn * rename fn * Update warehouse.py --- erpnext/stock/doctype/warehouse/warehouse.py | 7 ++-- erpnext/stock/utils.py | 41 ++++++++++++++++---- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py index ec60e84715b..3ea29396512 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.py +++ b/erpnext/stock/doctype/warehouse/warehouse.py @@ -139,7 +139,7 @@ class Warehouse(NestedSet): @frappe.whitelist() def get_children(doctype, parent=None, company=None, is_root=False): - from erpnext.stock.utils import get_stock_value_on + from erpnext.stock.utils import get_stock_value_from_bin if is_root: parent = "" @@ -155,8 +155,7 @@ def get_children(doctype, parent=None, company=None, is_root=False): # return warehouses for wh in warehouses: - wh["balance"] = get_stock_value_on(warehouse=wh.value) - + wh["balance"] = get_stock_value_from_bin(warehouse=wh.value) return warehouses @frappe.whitelist() @@ -172,4 +171,4 @@ def add_node(): @frappe.whitelist() def convert_to_group_or_ledger(): args = frappe.form_dict - return frappe.get_doc("Warehouse", args.docname).convert_to_group_or_ledger() \ No newline at end of file + return frappe.get_doc("Warehouse", args.docname).convert_to_group_or_ledger() diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py index 0e9f500b941..7d73f77847e 100644 --- a/erpnext/stock/utils.py +++ b/erpnext/stock/utils.py @@ -11,21 +11,47 @@ from six import string_types class InvalidWarehouseCompany(frappe.ValidationError): pass +def get_stock_value_from_bin (warehouse=None, item_code=None): + + values = {} + conditions = "" + if warehouse: + conditions += """ and warehouse in ( + select w2.name from `tabWarehouse` w1 + join `tabWarehouse` w2 on + w1.name = %(warehouse)s + and w2.lft between w1.lft and w1.rgt + ) """ + + values['warehouse'] = warehouse + + if item_code: + conditions += " and item_code = %(item_code)s" + + + values['item_code'] = item_code + + query = "select sum(stock_value) from `tabBin` where 1 = 1" + conditions + + stock_value = frappe.db.sql(query, values) + + return stock_value; + def get_stock_value_on(warehouse=None, posting_date=None, item_code=None): if not posting_date: posting_date = nowdate() values, condition = [posting_date], "" if warehouse: - + lft, rgt, is_group = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt", "is_group"]) - + if is_group: values.extend([lft, rgt]) condition += "and exists (\ select name from `tabWarehouse` wh where wh.name = sle.warehouse\ and wh.lft >= %s and wh.rgt <= %s)" - + else: values.append(warehouse) condition += " AND warehouse = %s" @@ -45,7 +71,7 @@ def get_stock_value_on(warehouse=None, posting_date=None, item_code=None): for sle in stock_ledger_entries: if not (sle.item_code, sle.warehouse) in sle_map: sle_map[(sle.item_code, sle.warehouse)] = flt(sle.stock_value) - + return sum(sle_map.values()) @frappe.whitelist() @@ -75,17 +101,17 @@ def get_latest_stock_qty(item_code, warehouse=None): values, condition = [item_code], "" if warehouse: lft, rgt, is_group = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt", "is_group"]) - + if is_group: values.extend([lft, rgt]) condition += "and exists (\ select name from `tabWarehouse` wh where wh.name = tabBin.warehouse\ and wh.lft >= %s and wh.rgt <= %s)" - + else: values.append(warehouse) condition += " AND warehouse = %s" - + actual_qty = frappe.db.sql("""select sum(actual_qty) from tabBin where item_code=%s {0}""".format(condition), values)[0][0] @@ -222,4 +248,3 @@ def validate_warehouse_company(warehouse, company): def is_group_warehouse(warehouse): if frappe.db.get_value("Warehouse", warehouse, "is_group"): frappe.throw(_("Group node warehouse is not allowed to select for transactions")) -