Merge pull request #23824 from marination/delete-quoted-item-old-report-pre-release

chore: Delete Quoted Item Comparison Report
diff --git a/erpnext/accounts/doctype/budget/test_budget.py b/erpnext/accounts/doctype/budget/test_budget.py
index 61c48c7..0f115f9 100644
--- a/erpnext/accounts/doctype/budget/test_budget.py
+++ b/erpnext/accounts/doctype/budget/test_budget.py
@@ -158,8 +158,11 @@
 		set_total_expense_zero(nowdate(), "cost_center")
 
 		budget = make_budget(budget_against="Cost Center")
+		month = now_datetime().month
+		if month > 10:
+			month = 10
 
-		for i in range(now_datetime().month):
+		for i in range(month):
 			jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
 				"_Test Bank - _TC", 20000, "_Test Cost Center - _TC", posting_date=nowdate(), submit=True)
 
@@ -177,8 +180,11 @@
 		set_total_expense_zero(nowdate(), "project")
 
 		budget = make_budget(budget_against="Project")
+		month = now_datetime().month
+		if month > 10:
+			month = 10
 
-		for i in range(now_datetime().month):
+		for i in range(month):
 			jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
 				"_Test Bank - _TC", 20000, "_Test Cost Center - _TC", posting_date=nowdate(), submit=True, project="_Test Project")
 
diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js
index 7425132..6dc4643 100644
--- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js
+++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js
@@ -92,7 +92,7 @@
 							frm.refresh_field('customers');
 						}
 						else{
-							frappe.msgprint('No Customers found with selected options.');
+							frappe.throw('No Customers found with selected options.');
 						}
 					}
 				}
diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
index d50e4a8..43fbb06 100644
--- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
+++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
@@ -126,9 +126,11 @@
 	sales_person_records = frappe._dict()
 	for d in records:
 		sales_person_records.setdefault(d.parenttype, set()).add(d.parent)
