From 858e026fc07630afea82e0a1e1d724c0eaeadbd0 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Wed, 1 Aug 2018 13:26:23 +0530 Subject: [PATCH] Lab Test - Create Multiple from Sales Invoice or from Patient Encounter --- .../healthcare/doctype/lab_test/lab_test.py | 95 +++++++++++++++++++ .../doctype/lab_test/lab_test_list.js | 47 +++++++++ 2 files changed, 142 insertions(+) diff --git a/erpnext/healthcare/doctype/lab_test/lab_test.py b/erpnext/healthcare/doctype/lab_test/lab_test.py index 3d78fcdf1bf..f710b83f192 100644 --- a/erpnext/healthcare/doctype/lab_test/lab_test.py +++ b/erpnext/healthcare/doctype/lab_test/lab_test.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import frappe +from frappe import _ from frappe.model.document import Document from frappe.utils import getdate, cstr @@ -59,6 +60,100 @@ def update_status(status, name): def update_lab_test_print_sms_email_status(print_sms_email, name): frappe.db.set_value("Lab Test",name,print_sms_email,1) +@frappe.whitelist() +def create_multiple(doctype, docname): + lab_test_created = False + if doctype == "Sales Invoice": + lab_test_created = create_lab_test_from_invoice(docname) + elif doctype == "Patient Encounter": + lab_test_created = create_lab_test_from_encounter(docname) + + if lab_test_created: + frappe.msgprint(_("Lab Test(s) "+lab_test_created+" created.")) + else: + frappe.msgprint(_("No Lab Test created")) + +def create_lab_test_from_encounter(encounter_id): + lab_test_created = False + encounter = frappe.get_doc("Patient Encounter", encounter_id) + + lab_test_ids = frappe.db.sql("""select lp.name, lp.test_code, lp.invoiced + from `tabPatient Encounter` et, `tabLab Prescription` lp + where et.patient=%s and lp.parent=%s and + lp.parent=et.name and lp.test_created=0 and et.docstatus=1""", (encounter.patient, encounter_id)) + + if lab_test_ids: + patient = frappe.get_doc("Patient", encounter.patient) + for lab_test_id in lab_test_ids: + template = get_lab_test_template(lab_test_id[1]) + if template: + lab_test = create_lab_test_doc(lab_test_id[2], encounter.practitioner, patient, template) + lab_test.save(ignore_permissions = True) + frappe.db.set_value("Lab Prescription", lab_test_id[0], "test_created", 1) + if not lab_test_created: + lab_test_created = lab_test.name + else: + lab_test_created += ", "+lab_test.name + return lab_test_created + + +def create_lab_test_from_invoice(invoice_name): + lab_test_created = False + invoice = frappe.get_doc("Sales Invoice", invoice_name) + if invoice.patient: + patient = frappe.get_doc("Patient", invoice.patient) + for item in invoice.items: + test_created = 0 + if item.reference_dt == "Lab Prescription": + test_created = frappe.db.get_value("Lab Prescription", item.reference_dn, "test_created") + elif item.reference_dt == "Lab Test": + test_created = 1 + if test_created != 1: + template = get_lab_test_template(item.item_code) + if template: + lab_test = create_lab_test_doc(True, invoice.ref_practitioner, patient, template) + lab_test.save(ignore_permissions = True) + frappe.db.set_value("Sales Invoice Item", item.name, "reference_dt", "Lab Test") + frappe.db.set_value("Sales Invoice Item", item.name, "reference_dn", lab_test.name) + if not lab_test_created: + lab_test_created = lab_test.name + else: + lab_test_created += ", "+lab_test.name + return lab_test_created + +def get_lab_test_template(item): + template_id = check_template_exists(item) + if template_id: + return frappe.get_doc("Lab Test Template", template_id) + return False + +def check_template_exists(item): + template_exists = frappe.db.exists( + "Lab Test Template", + { + 'item': item + } + ) + if template_exists: + return template_exists + return False + +def create_lab_test_doc(invoiced, practitioner, patient, template): + lab_test = frappe.new_doc("Lab Test") + lab_test.invoiced = invoiced + lab_test.practitioner = practitioner + lab_test.patient = patient.name + lab_test.patient_age = patient.get_age() + lab_test.patient_sex = patient.sex + lab_test.email = patient.email + lab_test.mobile = patient.mobile + lab_test.department = template.department + lab_test.template = template.name + lab_test.test_group = template.test_group + lab_test.result_date = getdate() + lab_test.report_preference = patient.report_preference + return lab_test + def create_normals(template, lab_test): lab_test.normal_toggle = "1" normal = lab_test.append("normal_test_items") diff --git a/erpnext/healthcare/doctype/lab_test/lab_test_list.js b/erpnext/healthcare/doctype/lab_test/lab_test_list.js index 1d65e5be666..1f6a12f935f 100644 --- a/erpnext/healthcare/doctype/lab_test/lab_test_list.js +++ b/erpnext/healthcare/doctype/lab_test/lab_test_list.js @@ -11,5 +11,52 @@ frappe.listview_settings['Lab Test'] = { if(doc.status=="Rejected"){ return [__("Rejected"), "yellow", "status,=,Rejected"]; } + }, + onload: function(listview) { + listview.page.add_menu_item(__("Create Multiple"), function() { + create_multiple_dialog(listview); + }); } }; + +var create_multiple_dialog = function(listview){ + var dialog = new frappe.ui.Dialog({ + title: 'Create Multiple Lab Test', + width: 100, + fields: [ + {fieldtype: "Link", label: "Patient", fieldname: "patient", options: "Patient", reqd: 1}, + {fieldtype: "Select", label: "Invoice / Patient Encounter", fieldname: "doctype", + options: "\nSales Invoice\nPatient Encounter", reqd: 1}, + {fieldtype: "Dynamic Link", fieldname: "docname", options: "doctype", reqd: 1, + get_query: function(){ + return { + filters: { + "patient": dialog.get_value("patient"), + "docstatus": 1 + } + }; + } + } + ], + primary_action_label: __("Create Lab Test"), + primary_action : function(){ + frappe.call({ + method: 'erpnext.healthcare.doctype.lab_test.lab_test.create_multiple', + args:{ + 'doctype': dialog.get_value("doctype"), + 'docname': dialog.get_value("docname") + }, + callback: function(data) { + if(!data.exc){ + listview.refresh(); + } + }, + freeze: true, + freeze_message: "Creating Lab Test..." + }); + dialog.hide(); + } + }); + + dialog.show(); +};