fix: patch and tests
diff --git a/erpnext/healthcare/doctype/patient_appointment/test_patient_appointment.py b/erpnext/healthcare/doctype/patient_appointment/test_patient_appointment.py
index 2a2f045..4668e81 100644
--- a/erpnext/healthcare/doctype/patient_appointment/test_patient_appointment.py
+++ b/erpnext/healthcare/doctype/patient_appointment/test_patient_appointment.py
@@ -59,8 +59,9 @@
 
 def create_healthcare_docs():
 	patient = get_random('Patient')
-	practitioner = get_random('Healthcare Practitioner')
-	medical_department = get_random('Medical Department')
+	practitioner = frappe.db.exists('Healthcare Practitioner', '_Test Healthcare Practitioner')
+	medical_department = frappe.db.exists('Medical Department', '_Test Medical Department')
+
 	if not patient:
 		patient = frappe.new_doc('Patient')
 		patient.first_name = '_Test Patient'
@@ -80,6 +81,7 @@
 		practitioner.gender = 'Female'
 		practitioner.department = medical_department
 		practitioner.op_consulting_charge = 500
+		practitioner.inpatient_visit_charge = 500
 		practitioner.save(ignore_permissions=True)
 		practitioner = practitioner.name
 
@@ -98,7 +100,9 @@
 		return encounter
 
 def create_appointment(patient, practitioner, appointment_date, invoice=0, procedure_template=0):
-	create_healthcare_service_items()
+	item = create_healthcare_service_items()
+	frappe.db.set_value('Healthcare Settings', None, 'inpatient_visit_charge_item', item)
+	frappe.db.set_value('Healthcare Settings', None, 'op_consulting_charge_item', item)
 	appointment = frappe.new_doc('Patient Appointment')
 	appointment.patient = patient
 	appointment.practitioner = practitioner
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 3ebfd14..ed8d421 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -581,7 +581,7 @@
 erpnext.patches.v12_0.set_default_homepage_type
 erpnext.patches.v11_0.rename_additional_salary_component_additional_salary
 erpnext.patches.v11_0.renamed_from_to_fields_in_project
-erpnext.patches.v11_0.add_permissions_in_gst_settings
+erpnext.patches.v11_0.add_permissions_in_gst_settings #2020-04-04
 erpnext.patches.v11_1.setup_guardian_role
 execute:frappe.delete_doc('DocType', 'Notification Control')
 erpnext.patches.v12_0.set_gst_category
@@ -626,10 +626,11 @@
 erpnext.patches.v12_0.create_accounting_dimensions_in_missing_doctypes
 erpnext.patches.v11_1.set_status_for_material_request_type_manufacture
 erpnext.patches.v12_0.move_plaid_settings_to_doctype
-execute:frappe.reload_doc('desk', 'doctype','dashboard_chart_link')
-execute:frappe.reload_doc('desk', 'doctype','dashboard')
-execute:frappe.reload_doc('desk', 'doctype','dashboard_chart_source')
-execute:frappe.reload_doc('desk', 'doctype','dashboard_chart')
+execute:frappe.reload_doc('desk', 'doctype', 'dashboard_chart_link')
+execute:frappe.reload_doc('desk', 'doctype', 'dashboard')
+execute:frappe.reload_doc('desk', 'doctype', 'dashboard_chart_source')
+execute:frappe.reload_doc('desk', 'doctype', 'dashboard_chart')
+execute:frappe.reload_doc('desk', 'doctype', 'dashboard_chart_field')
 erpnext.patches.v12_0.add_default_dashboards
 erpnext.patches.v12_0.remove_bank_remittance_custom_fields
 erpnext.patches.v12_0.generate_leave_ledger_entries
@@ -660,4 +661,8 @@
 erpnext.patches.v12_0.create_irs_1099_field_united_states
 erpnext.patches.v12_0.move_bank_account_swift_number_to_bank
 erpnext.patches.v12_0.rename_bank_reconciliation_fields # 2020-01-22
-erpnext.patches.v12_0.update_healthcare_refactored_changes
\ No newline at end of file
+erpnext.patches.v12_0.set_received_qty_in_material_request_as_per_stock_uom
+erpnext.patches.v12_0.set_received_qty_in_material_request_as_per_stock_uom
+erpnext.patches.v12_0.recalculate_requested_qty_in_bin
+erpnext.patches.v12_0.update_healthcare_refactored_changes
+
diff --git a/erpnext/patches/v12_0/update_healthcare_refactored_changes.py b/erpnext/patches/v12_0/update_healthcare_refactored_changes.py
index 1fd8668..5f249e4 100644
--- a/erpnext/patches/v12_0/update_healthcare_refactored_changes.py
+++ b/erpnext/patches/v12_0/update_healthcare_refactored_changes.py
@@ -55,77 +55,82 @@
 					rename_field(dt, field[0], field[1])
 
 	# first name mandatory in Patient
-	patients = frappe.get_all('Patient', fields=['name', 'patient_name'])
-	frappe.reload_doctype('Patient')
-	for entry in patients:
-		name = entry.patient_name.split(' ')
-		frappe.db.set_value('Patient', entry.name, 'first_name', name[0])
+	if frappe.db.exists('DocType', 'Patient'):
+		patients = frappe.db.sql("select name, patient_name from `tabPatient`", as_dict=1)
+		frappe.reload_doc('healthcare', 'doctype', 'patient')
+		for entry in patients:
+			name = entry.patient_name.split(' ')
+			frappe.db.set_value('Patient', entry.name, 'first_name', name[0])
 
 	# mark Healthcare Practitioner status as Disabled