-	customers = frappe.get_list('Customer', fields=['name', 'email_id'], \
+	if sales_person_records.get('Customer'):
+		return frappe.get_list('Customer', fields=['name', 'email_id'], \
 			filters=[['name', 'in', list(sales_person_records['Customer'])]])
-	return customers
+	else:
+		return []
 
 def get_recipients_and_cc(customer, doc):
 	recipients = []
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
index f56c9b4..cf30e30 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
@@ -304,7 +304,7 @@
 				{
 					"fieldtype": "Select", "label": __("Get Suppliers By"),
 					"fieldname": "search_type",
-					"options": ["Tag","Supplier Group"],
+					"options": ["Supplier Group", "Tag"],
 					"reqd": 1,
 					onchange() {
 						if(dialog.get_value('search_type') == 'Tag'){
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
index 4e09a7e..3af6cf8 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
@@ -21,9 +21,9 @@
   "link_to_mrs",
   "supplier_response_section",
   "salutation",
-  "email_template",
-  "col_break_email_1",
   "subject",
+  "col_break_email_1",
+  "email_template",
   "preview",
   "sec_break_email_2",
   "message_for_supplier",
@@ -260,7 +260,7 @@
  "index_web_pages_for_search": 1,
  "is_submittable": 1,
  "links": [],
- "modified": "2020-10-16 17:49:09.561929",
+ "modified": "2020-11-04 22:04:29.017134",
  "modified_by": "Administrator",
  "module": "Buying",
  "name": "Request for Quotation",
diff --git a/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json b/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
index 96d7e2d..534cd90 100644
--- a/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
+++ b/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
@@ -5,14 +5,14 @@
  "editable_grid": 1,
  "engine": "InnoDB",
  "field_order": [
-  "send_email",
-  "email_sent",
   "supplier",
   "contact",
   "quote_status",
   "column_break_3",
   "supplier_name",
-  "email_id"
+  "email_id",
+  "send_email",
+  "email_sent"
  ],
  "fields": [
   {
@@ -87,7 +87,7 @@
  "index_web_pages_for_search": 1,
  "istable": 1,
  "links": [],
- "modified": "2020-10-16 12:23:41.769820",
+ "modified": "2020-11-04 22:01:43.832942",
  "modified_by": "Administrator",
  "module": "Buying",
  "name": "Request for Quotation Supplier",
diff --git a/erpnext/healthcare/doctype/exercise/exercise.json b/erpnext/healthcare/doctype/exercise/exercise.json
index 2486a5d..683cc6d 100644
--- a/erpnext/healthcare/doctype/exercise/exercise.json
+++ b/erpnext/healthcare/doctype/exercise/exercise.json
@@ -37,7 +37,8 @@
    "depends_on": "eval:doc.parenttype==\"Therapy\";",
    "fieldname": "counts_completed",
    "fieldtype": "Int",
-   "label": "Counts Completed"
+   "label": "Counts Completed",
+   "no_copy": 1
   },
   {
    "fieldname": "assistance_level",
@@ -48,7 +49,7 @@
  ],
  "istable": 1,
  "links": [],
- "modified": "2020-04-10 13:41:06.662351",
+ "modified": "2020-11-04 18:20:25.583491",
  "modified_by": "Administrator",
  "module": "Healthcare",
  "name": "Exercise",
diff --git a/erpnext/healthcare/doctype/therapy_plan/therapy_plan.js b/erpnext/healthcare/doctype/therapy_plan/therapy_plan.js
index 490d458..d1f72d6 100644
--- a/erpnext/healthcare/doctype/therapy_plan/therapy_plan.js
+++ b/erpnext/healthcare/doctype/therapy_plan/therapy_plan.js
@@ -13,43 +13,42 @@
 	refresh: function(frm) {
 		if (!frm.doc.__islocal) {
 			frm.trigger('show_progress_for_therapies');
-		}
-
-		if (!frm.doc.__islocal && frm.doc.status != 'Completed') {
-			let therapy_types = (frm.doc.therapy_plan_details || []).map(function(d){ return d.therapy_type });
-			const fields = [{
-				fieldtype: 'Link',
-				label: __('Therapy Type'),
-				fieldname: 'therapy_type',
-				options: 'Therapy Type',
-				reqd: 1,
-				get_query: function() {
-					return {
-						filters: { 'therapy_type': ['in', therapy_types]}
+			if (frm.doc.status != 'Completed') {
+				let therapy_types = (frm.doc.therapy_plan_details || []).map(function(d){ return d.therapy_type; });
+				const fields = [{
+					fieldtype: 'Link',
+					label: __('Therapy Type'),
+					fieldname: 'therapy_type',
+					options: 'Therapy Type',
+					reqd: 1,
+					get_query: function() {
+						return {
+							filters: { 'therapy_type': ['in', therapy_types]}
+						};
 					}
-				}
-			}];
+				}];
 
-			frm.add_custom_button(__('Therapy Session'), function() {
-				frappe.prompt(fields, data => {
-					frappe.call({
-						method: 'erpnext.healthcare.doctype.therapy_plan.therapy_plan.make_therapy_session',
-						args: {
-							therapy_plan: frm.doc.name,
-							patient: frm.doc.patient,
-							therapy_type: data.therapy_type,
-							company: frm.doc.company
-						},
-						freeze: true,
-						callback: function(r) {
-							if (r.message) {
-								frappe.model.sync(r.message);
-								frappe.set_route('Form', r.message.doctype, r.message.name);
+				frm.add_custom_button(__('Therapy Session'), function() {
+					frappe.prompt(fields, data => {
+						frappe.call({
+							method: 'erpnext.healthcare.doctype.therapy_plan.therapy_plan.make_therapy_session',
+							args: {
+								therapy_plan: frm.doc.name,
+								patient: frm.doc.patient,
+								therapy_type: data.therapy_type,
+								company: frm.doc.company
+							},
+							freeze: true,
+							callback: function(r) {
+								if (r.message) {
+									frappe.model.sync(r.message);
+									frappe.set_route('Form', r.message.doctype, r.message.name);
+								}
 							}
-						}
-					});
-				}, __('Select Therapy Type'), __('Create'));
-			}, __('Create'));
+						});
+					}, __('Select Therapy Type'), __('Create'));
+				}, __('Create'));
+			}
 
 			if (frm.doc.therapy_plan_template && !frm.doc.invoiced) {
 				frm.add_custom_button(__('Sales Invoice'), function() {
diff --git a/erpnext/healthcare/doctype/therapy_plan/therapy_plan.json b/erpnext/healthcare/doctype/therapy_plan/therapy_plan.json
index ccb316e..c03e9de 100644
--- a/erpnext/healthcare/doctype/therapy_plan/therapy_plan.json
+++ b/erpnext/healthcare/doctype/therapy_plan/therapy_plan.json
@@ -115,7 +115,8 @@
    "fieldname": "therapy_plan_template",
    "fieldtype": "Link",
    "label": "Therapy Plan Template",
-   "options": "Therapy Plan Template"
+   "options": "Therapy Plan Template",
+   "set_only_once": 1
   },
   {
    "default": "0",
@@ -128,7 +129,7 @@
   }
  ],
  "links": [],
- "modified": "2020-10-23 01:27:42.128855",
+ "modified": "2020-11-04 18:13:13.564999",
  "modified_by": "Administrator",
  "module": "Healthcare",
  "name": "Therapy Plan",
diff --git a/erpnext/healthcare/doctype/therapy_plan_detail/therapy_plan_detail.json b/erpnext/healthcare/doctype/therapy_plan_detail/therapy_plan_detail.json
index 555587e..77f08af 100644
--- a/erpnext/healthcare/doctype/therapy_plan_detail/therapy_plan_detail.json
+++ b/erpnext/healthcare/doctype/therapy_plan_detail/therapy_plan_detail.json
@@ -30,12 +30,13 @@
    "fieldname": "sessions_completed",
    "fieldtype": "Int",
    "label": "Sessions Completed",
+   "no_copy": 1,
    "read_only": 1
   }
  ],
  "istable": 1,
  "links": [],
- "modified": "2020-10-08 01:17:34.778028",
+ "modified": "2020-11-04 18:15:52.173450",
  "modified_by": "Administrator",
  "module": "Healthcare",
  "name": "Therapy Plan Detail",
diff --git a/erpnext/healthcare/doctype/therapy_session/therapy_session.js b/erpnext/healthcare/doctype/therapy_session/therapy_session.js
index 65d4cc4..a2b01c9 100644
--- a/erpnext/healthcare/doctype/therapy_session/therapy_session.js
+++ b/erpnext/healthcare/doctype/therapy_session/therapy_session.js
@@ -22,6 +22,10 @@
 	},
 
 	refresh: function(frm) {
+		if (frm.doc.therapy_plan) {
+			frm.trigger('filter_therapy_types');
+		}
+
 		if (!frm.doc.__islocal) {
 			frm.dashboard.add_indicator(__('Counts Targeted: {0}', [frm.doc.total_counts_targeted]), 'blue');
 			frm.dashboard.add_indicator(__('Counts Completed: {0}', [frm.doc.total_counts_completed]),
@@ -36,15 +40,43 @@
 				})
 			}, 'Create');
 
-			frm.add_custom_button(__('Sales Invoice'), function() {
-				frappe.model.open_mapped_doc({
-					method: 'erpnext.healthcare.doctype.therapy_session.therapy_session.invoice_therapy_session',
-					frm: frm,
-				})
-			}, 'Create');
+			frappe.db.get_value('Therapy Plan', {'name': frm.doc.therapy_plan}, 'therapy_plan_template', (r) => {
+				if (r && !r.therapy_plan_template) {
+					frm.add_custom_button(__('Sales Invoice'), function() {
+						frappe.model.open_mapped_doc({
+							method: 'erpnext.healthcare.doctype.therapy_session.therapy_session.invoice_therapy_session',
+							frm: frm,
+						});
+					}, 'Create');
+				}
+			});
 		}
 	},
 
+	therapy_plan: function(frm) {
+		if (frm.doc.therapy_plan) {
+			frm.trigger('filter_therapy_types');
+		}
+	},
+
+	filter_therapy_types: function(frm) {
+		frappe.call({
+			'method': 'frappe.client.get',
+			args: {
+				doctype: 'Therapy Plan',
+				name: frm.doc.therapy_plan
+			},
+			callback: function(data) {
+				let therapy_types = (data.message.therapy_plan_details || []).map(function(d){ return d.therapy_type; });
+				frm.set_query('therapy_type', function() {
+					return {
+						filters: { 'therapy_type': ['in', therapy_types]}
+					};
+				});
+			}
+		});
+	},
+
 	patient: function(frm) {
 		if (frm.doc.patient) {
 			frappe.call({
@@ -98,19 +130,6 @@
 					frm.set_value(values);
 				}
 			});
-		} else {
-			let values = {
-				'patient': '',
-				'therapy_type': '',
-				'therapy_plan': '',
-				'practitioner': '',
-				'department': '',
-				'start_date': '',
-				'start_time': '',
-				'service_unit': '',
-				'duration': ''
-			};
-			frm.set_value(values);
 		}
 	},
 
diff --git a/erpnext/healthcare/doctype/therapy_session/therapy_session.json b/erpnext/healthcare/doctype/therapy_session/therapy_session.json
index 1f877cc..0bb2b0e 100644
--- a/erpnext/healthcare/doctype/therapy_session/therapy_session.json
+++ b/erpnext/healthcare/doctype/therapy_session/therapy_session.json
@@ -194,6 +194,7 @@
    "fieldname": "total_counts_completed",
    "fieldtype": "Int",
    "label": "Total Counts Completed",
+   "no_copy": 1,
    "read_only": 1
   },
   {
@@ -222,7 +223,7 @@
  ],
  "is_submittable": 1,
  "links": [],
- "modified": "2020-10-22 23:10:21.178644",
+ "modified": "2020-11-04 18:14:25.999939",
  "modified_by": "Administrator",
  "module": "Healthcare",
  "name": "Therapy Session",
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 989bd33..f162291 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -573,12 +573,6 @@
 					"default": 0
 				},
 				{
-					"fieldtype": "Section Break",
-					"label": "",
-					"fieldname": "sec_break_dialog",
-					"hide_border": 1
-				},
-				{
 					fieldname: 'items_for_po', fieldtype: 'Table', label: 'Select Items',
 					fields: [
 						{
@@ -616,16 +610,13 @@
 							read_only:1,
 							in_list_view:1
 						},
-					],
-					data: me.frm.doc.items.map((item) =>{
-						item.pending_qty = (flt(item.stock_qty) - flt(item.ordered_qty)) / flt(item.conversion_factor);
-						return item;
-					}).filter((item) => {return item.pending_qty > 0;})
+					]
 				}
 			],
 			primary_action_label: 'Create Purchase Order',
 			primary_action (args) {
 				if (!args) return;
+
 				let selected_items = dialog.fields_dict.items_for_po.grid.get_selected_children();
 				if(selected_items.length == 0) {
 					frappe.throw({message: 'Please select Items from the Table', title: __('Items Required'), indicator:'blue'})
@@ -635,8 +626,9 @@
 
 				var method = args.against_default_supplier ? "make_purchase_order_for_default_supplier" : "make_purchase_order"
 				return frappe.call({
-					type: "GET",
 					method: "erpnext.selling.doctype.sales_order.sales_order." + method,
+					freeze: true,
+					freeze_message: __("Creating Purchase Order ..."),
 					args: {
 						"source_name": me.frm.doc.name,
 						"selected_items": selected_items
@@ -660,8 +652,9 @@
 			}
 		});
 
-		dialog.fields_dict["against_default_supplier"].df.onchange = () => {
-			console.log("yo");
+		dialog.fields_dict["against_default_supplier"].df.onchange = () => set_po_items_data(dialog);
+
+		function set_po_items_data (dialog) {
 			var against_default_supplier = dialog.get_value("against_default_supplier");
 			var items_for_po = dialog.get_value("items_for_po");
 
@@ -671,16 +664,28 @@
 				dialog.fields_dict["items_for_po"].df.data = items_with_supplier;
 				dialog.get_field("items_for_po").refresh();
 			} else {
-				let pending_items = me.frm.doc.items.map((item) =>{
-					item.pending_qty = (flt(item.stock_qty) - flt(item.ordered_qty)) / flt(item.conversion_factor);
-					return item;
-					}).filter((item) => {return item.pending_qty > 0;});
+				let po_items = [];
+				me.frm.doc.items.forEach(d => {
+					let pending_qty = (flt(d.stock_qty) - flt(d.ordered_qty)) / flt(d.conversion_factor);
+					if (pending_qty > 0) {
+						po_items.push({
+							"doctype": "Sales Order Item",
+							"name": d.name,
+							"item_name": d.item_name,
+							"item_code": d.item_code,
+							"pending_qty": pending_qty,
+							"uom": d.uom,
+							"supplier": d.supplier
+						});
+					}
+				});
 
-				dialog.fields_dict["items_for_po"].df.data = pending_items;
+				dialog.fields_dict["items_for_po"].df.data = po_items;
 				dialog.get_field("items_for_po").refresh();
 			}
 		}
 
+		set_po_items_data(dialog);
 		dialog.get_field("items_for_po").grid.only_sortable();
 		dialog.get_field("items_for_po").refresh();
 		dialog.wrapper.find('.grid-heading-row .grid-row-check').click();
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index ae227e0..ec1c823 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -779,7 +779,9 @@
 	return data
 
 @frappe.whitelist()
-def make_purchase_order_for_default_supplier(source_name, selected_items=[], target_doc=None):
+def make_purchase_order_for_default_supplier(source_name, selected_items=None, target_doc=None):
+	if not selected_items: return
+
 	if isinstance(selected_items, string_types):
 		selected_items = json.loads(selected_items)
 
@@ -878,7 +880,9 @@
 		frappe.msgprint(_("Purchase Order already created for all Sales Order items"))
 
 @frappe.whitelist()
-def make_purchase_order(source_name, selected_items=[], target_doc=None):
+def make_purchase_order(source_name, selected_items=None, target_doc=None):
+	if not selected_items: return
+
 	if isinstance(selected_items, string_types):
 		selected_items = json.loads(selected_items)