Merge branch 'healthcare-charts-and-onboarding' of https://github.com/ruchamahabal/erpnext into ruchamahabal-healthcare-charts-and-onboarding
diff --git a/erpnext/accounts/dashboard_fixtures.py b/erpnext/accounts/dashboard_fixtures.py
index 214e467..1eed5a0 100644
--- a/erpnext/accounts/dashboard_fixtures.py
+++ b/erpnext/accounts/dashboard_fixtures.py
@@ -26,8 +26,8 @@
 
 def get_dashboards():
 	return [{
-		"name": "Accounts Dashboard",
-		"dashboard_name": "Accounts Dashboard",
+		"name": "Accounts",
+		"dashboard_name": "Accounts",
 		"doctype": "Dashboard",
 		"charts": [
 			{ "chart": "Profit and Loss" , "width": "Full"},
@@ -81,7 +81,7 @@
 			"timespan": "Last Year",
 			"color": "#a83333",
 			"value_based_on": "base_net_total",
-			"filters_json": json.dumps({"docstatus": 1}),
+			"filters_json": json.dumps([["Purchase Invoice", "docstatus", "=", 1]]),
 			"chart_type": "Sum",
 			"timeseries": 1,
 			"based_on": "posting_date",
@@ -99,7 +99,7 @@
 			"timespan": "Last Year",
 			"color": "#7b933d",
 			"value_based_on": "base_net_total",
-			"filters_json": json.dumps({"docstatus": 1}),
+			"filters_json": json.dumps([["Sales Invoice", "docstatus", "=", 1]]),
 			"chart_type": "Sum",
 			"timeseries": 1,
 			"based_on": "posting_date",
diff --git a/erpnext/accounts/desk_page/accounting/accounting.json b/erpnext/accounts/desk_page/accounting/accounting.json
index a783b1d..576d10c 100644
--- a/erpnext/accounts/desk_page/accounting/accounting.json
+++ b/erpnext/accounts/desk_page/accounting/accounting.json
@@ -122,8 +122,8 @@
    "type": "DocType"
   },
   {
-   "label": "Accounts Dashboard",
-   "link_to": "Accounts Dashboard",
+   "label": "Dashboard",
+   "link_to": "Accounts",
    "type": "Dashboard"
   },
   {
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index db20589..63c34ed 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -398,7 +398,7 @@
   {
    "allow_on_submit": 1,
    "fieldname": "po_no",
-   "fieldtype": "Data",
+   "fieldtype": "Small Text",
    "label": "Customer's Purchase Order",
    "no_copy": 1,
    "print_hide": 1
@@ -1579,7 +1579,7 @@
  "idx": 181,
  "is_submittable": 1,
  "links": [],
- "modified": "2020-04-29 13:37:09.355300",
+ "modified": "2020-05-19 17:00:57.208696",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Sales Invoice",
diff --git a/erpnext/buying/dashboard_fixtures.py b/erpnext/buying/dashboard_fixtures.py
new file mode 100644
index 0000000..0e2f78f
--- /dev/null
+++ b/erpnext/buying/dashboard_fixtures.py
@@ -0,0 +1,207 @@
+# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+import frappe
+import json
+from frappe import _
+from frappe.utils import nowdate
+from erpnext.accounts.utils import get_fiscal_year
+
+def get_data():
+	return frappe._dict({
+		"dashboards": get_dashboards(),
+		"charts": get_charts(),
+		"number_cards": get_number_cards(),
+	})
+
+def get_company_for_dashboards():
+	company = frappe.defaults.get_defaults().company
+	if company:
+		return company
+	else:
+		company_list = frappe.get_list("Company")
+		if company_list:
+			return company_list[0].name
+	return None
+
+company = frappe.get_doc("Company", get_company_for_dashboards())
+fiscal_year = get_fiscal_year(nowdate(), as_dict=1)
+fiscal_year_name = fiscal_year.get("name")
+start_date = str(fiscal_year.get("year_start_date"))
+end_date = str(fiscal_year.get("year_end_date"))
+
+def get_dashboards():
+	return [{
+		"name": "Buying",
+		"dashboard_name": "Buying",
+		"charts": [
+			{ "chart": "Purchase Order Trends", "width": "Full"},
+			{ "chart": "Material Request Analysis", "width": "Half"},
+			{ "chart": "Purchase Order Analysis", "width": "Half"},
+			{ "chart": "Top Suppliers", "width": "Full"}
+		],
+		"cards": [
+			{ "card": "This Year Purchases"},
+			{ "card": "Purchase Orders to Receive"},
+			{ "card": "Purchase Orders to Bill"},
+			{ "card": "Active Suppliers"}
+		]
+	}]
+
+def get_charts():
+	return [
+		{
+			"name": "Purchase Order Analysis",
+			"chart_name": _("Purchase Order Analysis"),
+			"chart_type": "Report",
+			"custom_options": json.dumps({
+				"type": "donut",
+				"height": 300,
+				"axisOptions": {"shortenYAxisNumbers": 1}
+			}),
+			"doctype": "Dashboard Chart",
+			"filters_json": json.dumps({
+				"company": company.name,
+				"from_date": start_date,
+				"to_date": end_date
+			}),
+			"is_custom": 1,
+			"is_public": 1,
+			"owner": "Administrator",
+			"report_name": "Purchase Order Analysis",
+			"type": "Donut"
+		},
+		{
+			"name": "Material Request Analysis",
+			"chart_name": _("Material Request Analysis"),
+			"chart_type": "Group By",
+			"custom_options": json.dumps({"height": 300}),
+			"doctype": "Dashboard Chart",
+			"document_type": "Material Request",
+			"filters_json": json.dumps(
+				[["Material Request", "status", "not in", ["Draft", "Cancelled", "Stopped", None], False],
+				["Material Request", "material_request_type", "=", "Purchase", False],
+				["Material Request", "company", "=", company.name, False],
+				["Material Request", "docstatus", "=", 1, False],
+				["Material Request", "transaction_date", "Between", [start_date, end_date], False]]
+			),
+			"group_by_based_on": "status",
+			"group_by_type": "Count",
+			"is_custom": 0,
+			"is_public": 1,
+			"number_of_groups": 0,
+			"owner": "Administrator",
+			"type": "Donut"
+		},
+		{
+			"name": "Purchase Order Trends",
+			"chart_name": _("Purchase Order Trends"),
+			"chart_type": "Report",
+			"custom_options": json.dumps({
+				"type": "line",
+				"axisOptions": {"shortenYAxisNumbers": 1},
+				"tooltipOptions": {},
+				"lineOptions": {
+					"regionFill": 1
+				}
+			}),
+			"doctype": "Dashboard Chart",
+			"filters_json": json.dumps({
+				"company": company.name,
+				"period": "Monthly",
+				"fiscal_year": fiscal_year_name,
+				"period_based_on": "posting_date",
+				"based_on": "Item"
+			}),
+			"is_custom": 1,
+			"is_public": 1,
+			"owner": "Administrator",
+			"report_name": "Purchase Order Trends",
+			"type": "Line"
+		},
+		{
+			"name": "Top Suppliers",
+			"chart_name": _("Top Suppliers"),
+			"chart_type": "Report",
+			"doctype": "Dashboard Chart",
+			"filters_json": json.dumps({
+				"company": company.name,
+				"period": "Monthly",
+				"fiscal_year": fiscal_year_name,
+				"period_based_on": "posting_date",
+				"based_on": "Supplier"
+			}),
+			"is_custom": 1,
+			"is_public": 1,
+			"owner": "Administrator",
+			"report_name": "Purchase Receipt Trends",
+			"type": "Bar"
+		}
+ 	]
+
+def get_number_cards():
+	return [
+		{
+			"name": "This Year Purchases",
+			"aggregate_function_based_on": "base_net_total",
+			"doctype": "Number Card",
+			"document_type": "Purchase Order",
+			"filters_json": json.dumps([
+				["Purchase Order", "transaction_date", "Between", [start_date, end_date], False],
+				["Purchase Order", "status", "not in", ["Draft", "Cancelled", "Closed", None], False],
+				["Purchase Order", "docstatus", "=", 1, False],
+				["Purchase Order", "company", "=", company.name, False],
+				["Purchase Order", "transaction_date", "Between", [start_date,end_date], False]
+			]),
+			"function": "Sum",
+			"is_public": 1,
+			"label": _("This Year Purchases"),
+			"owner": "Administrator",
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Monthly"
+		},
+		{
+			"name": "Purchase Orders to Receive",
+			"doctype": "Number Card",
+			"document_type": "Purchase Order",
+			"filters_json": json.dumps([
+				["Purchase Order", "status", "in", ["To Receive and Bill", "To Receive", None], False],
+				["Purchase Order", "docstatus", "=", 1, False],
+				["Purchase Order", "company", "=", company.name, False]
+			]),
+			"function": "Count",
+			"is_public": 1,
+			"label": _("Purchase Orders to Receive"),
+			"owner": "Administrator",
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Weekly"
+		},
+		{
+			"name": "Purchase Orders to Bill",
+			"doctype": "Number Card",
+			"document_type": "Purchase Order",
+			"filters_json": json.dumps([
+				["Purchase Order", "status", "in", ["To Receive and Bill", "To Bill", None], False],
+				["Purchase Order", "docstatus", "=", 1, False],
+				["Purchase Order", "company", "=", company.name, False]
+			]),
+			"function": "Count",
+			"is_public": 1,
+			"label": _("Purchase Orders to Bill"),
+			"owner": "Administrator",
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Weekly"
+		},
+		{
+			"name": "Active Suppliers",
+			"doctype": "Number Card",
+			"document_type": "Supplier",
+			"filters_json": json.dumps([["Supplier", "disabled", "=", "0"]]),
+			"function": "Count",
+			"is_public": 1,
+			"label": "Active Suppliers",
+			"owner": "Administrator",
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Monthly"
+		}
+	]
\ No newline at end of file
diff --git a/erpnext/buying/desk_page/buying/buying.json b/erpnext/buying/desk_page/buying/buying.json
index 5e764cf..ee18545 100644
--- a/erpnext/buying/desk_page/buying/buying.json
+++ b/erpnext/buying/desk_page/buying/buying.json
@@ -2,18 +2,13 @@
  "cards": [
   {
    "hidden": 0,
-   "label": "Supplier",
-   "links": "[\n    {\n        \"description\": \"Supplier database.\",\n        \"label\": \"Supplier\",\n        \"name\": \"Supplier\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Supplier Group master.\",\n        \"label\": \"Supplier Group\",\n        \"name\": \"Supplier Group\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"All Contacts.\",\n        \"label\": \"Contact\",\n        \"name\": \"Contact\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"All Addresses.\",\n        \"label\": \"Address\",\n        \"name\": \"Address\",\n        \"type\": \"doctype\"\n    }\n]"
+   "label": "Buying",
+   "links": "[   \n    {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"description\": \"Request for purchase.\",\n        \"label\": \"Material Request\",\n        \"name\": \"Material Request\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"description\": \"Purchase Orders given to Suppliers.\",\n        \"label\": \"Purchase Order\",\n        \"name\": \"Purchase Order\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"label\": \"Purchase Invoice\",\n        \"name\": \"Purchase Invoice\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"description\": \"Request for quotation.\",\n        \"label\": \"Request for Quotation\",\n        \"name\": \"Request for Quotation\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"description\": \"Quotations received from Suppliers.\",\n        \"label\": \"Supplier Quotation\",\n        \"name\": \"Supplier Quotation\",\n        \"type\": \"doctype\"\n    }\n]"
   },
   {
    "hidden": 0,
-   "label": "Purchasing",
-   "links": "[\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"description\": \"Purchase Orders given to Suppliers.\",\n        \"label\": \"Purchase Order\",\n        \"name\": \"Purchase Order\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"label\": \"Purchase Invoice\",\n        \"name\": \"Purchase Invoice\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"description\": \"Request for purchase.\",\n        \"label\": \"Material Request\",\n        \"name\": \"Material Request\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"description\": \"Request for quotation.\",\n        \"label\": \"Request for Quotation\",\n        \"name\": \"Request for Quotation\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"description\": \"Quotations received from Suppliers.\",\n        \"label\": \"Supplier Quotation\",\n        \"name\": \"Supplier Quotation\",\n        \"type\": \"doctype\"\n    }\n]"
-  },
-  {
-   "hidden": 0,
-   "label": "Items and Pricing",
-   "links": "[\n    {\n        \"description\": \"All Products or Services.\",\n        \"label\": \"Item\",\n        \"name\": \"Item\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Multiple Item prices.\",\n        \"label\": \"Item Price\",\n        \"name\": \"Item Price\",\n        \"onboard\": 1,\n        \"route\": \"#Report/Item Price\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Price List master.\",\n        \"label\": \"Price List\",\n        \"name\": \"Price List\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Bundle items at time of sale.\",\n        \"label\": \"Product Bundle\",\n        \"name\": \"Product Bundle\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Tree of Item Groups.\",\n        \"icon\": \"fa fa-sitemap\",\n        \"label\": \"Item Group\",\n        \"link\": \"Tree/Item Group\",\n        \"name\": \"Item Group\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Rules for applying different promotional schemes.\",\n        \"label\": \"Promotional Scheme\",\n        \"name\": \"Promotional Scheme\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Rules for applying pricing and discount.\",\n        \"label\": \"Pricing Rule\",\n        \"name\": \"Pricing Rule\",\n        \"type\": \"doctype\"\n    }\n]"
+   "label": "Items & Pricing",
+   "links": "[\n    {\n        \"description\": \"All Products or Services.\",\n        \"label\": \"Item\",\n        \"name\": \"Item\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Multiple Item prices.\",\n        \"label\": \"Item Price\",\n        \"name\": \"Item Price\",\n        \"onboard\": 1,\n        \"route\": \"#Report/Item Price\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Price List master.\",\n        \"label\": \"Price List\",\n        \"name\": \"Price List\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Bundle items at time of sale.\",\n        \"label\": \"Product Bundle\",\n        \"name\": \"Product Bundle\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Tree of Item Groups.\",\n        \"icon\": \"fa fa-sitemap\",\n        \"label\": \"Item Group\",\n        \"link\": \"Tree/Item Group\",\n        \"name\": \"Item Group\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Rules for applying different promotional schemes.\",\n        \"label\": \"Promotional Scheme\",\n        \"name\": \"Promotional Scheme\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Rules for applying pricing and discount.\",\n        \"label\": \"Pricing Rule\",\n        \"name\": \"Pricing Rule\",\n        \"type\": \"doctype\"\n    }\n]"
   },
   {
    "hidden": 0,
@@ -22,73 +17,92 @@
   },
   {
    "hidden": 0,
+   "label": "Supplier",
+   "links": "[\n    {\n        \"description\": \"Supplier database.\",\n        \"label\": \"Supplier\",\n        \"name\": \"Supplier\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Supplier Group master.\",\n        \"label\": \"Supplier Group\",\n        \"name\": \"Supplier Group\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"All Contacts.\",\n        \"label\": \"Contact\",\n        \"name\": \"Contact\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"All Addresses.\",\n        \"label\": \"Address\",\n        \"name\": \"Address\",\n        \"type\": \"doctype\"\n    }\n]"
+  },
+  {
+   "hidden": 0,
    "label": "Supplier Scorecard",
    "links": "[\n    {\n        \"description\": \"All Supplier scorecards.\",\n        \"label\": \"Supplier Scorecard\",\n        \"name\": \"Supplier Scorecard\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Templates of supplier scorecard variables.\",\n        \"label\": \"Supplier Scorecard Variable\",\n        \"name\": \"Supplier Scorecard Variable\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Templates of supplier scorecard criteria.\",\n        \"label\": \"Supplier Scorecard Criteria\",\n        \"name\": \"Supplier Scorecard Criteria\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"description\": \"Templates of supplier standings.\",\n        \"label\": \"Supplier Scorecard Standing\",\n        \"name\": \"Supplier Scorecard Standing\",\n        \"type\": \"doctype\"\n    }\n]"
   },
   {
    "hidden": 0,
    "label": "Key Reports",
-   "links": "[\n    {\n        \"is_query_report\": true,\n        \"label\": \"Purchase Analytics\",\n        \"name\": \"Purchase Analytics\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Purchase Order\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Supplier-Wise Sales Analytics\",\n        \"name\": \"Supplier-Wise Sales Analytics\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Stock Ledger Entry\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Purchase Order Trends\",\n        \"name\": \"Purchase Order Trends\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Purchase Order\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Procurement Tracker\",\n        \"name\": \"Procurement Tracker\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Purchase Order\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Requested Items To Be Ordered\",\n        \"name\": \"Requested Items To Be Ordered\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Material Request\",\n        \"type\": \"report\"\n    }\n]"
+   "links": "[\n    {\n        \"is_query_report\": true,\n        \"label\": \"Purchase Analytics\",\n        \"name\": \"Purchase Analytics\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Purchase Order\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Purchase Order Analysis\",\n        \"name\": \"Purchase Order Analysis\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Purchase Order\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Supplier-Wise Sales Analytics\",\n        \"name\": \"Supplier-Wise Sales Analytics\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Stock Ledger Entry\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Requested Items to Order\",\n        \"name\": \"Requested Items to Order\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Material Request\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Purchase Order Trends\",\n        \"name\": \"Purchase Order Trends\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Purchase Order\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Procurement Tracker\",\n        \"name\": \"Procurement Tracker\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Purchase Order\",\n        \"type\": \"report\"\n    }\n]"
   },
   {
    "hidden": 0,
    "label": "Other Reports",
-   "links": "[\n    {\n        \"is_query_report\": true,\n        \"label\": \"Items To Be Requested\",\n        \"name\": \"Items To Be Requested\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Item\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Item-wise Purchase History\",\n        \"name\": \"Item-wise Purchase History\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Item\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Material Requests for which Supplier Quotations are not created\",\n        \"name\": \"Material Requests for which Supplier Quotations are not created\",\n        \"reference_doctype\": \"Material Request\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Supplier Addresses And Contacts\",\n        \"name\": \"Address And Contacts\",\n        \"reference_doctype\": \"Address\",\n        \"route_options\": {\n            \"party_type\": \"Supplier\"\n        },\n        \"type\": \"report\"\n    }\n]"
+   "links": "[\n    {\n        \"is_query_report\": true,\n        \"label\": \"Items To Be Requested\",\n        \"name\": \"Items To Be Requested\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Item\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Item-wise Purchase History\",\n        \"name\": \"Item-wise Purchase History\",\n        \"onboard\": 1,\n        \"reference_doctype\": \"Item\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Subcontracted Raw Materials To Be Transferred\",\n        \"name\": \"Subcontracted Raw Materials To Be Transferred\",\n        \"reference_doctype\": \"Purchase Order\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Subcontracted Item To Be Received\",\n        \"name\": \"Subcontracted Item To Be Received\",\n        \"reference_doctype\": \"Purchase Order\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Quoted Item Comparison\",\n        \"name\": \"Quoted Item Comparison\",\n         \"onboard\": 1,\n        \"reference_doctype\": \"Supplier Quotation\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Material Requests for which Supplier Quotations are not created\",\n        \"name\": \"Material Requests for which Supplier Quotations are not created\",\n        \"reference_doctype\": \"Material Request\",\n        \"type\": \"report\"\n    },\n    {\n        \"is_query_report\": true,\n        \"label\": \"Supplier Addresses And Contacts\",\n        \"name\": \"Address And Contacts\",\n        \"reference_doctype\": \"Address\",\n        \"route_options\": {\n            \"party_type\": \"Supplier\"\n        },\n        \"type\": \"report\"\n    }\n]"
   }
  ],
+ "cards_label": "Masters & Reports ",
  "category": "Modules",
  "charts": [
   {
-   "chart_name": "Expenses",
-   "label": "Expenses"
+   "chart_name": "Purchase Order Trends",
+   "label": "Purchase Order Trends"
   }
  ],
+ "charts_label": "Buying Dashboard",
  "creation": "2020-01-28 11:50:26.195467",
  "developer_mode_only": 0,
  "disable_user_customization": 0,
  "docstatus": 0,
  "doctype": "Desk Page",
  "extends_another_page": 0,
- "icon": "",
+ "hide_custom": 0,
  "idx": 0,
  "is_standard": 1,
  "label": "Buying",
- "modified": "2020-04-01 11:28:51.192097",
+ "modified": "2020-05-19 19:44:36.260982",
  "modified_by": "Administrator",
  "module": "Buying",
  "name": "Buying",
+ "onboarding": "Buying",
  "owner": "Administrator",
  "pin_to_bottom": 0,
  "pin_to_top": 0,
  "shortcuts": [
   {
-   "format": "{} Unpaid",
-   "label": "Purchase Invoice",
-   "link_to": "Purchase Invoice",
-   "stats_filter": "{\n    \"company\": [\"like\", '%' + frappe.defaults.get_global_default(\"company\") + '%'],\n    \"status\": \"Unpaid\"\n}",
+   "color": "#cef6d1",
+   "format": "{} available",
+   "label": "Item",
+   "link_to": "Item",
+   "stats_filter": "{\n    \"disabled\": 0\n}",
    "type": "DocType"
   },
   {
-   "format": "{} to receive",
+   "color": "#ffe8cd",
+   "format": "{} Pending",
+   "label": "Material Request",
+   "link_to": "Material Request",
+   "stats_filter": "{\n    \"company\": [\"like\", '%' + frappe.defaults.get_global_default(\"company\") + '%'],\n    \"status\": \"Pending\"\n}",
+   "type": "DocType"
+  },
+  {
+   "color": "#ffe8cd",
+   "format": "{}  to Receive",
    "label": "Purchase Order",
    "link_to": "Purchase Order",
-   "stats_filter": "{\n    \"company\": [\"like\", '%' + frappe.defaults.get_global_default(\"company\") + '%'],\n    \"status\": \"To Receive\"\n}",
+   "stats_filter": "{\n    \"company\": [\"like\", '%' + frappe.defaults.get_global_default(\"company\") + '%'],\n    \"status\":[\"in\", [\"To Receive\", \"To Receive and Bill\"]]\n}",
    "type": "DocType"
   },
   {
-   "label": "Supplier Quotation",
-   "link_to": "Supplier Quotation",
-   "type": "DocType"
-  },
-  {
-   "label": "Accounts Payable",
-   "link_to": "Accounts Payable",
+   "label": "Purchase Analytics",
+   "link_to": "Purchase Analytics",
    "type": "Report"
   },
   {
-   "label": "Purchase Register",
-   "link_to": "Purchase Register",
+   "label": "Purchase Order Analysis",
+   "link_to": "Purchase Order Analysis",
    "type": "Report"
+  },
+  {
+   "label": "Buying Dashboard",
+   "link_to": "Buying",
+   "type": "Dashboard"
   }
- ]
+ ],
+ "shortcuts_label": "Quick Access"
 }
\ No newline at end of file
diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.js b/erpnext/buying/doctype/buying_settings/buying_settings.js
index 403b1c9..a27950a 100644
--- a/erpnext/buying/doctype/buying_settings/buying_settings.js
+++ b/erpnext/buying/doctype/buying_settings/buying_settings.js
@@ -6,3 +6,26 @@
 
 	// }
 });
