From 9565e62e3ab01027842797ded03911bcec707da5 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Mon, 2 Mar 2020 12:11:38 +0530 Subject: [PATCH] refactor: Clinical Procedure code --- .../clinical_procedure/clinical_procedure.js | 2 +- .../clinical_procedure.json | 51 ++++++++++--------- .../clinical_procedure/clinical_procedure.py | 50 ++++++++++-------- .../clinical_procedure_item.json | 7 +-- .../clinical_procedure_template.js | 8 ++- .../clinical_procedure_template.py | 50 +++++++++--------- .../patient_appointment.js | 2 +- 7 files changed, 93 insertions(+), 77 deletions(-) diff --git a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js index 40f9c1cdda..2d17f751ef 100644 --- a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js +++ b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js @@ -110,7 +110,7 @@ frappe.ui.form.on('Clinical Procedure', { function() { frappe.call({ doc: frm.doc, - method: 'make_material_transfer', + method: 'make_material_receipt', callback: function(r) { if (!r.exc) { cur_frm.reload_doc(); diff --git a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.json b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.json index 2c5cd5a610..3c936bbf27 100644 --- a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.json +++ b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.json @@ -27,13 +27,15 @@ "invoiced", "notes", "company", + "consumables_section", "consume_stock", - "consumables", "items", + "section_break_24", "invoice_separately_as_consumables", - "consumable_total_amount", - "consumption_details", "consumption_invoiced", + "consumable_total_amount", + "column_break_27", + "consumption_details", "amended_from" ], "fields": [ @@ -65,8 +67,7 @@ "in_list_view": 1, "label": "Patient", "options": "Patient", - "reqd": 1, - "set_only_once": 1 + "reqd": 1 }, { "fieldname": "patient_age", @@ -124,28 +125,25 @@ "fieldname": "warehouse", "fieldtype": "Link", "label": "Warehouse", - "options": "Warehouse", - "set_only_once": 1 + "mandatory_depends_on": "eval: doc.consume_stock == 1", + "options": "Warehouse" }, { "default": "Today", "fieldname": "start_date", "fieldtype": "Date", - "label": "Start Date", - "set_only_once": 1 + "label": "Start Date" }, { "fieldname": "start_time", "fieldtype": "Time", - "label": "Time", - "read_only": 1 + "label": "Start Time" }, { "fieldname": "sample", "fieldtype": "Link", "label": "Sample", - "options": "Sample Collection", - "read_only": 1 + "options": "Sample Collection" }, { "default": "0", @@ -164,7 +162,6 @@ { "fieldname": "company", "fieldtype": "Link", - "hidden": 1, "label": "Company", "options": "Company" }, @@ -172,15 +169,8 @@ "default": "0", "fieldname": "consume_stock", "fieldtype": "Check", - "hidden": 1, "label": "Consume Stock" }, - { - "depends_on": "eval:doc.consume_stock == 1", - "fieldname": "consumables", - "fieldtype": "Section Break", - "label": "Consumables" - }, { "fieldname": "items", "fieldtype": "Table", @@ -191,7 +181,8 @@ "default": "0", "fieldname": "invoice_separately_as_consumables", "fieldtype": "Check", - "label": "Consumables Invoice Separately", + "hidden": 1, + "label": "Invoice Consumables Separately", "read_only": 1 }, { @@ -212,6 +203,7 @@ "depends_on": "invoice_separately_as_consumables", "fieldname": "consumption_invoiced", "fieldtype": "Check", + "hidden": 1, "label": "Consumption Invoiced", "read_only": 1 }, @@ -232,11 +224,24 @@ "options": "Clinical Procedure", "print_hide": 1, "read_only": 1 + }, + { + "fieldname": "consumables_section", + "fieldtype": "Section Break", + "label": "Consumables" + }, + { + "fieldname": "column_break_27", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_24", + "fieldtype": "Section Break" } ], "is_submittable": 1, "links": [], - "modified": "2020-02-28 15:02:09.344548", + "modified": "2020-03-02 11:44:27.970651", "modified_by": "Administrator", "module": "Healthcare", "name": "Clinical Procedure", diff --git a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py index 708e041689..99a4b91bde 100644 --- a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py +++ b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.py @@ -11,19 +11,18 @@ from erpnext.healthcare.doctype.healthcare_settings.healthcare_settings import g from erpnext.healthcare.doctype.lab_test.lab_test import create_sample_doc from erpnext.stock.stock_ledger import get_previous_sle from erpnext.stock.get_item_details import get_item_details +from frappe.model.mapper import get_mapped_doc class ClinicalProcedure(Document): def validate(self): self.set_status() if self.consume_stock: - if not self.warehouse: - frappe.throw(_('Set warehouse for Procedure {0} ').format(self.name)) self.set_actual_qty() if self.items: self.invoice_separately_as_consumables = False for item in self.items: - if item.invoice_separately_as_consumables == 1: + if item.invoice_separately_as_consumables: self.invoice_separately_as_consumables = True def before_insert(self): @@ -90,7 +89,7 @@ class ClinicalProcedure(Document): frappe.db.set_value('Clinical Procedure', self.name, 'status', 'Completed') if self.consume_stock and self.items: - return stock_entry.name + return stock_entry def start_procedure(self): allow_start = self.set_actual_qty() @@ -101,7 +100,7 @@ class ClinicalProcedure(Document): return 'insufficient stock' def set_actual_qty(self): - allow_negative_stock = cint(frappe.db.get_value('Stock Settings', None, 'allow_negative_stock')) + allow_negative_stock = frappe.db.get_single_value('Stock Settings', 'allow_negative_stock') allow_start = True for d in self.get('items'): @@ -109,10 +108,11 @@ class ClinicalProcedure(Document): # validate qty if not allow_negative_stock and d.actual_qty < d.qty: allow_start = False + break return allow_start - def make_material_transfer(self): + def make_material_receipt(self): stock_entry = frappe.new_doc('Stock Entry') stock_entry.stock_entry_type = 'Material Receipt' @@ -125,7 +125,7 @@ class ClinicalProcedure(Document): se_child.item_name = item.item_name se_child.uom = item.uom se_child.stock_uom = item.stock_uom - se_child.qty = flt(item.qty-item.actual_qty) + se_child.qty = flt(item.qty - item.actual_qty) se_child.t_warehouse = self.warehouse # in stock uom se_child.transfer_qty = flt(item.transfer_qty) @@ -154,22 +154,24 @@ def get_procedure_consumables(procedure_template): def set_stock_items(doc, stock_detail_parent, parenttype): items = get_items('Clinical Procedure Item', stock_detail_parent, parenttype) - for d in items: + for item in items: se_child = doc.append('items') - se_child.item_code = d['item_code'] - se_child.item_name = d['item_name'] - se_child.uom = d['uom'] - se_child.stock_uom = d['stock_uom'] - se_child.qty = flt(d['qty']) + se_child.item_code = item.item_code + se_child.item_name = item.item_name + se_child.uom = item.uom + se_child.stock_uom = item.stock_uom + se_child.qty = flt(item.qty) # in stock uom - se_child.transfer_qty = flt(d['transfer_qty']) - se_child.conversion_factor = flt(d['conversion_factor']) - if d['batch_no']: - se_child.batch_no = d['batch_no'] + se_child.transfer_qty = flt(item.transfer_qty) + se_child.conversion_factor = flt(item.conversion_factor) + if item.batch_no: + se_child.batch_no = item.batch_no if parenttype == 'Clinical Procedure Template': - se_child.invoice_separately_as_consumables = d['invoice_separately_as_consumables'] + se_child.invoice_separately_as_consumables = item.invoice_separately_as_consumables + return doc + def get_items(table, parent, parenttype): items = frappe.db.get_all(table, filters={ 'parent': parent, @@ -178,6 +180,7 @@ def get_items(table, parent, parenttype): return items + @frappe.whitelist() def make_stock_entry(doc): stock_entry = frappe.new_doc('Stock Entry') @@ -194,8 +197,10 @@ def make_stock_entry(doc): stock_entry.save(ignore_permissions=True) stock_entry.submit() - return stock_entry + return stock_entry.name + +@frappe.whitelist() def make_procedure(source_name, target_doc=None): def set_missing_values(source, target): consume_stock = frappe.db.get_value('Clinical Procedure Template', source.procedure_template, 'consume_stock') @@ -209,6 +214,8 @@ def make_procedure(source_name, target_doc=None): if warehouse: target.warehouse = warehouse + set_stock_items(target, source.procedure_template, 'Clinical Procedure Template') + doc = get_mapped_doc('Patient Appointment', source_name, { 'Patient Appointment': { 'doctype': 'Clinical Procedure', @@ -233,12 +240,13 @@ def make_procedure(source_name, target_doc=None): return doc + def insert_clinical_procedure_to_medical_record(doc): subject = cstr(doc.procedure_template) if doc.practitioner: - subject += ' '+doc.practitioner + subject += ' ' + doc.practitioner if subject and doc.notes: - subject += '
'+doc.notes + subject += '
' + doc.notes medical_record = frappe.new_doc('Patient Medical Record') medical_record.patient = doc.patient diff --git a/erpnext/healthcare/doctype/clinical_procedure_item/clinical_procedure_item.json b/erpnext/healthcare/doctype/clinical_procedure_item/clinical_procedure_item.json index 4d0502b2d5..a7dde0bcd0 100644 --- a/erpnext/healthcare/doctype/clinical_procedure_item/clinical_procedure_item.json +++ b/erpnext/healthcare/doctype/clinical_procedure_item/clinical_procedure_item.json @@ -7,9 +7,9 @@ "engine": "InnoDB", "field_order": [ "item_code", - "barcode", "item_name", "qty", + "barcode", "uom", "invoice_separately_as_consumables", "column_break_5", @@ -42,7 +42,8 @@ "fieldname": "item_name", "fieldtype": "Data", "in_list_view": 1, - "label": "Item Name" + "label": "Item Name", + "read_only": 1 }, { "fieldname": "qty", @@ -108,7 +109,7 @@ ], "istable": 1, "links": [], - "modified": "2020-02-28 13:15:09.058073", + "modified": "2020-03-01 15:34:54.226722", "modified_by": "Administrator", "module": "Healthcare", "name": "Clinical Procedure Item", diff --git a/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.js b/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.js index 181881e238..57f4cdf3b2 100644 --- a/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.js +++ b/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.js @@ -117,17 +117,15 @@ frappe.ui.form.on('Clinical Procedure Item', { let args = { 'item_code' : d.item_code, 'transfer_qty' : d.transfer_qty, - 'company' : frm.doc.company, 'quantity' : d.qty }; return frappe.call({ - doc: frm.doc, - method: 'get_item_details', - args: args, + method: 'erpnext.healthcare.doctype.clinical_procedure_template.clinical_procedure_template.get_item_details', + args: {args: args}, callback: function(r) { if (r.message) { let d = locals[cdt][cdn]; - $.each(r.message, function(k, v){ + $.each(r.message, function(k, v) { d[k] = v; }); refresh_field('items'); diff --git a/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.py b/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.py index ebf6afdc9b..ec9a4cbcd0 100644 --- a/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.py +++ b/erpnext/healthcare/doctype/clinical_procedure_template/clinical_procedure_template.py @@ -34,29 +34,6 @@ class ClinicalProcedureTemplate(Document): except Exception: frappe.throw(_('Not permitted. Please disable the Procedure Template'), title='Not Permitted') - def get_item_details(self, args=None): - item = frappe.db.get_all('Item', - filters={ - 'disabled': 0, - 'name': args.get('item_code') - }, - fields=['stock_uom', 'item_name'] - ) - - if not item: - frappe.throw(_('Item {0} is not active').format(args.get('item_code'))) - - item = item[0] - ret = { - 'uom' : item.stock_uom, - 'stock_uom' : item.stock_uom, - 'item_name' : item.item_name, - 'quantity' : 0, - 'transfer_qty' : 0, - 'conversion_factor' : 1 - } - return ret - def update_item_and_item_price(self): if self.is_billable and self.item: item_doc = frappe.get_doc('Item', {'item_code': self.item}) @@ -79,6 +56,33 @@ class ClinicalProcedureTemplate(Document): self.reload() +@frappe.whitelist() +def get_item_details(args=None): + if not isinstance(args, dict): + args = json.loads(args) + + item = frappe.db.get_all('Item', + filters={ + 'disabled': 0, + 'name': args.get('item_code') + }, + fields=['stock_uom', 'item_name'] + ) + + if not item: + frappe.throw(_('Item {0} is not active').format(args.get('item_code'))) + + item = item[0] + ret = { + 'uom': item.stock_uom, + 'stock_uom': item.stock_uom, + 'item_name': item.item_name, + 'qty': 1, + 'transfer_qty': 0, + 'conversion_factor': 1 + } + return ret + def create_item_from_template(doc): disabled = doc.disabled if doc.is_billable and not doc.disabled: diff --git a/erpnext/healthcare/doctype/patient_appointment/patient_appointment.js b/erpnext/healthcare/doctype/patient_appointment/patient_appointment.js index 133fee1ce8..f9f66680b9 100644 --- a/erpnext/healthcare/doctype/patient_appointment/patient_appointment.js +++ b/erpnext/healthcare/doctype/patient_appointment/patient_appointment.js @@ -90,7 +90,7 @@ frappe.ui.form.on('Patient Appointment', { if (frm.doc.procedure_template) { frm.add_custom_button(__('Clinical Procedure'), function(){ frappe.model.open_mapped_doc({ - method: 'erpnext.healthcare.doctype.clinical_procedure.clinical_procedure.create_procedure', + method: 'erpnext.healthcare.doctype.clinical_procedure.clinical_procedure.make_procedure', frm: frm, }); }, __('Create'));