531 lines
15 KiB
JavaScript
531 lines
15 KiB
JavaScript
// stores/clinicStore.js
|
|
import { defineStore } from 'pinia';
|
|
import { ref, computed } from 'vue';
|
|
|
|
export const useClinicStore = defineStore('clinic', () => {
|
|
// Data clinics - Single source of truth untuk semua data klinik
|
|
// Includes basic info (name, kode, icon, doctors, shifts) + master config (totalQuota, jamShiftList, jadwalKlinik, autoShift)
|
|
const clinics = ref([
|
|
{
|
|
id: 1,
|
|
kode: "AN",
|
|
name: "ANAK",
|
|
subtitle: "",
|
|
icon: "mdi-baby-face",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Sarah Putri, Sp.A", "dr. Andi Wijaya, Sp.A"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 15 },
|
|
{ name: "Shift 2", quota: 20 }
|
|
],
|
|
|
|
totalQuota: 1000,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 1000 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu', 'Jumat'],
|
|
},
|
|
{
|
|
id: 2,
|
|
kode: "AS",
|
|
name: "ANESTESI",
|
|
subtitle: "",
|
|
icon: "mdi-face-mask",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Ahmad Fauzi, Sp.An"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 0 },
|
|
{ name: "Shift 2", quota: 12 }
|
|
],
|
|
// Master config
|
|
totalQuota: 1500,
|
|
jamShiftList: [
|
|
{ dari: '07:00', sampai: '11:00', kuota: 1000 },
|
|
{ dari: '13:00', sampai: '16:00', kuota: 500 }
|
|
],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at'],
|
|
},
|
|
{
|
|
id: 3,
|
|
kode: "BD",
|
|
name: "BEDAH",
|
|
subtitle: "",
|
|
icon: "mdi-medical-bag",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Budi Santoso, Sp.B", "dr. Eko Prasetyo, Sp.B", "dr. Dian Permata, Sp.B"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 8 },
|
|
{ name: "Shift 2", quota: 10 }
|
|
],
|
|
// Master config
|
|
totalQuota: 800,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 800 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu', 'Jumat'],
|
|
},
|
|
{
|
|
id: 4,
|
|
kode: "GR",
|
|
name: "GERIATRI",
|
|
subtitle: "",
|
|
icon: "mdi-human-cane",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Siti Aminah, Sp.PD-KGer"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 10 },
|
|
{ name: "Shift 2", quota: 8 }
|
|
],
|
|
// Master config
|
|
totalQuota: 600,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 600 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu'],
|
|
},
|
|
{
|
|
id: 5,
|
|
kode: "GI",
|
|
name: "GIGI DAN MULUT",
|
|
subtitle: "",
|
|
icon: "mdi-tooth",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["drg. Rina Wati, Sp.KG", "drg. Made Surya, Sp.KG"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 18 },
|
|
{ name: "Shift 2", quota: 15 }
|
|
],
|
|
// Master config
|
|
totalQuota: 2100,
|
|
jamShiftList: [
|
|
{ dari: '07:00', sampai: '11:00', kuota: 1000 },
|
|
{ dari: '13:00', sampai: '16:00', kuota: 700 },
|
|
{ dari: '18:00', sampai: '20:00', kuota: 400 }
|
|
],
|
|
autoShift: true,
|
|
jadwalKlinik: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at'],
|
|
},
|
|
{
|
|
id: 6,
|
|
kode: "GZ",
|
|
name: "GIZI",
|
|
subtitle: "",
|
|
icon: "mdi-food-apple",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Lisa Andriani, Sp.GK"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 12 },
|
|
{ name: "Shift 2", quota: 10 }
|
|
],
|
|
// Master config
|
|
totalQuota: 500,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 500 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu', 'Jumat'],
|
|
},
|
|
{
|
|
id: 7,
|
|
kode: "HO",
|
|
name: "HEMATO ONKOLOGI MEDIS",
|
|
subtitle: "",
|
|
icon: "mdi-water",
|
|
shift: "TUTUP",
|
|
schedule: "",
|
|
available: false,
|
|
doctors: [],
|
|
shifts: [],
|
|
// Master config
|
|
totalQuota: 750,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 750 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Selasa', 'Rabu'],
|
|
},
|
|
{
|
|
id: 8,
|
|
kode: "IP",
|
|
name: "IPD (PENYAKIT DALAM)",
|
|
subtitle: "",
|
|
icon: "mdi-hospital",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Hendra Wijaya, Sp.PD", "dr. Agus Salim, Sp.PD", "dr. Retno Wulan, Sp.PD", "dr. Bambang Susilo, Sp.PD"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 25 },
|
|
{ name: "Shift 2", quota: 20 }
|
|
],
|
|
// Master config
|
|
totalQuota: 900,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 900 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu', 'Jumat'],
|
|
},
|
|
{
|
|
id: 9,
|
|
kode: "JT",
|
|
name: "JANTUNG (CARDIOLOGI)",
|
|
subtitle: "",
|
|
icon: "mdi-heart-pulse",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Rudi Hartono, Sp.JP", "dr. Sinta Dewi, Sp.JP"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 14 },
|
|
{ name: "Shift 2", quota: 12 }
|
|
],
|
|
// Master config
|
|
totalQuota: 1200,
|
|
jamShiftList: [
|
|
{ dari: '07:00', sampai: '11:00', kuota: 800 },
|
|
{ dari: '13:00', sampai: '16:00', kuota: 400 }
|
|
],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at'],
|
|
},
|
|
{
|
|
id: 10,
|
|
kode: "JW",
|
|
name: "JIWA",
|
|
subtitle: "",
|
|
icon: "mdi-head-dots-horizontal",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Maya Kusuma, Sp.KJ"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 10 },
|
|
{ name: "Shift 2", quota: 8 }
|
|
],
|
|
// Master config
|
|
totalQuota: 700,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 700 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu'],
|
|
},
|
|
{
|
|
id: 11,
|
|
kode: "OB",
|
|
name: "KANDUNGAN",
|
|
subtitle: "",
|
|
icon: "mdi-human-pregnant",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Dewi Lestari, Sp.OG", "dr. Putri Andini, Sp.OG", "dr. Nova Riani, Sp.OG"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 16 },
|
|
{ name: "Shift 2", quota: 14 }
|
|
],
|
|
// Master config
|
|
totalQuota: 1000,
|
|
jamShiftList: [
|
|
{ dari: '07:00', sampai: '11:00', kuota: 600 },
|
|
{ dari: '13:00', sampai: '16:00', kuota: 400 }
|
|
],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at'],
|
|
},
|
|
{
|
|
id: 12,
|
|
kode: "KH", // kode fiktif untuk KEMOTERAPI (belum ada di master klinik)
|
|
name: "KEMOTERAPI",
|
|
subtitle: "",
|
|
icon: "mdi-virus",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Andi Pratama, Sp.PD-KHOM"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 8 },
|
|
{ name: "Shift 2", quota: 6 }
|
|
],
|
|
// Master config (default values, not in masterStore)
|
|
totalQuota: 0,
|
|
jamShiftList: [],
|
|
autoShift: false,
|
|
jadwalKlinik: [],
|
|
},
|
|
{
|
|
id: 13,
|
|
kode: "KN", // kode fiktif untuk KOMPLEMENTER (NYERI)
|
|
name: "KOMPLEMENTER (NYERI)",
|
|
subtitle: "",
|
|
icon: "mdi-medical-bag",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Ratna Sari, Sp.KFR"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 10 },
|
|
{ name: "Shift 2", quota: 8 }
|
|
],
|
|
// Master config (default values, not in masterStore)
|
|
totalQuota: 0,
|
|
jamShiftList: [],
|
|
autoShift: false,
|
|
jadwalKlinik: [],
|
|
},
|
|
{
|
|
id: 14,
|
|
kode: "KK",
|
|
name: "KULIT KELAMIN",
|
|
subtitle: "",
|
|
icon: "mdi-human-male-female",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Tika Anggraini, Sp.KK", "dr. Fajar Ramadhan, Sp.KK"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 12 },
|
|
{ name: "Shift 2", quota: 10 }
|
|
],
|
|
// Master config
|
|
totalQuota: 600,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 600 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Selasa', 'Kamis'],
|
|
},
|
|
{
|
|
id: 15,
|
|
kode: "MT",
|
|
name: "MATA",
|
|
subtitle: "",
|
|
icon: "mdi-eye",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Yudi Prasetyo, Sp.M", "dr. Linda Kartika, Sp.M"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 15 },
|
|
{ name: "Shift 2", quota: 12 }
|
|
],
|
|
// Master config
|
|
totalQuota: 800,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 800 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu', 'Jumat'],
|
|
},
|
|
{
|
|
id: 16,
|
|
kode: "MC", // kode fiktif untuk MCU
|
|
name: "MCU",
|
|
subtitle: "",
|
|
icon: "mdi-clipboard-check",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Fitri Handayani, Sp.OK"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 20 },
|
|
{ name: "Shift 2", quota: 15 }
|
|
],
|
|
// Master config (default values, not in masterStore)
|
|
totalQuota: 0,
|
|
jamShiftList: [],
|
|
autoShift: false,
|
|
jadwalKlinik: [],
|
|
},
|
|
{
|
|
id: 17,
|
|
kode: "ON", // kode fiktif untuk ONKOLOGI
|
|
name: "ONKOLOGI",
|
|
subtitle: "",
|
|
icon: "mdi-virus",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Dimas Prakoso, Sp.Onk-Rad"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 10 },
|
|
{ name: "Shift 2", quota: 8 }
|
|
],
|
|
// Master config (default values, not in masterStore)
|
|
totalQuota: 0,
|
|
jamShiftList: [],
|
|
autoShift: false,
|
|
jadwalKlinik: [],
|
|
},
|
|
{
|
|
id: 18,
|
|
kode: "PR",
|
|
name: "PARU",
|
|
subtitle: "",
|
|
icon: "mdi-lungs",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Nina Marlina, Sp.P", "dr. Arief Budiman, Sp.P"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 14 },
|
|
{ name: "Shift 2", quota: 12 }
|
|
],
|
|
// Master config
|
|
totalQuota: 700,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 700 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu'],
|
|
},
|
|
{
|
|
id: 19,
|
|
kode: "TD", // mengikuti kode pelayanan TD di loket
|
|
name: "R. TINDAKAN (EMG, ECG, DLL)",
|
|
subtitle: "",
|
|
icon: "mdi-waveform",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Fajar Nugroho, Sp.S"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 12 },
|
|
{ name: "Shift 2", quota: 10 }
|
|
],
|
|
// Master config (default values, not in masterStore)
|
|
totalQuota: 0,
|
|
jamShiftList: [],
|
|
autoShift: false,
|
|
jadwalKlinik: [],
|
|
},
|
|
{
|
|
id: 20,
|
|
kode: "RT",
|
|
name: "RADIOTERAPI",
|
|
subtitle: "",
|
|
icon: "mdi-radioactive",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Wulan Safitri, Sp.Rad"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 8 },
|
|
{ name: "Shift 2", quota: 6 }
|
|
],
|
|
// Master config
|
|
totalQuota: 500,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 500 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at'],
|
|
},
|
|
{
|
|
id: 21,
|
|
kode: "RM",
|
|
name: "REHAB MEDIK",
|
|
subtitle: "",
|
|
icon: "mdi-human-cane",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Gita Permata, Sp.KFR", "dr. Rian Saputra, Sp.KFR"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 16 },
|
|
{ name: "Shift 2", quota: 14 }
|
|
],
|
|
// Master config
|
|
totalQuota: 600,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 600 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu', 'Jumat'],
|
|
},
|
|
{
|
|
id: 22,
|
|
kode: "SR",
|
|
name: "SARAF (NEUROLOGI)",
|
|
subtitle: "",
|
|
icon: "mdi-head-cog",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: false,
|
|
doctors: [],
|
|
shifts: [],
|
|
// Master config
|
|
totalQuota: 700,
|
|
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 700 }],
|
|
autoShift: false,
|
|
jadwalKlinik: ['Senin', 'Rabu'],
|
|
},
|
|
{
|
|
id: 23,
|
|
kode: "TH", // kode fiktif untuk THT
|
|
name: "THT",
|
|
subtitle: "",
|
|
icon: "mdi-ear-hearing",
|
|
shift: "SHIFT 1",
|
|
schedule: "Mulai Pukul 07:00",
|
|
available: true,
|
|
doctors: ["dr. Reza Maulana, Sp.THT-KL"],
|
|
shifts: [
|
|
{ name: "Shift 1", quota: 12 },
|
|
{ name: "Shift 2", quota: 10 }
|
|
],
|
|
// Master config (default values, not in masterStore)
|
|
totalQuota: 0,
|
|
jamShiftList: [],
|
|
autoShift: false,
|
|
jadwalKlinik: [],
|
|
},
|
|
]);
|
|
|
|
// Get all clinics
|
|
const getAllClinics = computed(() => clinics.value);
|
|
|
|
// Get clinic by name (untuk mapping dengan kode klinik)
|
|
const getClinicByName = (name) => {
|
|
return clinics.value.find(c => c.name === name);
|
|
};
|
|
|
|
// Get clinic by kode (lebih stabil untuk integrasi dengan master klinik & anjungan)
|
|
const getClinicByKode = (kode) => {
|
|
return clinics.value.find(c => c.kode === kode);
|
|
};
|
|
|
|
// Get clinics list untuk dropdown (format: { name, kode })
|
|
// Sekarang langsung pakai kode dari clinic, tidak bergantung ke nama di masterStore
|
|
const getClinicsForDropdown = () => {
|
|
return clinics.value.map(clinic => ({
|
|
name: clinic.name,
|
|
kode: clinic.kode,
|
|
icon: clinic.icon,
|
|
available: clinic.available,
|
|
id: clinic.id
|
|
}));
|
|
};
|
|
|
|
// Actions untuk update master config (sync dengan masterStore operations)
|
|
const updateClinicMasterConfig = (kode, masterConfig) => {
|
|
const clinic = clinics.value.find(c => c.kode === kode);
|
|
if (clinic) {
|
|
clinic.totalQuota = masterConfig.totalQuota || clinic.totalQuota;
|
|
clinic.jamShiftList = masterConfig.jamShiftList || clinic.jamShiftList;
|
|
clinic.autoShift = masterConfig.autoShift !== undefined ? masterConfig.autoShift : clinic.autoShift;
|
|
clinic.jadwalKlinik = masterConfig.jadwalKlinik || clinic.jadwalKlinik;
|
|
return { success: true, clinic };
|
|
}
|
|
return { success: false, message: 'Clinic not found' };
|
|
};
|
|
|
|
return {
|
|
clinics,
|
|
getAllClinics,
|
|
getClinicByName,
|
|
getClinicByKode,
|
|
getClinicsForDropdown,
|
|
updateClinicMasterConfig,
|
|
};
|
|
}, {
|
|
persist: {
|
|
key: 'clinic-store-state',
|
|
storage: typeof window !== 'undefined' ? localStorage : undefined,
|
|
paths: ['clinics'],
|
|
},
|
|
});
|