+
+frappe.tour['Buying Settings'] = [
+	{
+		fieldname: "supp_master_name",
+		title: "Supplier Naming By",
+		description: __("By default, the Item Name is set as per the Item Code entered. If you want Items to be named by a set ") + "<a href='https://docs.erpnext.com/docs/user/manual/en/setting-up/settings/naming-series'>Naming Series</a>" + __(" choose the 'Naming Series' option."),
+	},
+	{
+		fieldname: "buying_price_list",
+		title: "Default Buying Price List",
+		description: __("Configure the default Price List when creating a new Buying transaction, the default is set as 'Standard Buying'. Item prices will be fetched from this Price List.")
+	},
+	{
+		fieldname: "po_required",
+		title: "Purchase Order Required for Purchase Invoice & Receipt Creation",
+		description: __("If this option is configured 'Yes', ERPNext will prevent you from creating a Purchase Invoice or Receipt without creating a Purchase Order first. This configuration can be overridden for a particular supplier by enabling the 'Allow Purchase Invoice Creation Without Purchase Order' checkbox in supplier master.")
+	},
+	{
+		fieldname: "pr_required",
+		title: "Purchase Receipt Required for Purchase Invoice Creation",
+		description: __("If this option is configured 'Yes', ERPNext will prevent you from creating a Purchase Invoice without creating a Purchase Receipt first. This configuration can be overridden for a particular supplier by enabling the 'Allow Purchase Invoice Creation Without Purchase Receipt' checkbox in supplier master.")
+	}
+];
\ No newline at end of file
diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.json b/erpnext/buying/doctype/buying_settings/buying_settings.json
index a492519..a0ab2a0 100644
--- a/erpnext/buying/doctype/buying_settings/buying_settings.json
+++ b/erpnext/buying/doctype/buying_settings/buying_settings.json
@@ -1,8 +1,10 @@
 {
+ "actions": [],
  "creation": "2013-06-25 11:04:03",
  "description": "Settings for Buying Module",
  "doctype": "DocType",
  "document_type": "Other",
+ "engine": "InnoDB",
  "field_order": [
   "supp_master_name",
   "supplier_group",
@@ -44,13 +46,13 @@
   {
    "fieldname": "po_required",
    "fieldtype": "Select",
-   "label": "Purchase Order Required",
+   "label": "Purchase Order Required for Purchase Invoice & Receipt Creation",
    "options": "No\nYes"
   },
   {
    "fieldname": "pr_required",
    "fieldtype": "Select",
-   "label": "Purchase Receipt Required",
+   "label": "Purchase Receipt Required for Purchase Invoice Creation",
    "options": "No\nYes"
   },
   {
@@ -92,7 +94,8 @@
  "icon": "fa fa-cog",
  "idx": 1,
  "issingle": 1,
- "modified": "2019-08-20 13:13:09.055189",
+ "links": [],
+ "modified": "2020-05-15 14:49:32.513611",
  "modified_by": "Administrator",
  "module": "Buying",
  "name": "Buying Settings",
@@ -107,5 +110,7 @@
    "share": 1,
    "write": 1
   }
- ]
+ ],
+ "sort_field": "modified",
+ "sort_order": "DESC"
 }
\ No newline at end of file
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
index 3bc441a..7db1516 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
@@ -761,7 +761,7 @@
    "no_copy": 1,
    "oldfieldname": "status",
    "oldfieldtype": "Select",
-   "options": "\nDraft\nSubmitted\nStopped\nCancelled",
+   "options": "\nDraft\nSubmitted\nStopped\nCancelled\nExpired",
    "print_hide": 1,
    "read_only": 1,
    "reqd": 1,
@@ -803,7 +803,7 @@
  "idx": 29,
  "is_submittable": 1,
  "links": [],
- "modified": "2020-04-15 11:44:52.958022",
+ "modified": "2020-05-15 21:24:12.639482",
  "modified_by": "Administrator",
  "module": "Buying",
  "name": "Supplier Quotation",
