fix: set consumable entries on client side and not on validate
diff --git a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js
index 1e2cb10..40f9c1c 100644
--- a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js
+++ b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js
@@ -198,22 +198,10 @@
 				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) {
-						frappe.call({
-							method: 'frappe.client.get_value',
-							args: {
-								doctype: 'Stock Settings',
-								fieldname: 'default_warehouse'
-							},
-							callback: function (data) {
-								frm.set_value('warehouse', data.message.default_warehouse);
-							}
-						});
-					}
+					frm.events.set_warehouse(frm);
+					frm.events.set_procedure_consumables(frm);
 				}
 			});
-		} else {
-			frm.set_value('consume_stock', 0);
 		}
 	},
 
@@ -248,7 +236,50 @@
 				}
 			});
 		}
+	},
+
+	set_warehouse: function(frm) {
+		if (!frm.doc.warehouse) {
+			frappe.call({
+				method: 'frappe.client.get_value',
+				args: {
+					doctype: 'Stock Settings',
+					fieldname: 'default_warehouse'
+				},
+				callback: function (data) {
+					frm.set_value('warehouse', data.message.default_warehouse);
+				}
+			});
+		}
+	},
+
+	set_procedure_consumables: function(frm) {
+		frappe.call({
+			method: 'erpnext.healthcare.doctype.clinical_procedure.clinical_procedure.get_procedure_consumables',
+			args: {
+				procedure_template: frm.doc.procedure_template
+			},
+			callback: function(data) {
+				if (data.message) {
+					frm.doc.items = []
+					$.each(data.message, function(i, v) {
+						let item = frm.add_child('items');
+						item.item_code = v.item_code;
+						item.item_name = v.item_name;
+						item.uom = v.uom;
+						item.stock_uom = v.stock_uom;
+						item.qty = flt(v.qty);
+						item.transfer_qty = v.transfer_qty;
+						item.conversion_factor = v.conversion_factor;
+						item.invoice_separately_as_consumables = v.invoice_separately_as_consumables;
+						item.batch_no = v.batch_no;
+					});
+					refresh_field('items');
+				}
+			}
+		});
 	}
+
 });
 
 cur_frm.set_query('procedure_template', function(doc) {
diff --git a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py
index f45ea78..708e041 100644
--- a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py
+++ b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py
@@ -15,7 +15,7 @@
 class ClinicalProcedure(Document):
 	def validate(self):
 		self.set_status()
-		if self.consume_stock and not self.status == 'Draft':
+		if self.consume_stock:
 			if not self.warehouse:
 				frappe.throw(_('Set warehouse for Procedure {0} ').format(self.name))
 			self.set_actual_qty()
@@ -28,7 +28,6 @@
 
 	def before_insert(self):
 		if self.consume_stock:
-			set_stock_items(self, self.procedure_template, 'Clinical Procedure Template')
 			self.set_actual_qty()
 
 	def after_insert(self):
@@ -145,11 +144,17 @@
 		'posting_time': nowtime()
 	}).get('qty_after_transaction') or 0
 
+
+@frappe.whitelist()
+def get_procedure_consumables(procedure_template):
+	return get_items('Clinical Procedure Item', procedure_template, 'Clinical Procedure Template')
+
+
 @frappe.whitelist()
 def set_stock_items(doc, stock_detail_parent, parenttype):
-	item_dict = get_item_dict('Clinical Procedure Item', stock_detail_parent, parenttype)
+	items = get_items('Clinical Procedure Item', stock_detail_parent, parenttype)
 
-	for d in item_dict:
+	for d in items:
 		se_child = doc.append('items')
 		se_child.item_code = d['item_code']
 		se_child.item_name = d['item_name']
@@ -165,10 +170,13 @@
 			se_child.invoice_separately_as_consumables = d['invoice_separately_as_consumables']
 	return doc
 
-def get_item_dict(table, parent, parenttype):
-	query = '''select * from `tab{table}` where parent = '{parent}' and parenttype = '{parenttype}' '''
+def get_items(table, parent, parenttype):
+	items = frappe.db.get_all(table, filters={
+		'parent': parent,
+		'parenttype': parenttype
+	}, fields=['*'])
 
-	return frappe.db.sql(query.format(table=table, parent=parent, parenttype=parenttype), as_dict=True)
+	return items
 
 @frappe.whitelist()
 def make_stock_entry(doc):