Files
web-antrean/stores/masterStore.js
T

291 lines
11 KiB
JavaScript

// stores/masterStore.js - Backward Compatibility Layer
// NOTE: Phase 3 - masterStore sekarang hanya sebagai compatibility layer
// Data sebenarnya ada di: loketStore, ruangStore, penunjangStore, clinicStore
import { defineStore } from 'pinia';
import { computed } from 'vue';
import { useClinicStore } from './clinicStore';
import { useLoketStore } from './loketStore';
import { useRuangStore } from './ruangStore';
import { usePenunjangStore } from './penunjangStore';
export const useMasterStore = defineStore('master', () => {
// Store references
const clinicStore = useClinicStore();
const loketStore = useLoketStore();
const ruangStore = useRuangStore();
const penunjangStore = usePenunjangStore();
// ============================================
// MASTER KLINIK (Backward Compatibility)
// ============================================
// NOTE: klinikData sekarang adalah computed yang reference clinicStore (single source of truth)
// Ini untuk backward compatibility dengan pages yang masih menggunakan masterStore.klinikData
// Format: { id, no, kode, nama, shift, totalQuota, jamShiftList, autoShift, jadwalKlinik }
const klinikData = computed(() => {
console.log('📊 masterStore.klinikData computed called');
console.log('📊 clinicStore.clinics.length:', clinicStore.clinics.length);
// Sort by kode first, then by jenisLayanan (Reguler before Eksekutif)
const sortedClinics = [...clinicStore.clinics].sort((a, b) => {
// First sort by kode
if (a.kode < b.kode) return -1;
if (a.kode > b.kode) return 1;
// If same kode, sort by jenisLayanan (Reguler before Eksekutif)
if (a.jenisLayanan === 'Reguler' && b.jenisLayanan === 'Eksekutif') return -1;
if (a.jenisLayanan === 'Eksekutif' && b.jenisLayanan === 'Reguler') return 1;
// Finally sort by ID if both are same
return a.id - b.id;
});
console.log('📊 sortedClinics.length:', sortedClinics.length);
const result = sortedClinics.map((clinic, index) => {
// Convert clinic data ke format masterStore (untuk backward compatibility)
return {
id: clinic.id,
no: index + 1,
kode: clinic.kode,
nama: clinic.name, // Convert 'name' to 'nama' for compatibility
shift: typeof clinic.shift === 'string' ? parseInt(clinic.shift.replace(/[^0-9]/g, '')) || 1 : clinic.shift || 1,
totalQuota: clinic.totalQuota || 0,
jamShiftList: clinic.jamShiftList || [],
jamShiftPerHari: clinic.jamShiftPerHari || {}, // New: shift configuration per day
autoShift: clinic.autoShift || false,
jadwalKlinik: clinic.jadwalKlinik || [],
tanggalTutup: clinic.tanggalTutup || [], // New: array of closed dates
jenisLayanan: clinic.jenisLayanan || 'Reguler',
};
});
console.log('📊 masterStore.klinikData result:', result.length, 'items');
if (result.length > 0) {
console.log('📋 First item:', result[0]);
}
return result;
});
// Computed - Get klinik list for dropdowns
const klinikList = computed(() => {
const availableCodes = new Set(klinikData.value.map((k) => k.kode));
// getClinicsForDropdown() sudah mengembalikan { id, name, kode, icon, available }
const baseList = typeof clinicStore.getClinicsForDropdown === 'function'
? clinicStore.getClinicsForDropdown()
: [];
return baseList
.filter((c) => availableCodes.has(c.kode))
.map((c) => ({
id: c.id,
kode: c.kode,
nama: c.name,
}));
});
// Actions - Klinik (delegate to clinicStore)
const addKlinik = (klinikPayload) => {
// Map masterStore format ke clinicStore format
const mappedClinic = {
...klinikPayload,
name: klinikPayload.nama, // Convert 'nama' to 'name'
shift: `Shift ${klinikPayload.shift || 1}`, // Convert number to string format
};
return clinicStore.addClinic(mappedClinic);
};
const updateKlinik = (klinikPayload) => {
// Map masterStore format ke clinicStore format
const clinicUpdates = {
...klinikPayload,
name: klinikPayload.nama, // Convert 'nama' to 'name'
shift: `Shift ${klinikPayload.shift}`, // Convert number to string format
};
return clinicStore.updateClinic(klinikPayload.id, clinicUpdates);
};
const deleteKlinik = (klinikId) => {
return clinicStore.deleteClinic(klinikId);
};
const getKlinikById = (id) => {
// Menggunakan getter dari clinicStore
const clinic = clinicStore.clinics.find(c => c.id === id);
if (clinic) {
return {
id: clinic.id,
no: klinikData.value.findIndex(k => k.id === clinic.id) + 1, // Recalculate 'no'
kode: clinic.kode,
nama: clinic.name,
shift: typeof clinic.shift === 'string' ? parseInt(clinic.shift.replace(/[^0-9]/g, '')) || 1 : clinic.shift || 1,
totalQuota: clinic.totalQuota,
jamShiftList: clinic.jamShiftList,
autoShift: clinic.autoShift,
jadwalKlinik: clinic.jadwalKlinik,
};
}
return undefined;
};
const getKlinikByKode = (kode) => {
// Menggunakan getter dari clinicStore
const clinic = clinicStore.getClinicByKode(kode);
if (clinic) {
return {
id: clinic.id,
no: klinikData.value.findIndex(k => k.kode === clinic.kode) + 1, // Recalculate 'no'
kode: clinic.kode,
nama: clinic.name,
shift: typeof clinic.shift === 'string' ? parseInt(clinic.shift.replace(/[^0-9]/g, '')) || 1 : clinic.shift || 1,
totalQuota: clinic.totalQuota,
jamShiftList: clinic.jamShiftList,
autoShift: clinic.autoShift,
jadwalKlinik: clinic.jadwalKlinik,
};
}
return undefined;
};
// ============================================
// MASTER LOKET (Backward Compatibility)
// ============================================
// Reference dari loketStore
const loketData = computed(() => loketStore.loketData);
// availableServices adalah computed dari loketStore
// Pinia computed sudah handle reactivity dengan baik, jadi akses langsung
// loketStore.availableServices adalah computed, jadi kita bisa langsung reference
const availableServices = computed(() => {
// loketStore.availableServices adalah computed, akses .value untuk mendapatkan array
const services = loketStore.availableServices;
return services?.value || services || [];
});
// Actions - Loket (delegate to loketStore)
const addLoket = (loketPayload) => loketStore.addLoket(loketPayload);
const updateLoket = (loketPayload) => loketStore.updateLoket(loketPayload);
const deleteLoket = (loketId) => loketStore.deleteLoket(loketId);
const getLoketById = (id) => loketStore.getLoketById(id);
// ============================================
// MASTER KLINIK RUANG (Backward Compatibility)
// ============================================
// Reference dari ruangStore
const ruangData = computed(() => ruangStore.ruangData);
const totalKlinikRuang = computed(() => ruangStore.totalKlinikRuang);
const totalRuangan = computed(() => ruangStore.totalRuangan);
const getAllRuangList = computed(() => ruangStore.getAllRuangList);
// Actions - Ruang (delegate to ruangStore)
const addRuang = (ruangPayload) => ruangStore.addRuang(ruangPayload);
const updateRuang = (ruangPayload) => ruangStore.updateRuang(ruangPayload);
const deleteRuang = (ruangId) => ruangStore.deleteRuang(ruangId);
const getRuangByKlinik = (kodeKlinik) => ruangStore.getRuangByKlinik(kodeKlinik);
// ============================================
// MASTER PENUNJANG (Backward Compatibility)
// ============================================
// Reference dari penunjangStore
const penunjangData = computed(() => penunjangStore.penunjangData);
const totalPenunjang = computed(() => penunjangStore.totalPenunjang);
const activePenunjang = computed(() => penunjangStore.activePenunjang);
const penunjangMedis = computed(() => penunjangStore.penunjangMedis);
const penunjangNonMedis = computed(() => penunjangStore.penunjangNonMedis);
const penunjangList = computed(() => penunjangStore.penunjangList);
// Actions - Penunjang (delegate to penunjangStore)
const addPenunjang = (penunjangPayload) => penunjangStore.addPenunjang(penunjangPayload);
const updatePenunjang = (penunjangPayload) => penunjangStore.updatePenunjang(penunjangPayload);
const deletePenunjang = (penunjangId) => penunjangStore.deletePenunjang(penunjangId);
const getPenunjangById = (id) => penunjangStore.getPenunjangById(id);
const getPenunjangByKode = (kode) => penunjangStore.getPenunjangByKode(kode);
const getActivePenunjangList = () => penunjangStore.getActivePenunjangList();
// ============================================
// UTILITY FUNCTIONS
// ============================================
const getKlinikNameByKode = (kode) => {
// Single source of truth: selalu ambil dari clinicStore
const clinic = clinicStore.getClinicByKode(kode);
if (clinic) {
return clinic.name;
}
// Fallback jika tidak ditemukan
return kode;
};
const getPenunjangNameByKode = (kode) => {
return penunjangStore.getPenunjangNameByKode(kode);
};
return {
// ============================================
// KLINIK
// ============================================
// State
klinikData,
klinikList,
// Actions
addKlinik,
updateKlinik,
deleteKlinik,
getKlinikById,
getKlinikByKode,
// ============================================
// LOKET
// ============================================
// State
loketData,
availableServices,
// Actions
addLoket,
updateLoket,
deleteLoket,
getLoketById,
// ============================================
// RUANG
// ============================================
// State
ruangData,
totalKlinikRuang,
totalRuangan,
getAllRuangList,
// Actions
addRuang,
updateRuang,
deleteRuang,
getRuangByKlinik,
// ============================================
// PENUNJANG
// ============================================
// State
penunjangData,
totalPenunjang,
activePenunjang,
penunjangMedis,
penunjangNonMedis,
penunjangList,
// Actions
addPenunjang,
updatePenunjang,
deletePenunjang,
getPenunjangById,
getPenunjangByKode,
getActivePenunjangList,
// ============================================
// UTILITIES
// ============================================
getKlinikNameByKode,
getPenunjangNameByKode,
};
}, {
// NOTE: masterStore tidak perlu persist karena semua data sudah di-persist di stores masing-masing
persist: false,
});