diff --git a/erpnext/buying/module_onboarding/buying/buying.json b/erpnext/buying/module_onboarding/buying/buying.json
new file mode 100644
index 0000000..8c798b3
--- /dev/null
+++ b/erpnext/buying/module_onboarding/buying/buying.json
@@ -0,0 +1,54 @@
+{
+ "allow_roles": [
+  {
+   "role": "Purchase Manager"
+  },
+  {
+   "role": "Purchase User"
+  },
+  {
+   "role": "Stock Manager"
+  },
+  {
+   "role": "Stock User"
+  }
+ ],
+ "creation": "2020-05-06 15:56:35.049205",
+ "docstatus": 0,
+ "doctype": "Module Onboarding",
+ "documentation_url": "https://docs.erpnext.com/docs/user/manual/en/buying",
+ "idx": 0,
+ "is_complete": 0,
+ "modified": "2020-05-19 20:03:55.776080",
+ "modified_by": "Administrator",
+ "module": "Buying",
+ "name": "Buying",
+ "owner": "Administrator",
+ "steps": [
+  {
+   "step": "Introduction to Buying"
+  },
+  {
+   "step": "Create a Supplier"
+  },
+  {
+   "step": "Setup your Warehouse"
+  },
+  {
+   "step": "Create a Product"
+  },
+  {
+   "step": "Create a Material Request"
+  },
+  {
+   "step": "Create your first Purchase Order"
+  },
+  {
+   "step": "Buying Settings"
+  }
+ ],
+ "subtitle": "Products, Purchases, Analysis and more.",
+ "success_message": "The Buying Module is all set up!",
+ "title": "Let's Setup the Buying Module.",
+ "user_can_dismiss": 1
+}
\ No newline at end of file
diff --git a/erpnext/buying/onboarding_step/buying_settings/buying_settings.json b/erpnext/buying/onboarding_step/buying_settings/buying_settings.json
new file mode 100644
index 0000000..a788ccd
--- /dev/null
+++ b/erpnext/buying/onboarding_step/buying_settings/buying_settings.json
@@ -0,0 +1,19 @@
+{
+ "action": "Update Settings",
+ "creation": "2020-05-06 15:53:44.667414",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-12 18:30:06.323797",
+ "modified_by": "Administrator",
+ "name": "Buying Settings",
+ "owner": "Administrator",
+ "reference_document": "Buying Settings",
+ "show_full_form": 0,
+ "title": "Configure Buying Settings.",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/buying/onboarding_step/create_a_material_request/create_a_material_request.json b/erpnext/buying/onboarding_step/create_a_material_request/create_a_material_request.json
new file mode 100644
index 0000000..9dc493d
--- /dev/null
+++ b/erpnext/buying/onboarding_step/create_a_material_request/create_a_material_request.json
@@ -0,0 +1,19 @@
+{
+ "action": "Create Entry",
+ "creation": "2020-05-15 14:39:09.818764",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 1,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-15 14:39:09.818764",
+ "modified_by": "Administrator",
+ "name": "Create a Material Request",
+ "owner": "Administrator",
+ "reference_document": "Material Request",
+ "show_full_form": 1,
+ "title": "Create a Material Request",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/buying/onboarding_step/create_a_product/create_a_product.json b/erpnext/buying/onboarding_step/create_a_product/create_a_product.json
new file mode 100644
index 0000000..d2068e1
--- /dev/null
+++ b/erpnext/buying/onboarding_step/create_a_product/create_a_product.json
@@ -0,0 +1,19 @@
+{
+ "action": "Create Entry",
+ "creation": "2020-05-12 18:16:06.624554",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-12 18:30:02.489949",
+ "modified_by": "Administrator",
+ "name": "Create a Product",
+ "owner": "Administrator",
+ "reference_document": "Item",
+ "show_full_form": 0,
+ "title": "Create a Product",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/buying/onboarding_step/create_a_supplier/create_a_supplier.json b/erpnext/buying/onboarding_step/create_a_supplier/create_a_supplier.json
new file mode 100644
index 0000000..7a64224
--- /dev/null
+++ b/erpnext/buying/onboarding_step/create_a_supplier/create_a_supplier.json
@@ -0,0 +1,19 @@
+{
+ "action": "Create Entry",
+ "creation": "2020-05-14 22:09:10.043554",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-14 22:09:10.043554",
+ "modified_by": "Administrator",
+ "name": "Create a Supplier",
+ "owner": "Administrator",
+ "reference_document": "Supplier",
+ "show_full_form": 0,
+ "title": "Create a Supplier",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/buying/onboarding_step/create_your_first_purchase_order/create_your_first_purchase_order.json b/erpnext/buying/onboarding_step/create_your_first_purchase_order/create_your_first_purchase_order.json
new file mode 100644
index 0000000..9dbed23
--- /dev/null
+++ b/erpnext/buying/onboarding_step/create_your_first_purchase_order/create_your_first_purchase_order.json
@@ -0,0 +1,19 @@
+{
+ "action": "Create Entry",
+ "creation": "2020-05-12 18:17:49.976035",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-12 18:31:56.856112",
+ "modified_by": "Administrator",
+ "name": "Create your first Purchase Order",
+ "owner": "Administrator",
+ "reference_document": "Purchase Order",
+ "show_full_form": 0,
+ "title": "Create your first Purchase Order",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/buying/onboarding_step/introduction_to_buying/introduction_to_buying.json b/erpnext/buying/onboarding_step/introduction_to_buying/introduction_to_buying.json
new file mode 100644
index 0000000..fd98fdd
--- /dev/null
+++ b/erpnext/buying/onboarding_step/introduction_to_buying/introduction_to_buying.json
@@ -0,0 +1,19 @@
+{
+ "action": "Watch Video",
+ "creation": "2020-05-06 15:37:09.477765",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-12 18:25:08.509900",
+ "modified_by": "Administrator",
+ "name": "Introduction to Buying",
+ "owner": "Administrator",
+ "show_full_form": 0,
+ "title": "Introduction to Buying",
+ "validate_action": 1,
+ "video_url": "https://youtu.be/efFajTTQBa8"
+}
\ No newline at end of file
diff --git a/erpnext/buying/onboarding_step/setup_your_warehouse/setup_your_warehouse.json b/erpnext/buying/onboarding_step/setup_your_warehouse/setup_your_warehouse.json
new file mode 100644
index 0000000..557c905
--- /dev/null
+++ b/erpnext/buying/onboarding_step/setup_your_warehouse/setup_your_warehouse.json
@@ -0,0 +1,20 @@
+{
+ "action": "Go to Page",
+ "creation": "2020-05-19 18:54:19.383397",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-19 18:54:19.383397",
+ "modified_by": "Administrator",
+ "name": "Setup your Warehouse",
+ "owner": "Administrator",
+ "path": "Tree/Warehouse",
+ "reference_document": "Warehouse",
+ "show_full_form": 0,
+ "title": "Setup your Warehouse",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/buying/report/purchase_order_analysis/__init__.py b/erpnext/buying/report/purchase_order_analysis/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/buying/report/purchase_order_analysis/__init__.py
diff --git a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js
new file mode 100644
index 0000000..701da43
--- /dev/null
+++ b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js
@@ -0,0 +1,78 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+/* eslint-disable */
+
+frappe.query_reports["Purchase Order Analysis"] = {
+	"filters": [
+		{
+			"fieldname": "company",
+			"label": __("Company"),
+			"fieldtype": "Link",
+			"width": "80",
+			"options": "Company",
+			"reqd": 1,
+			"default": frappe.defaults.get_default("company")
+		},
+		{
+			"fieldname":"from_date",
+			"label": __("From Date"),
+			"fieldtype": "Date",
+			"width": "80",
+			"reqd": 1,
+			"default": frappe.datetime.add_months(frappe.datetime.get_today(), -1),
+		},
+		{
+			"fieldname":"to_date",
+			"label": __("To Date"),
+			"fieldtype": "Date",
+			"width": "80",
+			"reqd": 1,
+			"default": frappe.datetime.get_today()
+		},
+		{
+			"fieldname": "purchase_order",
+			"label": __("Purchase Order"),
+			"fieldtype": "Link",
+			"width": "80",
+			"options": "Purchase Order",
+			"get_query": () =>{
+				return {
+					filters: { "docstatus": 1 }
+				}
+			}
+		},
+		{
+			"fieldname": "status",
+			"label": __("Status"),
+			"fieldtype": "MultiSelectList",
+			"width": "80",
+			get_data: function(txt) {
+				let status = ["To Bill", "To Receive", "To Receive and Bill", "Completed"]
+				let options = []
+				for (let option of status){
+					options.push({
+						"value": option,
+						"description": ""
+					})
+				}
+				return options
+			}
+		},
+		{
+			"fieldname": "group_by_po",
+			"label": __("Group by Purchase Order"),
+			"fieldtype": "Check",
+			"default": 0
+		}
+	],
+
+	"formatter": function (value, row, column, data, default_formatter) {
+		value = default_formatter(value, row, column, data);
+		let format_fields = ["received_qty", "billed_amount"];
+
+		if (in_list(format_fields, column.fieldname) && data && data[column.fieldname] > 0) {
+			value = "<span style='color:green'>" + value + "</span>";
+		}
+		return value;
+	}
+};
diff --git a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.json b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.json
new file mode 100644
index 0000000..5ba3101
--- /dev/null
+++ b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.json
@@ -0,0 +1,33 @@
+{
+ "add_total_row": 1,
+ "creation": "2020-05-04 18:41:28.625119",
+ "disable_prepared_report": 0,
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 0,
+ "is_standard": "Yes",
+ "modified": "2020-05-15 20:57:52.623455",
+ "modified_by": "Administrator",
+ "module": "Buying",
+ "name": "Purchase Order Analysis",
+ "owner": "Administrator",
+ "prepared_report": 0,
+ "ref_doctype": "Purchase Order",
+ "report_name": "Purchase Order Analysis",
+ "report_type": "Script Report",
+ "roles": [
+  {
+   "role": "Purchase Manager"
+  },
+  {
+   "role": "Purchase User"
+  },
+  {
+   "role": "Stock User"
+  },
+  {
+   "role": "Supplier"
+  }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py
new file mode 100644
index 0000000..89be622
--- /dev/null
+++ b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py
@@ -0,0 +1,271 @@
+# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+import copy
+from frappe import _
+from frappe.utils import flt, date_diff, getdate
+
+def execute(filters=None):
+	if not filters:
+		return [], []
+
+	validate_filters(filters)
+
+	columns = get_columns(filters)
+	conditions = get_conditions(filters)
+
+	data = get_data(conditions, filters)
+
+	if not data:
+		return [], [], None, []
+
+	data, chart_data = prepare_data(data, filters)
+
+	return columns, data, None, chart_data
+
+def validate_filters(filters):
+	from_date, to_date = filters.get("from_date"), filters.get("to_date")
+
+	if not from_date and to_date:
+		frappe.throw(_("From and To Dates are required."))
+	elif date_diff(to_date, from_date) < 0:
+		frappe.throw(_("To Date cannot be before From Date."))
+
+def get_conditions(filters):
+	conditions = ""
+	if filters.get("from_date") and filters.get("to_date"):
+		conditions += " and po.transaction_date between %(from_date)s and %(to_date)s"
+
+	if filters.get("company"):
+		conditions += " and po.company = %(company)s"
+
+	if filters.get("purchase_order"):
+		conditions += " and po.name = %(purchase_order)s"
+
+	if filters.get("status"):
+		conditions += " and po.status in %(status)s"
+
+	return conditions
+
+def get_data(conditions, filters):
+	data = frappe.db.sql("""
+		SELECT
+			po.transaction_date as date,
+			poi.schedule_date as required_date,
+			po.name as purchase_order,
+			po.status, po.supplier, poi.item_code,
+			poi.qty, poi.received_qty,
+			(poi.qty - poi.received_qty) AS pending_qty,
+			IFNULL(pii.qty, 0) as billed_qty,
+			poi.base_amount as amount,
+			(poi.received_qty * poi.base_rate) as received_qty_amount,
+			(poi.billed_amt * IFNULL(po.conversion_rate, 1)) as billed_amount,
+			(poi.base_amount - (poi.billed_amt * IFNULL(po.conversion_rate, 1))) as pending_amount,
+			po.set_warehouse as warehouse,
+			po.company, poi.name
+		FROM
+			`tabPurchase Order` po,
+			`tabPurchase Order Item` poi
+		LEFT JOIN `tabPurchase Invoice Item` pii
+			ON pii.po_detail = poi.name
+		WHERE
+			poi.parent = po.name
+			and po.status not in ('Stopped', 'Closed')
+			and po.docstatus = 1
+			{0}
+		GROUP BY poi.name
+		ORDER BY po.transaction_date ASC
+	""".format(conditions), filters, as_dict=1)
+
+	return data
+
+def prepare_data(data, filters):
+	completed, pending = 0, 0
+	pending_field =  "pending_amount"
+	completed_field = "billed_amount"
+
+	if filters.get("group_by_po"):
+		purchase_order_map = {}
+
+	for row in data:
+		# sum data for chart
+		completed += row[completed_field]
+		pending += row[pending_field]
+
+		# prepare data for report view
+		row["qty_to_bill"] = flt(row["qty"]) - flt(row["billed_qty"])
+
+		if filters.get("group_by_po"):
+			po_name = row["purchase_order"]
+
+			if not po_name in purchase_order_map:
+				# create an entry
+				row_copy = copy.deepcopy(row)
+				purchase_order_map[po_name] = row_copy
+			else:
+				# update existing entry
+				po_row = purchase_order_map[po_name]
+				po_row["required_date"] = min(getdate(po_row["required_date"]), getdate(row["required_date"]))
+
+				# sum numeric columns
+				fields = ["qty", "received_qty", "pending_qty", "billed_qty", "qty_to_bill", "amount",
+					"received_qty_amount", "billed_amount", "pending_amount"]
+				for field in fields:
+					po_row[field] = flt(row[field]) + flt(po_row[field])
+
+	chart_data = prepare_chart_data(pending, completed)
+
+	if filters.get("group_by_po"):
+		data = []
+		for po in purchase_order_map:
+			data.append(purchase_order_map[po])
+		return data, chart_data
+
+	return data, chart_data
+
+def prepare_chart_data(pending, completed):
+	labels = ["Amount to Bill", "Billed Amount"]
+
+	return {
+		"data" : {
+			"labels": labels,
+			"datasets": [
+				{"values": [pending, completed]}
+				]
+		},
+		"type": 'donut',
+		"height": 300
+	}
+
+def get_columns(filters):
+	columns = [
+		{
+			"label":_("Date"),
+			"fieldname": "date",
+			"fieldtype": "Date",
+			"width": 90
+		},
+		{
+			"label":_("Required By"),
+			"fieldname": "required_date",
+			"fieldtype": "Date",
+			"width": 90
+		},
+		{
+			"label": _("Purchase Order"),
+			"fieldname": "purchase_order",
+			"fieldtype": "Link",
+			"options": "Purchase Order",
+			"width": 160
+		},
+		{
+			"label":_("Status"),
+			"fieldname": "status",
+			"fieldtype": "Data",
+			"width": 130
+		},
+		{
+			"label": _("Supplier"),
+			"fieldname": "supplier",
+			"fieldtype": "Link",
+			"options": "Supplier",
+			"width": 130
+		}]
+
+	if not filters.get("group_by_po"):
+		columns.append({
+			"label":_("Item Code"),
+			"fieldname": "item_code",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 100
+		})
+
+	columns.extend([
+		{
+			"label": _("Qty"),
+			"fieldname": "qty",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Received Qty"),
+			"fieldname": "received_qty",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Pending Qty"),
+			"fieldname": "pending_qty",
+			"fieldtype": "Float",
+			"width": 80,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Billed Qty"),
+			"fieldname": "billed_qty",
+			"fieldtype": "Float",
+			"width": 80,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Qty to Bill"),
+			"fieldname": "qty_to_bill",
+			"fieldtype": "Float",
+			"width": 80,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Amount"),
+			"fieldname": "amount",
+			"fieldtype": "Currency",
+			"width": 110,
+			"options": "Company:company:default_currency",
+			"convertible": "rate"
+		},
+		{
+			"label": _("Billed Amount"),
+			"fieldname": "billed_amount",
+			"fieldtype": "Currency",
+			"width": 110,
+			"options": "Company:company:default_currency",
+			"convertible": "rate"
+		},
+		{
+			"label": _("Pending Amount"),
+			"fieldname": "pending_amount",
+			"fieldtype": "Currency",
+			"width": 130,
+			"options": "Company:company:default_currency",
+			"convertible": "rate"
+		},
+		{
+			"label": _("Received Qty Amount"),
+			"fieldname": "received_qty_amount",
+			"fieldtype": "Currency",
+			"width": 130,
+			"options": "Company:company:default_currency",
+			"convertible": "rate"
+		},
+		{
+			"label": _("Warehouse"),
+			"fieldname": "warehouse",
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"width": 100
+		},
+		{
+			"label": _("Company"),
+			"fieldname": "company",
+			"fieldtype": "Link",
+			"options": "Company",
+			"width": 100
+		}
+	])
+
+	return columns
+
diff --git a/erpnext/buying/report/purchase_order_trends/purchase_order_trends.py b/erpnext/buying/report/purchase_order_trends/purchase_order_trends.py
index 888676c..1ed6cad 100644
--- a/erpnext/buying/report/purchase_order_trends/purchase_order_trends.py
+++ b/erpnext/buying/report/purchase_order_trends/purchase_order_trends.py
@@ -3,6 +3,7 @@
 
 from __future__ import unicode_literals
 import frappe
+from frappe import _
 from erpnext.controllers.trends	import get_columns,get_data
 
 def execute(filters=None):
@@ -10,5 +11,48 @@
 	data = []
 	conditions = get_columns(filters, "Purchase Order")
 	data = get_data(filters, conditions)
+	chart_data = get_chart_data(data, conditions, filters)
 
-	return conditions["columns"], data 
\ No newline at end of file
+	return conditions["columns"], data, None, chart_data
+
+def get_chart_data(data, conditions, filters):
+	if not (data and conditions):
+		return []
+
+	datapoints = []
+
+	start = 2 if filters.get("based_on") in ["Item", "Supplier"] else 1
+	if filters.get("group_by"):
+		start += 1
+
+	# fetch only periodic columns as labels
+	columns = conditions.get("columns")[start:-2][1::2]
+	labels = [column.split(':')[0] for column in columns]
+	datapoints = [0] * len(labels)
+
+	for row in data:
+		# If group by filter, don't add first row of group (it's already summed)
+		if not row[start-1]:
+			continue
+		# Remove None values and compute only periodic data
+		row = [x if x else 0 for x in row[start:-2]]
+		row  = row[1::2]
+
+		for i in range(len(row)):
+			datapoints[i] += row[i]
+
+	return {
+		"data" : {
+			"labels" : labels,
+			"datasets" : [
+				{
+					"name" : _("{0}").format(filters.get("period")) + _(" Purchase Value"),
+					"values" : datapoints
+				}
+			]
+		},
+		"type" : "line",
+		"lineOptions": {
+			"regionFill": 1
+		}
+	}
\ No newline at end of file
diff --git a/erpnext/buying/report/requested_items_to_order/__init__.py b/erpnext/buying/report/requested_items_to_order/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/buying/report/requested_items_to_order/__init__.py
diff --git a/erpnext/buying/report/requested_items_to_order/requested_items_to_order.js b/erpnext/buying/report/requested_items_to_order/requested_items_to_order.js
new file mode 100644
index 0000000..21adb13
--- /dev/null
+++ b/erpnext/buying/report/requested_items_to_order/requested_items_to_order.js
@@ -0,0 +1,64 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+/* eslint-disable */
+
+frappe.query_reports["Requested Items to Order"] = {
+	"filters": [
+		{
+			"fieldname": "company",
+			"label": __("Company"),
+			"fieldtype": "Link",
+			"width": "80",
+			"options": "Company",
+			"reqd": 1,
+			"default": frappe.defaults.get_default("company")
+		},
+		{
+			"fieldname":"from_date",
+			"label": __("From Date"),
+			"fieldtype": "Date",
+			"width": "80",
+			"reqd": 1,
+			"default": frappe.datetime.add_months(frappe.datetime.get_today(), -1),
+		},
+		{
+			"fieldname":"to_date",
+			"label": __("To Date"),
+			"fieldtype": "Date",
+			"width": "80",
+			"reqd": 1,
+			"default": frappe.datetime.get_today()
+		},
+		{
+			"fieldname": "material_request",
+			"label": __("Material Request"),
+			"fieldtype": "Link",
+			"width": "80",
+			"options": "Material Request",
+			"get_query": () =>{
+				return {
+					filters: {
+						"docstatus": 1,
+						"material_request_type": "Purchase",
+						"per_received": ["<", 100]
+					}
+				}
+			}
+		},
+		{
+			"fieldname": "group_by_mr",
+			"label": __("Group by Material Request"),
+			"fieldtype": "Check",
+			"default": 0
+		}
+	],
+
+	"formatter": function (value, row, column, data, default_formatter) {
+		value = default_formatter(value, row, column, data);
+
+		if (column.fieldname == "ordered_qty" && data && data.ordered_qty > 0) {
+			value = "<span style='color:green'>" + value + "</span>";
+		}
+		return value;
+	}
+};
diff --git a/erpnext/buying/report/requested_items_to_order/requested_items_to_order.json b/erpnext/buying/report/requested_items_to_order/requested_items_to_order.json
new file mode 100644
index 0000000..4a0578b
--- /dev/null
+++ b/erpnext/buying/report/requested_items_to_order/requested_items_to_order.json
@@ -0,0 +1,34 @@
+{
+ "add_total_row": 1,
+ "creation": "2020-05-04 20:23:57.750719",
+ "disable_prepared_report": 0,
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 0,
+ "is_standard": "Yes",
+ "modified": "2020-05-05 13:05:51.723951",
+ "modified_by": "Administrator",
+ "module": "Buying",
+ "name": "Requested Items to Order",
+ "owner": "Administrator",
+ "prepared_report": 0,
+ "query": "",
+ "ref_doctype": "Material Request",
+ "report_name": "Requested Items to Order",
+ "report_type": "Script Report",
+ "roles": [
+  {
+   "role": "Purchase Manager"
+  },
+  {
+   "role": "Stock Manager"
+  },
+  {
+   "role": "Stock User"
+  },
+  {
+   "role": "Purchase User"
+  }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/buying/report/requested_items_to_order/requested_items_to_order.py b/erpnext/buying/report/requested_items_to_order/requested_items_to_order.py
new file mode 100644
index 0000000..a021d3c
--- /dev/null
+++ b/erpnext/buying/report/requested_items_to_order/requested_items_to_order.py
@@ -0,0 +1,211 @@
+# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+import copy
+from frappe import _
+from frappe.utils import flt, date_diff, getdate
+
+def execute(filters=None):
+	if not filters:
+		return [],[]
+
+	validate_filters(filters)
+
+	columns = get_columns(filters)
+	conditions = get_conditions(filters)
+
+	#get queried data
+	data = get_data(filters, conditions)
+
+	#prepare data for report and chart views
+	data, chart_data = prepare_data(data, filters)
+
+	return columns, data, None, chart_data
+
+def validate_filters(filters):
+	from_date, to_date = filters.get("from_date"), filters.get("to_date")
+
+	if not from_date and to_date:
+		frappe.throw(_("From and To Dates are required."))
+	elif date_diff(to_date, from_date) < 0:
+		frappe.throw(_("To Date cannot be before From Date."))
+
+def get_conditions(filters):
+	conditions = ''
+
+	if filters.get("from_date") and filters.get("to_date"):
+		conditions += " and mr.transaction_date between '{0}' and '{1}'".format(filters.get("from_date"),filters.get("to_date"))
+
+	if filters.get("company"):
+		conditions += " and mr.company = '{0}'".format(filters.get("company"))
+
+	if filters.get("material_request"):
+		conditions += " and mr.name = '{0}'".format(filters.get("material_request"))
+
+	return conditions
+
+def get_data(filters, conditions):
+	data = frappe.db.sql("""
+		select
+			mr.name as material_request,
+			mr.transaction_date as date,
+			mr_item.schedule_date as required_date,
+			mr_item.item_code as item_code,
+			sum(ifnull(mr_item.stock_qty, 0)) as qty,
+			ifnull(mr_item.stock_uom, '') as uom,
+			sum(ifnull(mr_item.ordered_qty, 0)) as ordered_qty,
+			(sum(mr_item.stock_qty) - sum(ifnull(mr_item.ordered_qty, 0))) as qty_to_order,
+			mr_item.item_name as item_name,
+			mr.company as company
+		from
+			`tabMaterial Request` mr, `tabMaterial Request Item` mr_item
+		where
+			mr_item.parent = mr.name
+			and mr.material_request_type = "Purchase"
+			and mr.docstatus = 1
+			and mr.status != "Stopped"
+			{conditions}
+		group by mr.name, mr_item.item_code
+		having
+			sum(ifnull(mr_item.ordered_qty, 0)) < sum(ifnull(mr_item.stock_qty, 0))
+		order by mr.transaction_date, mr.schedule_date""".format(conditions=conditions), as_dict=1)
+
+	return data
+
+def prepare_data(data, filters):
+	"""Prepare consolidated Report data and Chart data"""
+	material_request_map = {}
+
+	for row in data:
+		if not row["material_request"] in material_request_map:
+			# create an entry with mr as key
+			row_copy = copy.deepcopy(row)
+			material_request_map[row["material_request"]] = row_copy
+		else:
+			mr_row = material_request_map[row["material_request"]]
+			mr_row["required_date"] = min(getdate(mr_row["required_date"]), getdate(row["required_date"]))
+
+			#sum numeric rows
+			fields = ["qty", "ordered_qty", "qty_to_order"]
+			for field in fields:
+					mr_row[field] = flt(mr_row[field]) + flt(row[field])
+
+	chart_data = prepare_chart_data(material_request_map)
+
+	if filters.get("group_by_mr"):
+		data =[]
+		for mr in material_request_map:
+			data.append(material_request_map[mr])
+		return data, chart_data
+
+	return data, chart_data
+
+def prepare_chart_data(data):
+	labels, qty_to_order, ordered_qty = [], [], []
+
+	for row in data:
+		mr_row = data[row]
+		labels.append(mr_row["material_request"])
+		qty_to_order.append(mr_row["qty_to_order"])
+		ordered_qty.append(mr_row["ordered_qty"])
+
+	chart_data = {
+		"data" : {
+			"labels": labels,
+			"datasets": [
+				{
+					'name': _('Qty to Order'),
+					'values': qty_to_order
+				},
+				{
+					'name': _('Ordered Qty'),
+					'values': ordered_qty
+				}
+			]
+		},
+		"type": "bar",
+		"barOptions": {
+			"stacked": 1
+		},
+	}
+
+	return chart_data
+
+def get_columns(filters):
+	columns = [
+		{
+			"label": _("Material Request"),
+			"fieldname": "material_request",
+			"fieldtype": "Link",
+			"options": "Material Request",
+			"width": 150
+		},
+		{
+			"label":_("Date"),
+			"fieldname": "date",
+			"fieldtype": "Date",
+			"width": 90
+		},
+		{
+			"label":_("Required By"),
+			"fieldname": "required_date",
+			"fieldtype": "Date",
+			"width": 100
+		}
+	]
+
+	if not filters.get("group_by_mr"):
+		columns.extend([{
+			"label":_("Item Code"),
+			"fieldname": "item_code",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 100
+		},
+		{
+			"label":_("Item Name"),
+			"fieldname": "item_name",
+			"fieldtype": "Data",
+			"width": 100
+		},
+		{
+			"label": _("UOM"),
+			"fieldname": "uom",
+			"fieldtype": "Data",
+			"width": 100,
+		}])
+
+	columns.extend([
+		{
+			"label": _("Qty"),
+			"fieldname": "qty",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Ordered Qty"),
+			"fieldname": "ordered_qty",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Qty to Order"),
+			"fieldname": "qty_to_order",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Company"),
+			"fieldname": "company",
+			"fieldtype": "Link",
+			"options": "Company",
+			"width": 100
+		}
+	])
+
+	return columns
diff --git a/erpnext/config/buying.py b/erpnext/config/buying.py
index 1d40547..16b49a1 100644
--- a/erpnext/config/buying.py
+++ b/erpnext/config/buying.py
@@ -166,7 +166,7 @@
 				{
 					"type": "report",
 					"is_query_report": True,
-					"name": "Requested Items To Be Ordered",
+					"name": "Requested Items To Order",
 					"reference_doctype": "Material Request",
 					"onboard": 1,
 				},
diff --git a/erpnext/healthcare/doctype/lab_test_template/lab_test_template.py b/erpnext/healthcare/doctype/lab_test_template/lab_test_template.py
index e2b47b4..3521561 100644
--- a/erpnext/healthcare/doctype/lab_test_template/lab_test_template.py
+++ b/erpnext/healthcare/doctype/lab_test_template/lab_test_template.py
@@ -115,7 +115,7 @@
 		"price_list": price_list_name,
 		"item_code": item,
 		"price_list_rate": item_price
-	}).insert(ignore_permissions=True)
+	}).insert(ignore_permissions=True, ignore_mandatory=True)
 
 @frappe.whitelist()
 def change_test_code_from_template(lab_test_code, doc):
diff --git a/erpnext/manufacturing/dashboard_fixtures.py b/erpnext/manufacturing/dashboard_fixtures.py
index 587a032..ef61f23 100644
--- a/erpnext/manufacturing/dashboard_fixtures.py
+++ b/erpnext/manufacturing/dashboard_fixtures.py
@@ -15,8 +15,8 @@
 
 def get_dashboards():
 	return [{
-		"name": "Manufacturing Dashboard",
-		"dashboard_name": "Manufacturing Dashboard",
+		"name": "Manufacturing",
+		"dashboard_name": "Manufacturing",
 		"charts": [
 			{ "chart": "Produced Quantity", "width": "Half" },
 			{ "chart": "Completed Operation", "width": "Half" },
diff --git a/erpnext/manufacturing/desk_page/manufacturing/manufacturing.json b/erpnext/manufacturing/desk_page/manufacturing/manufacturing.json
index e35f1fb..ecd2dc9 100644
--- a/erpnext/manufacturing/desk_page/manufacturing/manufacturing.json
+++ b/erpnext/manufacturing/desk_page/manufacturing/manufacturing.json
@@ -13,7 +13,7 @@
   {
    "hidden": 0,
    "label": "Reports",
-   "links": "[{\n\t\"dependencies\": [\"Work Order\"],\n\t\"name\": \"Work Order Summary\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Work Order\",\n\t\"label\": \"Work Order Summary\"\n}, {\n\t\"dependencies\": [\"Work Order\"],\n\t\"name\": \"Production Analytics\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Work Order\",\n\t\"label\": \"Production Analytics\"\n}, {\n\t\"dependencies\": [\"Quality Inspection\"],\n\t\"name\": \"Quality Inspection Summary\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Quality Inspection\",\n\t\"label\": \"Quality Inspection Summary\"\n}, {\n\t\"dependencies\": [\"Downtime Entry\"],\n\t\"name\": \"Downtime Analysis\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Downtime Entry\",\n\t\"label\": \"Downtime Analysis\"\n}, {\n\t\"dependencies\": [\"Job Card\"],\n\t\"name\": \"Job Card Summary\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Job Card\",\n\t\"label\": \"Job Card Summary\"\n}, {\n\t\"dependencies\": [\"BOM\"],\n\t\"name\": \"BOM Search\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"BOM\",\n\t\"label\": \"BOM Search\"\n}, {\n\t\"dependencies\": [\"BOM\"],\n\t\"name\": \"BOM Stock Report\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"BOM\",\n\t\"label\": \"BOM Stock Report\"\n}]"
+   "links": "[{\n\t\"dependencies\": [\"Work Order\"],\n\t\"name\": \"Production Planning Report\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Work Order\",\n\t\"label\": \"Production Planning Report\"\n}, {\n\t\"dependencies\": [\"Work Order\"],\n\t\"name\": \"Work Order Summary\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Work Order\",\n\t\"label\": \"Work Order Summary\"\n}, {\n\t\"dependencies\": [\"Quality Inspection\"],\n\t\"name\": \"Quality Inspection Summary\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Quality Inspection\",\n\t\"label\": \"Quality Inspection Summary\"\n}, {\n\t\"dependencies\": [\"Downtime Entry\"],\n\t\"name\": \"Downtime Analysis\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Downtime Entry\",\n\t\"label\": \"Downtime Analysis\"\n}, {\n\t\"dependencies\": [\"Job Card\"],\n\t\"name\": \"Job Card Summary\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Job Card\",\n\t\"label\": \"Job Card Summary\"\n}, {\n\t\"dependencies\": [\"BOM\"],\n\t\"name\": \"BOM Search\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"BOM\",\n\t\"label\": \"BOM Search\"\n}, {\n\t\"dependencies\": [\"BOM\"],\n\t\"name\": \"BOM Stock Report\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"BOM\",\n\t\"label\": \"BOM Stock Report\"\n}, {\n\t\"dependencies\": [\"Work Order\"],\n\t\"name\": \"Production Analytics\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"Work Order\",\n\t\"label\": \"Production Analytics\"\n}, {\n\t\"dependencies\": [\"BOM\"],\n\t\"name\": \"BOM Operations Time\",\n\t\"is_query_report\": true,\n\t\"type\": \"report\",\n\t\"doctype\": \"BOM\",\n\t\"label\": \"BOM Operations Time\"\n}]"
   },
   {
    "hidden": 0,
@@ -46,7 +46,7 @@
  "idx": 0,
  "is_standard": 1,
  "label": "Manufacturing",
- "modified": "2020-05-19 12:54:04.104444",
+ "modified": "2020-05-19 14:05:59.100891",
  "modified_by": "Administrator",
  "module": "Manufacturing",
  "name": "Manufacturing",
@@ -95,8 +95,8 @@
    "type": "Report"
   },
   {
-   "label": "Manufacturing Dashboard",
-   "link_to": "Manufacturing Dashboard",
+   "label": "Dashboard",
+   "link_to": "Manufacturing",
    "restrict_to_domain": "Manufacturing",
    "type": "Dashboard"
   }
diff --git a/erpnext/manufacturing/report/bom_operations_time/__init__.py b/erpnext/manufacturing/report/bom_operations_time/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/manufacturing/report/bom_operations_time/__init__.py
diff --git a/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.js b/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.js
new file mode 100644
index 0000000..7468e34
--- /dev/null
+++ b/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.js
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+/* eslint-disable */
+
+frappe.query_reports["BOM Operations Time"] = {
+	"filters": [
+
+	]
+};
diff --git a/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.json b/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.json
new file mode 100644
index 0000000..665c5b9
--- /dev/null
+++ b/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.json
@@ -0,0 +1,28 @@
+{
+ "add_total_row": 0,
+ "creation": "2020-03-03 01:41:20.862521",
+ "disable_prepared_report": 0,
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 0,
+ "is_standard": "Yes",
+ "letter_head": "",
+ "modified": "2020-03-03 01:41:20.862521",
+ "modified_by": "Administrator",
+ "module": "Manufacturing",
+ "name": "BOM Operations Time",
+ "owner": "Administrator",
+ "prepared_report": 0,
+ "ref_doctype": "BOM",
+ "report_name": "BOM Operations Time",
+ "report_type": "Script Report",
+ "roles": [
+  {
+   "role": "Manufacturing Manager"
+  },
+  {
+   "role": "Manufacturing User"
+  }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py b/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py
new file mode 100644
index 0000000..1279011
--- /dev/null
+++ b/erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py
@@ -0,0 +1,112 @@
+# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+
+def execute(filters=None):
+	data = get_data(filters)
+	columns = get_columns(filters)
+	return columns, data
+
+def get_data(filters):
+	data = []
+
+	bom_data = []
+	for d in frappe.db.sql("""
+		SELECT
+			bom.name, bom.item, bom.item_name, bom.uom,
+			bomps.operation, bomps.workstation, bomps.time_in_mins
+		FROM `tabBOM` bom, `tabBOM Operation` bomps
+		WHERE
+			bom.docstatus = 1 and bom.is_active = 1 and bom.name = bomps.parent
+		""", as_dict=1):
+		row = get_args()
+		if d.name not in bom_data:
+			bom_data.append(d.name)
+			row.update(d)
+		else:
+			row.update({
+				"operation": d.operation,
+				"workstation": d.workstation,
+				"time_in_mins": d.time_in_mins
+			})
+
+		data.append(row)
+
+	used_as_subassembly_items = get_bom_count(bom_data)
+
+	for d in data:
+		d.used_as_subassembly_items = used_as_subassembly_items.get(d.name, 0)
+
+	return data
+
+def get_bom_count(bom_data):
+	data = frappe.get_all("BOM Item",
+		fields=["count(name) as count", "bom_no"],
+		filters= {"bom_no": ("in", bom_data)}, group_by = "bom_no")
+
+	bom_count = {}
+	for d in data:
+		bom_count.setdefault(d.bom_no, d.count)
+
+	return bom_count
+
+def get_args():
+	return frappe._dict({
+		"name": "",
+		"item": "",
+		"item_name": "",
+		"uom": ""
+	})
+
+def get_columns(filters):
+	return [{
+		"label": _("BOM ID"),
+		"options": "BOM",
+		"fieldname": "name",
+		"fieldtype": "Link",
+		"width": 140
+	}, {
+		"label": _("BOM Item Code"),
+		"options": "Item",
+		"fieldname": "item",
+		"fieldtype": "Link",
+		"width": 140
+	}, {
+		"label": _("Item Name"),
+		"fieldname": "item_name",
+		"fieldtype": "Data",
+		"width": 110
+	}, {
+		"label": _("UOM"),
+		"options": "UOM",
+		"fieldname": "uom",
+		"fieldtype": "Link",
+		"width": 140
+	}, {
+		"label": _("Operation"),
+		"options": "Operation",
+		"fieldname": "operation",
+		"fieldtype": "Link",
+		"width": 120
+	}, {
+		"label": _("Workstation"),
+		"options": "Workstation",
+		"fieldname": "workstation",
+		"fieldtype": "Link",
+		"width": 110
+	}, {
+		"label": _("Time (In Mins)"),
+		"fieldname": "time_in_mins",
+		"fieldtype": "Int",
+		"width": 140
+	}, {
+		"label": _("Subassembly BOM Count"),
+		"fieldname": "used_as_subassembly_items",
+		"fieldtype": "Int",
+		"width": 180
+	}]
+
+
diff --git a/erpnext/manufacturing/report/production_planning_report/__init__.py b/erpnext/manufacturing/report/production_planning_report/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/manufacturing/report/production_planning_report/__init__.py
diff --git a/erpnext/manufacturing/report/production_planning_report/production_planning_report.js b/erpnext/manufacturing/report/production_planning_report/production_planning_report.js
new file mode 100644
index 0000000..675b8a1
--- /dev/null
+++ b/erpnext/manufacturing/report/production_planning_report/production_planning_report.js
@@ -0,0 +1,111 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+/* eslint-disable */
+
+frappe.query_reports["Production Planning Report"] = {
+	"filters": [
+		{
+			"fieldname":"company",
+			"label": __("Company"),
+			"fieldtype": "Link",
+			"options": "Company",
+			"reqd": 1,
+			"default": frappe.defaults.get_user_default("Company")
+		},
+		{
+			"fieldname":"based_on",
+			"label": __("Based On"),
+			"fieldtype": "Select",
+			"options": ["Sales Order", "Material Request", "Work Order"],
+			"default": "Sales Order",
+			"reqd": 1,
+			on_change: function() {
+				let filters = frappe.query_report.filters;
+				let based_on = frappe.query_report.get_filter_value('based_on');
+				let options = {
+					"Sales Order": ["Delivery Date", "Total Amount"],
+					"Material Request": ["Required Date"],
+					"Work Order": ["Planned Start Date"]
+				}
+
+				filters.forEach(d => {
+					if (d.fieldname == "order_by") {
+						d.df.options = options[based_on];
+						d.set_input(d.df.options)
+					}
+				});
+
+				frappe.query_report.refresh();
+			}
+		},
+		{
+			"fieldname":"docnames",
+			"label": __("Document Name"),
+			"fieldtype": "MultiSelectList",
+			"options": "Sales Order",
+			"get_data": function(txt) {
+				if (!frappe.query_report.filters) return;
+
+				let based_on = frappe.query_report.get_filter_value('based_on');
+				if (!based_on) return;
+
+				return frappe.db.get_link_options(based_on, txt);
+			},
+			"get_query": function() {
+				var company = frappe.query_report.get_filter_value('company');
+				return {
+					filters: {
+						"docstatus": 1,
+						"company": company
+					}
+				};
+			}
+		},
+		{
+			"fieldname":"raw_material_warehouse",
+			"label": __("Raw Material Warehouse"),
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"depends_on": "eval: doc.based_on != 'Work Order'",
+			"get_query": function() {
+				var company = frappe.query_report.get_filter_value('company');
+				return {
+					filters: {
+						"company": company
+					}
+				};
+			}
+		},
+		{
+			"fieldname":"order_by",
+			"label": __("Order By"),
+			"fieldtype": "Select",
+			"options": ["Delivery Date", "Total Amount"],
+			"default": "Delivery Date"
+		},
+		{
+			"fieldname":"include_subassembly_raw_materials",
+			"label": __("Include Sub-assembly Raw Materials"),
+			"fieldtype": "Check",
+			"depends_on": "eval: doc.based_on != 'Work Order'",
+			"default": 0
+		},
+	],
+	"formatter": function(value, row, column, data, default_formatter) {
+		value = default_formatter(value, row, column, data);
+
+		if (column.fieldname == "production_item_name" && data && data.qty_to_manufacture > data.available_qty ) {
+			value = `<div style="color:red">${value}</div>`;
+		}
+
+		if (column.fieldname == "production_item" && !data.name ) {
+			value = "";
+		}
+
+		if (column.fieldname == "raw_material_name" && data && data.required_qty > data.allotted_qty ) {
+			value = `<div style="color:red">${value}</div>`;
+		}
+
+		return value;
+	},
+};
diff --git a/erpnext/manufacturing/report/production_planning_report/production_planning_report.json b/erpnext/manufacturing/report/production_planning_report/production_planning_report.json
new file mode 100644
index 0000000..f37dad3
--- /dev/null
+++ b/erpnext/manufacturing/report/production_planning_report/production_planning_report.json
@@ -0,0 +1,31 @@
+{
+ "add_total_row": 0,
+ "creation": "2020-03-06 11:37:43.180095",
+ "disable_prepared_report": 0,
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 0,
+ "is_standard": "Yes",
+ "letter_head": "",
+ "modified": "2020-03-06 11:38:05.789851",
+ "modified_by": "Administrator",
+ "module": "Manufacturing",
+ "name": "Production Planning Report",
+ "owner": "Administrator",
+ "prepared_report": 0,
+ "ref_doctype": "Work Order",
+ "report_name": "Production Planning Report",
+ "report_type": "Script Report",
+ "roles": [
+  {
+   "role": "Manufacturing User"
+  },
+  {
+   "role": "Stock User"
+  },
+  {
+   "role": "Manufacturing Manager"
+  }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/manufacturing/report/production_planning_report/production_planning_report.py b/erpnext/manufacturing/report/production_planning_report/production_planning_report.py
new file mode 100644
index 0000000..b5e6c6f
--- /dev/null
+++ b/erpnext/manufacturing/report/production_planning_report/production_planning_report.py
@@ -0,0 +1,371 @@
+# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+from erpnext.stock.doctype.warehouse.warehouse import get_child_warehouses
+
+# and bom_no is not null and bom_no !=''
+
+mapper = {
+	"Sales Order": {
+		"fields": """ item_code as production_item, item_name as production_item_name, stock_uom,
+			stock_qty as qty_to_manufacture, `tabSales Order Item`.parent as name, bom_no, warehouse,
+			`tabSales Order Item`.delivery_date, `tabSales Order`.base_grand_total """,
+		"filters": """`tabSales Order Item`.docstatus = 1 and stock_qty > produced_qty
+			and `tabSales Order`.per_delivered < 100.0"""
+	},
+	"Material Request": {
+		"fields": """ item_code as production_item, item_name as production_item_name, stock_uom,
+			stock_qty as qty_to_manufacture, `tabMaterial Request Item`.parent as name, bom_no, warehouse,
+			`tabMaterial Request Item`.schedule_date """,
+		"filters": """`tabMaterial Request`.docstatus = 1 and `tabMaterial Request`.per_ordered < 100
+			and `tabMaterial Request`.material_request_type = 'Manufacture' """
+	},
+	"Work Order": {
+		"fields": """ production_item, item_name as production_item_name, planned_start_date,
+			stock_uom, qty as qty_to_manufacture, name, bom_no, fg_warehouse as warehouse """,
+		"filters": "docstatus = 1 and status not in ('Completed', 'Stopped')"
+	},
+}
+
+order_mapper = {
+	"Sales Order": {
+		"Delivery Date": "`tabSales Order Item`.delivery_date asc",
+		"Total Amount": "`tabSales Order`.base_grand_total desc"
+	},
+	"Material Request": {
+		"Required Date": "`tabMaterial Request Item`.schedule_date asc"
+	},
+	"Work Order": {
+		"Planned Start Date": "planned_start_date asc"
+	}
+}
+
+def execute(filters=None):
+	return ProductionPlanReport(filters).execute_report()
+
+class ProductionPlanReport(object):
+	def __init__(self, filters=None):
+		self.filters = frappe._dict(filters or {})
+		self.raw_materials_dict = {}
+		self.data = []
+
+	def execute_report(self):
+		self.get_open_orders()
+		self.get_raw_materials()
+		self.get_item_details()
+		self.get_bin_details()
+		self.get_purchase_details()
+		self.prepare_data()
+		self.get_columns()
+
+		return self.columns, self.data
+
+	def get_open_orders(self):
+		doctype = ("`tabWork Order`" if self.filters.based_on == "Work Order"
+			else "`tab{doc}`, `tab{doc} Item`".format(doc=self.filters.based_on))
+
+		filters = mapper.get(self.filters.based_on)["filters"]
+		filters = self.prepare_other_conditions(filters, self.filters.based_on)
+		order_by = " ORDER BY %s" % (order_mapper[self.filters.based_on][self.filters.order_by])
+
+		self.orders = frappe.db.sql(""" SELECT {fields} from {doctype}
+			WHERE {filters} {order_by}""".format(
+				doctype = doctype,
+				filters = filters,
+				order_by = order_by,
+				fields = mapper.get(self.filters.based_on)["fields"]
+			), tuple(self.filters.docnames), as_dict=1)
+
+	def prepare_other_conditions(self, filters, doctype):
+		if self.filters.docnames:
+			field = "name" if doctype == "Work Order" else "`tab{} Item`.parent".format(doctype)
+			filters += " and %s in (%s)" % (field, ','.join(['%s'] * len(self.filters.docnames)))
+
+		if doctype != "Work Order":
+			filters += " and `tab{doc}`.name = `tab{doc} Item`.parent".format(doc=doctype)
+
+		if self.filters.company:
+			filters += " and `tab%s`.company = %s" %(doctype, frappe.db.escape(self.filters.company))
+
+		return filters
+
+	def get_raw_materials(self):
+		if not self.orders: return
+		self.warehouses = [d.warehouse for d in self.orders]
+		self.item_codes = [d.production_item for d in self.orders]
+
+		if self.filters.based_on == "Work Order":
+			work_orders = [d.name for d in self.orders]
+
+			raw_materials = frappe.get_all("Work Order Item",
+				fields=["parent", "item_code", "item_name as raw_material_name",
+					"source_warehouse as warehouse", "required_qty"],
+				filters = {"docstatus": 1, "parent": ("in", work_orders), "source_warehouse": ("!=", "")}) or []
+			self.warehouses.extend([d.source_warehouse for d in raw_materials])
+
+		else:
+			bom_nos = []
+
+			for d in self.orders:
+				bom_no = d.bom_no or frappe.get_cached_value("Item", d.production_item, "default_bom")
+
+				if not d.bom_no:
+					d.bom_no = bom_no
+
+				bom_nos.append(bom_no)
+
+			bom_doctype = ("BOM Explosion Item"
+				if self.filters.include_subassembly_raw_materials else "BOM Item")
+
+			qty_field = ("qty_consumed_per_unit"
+				if self.filters.include_subassembly_raw_materials else "(bom_item.qty / bom.quantity)")
+
+			raw_materials = frappe.db.sql(""" SELECT bom_item.parent, bom_item.item_code,
+					bom_item.item_name as raw_material_name, {0} as required_qty
+				FROM
+					`tabBOM` as bom, `tab{1}` as bom_item
+				WHERE
+					bom_item.parent in ({2}) and bom_item.parent = bom.name and bom.docstatus = 1
+			""".format(qty_field, bom_doctype, ','.join(["%s"] * len(bom_nos))), tuple(bom_nos), as_dict=1)
+
+		if not raw_materials: return
+
+		self.item_codes.extend([d.item_code for d in raw_materials])
+
+		for d in raw_materials:
+			if d.parent not in self.raw_materials_dict:
+				self.raw_materials_dict.setdefault(d.parent, [])
+
+			rows = self.raw_materials_dict[d.parent]
+			rows.append(d)
+
+	def get_item_details(self):
+		if not (self.orders and self.item_codes): return
+
+		self.item_details = {}
+		for d in frappe.get_all("Item Default", fields = ["parent", "default_warehouse"],
+			filters = {"company": self.filters.company, "parent": ("in", self.item_codes)}):
+			self.item_details[d.parent] = d
+
+	def get_bin_details(self):
+		if not (self.orders and self.raw_materials_dict): return
+
+		self.bin_details = {}
+		self.mrp_warehouses = []
+		if self.filters.raw_material_warehouse:
+			self.mrp_warehouses.extend(get_child_warehouses(self.filters.raw_material_warehouse))
+			self.warehouses.extend(self.mrp_warehouses)
+
+		for d in frappe.get_all("Bin",
+			fields=["warehouse", "item_code", "actual_qty", "ordered_qty", "projected_qty"],
+			filters = {"item_code": ("in", self.item_codes), "warehouse": ("in", self.warehouses)}):
+			key = (d.item_code, d.warehouse)
+			if key not in self.bin_details:
+				self.bin_details.setdefault(key, d)
+
+	def get_purchase_details(self):
+		if not (self.orders and self.raw_materials_dict): return
+
+		self.purchase_details = {}
+
+		for d in frappe.get_all("Purchase Order Item",
+			fields=["item_code", "min(schedule_date) as arrival_date", "qty as arrival_qty", "warehouse"],
+			filters = {"item_code": ("in", self.item_codes), "warehouse": ("in", self.warehouses)},
+			group_by = "item_code, warehouse"):
+			key = (d.item_code, d.warehouse)
+			if key not in self.purchase_details:
+				self.purchase_details.setdefault(key, d)
+
+	def prepare_data(self):
+		if not self.orders: return
+
+		for d in self.orders:
+			key = d.name if self.filters.based_on == "Work Order" else d.bom_no
+
+			if not self.raw_materials_dict.get(key): continue
+
+			bin_data = self.bin_details.get((d.production_item, d.warehouse)) or {}
+			d.update({
+				"for_warehouse": d.warehouse,
+				"available_qty": 0
+			})
+
+			if bin_data and bin_data.get("actual_qty") > 0 and d.qty_to_manufacture:
+				d.available_qty = (bin_data.get("actual_qty")
+					if (d.qty_to_manufacture > bin_data.get("actual_qty")) else d.qty_to_manufacture)
+
+				bin_data["actual_qty"] -= d.available_qty
+
+			self.update_raw_materials(d, key)
+
+	def update_raw_materials(self, data, key):
+		self.index = 0
+		self.raw_materials_dict.get(key)
+
+		warehouses = self.mrp_warehouses or []
+		for d in self.raw_materials_dict.get(key):
+			if self.filters.based_on != "Work Order":
+				d.required_qty = d.required_qty * data.qty_to_manufacture
+
+			if not warehouses:
+				warehouses = [data.warehouse]
+
+			if self.filters.based_on == "Work Order" and d.warehouse:
+				warehouses = [d.warehouse]
+			else:
+				item_details = self.item_details.get(d.item_code)
+				if item_details:
+					warehouses = [item_details["default_warehouse"]]
+
+			d.remaining_qty = d.required_qty
+			self.pick_materials_from_warehouses(d, data, warehouses)
+
+			if (d.remaining_qty and self.filters.raw_material_warehouse
+				and d.remaining_qty != d.required_qty):
+				row = self.get_args()
+				d.warehouse = self.filters.raw_material_warehouse
+				d.required_qty = d.remaining_qty
+				d.allotted_qty = 0
+				row.update(d)
+				self.data.append(row)
+
+	def pick_materials_from_warehouses(self, args, order_data, warehouses):
+		for index, warehouse in enumerate(warehouses):
+			if not args.remaining_qty: return
+
+			row = self.get_args()
+
+			key = (args.item_code, warehouse)
+			bin_data = self.bin_details.get(key)
+
+			if bin_data:
+				row.update(bin_data)
+
+			args.allotted_qty = 0
+			if bin_data and bin_data.get("actual_qty") > 0:
+				args.allotted_qty = (bin_data.get("actual_qty")
+					if (args.required_qty > bin_data.get("actual_qty")) else args.required_qty)
+
+				args.remaining_qty -= args.allotted_qty
+				bin_data["actual_qty"] -= args.allotted_qty
+
+			if ((self.mrp_warehouses and (args.allotted_qty or index == len(warehouses) - 1))
+				or not self.mrp_warehouses):
+				if not self.index:
+					row.update(order_data)
+					self.index += 1
+
+				args.warehouse = warehouse
+				row.update(args)
+				if self.purchase_details.get(key):
+					row.update(self.purchase_details.get(key))
+
+				self.data.append(row)
+
+	def get_args(self):
+		return frappe._dict({
+			"work_order": "",
+			"sales_order": "",
+			"production_item": "",
+			"production_item_name": "",
+			"qty_to_manufacture": "",
+			"produced_qty": ""
+		})
+
+	def get_columns(self):
+		based_on = self.filters.based_on
+
+		self.columns = [{
+			"label": _("ID"),
+			"options": based_on,
+			"fieldname": "name",
+			"fieldtype": "Link",
+			"width": 100
+		}, {
+			"label": _("Item Code"),
+			"fieldname": "production_item",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 120
+		}, {
+			"label": _("Item Name"),
+			"fieldname": "production_item_name",
+			"fieldtype": "Data",
+			"width": 130
+		}, {
+			"label": _("Warehouse"),
+			"options": "Warehouse",
+			"fieldname": "for_warehouse",
+			"fieldtype": "Link",
+			"width": 100
+		}, {
+			"label": _("Order Qty"),
+			"fieldname": "qty_to_manufacture",
+			"fieldtype": "Float",
+			"width": 80
+		}, {
+			"label": _("Available"),
+			"fieldname": "available_qty",
+			"fieldtype": "Float",
+			"width": 80
+		}]
+
+		fieldname, fieldtype = "delivery_date", "Date"
+		if self.filters.based_on == "Sales Order" and self.filters.order_by == "Total Amount":
+			fieldname, fieldtype = "base_grand_total", "Currency"
+		elif self.filters.based_on == "Material Request":
+			fieldname = "schedule_date"
+		elif self.filters.based_on == "Work Order":
+			fieldname = "planned_start_date"
+
+		self.columns.append({
+			"label": _(self.filters.order_by),
+			"fieldname": fieldname,
+			"fieldtype": fieldtype,
+			"width": 100
+		})
+
+		self.columns.extend([{
+			"label": _("Raw Material Code"),
+			"fieldname": "item_code",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 120
+		}, {
+			"label": _("Raw Material Name"),
+			"fieldname": "raw_material_name",
+			"fieldtype": "Data",
+			"width": 130
+		}, {
+			"label": _("Warehouse"),
+			"options": "Warehouse",
+			"fieldname": "warehouse",
+			"fieldtype": "Link",
+			"width": 110
+		}, {
+			"label": _("Required Qty"),
+			"fieldname": "required_qty",
+			"fieldtype": "Float",
+			"width": 100
+		}, {
+			"label": _("Allotted Qty"),
+			"fieldname": "allotted_qty",
+			"fieldtype": "Float",
+			"width": 100
+		}, {
+			"label": _("Expected Arrival Date"),
+			"fieldname": "arrival_date",
+			"fieldtype": "Date",
+			"width": 160
+		}, {
+			"label": _("Arrival Quantity"),
+			"fieldname": "arrival_qty",
+			"fieldtype": "Float",
+			"width": 140
+		}])
+
+def document_query(doctype, txt, searchfield, start, page_len, filters):
+	pass
\ No newline at end of file
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index dc88ffb..bb9bb97 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -688,3 +688,5 @@
 erpnext.patches.v12_0.update_price_list_currency_in_bom
 execute:frappe.delete_doc_if_exists('Dashboard', 'Accounts')
 erpnext.patches.v13_0.update_actual_start_and_end_date_in_wo
+erpnext.patches.v13_0.set_company_field_in_healthcare_doctypes
+erpnext.patches.v12_0.update_bom_in_so_mr
diff --git a/erpnext/patches/v12_0/update_bom_in_so_mr.py b/erpnext/patches/v12_0/update_bom_in_so_mr.py
new file mode 100644
index 0000000..309ae4c
--- /dev/null
+++ b/erpnext/patches/v12_0/update_bom_in_so_mr.py
@@ -0,0 +1,19 @@
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+	frappe.reload_doc("stock", "doctype", "material_request_item")
+	frappe.reload_doc("selling", "doctype", "sales_order_item")
+
+	for doctype in ["Sales Order", "Material Request"]:
+		condition = " and child_doc.stock_qty > child_doc.produced_qty"
+		if doctype == "Material Request":
+			condition = " and doc.per_ordered < 100 and doc.material_request_type = 'Manufacture'"
+
+		frappe.db.sql(""" UPDATE `tab{doc}` as doc, `tab{doc} Item` as child_doc, tabItem as item
+			SET
+				child_doc.bom_no = item.default_bom
+			WHERE
+				child_doc.item_code = item.name and child_doc.docstatus < 2
+				and item.default_bom is not null and item.default_bom != '' {cond}
+		""".format(doc = doctype, cond = condition))
\ No newline at end of file
diff --git a/erpnext/patches/v13_0/set_company_field_in_healthcare_doctypes.py b/erpnext/patches/v13_0/set_company_field_in_healthcare_doctypes.py
new file mode 100644
index 0000000..2c646b1
--- /dev/null
+++ b/erpnext/patches/v13_0/set_company_field_in_healthcare_doctypes.py
@@ -0,0 +1,9 @@
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+	company = frappe.db.get_single_value('Global Defaults', 'default_company')
+	doctypes = ['Clinical Procedure', 'Inpatient Record', 'Lab Test', 'Patient Appointment', 'Patient Encounter', 'Vital Signs']
+	for entry in doctypes:
+		if frappe.db.exists('DocType', entry):
+			frappe.db.sql("update `tab{dt}` set company = '{company}' where ifnull(company, '') = ''".format(dt=entry, company=company))
diff --git a/erpnext/public/js/purchase_trends_filters.js b/erpnext/public/js/purchase_trends_filters.js
index cd767f5..c786a86 100644
--- a/erpnext/public/js/purchase_trends_filters.js
+++ b/erpnext/public/js/purchase_trends_filters.js
@@ -51,7 +51,10 @@
 				{ "value": "Supplier Group", "label": __("Supplier Group") },
 				{ "value": "Project", "label": __("Project") }
 			],
-			"default": "Item"
+			"default": "Item",
+			"dashboard_config": {
+				"read_only": 1
+			}
 		},
 		{
 			"fieldname":"group_by",
diff --git a/erpnext/public/js/sales_trends_filters.js b/erpnext/public/js/sales_trends_filters.js
index b272fdd..b9c4dca 100644
--- a/erpnext/public/js/sales_trends_filters.js
+++ b/erpnext/public/js/sales_trends_filters.js
@@ -27,7 +27,10 @@
 				{ "value": "Territory", "label": __("Territory") },
 				{ "value": "Project", "label": __("Project") }
 			],
-			"default": "Item"
+			"default": "Item",
+			"dashboard_config": {
+				"read_only": 1,
+			}
 		},
 		{
 			"fieldname":"group_by",
diff --git a/erpnext/regional/report/gstr_1/gstr_1.py b/erpnext/regional/report/gstr_1/gstr_1.py
index fd1cc58..43b1ea8 100644
--- a/erpnext/regional/report/gstr_1/gstr_1.py
+++ b/erpnext/regional/report/gstr_1/gstr_1.py
@@ -117,12 +117,18 @@
 			else:
 				row.append(invoice_details.get(fieldname))
 		taxable_value = 0
+
+		if invoice in self.cgst_igst_invoices:
+			division_factor = 2
+		else:
+			division_factor = 1
+
 		for item_code, net_amount in self.invoice_items.get(invoice).items():
-				if item_code in items:
-					if self.item_tax_rate.get(invoice) and tax_rate in self.item_tax_rate.get(invoice, {}).get(item_code, []):
-						taxable_value += abs(net_amount)
-					elif not self.item_tax_rate.get(invoice):
-						taxable_value += abs(net_amount)
+			if item_code in items:
+				if self.item_tax_rate.get(invoice) and tax_rate/division_factor in self.item_tax_rate.get(invoice, {}).get(item_code, []):
+					taxable_value += abs(net_amount)
+				elif not self.item_tax_rate.get(invoice):
+					taxable_value += abs(net_amount)
 
 		row += [tax_rate or 0, taxable_value]
 
@@ -196,7 +202,7 @@
 			if d.item_code not in self.invoice_items.get(d.parent, {}):
 				self.invoice_items.setdefault(d.parent, {}).setdefault(d.item_code,
 					sum(i.get('base_net_amount', 0) for i in items
-					    if i.item_code == d.item_code and i.parent == d.parent))
+						if i.item_code == d.item_code and i.parent == d.parent))
 
 				item_tax_rate = {}
 
@@ -221,6 +227,8 @@
 
 		self.items_based_on_tax_rate = {}
 		self.invoice_cess = frappe._dict()
+		self.cgst_igst_invoices = []
+
 		unidentified_gst_accounts = []
 		for parent, account, item_wise_tax_detail, tax_amount in self.tax_details:
 			if account in self.gst_accounts.cess_account:
@@ -243,6 +251,8 @@
 							tax_rate = tax_amounts[0]
 							if cgst_or_sgst:
 								tax_rate *= 2
+								if parent not in self.cgst_igst_invoices:
+									self.cgst_igst_invoices.append(parent)
 
 							rate_based_dict = self.items_based_on_tax_rate\
 								.setdefault(parent, {}).setdefault(tax_rate, [])
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 45a43c5..705dcb8 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -34,6 +34,15 @@
 				}
 			};
 		})
+
+		frm.set_query("bom_no", "items", function(doc, cdt, cdn) {
+			var row = locals[cdt][cdn];
+			return {
+				filters: {
+					"item": row.item_code
+				}
+			}
+		});
 	},
 	refresh: function(frm) {
 		if(frm.doc.docstatus === 1 && frm.doc.status !== 'Closed'
diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json
index 73f233c..e593499 100644
--- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json
+++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json
@@ -72,6 +72,8 @@
   "against_blanket_order",
   "blanket_order",
   "blanket_order_rate",
+  "manufacturing_section_section",
+  "bom_no",
   "planning_section",
   "projected_qty",
   "actual_qty",
@@ -212,6 +214,7 @@
    "fieldtype": "Link",
    "label": "UOM",
    "options": "UOM",
+   "print_hide": 0,
    "reqd": 1
   },
   {
@@ -764,12 +767,24 @@
    "fieldname": "against_blanket_order",
    "fieldtype": "Check",
    "label": "Against Blanket Order"
-  }
+  },
+  {
+    "fieldname": "bom_no",
+    "fieldtype": "Link",
+    "label": "BOM No",
+    "no_copy": 1,
+    "options": "BOM",
+    "print_hide": 1
+   },
+   {
+    "fieldname": "manufacturing_section_section",
+    "fieldtype": "Section Break",
+    "label": "Manufacturing Section"
+   }
  ],
  "idx": 1,
  "istable": 1,
- "links": [],
- "modified": "2020-03-05 14:20:28.085117",
+ "modified": "2020-05-15 18:13:43.006493",
  "modified_by": "Administrator",
  "module": "Selling",
  "name": "Sales Order Item",
diff --git a/erpnext/stock/dashboard_chart_source/__init__.py b/erpnext/stock/dashboard_chart_source/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/stock/dashboard_chart_source/__init__.py
diff --git a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/__init__.py b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/__init__.py
diff --git a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js
new file mode 100644
index 0000000..a413754
--- /dev/null
+++ b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js
@@ -0,0 +1,14 @@
+frappe.provide('frappe.dashboards.chart_sources');
+
+frappe.dashboards.chart_sources["Warehouse wise Stock Value"] = {
+	method: "erpnext.stock.dashboard_chart_source.warehouse_wise_stock_value.warehouse_wise_stock_value.get",
+	filters: [
+		{
+			fieldname: "company",
+			label: __("Company"),
+			fieldtype: "Link",
+			options: "Company",
+			default: frappe.defaults.get_user_default("Company")
+		}
+	]
+};
\ No newline at end of file
diff --git a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.json b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.json
new file mode 100644
index 0000000..6d967c0
--- /dev/null
+++ b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.json
@@ -0,0 +1,13 @@
+{
+ "creation": "2020-05-14 14:27:44.108017",
+ "docstatus": 0,
+ "doctype": "Dashboard Chart Source",
+ "idx": 0,
+ "modified": "2020-05-14 14:27:44.108017",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Warehouse wise Stock Value",
+ "owner": "Administrator",
+ "source_name": "Warehouse wise Stock Value ",
+ "timeseries": 0
+}
\ No newline at end of file
diff --git a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py
new file mode 100644
index 0000000..374a34e
--- /dev/null
+++ b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py
@@ -0,0 +1,48 @@
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe, json
+from frappe import _
+from frappe.utils.dashboard import cache_source
+from erpnext.stock.utils import get_stock_value_from_bin
+
+@frappe.whitelist()
+@cache_source
+def get(chart_name = None, chart = None, no_cache = None, filters = None, from_date = None,
+	to_date = None, timespan = None, time_interval = None, heatmap_year = None):
+	labels, datapoints = [], []
+	filters = frappe.parse_json(filters)
+
+	warehouse_filters = [['is_group', '=', 0]]
+	if filters and filters.get("company"):
+		warehouse_filters.append(['company', '=', filters.get("company")])
+
+	warehouses = frappe.get_list("Warehouse", fields=['name'], filters=warehouse_filters, order_by='name')
+
+	for wh in warehouses:
+		balance = get_stock_value_from_bin(warehouse=wh.name)
+		wh["balance"] = balance[0][0]
+
+	warehouses  = [x for x in warehouses if not (x.get('balance') == None)]
+
+	if not warehouses:
+		return []
+
+	sorted_warehouse_map = sorted(warehouses, key = lambda i: i['balance'], reverse=True)
+
+	if len(sorted_warehouse_map) > 10:
+		sorted_warehouse_map = sorted_warehouse_map[:10]
+
+	for warehouse in sorted_warehouse_map:
+		labels.append(_(warehouse.get("name")))
+		datapoints.append(warehouse.get("balance"))
+
+	return{
+		"labels": labels,
+		"datasets": [{
+			"name": _("Stock Value"),
+			"values": datapoints
+		}],
+		"type": "bar"
+	}
\ No newline at end of file
diff --git a/erpnext/stock/dashboard_fixtures.py b/erpnext/stock/dashboard_fixtures.py
new file mode 100644
index 0000000..0f1fd12
--- /dev/null
+++ b/erpnext/stock/dashboard_fixtures.py
@@ -0,0 +1,175 @@
+# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+import frappe
+import json
+from frappe import _
+from frappe.utils import nowdate
+from erpnext.accounts.utils import get_fiscal_year
+
+def get_data():
+	return frappe._dict({
+		"dashboards": get_dashboards(),
+		"charts": get_charts(),
+		"number_cards": get_number_cards(),
+	})
+
+def get_company_for_dashboards():
+	company = frappe.defaults.get_defaults().company
+	if company:
+		return company
+	else:
+		company_list = frappe.get_list("Company")
+		if company_list:
+			return company_list[0].name
+	return None
+
+company = frappe.get_doc("Company", get_company_for_dashboards())
+fiscal_year = get_fiscal_year(nowdate(), as_dict=1)
+fiscal_year_name = fiscal_year.get("name")
+start_date = str(fiscal_year.get("year_start_date"))
+end_date = str(fiscal_year.get("year_end_date"))
+
+def get_dashboards():
+	return [{
+		"name": "Stock",
+		"dashboard_name": "Stock",
+		"charts": [
+			{ "chart": "Warehouse wise Stock Value", "width": "Full"},
+			{ "chart": "Purchase Receipt Trends", "width": "Half"},
+			{ "chart": "Delivery Trends", "width": "Half"},
+			{ "chart": "Oldest Items", "width": "Half"},
+			{ "chart": "Item Shortage Summary", "width": "Half"}
+		],
+		"cards": [
+			{ "card": "Total Active Items"},
+			{ "card": "Total Warehouses"},
+			{ "card": "Total Stock Value"}
+		]
+	}]
+
+def get_charts():
+	return [
+		{
+			"doctype": "Dashboard Chart",
+			"name": "Purchase Receipt Trends",
+			"time_interval": "Monthly",
+			"chart_name": _("Purchase Receipt Trends"),
+			"timespan": "Last Year",
+			"color": "#7b933d",
+			"value_based_on": "base_net_total",
+			"filters_json": json.dumps([["Purchase Receipt", "docstatus", "=", 1]]),
+			"chart_type": "Sum",
+			"timeseries": 1,
+			"based_on": "posting_date",
+			"owner": "Administrator",
+			"document_type": "Purchase Receipt",
+			"type": "Bar",
+			"width": "Half",
+			"is_public": 1
+		},
+		{
+			"doctype": "Dashboard Chart",
+			"name": "Delivery Trends",
+			"time_interval": "Monthly",
+			"chart_name": _("Delivery Trends"),
+			"timespan": "Last Year",
+			"color": "#7b933d",
+			"value_based_on": "base_net_total",
+			"filters_json": json.dumps([["Delivery Note", "docstatus", "=", 1]]),
+			"chart_type": "Sum",
+			"timeseries": 1,
+			"based_on": "posting_date",
+			"owner": "Administrator",
+			"document_type": "Delivery Note",
+			"type": "Bar",
+			"width": "Half",
+			"is_public": 1
+		},
+		{
+			"name": "Warehouse wise Stock Value",
+			"chart_name": _("Warehouse wise Stock Value"),
+			"chart_type": "Custom",
+			"doctype": "Dashboard Chart",
+			"filters_json": json.dumps({}),
+			"is_custom": 0,
+			"is_public": 1,
+			"owner": "Administrator",
+			"source": "Warehouse wise Stock Value",
+			"type": "Bar"
+		},
+		{
+			"name": "Oldest Items",
+			"chart_name": _("Oldest Items"),
+			"chart_type": "Report",
+			"custom_options": json.dumps({
+				"colors": ["#5e64ff"]
+				}),
+			"doctype": "Dashboard Chart",
+			"filters_json": json.dumps({
+				"company": company.name,
+				"to_date": nowdate(),
+				"show_warehouse_wise_stock": 0
+			}),
+			"is_custom": 1,
+			"is_public": 1,
+			"owner": "Administrator",
+			"report_name": "Stock Ageing",
+			"type": "Bar"
+		},
+		{
+			"name": "Item Shortage Summary",
+			"chart_name": _("Item Shortage Summary"),
+			"chart_type": "Report",
+			"doctype": "Dashboard Chart",
+			"filters_json": json.dumps({
+				"company": company.name
+			}),
+			"is_custom": 1,
+			"is_public": 1,
+			"owner": "Administrator",
+			"report_name": "Item Shortage Report",
+			"type": "Bar"
+		}
+	]
+
+def get_number_cards():
+	return [
+		{
+			"name": "Total Active Items",
+			"label": _("Total Active Items"),
+			"function": "Count",
+			"doctype": "Number Card",
+			"document_type": "Item",
+			"filters_json": json.dumps([["Item", "disabled", "=", 0]]),
+			"is_public": 1,
+			"owner": "Administrator",
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Monthly"
+		},
+		{
+			"name": "Total Warehouses",
+			"label": _("Total Warehouses"),
+			"function": "Count",
+			"doctype": "Number Card",
+			"document_type": "Warehouse",
+			"filters_json": json.dumps([["Warehouse", "disabled", "=", 0]]),
+			"is_public": 1,
+			"owner": "Administrator",
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Monthly"
+		},
+		{
+			"name": "Total Stock Value",
+			"label": _("Total Stock Value"),
+			"function": "Sum",
+			"aggregate_function_based_on": "stock_value",
+			"doctype": "Number Card",
+			"document_type": "Bin",
+			"filters_json": json.dumps([]),
+			"is_public": 1,
+			"owner": "Administrator",
+			"show_percentage_stats": 1,
+			"stats_time_interval": "Daily"
+		}
+	]
\ No newline at end of file
diff --git a/erpnext/stock/desk_page/stock/stock.json b/erpnext/stock/desk_page/stock/stock.json
index 38475a6..4506664 100644
--- a/erpnext/stock/desk_page/stock/stock.json
+++ b/erpnext/stock/desk_page/stock/stock.json
@@ -2,8 +2,13 @@
  "cards": [
   {
    "hidden": 0,
+   "label": "Items and Pricing",
+   "links": "[\n    {\n        \"label\": \"Item\",\n        \"name\": \"Item\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"icon\": \"fa fa-sitemap\",\n        \"label\": \"Item Group\",\n        \"link\": \"Tree/Item Group\",\n        \"name\": \"Item Group\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Product Bundle\",\n        \"name\": \"Product Bundle\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Price List\",\n        \"name\": \"Price List\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Price\",\n        \"name\": \"Item Price\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Shipping Rule\",\n        \"name\": \"Shipping Rule\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Pricing Rule\",\n        \"name\": \"Pricing Rule\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Alternative\",\n        \"name\": \"Item Alternative\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Manufacturer\",\n        \"name\": \"Item Manufacturer\",\n        \"type\": \"doctype\"\n    }\n]"
+  },
+  {
+   "hidden": 0,
    "label": "Stock Transactions",
-   "links": "[\n    {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"label\": \"Stock Entry\",\n        \"name\": \"Stock Entry\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Customer\"\n        ],\n        \"label\": \"Delivery Note\",\n        \"name\": \"Delivery Note\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"label\": \"Purchase Receipt\",\n        \"name\": \"Purchase Receipt\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"label\": \"Material Request\",\n        \"name\": \"Material Request\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"label\": \"Pick List\",\n        \"name\": \"Pick List\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Delivery Trip\",\n        \"name\": \"Delivery Trip\",\n        \"type\": \"doctype\"\n    }\n]"
+   "links": "[\n     {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"label\": \"Material Request\",\n        \"name\": \"Material Request\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"label\": \"Stock Entry\",\n        \"name\": \"Stock Entry\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Customer\"\n        ],\n        \"label\": \"Delivery Note\",\n        \"name\": \"Delivery Note\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\",\n            \"Supplier\"\n        ],\n        \"label\": \"Purchase Receipt\",\n        \"name\": \"Purchase Receipt\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"label\": \"Pick List\",\n        \"name\": \"Pick List\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Delivery Trip\",\n        \"name\": \"Delivery Trip\",\n        \"type\": \"doctype\"\n    }\n]"
   },
   {
    "hidden": 0,
@@ -13,12 +18,7 @@
   {
    "hidden": 0,
    "label": "Settings",
-   "links": "[\n    {\n        \"label\": \"Stock Settings\",\n        \"name\": \"Stock Settings\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Warehouse\",\n        \"name\": \"Warehouse\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Unit of Measure (UOM)\",\n        \"name\": \"UOM\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Brand\",\n        \"name\": \"Brand\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Attribute\",\n        \"name\": \"Item Attribute\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Variant Settings\",\n        \"name\": \"Item Variant Settings\",\n        \"type\": \"doctype\"\n    }\n]"
-  },
-  {
-   "hidden": 0,
-   "label": "Items and Pricing",
-   "links": "[\n    {\n        \"label\": \"Item\",\n        \"name\": \"Item\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Product Bundle\",\n        \"name\": \"Product Bundle\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"icon\": \"fa fa-sitemap\",\n        \"label\": \"Item Group\",\n        \"link\": \"Tree/Item Group\",\n        \"name\": \"Item Group\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Price List\",\n        \"name\": \"Price List\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Price\",\n        \"name\": \"Item Price\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Shipping Rule\",\n        \"name\": \"Shipping Rule\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Pricing Rule\",\n        \"name\": \"Pricing Rule\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Alternative\",\n        \"name\": \"Item Alternative\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Manufacturer\",\n        \"name\": \"Item Manufacturer\",\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Variant Settings\",\n        \"name\": \"Item Variant Settings\",\n        \"type\": \"doctype\"\n    }\n]"
+   "links": "[\n    {\n        \"label\": \"Stock Settings\",\n        \"name\": \"Stock Settings\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Warehouse\",\n        \"name\": \"Warehouse\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Unit of Measure (UOM)\",\n        \"name\": \"UOM\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Variant Settings\",\n        \"name\": \"Item Variant Settings\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Brand\",\n        \"name\": \"Brand\",\n        \"onboard\": 1,\n        \"type\": \"doctype\"\n    },\n    {\n        \"label\": \"Item Attribute\",\n        \"name\": \"Item Attribute\",\n        \"type\": \"doctype\"\n    }\n]"
   },
   {
    "hidden": 0,
@@ -41,34 +41,46 @@
    "links": "[\n    {\n        \"dependencies\": [\n            \"Material Request\"\n        ],\n        \"doctype\": \"Material Request\",\n        \"is_query_report\": true,\n        \"label\": \"Requested Items To Be Transferred\",\n        \"name\": \"Requested Items To Be Transferred\",\n        \"type\": \"report\"\n    },\n    {\n        \"dependencies\": [\n            \"Stock Ledger Entry\"\n        ],\n        \"doctype\": \"Stock Ledger Entry\",\n        \"is_query_report\": true,\n        \"label\": \"Batch Item Expiry Status\",\n        \"name\": \"Batch Item Expiry Status\",\n        \"type\": \"report\"\n    },\n    {\n        \"dependencies\": [\n            \"Price List\"\n        ],\n        \"doctype\": \"Price List\",\n        \"is_query_report\": true,\n        \"label\": \"Item Prices\",\n        \"name\": \"Item Prices\",\n        \"type\": \"report\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"doctype\": \"Item\",\n        \"is_query_report\": true,\n        \"label\": \"Itemwise Recommended Reorder Level\",\n        \"name\": \"Itemwise Recommended Reorder Level\",\n        \"type\": \"report\"\n    },\n    {\n        \"dependencies\": [\n            \"Item\"\n        ],\n        \"doctype\": \"Item\",\n        \"is_query_report\": true,\n        \"label\": \"Item Variant Details\",\n        \"name\": \"Item Variant Details\",\n        \"type\": \"report\"\n    },\n    {\n        \"dependencies\": [\n            \"Purchase Order\"\n        ],\n        \"doctype\": \"Purchase Order\",\n        \"is_query_report\": true,\n        \"label\": \"Subcontracted Raw Materials To Be Transferred\",\n        \"name\": \"Subcontracted Raw Materials To Be Transferred\",\n        \"type\": \"report\"\n    },\n    {\n        \"dependencies\": [\n            \"Purchase Order\"\n        ],\n        \"doctype\": \"Purchase Order\",\n        \"is_query_report\": true,\n        \"label\": \"Subcontracted Item To Be Received\",\n        \"name\": \"Subcontracted Item To Be Received\",\n        \"type\": \"report\"\n    },\n    {\n        \"dependencies\": [\n            \"Stock Ledger Entry\"\n        ],\n        \"doctype\": \"Stock Ledger Entry\",\n        \"is_query_report\": true,\n        \"label\": \"Stock and Account Value Comparison\",\n        \"name\": \"Stock and Account Value Comparison\",\n        \"type\": \"report\"\n    }\n]"
   }
  ],
+ "cards_label": "Masters & Reports",
  "category": "Modules",
- "charts": [],
+ "charts": [
+  {
+   "chart_name": "Warehouse wise Stock Value"
+  }
+ ],
  "creation": "2020-03-02 15:43:10.096528",
  "developer_mode_only": 0,
  "disable_user_customization": 0,
  "docstatus": 0,
  "doctype": "Desk Page",
  "extends_another_page": 0,
- "icon": "",
+ "hide_custom": 0,
  "idx": 0,
  "is_standard": 1,
  "label": "Stock",
- "modified": "2020-04-01 11:28:51.148421",
+ "modified": "2020-05-19 17:36:08.185652",
  "modified_by": "Administrator",
  "module": "Stock",
  "name": "Stock",
+ "onboarding": "Stock",
  "owner": "Administrator",
  "pin_to_bottom": 0,
  "pin_to_top": 0,
  "shortcuts": [
   {
+   "color": "#cef6d1",
+   "format": "{}  available",
    "label": "Item",
    "link_to": "Item",
+   "stats_filter": "{\n    \"disabled\" : 0\n}",
    "type": "DocType"
   },
   {
-   "label": "Pricing Rule",
-   "link_to": "Pricing Rule",
+   "color": "#ffe8cd",
+   "format": "{} Pending",
+   "label": "Material Request",
+   "link_to": "Material Request",
+   "stats_filter": "{\n    \"company\": [\"like\", '%' + frappe.defaults.get_global_default(\"company\") + '%'],\n    \"status\": \"Pending\"\n}",
    "type": "DocType"
   },
   {
@@ -77,6 +89,22 @@
    "type": "DocType"
   },
   {
+   "color": "#ffe8cd",
+   "format": "{} to Bill",
+   "label": "Purchase Receipt",
+   "link_to": "Purchase Receipt",
+   "stats_filter": "{\n    \"company\": [\"like\", '%' + frappe.defaults.get_global_default(\"company\") + '%'],\n    \"status\": \"To Bill\"\n}",
+   "type": "DocType"
+  },
+  {
+   "color": "#ffe8cd",
+   "format": "{} to Bill",
+   "label": "Delivery Note",
+   "link_to": "Delivery Note",
+   "stats_filter": "{\n    \"company\": [\"like\", '%' + frappe.defaults.get_global_default(\"company\") + '%'],\n    \"status\": \"To Bill\"\n}",
+   "type": "DocType"
+  },
+  {
    "label": "Stock Ledger",
    "link_to": "Stock Ledger",
    "type": "Report"
@@ -85,6 +113,12 @@
    "label": "Stock Balance",
    "link_to": "Stock Balance",
    "type": "Report"
+  },
+  {
+   "label": "Stock Dashboard",
+   "link_to": "Stock",
+   "type": "Dashboard"
   }
- ]
+ ],
+ "shortcuts_label": "Quick Access"
 }
\ No newline at end of file
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json
index 9f5dee9..84d2057 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.json
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.json
@@ -24,10 +24,10 @@
   "return_against",
   "customer_po_details",
   "po_no",
-  "section_break_18",
-  "pick_list",
   "column_break_17",
   "po_date",
+  "section_break_18",
+  "pick_list",
   "contact_info",
   "shipping_address_name",
   "shipping_address",
@@ -296,7 +296,6 @@
   },
   {
    "collapsible": 1,
-   "collapsible_depends_on": "po_no",
    "fieldname": "customer_po_details",
    "fieldtype": "Section Break",
    "label": "Customer PO Details"
@@ -304,7 +303,7 @@
   {
    "allow_on_submit": 1,
    "fieldname": "po_no",
-   "fieldtype": "Data",
+   "fieldtype": "Small Text",
    "label": "Customer's Purchase Order No",
    "no_copy": 1,
    "oldfieldname": "po_no",
@@ -318,7 +317,6 @@
    "fieldtype": "Column Break"
   },
   {
-   "depends_on": "eval:doc.po_no",
    "fieldname": "po_date",
    "fieldtype": "Date",
    "label": "Customer's Purchase Order Date",
@@ -326,7 +324,6 @@
    "oldfieldtype": "Data",
    "print_hide": 1,
    "print_width": "100px",
-   "read_only": 1,
    "width": "100px"
   },
   {
@@ -1256,7 +1253,7 @@
  "idx": 146,
  "is_submittable": 1,
  "links": [],
- "modified": "2020-04-17 12:51:41.288600",
+ "modified": "2020-05-19 17:03:45.880106",
  "modified_by": "Administrator",
  "module": "Stock",
  "name": "Delivery Note",
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index db8bffd..3562181 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -30,7 +30,16 @@
 			return {
 				filters: {'company': doc.company}
 			};
-		})
+		});
+
+		frm.set_query("bom_no", "items", function(doc, cdt, cdn) {
+			var row = locals[cdt][cdn];
+			return {
+				filters: {
+					"item": row.item_code
+				}
+			}
+		});
 	},
 
 	onload: function(frm) {
diff --git a/erpnext/stock/doctype/material_request_item/material_request_item.json b/erpnext/stock/doctype/material_request_item/material_request_item.json
index df140ff..32bd4a0 100644
--- a/erpnext/stock/doctype/material_request_item/material_request_item.json
+++ b/erpnext/stock/doctype/material_request_item/material_request_item.json
@@ -53,6 +53,8 @@
   "dimension_col_break",
   "cost_center",
   "section_break_37",
+  "bom_no",
+  "section_break_46",
   "page_break"
  ],
  "fields": [
@@ -371,8 +373,10 @@
    "label": "Image"
   },
   {
+   "depends_on": "eval:parent.material_request_type == \"Manufacture\"",
    "fieldname": "section_break_37",
-   "fieldtype": "Section Break"
+   "fieldtype": "Section Break",
+   "label": "Manufacturing"
   },
   {
    "fieldname": "received_qty",
@@ -428,12 +432,24 @@
    "fieldtype": "Link",
    "label": "Source Warehouse (Material Transfer)",
    "options": "Warehouse"
+  },
+  {
+   "fieldname": "bom_no",
+   "fieldtype": "Link",
+   "label": "BOM No",
+   "no_copy": 1,
+   "options": "BOM",
+   "print_hide": 1
+  },
+  {
+   "fieldname": "section_break_46",
+   "fieldtype": "Section Break"
   }
  ],
  "idx": 1,
  "istable": 1,
  "links": [],