-	practitioners = frappe.db.sql("select name from `tabHealthcare Practitioner` where 'active'= 0", as_dict=1)
-	practitioners_lst = [p.name for p in practitioners]
-	frappe.reload_doctype('Healthcare Practitioner')
-	frappe.db.sql("update `tabHealthcare Practitioner` set status = 'Disabled' where name IN %(practitioners)s""", {"practitioners": practitioners_lst})
+	if frappe.db.exists('DocType', 'Healthcare Practitioner'):
+		practitioners = frappe.db.sql("select name from `tabHealthcare Practitioner` where 'active'= 0", as_dict=1)
+		practitioners_lst = [p.name for p in practitioners]
+		frappe.reload_doc('healthcare', 'doctype', 'healthcare_practitioner')
+		frappe.db.sql("update `tabHealthcare Practitioner` set status = 'Disabled' where name IN %(practitioners)s""", {"practitioners": practitioners_lst})
 
 	# set Clinical Procedure status
-	frappe.reload_doctype('Clinical Procedure')
-	frappe.db.sql("""
-		UPDATE
-			`tabClinical Procedure`
-		SET
-			docstatus = (CASE WHEN status = 'Cancelled' THEN 2
-							WHEN status = 'Draft' THEN 0
-							ELSE 1
-						END)
-	""")
+	if frappe.db.exists('DocType', 'Clinical Procedure'):
+		frappe.reload_doc('healthcare', 'doctype', 'clinical_procedure')
+		frappe.db.sql("""
+			UPDATE
+				`tabClinical Procedure`
+			SET
+				docstatus = (CASE WHEN status = 'Cancelled' THEN 2
+								WHEN status = 'Draft' THEN 0
+								ELSE 1
+							END)
+		""")
 
 	# set complaints and diagnosis in table multiselect in Patient Encounter
-	field_list = [
-		['visit_department', 'medical_department'],
-		['type', 'appointment_type']
-	]
-	encounter_details = frappe.db.sql("""select symptoms, diagnosis, name from `tabPatient Encounter`""", as_dict=True)
-	frappe.reload_doc('healthcare', 'doctype', 'patient_encounter')
-	frappe.reload_doc('healthcare', 'doctype', 'patient_encounter_symptom')
-	frappe.reload_doc('healthcare', 'doctype', 'patient_encounter_diagnosis')
+	if frappe.db.exists('DocType', 'Patient Encounter'):
+		field_list = [
+			['visit_department', 'medical_department'],
+			['type', 'appointment_type']
+		]
+		encounter_details = frappe.db.sql("""select symptoms, diagnosis, name from `tabPatient Encounter`""", as_dict=True)
+		frappe.reload_doc('healthcare', 'doctype', 'patient_encounter')
+		frappe.reload_doc('healthcare', 'doctype', 'patient_encounter_symptom')
+		frappe.reload_doc('healthcare', 'doctype', 'patient_encounter_diagnosis')
 
-	for field in field_list:
-		if frappe.db.has_column(dt, field[0]):
-			rename_field(dt, field[0], field[1])
+		for field in field_list:
+			if frappe.db.has_column(dt, field[0]):
+				rename_field(dt, field[0], field[1])
 
-	for entry in encounter_details:
-		doc = frappe.get_doc('Patient Encounter', entry.name)
-		symptoms = entry.symptoms.split('\n')
-		for symptom in symptoms:
-			if not frappe.db.exists('Complaint', symptom):
-				frappe.get_doc({
-					'doctype': 'Complaint',
-					'complaints': symptom
-				}).insert()
-			row = doc.append('symptoms', {
-				'complaint': symptom
-			})
-			row.db_update()
+		for entry in encounter_details:
+			doc = frappe.get_doc('Patient Encounter', entry.name)
+			symptoms = entry.symptoms.split('\n')
+			for symptom in symptoms:
+				if not frappe.db.exists('Complaint', symptom):
+					frappe.get_doc({
+						'doctype': 'Complaint',
+						'complaints': symptom
+					}).insert()
+				row = doc.append('symptoms', {
+					'complaint': symptom
+				})
+				row.db_update()
 
-		diagnosis = entry.diagnosis.split('\n')
-		for d in diagnosis:
-			if not frappe.db.exists('Diagnosis', d):
-				frappe.get_doc({
-					'doctype': 'Diagnosis',
+			diagnosis = entry.diagnosis.split('\n')
+			for d in diagnosis:
+				if not frappe.db.exists('Diagnosis', d):
+					frappe.get_doc({
+						'doctype': 'Diagnosis',
+						'diagnosis': d
+					}).insert()
+				row = doc.append('diagnosis', {
 					'diagnosis': d
-				}).insert()
-			row = doc.append('diagnosis', {
-				'diagnosis': d
-			})
-			row.db_update()
-		doc.db_update()
+				})
+				row.db_update()
+			doc.db_update()
 
-	# update fee validity status
-	frappe.db.sql("""
-		UPDATE
-			`tabFee Validity`
-		SET
-			status = (CASE WHEN visited >= max_visits THEN 'Completed'
-							ELSE 'Pending'
-						END)
-	""")
\ No newline at end of file
+	if frappe.db.exists('DocType', 'Fee Validity'):
+		# update fee validity status
+		frappe.db.sql("""
+			UPDATE
+				`tabFee Validity`
+			SET
+				status = (CASE WHEN visited >= max_visits THEN 'Completed'
+								ELSE 'Pending'
+							END)
+		""")
\ No newline at end of file