From 425fb4c5f4ad87de3d8dec20c7d0fceae44015f3 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Mon, 23 Jul 2018 13:05:35 +0530 Subject: [PATCH] [Feature][Enhance] Healthcare Inpatient (#14940) * New DocTypes - Inpatient Record and Healthcare Service Unit Type * Patient Appointment - Button - Get Prescribed Procedure - hide after save * Patient Encounter - Schedule Inpatient button * Inpatient - Healthcare Fields and references Conflicts: erpnext/healthcare/doctype/lab_test/lab_test.json erpnext/healthcare/doctype/patient_appointment/patient_appointment.json erpnext/healthcare/doctype/patient_encounter/patient_encounter.json erpnext/healthcare/doctype/vital_signs/vital_signs.json * Healthcare Service Unit Type - Item Creation - UOM Fix * Healthcare Service Unit - healthcare service unit type fix * Inpatient Record - Admission Scheduled and Discharge Scheduled status * Patient - rename field inpatient to inpatient_status * Inpatient Record - rename field inpatient to status * Refactor - Inpateint Occupancy * Remove unused imports * Healthcare service unit - patch - fix * Healthcare IP - Codacy Fix * Inpatient Record - Encounter and Practitioner References * Patch - add healthcare service unit tree - enhance * Healthcare Setup - Remove - Lab Test and Item creation * Discharge note in Inpatient Record * Codacy fix * Inpatient Record - Update transfer service unit filter * Inpatient Record - Test --- erpnext/config/healthcare.py | 10 + .../clinical_procedure.json | 57 +- .../healthcare_service_unit.js | 7 +- .../healthcare_service_unit.json | 139 ++- .../healthcare_service_unit.py | 11 +- .../healthcare_service_unit_type/__init__.py | 0 .../healthcare_service_unit_type.js | 119 +++ .../healthcare_service_unit_type.json | 554 ++++++++++ .../healthcare_service_unit_type.py | 109 ++ .../test_healthcare_service_unit_type.js | 23 + .../test_healthcare_service_unit_type.py | 8 + .../doctype/inpatient_occupancy/__init__.py | 0 .../inpatient_occupancy.json | 170 +++ .../inpatient_occupancy.py | 9 + .../doctype/inpatient_record/__init__.py | 0 .../inpatient_record/inpatient_record.js | 185 ++++ .../inpatient_record/inpatient_record.json | 977 ++++++++++++++++++ .../inpatient_record/inpatient_record.py | 142 +++ .../inpatient_record_dashboard.py | 16 + .../inpatient_record/test_inpatient_record.js | 23 + .../inpatient_record/test_inpatient_record.py | 93 ++ .../healthcare/doctype/lab_test/lab_test.json | 39 +- .../healthcare/doctype/patient/patient.json | 111 +- .../patient_appointment.js | 1 + .../patient_appointment.json | 39 +- .../patient_encounter/patient_encounter.js | 51 +- .../patient_encounter/patient_encounter.json | 39 +- .../sample_collection/sample_collection.json | 95 +- .../doctype/vital_signs/vital_signs.json | 39 +- erpnext/healthcare/setup.py | 71 +- .../add_healthcare_service_unit_tree_root.py | 5 +- 31 files changed, 3019 insertions(+), 123 deletions(-) create mode 100644 erpnext/healthcare/doctype/healthcare_service_unit_type/__init__.py create mode 100644 erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.js create mode 100644 erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.json create mode 100644 erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.py create mode 100644 erpnext/healthcare/doctype/healthcare_service_unit_type/test_healthcare_service_unit_type.js create mode 100644 erpnext/healthcare/doctype/healthcare_service_unit_type/test_healthcare_service_unit_type.py create mode 100644 erpnext/healthcare/doctype/inpatient_occupancy/__init__.py create mode 100644 erpnext/healthcare/doctype/inpatient_occupancy/inpatient_occupancy.json create mode 100644 erpnext/healthcare/doctype/inpatient_occupancy/inpatient_occupancy.py create mode 100644 erpnext/healthcare/doctype/inpatient_record/__init__.py create mode 100644 erpnext/healthcare/doctype/inpatient_record/inpatient_record.js create mode 100644 erpnext/healthcare/doctype/inpatient_record/inpatient_record.json create mode 100644 erpnext/healthcare/doctype/inpatient_record/inpatient_record.py create mode 100644 erpnext/healthcare/doctype/inpatient_record/inpatient_record_dashboard.py create mode 100644 erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.js create mode 100644 erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py diff --git a/erpnext/config/healthcare.py b/erpnext/config/healthcare.py index ae36f9c93c..e55f736481 100644 --- a/erpnext/config/healthcare.py +++ b/erpnext/config/healthcare.py @@ -38,6 +38,11 @@ def get_data(): "type": "doctype", "name": "Clinical Procedure", "label": _("Clinical Procedure"), + }, + { + "type": "doctype", + "name": "Inpatient Record", + "label": _("Inpatient Record"), } ] }, @@ -167,6 +172,11 @@ def get_data(): "type": "doctype", "name": "Clinical Procedure Template", "label": _("Clinical Procedure Template"), + }, + { + "type": "doctype", + "name": "Healthcare Service Unit Type", + "label": _("Healthcare Service Unit Type") } ] } diff --git a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.json b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.json index c687393b32..c316ba71a2 100644 --- a/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.json +++ b/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.json @@ -15,6 +15,41 @@ "fields": [ { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.inpatient_record", + "fieldname": "inpatient_record", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Record", + "length": 0, + "no_copy": 0, + "options": "Inpatient Record", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -47,6 +82,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -79,10 +115,12 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, + "fetch_from": "inpatient_record.patient", "fieldname": "patient", "fieldtype": "Link", "hidden": 0, @@ -111,6 +149,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -142,6 +181,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -173,6 +213,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -205,6 +246,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -237,6 +279,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -267,6 +310,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -299,6 +343,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -331,6 +376,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -363,6 +409,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -394,6 +441,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -426,6 +474,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -457,6 +506,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -488,6 +538,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -520,6 +571,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -553,6 +605,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -585,6 +638,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -617,6 +671,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -659,7 +714,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-04 11:23:32.884076", + "modified": "2018-07-12 19:18:30.400534", "modified_by": "Administrator", "module": "Healthcare", "name": "Clinical Procedure", diff --git a/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.js b/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.js index e9665151d6..8480a526b4 100644 --- a/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.js +++ b/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.js @@ -17,6 +17,7 @@ frappe.ui.form.on('Healthcare Service Unit', { }, refresh: function(frm) { frm.trigger("set_root_readonly"); + frm.set_df_property("service_unit_type", "reqd", 1); frm.add_custom_button(__("Healthcare Service Unit Tree"), function() { frappe.set_route("Tree", "Healthcare Service Unit"); }); @@ -35,8 +36,12 @@ frappe.ui.form.on('Healthcare Service Unit', { } }, is_group: function(frm) { - if(frm.doc.is_group){ + if(frm.doc.is_group == 1){ frm.set_value("allow_appointments", false); + frm.set_df_property("service_unit_type", "reqd", 0); + } + else{ + frm.set_df_property("service_unit_type", "reqd", 1); } } }); diff --git a/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.json b/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.json index dbb5b20fd6..945817c8d3 100644 --- a/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.json +++ b/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.json @@ -15,6 +15,7 @@ "fields": [ { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -46,6 +47,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -78,10 +80,13 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, "columns": 0, + "default": "0", + "depends_on": "eval:doc.inpatient_occupancy != 1 && doc.allow_appointments != 1", "fieldname": "is_group", "fieldtype": "Check", "hidden": 0, @@ -109,11 +114,48 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.is_group != 1", + "fieldname": "service_unit_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Service Unit Type", + "length": 0, + "no_copy": 0, + "options": "Healthcare Service Unit Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.is_group != 1", + "default": "0", + "depends_on": "eval:doc.is_group != 1 && doc.inpatient_occupancy != 1", + "fetch_from": "service_unit_type.allow_appointments", "fieldname": "allow_appointments", "fieldtype": "Check", "hidden": 0, @@ -125,12 +167,12 @@ "in_standard_filter": 0, "label": "Allow Appointments", "length": 0, - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -141,11 +183,14 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, - "bold": 1, + "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.is_group != 1 && doc.allow_appointments == 1", + "default": "0", + "depends_on": "eval:doc.is_group != 1 && doc.allow_appointments == 1 && doc.inpatient_occupany != 1", + "fetch_from": "service_unit_type.overlap_appointments", "fieldname": "overlap_appointments", "fieldtype": "Check", "hidden": 0, @@ -157,12 +202,12 @@ "in_standard_filter": 0, "label": "Allow Overlap", "length": 0, - "no_copy": 0, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -173,6 +218,76 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "default": "0", + "depends_on": "eval:doc.allow_appointments != 1 && doc.is_group != 1", + "fetch_from": "service_unit_type.inpatient_occupancy", + "fieldname": "inpatient_occupancy", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Occupancy", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "depends_on": "eval:doc.inpatient_occupancy == 1", + "fieldname": "occupied", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Occupied", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -189,7 +304,7 @@ "in_standard_filter": 0, "label": "Warehouse", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Warehouse", "permlevel": 0, "precision": "", @@ -206,6 +321,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -238,6 +354,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -269,6 +386,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -300,6 +418,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -341,7 +460,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-04 11:20:16.942603", + "modified": "2018-07-17 17:40:18.867327", "modified_by": "Administrator", "module": "Healthcare", "name": "Healthcare Service Unit", @@ -417,4 +536,4 @@ "title_field": "healthcare_service_unit_name", "track_changes": 1, "track_seen": 0 -} +} \ No newline at end of file diff --git a/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.py b/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.py index 21b0e6e727..89adbf849a 100644 --- a/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.py +++ b/erpnext/healthcare/doctype/healthcare_service_unit/healthcare_service_unit.py @@ -14,8 +14,9 @@ class HealthcareServiceUnit(NestedSet): self.validate_one_root() def validate(self): - if self.is_group: - self.allow_appointments = False - self.overlap_appointments = False - elif not self.allow_appointments: - self.overlap_appointments = False + if self.is_group == 1: + self.allow_appointments = 0 + self.overlap_appointments = 0 + self.inpatient_occupancy = 0 + elif self.allow_appointments != 1: + self.overlap_appointments = 0 diff --git a/erpnext/healthcare/doctype/healthcare_service_unit_type/__init__.py b/erpnext/healthcare/doctype/healthcare_service_unit_type/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.js b/erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.js new file mode 100644 index 0000000000..84255b2930 --- /dev/null +++ b/erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.js @@ -0,0 +1,119 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Healthcare Service Unit Type', { + service_unit_type: function(frm) { + set_item_details(frm); + if(!frm.doc.__islocal){ + frm.doc.change_in_item = 1; + } + }, + is_billable: function(frm) { + set_item_details(frm); + }, + refresh: function(frm) { + frm.set_df_property("item_code", "read_only", frm.doc.__islocal ? 0 : 1); + if(!frm.doc.__islocal) { + frm.add_custom_button(__('Change Item Code'), function() { + change_item_code(cur_frm,frm.doc); + } ); + if(frm.doc.disabled == 1){ + frm.add_custom_button(__('Enable'), function() { + enable(cur_frm); + } ); + } + else{ + frm.add_custom_button(__('Disable'), function() { + disable(cur_frm); + } ); + } + } + }, + rate: function(frm) { + if(!frm.doc.__islocal){ + frm.doc.change_in_item = 1; + } + }, + item_group: function(frm) { + if(!frm.doc.__islocal){ + frm.doc.change_in_item = 1; + } + }, + description: function(frm) { + if(!frm.doc.__islocal){ + frm.doc.change_in_item = 1; + } + } +}); + +var disable = function(frm){ + var doc = frm.doc; + frappe.call({ + method: "erpnext.healthcare.doctype.healthcare_service_unit_type.healthcare_service_unit_type.disable_enable", + args: {status: 1, doc_name: doc.name, item: doc.item, is_billable: doc.is_billable}, + callback: function(){ + cur_frm.reload_doc(); + } + }); +}; + +var enable = function(frm){ + var doc = frm.doc; + frappe.call({ + method: "erpnext.healthcare.doctype.healthcare_service_unit_type.healthcare_service_unit_type.disable_enable", + args: {status: 0, doc_name: doc.name, item: doc.item, is_billable: doc.is_billable}, + callback: function(){ + cur_frm.reload_doc(); + } + }); +}; + +var change_item_code = function(frm, doc){ + var d = new frappe.ui.Dialog({ + title:__("Change Item Code"), + fields:[ + { + "fieldtype": "Data", + "label": "Item Code", + "fieldname": "Item Code", + reqd:1 + }, + { + "fieldtype": "Button", + "label": __("Change Code"), + click: function() { + var values = d.get_values(); + if(!values) + return; + change_item_code_from_unit_type(values["Item Code"], doc); + d.hide(); + } + } + ] + }); + d.show(); + d.set_values({ + 'Item Code': frm.doc.item_code + }); + + var change_item_code_from_unit_type = function(item_code, doc){ + frappe.call({ + "method": "erpnext.healthcare.doctype.healthcare_service_unit_type.healthcare_service_unit_type.change_item_code", + "args": {item: doc.item, item_code: item_code, doc_name: doc.name}, + callback: function () { + frm.reload_doc(); + } + }); + }; +}; + +var set_item_details = function(frm) { + if(frm.doc.service_unit_type && frm.doc.is_billable == 1){ + if(!frm.doc.item_code) + frm.set_value("item_code", frm.doc.service_unit_type); + if(!frm.doc.description) + frm.set_value("description", frm.doc.service_unit_type); + if(!frm.doc.item_group) + frm.set_value("item_group", 'Services'); + } +}; diff --git a/erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.json b/erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.json new file mode 100644 index 0000000000..6394ce7361 --- /dev/null +++ b/erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.json @@ -0,0 +1,554 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:service_unit_type", + "beta": 0, + "creation": "2018-07-11 16:47:51.414675", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "service_unit_type", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Service Unit Type", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "default": "0", + "depends_on": "eval:doc.inpatient_occupancy != 1", + "fieldname": "allow_appointments", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allow Appointments", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "default": "0", + "depends_on": "eval:doc.allow_appointments == 1 && doc.inpatient_occupany != 1", + "fieldname": "overlap_appointments", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allow Overlap", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "default": "0", + "depends_on": "eval:doc.allow_appointments != 1", + "fieldname": "inpatient_occupancy", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Occupancy", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.inpatient_occupancy == 1 && doc.allow_appointments != 1", + "fieldname": "is_billable", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Is Billable", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_billable", + "fieldname": "item_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Item Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "item", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Item", + "length": 0, + "no_copy": 0, + "options": "Item", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "item_code", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Item Code", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "item_group", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Item Group", + "length": 0, + "no_copy": 0, + "options": "Item Group", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "uom", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "UOM", + "length": 0, + "no_copy": 0, + "options": "UOM", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Rate / UOM", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_11", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "disabled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Disabled", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "change_in_item", + "fieldtype": "Check", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Change in Item", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-07-13 16:54:59.131606", + "modified_by": "Administrator", + "module": "Healthcare", + "name": "Healthcare Service Unit Type", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Healthcare Administrator", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "service_unit_type", + "track_changes": 0, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.py b/erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.py new file mode 100644 index 0000000000..e0d380bc5e --- /dev/null +++ b/erpnext/healthcare/doctype/healthcare_service_unit_type/healthcare_service_unit_type.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.model.document import Document + +class HealthcareServiceUnitType(Document): + def after_insert(self): + if self.inpatient_occupancy and self.is_billable: + create_item(self) + + def on_trash(self): + if(self.item): + try: + frappe.delete_doc("Item",self.item) + except Exception: + frappe.throw(_("""Not permitted. Please disable the Service Unit Type""")) + + def on_update(self): + if(self.change_in_item and self.is_billable == 1 and self.item): + updating_item(self) + if not item_price_exist(self): + if(self.test_rate != 0.0): + price_list_name = frappe.db.get_value("Price List", {"selling": 1}) + if(self.test_rate): + make_item_price(self.test_code, price_list_name, self.test_rate) + else: + make_item_price(self.test_code, price_list_name, 0.0) + + frappe.db.set_value(self.doctype,self.name,"change_in_item",0) + elif(self.is_billable == 0 and self.item): + frappe.db.set_value("Item",self.item,"disabled",1) + self.reload() + +def item_price_exist(doc): + item_price = frappe.db.exists({ + "doctype": "Item Price", + "item_code": doc.item_code}) + if(item_price): + return True + else: + return False + +def updating_item(doc): + frappe.db.sql("""update `tabItem` set item_name=%s, item_group=%s, disabled=0, standard_rate=%s, + description=%s, modified=NOW() where item_code=%s""", + (doc.service_unit_type, doc.item_group , doc.rate, doc.description, doc.item)) + +def create_item(doc): + #insert item + item = frappe.get_doc({ + "doctype": "Item", + "item_code": doc.item_code, + "item_name":doc.service_unit_type, + "item_group": doc.item_group, + "description":doc.description, + "is_sales_item": 1, + "is_service_item": 1, + "is_purchase_item": 0, + "is_stock_item": 0, + "show_in_website": 0, + "is_pro_applicable": 0, + "disabled": 0, + "stock_uom": doc.uom + }).insert(ignore_permissions=True) + + #insert item price + #get item price list to insert item price + if(doc.rate != 0.0): + price_list_name = frappe.db.get_value("Price List", {"selling": 1}) + if(doc.rate): + make_item_price(item.name, price_list_name, doc.rate) + item.standard_rate = doc.rate + else: + make_item_price(item.name, price_list_name, 0.0) + item.standard_rate = 0.0 + item.save(ignore_permissions = True) + #Set item to the Doc + frappe.db.set_value("Healthcare Service Unit Type", doc.name, "item", item.name) + + doc.reload() #refresh the doc after insert. + +def make_item_price(item, price_list_name, item_price): + frappe.get_doc({ + "doctype": "Item Price", + "price_list": price_list_name, + "item_code": item, + "price_list_rate": item_price + }).insert(ignore_permissions=True) + +@frappe.whitelist() +def change_item_code(item, item_code, doc_name): + item_exist = frappe.db.exists({ + "doctype": "Item", + "item_code": item_code}) + if(item_exist): + frappe.throw(_("Code {0} already exist").format(item_code)) + else: + frappe.rename_doc("Item", item, item_code, ignore_permissions = True) + frappe.db.set_value("Healthcare Service Unit Type", doc_name, "item_code", item_code) + +@frappe.whitelist() +def disable_enable(status, doc_name, item, is_billable): + frappe.db.set_value("Healthcare Service Unit Type", doc_name, "disabled", status) + if(is_billable == 1): + frappe.db.set_value("Item", item, "disabled", status) diff --git a/erpnext/healthcare/doctype/healthcare_service_unit_type/test_healthcare_service_unit_type.js b/erpnext/healthcare/doctype/healthcare_service_unit_type/test_healthcare_service_unit_type.js new file mode 100644 index 0000000000..6db8f9e9c1 --- /dev/null +++ b/erpnext/healthcare/doctype/healthcare_service_unit_type/test_healthcare_service_unit_type.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Healthcare Service Unit Type", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Healthcare Service Unit Type + () => frappe.tests.make('Healthcare Service Unit Type', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/healthcare/doctype/healthcare_service_unit_type/test_healthcare_service_unit_type.py b/erpnext/healthcare/doctype/healthcare_service_unit_type/test_healthcare_service_unit_type.py new file mode 100644 index 0000000000..3c5b64fd93 --- /dev/null +++ b/erpnext/healthcare/doctype/healthcare_service_unit_type/test_healthcare_service_unit_type.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals +import unittest + +class TestHealthcareServiceUnitType(unittest.TestCase): + pass diff --git a/erpnext/healthcare/doctype/inpatient_occupancy/__init__.py b/erpnext/healthcare/doctype/inpatient_occupancy/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/healthcare/doctype/inpatient_occupancy/inpatient_occupancy.json b/erpnext/healthcare/doctype/inpatient_occupancy/inpatient_occupancy.json new file mode 100644 index 0000000000..2ac498df11 --- /dev/null +++ b/erpnext/healthcare/doctype/inpatient_occupancy/inpatient_occupancy.json @@ -0,0 +1,170 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-07-12 12:07:36.932333", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "service_unit", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Healthcare Service Unit", + "length": 0, + "no_copy": 0, + "options": "Healthcare Service Unit", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "check_in", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Check In", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "left", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Left", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "check_out", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Check Out", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-07-17 18:26:46.009878", + "modified_by": "Administrator", + "module": "Healthcare", + "name": "Inpatient Occupancy", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/healthcare/doctype/inpatient_occupancy/inpatient_occupancy.py b/erpnext/healthcare/doctype/inpatient_occupancy/inpatient_occupancy.py new file mode 100644 index 0000000000..52de25b457 --- /dev/null +++ b/erpnext/healthcare/doctype/inpatient_occupancy/inpatient_occupancy.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +from frappe.model.document import Document + +class InpatientOccupancy(Document): + pass diff --git a/erpnext/healthcare/doctype/inpatient_record/__init__.py b/erpnext/healthcare/doctype/inpatient_record/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/healthcare/doctype/inpatient_record/inpatient_record.js b/erpnext/healthcare/doctype/inpatient_record/inpatient_record.js new file mode 100644 index 0000000000..936c682dca --- /dev/null +++ b/erpnext/healthcare/doctype/inpatient_record/inpatient_record.js @@ -0,0 +1,185 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Inpatient Record', { + refresh: function(frm) { + if(!frm.doc.__islocal && frm.doc.status == "Admission Scheduled"){ + frm.add_custom_button(__('Admit'), function() { + admit_patient_dialog(frm); + } ); + frm.set_df_property("btn_transfer", "hidden", 1); + } + if(!frm.doc.__islocal && frm.doc.status == "Discharge Scheduled"){ + frm.add_custom_button(__('Discharge'), function() { + discharge_patient(frm); + } ); + frm.set_df_property("btn_transfer", "hidden", 0); + } + if(!frm.doc.__islocal && (frm.doc.status == "Discharged" || frm.doc.status == "Discharge Scheduled")){ + frm.disable_save(); + frm.set_df_property("btn_transfer", "hidden", 1); + } + }, + btn_transfer: function(frm) { + transfer_patient_dialog(frm); + } +}); + +var discharge_patient = function(frm) { + frappe.call({ + doc: frm.doc, + method: "discharge", + callback: function(data) { + if(!data.exc){ + frm.reload_doc(); + } + }, + freeze: true, + freeze_message: "Process Discharge" + }); +}; + +var admit_patient_dialog = function(frm){ + var dialog = new frappe.ui.Dialog({ + title: 'Admit Patient', + width: 100, + fields: [ + {fieldtype: "Link", label: "Service Unit Type", fieldname: "service_unit_type", options: "Healthcare Service Unit Type"}, + {fieldtype: "Link", label: "Service Unit", fieldname: "service_unit", options: "Healthcare Service Unit", reqd: 1}, + {fieldtype: "Datetime", label: "Admission Datetime", fieldname: "check_in", reqd: 1}, + {fieldtype: "Date", label: "Expected Discharge", fieldname: "expected_discharge"} + ], + primary_action_label: __("Admit"), + primary_action : function(){ + var service_unit = dialog.get_value('service_unit'); + var check_in = dialog.get_value('check_in'); + var expected_discharge = null; + if(dialog.get_value('expected_discharge')){ + expected_discharge = dialog.get_value('expected_discharge'); + } + if(!service_unit && !check_in){ + return; + } + frappe.call({ + doc: frm.doc, + method: 'admit', + args:{ + 'service_unit': service_unit, + 'check_in': check_in, + 'expected_discharge': expected_discharge + }, + callback: function(data) { + if(!data.exc){ + frm.reload_doc(); + } + }, + freeze: true, + freeze_message: "Process Admission" + }); + frm.refresh_fields(); + dialog.hide(); + } + }); + + dialog.fields_dict["service_unit_type"].get_query = function(){ + return { + filters: { + "inpatient_occupancy": 1, + "allow_appointments": 0 + } + }; + }; + dialog.fields_dict["service_unit"].get_query = function(){ + return { + filters: { + "is_group": 0, + "service_unit_type": dialog.get_value("service_unit_type"), + "occupied" : 0 + } + }; + }; + + dialog.show(); +}; + +var transfer_patient_dialog = function(frm){ + var dialog = new frappe.ui.Dialog({ + title: 'Transfer Patient', + width: 100, + fields: [ + {fieldtype: "Link", label: "Leave From", fieldname: "leave_from", options: "Healthcare Service Unit", reqd: 1, read_only:1}, + {fieldtype: "Link", label: "Service Unit Type", fieldname: "service_unit_type", options: "Healthcare Service Unit Type"}, + {fieldtype: "Link", label: "Transfer To", fieldname: "service_unit", options: "Healthcare Service Unit", reqd: 1}, + {fieldtype: "Datetime", label: "Check In", fieldname: "check_in", reqd: 1} + ], + primary_action_label: __("Transfer"), + primary_action : function(){ + var service_unit = null; + var check_in = dialog.get_value('check_in'); + var leave_from = null; + if(dialog.get_value('leave_from')){ + leave_from = dialog.get_value('leave_from'); + } + if(dialog.get_value('service_unit')){ + service_unit = dialog.get_value('service_unit'); + } + if(!check_in){ + return; + } + frappe.call({ + doc: frm.doc, + method: 'transfer', + args:{ + 'service_unit': service_unit, + 'check_in': check_in, + 'leave_from': leave_from + }, + callback: function(data) { + if(!data.exc){ + frm.reload_doc(); + } + }, + freeze: true, + freeze_message: "Process Transfer" + }); + frm.refresh_fields(); + dialog.hide(); + } + }); + + dialog.fields_dict["leave_from"].get_query = function(){ + return { + query : "erpnext.healthcare.doctype.inpatient_record.inpatient_record.get_leave_from", + filters: {docname:frm.doc.name} + }; + }; + dialog.fields_dict["service_unit_type"].get_query = function(){ + return { + filters: { + "inpatient_occupancy": 1, + "allow_appointments": 0 + } + }; + }; + dialog.fields_dict["service_unit"].get_query = function(){ + return { + filters: { + "is_group": 0, + "service_unit_type": dialog.get_value("service_unit_type"), + "occupied" : 0 + } + }; + }; + + dialog.show(); + + var not_left_service_unit = null; + for(let inpatient_occupancy in frm.doc.inpatient_occupancies){ + if(frm.doc.inpatient_occupancies[inpatient_occupancy].left != 1){ + not_left_service_unit = frm.doc.inpatient_occupancies[inpatient_occupancy].service_unit; + } + } + dialog.set_values({ + 'leave_from': not_left_service_unit + }); +}; diff --git a/erpnext/healthcare/doctype/inpatient_record/inpatient_record.json b/erpnext/healthcare/doctype/inpatient_record/inpatient_record.json new file mode 100644 index 0000000000..2f9f1f1cca --- /dev/null +++ b/erpnext/healthcare/doctype/inpatient_record/inpatient_record.json @@ -0,0 +1,977 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "naming_series:", + "beta": 0, + "creation": "2018-07-11 17:48:51.404139", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_1", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Series", + "length": 0, + "no_copy": 0, + "options": "IP-", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "patient", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Patient", + "length": 0, + "no_copy": 0, + "options": "Patient", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.patient_name", + "fieldname": "patient_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Patient Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.sex", + "fieldname": "gender", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Gender", + "length": 0, + "no_copy": 0, + "options": "Gender", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.blood_group", + "fieldname": "blood_group", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Blood Group", + "length": 0, + "no_copy": 0, + "options": "\nA Positive\nA Negative\nAB Positive\nAB Negative\nB Positive\nB Negative\nO Positive\nO Negative", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "dob", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Date of birth", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.mobile", + "fieldname": "mobile", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Mobile", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.email", + "fieldname": "email", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Email", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.phone", + "fieldname": "phone", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Phone", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_8", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "Admission Scheduled\nAdmitted\nDischarge Scheduled\nDischarged", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Today", + "fieldname": "scheduled_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Admission Schedule Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Today", + "fieldname": "admitted_datetime", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Admitted Datetime", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "expected_discharge", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Expected Discharge", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "discharge_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Discharge Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "references", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "References", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "cb_admission", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Admission", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "admission_practitioner", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Healthcare Practitioner", + "length": 0, + "no_copy": 0, + "options": "Healthcare Practitioner", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "admission_encounter", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Patient Encounter", + "length": 0, + "no_copy": 0, + "options": "Patient Encounter", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "cb_discharge", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Discharge", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "discharge_practitioner", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Healthcare Practitioner", + "length": 0, + "no_copy": 0, + "options": "Healthcare Practitioner", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "discharge_encounter", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Patient Encounter", + "length": 0, + "no_copy": 0, + "options": "Patient Encounter", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "sb_inpatient_occupancy", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Occupancy", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "inpatient_occupancies", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "options": "Inpatient Occupancy", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "btn_transfer", + "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Transfer", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.status != \"Admission Scheduled\"", + "fieldname": "sb_discharge_note", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Discharge Note", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "discharge_note", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-07-18 14:10:30.245833", + "modified_by": "Administrator", + "module": "Healthcare", + "name": "Inpatient Record", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Healthcare Administrator", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "search_fields": "patient", + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "patient", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/healthcare/doctype/inpatient_record/inpatient_record.py b/erpnext/healthcare/doctype/inpatient_record/inpatient_record.py new file mode 100644 index 0000000000..07cd9e467e --- /dev/null +++ b/erpnext/healthcare/doctype/inpatient_record/inpatient_record.py @@ -0,0 +1,142 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.utils import today, now_datetime +from frappe.model.document import Document +from frappe.desk.reportview import get_match_cond + +class InpatientRecord(Document): + def after_insert(self): + frappe.db.set_value("Patient", self.patient, "inpatient_status", "Admission Scheduled") + frappe.db.set_value("Patient", self.patient, "inpatient_record", self.name) + + def validate(self): + self.validate_already_scheduled_or_admitted() + if self.status == "Discharged": + frappe.db.set_value("Patient", self.patient, "inpatient_status", None) + frappe.db.set_value("Patient", self.patient, "inpatient_record", None) + + def validate_already_scheduled_or_admitted(self): + query = """ + select name, status + from `tabInpatient Record` + where (status = 'Admitted' or status = 'Admission Scheduled') + and name != %(name)s and patient = %(patient)s + """ + + ip_record = frappe.db.sql(query,{ + "name": self.name, + "patient": self.patient + }, as_dict = 1) + + if ip_record: + msg = _(("Already {0} Patient {1} with Inpatient Record ").format(ip_record[0].status, self.patient) \ + + """ {0}""".format(ip_record[0].name)) + frappe.throw(msg) + + def admit(self, service_unit, check_in, expected_discharge=None): + admit_patient(self, service_unit, check_in, expected_discharge) + + def discharge(self): + discharge_patient(self) + + def transfer(self, service_unit, check_in, leave_from): + if leave_from: + patient_leave_service_unit(self, check_in, leave_from) + if service_unit: + transfer_patient(self, service_unit, check_in) + +@frappe.whitelist() +def schedule_inpatient(patient, encounter_id, practitioner): + patient_obj = frappe.get_doc('Patient', patient) + inpatient_record = frappe.new_doc('Inpatient Record') + inpatient_record.patient = patient + inpatient_record.patient_name = patient_obj.patient_name + inpatient_record.gender = patient_obj.sex + inpatient_record.blood_group = patient_obj.blood_group + inpatient_record.dob = patient_obj.dob + inpatient_record.mobile = patient_obj.mobile + inpatient_record.email = patient_obj.email + inpatient_record.phone = patient_obj.phone + inpatient_record.status = "Admission Scheduled" + inpatient_record.scheduled_date = today() + inpatient_record.admission_practitioner = practitioner + inpatient_record.admission_encounter = encounter_id + inpatient_record.save(ignore_permissions = True) + +@frappe.whitelist() +def schedule_discharge(patient, encounter_id, practitioner): + inpatient_record_id = frappe.db.get_value('Patient', patient, 'inpatient_record') + if inpatient_record_id: + inpatient_record = frappe.get_doc("Inpatient Record", inpatient_record_id) + inpatient_record.discharge_practitioner = practitioner + inpatient_record.discharge_encounter = encounter_id + inpatient_record.status = "Discharge Scheduled" + inpatient_record.save(ignore_permissions = True) + frappe.db.set_value("Patient", patient, "inpatient_status", "Discharge Scheduled") + +def discharge_patient(inpatient_record): + if inpatient_record.inpatient_occupancies: + for inpatient_occupancy in inpatient_record.inpatient_occupancies: + if inpatient_occupancy.left != 1: + inpatient_occupancy.left = True + inpatient_occupancy.check_out = now_datetime() + frappe.db.set_value("Healthcare Service Unit", inpatient_occupancy.service_unit, "occupied", False) + + inpatient_record.discharge_date = today() + inpatient_record.status = "Discharged" + + inpatient_record.save(ignore_permissions = True) + +def admit_patient(inpatient_record, service_unit, check_in, expected_discharge=None): + inpatient_record.admitted_datetime = check_in + inpatient_record.status = "Admitted" + inpatient_record.expected_discharge = expected_discharge + + inpatient_record.set('inpatient_occupancies', []) + transfer_patient(inpatient_record, service_unit, check_in) + + frappe.db.set_value("Patient", inpatient_record.patient, "inpatient_status", "Admitted") + frappe.db.set_value("Patient", inpatient_record.patient, "inpatient_record", inpatient_record.name) + +def transfer_patient(inpatient_record, service_unit, check_in): + item_line = inpatient_record.append('inpatient_occupancies', {}) + item_line.service_unit = service_unit + item_line.check_in = check_in + + inpatient_record.save(ignore_permissions = True) + + frappe.db.set_value("Healthcare Service Unit", service_unit, "occupied", True) + +def patient_leave_service_unit(inpatient_record, check_out, leave_from): + if inpatient_record.inpatient_occupancies: + for inpatient_occupancy in inpatient_record.inpatient_occupancies: + if inpatient_occupancy.left != 1 and inpatient_occupancy.service_unit == leave_from: + inpatient_occupancy.left = True + inpatient_occupancy.check_out = check_out + frappe.db.set_value("Healthcare Service Unit", inpatient_occupancy.service_unit, "occupied", False) + inpatient_record.save(ignore_permissions = True) + +@frappe.whitelist() +def get_leave_from(doctype, txt, searchfield, start, page_len, filters): + docname = filters['docname'] + + query = '''select io.service_unit + from `tabInpatient Occupancy` io, `tabInpatient Record` ir + where io.parent = '{docname}' and io.parentfield = 'inpatient_occupancies' + and io.left!=1 and io.parent = ir.name''' + + return frappe.db.sql(query.format(**{ + "docname": docname, + "searchfield": searchfield, + "mcond": get_match_cond(doctype) + }), { + 'txt': "%%%s%%" % txt, + '_txt': txt.replace("%", ""), + 'start': start, + 'page_len': page_len + }) diff --git a/erpnext/healthcare/doctype/inpatient_record/inpatient_record_dashboard.py b/erpnext/healthcare/doctype/inpatient_record/inpatient_record_dashboard.py new file mode 100644 index 0000000000..0dc89701a8 --- /dev/null +++ b/erpnext/healthcare/doctype/inpatient_record/inpatient_record_dashboard.py @@ -0,0 +1,16 @@ +from frappe import _ + +def get_data(): + return { + 'fieldname': 'inpatient_record', + 'transactions': [ + { + 'label': _('Appointments and Encounters'), + 'items': ['Patient Appointment', 'Patient Encounter'] + }, + { + 'label': _('Lab Tests and Vital Signs'), + 'items': ['Lab Test', 'Clinical Procedure', 'Sample Collection', 'Vital Signs'] + } + ] + } diff --git a/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.js b/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.js new file mode 100644 index 0000000000..1ce9afa96d --- /dev/null +++ b/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Inpatient Record", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Inpatient Record + () => frappe.tests.make('Inpatient Record', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py b/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py new file mode 100644 index 0000000000..91cc417963 --- /dev/null +++ b/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest +from frappe.utils import now_datetime, today +from frappe.utils.make_random import get_random +from erpnext.healthcare.doctype.inpatient_record.inpatient_record import admit_patient, discharge_patient + +class TestInpatientRecord(unittest.TestCase): + def test_admit_and_discharge(self): + patient = get_patient() + # Schedule Admission + ip_record = create_inpatient(patient) + ip_record.save(ignore_permissions = True) + self.assertEqual(ip_record.name, frappe.db.get_value("Patient", patient, "inpatient_record")) + self.assertEqual(ip_record.status, frappe.db.get_value("Patient", patient, "inpatient_status")) + + # Admit + service_unit = get_healthcare_service_unit() + admit_patient(ip_record, service_unit, now_datetime()) + self.assertEqual("Admitted", frappe.db.get_value("Patient", patient, "inpatient_status")) + self.assertEqual(1, frappe.db.get_value("Healthcare Service Unit", service_unit, "occupied")) + + # Discharge + discharge_patient(ip_record) + self.assertEqual(None, frappe.db.get_value("Patient", patient, "inpatient_record")) + self.assertEqual(None, frappe.db.get_value("Patient", patient, "inpatient_status")) + self.assertEqual(0, frappe.db.get_value("Healthcare Service Unit", service_unit, "occupied")) + + def test_validate_overlap_admission(self): + patient = get_patient() + + ip_record = create_inpatient(patient) + ip_record.save(ignore_permissions = True) + ip_record_new = create_inpatient(patient) + self.assertRaises(frappe.ValidationError, ip_record_new.save) + + service_unit = get_healthcare_service_unit() + admit_patient(ip_record, service_unit, now_datetime()) + ip_record_new = create_inpatient(patient) + self.assertRaises(frappe.ValidationError, ip_record_new.save) + +def create_inpatient(patient): + patient_obj = frappe.get_doc('Patient', patient) + inpatient_record = frappe.new_doc('Inpatient Record') + inpatient_record.patient = patient + inpatient_record.patient_name = patient_obj.patient_name + inpatient_record.gender = patient_obj.sex + inpatient_record.blood_group = patient_obj.blood_group + inpatient_record.dob = patient_obj.dob + inpatient_record.mobile = patient_obj.mobile + inpatient_record.email = patient_obj.email + inpatient_record.phone = patient_obj.phone + inpatient_record.inpatient = "Scheduled" + inpatient_record.scheduled_date = today() + return inpatient_record + +def get_patient(): + patient = get_random("Patient") + if not patient: + patient = frappe.new_doc("Patient") + patient.patient_name = "Test Patient" + patient.sex = "Male" + patient.save(ignore_permissions=True) + return patient.name + return patient + + +def get_healthcare_service_unit(): + service_unit = get_random("Healthcare Service Unit", filters={"inpatient_occupancy": 1}) + if not service_unit: + service_unit = frappe.new_doc("Healthcare Service Unit") + service_unit.healthcare_service_unit_name = "Test Service Unit Ip Occupancy" + service_unit.service_unit_type = get_service_unit_type() + service_unit.inpatient_occupancy = 1 + service_unit.occupied = 0 + service_unit.save(ignore_permissions = True) + return service_unit.name + return service_unit + +def get_service_unit_type(): + service_unit_type = get_random("Healthcare Service Unit Type", filters={"inpatient_occupancy": 1}) + + if not service_unit_type: + service_unit_type = frappe.new_doc("Healthcare Service Unit Type") + service_unit_type.service_unit_type = "Test Service Unit Type Ip Occupancy" + service_unit_type.inpatient_occupancy = 1 + service_unit_type.save(ignore_permissions = True) + return service_unit_type.name + return service_unit_type diff --git a/erpnext/healthcare/doctype/lab_test/lab_test.json b/erpnext/healthcare/doctype/lab_test/lab_test.json index ae66325f6d..0132c98e10 100644 --- a/erpnext/healthcare/doctype/lab_test/lab_test.json +++ b/erpnext/healthcare/doctype/lab_test/lab_test.json @@ -13,6 +13,40 @@ "document_type": "Document", "editable_grid": 0, "fields": [ + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.inpatient_record", + "fieldname": "inpatient_record", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Record", + "length": 0, + "no_copy": 0, + "options": "Inpatient Record", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -86,6 +120,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_from": "inpatient_record.patient", "fieldname": "patient", "fieldtype": "Link", "hidden": 0, @@ -1481,7 +1516,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-07-16 12:47:01.425117", + "modified": "2018-07-17 12:47:01.425117", "modified_by": "Administrator", "module": "Healthcare", "name": "Lab Test", @@ -1557,4 +1592,4 @@ "title_field": "patient", "track_changes": 1, "track_seen": 1 -} \ No newline at end of file +} diff --git a/erpnext/healthcare/doctype/patient/patient.json b/erpnext/healthcare/doctype/patient/patient.json index 10cc11abdc..b442a194f1 100644 --- a/erpnext/healthcare/doctype/patient/patient.json +++ b/erpnext/healthcare/doctype/patient/patient.json @@ -16,6 +16,7 @@ "fields": [ { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -49,6 +50,73 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "inpatient_status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Status", + "length": 0, + "no_copy": 0, + "options": "\nAdmission Scheduled\nAdmitted\nDischarge Scheduled", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "inpatient_record", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Record", + "length": 0, + "no_copy": 0, + "options": "Inpatient Record", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -81,6 +149,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -113,6 +182,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -145,6 +215,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -177,6 +248,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -208,6 +280,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -239,6 +312,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -272,6 +346,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -304,6 +379,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -334,6 +410,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -366,6 +443,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -398,6 +476,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -429,6 +508,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -461,6 +541,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -492,6 +573,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -524,6 +606,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -555,6 +638,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -587,6 +671,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -618,6 +703,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -649,6 +735,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -680,6 +767,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -710,6 +798,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -741,6 +830,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -772,6 +862,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -803,6 +894,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -834,6 +926,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -864,6 +957,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -896,6 +990,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -927,6 +1022,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -958,6 +1054,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -989,6 +1086,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1020,6 +1118,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1051,6 +1150,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1081,6 +1181,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1112,6 +1213,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1143,6 +1245,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -1177,6 +1280,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1209,6 +1313,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -1240,6 +1345,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1283,7 +1389,7 @@ "issingle": 0, "istable": 0, "max_attachments": 50, - "modified": "2018-03-13 11:20:31.338415", + "modified": "2018-07-18 13:36:05.308926", "modified_by": "Administrator", "module": "Healthcare", "name": "Patient", @@ -1292,7 +1398,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, @@ -1312,7 +1417,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, @@ -1332,7 +1436,6 @@ }, { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, diff --git a/erpnext/healthcare/doctype/patient_appointment/patient_appointment.js b/erpnext/healthcare/doctype/patient_appointment/patient_appointment.js index f5e59f23fd..23ec85d074 100644 --- a/erpnext/healthcare/doctype/patient_appointment/patient_appointment.js +++ b/erpnext/healthcare/doctype/patient_appointment/patient_appointment.js @@ -97,6 +97,7 @@ frappe.ui.form.on('Patient Appointment', { },__("Create")); } } + frm.set_df_property("get_procedure_from_encounter", "read_only", frm.doc.__islocal ? 0 : 1); }, check_availability: function(frm) { var { practitioner, appointment_date } = frm.doc; diff --git a/erpnext/healthcare/doctype/patient_appointment/patient_appointment.json b/erpnext/healthcare/doctype/patient_appointment/patient_appointment.json index f88a1e0978..b19e48e9d2 100644 --- a/erpnext/healthcare/doctype/patient_appointment/patient_appointment.json +++ b/erpnext/healthcare/doctype/patient_appointment/patient_appointment.json @@ -20,6 +20,41 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_from": "patient.inpatient_record", + "fieldname": "inpatient_record", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Record", + "length": 0, + "no_copy": 0, + "options": "Inpatient Record", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "inpatient_record.patient", "fieldname": "patient", "fieldtype": "Link", "hidden": 0, @@ -877,7 +912,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-07-16 12:48:28.394133", + "modified": "2018-07-17 12:48:28.394133", "modified_by": "Administrator", "module": "Healthcare", "name": "Patient Appointment", @@ -953,4 +988,4 @@ "title_field": "patient", "track_changes": 1, "track_seen": 1 -} \ No newline at end of file +} diff --git a/erpnext/healthcare/doctype/patient_encounter/patient_encounter.js b/erpnext/healthcare/doctype/patient_encounter/patient_encounter.js index a9b45ac4e7..47c9cada6b 100644 --- a/erpnext/healthcare/doctype/patient_encounter/patient_encounter.js +++ b/erpnext/healthcare/doctype/patient_encounter/patient_encounter.js @@ -19,7 +19,28 @@ frappe.ui.form.on('Patient Encounter', { refresh: function(frm) { refresh_field('drug_prescription'); refresh_field('test_prescription'); - + if (!frm.doc.__islocal){ + frappe.call({ + method: 'frappe.client.get_value', + args: { + doctype: 'Patient', + fieldname: 'inpatient_status', + filters: {name: frm.doc.patient} + }, + callback: function(data) { + if(data.message && data.message.inpatient_status == "Admission Scheduled" || data.message.inpatient_status == "Admitted"){ + frm.add_custom_button(__('Schedule Discharge'), function() { + schedule_discharge(frm); + }); + } + else if(data.message.inpatient_status != "Discharge Scheduled"){ + frm.add_custom_button(__('Schedule Admission'), function() { + schedule_inpatient(frm); + }); + } + } + }); + } frm.add_custom_button(__('Medical Record'), function() { if (frm.doc.patient) { frappe.route_options = {"patient": frm.doc.patient}; @@ -90,6 +111,34 @@ frappe.ui.form.on('Patient Encounter', { } }); +var schedule_inpatient = function(frm) { + frappe.call({ + method: "erpnext.healthcare.doctype.inpatient_record.inpatient_record.schedule_inpatient", + args: {patient: frm.doc.patient, encounter_id: frm.doc.name, practitioner: frm.doc.practitioner}, + callback: function(data) { + if(!data.exc){ + frm.reload_doc(); + } + }, + freeze: true, + freeze_message: "Process Inpatient Scheduling" + }); +}; + +var schedule_discharge = function(frm) { + frappe.call({ + method: "erpnext.healthcare.doctype.inpatient_record.inpatient_record.schedule_discharge", + args: {patient: frm.doc.patient, encounter_id: frm.doc.name, practitioner: frm.doc.practitioner}, + callback: function(data) { + if(!data.exc){ + frm.reload_doc(); + } + }, + freeze: true, + freeze_message: "Process Discharge" + }); +}; + var btn_invoice_encounter = function(frm){ var doc = frm.doc; frappe.call({ diff --git a/erpnext/healthcare/doctype/patient_encounter/patient_encounter.json b/erpnext/healthcare/doctype/patient_encounter/patient_encounter.json index 1373503d80..292c900fe6 100644 --- a/erpnext/healthcare/doctype/patient_encounter/patient_encounter.json +++ b/erpnext/healthcare/doctype/patient_encounter/patient_encounter.json @@ -13,6 +13,40 @@ "document_type": "Document", "editable_grid": 1, "fields": [ + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.inpatient_record", + "fieldname": "inpatient_record", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Record", + "length": 0, + "no_copy": 0, + "options": "Inpatient Record", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -151,6 +185,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_from": "inpatient_record.patient", "fieldname": "patient", "fieldtype": "Link", "hidden": 0, @@ -1070,7 +1105,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-07-16 12:51:13.487000", + "modified": "2018-07-17 12:51:13.487000", "modified_by": "Administrator", "module": "Healthcare", "name": "Patient Encounter", @@ -1108,4 +1143,4 @@ "title_field": "patient", "track_changes": 1, "track_seen": 1 -} \ No newline at end of file +} diff --git a/erpnext/healthcare/doctype/sample_collection/sample_collection.json b/erpnext/healthcare/doctype/sample_collection/sample_collection.json index 03d8d9044b..b5c4dbf314 100644 --- a/erpnext/healthcare/doctype/sample_collection/sample_collection.json +++ b/erpnext/healthcare/doctype/sample_collection/sample_collection.json @@ -15,6 +15,41 @@ "fields": [ { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "patient.inpatient_record", + "fieldname": "inpatient_record", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Record", + "length": 0, + "no_copy": 0, + "options": "Inpatient Record", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -43,11 +78,12 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -75,15 +111,17 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, + "fetch_from": "inpatient_record.patient", "fieldname": "patient", "fieldtype": "Link", "hidden": 0, @@ -107,11 +145,12 @@ "reqd": 0, "search_index": 1, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -137,11 +176,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -169,16 +209,17 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, - "fetch_from": "patient.sex", + "fetch_from": "patient.sex", "fieldname": "patient_sex", "fieldtype": "Data", "hidden": 0, @@ -202,11 +243,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -234,11 +276,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -264,11 +307,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -296,16 +340,17 @@ "reqd": 1, "search_index": 1, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, - "fetch_from": "sample.sample_uom", + "fetch_from": "sample.sample_uom", "fieldname": "sample_uom", "fieldtype": "Data", "hidden": 0, @@ -329,11 +374,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -361,11 +407,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -391,11 +438,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -423,11 +471,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -454,11 +503,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -486,11 +536,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -517,11 +568,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -547,11 +599,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -578,7 +631,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, - "translatable": 0, + "translatable": 0, "unique": 0 } ], @@ -592,7 +645,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-16 22:43:35.762002", + "modified": "2018-07-12 19:19:00.573460", "modified_by": "Administrator", "module": "Healthcare", "name": "Sample Collection", diff --git a/erpnext/healthcare/doctype/vital_signs/vital_signs.json b/erpnext/healthcare/doctype/vital_signs/vital_signs.json index 761ae6d914..8354859552 100644 --- a/erpnext/healthcare/doctype/vital_signs/vital_signs.json +++ b/erpnext/healthcare/doctype/vital_signs/vital_signs.json @@ -19,6 +19,41 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_from": "patient.inpatient_record", + "fieldname": "inpatient_record", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Inpatient Record", + "length": 0, + "no_copy": 0, + "options": "Inpatient Record", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "inpatient_record.patient", "fieldname": "patient", "fieldtype": "Link", "hidden": 0, @@ -932,7 +967,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-07-16 14:04:09.604470", + "modified": "2018-07-17 14:04:09.604470", "modified_by": "Administrator", "module": "Healthcare", "name": "Vital Signs", @@ -989,4 +1024,4 @@ "title_field": "patient", "track_changes": 1, "track_seen": 1 -} \ No newline at end of file +} diff --git a/erpnext/healthcare/setup.py b/erpnext/healthcare/setup.py index f30f42ca6e..c00b637162 100644 --- a/erpnext/healthcare/setup.py +++ b/erpnext/healthcare/setup.py @@ -14,8 +14,6 @@ def setup_healthcare(): create_duration() create_dosage() create_healthcare_item_groups() - create_lab_test_items() - create_lab_test_template() create_sensitivity() add_healthcare_service_unit_tree_root() @@ -184,73 +182,6 @@ def create_healthcare_item_groups(): ] insert_record(records) -def create_lab_test_items(): - records = [ - {"doctype": "Item", "item_code": "MCH", "item_name": "MCH", "item_group": _("Laboratory"), - "stock_uom": _("Unit"), "is_stock_item": 0, "is_purchase_item": 0, "is_sales_item": 1}, - {"doctype": "Item", "item_code": "LDL", "item_name": "LDL", "item_group": _("Laboratory"), - "stock_uom": _("Unit"), "is_stock_item": 0, "is_purchase_item": 0, "is_sales_item": 1}, - {"doctype": "Item", "item_code": "GTT", "item_name": "GTT", "item_group": _("Laboratory"), - "stock_uom": _("Unit"), "is_stock_item": 0, "is_purchase_item": 0, "is_sales_item": 1}, - {"doctype": "Item", "item_code": "HDL", "item_name": "HDL", "item_group": _("Laboratory"), - "stock_uom": _("Unit"), "is_stock_item": 0, "is_purchase_item": 0, "is_sales_item": 1}, - {"doctype": "Item", "item_code": "BILT", "item_name": "BILT", "item_group": _("Laboratory"), - "stock_uom": _("Unit"), "is_stock_item": 0, "is_purchase_item": 0, "is_sales_item": 1}, - {"doctype": "Item", "item_code": "BILD", "item_name": "BILD", "item_group": _("Laboratory"), - "stock_uom": _("Unit"), "is_stock_item": 0, "is_purchase_item": 0, "is_sales_item": 1}, - {"doctype": "Item", "item_code": "BP", "item_name": "BP", "item_group": _("Laboratory"), - "stock_uom": _("Unit"), "is_stock_item": 0, "is_purchase_item": 0, "is_sales_item": 1}, - {"doctype": "Item", "item_code": "BS", "item_name": "BS", "item_group": _("Laboratory"), - "stock_uom": _("Unit"), "is_stock_item": 0, "is_purchase_item": 0, "is_sales_item": 1} - ] - insert_record(records) - -def create_lab_test_template(): - records = [ - {"doctype": "Lab Test Template", "name": "MCH","test_name": "MCH","test_code": "MCH", - "test_group": _("Laboratory"),"department": _("Haematology"),"item": "MCH", - "test_template_type": "Single","is_billable": 1,"test_rate": 0.0,"test_uom": "Microgram", - "test_normal_range": "27 - 32 Microgram", - "sensitivity": 0,"test_description": "Mean Corpuscular Hemoglobin"}, - {"doctype": "Lab Test Template", "name": "LDL","test_name": "LDL (Serum)","test_code": "LDL", - "test_group": _("Laboratory"),"department": _("Biochemistry"), - "item": "LDL","test_template_type": "Single", - "is_billable": 1,"test_rate": 0.0,"test_uom": "mg / dl","test_normal_range": "70 - 160 mg/dlLow-density Lipoprotein (LDL)", - "sensitivity": 0,"test_description": "Low-density Lipoprotein (LDL)"}, - {"doctype": "Lab Test Template", "name": "GTT","test_name": "GTT","test_code": "GTT", - "test_group": _("Laboratory"),"department": _("Haematology"), - "item": "GTT","test_template_type": "Single", - "is_billable": 1,"test_rate": 0.0,"test_uom": "mg / dl","test_normal_range": "Less than 85 mg/dl", - "sensitivity": 0,"test_description": "Glucose Tolerance Test"}, - {"doctype": "Lab Test Template", "name": "HDL","test_name": "HDL (Serum)","test_code": "HDL", - "test_group": _("Laboratory"),"department": _("Biochemistry"), - "item": "HDL","test_template_type": "Single", - "is_billable": 1,"test_rate": 0.0,"test_uom": "mg / dl","test_normal_range": "35 - 65 mg/dl", - "sensitivity": 0,"test_description": "High-density Lipoprotein (HDL)"}, - {"doctype": "Lab Test Template", "name": "BILT","test_name": "Bilirubin Total","test_code": "BILT", - "test_group": _("Laboratory"),"department": _("Biochemistry"), - "item": "BILT","test_template_type": "Single", - "is_billable": 1,"test_rate": 0.0,"test_uom": "mg / dl","test_normal_range": "0.2 - 1.2 mg / dl", - "sensitivity": 0,"test_description": "Bilirubin Total"}, - {"doctype": "Lab Test Template", "name": "BILD","test_name": "Bilirubin Direct","test_code": "BILD", - "test_group": _("Laboratory"),"department": _("Biochemistry"), - "item": "BILD","test_template_type": "Single", - "is_billable": 1,"test_rate": 0.0,"test_uom": "mg / dl","test_normal_range": "0.4 mg / dl", - "sensitivity": 0,"test_description": "Bilirubin Direct"}, - - {"doctype": "Lab Test Template", "name": "BP","test_name": "Bile Pigment","test_code": "BP", - "test_group": _("Laboratory"),"department": _("Pathology"), - "item": "BP","test_template_type": "Single", - "is_billable": 1,"test_rate": 0.0,"test_uom": "","test_normal_range": "", - "sensitivity": 0,"test_description": "Bile Pigment"}, - {"doctype": "Lab Test Template", "name": "BS","test_name": "Bile Salt","test_code": "BS", - "test_group": _("Laboratory"),"department": _("Pathology"), - "item": "BS","test_template_type": "Single", - "is_billable": 1,"test_rate": 0.0,"test_uom": "","test_normal_range": "", - "sensitivity": 0,"test_description": "Bile Salt"} - ] - insert_record(records) - def create_sensitivity(): records = [ {"doctype": "Sensitivity", "sensitivity": _("Low Sensitivity")}, @@ -266,7 +197,7 @@ def add_healthcare_service_unit_tree_root(): record = [ { "doctype": "Healthcare Service Unit", - "healthcare_service_unit_name": "All Healthcare Service Unit", + "healthcare_service_unit_name": "All Healthcare Service Units", "is_group": 1 } ] diff --git a/erpnext/patches/v11_0/add_healthcare_service_unit_tree_root.py b/erpnext/patches/v11_0/add_healthcare_service_unit_tree_root.py index 17368bf6ee..0c4209ac9a 100644 --- a/erpnext/patches/v11_0/add_healthcare_service_unit_tree_root.py +++ b/erpnext/patches/v11_0/add_healthcare_service_unit_tree_root.py @@ -4,10 +4,11 @@ from frappe import _ def execute(): """ assign lft and rgt appropriately """ frappe.reload_doc("healthcare", "doctype", "healthcare_service_unit") + frappe.reload_doc("healthcare", "doctype", "healthcare_service_unit_type") - if not frappe.db.exists("Healthcare Service Unit", _('All Healthcare Service Unit')): + if not frappe.db.exists("Healthcare Service Unit", _('All Healthcare Service Units')): frappe.get_doc({ 'doctype': 'Healthcare Service Unit', - 'healthcare_service_unit_name': _('All Healthcare Service Unit'), + 'healthcare_service_unit_name': _('All Healthcare Service Units'), 'is_group': 1 }).insert(ignore_permissions=True)