feat: ask reason for putting sales order on hold
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index ebc1529..da0e22c 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -161,7 +161,9 @@
 						if(flt(doc.per_delivered, 6) < 100 || flt(doc.per_billed) < 100) {
 							// hold
 							this.frm.add_custom_button(__('Hold'),
-								function() { me.update_status('Hold', 'On Hold') }, __("Status"))
+								function() { 
+									me.sales_order_on_hold();	
+								}, __("Status"))
 							// close
 							this.frm.add_custom_button(__('Close'),
 								function() { me.close_sales_order() }, __("Status"))
@@ -570,6 +572,37 @@
 		});
 		dialog.show();
 	},
+	sales_order_on_hold: function(){
+		var me = this;
+		var d = new frappe.ui.Dialog({
+			title: __('Reason for Hold'),
+			fields: [
+				{
+					"fieldname": "reason_for_hold",
+					"fieldtype": "Text",
+					"reqd": 1,
+				}
+			],
+			primary_action: function() {
+				var data = d.get_values();
+				frappe.call({
+					method: "erpnext.selling.doctype.sales_order.sales_order.update_reason_for_hold",
+					args: {
+						data: data.reason_for_hold,
+						name: me.frm.doc.name
+					},
+					callback: function(r) {
+						if(!r.exc) {
+							me.frm.set_value("reason_for_hold", data.reason_for_hold);
+							me.update_status('Hold', 'On Hold')
+							d.hide();
+						}
+					}
+				});
+			}
+		});
+		d.show();
+	},
 	close_sales_order: function(){
 		this.frm.cscript.update_status("Close", "Closed")
 	},
diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json
index 54122ee..acb678a 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.json
+++ b/erpnext/selling/doctype/sales_order/sales_order.json
@@ -3647,6 +3647,39 @@
    "bold": 0,
    "collapsible": 0,
    "columns": 0,
+   "depends_on": "eval:doc.status === 'On Hold'",
+   "fieldname": "reason_for_hold",
+   "fieldtype": "Text",
+   "hidden": 0,
+   "ignore_user_permissions": 0,
+   "ignore_xss_filter": 0,
+   "in_filter": 0,
+   "in_global_search": 0,
+   "in_list_view": 1,
+   "in_standard_filter": 0,
+   "label": "Reason for Hold",
+   "length": 0,
+   "no_copy": 0,
+   "permlevel": 0,
+   "precision": "",
+   "print_hide": 0,
+   "print_hide_if_no_value": 0,
+   "read_only": 1,
+   "remember_last_selected_value": 0,
+   "report_hide": 0,
+   "reqd": 0,
+   "search_index": 0,
+   "set_only_once": 0,
+   "translatable": 0,
+   "unique": 0
+  },
+  {
+   "allow_bulk_edit": 0,
+   "allow_in_quick_entry": 0,
+   "allow_on_submit": 0,
+   "bold": 0,
+   "collapsible": 0,
+   "columns": 0,
    "fieldname": "billing_status",
    "fieldtype": "Select",
    "hidden": 1,
@@ -4113,7 +4146,7 @@
  "issingle": 0,
  "istable": 0,
  "max_attachments": 0,
- "modified": "2019-02-27 19:00:29.267253",
+ "modified": "2019-03-04 18:43:38.354549",
  "modified_by": "mangesh@iwebnotes.com",
  "module": "Selling",
  "name": "Sales Order",
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 10aab16..860c63e 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -960,3 +960,7 @@
 	material_request.run_method("set_missing_values")
 	material_request.submit()
 	return material_request
+
+@frappe.whitelist()
+def update_reason_for_hold(name, data):
+	frappe.db.set_value('Sales Order', name, 'reason_for_hold', data)
\ No newline at end of file