- "modified": "2020-05-01 09:00:00.992835",
+ "modified": "2020-05-15 09:00:00.992835",
  "modified_by": "Administrator",
  "module": "Stock",
  "name": "Material Request Item",
diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.js b/erpnext/stock/doctype/stock_settings/stock_settings.js
index cc0e2cf..6f97572 100644
--- a/erpnext/stock/doctype/stock_settings/stock_settings.js
+++ b/erpnext/stock/doctype/stock_settings/stock_settings.js
@@ -15,3 +15,37 @@
 		frm.set_query("sample_retention_warehouse", filters);
 	}
 });
+
+frappe.tour['Stock Settings'] = [
+	{
+		fieldname: "item_naming_by",
+		title: __("Item Naming By"),
+		description: __("By default, the Item Name is set as per the Item Code entered. If you want Items to be named by a set Naming Series choose the 'Naming Series' option.")
+	},
+	{
+		fieldname: "default_warehouse",
+		title: __("Default Warehouse"),
+		description: __("Set a Default Warehouse for Inventory Transactions. This will be fetched into the Default Warehouse in the Item master.")
+	},
+	{
+		fieldname: "allow_negative_stock",
+		title: __("Allow Negative Stock"),
+		description: __("This will allow stock items to be displayed in negative values. Using this option depends on your use case. With this option unchecked, the system warns before obstructing a transaction that is causing negative stock.")
+
+	},
+	{
+		fieldname: "valuation_method",
+		title: __("Valuation Method"),
+		description: __("Choose between FIFO and Moving Average Valuation Methods. Click ") + "<a href='https://docs.erpnext.com/docs/user/manual/en/stock/articles/item-valuation-fifo-and-moving-average'>here</a>" + __(" to know more about them.")
+	},
+	{
+		fieldname: "show_barcode_field",
+		title: __("Show Barcode Field"),
+		description: __("Show 'Scan Barcode' field above every child table to insert Items with ease.")
+	},
+	{
+		fieldname: "automatically_set_serial_nos_based_on_fifo",
+		title: __("Automatically Set Serial Nos based on FIFO"),
+		description: __("Serial numbers for stock will be set automatically based on the Items entered based on first in first out in transactions like Purchase/Sales Invoices, Delivery Notes, etc.")
+	}
+];
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 11b6403..0ed3b27 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -305,7 +305,8 @@
 		"weight_uom":item.weight_uom,
 		"last_purchase_rate": item.last_purchase_rate if args.get("doctype") in ["Purchase Order"] else 0,
 		"transaction_date": args.get("transaction_date"),
