Merge pull request #24355 from ruchamahabal/inpatient-visits-billing
feat(Healthcare Settings): Do Not Bill Patient Encounters for Inpatients
This commit is contained in:
commit
5495c3789f
@ -19,6 +19,7 @@
|
|||||||
"valid_days",
|
"valid_days",
|
||||||
"inpatient_settings_section",
|
"inpatient_settings_section",
|
||||||
"allow_discharge_despite_unbilled_services",
|
"allow_discharge_despite_unbilled_services",
|
||||||
|
"do_not_bill_inpatient_encounters",
|
||||||
"healthcare_service_items",
|
"healthcare_service_items",
|
||||||
"inpatient_visit_charge_item",
|
"inpatient_visit_charge_item",
|
||||||
"op_consulting_charge_item",
|
"op_consulting_charge_item",
|
||||||
@ -315,11 +316,17 @@
|
|||||||
"fieldname": "allow_discharge_despite_unbilled_services",
|
"fieldname": "allow_discharge_despite_unbilled_services",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Allow Discharge Despite Unbilled Healthcare Services"
|
"label": "Allow Discharge Despite Unbilled Healthcare Services"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "do_not_bill_inpatient_encounters",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Do Not Bill Patient Encounters for Inpatients"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-01-04 10:19:22.329272",
|
"modified": "2021-01-13 09:04:35.877700",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Healthcare",
|
"module": "Healthcare",
|
||||||
"name": "Healthcare Settings",
|
"name": "Healthcare Settings",
|
||||||
|
@ -8,6 +8,8 @@ import unittest
|
|||||||
from frappe.utils import now_datetime, today
|
from frappe.utils import now_datetime, today
|
||||||
from frappe.utils.make_random import get_random
|
from frappe.utils.make_random import get_random
|
||||||
from erpnext.healthcare.doctype.inpatient_record.inpatient_record import admit_patient, discharge_patient, schedule_discharge
|
from erpnext.healthcare.doctype.inpatient_record.inpatient_record import admit_patient, discharge_patient, schedule_discharge
|
||||||
|
from erpnext.healthcare.doctype.lab_test.test_lab_test import create_patient_encounter
|
||||||
|
from erpnext.healthcare.utils import get_encounters_to_invoice
|
||||||
|
|
||||||
class TestInpatientRecord(unittest.TestCase):
|
class TestInpatientRecord(unittest.TestCase):
|
||||||
def test_admit_and_discharge(self):
|
def test_admit_and_discharge(self):
|
||||||
@ -42,7 +44,7 @@ class TestInpatientRecord(unittest.TestCase):
|
|||||||
|
|
||||||
def test_allow_discharge_despite_unbilled_services(self):
|
def test_allow_discharge_despite_unbilled_services(self):
|
||||||
frappe.db.sql("""delete from `tabInpatient Record`""")
|
frappe.db.sql("""delete from `tabInpatient Record`""")
|
||||||
setup_inpatient_settings()
|
setup_inpatient_settings(key="allow_discharge_despite_unbilled_services", value=1)
|
||||||
patient = create_patient()
|
patient = create_patient()
|
||||||
# Schedule Admission
|
# Schedule Admission
|
||||||
ip_record = create_inpatient(patient)
|
ip_record = create_inpatient(patient)
|
||||||
@ -64,6 +66,35 @@ class TestInpatientRecord(unittest.TestCase):
|
|||||||
self.assertEqual(None, frappe.db.get_value("Patient", patient, "inpatient_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(None, frappe.db.get_value("Patient", patient, "inpatient_status"))
|
||||||
|
|
||||||
|
setup_inpatient_settings(key="allow_discharge_despite_unbilled_services", value=0)
|
||||||
|
|
||||||
|
def test_do_not_bill_patient_encounters_for_inpatients(self):
|
||||||
|
frappe.db.sql("""delete from `tabInpatient Record`""")
|
||||||
|
setup_inpatient_settings(key="do_not_bill_inpatient_encounters", value=1)
|
||||||
|
patient = create_patient()
|
||||||
|
# Schedule Admission
|
||||||
|
ip_record = create_inpatient(patient)
|
||||||
|
ip_record.expected_length_of_stay = 0
|
||||||
|
ip_record.save(ignore_permissions = True)
|
||||||
|
|
||||||
|
# Admit
|
||||||
|
service_unit = get_healthcare_service_unit()
|
||||||
|
admit_patient(ip_record, service_unit, now_datetime())
|
||||||
|
|
||||||
|
# Patient Encounter
|
||||||
|
patient_encounter = create_patient_encounter()
|
||||||
|
encounters = get_encounters_to_invoice(patient, "_Test Company")
|
||||||
|
encounter_ids = [entry.reference_name for entry in encounters]
|
||||||
|
self.assertFalse(patient_encounter.name in encounter_ids)
|
||||||
|
|
||||||
|
# Discharge
|
||||||
|
schedule_discharge(frappe.as_json({"patient": patient}))
|
||||||
|
self.assertEqual("Vacant", frappe.db.get_value("Healthcare Service Unit", service_unit, "occupancy_status"))
|
||||||
|
|
||||||
|
ip_record = frappe.get_doc("Inpatient Record", ip_record.name)
|
||||||
|
mark_invoiced_inpatient_occupancy(ip_record)
|
||||||
|
discharge_patient(ip_record)
|
||||||
|
setup_inpatient_settings(key="do_not_bill_inpatient_encounters", value=0)
|
||||||
|
|
||||||
def test_validate_overlap_admission(self):
|
def test_validate_overlap_admission(self):
|
||||||
frappe.db.sql("""delete from `tabInpatient Record`""")
|
frappe.db.sql("""delete from `tabInpatient Record`""")
|
||||||
@ -89,9 +120,9 @@ def mark_invoiced_inpatient_occupancy(ip_record):
|
|||||||
ip_record.save(ignore_permissions = True)
|
ip_record.save(ignore_permissions = True)
|
||||||
|
|
||||||
|
|
||||||
def setup_inpatient_settings():
|
def setup_inpatient_settings(key, value):
|
||||||
settings = frappe.get_single("Healthcare Settings")
|
settings = frappe.get_single("Healthcare Settings")
|
||||||
settings.allow_discharge_despite_unbilled_services = 1
|
settings.set(key, value)
|
||||||
settings.save()
|
settings.save()
|
||||||
|
|
||||||
|
|
||||||
|
@ -77,11 +77,13 @@ def get_appointments_to_invoice(patient, company):
|
|||||||
|
|
||||||
|
|
||||||
def get_encounters_to_invoice(patient, company):
|
def get_encounters_to_invoice(patient, company):
|
||||||
|
if not isinstance(patient, str):
|
||||||
|
patient = patient.name
|
||||||
encounters_to_invoice = []
|
encounters_to_invoice = []
|
||||||
encounters = frappe.get_list(
|
encounters = frappe.get_list(
|
||||||
'Patient Encounter',
|
'Patient Encounter',
|
||||||
fields=['*'],
|
fields=['*'],
|
||||||
filters={'patient': patient.name, 'company': company, 'invoiced': False, 'docstatus': 1}
|
filters={'patient': patient, 'company': company, 'invoiced': False, 'docstatus': 1}
|
||||||
)
|
)
|
||||||
if encounters:
|
if encounters:
|
||||||
for encounter in encounters:
|
for encounter in encounters:
|
||||||
@ -90,6 +92,10 @@ def get_encounters_to_invoice(patient, company):
|
|||||||
income_account = None
|
income_account = None
|
||||||
service_item = None
|
service_item = None
|
||||||
if encounter.practitioner:
|
if encounter.practitioner:
|
||||||
|
if encounter.inpatient_record and \
|
||||||
|
frappe.db.get_single_value('Healthcare Settings', 'do_not_bill_inpatient_encounters'):
|
||||||
|
continue
|
||||||
|
|
||||||
service_item, practitioner_charge = get_service_item_and_practitioner_charge(encounter)
|
service_item, practitioner_charge = get_service_item_and_practitioner_charge(encounter)
|
||||||
income_account = get_income_account(encounter.practitioner, encounter.company)
|
income_account = get_income_account(encounter.practitioner, encounter.company)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user