// stores/penunjangStore.js import { defineStore } from 'pinia'; import { ref, computed } from 'vue'; export const usePenunjangStore = defineStore('penunjang', () => { // State - Penunjang Data const penunjangData = ref([ { id: 1, no: 1, kode: 'LAB', nama: 'LABORATORIUM', jenis: 'Medis', shift: 3, totalQuota: 150, jamShiftList: [ { dari: '07:00', sampai: '15:00', kuota: 60 }, { dari: '13:00', sampai: '21:00', kuota: 50 }, { dari: '21:00', sampai: '07:00', kuota: 40 } ], autoShift: true, jadwalOperasional: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at', 'Sabtu', 'Minggu'], status: 'Aktif', estimasiLayanan: 30, keterangan: 'Pemeriksaan darah lengkap, urine, dan pemeriksaan laboratorium lainnya' }, { id: 2, no: 2, kode: 'RAD', nama: 'RADIOLOGI', jenis: 'Medis', shift: 2, totalQuota: 100, jamShiftList: [ { dari: '07:00', sampai: '15:00', kuota: 60 }, { dari: '13:00', sampai: '21:00', kuota: 40 } ], autoShift: true, jadwalOperasional: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at', 'Sabtu'], status: 'Aktif', estimasiLayanan: 45, keterangan: 'Rontgen, CT Scan, MRI, USG, dan pemeriksaan radiologi lainnya' }, { id: 3, no: 3, kode: 'PAT', nama: 'PATOLOGI ANATOMI', jenis: 'Medis', shift: 1, totalQuota: 50, jamShiftList: [ { dari: '07:00', sampai: '15:00', kuota: 50 } ], autoShift: false, jadwalOperasional: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at'], status: 'Aktif', estimasiLayanan: 60, keterangan: 'Pemeriksaan jaringan dan sitologi' }, { id: 4, no: 4, kode: 'RHB', nama: 'REHABILITASI MEDIK', jenis: 'Medis', shift: 2, totalQuota: 80, jamShiftList: [ { dari: '07:00', sampai: '13:00', kuota: 40 }, { dari: '13:00', sampai: '19:00', kuota: 40 } ], autoShift: true, jadwalOperasional: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at'], status: 'Aktif', estimasiLayanan: 30, keterangan: 'Fisioterapi, terapi okupasi, dan terapi wicara' }, { id: 5, no: 5, kode: 'RME', nama: 'REKAM MEDIS', jenis: 'Non-Medis', shift: 2, totalQuota: 120, jamShiftList: [ { dari: '07:00', sampai: '15:00', kuota: 70 }, { dari: '13:00', sampai: '21:00', kuota: 50 } ], autoShift: true, jadwalOperasional: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at', 'Sabtu'], status: 'Aktif', estimasiLayanan: 15, keterangan: 'Pengurusan dokumen rekam medis dan surat keterangan' }, { id: 6, no: 6, kode: 'GIZ', nama: 'GIZI', jenis: 'Non-Medis', shift: 2, totalQuota: 60, jamShiftList: [ { dari: '07:00', sampai: '13:00', kuota: 30 }, { dari: '13:00', sampai: '19:00', kuota: 30 } ], autoShift: true, jadwalOperasional: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at'], status: 'Aktif', estimasiLayanan: 20, keterangan: 'Konsultasi gizi dan diet' }, { id: 7, no: 7, kode: 'LND', nama: 'LAUNDRY', jenis: 'Non-Medis', shift: 3, totalQuota: 200, jamShiftList: [ { dari: '06:00', sampai: '14:00', kuota: 80 }, { dari: '14:00', sampai: '22:00', kuota: 70 }, { dari: '22:00', sampai: '06:00', kuota: 50 } ], autoShift: true, jadwalOperasional: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at', 'Sabtu', 'Minggu'], status: 'Aktif', estimasiLayanan: 10, keterangan: 'Layanan laundry linen rumah sakit' }, { id: 8, no: 8, kode: 'INF', nama: 'PELAYANAN INFORMASI', jenis: 'Non-Medis', shift: 2, totalQuota: 150, jamShiftList: [ { dari: '07:00', sampai: '15:00', kuota: 80 }, { dari: '13:00', sampai: '21:00', kuota: 70 } ], autoShift: true, jadwalOperasional: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at', 'Sabtu', 'Minggu'], status: 'Aktif', estimasiLayanan: 10, keterangan: 'Informasi umum rumah sakit dan bantuan navigasi' }, { id: 9, no: 9, kode: 'FRM', nama: 'FARMASI', jenis: 'Medis', shift: 3, totalQuota: 200, jamShiftList: [ { dari: '07:00', sampai: '15:00', kuota: 80 }, { dari: '13:00', sampai: '21:00', kuota: 70 }, { dari: '21:00', sampai: '07:00', kuota: 50 } ], autoShift: true, jadwalOperasional: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at', 'Sabtu', 'Minggu'], status: 'Aktif', estimasiLayanan: 20, keterangan: 'Pelayanan obat dan konsultasi farmasi' } ]); // Computed const totalPenunjang = computed(() => penunjangData.value.length); const activePenunjang = computed(() => penunjangData.value.filter(p => p.status === 'Aktif')); const penunjangMedis = computed(() => penunjangData.value.filter(p => p.jenis === 'Medis')); const penunjangNonMedis = computed(() => penunjangData.value.filter(p => p.jenis === 'Non-Medis')); // Get penunjang list for dropdowns // Standardized to use 'name' for consistency (keeping 'nama' for backward compatibility) const penunjangList = computed(() => penunjangData.value .filter(p => p.status === 'Aktif') .map(p => ({ id: p.id, kode: p.kode, nama: p.nama, // Keep 'nama' for internal consistency name: p.nama // Add 'name' alias for external compatibility })) ); // Actions - CRUD Operations const addPenunjang = (penunjangPayload) => { const newId = Math.max(...penunjangData.value.map(p => p.id), 0) + 1; const newNo = penunjangData.value.length + 1; const totalQuota = penunjangPayload.jamShiftList.reduce((total, shift) => { return total + (parseInt(shift.kuota) || 0); }, 0); const newPenunjang = { id: newId, no: newNo, ...penunjangPayload, totalQuota: totalQuota, }; penunjangData.value.push(newPenunjang); return { success: true, message: `Penunjang ${newPenunjang.nama} berhasil ditambahkan`, data: newPenunjang }; }; const updatePenunjang = (penunjangPayload) => { const index = penunjangData.value.findIndex(p => p.id === penunjangPayload.id); if (index !== -1) { const totalQuota = penunjangPayload.jamShiftList.reduce((total, shift) => { return total + (parseInt(shift.kuota) || 0); }, 0); penunjangData.value[index] = { ...penunjangData.value[index], ...penunjangPayload, totalQuota: totalQuota, }; return { success: true, message: `Penunjang ${penunjangPayload.nama} berhasil diupdate` }; } return { success: false, message: 'Penunjang tidak ditemukan' }; }; const deletePenunjang = (penunjangId) => { const index = penunjangData.value.findIndex(p => p.id === penunjangId); if (index !== -1) { const penunjangName = penunjangData.value[index].nama; penunjangData.value.splice(index, 1); penunjangData.value.forEach((p, idx) => { p.no = idx + 1; }); return { success: true, message: `Penunjang ${penunjangName} berhasil dihapus` }; } return { success: false, message: 'Penunjang tidak ditemukan' }; }; const getPenunjangById = (id) => { return penunjangData.value.find(p => p.id === id); }; const getPenunjangByKode = (kode) => { return penunjangData.value.find(p => p.kode === kode); }; // Get active penunjang list (untuk Admin Penunjang) const getActivePenunjangList = () => { return penunjangData.value .filter(p => p.status === 'Aktif') .map(p => ({ id: p.id, name: p.nama, kode: p.kode })); }; // Utility function const getPenunjangNameByKode = (kode) => { const penunjang = penunjangData.value.find(p => p.kode === kode); return penunjang ? penunjang.nama : kode; }; return { // State penunjangData, totalPenunjang, activePenunjang, penunjangMedis, penunjangNonMedis, penunjangList, // Actions addPenunjang, updatePenunjang, deletePenunjang, getPenunjangById, getPenunjangByKode, getActivePenunjangList, getPenunjangNameByKode, }; }, { persist: { key: 'penunjang-store-state', storage: typeof window !== 'undefined' ? localStorage : undefined, paths: ['penunjangData'], }, });