Exploded view for BOM Stock Report (#12506)

* Multilevel BOM Stock Report prototype

* Rechristened multilevel to exploded view

* Removed trailing whitespace in line 16. Replaced spaces with tabs for indentation

* Used BOM Explosion item in query for exploded view

* Removed trailing whitespaces for Codacy compliance
This commit is contained in:
Gaurav Naik 2018-01-17 16:12:55 +05:30 committed by Nabin Hait
parent d8b4c8bd5b
commit dc0db3a652
2 changed files with 53 additions and 40 deletions

View File

@ -12,6 +12,10 @@ frappe.query_reports["BOM Stock Report"] = {
"fieldtype": "Link", "fieldtype": "Link",
"options": "Warehouse", "options": "Warehouse",
"reqd": 1 "reqd": 1
}, {
"fieldname": "show_exploded_view",
"label": __("Show exploded view"),
"fieldtype": "Check"
} }
] ]
} }

View File

@ -6,52 +6,61 @@ import frappe
from frappe import _ from frappe import _
def execute(filters=None): def execute(filters=None):
if not filters: filters = {} if not filters: filters = {}
columns = get_columns() columns = get_columns()
data = get_bom_stock(filters)
return columns, data data = get_bom_stock(filters)
return columns, data
def get_columns(): def get_columns():
"""return columns""" """return columns"""
columns = [ columns = [
_("Item") + ":Link/Item:150", _("Item") + ":Link/Item:150",
_("Description") + "::500", _("Description") + "::500",
_("Required Qty") + ":Float:100", _("Required Qty") + ":Float:100",
_("In Stock Qty") + ":Float:100", _("In Stock Qty") + ":Float:100",
_("Enough Parts to Build") + ":Float:200", _("Enough Parts to Build") + ":Float:200",
] ]
return columns return columns
def get_bom_stock(filters): def get_bom_stock(filters):
conditions = "" conditions = ""
bom = filters.get("bom") bom = filters.get("bom")
if filters.get("warehouse"): table = "`tabBOM Item`"
warehouse_details = frappe.db.get_value("Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1) qty_field = "qty"
if warehouse_details:
conditions += " and exists (select name from `tabWarehouse` wh \
where wh.lft >= %s and wh.rgt <= %s and ledger.warehouse = wh.name)" % (warehouse_details.lft,
warehouse_details.rgt)
else:
conditions += " and ledger.warehouse = '%s'" % frappe.db.escape(filters.get("warehouse"))
else: if filters.get("show_exploded_view"):
conditions += "" table = "`tabBOM Explosion Item`"
qty_field = "stock_qty"
return frappe.db.sql(""" if filters.get("warehouse"):
SELECT warehouse_details = frappe.db.get_value("Warehouse", filters.get("warehouse"), ["lft", "rgt"], as_dict=1)
bom_item.item_code , if warehouse_details:
bom_item.description , conditions += " and exists (select name from `tabWarehouse` wh \
bom_item.qty, where wh.lft >= %s and wh.rgt <= %s and ledger.warehouse = wh.name)" % (warehouse_details.lft,
sum(ledger.actual_qty) as actual_qty, warehouse_details.rgt)
sum(FLOOR(ledger.actual_qty /bom_item.qty))as to_build else:
FROM conditions += " and ledger.warehouse = '%s'" % frappe.db.escape(filters.get("warehouse"))
`tabBOM Item` AS bom_item
LEFT JOIN `tabBin` AS ledger
ON bom_item.item_code = ledger.item_code
%s
WHERE
bom_item.parent = '%s' and bom_item.parenttype='BOM'
GROUP BY bom_item.item_code""" % (conditions, bom)) else:
conditions += ""
return frappe.db.sql("""
SELECT
bom_item.item_code ,
bom_item.description ,
bom_item.{qty_field},
sum(ledger.actual_qty) as actual_qty,
sum(FLOOR(ledger.actual_qty / bom_item.{qty_field}))as to_build
FROM
{table} AS bom_item
LEFT JOIN `tabBin` AS ledger
ON bom_item.item_code = ledger.item_code
{conditions}
WHERE
bom_item.parent = '{bom}' and bom_item.parenttype='BOM'
GROUP BY bom_item.item_code""".format(qty_field=qty_field, table=table, conditions=conditions, bom=bom))