Files
web-antrean/stores/masterStore.js
T

403 lines
13 KiB
JavaScript

// stores/masterStore.js
import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
export const useMasterStore = defineStore('master', () => {
// ============================================
// MASTER KLINIK
// ============================================
const klinikData = ref([
{
id: 1,
no: 1,
kode: 'AN',
nama: 'ANAK',
shift: 1,
totalQuota: 1000,
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 1000 }],
autoShift: false,
jadwalKlinik: ['Senin', 'Rabu', 'Jumat'],
},
{
id: 2,
no: 2,
kode: 'AS',
nama: 'ANESTESI',
shift: 2,
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,
no: 3,
kode: 'BD',
nama: 'BEDAH',
shift: 1,
totalQuota: 800,
jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 800 }],
autoShift: false,
jadwalKlinik: ['Senin', 'Rabu', 'Jumat'],
},
{
id: 4,
no: 4,
kode: 'GI',
nama: 'GIGI DAN MULUT',
shift: 3,
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: 5, no: 5, kode: 'GR', nama: 'GERIATRI', shift: 1, totalQuota: 600, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 600 }], autoShift: false, jadwalKlinik: ['Senin', 'Rabu'] },
{ id: 6, no: 6, kode: 'GZ', nama: 'GIZI', shift: 1, totalQuota: 500, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 500 }], autoShift: false, jadwalKlinik: ['Senin', 'Rabu', 'Jumat'] },
{ id: 7, no: 7, kode: 'HO', nama: 'HOM', shift: 1, totalQuota: 750, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 750 }], autoShift: false, jadwalKlinik: ['Senin', 'Selasa', 'Rabu'] },
{ id: 8, no: 8, kode: 'IP', nama: 'IPD', shift: 1, totalQuota: 900, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 900 }], autoShift: false, jadwalKlinik: ['Senin', 'Rabu', 'Jumat'] },
{ id: 9, no: 9, kode: 'JT', nama: 'JANTUNG', shift: 2, 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, no: 10, kode: 'JW', nama: 'JIWA', shift: 1, totalQuota: 700, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 700 }], autoShift: false, jadwalKlinik: ['Senin', 'Rabu'] },
{ id: 11, no: 11, kode: 'KK', nama: 'KULIT KELAMIN', shift: 1, totalQuota: 600, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 600 }], autoShift: false, jadwalKlinik: ['Selasa', 'Kamis'] },
{ id: 12, no: 12, kode: 'MT', nama: 'MATA', shift: 1, totalQuota: 800, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 800 }], autoShift: false, jadwalKlinik: ['Senin', 'Rabu', 'Jumat'] },
{ id: 13, no: 13, kode: 'OB', nama: 'KANDUNGAN', shift: 2, 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: 14, no: 14, kode: 'PR', nama: 'PARU', shift: 1, totalQuota: 700, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 700 }], autoShift: false, jadwalKlinik: ['Senin', 'Rabu'] },
{ id: 15, no: 15, kode: 'RT', nama: 'RADIOTERAPI', shift: 1, totalQuota: 500, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 500 }], autoShift: false, jadwalKlinik: ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jum\'at'] },
{ id: 16, no: 16, kode: 'RM', nama: 'REHAB MEDIK', shift: 1, totalQuota: 600, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 600 }], autoShift: false, jadwalKlinik: ['Senin', 'Rabu', 'Jumat'] },
{ id: 17, no: 17, kode: 'SR', nama: 'SARAF', shift: 1, totalQuota: 700, jamShiftList: [{ dari: '07:00', sampai: '11:00', kuota: 700 }], autoShift: false, jadwalKlinik: ['Senin', 'Rabu'] },
]);
// Computed - Get klinik list for dropdowns
const klinikList = computed(() =>
klinikData.value.map(k => ({
id: k.id,
kode: k.kode,
nama: k.nama
}))
);
// Actions - Klinik
const addKlinik = (klinikPayload) => {
const newId = Math.max(...klinikData.value.map(k => k.id), 0) + 1;
const newNo = klinikData.value.length + 1;
const totalQuota = klinikPayload.jamShiftList.reduce((total, shift) => {
return total + (parseInt(shift.kuota) || 0);
}, 0);
const newKlinik = {
id: newId,
no: newNo,
...klinikPayload,
totalQuota: totalQuota,
};
klinikData.value.push(newKlinik);
return { success: true, message: `Klinik ${newKlinik.nama} berhasil ditambahkan`, data: newKlinik };
};
const updateKlinik = (klinikPayload) => {
const index = klinikData.value.findIndex(k => k.id === klinikPayload.id);
if (index !== -1) {
const totalQuota = klinikPayload.jamShiftList.reduce((total, shift) => {
return total + (parseInt(shift.kuota) || 0);
}, 0);
klinikData.value[index] = {
...klinikData.value[index],
...klinikPayload,
totalQuota: totalQuota,
};
return { success: true, message: `Klinik ${klinikPayload.nama} berhasil diupdate` };
}
return { success: false, message: 'Klinik tidak ditemukan' };
};
const deleteKlinik = (klinikId) => {
const index = klinikData.value.findIndex(k => k.id === klinikId);
if (index !== -1) {
const klinikName = klinikData.value[index].nama;
klinikData.value.splice(index, 1);
klinikData.value.forEach((k, idx) => {
k.no = idx + 1;
});
return { success: true, message: `Klinik ${klinikName} berhasil dihapus` };
}
return { success: false, message: 'Klinik tidak ditemukan' };
};
const getKlinikById = (id) => {
return klinikData.value.find(k => k.id === id);
};
const getKlinikByKode = (kode) => {
return klinikData.value.find(k => k.kode === kode);
};
// ============================================
// MASTER LOKET
// ============================================
const loketData = ref([
{
id: 1,
no: 1,
namaLoket: "Loket 1",
kuota: 500,
pelayanan: ["RT", "RM", "TD"],
pembayaran: "JKN",
keterangan: "ONLINE",
statusPelayanan: "RAWAT JALAN",
},
{
id: 2,
no: 2,
namaLoket: "Loket 2",
kuota: 666,
pelayanan: ["JW", "SR"],
pembayaran: "JKN",
keterangan: "ONLINE",
statusPelayanan: "RAWAT JALAN",
},
{
id: 3,
no: 3,
namaLoket: "Loket 3",
kuota: 666,
pelayanan: ["AS", "JT"],
pembayaran: "JKN",
keterangan: "ONLINE",
statusPelayanan: "RAWAT JALAN",
},
{
id: 4,
no: 4,
namaLoket: "Loket 4",
kuota: 3676,
pelayanan: ["KK", "PR"],
pembayaran: "JKN",
keterangan: "ONLINE",
statusPelayanan: "RAWAT JALAN",
},
]);
const availableServices = computed(() =>
klinikData.value.map(k => ({
id: k.kode,
nama: k.nama,
}))
);
// Actions - Loket
const addLoket = (loketPayload) => {
const newId = Math.max(...loketData.value.map(l => l.id), 0) + 1;
const newNo = loketData.value.length + 1;
const newLoket = {
id: newId,
no: newNo,
...loketPayload,
};
loketData.value.push(newLoket);
return { success: true, message: `Loket ${newLoket.namaLoket} berhasil ditambahkan`, data: newLoket };
};
const updateLoket = (loketPayload) => {
const index = loketData.value.findIndex(l => l.id === loketPayload.id);
if (index !== -1) {
loketData.value[index] = {
...loketData.value[index],
...loketPayload,
};
return { success: true, message: `Loket ${loketPayload.namaLoket} berhasil diupdate` };
}
return { success: false, message: 'Loket tidak ditemukan' };
};
const deleteLoket = (loketId) => {
const index = loketData.value.findIndex(l => l.id === loketId);
if (index !== -1) {
const loketName = loketData.value[index].namaLoket;
loketData.value.splice(index, 1);
loketData.value.forEach((l, idx) => {
l.no = idx + 1;
});
return { success: true, message: `Loket ${loketName} berhasil dihapus` };
}
return { success: false, message: 'Loket tidak ditemukan' };
};
const getLoketById = (id) => {
return loketData.value.find(l => l.id === id);
};
// ============================================
// MASTER KLINIK RUANG
// ============================================
const ruangData = ref([
{
id: 1,
no: 1,
kodeKlinik: 'AN',
namaKlinik: 'ANAK',
namaRuang: 'R. TINDAKAN',
ruangList: [
{ nomorRuang: '1', namaRuang: 'R. TINDAKAN', nomorScreen: '101' }
]
},
{
id: 2,
no: 2,
kodeKlinik: 'AS',
namaKlinik: 'ANESTESI',
namaRuang: 'Ruang 1, Ruang 2',
ruangList: [
{ nomorRuang: '1', namaRuang: 'Ruang 1', nomorScreen: '201' },
{ nomorRuang: '2', namaRuang: 'Ruang 2', nomorScreen: '202' }
]
},
{
id: 3,
no: 3,
kodeKlinik: 'GI',
namaKlinik: 'GIGI DAN MULUT',
namaRuang: 'Ruang 1, Ruang 2, Ruang 3',
ruangList: [
{ nomorRuang: '1', namaRuang: 'Ruang 1', nomorScreen: '501' },
{ nomorRuang: '2', namaRuang: 'Ruang 2', nomorScreen: '502' },
{ nomorRuang: '3', namaRuang: 'Ruang 3', nomorScreen: '503' }
]
},
]);
// Computed
const totalKlinikRuang = computed(() => ruangData.value.length);
const totalRuangan = computed(() => {
return ruangData.value.reduce((total, klinik) => {
return total + klinik.ruangList.length;
}, 0);
});
// Actions - Ruang
const addRuang = (ruangPayload) => {
const newId = Math.max(...ruangData.value.map(r => r.id), 0) + 1;
const newNo = ruangData.value.length + 1;
const namaRuangDisplay = ruangPayload.ruangList
.map(r => r.namaRuang)
.filter(n => n)
.join(', ');
const newRuang = {
id: newId,
no: newNo,
...ruangPayload,
namaRuang: namaRuangDisplay,
};
ruangData.value.push(newRuang);
return { success: true, message: `Ruang klinik ${newRuang.namaKlinik} berhasil ditambahkan`, data: newRuang };
};
const updateRuang = (ruangPayload) => {
const index = ruangData.value.findIndex(r => r.id === ruangPayload.id);
if (index !== -1) {
const namaRuangDisplay = ruangPayload.ruangList
.map(r => r.namaRuang)
.filter(n => n)
.join(', ');
ruangData.value[index] = {
...ruangData.value[index],
...ruangPayload,
namaRuang: namaRuangDisplay,
};
return { success: true, message: `Ruang klinik ${ruangPayload.namaKlinik} berhasil diupdate` };
}
return { success: false, message: 'Ruang tidak ditemukan' };
};
const deleteRuang = (ruangId) => {
const index = ruangData.value.findIndex(r => r.id === ruangId);
if (index !== -1) {
const ruangName = `${ruangData.value[index].namaKlinik} - ${ruangData.value[index].namaRuang}`;
ruangData.value.splice(index, 1);
ruangData.value.forEach((r, idx) => {
r.no = idx + 1;
});
return { success: true, message: `Ruang ${ruangName} berhasil dihapus` };
}
return { success: false, message: 'Ruang tidak ditemukan' };
};
const getRuangByKlinik = (kodeKlinik) => {
return ruangData.value.filter(r => r.kodeKlinik === kodeKlinik);
};
// Get all ruang list (for antrian display)
const getAllRuangList = computed(() => {
const allRuang = [];
ruangData.value.forEach(klinik => {
klinik.ruangList.forEach(ruang => {
allRuang.push({
kodeKlinik: klinik.kodeKlinik,
namaKlinik: klinik.namaKlinik,
...ruang
});
});
});
return allRuang;
});
// ============================================
// UTILITY FUNCTIONS
// ============================================
const getKlinikNameByKode = (kode) => {
const klinik = klinikData.value.find(k => k.kode === kode);
return klinik ? klinik.nama : kode;
};
return {
// State - Klinik
klinikData,
klinikList,
// Actions - Klinik
addKlinik,
updateKlinik,
deleteKlinik,
getKlinikById,
getKlinikByKode,
// State - Loket
loketData,
availableServices,
// Actions - Loket
addLoket,
updateLoket,
deleteLoket,
getLoketById,
// State - Ruang
ruangData,
totalKlinikRuang,
totalRuangan,
getAllRuangList,
// Actions - Ruang
addRuang,
updateRuang,
deleteRuang,
getRuangByKlinik,
// Utilities
getKlinikNameByKode,
};
});