fix: status inconsistencies in Clinical Procedure
diff --git a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js
index 7551083..ce795ad 100644
--- a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js
+++ b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js
@@ -4,81 +4,86 @@
 frappe.ui.form.on('Clinical Procedure', {
 	setup: function(frm) {
 		frm.set_query('batch_no', 'items', function(doc, cdt, cdn) {
-			var item = locals[cdt][cdn];
-			if(!item.item_code) {
-				frappe.throw(__("Please enter Item Code to get Batch Number"));
+			let item = locals[cdt][cdn];
+			if (!item.item_code) {
+				frappe.throw(__('Please enter Item Code to get Batch Number'));
 			} else {
 				if (frm.doc.status == 'In Progress') {
-					var filters = {
+					let filters = {
 						'item_code': item.item_code,
 						'posting_date': frm.doc.start_date || frappe.datetime.nowdate()
 					};
-					if(frm.doc.warehouse) filters["warehouse"] = frm.doc.warehouse;
+					if (frm.doc.warehouse) filters['warehouse'] = frm.doc.warehouse;
 				} else {
 					filters = {
 						'item_code': item.item_code
 					};
 				}
 				return {
-					query : "erpnext.controllers.queries.get_batch_no",
+					query : 'erpnext.controllers.queries.get_batch_no',
 					filters: filters
 				};
 			}
 		});
 	},
 	refresh: function(frm) {
-		frm.set_query("patient", function () {
+		frm.set_query('patient', function () {
 			return {
-				filters: {"status": ["!=", "Disabled"]}
+				filters: {'status': ['!=', 'Disabled']}
 			};
 		});
-		frm.set_query("appointment", function () {
+
+		frm.set_query('appointment', function () {
 			return {
 				filters: {
-					"procedure_template": ["not in", null],
-					"status": ['in', 'Open, Scheduled']
+					'procedure_template': ['not in', null],
+					'status': ['in', 'Open, Scheduled']
 				}
 			};
 		});
-		frm.set_query("service_unit", function(){
+
+		frm.set_query('service_unit', function() {
 			return {
 				filters: {
-					"is_group": false,
-					"allow_appointments": true
+					'is_group': false,
+					'allow_appointments': true
 				}
 			};
 		});
-		frm.set_query("practitioner", function() {
+
+		frm.set_query('practitioner', function() {
 			return {
 				filters: {
 					'department': frm.doc.medical_department
 				}
 			};
 		});
-		if(frm.doc.consume_stock){
+
+		if (frm.doc.consume_stock) {
 			frm.set_indicator_formatter('item_code',
-				function(doc) { return (doc.qty<=doc.actual_qty) ? "green" : "orange" ; });
+				function(doc) { return (doc.qty<=doc.actual_qty) ? 'green' : 'orange' ; });
 		}
 
-		if (!frm.doc.__islocal && frm.doc.status == 'In Progress'){
-
-			if(frm.doc.consume_stock){
-				var btn_label = 'Complete and Consume';
-				var msg = 'Complete '+frm.doc.name+' and Consume Stock?';
-			}else{
+		if (frm.doc.docstatus == 2 && frm.doc.status == 'In Progress') {
+			let btn_label = '';
+			let msg = '';
+			if (frm.doc.consume_stock) {
+				btn_label = 'Complete and Consume';
+				msg = 'Complete '+ frm.doc.name +' and Consume Stock?';
+			} else {
 				btn_label = 'Complete';
-				msg = 'Complete '+frm.doc.name+'?';
+				msg = 'Complete '+ frm.doc.name +'?';
 			}
 
 			frm.add_custom_button(__(btn_label), function () {
 				frappe.confirm(
 					__(msg),
-					function(){
+					function() {
 						frappe.call({
 							doc: frm.doc,
-							method: "complete",
+							method: 'complete',
 							callback: function(r) {
-								if(!r.exc){
+								if (!r.exc) {
 									cur_frm.reload_doc();
 								}
 							}
@@ -86,31 +91,31 @@
 					}
 				);
 			});
-		}else if (frm.doc.status == 'Draft') {
-			frm.add_custom_button(__("Start"), function () {
+		} else if (frm.doc.docstatus == 2 && frm.doc.status == 'Pending') {
+			frm.add_custom_button(__('Start'), function () {
 				frappe.call({
 					doc: frm.doc,
-					method: "start",
+					method: 'start',
 					callback: function(r) {
-						if(!r.exc){
-							if(frm.doc.status == 'Draft'){
+						if (!r.exc) {
+							if (frm.doc.status == 'Draft') {
 								frappe.confirm(
-									__("Stock quantity to start procedure is not available in the warehouse. Do you want to record a Stock Transfer"),
-									function(){
+									__('Stock quantity to start procedure is not available in the warehouse. Do you want to record a Stock Transfer'),
+									function() {
 										frappe.call({
 											doc: frm.doc,
-											method: "make_material_transfer",
+											method: 'make_material_transfer',
 											callback: function(r) {
-												if(!r.exc){
+												if (!r.exc) {
 													cur_frm.reload_doc();
-													var doclist = frappe.model.sync(r.message);
-													frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
+													let doclist = frappe.model.sync(r.message);
+													frappe.set_route('Form', doclist[0].doctype, doclist[0].name);
 												}
 											}
 										});
 									}
 								);
-							}else{
+							} else {
 								cur_frm.reload_doc();
 							}
 						}
@@ -118,130 +123,130 @@
 				});
 			});
 		}
-		if (frm.doc.__islocal){
-			frm.set_df_property("consumables", "hidden", 1);
-		}else{
-			frm.set_df_property("consumables", "hidden", 0);
+		if (frm.doc.__islocal) {
+			frm.set_df_property('consumables', 'hidden', 1);
+		} else {
+			frm.set_df_property('consumables', 'hidden', 0);
 		}
 	},
-	onload: function(frm){
-		if(frm.doc.status == 'Completed'){
-			frm.set_df_property("items", "read_only", 1);
+	onload: function(frm) {
+		if (frm.doc.status == 'Completed') {
+			frm.set_df_property('items', 'read_only', 1);
 		}
-		if(frm.is_new()) {
-			frm.add_fetch("procedure_template", "medical_department", "medical_department");
-			frm.set_value("start_time", null);
+		if (frm.is_new()) {
+			frm.add_fetch('procedure_template', 'medical_department', 'medical_department');
+			frm.set_value('start_time', null);
 		}
 	},
 	patient: function(frm) {
-		if(frm.doc.patient){
+		if (frm.doc.patient) {
 			frappe.call({
-				"method": "erpnext.healthcare.doctype.patient.patient.get_patient_detail",
+				'method': 'erpnext.healthcare.doctype.patient.patient.get_patient_detail',
 				args: {
 					patient: frm.doc.patient
 				},
 				callback: function (data) {
-					let age = "";
-					if(data.message.dob){
+					let age = '';
+					if (data.message.dob) {
 						age = calculate_age(data.message.dob);
-					}else if (data.message.age){
+					}else if (data.message.age) {
 						age = data.message.age;
-						if(data.message.age_as_on){
-							age = age+" as on "+data.message.age_as_on;
+						if (data.message.age_as_on) {
+							age = age+' as on '+data.message.age_as_on;
 						}
 					}
-					frm.set_value("patient_age", age);
-					frm.set_value("patient_sex", data.message.sex);
+					frm.set_value('patient_age', age);
+					frm.set_value('patient_sex', data.message.sex);
 				}
 			});
-		}else{
-			frm.set_value("patient_age", "");
-			frm.set_value("patient_sex", "");
+		} else {
+			frm.set_value('patient_age', '');
+			frm.set_value('patient_sex', '');
 		}
 	},
 	appointment: function(frm) {
-		if(frm.doc.appointment){
+		if (frm.doc.appointment) {
 			frappe.call({
-				"method": "frappe.client.get",
+				'method': 'frappe.client.get',
 				args: {
-					doctype: "Patient Appointment",
+					doctype: 'Patient Appointment',
 					name: frm.doc.appointment
 				},
-				callback: function (data) {
-					frm.set_value("patient", data.message.patient);
-					frm.set_value("procedure_template", data.message.procedure_template);
-					frm.set_value("medical_department", data.message.department);
-					frm.set_value("start_date", data.message.appointment_date);
-					frm.set_value("start_time", data.message.appointment_time);
-					frm.set_value("notes", data.message.notes);
-					frm.set_value("service_unit", data.message.service_unit);
+				callback: function(data) {
+					frm.set_value('patient', data.message.patient);
+					frm.set_value('procedure_template', data.message.procedure_template);
+					frm.set_value('medical_department', data.message.department);
+					frm.set_value('start_date', data.message.appointment_date);
+					frm.set_value('start_time', data.message.appointment_time);
+					frm.set_value('notes', data.message.notes);
+					frm.set_value('service_unit', data.message.service_unit);
 				}
 			});
 		}
 	},
 	procedure_template: function(frm) {
-		if(frm.doc.procedure_template){
+		if (frm.doc.procedure_template) {
 			frappe.call({
-				"method": "frappe.client.get",
+				'method': 'frappe.client.get',
 				args: {
-					doctype: "Clinical Procedure Template",
+					doctype: 'Clinical Procedure Template',
 					name: frm.doc.procedure_template
 				},
 				callback: function (data) {
-					frm.set_value("medical_department", data.message.medical_department);
-					frm.set_value("consume_stock", data.message.consume_stock);
-					if(!frm.doc.warehouse){
+					frm.set_value('medical_department', data.message.medical_department);
+					frm.set_value('consume_stock', data.message.consume_stock);
+					if (!frm.doc.warehouse) {
 						frappe.call({
-							method: "frappe.client.get_value",
+							method: 'frappe.client.get_value',
 							args: {
-								doctype: "Stock Settings",
-								fieldname: "default_warehouse"
+								doctype: 'Stock Settings',
+								fieldname: 'default_warehouse'
 							},
 							callback: function (data) {
-								frm.set_value("warehouse", data.message.default_warehouse);
+								frm.set_value('warehouse', data.message.default_warehouse);
 							}
 						});
 					}
 				}
 			});
-		}else{
-			frm.set_value("consume_stock", 0);
+		} else {
+			frm.set_value('consume_stock', 0);
 		}
 	},
 	service_unit: function(frm) {
-		if(frm.doc.service_unit){
+		if (frm.doc.service_unit) {
 			frappe.call({
-				method: "frappe.client.get_value",
+				method: 'frappe.client.get_value',
 				args:{
-					fieldname: "warehouse",
-					doctype: "Healthcare Service Unit",
+					fieldname: 'warehouse',
+					doctype: 'Healthcare Service Unit',
 					filters:{name: frm.doc.service_unit},
 				},
 				callback: function(data) {
-					if(data.message){
-						frm.set_value("warehouse", data.message.warehouse);
+					if (data.message) {
+						frm.set_value('warehouse', data.message.warehouse);
 					}
 				}
 			});
 		}
 	},
 	practitioner: function(frm) {
-		if(frm.doc.practitioner){
+		if (frm.doc.practitioner) {
 			frappe.call({
-				"method": "frappe.client.get",
+				'method': 'frappe.client.get',
 				args: {
-					doctype: "Healthcare Practitioner",
+					doctype: 'Healthcare Practitioner',
 					name: frm.doc.practitioner
 				},
 				callback: function (data) {
-					frappe.model.set_value(frm.doctype,frm.docname, "medical_department",data.message.department);
+					frappe.model.set_value(frm.doctype,frm.docname, 'medical_department',data.message.department);
 				}
 			});
 		}
 	}
 });
 
-cur_frm.set_query("procedure_template", function(doc) {
+cur_frm.set_query('procedure_template', function(doc) {
 	return {
 		filters: {
 			'medical_department': doc.medical_department
@@ -249,31 +254,31 @@
 	};
 });
 
-cur_frm.set_query("appointment", function() {
+cur_frm.set_query('appointment', function() {
 	return {
 		filters: {
-			status:['in',["Open"]]
+			status:['in',['Open']]
 		}
 	};
 });
 
 frappe.ui.form.on('Clinical Procedure Item', {
-	qty: function(frm, cdt, cdn){
-		var d = locals[cdt][cdn];
-		frappe.model.set_value(cdt, cdn, "transfer_qty", d.qty*d.conversion_factor);
+	qty: function(frm, cdt, cdn) {
+		let d = locals[cdt][cdn];
+		frappe.model.set_value(cdt, cdn, 'transfer_qty', d.qty*d.conversion_factor);
 	},
-	uom: function(doc, cdt, cdn){
-		var d = locals[cdt][cdn];
-		if(d.uom && d.item_code){
+	uom: function(doc, cdt, cdn) {
+		let d = locals[cdt][cdn];
+		if (d.uom && d.item_code) {
 			return frappe.call({
-				method: "erpnext.stock.doctype.stock_entry.stock_entry.get_uom_details",
+				method: 'erpnext.stock.doctype.stock_entry.stock_entry.get_uom_details',
 				args: {
 					item_code: d.item_code,
 					uom: d.uom,
 					qty: d.qty
 				},
 				callback: function(r) {
-					if(r.message) {
+					if (r.message) {
 						frappe.model.set_value(cdt, cdn, r.message);
 					}
 				}
@@ -281,25 +286,25 @@
 		}
 	},
 	item_code: function(frm, cdt, cdn) {
-		var d = locals[cdt][cdn];
+		let d = locals[cdt][cdn];
 		let args = null;
-		if(d.item_code) {
+		if (d.item_code) {
 			args = {
-				'doctype' : "Clinical Procedure",
+				'doctype' : 'Clinical Procedure',
 				'item_code' : d.item_code,
 				'company' : frm.doc.company,
 				'warehouse': frm.doc.warehouse
 			};
 			return frappe.call({
-				method: "erpnext.stock.get_item_details.get_item_details",
+				method: 'erpnext.stock.get_item_details.get_item_details',
 				args: {args: args},
 				callback: function(r) {
-					if(r.message) {
-						frappe.model.set_value(cdt, cdn, "item_name", r.message.item_name);
-						frappe.model.set_value(cdt, cdn, "stock_uom", r.message.stock_uom);
-						frappe.model.set_value(cdt, cdn, "conversion_factor", r.message.conversion_factor);
-						frappe.model.set_value(cdt, cdn, "actual_qty", r.message.actual_qty);
-						refresh_field("items");
+					if (r.message) {
+						frappe.model.set_value(cdt, cdn, 'item_name', r.message.item_name);
+						frappe.model.set_value(cdt, cdn, 'stock_uom', r.message.stock_uom);
+						frappe.model.set_value(cdt, cdn, 'conversion_factor', r.message.conversion_factor);
+						frappe.model.set_value(cdt, cdn, 'actual_qty', r.message.actual_qty);
+						refresh_field('items');
 					}
 				}
 			});
@@ -307,16 +312,16 @@
 	}
 });
 
-var calculate_age = function(birth) {
-	var ageMS = Date.parse(Date()) - Date.parse(birth);
-	var age = new Date();
+let calculate_age = function(birth) {
+	let ageMS = Date.parse(Date()) - Date.parse(birth);
+	let age = new Date();
 	age.setTime(ageMS);
-	var years =  age.getFullYear() - 1970;
-	return  years + " Year(s) " + age.getMonth() + " Month(s) " + age.getDate() + " Day(s)";
+	let years =  age.getFullYear() - 1970;
+	return  years + ' Year(s) ' + age.getMonth() + ' Month(s) ' + age.getDate() + ' Day(s)';
 };
 
 // List Stock items
-cur_frm.set_query("item_code", "items", function() {
+cur_frm.set_query('item_code', 'items', function() {
 	return {
 		filters: {
 			is_stock_item:1
diff --git a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py
index 510849f..ea53030 100644
--- a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py
+++ b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py
@@ -14,6 +14,7 @@
 
 class ClinicalProcedure(Document):
 	def validate(self):
+		self.set_status()
 		if self.consume_stock and not self.status == 'Draft':
 			if not self.warehouse:
 				frappe.throw(_("Set warehouse for Procedure {0} ").format(self.name))
@@ -42,6 +43,15 @@
 			frappe.db.set_value("Clinical Procedure", self.name, "sample", sample_collection.name)
 		self.reload()
 
+	def set_status(self):
+		if self.docstatus == 0:
+			self.status = 'Draft'
+		elif self.docstatus == 1:
+			if self.status not in ['In Progress', 'Completed']:
+				self.status = 'Pending'
+		elif self.docstatus == 2:
+			self.status = 'Cancelled'
+
 	def complete(self):
 		if self.consume_stock and self.items:
 			create_stock_entry(self)
@@ -83,7 +93,7 @@
 			self.status = 'In Progress'
 			insert_clinical_procedure_to_medical_record(self)
 		else:
-			self.status = 'Draft'
+			self.status = 'Pending'
 		self.save()
 
 	def set_actual_qty(self):
diff --git a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure_list.js b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure_list.js
new file mode 100644
index 0000000..44646a2
--- /dev/null
+++ b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure_list.js
@@ -0,0 +1,11 @@
+frappe.listview_settings['Clinical Procedure'] = {
+	get_indicator: function(doc) {
+		var colors = {
+			'Completed': 'green',
+            'In Progress': 'orange',
+            'Pending': 'orange',
+            'Cancelled': 'grey'
+		};
+		return [__(doc.status), colors[doc.status], 'status,=,' + doc.status];
+	}
+};
diff --git a/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.json b/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.json
index a93f69f..9cfd682 100644
--- a/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.json
+++ b/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.json
@@ -47,6 +47,7 @@
    "fieldtype": "Data",
    "label": "Item Code",
    "options": "Item",
+   "read_only_depends_on": "eval: !doc.__islocal ",
    "reqd": 1
   },
   {
@@ -175,7 +176,7 @@
   }
  ],
  "links": [],
- "modified": "2020-02-28 13:20:23.692613",
+ "modified": "2020-02-28 14:16:13.184981",
  "modified_by": "Administrator",
  "module": "Healthcare",
  "name": "Clinical Procedure Template",