From 3d491f90cc2259467c7d7b77b831904a60cdfe82 Mon Sep 17 00:00:00 2001 From: Ben Cornwell-Mott Date: Tue, 10 Jan 2017 14:14:18 -0800 Subject: [PATCH 1/6] Created 2 reports for stock details --- .../report/bom_stock_report/__init__.py | 0 .../bom_stock_report/bom_stock_report.js | 10 ++ .../bom_stock_report/bom_stock_report.json | 20 +++ .../production_order_stock_report/__init__.py | 0 .../production_order_stock_report.js | 6 + .../production_order_stock_report.json | 19 +++ .../production_order_stock_report.py | 132 ++++++++++++++++++ 7 files changed, 187 insertions(+) create mode 100644 erpnext/manufacturing/report/bom_stock_report/__init__.py create mode 100644 erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js create mode 100644 erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json create mode 100644 erpnext/manufacturing/report/production_order_stock_report/__init__.py create mode 100644 erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js create mode 100644 erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.json create mode 100644 erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py diff --git a/erpnext/manufacturing/report/bom_stock_report/__init__.py b/erpnext/manufacturing/report/bom_stock_report/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js new file mode 100644 index 00000000000..df5e47b33d5 --- /dev/null +++ b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js @@ -0,0 +1,10 @@ +frappe.query_reports["BOM Stock Report"] = { + "filters": [ + { + "fieldname":"bom", + "label": __("BOM"), + "fieldtype": "Link", + "options": "BOM" + }, + ] +} \ No newline at end of file diff --git a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json new file mode 100644 index 00000000000..cbe9ecef9ee --- /dev/null +++ b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json @@ -0,0 +1,20 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2017-01-10 14:00:50.387244", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "letter_head": "Standard", + "modified": "2017-01-10 14:00:54.341088", + "modified_by": "Administrator", + "module": "Manufacturing", + "name": "BOM Stock Report", + "owner": "Administrator", + "query": "SELECT \n\tbom_item.item_code as \"Item:Link/Item:200\",\n\tROUND(bom_item.qty,2) as \"Required Qty:Float:100\",\n\tROUND(SUM(ifnull(ledger.actual_qty,0)),2) as \"In Stock Qty:Float:100\",\n\tFLOOR(SUM(ifnull(ledger.actual_qty,0))/bom_item.qty) as \"Enough Parts to Build:Int:100\"\nFROM\n\t`tabBOM Item` AS bom_item \n\tLEFT JOIN `tabStock Ledger Entry` AS ledger\t\n\tON bom_item.item_code = ledger.item_code \nWHERE\n\tbom_item.parent=%(bom)s\n\nGROUP BY bom_item.item_code", + "ref_doctype": "BOM", + "report_name": "BOM Stock Report", + "report_type": "Query Report" +} \ No newline at end of file diff --git a/erpnext/manufacturing/report/production_order_stock_report/__init__.py b/erpnext/manufacturing/report/production_order_stock_report/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js new file mode 100644 index 00000000000..e3c8ce9f76a --- /dev/null +++ b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js @@ -0,0 +1,6 @@ +// Copyright (c) 2016, Velometro Mobility Inc and contributors +// For license information, please see license.txt + +frappe.query_reports["Production Order Stock Report"] = { + +} diff --git a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.json b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.json new file mode 100644 index 00000000000..1b1357e5669 --- /dev/null +++ b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.json @@ -0,0 +1,19 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2017-01-10 14:01:43.905861", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "letter_head": "Standard", + "modified": "2017-01-10 14:01:43.905861", + "modified_by": "Administrator", + "module": "Manufacturing", + "name": "Production Order Stock Report", + "owner": "Administrator", + "ref_doctype": "Production Order", + "report_name": "Production Order Stock Report", + "report_type": "Script Report" +} \ No newline at end of file diff --git a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py new file mode 100644 index 00000000000..6ded72fc8b3 --- /dev/null +++ b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py @@ -0,0 +1,132 @@ +# Copyright (c) 2017, Velometro Mobility Inc and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +from frappe.utils import flt, cint +import frappe + +def execute(filters=None): + + + prod_list = get_production_orders() + + data = get_item_list( prod_list) + + columns = get_columns() + + return columns, data + + +def get_item_list(prod_list): + + out = [] + + low_price_data = [] + low_supplier = [] + company = frappe.db.get_default("company") + float_precision = cint(frappe.db.get_default("float_precision")) or 2 + company_currency = frappe.db.get_default("currency") + # Get the default supplier of suppliers + + + #Add a row for each item/qty + for root in prod_list: + bom = frappe.db.get_value("Production Order", root.name,"bom_no") + desc = frappe.db.get_value("BOM", bom, "description") + qty = frappe.db.get_value("Production Order", root.name,"qty") + + item_list = frappe.db.sql(""" SELECT + bom_item.item_code as item_code, + SUM(ifnull(ledger.actual_qty,0))/bom_item.qty as build_qty + FROM + `tabBOM Item` AS bom_item + LEFT JOIN `tabStock Ledger Entry` AS ledger + ON bom_item.item_code = ledger.item_code + WHERE + bom_item.parent=%(bom)s + GROUP BY + bom_item.item_code""", {"bom": bom}, as_dict=1) + stock_qty = 0 + count = 0 + for item in item_list: + count = count + 1 + if item.build_qty >= qty: + stock_qty = stock_qty + 1 + if count == stock_qty: + build = "Y" + else: + build = "N" + + row = frappe._dict({ + "production_order": root.name, + "status": root.status, + "req_items": cint(count), + "instock": stock_qty, + "description": desc, + "bom_no": bom, + "ready_to_build": build + }) + + out.append(row) + + return out + +def get_production_orders(): + + out = [] + + + prod_list = frappe.db.sql("""select name, status from `tabProduction Order` as prod where status != "Completed" and docstatus = 1""", {}, as_dict=1) + prod_list.sort(reverse=False) + + for po in prod_list: + out.append(po) + + return out + +def get_columns(): + columns = [{ + "fieldname": "production_order", + "label": "Production Order", + "fieldtype": "Link", + "options": "Production Order", + "width": 120 + },{ + "fieldname": "bom_no", + "label": "BOM", + "fieldtype": "Link", + "options": "BOM", + "width": 150 + },{ + "fieldname": "description", + "label": "Description", + "fieldtype": "Data", + "options": "", + "width": 275 + },{ + "fieldname": "status", + "label": "Status", + "fieldtype": "Data", + "options": "", + "width": 120 + },{ + "fieldname": "req_items", + "label": "# of Required Items", + "fieldtype": "Data", + "options": "", + "width": 150 + },{ + "fieldname": "instock", + "label": "# of In Stock Items", + "fieldtype": "Data", + "options": "", + "width": 150 + }, { + "fieldname": "ready_to_build", + "label": "Can Start?", + "fieldtype": "Data", + "options": "", + "width": 80 + }] + + return columns From 05dca985e6f94d371e3ed0789348e4377d1a2408 Mon Sep 17 00:00:00 2001 From: Ben Cornwell-Mott Date: Tue, 7 Feb 2017 09:15:33 -0800 Subject: [PATCH 2/6] Fixed stock query and corrected with suggestions from rohit --- .../bom_stock_report/bom_stock_report.json | 4 +- .../production_order_stock_report.js | 11 ++- .../production_order_stock_report.py | 77 ++++++++++--------- 3 files changed, 52 insertions(+), 40 deletions(-) diff --git a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json index cbe9ecef9ee..6bdeb231a0c 100644 --- a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json +++ b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json @@ -8,12 +8,12 @@ "idx": 0, "is_standard": "Yes", "letter_head": "Standard", - "modified": "2017-01-10 14:00:54.341088", + "modified": "2017-02-07 09:10:10.954616", "modified_by": "Administrator", "module": "Manufacturing", "name": "BOM Stock Report", "owner": "Administrator", - "query": "SELECT \n\tbom_item.item_code as \"Item:Link/Item:200\",\n\tROUND(bom_item.qty,2) as \"Required Qty:Float:100\",\n\tROUND(SUM(ifnull(ledger.actual_qty,0)),2) as \"In Stock Qty:Float:100\",\n\tFLOOR(SUM(ifnull(ledger.actual_qty,0))/bom_item.qty) as \"Enough Parts to Build:Int:100\"\nFROM\n\t`tabBOM Item` AS bom_item \n\tLEFT JOIN `tabStock Ledger Entry` AS ledger\t\n\tON bom_item.item_code = ledger.item_code \nWHERE\n\tbom_item.parent=%(bom)s\n\nGROUP BY bom_item.item_code", + "query": "SELECT \n\tbom_item.item_code as \"Item:Link/Item:200\",\n\tbom_item.description as \"Description:Data:300\",\n\tROUND(bom_item.qty * conf_item.conversion_factor,2) as \"Required Qty:Float:100\",\n\tROUND(ledger.actual_qty * conf_ledger.conversion_factor,2) as \"In Stock Qty:Float:100\",\n\tFLOOR((ledger.actual_qty * conf_ledger.conversion_factor)/(bom_item.qty * \t\t \tconf_item.conversion_factor)) as \"Enough Parts to Build:Int:100\"\nFROM\n\t`tabBOM Item` AS bom_item \n\tLEFT JOIN `tabBin` AS ledger\t\n\tON bom_item.item_code = ledger.item_code AND ledger.warehouse = %(warehouse)s\n\tLEFT JOIN `tabUOM Conversion Detail` AS conf_item\n\tON conf_item.parent = bom_item.item_code AND conf_item.uom = bom_item.stock_uom\n\tLEFT JOIN `tabUOM Conversion Detail` AS conf_ledger\n\tON conf_ledger.parent = ledger.item_code AND conf_ledger.uom = ledger.stock_uom\nWHERE\n\tbom_item.parent=%(bom)s\n\nGROUP BY bom_item.item_code", "ref_doctype": "BOM", "report_name": "BOM Stock Report", "report_type": "Query Report" diff --git a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js index e3c8ce9f76a..8e5adce9ca5 100644 --- a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js +++ b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js @@ -2,5 +2,14 @@ // For license information, please see license.txt frappe.query_reports["Production Order Stock Report"] = { - + "filters": [ + { + "fieldname":"warehouse", + "label": __("Warehouse"), + "fieldtype": "Link", + "options": "Warehouse", + "default": "Stores - VMI" + + } + ] } diff --git a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py index 6ded72fc8b3..43fd3acb136 100644 --- a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py +++ b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py @@ -6,46 +6,41 @@ from frappe.utils import flt, cint import frappe def execute(filters=None): - - prod_list = get_production_orders() - - data = get_item_list( prod_list) - + data = get_item_list( prod_list, filters) columns = get_columns() - return columns, data - - -def get_item_list(prod_list): +def get_item_list(prod_list, filters): out = [] low_price_data = [] low_supplier = [] - company = frappe.db.get_default("company") - float_precision = cint(frappe.db.get_default("float_precision")) or 2 - company_currency = frappe.db.get_default("currency") - # Get the default supplier of suppliers - + # Get the default supplier of suppliers #Add a row for each item/qty for root in prod_list: bom = frappe.db.get_value("Production Order", root.name,"bom_no") + warehouse = frappe.db.get_value("Production Order", root.name,"source_warehouse") + warehouse = "Stores - VMI" desc = frappe.db.get_value("BOM", bom, "description") qty = frappe.db.get_value("Production Order", root.name,"qty") - item_list = frappe.db.sql(""" SELECT - bom_item.item_code as item_code, - SUM(ifnull(ledger.actual_qty,0))/bom_item.qty as build_qty - FROM - `tabBOM Item` AS bom_item - LEFT JOIN `tabStock Ledger Entry` AS ledger - ON bom_item.item_code = ledger.item_code - WHERE - bom_item.parent=%(bom)s - GROUP BY - bom_item.item_code""", {"bom": bom}, as_dict=1) + item_list = frappe.db.sql("""SELECT + bom_item.item_code as item_code, + SUM(ifnull(ledger.actual_qty * conf_ledger.conversion_factor,0))/(bom_item.qty * conf_item.conversion_factor) as build_qty + FROM + `tabBOM Item` AS bom_item + LEFT JOIN `tabBin` AS ledger + ON bom_item.item_code = ledger.item_code AND ledger.warehouse = ifnull(%(warehouse)s,%(filterhouse)s) + LEFT JOIN `tabUOM Conversion Detail` AS conf_item + ON conf_item.parent = bom_item.item_code AND conf_item.uom = bom_item.stock_uom + LEFT JOIN `tabUOM Conversion Detail` AS conf_ledger + ON conf_ledger.parent = ledger.item_code AND conf_ledger.uom = ledger.stock_uom + WHERE + bom_item.parent = %(bom)s + GROUP BY + bom_item.item_code""", {"bom": bom, "warehouse": warehouse, "filterhouse": filters.warehouse}, as_dict=1) stock_qty = 0 count = 0 for item in item_list: @@ -64,6 +59,7 @@ def get_item_list(prod_list): "instock": stock_qty, "description": desc, "bom_no": bom, + "qty": qty, "ready_to_build": build }) @@ -73,14 +69,15 @@ def get_item_list(prod_list): def get_production_orders(): - out = [] + #out = [] - prod_list = frappe.db.sql("""select name, status from `tabProduction Order` as prod where status != "Completed" and docstatus = 1""", {}, as_dict=1) - prod_list.sort(reverse=False) + #prod_list = frappe.db.sql("""select name, status from `tabProduction Order` as prod where status != "Completed" and docstatus = 1""", {}, as_dict=1) + out = frappe.get_all("Production Order", filters={"docstatus": 1, "status": ( "!=","Completed")}, fields=["name","status"], order_by='name') + #prod_list.sort(reverse=False) - for po in prod_list: - out.append(po) + #for po in prod_list: + #out.append(po) return out @@ -90,43 +87,49 @@ def get_columns(): "label": "Production Order", "fieldtype": "Link", "options": "Production Order", - "width": 120 + "width": 110 },{ "fieldname": "bom_no", "label": "BOM", "fieldtype": "Link", "options": "BOM", - "width": 150 + "width": 130 },{ "fieldname": "description", "label": "Description", "fieldtype": "Data", "options": "", - "width": 275 + "width": 250 + },{ + "fieldname": "qty", + "label": "Qty to Build", + "fieldtype": "Data", + "options": "", + "width": 110 },{ "fieldname": "status", "label": "Status", "fieldtype": "Data", "options": "", - "width": 120 + "width": 110 },{ "fieldname": "req_items", "label": "# of Required Items", "fieldtype": "Data", "options": "", - "width": 150 + "width": 135 },{ "fieldname": "instock", "label": "# of In Stock Items", "fieldtype": "Data", "options": "", - "width": 150 + "width": 135 }, { "fieldname": "ready_to_build", "label": "Can Start?", "fieldtype": "Data", "options": "", - "width": 80 + "width": 75 }] return columns From fc41bb6afd11b970273732323dc76a78bff1f953 Mon Sep 17 00:00:00 2001 From: bcornwellmott Date: Thu, 9 Feb 2017 20:37:11 -0800 Subject: [PATCH 3/6] Fixed code issues Also changed qty to Quantity left to build --- .../production_order_stock_report.py | 57 ++++++++----------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py index 43fd3acb136..eff01687edd 100644 --- a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py +++ b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py @@ -7,7 +7,7 @@ import frappe def execute(filters=None): prod_list = get_production_orders() - data = get_item_list( prod_list, filters) + data = get_item_list(prod_list, filters) columns = get_columns() return columns, data @@ -17,49 +17,49 @@ def get_item_list(prod_list, filters): low_price_data = [] low_supplier = [] - # Get the default supplier of suppliers #Add a row for each item/qty - for root in prod_list: - bom = frappe.db.get_value("Production Order", root.name,"bom_no") - warehouse = frappe.db.get_value("Production Order", root.name,"source_warehouse") - warehouse = "Stores - VMI" + for prod_order in prod_list: + bom = frappe.db.get_value("Production Order", prod_order.name, "bom_no") + warehouse = frappe.db.get_value("Production Order", prod_order.name, "source_warehouse") desc = frappe.db.get_value("BOM", bom, "description") - qty = frappe.db.get_value("Production Order", root.name,"qty") - + qty = frappe.db.get_value("Production Order", prod_order.name, "qty") + produced_value = frappe.db.get_value("Production Order", prod_order.name, "produced_qty") item_list = frappe.db.sql("""SELECT bom_item.item_code as item_code, - SUM(ifnull(ledger.actual_qty * conf_ledger.conversion_factor,0))/(bom_item.qty * conf_item.conversion_factor) as build_qty + ifnull(ledger.actual_qty,0)/(bom_item.qty) as build_qty FROM `tabBOM Item` AS bom_item LEFT JOIN `tabBin` AS ledger - ON bom_item.item_code = ledger.item_code AND ledger.warehouse = ifnull(%(warehouse)s,%(filterhouse)s) - LEFT JOIN `tabUOM Conversion Detail` AS conf_item - ON conf_item.parent = bom_item.item_code AND conf_item.uom = bom_item.stock_uom - LEFT JOIN `tabUOM Conversion Detail` AS conf_ledger - ON conf_ledger.parent = ledger.item_code AND conf_ledger.uom = ledger.stock_uom + ON bom_item.item_code = ledger.item_code + AND ledger.warehouse = ifnull(%(warehouse)s,%(filterhouse)s) WHERE bom_item.parent = %(bom)s GROUP BY bom_item.item_code""", {"bom": bom, "warehouse": warehouse, "filterhouse": filters.warehouse}, as_dict=1) stock_qty = 0 count = 0 + buildable_qty = qty for item in item_list: count = count + 1 - if item.build_qty >= qty: + if item.build_qty >= (qty-produced_value): stock_qty = stock_qty + 1 + elif buildable_qty > item.build_qty: + buidable_qty = item.build_qty + if count == stock_qty: build = "Y" else: build = "N" row = frappe._dict({ - "production_order": root.name, - "status": root.status, + "production_order": prod_order.name, + "status": prod_order.status, "req_items": cint(count), "instock": stock_qty, "description": desc, "bom_no": bom, "qty": qty, + "buildable_qty": buildable_qty, "ready_to_build": build }) @@ -69,16 +69,7 @@ def get_item_list(prod_list, filters): def get_production_orders(): - #out = [] - - - #prod_list = frappe.db.sql("""select name, status from `tabProduction Order` as prod where status != "Completed" and docstatus = 1""", {}, as_dict=1) out = frappe.get_all("Production Order", filters={"docstatus": 1, "status": ( "!=","Completed")}, fields=["name","status"], order_by='name') - #prod_list.sort(reverse=False) - - #for po in prod_list: - #out.append(po) - return out def get_columns(): @@ -88,43 +79,43 @@ def get_columns(): "fieldtype": "Link", "options": "Production Order", "width": 110 - },{ + }, { "fieldname": "bom_no", "label": "BOM", "fieldtype": "Link", "options": "BOM", "width": 130 - },{ + }, { "fieldname": "description", "label": "Description", "fieldtype": "Data", "options": "", "width": 250 - },{ + }, { "fieldname": "qty", "label": "Qty to Build", "fieldtype": "Data", "options": "", "width": 110 - },{ + }, { "fieldname": "status", "label": "Status", "fieldtype": "Data", "options": "", "width": 110 - },{ + }, { "fieldname": "req_items", "label": "# of Required Items", "fieldtype": "Data", "options": "", "width": 135 - },{ + }, { "fieldname": "instock", "label": "# of In Stock Items", "fieldtype": "Data", "options": "", "width": 135 - }, { + }, { "fieldname": "ready_to_build", "label": "Can Start?", "fieldtype": "Data", From 630882787a6091a41a825f95e21cb2d1612cb9be Mon Sep 17 00:00:00 2001 From: bcornwellmott Date: Thu, 9 Feb 2017 20:41:12 -0800 Subject: [PATCH 4/6] Added buildable qty The field indicates how many can be built. --- .../production_order_stock_report.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py index eff01687edd..5c3bd787f9d 100644 --- a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py +++ b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py @@ -116,11 +116,17 @@ def get_columns(): "options": "", "width": 135 }, { - "fieldname": "ready_to_build", - "label": "Can Start?", + "fieldname": "buildable_qty", + "label": "Buildable Qty", "fieldtype": "Data", "options": "", - "width": 75 + "width": 100 + }, { + "fieldname": "ready_to_build", + "label": "Can Build All", + "fieldtype": "Data", + "options": "", + "width": 90 }] return columns From 67a13972fbad046074130a37026130a9b65635ab Mon Sep 17 00:00:00 2001 From: Ben Cornwell-Mott Date: Thu, 9 Feb 2017 23:21:52 -0800 Subject: [PATCH 5/6] Added warehouse to BOM Stock Report, fixed bugs with buildable qty --- .../bom_stock_report/bom_stock_report.js | 10 ++++++-- .../bom_stock_report/bom_stock_report.json | 4 ++-- .../production_order_stock_report.js | 3 +-- .../production_order_stock_report.py | 23 ++++++++++--------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js index df5e47b33d5..7f087f4b646 100644 --- a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js +++ b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js @@ -4,7 +4,13 @@ frappe.query_reports["BOM Stock Report"] = { "fieldname":"bom", "label": __("BOM"), "fieldtype": "Link", - "options": "BOM" - }, + "options": "BOM", + "reqd": 1 + },{ + "fieldname":"warehouse", + "label": __("Warehouse"), + "fieldtype": "Link", + "reqd": 1 + } ] } \ No newline at end of file diff --git a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json index 6bdeb231a0c..64d0ebbed46 100644 --- a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json +++ b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json @@ -8,12 +8,12 @@ "idx": 0, "is_standard": "Yes", "letter_head": "Standard", - "modified": "2017-02-07 09:10:10.954616", + "modified": "2017-02-09 23:19:32.050905", "modified_by": "Administrator", "module": "Manufacturing", "name": "BOM Stock Report", "owner": "Administrator", - "query": "SELECT \n\tbom_item.item_code as \"Item:Link/Item:200\",\n\tbom_item.description as \"Description:Data:300\",\n\tROUND(bom_item.qty * conf_item.conversion_factor,2) as \"Required Qty:Float:100\",\n\tROUND(ledger.actual_qty * conf_ledger.conversion_factor,2) as \"In Stock Qty:Float:100\",\n\tFLOOR((ledger.actual_qty * conf_ledger.conversion_factor)/(bom_item.qty * \t\t \tconf_item.conversion_factor)) as \"Enough Parts to Build:Int:100\"\nFROM\n\t`tabBOM Item` AS bom_item \n\tLEFT JOIN `tabBin` AS ledger\t\n\tON bom_item.item_code = ledger.item_code AND ledger.warehouse = %(warehouse)s\n\tLEFT JOIN `tabUOM Conversion Detail` AS conf_item\n\tON conf_item.parent = bom_item.item_code AND conf_item.uom = bom_item.stock_uom\n\tLEFT JOIN `tabUOM Conversion Detail` AS conf_ledger\n\tON conf_ledger.parent = ledger.item_code AND conf_ledger.uom = ledger.stock_uom\nWHERE\n\tbom_item.parent=%(bom)s\n\nGROUP BY bom_item.item_code", + "query": "SELECT \n\tbom_item.item_code as \"Item:Link/Item:200\",\n\tbom_item.description as \"Description:Data:300\",\n\tbom_item.qty as \"Required Qty:Float:100\",\n\tledger.actual_qty as \"In Stock Qty:Float:100\",\n\tFLOOR(ledger.actual_qty /bom_item.qty) as \"Enough Parts to Build:Int:100\"\nFROM\n\t`tabBOM Item` AS bom_item \n\tLEFT JOIN `tabBin` AS ledger\t\n\t\tON bom_item.item_code = ledger.item_code \n\t\tAND ledger.warehouse = %(warehouse)s\nWHERE\n\tbom_item.parent=%(bom)s\n\nGROUP BY bom_item.item_code", "ref_doctype": "BOM", "report_name": "BOM Stock Report", "report_type": "Query Report" diff --git a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js index 8e5adce9ca5..917af5da9d2 100644 --- a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js +++ b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.js @@ -7,8 +7,7 @@ frappe.query_reports["Production Order Stock Report"] = { "fieldname":"warehouse", "label": __("Warehouse"), "fieldtype": "Link", - "options": "Warehouse", - "default": "Stores - VMI" + "options": "Warehouse" } ] diff --git a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py index 5c3bd787f9d..4bb00a2939b 100644 --- a/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py +++ b/erpnext/manufacturing/report/production_order_stock_report/production_order_stock_report.py @@ -26,7 +26,7 @@ def get_item_list(prod_list, filters): produced_value = frappe.db.get_value("Production Order", prod_order.name, "produced_qty") item_list = frappe.db.sql("""SELECT bom_item.item_code as item_code, - ifnull(ledger.actual_qty,0)/(bom_item.qty) as build_qty + ifnull(ledger.actual_qty/bom_item.qty,0) as build_qty FROM `tabBOM Item` AS bom_item LEFT JOIN `tabBin` AS ledger @@ -43,8 +43,9 @@ def get_item_list(prod_list, filters): count = count + 1 if item.build_qty >= (qty-produced_value): stock_qty = stock_qty + 1 - elif buildable_qty > item.build_qty: - buidable_qty = item.build_qty + elif buildable_qty >= item.build_qty: + buildable_qty = item.build_qty + if count == stock_qty: build = "Y" @@ -84,13 +85,13 @@ def get_columns(): "label": "BOM", "fieldtype": "Link", "options": "BOM", - "width": 130 + "width": 120 }, { "fieldname": "description", "label": "Description", "fieldtype": "Data", "options": "", - "width": 250 + "width": 230 }, { "fieldname": "qty", "label": "Qty to Build", @@ -102,19 +103,19 @@ def get_columns(): "label": "Status", "fieldtype": "Data", "options": "", - "width": 110 + "width": 100 }, { "fieldname": "req_items", - "label": "# of Required Items", + "label": "# Req'd Items", "fieldtype": "Data", "options": "", - "width": 135 + "width": 105 }, { "fieldname": "instock", - "label": "# of In Stock Items", + "label": "# In Stock", "fieldtype": "Data", "options": "", - "width": 135 + "width": 105 }, { "fieldname": "buildable_qty", "label": "Buildable Qty", @@ -123,7 +124,7 @@ def get_columns(): "width": 100 }, { "fieldname": "ready_to_build", - "label": "Can Build All", + "label": "Build All?", "fieldtype": "Data", "options": "", "width": 90 From 568dac3aad6481d1874e3100b1453ee630d4af82 Mon Sep 17 00:00:00 2001 From: bcornwellmott Date: Sun, 19 Feb 2017 14:04:20 -0800 Subject: [PATCH 6/6] Fixed Link Option for Warehouse --- .../manufacturing/report/bom_stock_report/bom_stock_report.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js index 7f087f4b646..8aed965ab82 100644 --- a/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js +++ b/erpnext/manufacturing/report/bom_stock_report/bom_stock_report.js @@ -10,7 +10,8 @@ frappe.query_reports["BOM Stock Report"] = { "fieldname":"warehouse", "label": __("Warehouse"), "fieldtype": "Link", + "options": "Warehouse", "reqd": 1 } ] -} \ No newline at end of file +}