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), } }