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):