diff --git a/app/components/app/ap-lab-order/list.cfg.ts b/app/components/app/ap-lab-order/list.cfg.ts
new file mode 100644
index 00000000..186e9f26
--- /dev/null
+++ b/app/components/app/ap-lab-order/list.cfg.ts
@@ -0,0 +1,58 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, { width: 50 }],
+
+ headers: [[
+ { label: 'Tgl. Order' },
+ { label: 'No. Order' },
+ { label: 'Jadwal Pemeriksaan' },
+ { label: 'Lokalisasi' },
+ { label: 'Stadium' },
+ { label: 'Status' },
+ { label: 'Resume' },
+ { label: '' }]],
+
+ keys: [
+ 'date',
+ 'number',
+ 'examinationDate',
+ 'localization',
+ 'stadium',
+ 'resume',
+ '',
+ ],
+
+ delKeyNames: [
+ { key: 'date', label: 'Tanggal' },
+ { key: 'number', label: 'Nomor' },
+ ],
+
+ parses: {
+ parent: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.parent?.name || '-'
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/ap-lab-order/list.vue b/app/components/app/ap-lab-order/list.vue
new file mode 100644
index 00000000..5d4820cc
--- /dev/null
+++ b/app/components/app/ap-lab-order/list.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
diff --git a/app/components/app/mcu-order/entry-for-ap.vue b/app/components/app/mcu-order/entry-for-ap.vue
new file mode 100644
index 00000000..80d0f7df
--- /dev/null
+++ b/app/components/app/mcu-order/entry-for-ap.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+ Tgl. Order
+
+
+
+
+
+ DPJP
+
+
+
+
+
+ PPDS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Lokalisasi
+
+
+
+
+
+ Diagnosa Klinik
+
+
+
+
+
+ Stadium T
+
+
+
+
+
+ Stadium M
+
+
+
+
+
+ Stadium N
+
+
+
+
+
+
+ Keterangan Klinik
+
+
+
+
+
+
+
+
+
+ Riwayat Dulu
+
+
+
+
+
+ Riwayat Sekarang
+
+
+
+
+
+ Pemeriksaan PA Sebelumnya
+
+
+
+
+
+
+ Keterangan PA Sebelumnya
+
+
+
+
+
+ Pemeriksaan Penunjang
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/ap-lab-order/entry.vue b/app/components/content/ap-lab-order/entry.vue
new file mode 100644
index 00000000..84349b70
--- /dev/null
+++ b/app/components/content/ap-lab-order/entry.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/ap-lab-order/list.vue b/app/components/content/ap-lab-order/list.vue
new file mode 100644
index 00000000..b04cf7e5
--- /dev/null
+++ b/app/components/content/ap-lab-order/list.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ @cancel=""
+ />
+
diff --git a/app/components/content/ap-lab-order/main.vue b/app/components/content/ap-lab-order/main.vue
new file mode 100644
index 00000000..033d093f
--- /dev/null
+++ b/app/components/content/ap-lab-order/main.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/app/const/page-permission/ambulatory.ts b/app/const/page-permission/ambulatory.ts
index b66106d1..c77b59a4 100644
--- a/app/const/page-permission/ambulatory.ts
+++ b/app/const/page-permission/ambulatory.ts
@@ -158,7 +158,7 @@ export const permissions: Record> = {
'emp|lab': ['R'],
'emp|rad': ['R'],
},
- '/ambulatory/encounter/[id]/process?menu=pa-lab-order': {
+ '/ambulatory/encounter/[id]/process?menu=ap-lab-order': {
'emp|doc': ['R', 'U'],
'emp|nur': ['R'],
'emp|thr': ['R'],
diff --git a/app/handlers/encounter-init.handler.ts b/app/handlers/encounter-init.handler.ts
index d70db428..a3dabf14 100644
--- a/app/handlers/encounter-init.handler.ts
+++ b/app/handlers/encounter-init.handler.ts
@@ -42,6 +42,7 @@ const PrescriptionAsync = defineAsyncComponent(() => import('~/components/conten
const CpLabOrderAsync = defineAsyncComponent(() => import('~/components/content/cp-lab-order/main.vue'))
const ProcedureRoomOrderAsync = defineAsyncComponent(() => import('~/components/content/procedure-room-order/main.vue'))
const MicroLabOrderAsync = defineAsyncComponent(() => import('~/components/content/micro-lab-order/main.vue'))
+const ApLabOrderAsync = defineAsyncComponent(() => import('~/components/content/ap-lab-order/main.vue'))
const CprjAsync = defineAsyncComponent(() => import('~/components/content/cprj/entry.vue'))
const RadiologyAsync = defineAsyncComponent(() => import('~/components/content/radiology-order/main.vue'))
const ConsultationAsync = defineAsyncComponent(() => import('~/components/content/consultation/list.vue'))
@@ -173,8 +174,8 @@ const defaultKeys: Record = {
classCode: ['ambulatory', 'emergency', 'inpatient'],
unit: 'all',
},
- paLabOrder: {
- id: 'pa-lab-order',
+ apLabOrder: {
+ id: 'ap-lab-order',
title: 'Order Lab PA',
classCode: ['ambulatory', 'emergency', 'inpatient'],
unit: 'all',
@@ -392,10 +393,10 @@ export function injectComponents(id: string | number, data: EncounterListData, m
currentKeys.microLabOrder['component'] = MicroLabOrderAsync
currentKeys.microLabOrder['props'] = { encounter_id: id }
}
- if (currentKeys?.paLabOrder) {
- // TODO: add component for paLabOrder
- currentKeys.paLabOrder['component'] = null
- currentKeys.paLabOrder['props'] = { encounter_id: id }
+ if (currentKeys?.apLabOrder) {
+ // TODO: add component for apLabOrder
+ currentKeys.apLabOrder['component'] = ApLabOrderAsync
+ currentKeys.apLabOrder['props'] = { encounter_id: id }
}
if (currentKeys?.procedureRoomOrder) {
currentKeys.procedureRoomOrder['component'] = ProcedureRoomOrderAsync
diff --git a/app/handlers/encounter-init.handler.vue.bu b/app/handlers/encounter-init.handler.vue.bu
new file mode 100644
index 00000000..6c1580f1
--- /dev/null
+++ b/app/handlers/encounter-init.handler.vue.bu
@@ -0,0 +1,587 @@
+import { isValidDate } from '~/lib/date'
+import { medicalRoles } from '~/const/common/role'
+
+export interface EncounterItem {
+ id: string
+ title: string
+ classCode?: string[]
+ unit?: string
+ afterId?: string
+ component?: any
+ props?: Record
+}
+
+export interface EncounterProps {
+ classCode: 'ambulatory' | 'emergency' | 'inpatient' | 'outpatient'
+ subClassCode: 'reg' | 'rehab' | 'chemo' | 'emg' | 'eon' | 'op' | 'icu' | 'hcu' | 'vk'
+}
+
+export interface EncounterListData {
+ encounter?: any
+ status?: any
+ medicalAssessment?: any
+ medicalAssessmentRehab: any
+ functionAssessment?: any
+ protocolTheraphy?: any
+ protocolChemotherapy?: any
+ medicineProtocolChemotherapy?: any
+ consultation?: any
+ letterOfControl?: any
+}
+
+const StatusAsync = defineAsyncComponent(() => import('~/components/content/encounter/status.vue'))
+const EarlyMedicalRehabListAsync = defineAsyncComponent(() => import('~/components/content/soapi/entry.vue'))
+const EarlyMedicalAssesmentListAsync = defineAsyncComponent(() => import('~/components/content/soapi/entry.vue'))
+const InitialNursingStudyAsync = defineAsyncComponent(() => import('~/components/content/initial-nursing/entry.vue'))
+// const AssesmentFunctionListAsync = defineAsyncComponent(() => import('~/components/content/soapi/entry.vue'))
+const KfrListAsync = defineAsyncComponent(() => import('~/components/content/kfr/main.vue'))
+const ChemoProtocolListAsync = defineAsyncComponent(() => import('~/components/app/chemotherapy/list.protocol.vue'))
+const ChemoMedicineProtocolListAsync = defineAsyncComponent(() => import('~/components/app/chemotherapy/list.medicine.vue'))
+const GeneralConsentListAsync = defineAsyncComponent(() => import('~/components/content/general-consent/entry.vue'))
+const CprjAsync = defineAsyncComponent(() => import('~/components/content/cprj/entry.vue'))
+
+const PrescriptionAsync = defineAsyncComponent(() => import('~/components/content/prescription/main.vue'))
+const DeviceOrderAsync = defineAsyncComponent(() => import('~/components/content/device-order/main.vue'))
+const RadiologyOrderAsync = defineAsyncComponent(() => import('~/components/content/radiology-order/main.vue'))
+const CpLabOrderAsync = defineAsyncComponent(() => import('~/components/content/cp-lab-order/main.vue'))
+const MicroLabOrderAsync = defineAsyncComponent(() => import('~/components/content/micro-lab-order/main.vue'))
+const ApLabOrderAsync = defineAsyncComponent(() => import('~/components/content/ap-lab-order/main.vue'))
+const ProcedureRoomOrderAsync = defineAsyncComponent(() => import('~/components/content/procedure-room-order/main.vue'))
+
+const ConsultationAsync = defineAsyncComponent(() => import('~/components/content/consultation/list.vue'))
+const DocUploadListAsync = defineAsyncComponent(() => import('~/components/content/document-upload/main.vue'))
+const ResumeListAsync = defineAsyncComponent(() => import('~/components/content/resume/main.vue'))
+const ControlLetterListAsync = defineAsyncComponent(() => import('~/components/content/control-letter/main.vue'))
+const PrbListAsync = defineAsyncComponent(() => import('~/components/content/prb/main.vue'))
+const SurgeryReportListAsync = defineAsyncComponent(() => import('~/components/content/surgery-report/main.vue'))
+const VaccineDataListAsync = defineAsyncComponent(() => import('~/components/content/vaccine-data/main.vue'))
+
+const defaultKeys: Record = {
+ status: {
+ id: 'status',
+ title: 'Status Masuk/Keluar',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ earlyMedicalRehabAssessment: {
+ id: 'rehab-medical-assessment',
+ title: 'Pengkajian Awal Medis Rehabilitasi Medis',
+ classCode: ['ambulatory'],
+ unit: 'rehab',
+ },
+ earlyMedicalAssessment: {
+ id: 'early-medical-assessment',
+ title: 'Pengkajian Awal Medis',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ afterId: 'early-medical-assessment',
+ },
+ initialNursingStudy: {
+ id: 'initial-nursing-study',
+ title: 'Kajian Awal Keperawatan',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ fkr: {
+ id: 'fkr',
+ title: 'FKR',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'rehab',
+ },
+ chemotherapyProtocol: {
+ id: 'chemotherapy-protocol',
+ title: 'Protokol Kemoterapi',
+ classCode: ['ambulatory'],
+ unit: 'chemo',
+ },
+ chemotherapyMedicine: {
+ id: 'chemotherapy-medicine',
+ title: 'Protokol Obat Kemoterapi',
+ classCode: ['ambulatory'],
+ unit: 'chemo',
+ },
+ educationAssessment: {
+ id: 'education-assessment',
+ title: 'Asesmen Kebutuhan Edukasi',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+
+ // NOTE: Replaced by FRK
+ // functionAssessment: {
+ // id: 'function-assessment',
+ // title: 'Asesmen Fungsi',
+ // classCode: ['ambulatory'],
+ // unit: 'rehab',
+ // afterId: 'rehab-medical-assessment',
+ // },
+ // therapyProtocol: {
+ // id: 'therapy-protocol',
+ // classCode: ['ambulatory'],
+ // title: 'Protokol Terapi',
+ // unit: 'rehab',
+ // afterId: 'function-assessment',
+ // },
+ generalConsent: {
+ id: 'general-consent',
+ title: 'General Consent',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ patientAmbNote: { // CPRJ
+ id: 'patient-amb-note',
+ title: 'CPRJ',
+ classCode: ['ambulatory', 'emergency'],
+ unit: 'ambulatory',
+ },
+ patientDevNote: { // CPPT
+ id: 'patient-dev-note',
+ title: 'CPP',
+ classCode: ['inpatient'],
+ unit: 'inpatient',
+ },
+
+ prescription: {
+ id: 'prescription',
+ title: 'Order Obat',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ deviceOrder: {
+ id: 'device-order',
+ title: 'Order Alkes',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ radiologyOrder: {
+ id: 'radiology-order',
+ title: 'Order Radiologi',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ cpLabOrder: {
+ id: 'cp-lab-order',
+ title: 'Order Lab PK',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ microLabOrder: {
+ id: 'micro-lab-order',
+ title: 'Order Lab Mikro',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ paLabOrder: {
+ id: 'pa-lab-order',
+ title: 'Order Lab PA',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ procedureRoomOrder: {
+ id: 'procedure-room-order',
+ title: 'Order Ruang Tindakan',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ mcuResult: {
+ id: 'mcu-result',
+ title: 'Hasil Penunjang',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ procedureReport: {
+ id: 'action-report',
+ title: 'Laporan Tindakan',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ operationReport: {
+ id: 'action-report',
+ title: 'Laporan Tindakan',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ ambulanceOrder: {
+ id: 'ambulance-order',
+ title: 'Order Ambulans',
+ classCode: ['ambulatory', 'emergency'],
+ unit: 'all',
+ },
+ surgeryReport: {
+ id: 'surgery-report',
+ title: 'Laporan Operasi',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ forensic: {
+ id: 'surgery-report',
+ title: 'Laporan Operasi',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ consultation: {
+ id: 'consultation',
+ title: 'Konsultasi',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ resume: {
+ id: 'resume',
+ title: 'Resume Medis',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ controlLetter: {
+ id: 'control-letter',
+ title: 'Surat Kontrol',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ inpatientLetter: {
+ id: 'inpatient-letter',
+ title: 'SPRI',
+ classCode: ['ambulatory', 'emergency'],
+ unit: 'all',
+ },
+ refBack: {
+ id: 'reference-back',
+ title: 'PRB',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ screening: {
+ id: 'screening',
+ title: 'Skrinning MPP',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ supportingDocument: {
+ id: 'supporting-document',
+ title: 'Upload Dokumen Pendukung',
+ classCode: ['ambulatory'],
+ unit: 'all',
+ },
+ vaccineData: {
+ id: 'vaccine-data',
+ title: 'Data Vaksin',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+ priceList: {
+ id: 'price-list',
+ title: 'Tarif Tindakan',
+ classCode: ['ambulatory', 'emergency', 'inpatient'],
+ unit: 'all',
+ },
+}
+
+export function getItemsByClassCode(classCode: string, items: EncounterItem[]) {
+ return items.filter((item) => item.classCode?.includes(classCode))
+}
+
+export function getItemsByUnit(unit: string, items: EncounterItem[]) {
+ return items.filter((item) => item.unit === unit)
+}
+
+export function getItemsByIds(ids: string[], items: EncounterItem[]) {
+ return items.filter((item) => ids.includes(item.id))
+}
+
+export function getIndexById(id: string, items: EncounterItem[]) {
+ return items.findIndex((item) => item.id === id)
+}
+
+export const getItemsAll = (classCode: string, unit: string, items: EncounterItem[]) => {
+ const prevItems = [...items]
+ let updateItems = getItemsByClassCode(classCode, prevItems)
+ updateItems = getItemsByUnit(unit, updateItems)
+ return updateItems
+}
+
+export function insertItemByAfterId(id: string, items: EncounterItem[], newItem: EncounterItem) {
+ const index = getIndexById(id, items)
+ if (index > -1) {
+ items.splice(index + 1, 0, newItem)
+ }
+}
+
+export function injectComponents(id: string | number, data: EncounterListData, meta: EncounterListData) {
+ const currentKeys = { ...defaultKeys }
+ if (currentKeys?.status) {
+ currentKeys.status['component'] = StatusAsync
+ currentKeys.status['props'] = { encounter: data?.encounter }
+ }
+ if (currentKeys?.earlyMedicalAssessment) {
+ currentKeys.earlyMedicalAssessment['component'] = EarlyMedicalAssesmentListAsync
+ currentKeys.earlyMedicalAssessment['props'] = {
+ encounter: data?.encounter,
+ type: 'early-medic',
+ label: currentKeys.earlyMedicalAssessment['title'],
+ }
+ }
+ if (currentKeys?.earlyMedicalRehabAssessment) {
+ currentKeys.earlyMedicalRehabAssessment['component'] = EarlyMedicalRehabListAsync
+ currentKeys.earlyMedicalRehabAssessment['props'] = {
+ encounter: data?.encounter,
+ type: 'early-rehab',
+ label: currentKeys.earlyMedicalRehabAssessment['title'],
+ }
+ }
+ if (currentKeys?.functionAssessment) {
+ currentKeys.functionAssessment['component'] = AssesmentFunctionListAsync
+ currentKeys.functionAssessment['props'] = {
+ encounter: data?.encounter,
+ type: 'function',
+ label: currentKeys.functionAssessment['title'],
+ }
+ }
+ if (currentKeys?.therapyProtocol) {
+ // TODO: add component for therapyProtocol
+ currentKeys.therapyProtocol['component'] = null
+ currentKeys.therapyProtocol['props'] = {
+ data: data?.encounter,
+ paginationMeta: meta?.protocolTheraphy,
+ }
+ }
+ if (currentKeys?.chemotherapyProtocol) {
+ currentKeys.chemotherapyProtocol['component'] = ChemoProtocolListAsync
+ currentKeys.chemotherapyProtocol['props'] = {
+ data: data?.encounter,
+ paginationMeta: meta?.protocolChemotherapy,
+ }
+ }
+ if (currentKeys?.chemotherapyMedicine) {
+ currentKeys.chemotherapyMedicine['component'] = ChemoMedicineProtocolListAsync
+ currentKeys.chemotherapyMedicine['props'] = {
+ data: data?.encounter,
+ paginationMeta: meta?.medicineProtocolChemotherapy,
+ }
+ }
+ if (currentKeys?.educationAssessment) {
+ // TODO: add component for education assessment
+ currentKeys.educationAssessment['component'] = null
+ currentKeys.educationAssessment['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.generalConsent) {
+ currentKeys.generalConsent['component'] = GeneralConsentListAsync
+ currentKeys.generalConsent['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.patientAmbNote) {
+ currentKeys.patientAmbNote['component'] = CprjAsync
+ currentKeys.patientAmbNote['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.prescription) {
+ currentKeys.prescription['component'] = PrescriptionAsync
+ currentKeys.prescription['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.deviceOrder) {
+ currentKeys.deviceOrder['component'] = DeviceOrderAsync
+ currentKeys.deviceOrder['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.radiologyOrder) {
+ currentKeys.radiologyOrder['component'] = RadiologyOrderAsync
+ currentKeys.radiologyOrder['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.cpLabOrder) {
+ currentKeys.cpLabOrder['component'] = CpLabOrderAsync
+ currentKeys.cpLabOrder['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.microLabOrder) {
+ currentKeys.microLabOrder['component'] = MicroLabOrderAsync
+ currentKeys.microLabOrder['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.paLabOrder) {
+ // TODO: add component for paLabOrder
+ currentKeys.paLabOrder['component'] = null
+ currentKeys.paLabOrder['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.procedureRoomOrder) {
+ currentKeys.procedureRoomOrder['component'] = ProcedureRoomOrderAsync
+ currentKeys.procedureRoomOrder['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.mcuResult) {
+ // TODO: add component for mcuResult
+ currentKeys.mcuResult['component'] = null
+ currentKeys.mcuResult['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.consultation) {
+ currentKeys.consultation['component'] = ConsultationAsync
+ currentKeys.consultation['props'] = { encounter: data?.encounter }
+ }
+ if (currentKeys?.resume) {
+ currentKeys.resume['component'] = ResumeListAsync
+ currentKeys.resume['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.controlLetter) {
+ currentKeys.controlLetter['component'] = ControlLetterListAsync
+ currentKeys.controlLetter['props'] = { encounter: data?.encounter }
+ }
+ if (currentKeys?.refBack) {
+ currentKeys.refBack['component'] = PrbListAsync
+ currentKeys.refBack['props'] = { encounter: data?.encounter }
+ }
+ if (currentKeys?.fkr) {
+ currentKeys.fkr['component'] = KfrListAsync
+ currentKeys.fkr['props'] = { encounter: data?.encounter }
+ }
+ if (currentKeys?.screening) {
+ // TODO: add component for screening
+ currentKeys.screening['component'] = null
+ currentKeys.screening['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.surgeryReport) {
+ currentKeys.surgeryReport['component'] = SurgeryReportListAsync
+ currentKeys.surgeryReport['props'] = { encounter: data?.encounter }
+ }
+ if (currentKeys?.vaccineData) {
+ currentKeys.vaccineData['component'] = VaccineDataListAsync
+ currentKeys.vaccineData['props'] = { encounter: data?.encounter }
+ }
+ if (currentKeys?.supportingDocument) {
+ currentKeys.supportingDocument['component'] = DocUploadListAsync
+ currentKeys.supportingDocument['props'] = { encounter_id: id }
+ }
+ if (currentKeys?.priceList) {
+ // TODO: add component for priceList
+ currentKeys.priceList['component'] = null
+ currentKeys.priceList['props'] = { encounter_id: id }
+ }
+
+ if (currentKeys?.initialNursingStudy) {
+ currentKeys.initialNursingStudy['component'] = InitialNursingStudyAsync
+ currentKeys.initialNursingStudy['props'] = { encounter: data?.encounter }
+ }
+
+ return currentKeys
+}
+
+export function mergeArrayAt(arraysOne: T[], arraysTwo: T[] | T, deleteCount = 0): T[] {
+ const prevItems = arraysOne.slice()
+ if (!prevItems) return prevItems
+ const nextItems = Array.isArray(arraysTwo) ? arraysTwo : [arraysTwo]
+ if (nextItems.length === 0) return prevItems
+ // determine insertion position using the first item's `id` if available
+ const firstId = (nextItems[0] as any)?.afterId || (prevItems[0] as any)?.id
+ let pos = prevItems.length
+ if (typeof firstId === 'string') {
+ const index = prevItems.findIndex((item: any) => item.id === firstId)
+ pos = index < 0 ? Math.max(prevItems.length + index, 0) : Math.min(index, prevItems.length)
+ }
+ prevItems.splice(pos, deleteCount, ...nextItems)
+ return prevItems
+}
+
+// Function to map API response to Encounter structure
+export function mapResponseToEncounter(result: any): any {
+ if (!result) return null
+
+ // Check if patient and patient.person exist (minimal validation)
+ if (!result.patient || !result.patient.person) {
+ return null
+ }
+
+ const mapped: any = {
+ id: result.id || 0,
+ patient_id: result.patient_id || result.patient?.id || 0,
+ patient: {
+ id: result.patient?.id || 0,
+ number: result.patient?.number || '',
+ person: {
+ id: result.patient?.person?.id || 0,
+ name: result.patient?.person?.name || '',
+ birthDate: result.patient?.person?.birthDate || null,
+ gender_code: result.patient?.person?.gender_code || '',
+ residentIdentityNumber: result.patient?.person?.residentIdentityNumber || null,
+ frontTitle: result.patient?.person?.frontTitle || '',
+ endTitle: result.patient?.person?.endTitle || '',
+ addresses: result.patient?.person?.addresses || [],
+ },
+ },
+ registeredAt: result.registeredAt || result.patient?.registeredAt || null,
+ class_code: result.class_code || '',
+ unit_id: result.unit_id || 0,
+ unit: result.unit || null,
+ specialist_id: result.specialist_id || null,
+ subspecialist_id: result.subspecialist_id || null,
+ visitDate: isValidDate(result.visitDate)
+ ? result.visitDate
+ : result.registeredAt || result.patient?.registeredAt || null,
+ adm_employee_id: result.adm_employee_id || 0,
+ adm_employee: result.adm_employee || null,
+ responsible_nurse_code: result.responsible_nurse_code || null,
+ responsible_nurse: result.responsible_nurse || null,
+ appointment_doctor_code: result.appointment_doctor_code || null,
+ appointment_doctor: result.appointment_doctor || null,
+ responsible_doctor_code: result.responsible_doctor_id || null,
+ responsible_doctor: result.responsible_doctor || null,
+ refSource_name: result.refSource_name || null,
+ appointment_id: result.appointment_id || null,
+ earlyEducation: result.earlyEducation || null,
+ medicalDischargeEducation: result.medicalDischargeEducation || '',
+ admDischargeEducation: result.admDischargeEducation || null,
+ discharge_method_code: result.discharge_method_code || null,
+ discharge_reason: result.dischargeReason || result.discharge_reason || null,
+ discharge_date: result.discharge_date || null,
+ status_code: result.status_code || '',
+ // Payment related fields
+ paymentMethod_code:
+ result.paymentMethod_code && result.paymentMethod_code.trim() !== '' ? result.paymentMethod_code : null,
+ trx_number: result.trx_number || null,
+ member_number: result.member_number || null,
+ ref_number: result.ref_number || null,
+ }
+
+ return mapped
+}
+
+export function getMenuItems(
+ id: string | number,
+ props: any,
+ user: any,
+ data: EncounterListData,
+ meta: any,
+) {
+ // const normalClassCode = props.classCode === 'ambulatory' ? 'outpatient' : props.classCode
+ const normalClassCode = props.classCode === 'ambulatory' ? 'ambulatory' : props.classCode
+ const currentKeys = injectComponents(id, data, meta)
+ const defaultItems: EncounterItem[] = Object.values(currentKeys)
+ const listItemsForOutpatientRehab = mergeArrayAt(
+ getItemsAll('ambulatory', 'all', defaultItems),
+ getItemsAll('ambulatory', 'rehab', defaultItems),
+ )
+ const listItemsForOutpatientChemo = mergeArrayAt(
+ getItemsAll('ambulatory', 'all', defaultItems),
+ getItemsAll('ambulatory', 'chemo', defaultItems),
+ )
+ const listItems: Record>> = {
+ 'installation|ambulatory': {
+ 'unit|rehab': {
+ items: listItemsForOutpatientRehab,
+ roles: medicalRoles,
+ },
+ 'unit|chemo': {
+ items: listItemsForOutpatientChemo,
+ roles: medicalRoles,
+ },
+ all: getItemsAll('ambulatory', 'all', defaultItems),
+ },
+ 'installation|emergency': {
+ all: getItemsAll('emergency', 'all', defaultItems),
+ },
+ 'installation|inpatient': {
+ all: getItemsAll('inpatient', 'all', defaultItems),
+ },
+ }
+ const currentListItems = listItems[`installation|${normalClassCode}`]
+ if (!currentListItems) return []
+ const unitCode = user?.unit_code ? `unit|${user.unit_code}` : 'all'
+ const currentUnitItems: any = currentListItems[`${unitCode}`]
+ if (!currentUnitItems) return []
+ let menus = []
+ if (currentUnitItems.roles && currentUnitItems.roles?.includes(user.activeRole)) {
+ menus = [...currentUnitItems.items]
+ } else {
+ menus = unitCode !== 'all' && currentUnitItems?.items ? [...currentUnitItems.items] : [...currentUnitItems]
+ }
+ return menus
+}