-		"against_blanket_order": args.get("against_blanket_order")
+		"against_blanket_order": args.get("against_blanket_order"),
+		"bom_no": item.get("default_bom")
 	})
 
 	if item.get("enable_deferred_revenue") or item.get("enable_deferred_expense"):
diff --git a/erpnext/stock/module_onboarding/stock/stock.json b/erpnext/stock/module_onboarding/stock/stock.json
new file mode 100644
index 0000000..de24575
--- /dev/null
+++ b/erpnext/stock/module_onboarding/stock/stock.json
@@ -0,0 +1,54 @@
+{
+ "allow_roles": [
+  {
+   "role": "Manufacturing Manager"
+  },
+  {
+   "role": "Stock Manager"
+  },
+  {
+   "role": "Manufacturing User"
+  },
+  {
+   "role": "Stock User"
+  }
+ ],
+ "creation": "2020-05-15 03:18:44.400108",
+ "docstatus": 0,
+ "doctype": "Module Onboarding",
+ "documentation_url": "https://docs.erpnext.com/docs/user/manual/en/stock",
+ "idx": 0,
+ "is_complete": 0,
+ "modified": "2020-05-19 19:03:23.602423",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Stock",
+ "owner": "Administrator",
+ "steps": [
+  {
+   "step": "Setup your Warehouse"
+  },
+  {
+   "step": "Create a Product"
+  },
+  {
+   "step": "Introduction to Stock Entry"
+  },
+  {
+   "step": "Create a Stock Entry"
+  },
+  {
+   "step": "Create a Supplier"
+  },
+  {
+   "step": "Create a Purchase Receipt"
+  },
+  {
+   "step": "Stock Settings"
+  }
+ ],
+ "subtitle": "Inventory, Warehouses, Analysis and more.",
+ "success_message": "The Stock Module is all set up!",
+ "title": "Let's Setup the Stock Module.",
+ "user_can_dismiss": 1
+}
\ No newline at end of file
diff --git a/erpnext/stock/onboarding_step/buying_settings/buying_settings.json b/erpnext/stock/onboarding_step/buying_settings/buying_settings.json
new file mode 100644
index 0000000..a788ccd
--- /dev/null
+++ b/erpnext/stock/onboarding_step/buying_settings/buying_settings.json
@@ -0,0 +1,19 @@
+{
+ "action": "Update Settings",
+ "creation": "2020-05-06 15:53:44.667414",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-12 18:30:06.323797",
+ "modified_by": "Administrator",
+ "name": "Buying Settings",
+ "owner": "Administrator",
+ "reference_document": "Buying Settings",
+ "show_full_form": 0,
+ "title": "Configure Buying Settings.",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/stock/onboarding_step/create_a_product/create_a_product.json b/erpnext/stock/onboarding_step/create_a_product/create_a_product.json
new file mode 100644
index 0000000..d2068e1
--- /dev/null
+++ b/erpnext/stock/onboarding_step/create_a_product/create_a_product.json
@@ -0,0 +1,19 @@
+{
+ "action": "Create Entry",
+ "creation": "2020-05-12 18:16:06.624554",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-12 18:30:02.489949",
+ "modified_by": "Administrator",
+ "name": "Create a Product",
+ "owner": "Administrator",
+ "reference_document": "Item",
+ "show_full_form": 0,
+ "title": "Create a Product",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/stock/onboarding_step/create_a_purchase_receipt/create_a_purchase_receipt.json b/erpnext/stock/onboarding_step/create_a_purchase_receipt/create_a_purchase_receipt.json
new file mode 100644
index 0000000..b7811a4
--- /dev/null
+++ b/erpnext/stock/onboarding_step/create_a_purchase_receipt/create_a_purchase_receipt.json
@@ -0,0 +1,19 @@
+{
+ "action": "Create Entry",
+ "creation": "2020-05-19 18:59:13.266713",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-19 18:59:13.266713",
+ "modified_by": "Administrator",
+ "name": "Create a Purchase Receipt",
+ "owner": "Administrator",
+ "reference_document": "Purchase Receipt",
+ "show_full_form": 1,
+ "title": "Create a Purchase Receipt",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/stock/onboarding_step/create_a_stock_entry/create_a_stock_entry.json b/erpnext/stock/onboarding_step/create_a_stock_entry/create_a_stock_entry.json
new file mode 100644
index 0000000..2b83f65
--- /dev/null
+++ b/erpnext/stock/onboarding_step/create_a_stock_entry/create_a_stock_entry.json
@@ -0,0 +1,19 @@
+{
+ "action": "Create Entry",
+ "creation": "2020-05-15 03:20:16.277043",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-15 03:30:58.047696",
+ "modified_by": "Administrator",
+ "name": "Create a Stock Entry",
+ "owner": "Administrator",
+ "reference_document": "Stock Entry",
+ "show_full_form": 1,
+ "title": "Create a Stock Entry",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/stock/onboarding_step/create_a_supplier/create_a_supplier.json b/erpnext/stock/onboarding_step/create_a_supplier/create_a_supplier.json
new file mode 100644
index 0000000..7a64224
--- /dev/null
+++ b/erpnext/stock/onboarding_step/create_a_supplier/create_a_supplier.json
@@ -0,0 +1,19 @@
+{
+ "action": "Create Entry",
+ "creation": "2020-05-14 22:09:10.043554",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-14 22:09:10.043554",
+ "modified_by": "Administrator",
+ "name": "Create a Supplier",
+ "owner": "Administrator",
+ "reference_document": "Supplier",
+ "show_full_form": 0,
+ "title": "Create a Supplier",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/stock/onboarding_step/introduction_to_stock_entry/introduction_to_stock_entry.json b/erpnext/stock/onboarding_step/introduction_to_stock_entry/introduction_to_stock_entry.json
new file mode 100644
index 0000000..447611f
--- /dev/null
+++ b/erpnext/stock/onboarding_step/introduction_to_stock_entry/introduction_to_stock_entry.json
@@ -0,0 +1,19 @@
+{
+ "action": "Watch Video",
+ "creation": "2020-05-15 02:47:17.958806",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-19 18:55:41.457289",
+ "modified_by": "Administrator",
+ "name": "Introduction to Stock Entry",
+ "owner": "Administrator",
+ "show_full_form": 0,
+ "title": "Introduction to the multi-purpose stock transaction",
+ "validate_action": 1,
+ "video_url": "https://www.youtube.com/watch?v=Njt107hlY3I"
+}
\ No newline at end of file
diff --git a/erpnext/stock/onboarding_step/setup_your_warehouse/setup_your_warehouse.json b/erpnext/stock/onboarding_step/setup_your_warehouse/setup_your_warehouse.json
new file mode 100644
index 0000000..557c905
--- /dev/null
+++ b/erpnext/stock/onboarding_step/setup_your_warehouse/setup_your_warehouse.json
@@ -0,0 +1,20 @@
+{
+ "action": "Go to Page",
+ "creation": "2020-05-19 18:54:19.383397",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2020-05-19 18:54:19.383397",
+ "modified_by": "Administrator",
+ "name": "Setup your Warehouse",
+ "owner": "Administrator",
+ "path": "Tree/Warehouse",
+ "reference_document": "Warehouse",
+ "show_full_form": 0,
+ "title": "Setup your Warehouse",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/stock/onboarding_step/stock_settings/stock_settings.json b/erpnext/stock/onboarding_step/stock_settings/stock_settings.json
new file mode 100644
index 0000000..7591bff
--- /dev/null
+++ b/erpnext/stock/onboarding_step/stock_settings/stock_settings.json
@@ -0,0 +1,19 @@
+{
+ "action": "Show Form Tour",
+ "creation": "2020-05-15 02:53:57.209967",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_mandatory": 0,
+ "is_single": 1,
+ "is_skipped": 0,
+ "modified": "2020-05-15 03:55:15.444151",
+ "modified_by": "Administrator",
+ "name": "Stock Settings",
+ "owner": "Administrator",
+ "reference_document": "Stock Settings",
+ "show_full_form": 0,
+ "title": "Explore Stock Settings",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py
index 27cf6b6..5a931e7 100644
--- a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py
+++ b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py
@@ -3,6 +3,7 @@
 
 from __future__ import unicode_literals
 import frappe
+from frappe import _
 from erpnext.controllers.trends	import get_columns,get_data
 
 def execute(filters=None):
@@ -10,5 +11,39 @@
 	data = []
 	conditions = get_columns(filters, "Delivery Note")
 	data = get_data(filters, conditions)
-	
-	return conditions["columns"], data 
\ No newline at end of file
+
+	chart_data = get_chart_data(data, filters)
+
+	return conditions["columns"], data, None, chart_data
+
+def get_chart_data(data, filters):
+	if not data:
+		return []
+
+	labels, datapoints = [], []
+
+	if filters.get("group_by"):
+		# consider only consolidated row
+		data = [row for row in data if row[0]]
+
+	if len(data) > 10:
+		# get top 10 if data too long
+		data = sorted(data, key = lambda i: i[-1],reverse=True)
+		data = data[:10]
+
+	for row in data:
+		labels.append(row[0])
+		datapoints.append(row[-1])
+
+	return {
+		"data": {
+			"labels" : labels,
+			"datasets" : [
+				{
+				"name": _("Total Delivered Amount"),
+				"values": datapoints
+				}
+			]
+		},
+		"type" : "bar"
+	}
\ No newline at end of file
diff --git a/erpnext/stock/report/item_shortage_report/item_shortage_report.js b/erpnext/stock/report/item_shortage_report/item_shortage_report.js
new file mode 100644
index 0000000..ca42a33
--- /dev/null
+++ b/erpnext/stock/report/item_shortage_report/item_shortage_report.js
@@ -0,0 +1,26 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+/* eslint-disable */
+
+frappe.query_reports["Item Shortage Report"] = {
+	"filters": [
+		{
+			"fieldname": "company",
+			"label": __("Company"),
+			"fieldtype": "Link",
+			"width": "80",
+			"options": "Company",
+			"reqd": 1,
+			"default": frappe.defaults.get_default("company")
+		},
+		{
+			"fieldname": "warehouse",
+			"label": __("Warehouse"),
+			"fieldtype": "MultiSelectList",
+			"width": "100",
+			get_data: function(txt) {
+				return frappe.db.get_link_options('Warehouse', txt);
+			}
+		}
+	]
+};
diff --git a/erpnext/stock/report/item_shortage_report/item_shortage_report.json b/erpnext/stock/report/item_shortage_report/item_shortage_report.json
index 577a853..17285c0 100644
--- a/erpnext/stock/report/item_shortage_report/item_shortage_report.json
+++ b/erpnext/stock/report/item_shortage_report/item_shortage_report.json
@@ -1,29 +1,30 @@
 {
- "add_total_row": 0, 
- "apply_user_permissions": 1, 
- "creation": "2013-08-20 13:43:30", 
- "disabled": 0, 
- "docstatus": 0, 
- "doctype": "Report", 
- "idx": 3, 
- "is_standard": "Yes", 
- "json": "{\"add_total_row\": 0, \"sort_by\": \"Bin.projected_qty\", \"sort_order\": \"asc\", \"sort_by_next\": \"\", \"filters\": [[\"Bin\", \"projected_qty\", \"<\", \"0\"]], \"sort_order_next\": \"desc\", \"columns\": [[\"warehouse\", \"Bin\"], [\"item_code\", \"Bin\"], [\"actual_qty\", \"Bin\"], [\"ordered_qty\", \"Bin\"], [\"planned_qty\", \"Bin\"], [\"reserved_qty\", \"Bin\"], [\"projected_qty\", \"Bin\"]]}", 
- "modified": "2017-02-24 20:00:46.439935", 
- "modified_by": "Administrator", 
- "module": "Stock", 
- "name": "Item Shortage Report", 
- "owner": "Administrator", 
- "query": "SELECT  bin.warehouse as \"Warehouse:Link/Warehouse:150\",\n\tbin.item_code as \"Item Code:Link/Item:100\",\n\tbin.actual_qty as \"Actual Quantity:Float:120\",\n\tbin.ordered_qty as \"Ordered Quantity:Float:120\",\n\tbin.planned_qty as \"Planned Quantity:Float:120\",\n\tbin.reserved_qty as \"Reserved Quantity:Float:120\",\n\tbin.projected_qty as \"Project Quantity:Float:120\",\n\titem.item_name as \"Item Name:Data:150\",\n\titem.description as \"Description::200\"\nFROM tabBin as bin\nINNER JOIN tabItem as item\nON bin.item_code=item.name\nWHERE bin.projected_qty<0\nORDER BY bin.projected_qty;", 
- "ref_doctype": "Bin", 
- "report_name": "Item Shortage Report", 
- "report_type": "Query Report", 
+ "add_total_row": 0,
+ "creation": "2013-08-20 13:43:30",
+ "disable_prepared_report": 0,
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 3,
+ "is_standard": "Yes",
+ "json": "{\"add_total_row\": 0, \"sort_by\": \"Bin.projected_qty\", \"sort_order\": \"asc\", \"sort_by_next\": \"\", \"filters\": [[\"Bin\", \"projected_qty\", \"<\", \"0\"]], \"sort_order_next\": \"desc\", \"columns\": [[\"warehouse\", \"Bin\"], [\"item_code\", \"Bin\"], [\"actual_qty\", \"Bin\"], [\"ordered_qty\", \"Bin\"], [\"planned_qty\", \"Bin\"], [\"reserved_qty\", \"Bin\"], [\"projected_qty\", \"Bin\"]]}",
+ "modified": "2020-05-14 12:32:07.158991",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Item Shortage Report",
+ "owner": "Administrator",
+ "prepared_report": 0,
+ "query": "",
+ "ref_doctype": "Bin",
+ "report_name": "Item Shortage Report",
+ "report_type": "Script Report",
  "roles": [
   {
    "role": "Sales User"
-  }, 
+  },
   {
    "role": "Purchase User"
-  }, 
+  },
   {
    "role": "Stock User"
   }
diff --git a/erpnext/stock/report/item_shortage_report/item_shortage_report.py b/erpnext/stock/report/item_shortage_report/item_shortage_report.py
new file mode 100644
index 0000000..086d833
--- /dev/null
+++ b/erpnext/stock/report/item_shortage_report/item_shortage_report.py
@@ -0,0 +1,162 @@
+# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+
+def execute(filters=None):
+	columns = get_columns()
+	conditions = get_conditions(filters)
+	data = get_data(conditions, filters)
+
+	if not data:
+		return [], [], None, []
+
+	chart_data = get_chart_data(data)
+
+	return columns, data, None, chart_data
+
+def get_conditions(filters):
+	conditions = ""
+
+	if filters.get("warehouse"):
+		conditions += "AND warehouse in %(warehouse)s"
+	if filters.get("company"):
+		conditions += "AND company = %(company)s"
+
+	return conditions
+
+def get_data(conditions, filters):
+	data = frappe.db.sql("""
+		SELECT
+			bin.warehouse,
+			bin.item_code,
+			bin.actual_qty ,
+			bin.ordered_qty ,
+			bin.planned_qty ,
+			bin.reserved_qty ,
+			bin.reserved_qty_for_production,
+			bin.projected_qty ,
+			warehouse.company,
+			item.item_name ,
+			item.description
+		FROM
+			`tabBin` bin,
+			`tabWarehouse` warehouse,
+			`tabItem` item
+		WHERE
+			bin.projected_qty<0
+			AND warehouse.name = bin.warehouse
+			AND bin.item_code=item.name
+			{0}
+		ORDER BY bin.projected_qty;""".format(conditions), filters, as_dict=1)
+
+	return data
+
+def get_chart_data(data):
+	labels, datapoints = [], []
+
+	for row in data:
+		labels.append(row.get("item_code"))
+		datapoints.append(row.get("projected_qty"))
+
+	if len(data) > 10:
+		labels = labels[:10]
+		datapoints = datapoints[:10]
+
+	return {
+		"data": {
+			"labels": labels,
+			"datasets":[
+				{
+					"name": _("Projected Qty"),
+					"values": datapoints
+				}
+			]
+		},
+		"type": "bar"
+	}
+
+def get_columns():
+	columns = [
+		{
+			"label": _("Warehouse"),
+			"fieldname": "warehouse",
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"width": 150
+		},
+		{
+			"label": _("Item"),
+			"fieldname": "item_code",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": 150
+		},
+		{
+			"label": _("Actual Quantity"),
+			"fieldname": "actual_qty",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Ordered Quantity"),
+			"fieldname": "ordered_qty",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Planned Quantity"),
+			"fieldname": "planned_qty",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Reserved Quantity"),
+			"fieldname": "reserved_qty",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Reserved Quantity for Production"),
+			"fieldname": "reserved_qty_for_production",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Projected Quantity"),
+			"fieldname": "projected_qty",
+			"fieldtype": "Float",
+			"width": 120,
+			"convertible": "qty"
+		},
+		{
+			"label": _("Company"),
+			"fieldname": "company",
+			"fieldtype": "Link",
+			"options": "Company",
+			"width": 120
+		},
+		{
+			"label": _("Item Name"),
+			"fieldname": "item_name",
+			"fieldtype": "Data",
+			"width": 100
+		},
+		{
+			"label": _("Description"),
+			"fieldname": "description",
+			"fieldtype": "Data",
+			"width": 120
+		}
+	]
+
+	return columns
+
+
diff --git a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py
index 0e58920..8227f15 100644
--- a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py
+++ b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py
@@ -3,6 +3,7 @@
 
 from __future__ import unicode_literals
 import frappe
+from frappe import _
 from erpnext.controllers.trends	import get_columns,get_data
 
 def execute(filters=None):
@@ -11,4 +12,40 @@
 	conditions = get_columns(filters, "Purchase Receipt")
 	data = get_data(filters, conditions)
 
-	return conditions["columns"], data  
\ No newline at end of file
+	chart_data = get_chart_data(data, filters)
+
+	return conditions["columns"], data, None, chart_data
+
+def get_chart_data(data, filters):
+	if not data:
+		return []
+
+	labels, datapoints = [], []
+
+	if filters.get("group_by"):
+		# consider only consolidated row
+		data = [row for row in data if row[0]]
+
+	data = sorted(data, key = lambda i: i[-1], reverse=True)
+
+	if len(data) > 10:
+		# get top 10 if data too long
+		data = data[:10]
+
+	for row in data:
+		labels.append(row[0])
+		datapoints.append(row[-1])
+
+	return {
+		"data": {
+			"labels" : labels,
+			"datasets" : [
+				{
+				"name": _("Total Received Amount"),
+				"values": datapoints
+				}
+			]
+		},
+		"type" : "bar",
+		"colors":["#5e64ff"]
+	}
\ No newline at end of file
diff --git a/erpnext/stock/report/stock_ageing/stock_ageing.py b/erpnext/stock/report/stock_ageing/stock_ageing.py
index 803a5c8..af99780 100644
--- a/erpnext/stock/report/stock_ageing/stock_ageing.py
+++ b/erpnext/stock/report/stock_ageing/stock_ageing.py
@@ -37,7 +37,9 @@
 
 		data.append(row)
 
-	return columns, data
+	chart_data = get_chart_data(data, filters)
+
+	return columns, data, None, chart_data
 
 def get_average_age(fifo_queue, to_date):
 	batch_age = age_qty = total_qty = 0.0
@@ -51,7 +53,7 @@
 			age_qty += batch_age * 1
 			total_qty += 1
 
-	return (age_qty / total_qty) if total_qty else 0.0
+	return flt(age_qty / total_qty, 2) if total_qty else 0.0
 
 def get_columns(filters):
 	columns = [
@@ -230,3 +232,34 @@
 			where wh.lft >= {0} and rgt <= {1})""".format(lft, rgt))
 
 	return "and {}".format(" and ".join(conditions)) if conditions else ""
+
+def get_chart_data(data, filters):
+	if not data:
+		return []
+
+	labels, datapoints = [], []
+
+	if filters.get("show_warehouse_wise_stock"):
+		return {}
+
+	data.sort(key = lambda row: row[6], reverse=True)
+
+	if len(data) > 10:
+		data = data[:10]
+
+	for row in data:
+		labels.append(row[0])
+		datapoints.append(row[6])
+
+	return {
+		"data" : {
+			"labels": labels,
+			"datasets": [
+				{
+					"name": _("Average Age"),
+					"values": datapoints
+				}
+			]
+		},
+		"type" : "bar"
+	}
\ No newline at end of file
diff --git a/erpnext/support/web_form/issues/issues.json b/erpnext/support/web_form/issues/issues.json
index 0f15e47..1df9fb7 100644
--- a/erpnext/support/web_form/issues/issues.json
+++ b/erpnext/support/web_form/issues/issues.json
@@ -18,7 +18,7 @@
  "is_standard": 1,
  "login_required": 1,
  "max_attachment_size": 0,
- "modified": "2020-03-06 05:24:05.749664",
+ "modified": "2020-05-19 13:01:10.729088",
  "modified_by": "Administrator",
  "module": "Support",
  "name": "issues",
@@ -76,7 +76,7 @@
   {
    "allow_read_on_all_link_options": 0,
    "fieldname": "description",
-   "fieldtype": "Text",
+   "fieldtype": "Text Editor",
    "hidden": 0,
    "label": "Description",
    "max_length": 0,