diff --git a/app/components/content/encounter/home.vue b/app/components/content/encounter/home.vue index 3ecc70c0..924433ef 100644 --- a/app/components/content/encounter/home.vue +++ b/app/components/content/encounter/home.vue @@ -21,6 +21,8 @@ import Consultation from '~/components/content/consultation/list.vue' import ProtocolList from '~/components/app/chemotherapy/list.protocol.vue' import MedicineProtocolList from '~/components/app/chemotherapy/list.medicine.vue' +import { listItems } from '~/handlers/encounter-process.handler' + const route = useRoute() const router = useRouter() @@ -30,12 +32,15 @@ const props = defineProps<{ subClassCode?: 'reg' | 'rehab' | 'chemo' | 'emg' | 'eon' | 'op' | 'icu' | 'hcu' | 'vk' }>() -const { getActiveRole } = useUserStore() +const { user, getActiveRole } = useUserStore() const activeRole = getActiveRole() const activePosition = ref(getPositionAs(activeRole)) const tabs = ref([] as any) const currentDisplay = ref(props.display ?? 'tab') +console.log(JSON.stringify(user, null, 4)) +console.log(listItems) + // activeTab selalu sinkron dengan query param const activeMenu = computed({ get: () => (route.query?.menu && typeof route.query.menu === 'string' ? route.query.menu : 'status'), diff --git a/app/components/content/encounter/process-previous.vue b/app/components/content/encounter/process-previous.vue new file mode 100644 index 00000000..23640af7 --- /dev/null +++ b/app/components/content/encounter/process-previous.vue @@ -0,0 +1,94 @@ + + + diff --git a/app/handlers/encounter-process.handler.ts b/app/handlers/encounter-process.handler.ts new file mode 100644 index 00000000..e9ff212c --- /dev/null +++ b/app/handlers/encounter-process.handler.ts @@ -0,0 +1,236 @@ +import { medicalPositions } from "~/lib/roles" + +export interface EncounterItem { + id: string + title: string + classCode?: string[] + unit?: string, + afterId?: string +} + +export const defaultItems: EncounterItem[] = [ + { + id: 'status', + title: 'Status Masuk/Keluar', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'early-medical-assessment', + title: 'Pengkajian Awal Medis', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'rehab-medical-assessment', + title: 'Pengkajian Awal Medis Rehabilitasi Medis', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'rehab', + afterId: 'early-medical-assessment', + }, + { + id: 'function-assessment', + title: 'Asesmen Fungsi', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'rehab', + afterId: 'rehab-medical-assessment', + }, + { + id: 'therapy-protocol', + classCode: ['ambulatory'], + title: 'Protokol Terapi', + unit: 'rehab', + afterId: 'function-assessment', + }, + { + id: 'chemotherapy-protocol', + title: 'Protokol Kemoterapi', + classCode: ['ambulatory'], + unit: 'chemo', + }, + { + id: 'chemotherapy-medicine', + title: 'Protokol Obat Kemoterapi', + classCode: ['ambulatory'], + unit: 'chemo', + }, + { + id: 'report', + title: 'Laporan Tindakan', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'patient-note', + title: 'CPRJ', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'education-assessment', + title: 'Asesmen Kebutuhan Edukasi', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'consent', + title: 'General Consent', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'prescription', + title: 'Order Obat', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'device', + title: 'Order Alkes', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'mcu-radiology', + title: 'Order Radiologi', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'mcu-lab-pc', + title: 'Order Lab PK', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'mcu-lab-micro', + title: 'Order Lab Mikro', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'mcu-lab-pa', + title: 'Order Lab PA', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'medical-action', + title: 'Order Ruang Tindakan', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'mcu-result', + title: 'Hasil Penunjang', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'consultation', + title: 'Konsultasi', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'resume', + title: 'Resume', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'control', + title: 'Surat Kontrol', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'screening', + title: 'Skrinning MPP', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, + { + id: 'supporting-document', + title: 'Upload Dokumen Pendukung', + classCode: ['ambulatory'], + unit: 'rehab', + }, + { + id: 'price-list', + title: 'Tarif Tindakan', + classCode: ['ambulatory', 'emergency', 'inpatient'], + unit: 'all', + }, +] + +const getItemsByClassCode = (classCode: string, items: EncounterItem[]) => { + return items.filter((item) => item.classCode?.includes(classCode)) +} + +const getItemsByUnit = (unit: string, items: EncounterItem[]) => { + return items.filter((item) => item.unit === unit) +} + +const getItemsByIds = (ids: string[], items: EncounterItem[]) => { + return items.filter((item) => ids.includes(item.id)) +} + +const getIndexById = (id: string, items: EncounterItem[]) => { + return items.findIndex((item) => item.id === id) +} + +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 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 +} + +export const getItemsAll = (classCode: string, unit: string, items: EncounterItem[]) => { + const prevItems = [...items] + let updateItems = getItemsByClassCode(classCode, prevItems) + updateItems = getItemsByUnit(unit, updateItems) + return updateItems +} + +const listItemsForOutpatientRehab = mergeArrayAt( + getItemsAll('ambulatory', 'all', defaultItems), + getItemsByIds(['rehab-medical-assessment', 'function-assessment', 'therapy-protocol'], defaultItems), +) + +export const listItems = { + 'installation|outpatient': { + 'unit|rehab': { + 'items': listItemsForOutpatientRehab, + 'roles': medicalPositions, + }, + 'all': getItemsAll('ambulatory', 'all', defaultItems), + }, + 'installation|emergency': { + 'all': getItemsAll('emergency', 'all', defaultItems), + }, + 'installation|inpatient': { + 'all': getItemsAll('inpatient', 'all', defaultItems), + } +} diff --git a/app/lib/roles.ts b/app/lib/roles.ts index 4a7be625..b6cdd8b7 100644 --- a/app/lib/roles.ts +++ b/app/lib/roles.ts @@ -1,9 +1,9 @@ -const standartRoles = ['emp|doc', 'emp|nur', 'emp|reg', 'emp|pha', 'emp|pay', 'emp|mng'] +export const medicalPositions = ['emp|doc', 'emp|nur', 'emp|nut', 'emp|mid', 'emp|lab', 'emp|reg', 'emp|pha', 'emp|pay', 'emp|mng'] const verificatorRole = 'verificator' export function getPositionAs(roleAccess: string): string { if (roleAccess.includes('|')) { - if (standartRoles.includes(roleAccess)) { + if (medicalPositions.includes(roleAccess)) { return 'medical' } if (roleAccess.includes(verificatorRole)) {