Files
web-antrean/stores/ruangStore.js
T
2026-01-26 14:35:30 +07:00

368 lines
9.4 KiB
JavaScript

// stores/ruangStore.js
// Merged dari masterStore.ruangData + klinikruangstore.klinikRuangList
import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import { useClinicStore } from './clinicStore';
export const useRuangStore = defineStore('ruang', () => {
const clinicStore = useClinicStore();
// State/Computed - List Master Klinik (disinkronkan dengan clinicStore)
const masterKlinikList = computed(() => {
const baseList = typeof clinicStore.getClinicsForDropdown === 'function'
? clinicStore.getClinicsForDropdown()
: [];
return baseList.map((c) => ({
kode: c.kode,
nama: c.name,
id: c.id,
}));
});
// State - Ruang Data (merged dari masterStore.ruangData + klinikruangstore.klinikRuangList)
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, Ruang 3, Ruang 4, Ruang 5, Ruang 6',
ruangList: [
{ nomorRuang: '1', namaRuang: 'Ruang 1', nomorScreen: '201' },
{ nomorRuang: '2', namaRuang: 'Ruang 2', nomorScreen: '202' },
{ nomorRuang: '3', namaRuang: 'Ruang 3', nomorScreen: '203' },
{ nomorRuang: '4', namaRuang: 'Ruang 4', nomorScreen: '204' },
{ nomorRuang: '5', namaRuang: 'Ruang 5', nomorScreen: '205' },
{ nomorRuang: '6', namaRuang: 'Ruang 6', nomorScreen: '206' }
]
},
{
id: 3,
no: 3,
kodeKlinik: 'BD',
namaKlinik: 'BEDAH',
namaRuang: 'Ruang Konsultasi',
ruangList: [
{ nomorRuang: '1', namaRuang: 'Ruang Konsultasi', nomorScreen: '301' }
]
},
{
id: 4,
no: 4,
kodeKlinik: 'GR',
namaKlinik: 'GERIATRI',
namaRuang: 'Ruang Pemeriksaan',
ruangList: [
{ nomorRuang: '1', namaRuang: 'Ruang Pemeriksaan', nomorScreen: '401' }
]
},
{
id: 5,
no: 5,
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);
});
// 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;
});
// Getters
const getKlinikByCode = (kode) => {
return ruangData.value.find(k => k.kodeKlinik === kode);
};
const getRuangByKlinik = (kodeKlinik) => {
return ruangData.value.filter(r => r.kodeKlinik === kodeKlinik);
};
// Actions - CRUD Operations
const createKlinikRuang = (data) => {
const newId = Math.max(...ruangData.value.map(r => r.id), 0) + 1;
const newNo = ruangData.value.length + 1;
// Generate nama ruang untuk display
const namaRuangDisplay = data.ruangList
.map(r => r.namaRuang)
.filter(n => n)
.join(', ');
const newKlinikRuang = {
id: newId,
no: newNo,
kodeKlinik: data.kodeKlinik,
namaKlinik: data.namaKlinik,
namaRuang: namaRuangDisplay,
ruangList: data.ruangList
};
ruangData.value.push(newKlinikRuang);
return {
success: true,
message: `Klinik Ruang ${data.namaKlinik} berhasil ditambahkan`,
data: newKlinikRuang
};
};
const updateKlinikRuang = (id, data) => {
const index = ruangData.value.findIndex(r => r.id === id);
if (index === -1) {
return {
success: false,
message: 'Klinik Ruang tidak ditemukan'
};
}
// Generate nama ruang untuk display
const namaRuangDisplay = data.ruangList
.map(r => r.namaRuang)
.filter(n => n)
.join(', ');
ruangData.value[index] = {
...ruangData.value[index],
kodeKlinik: data.kodeKlinik,
namaKlinik: data.namaKlinik,
namaRuang: namaRuangDisplay,
ruangList: data.ruangList
};
return {
success: true,
message: `Klinik Ruang ${data.namaKlinik} berhasil diupdate`,
data: ruangData.value[index]
};
};
const deleteKlinikRuang = (id) => {
const index = ruangData.value.findIndex(r => r.id === id);
if (index === -1) {
return {
success: false,
message: 'Klinik Ruang tidak ditemukan'
};
}
const deletedKlinik = ruangData.value[index];
ruangData.value.splice(index, 1);
// Reorder numbers
ruangData.value.forEach((r, idx) => {
r.no = idx + 1;
});
return {
success: true,
message: `Klinik Ruang ${deletedKlinik.namaKlinik} berhasil dihapus`
};
};
const addRuangToKlinik = (klinikId, ruangDataItem) => {
const klinik = ruangData.value.find(k => k.id === klinikId);
if (!klinik) {
return {
success: false,
message: 'Klinik tidak ditemukan'
};
}
klinik.ruangList.push(ruangDataItem);
// Update display name
klinik.namaRuang = klinik.ruangList
.map(r => r.namaRuang)
.filter(n => n)
.join(', ');
return {
success: true,
message: `Ruang ${ruangDataItem.namaRuang} berhasil ditambahkan`,
data: klinik
};
};
const removeRuangFromKlinik = (klinikId, ruangIndex) => {
const klinik = ruangData.value.find(k => k.id === klinikId);
if (!klinik) {
return {
success: false,
message: 'Klinik tidak ditemukan'
};
}
if (klinik.ruangList.length <= 1) {
return {
success: false,
message: 'Minimal harus ada 1 ruangan'
};
}
const removedRuang = klinik.ruangList[ruangIndex];
klinik.ruangList.splice(ruangIndex, 1);
// Update display name
klinik.namaRuang = klinik.ruangList
.map(r => r.namaRuang)
.filter(n => n)
.join(', ');
return {
success: true,
message: `Ruang ${removedRuang.namaRuang} berhasil dihapus`,
data: klinik
};
};
const searchKlinikRuang = (searchTerm) => {
if (!searchTerm) return ruangData.value;
const term = searchTerm.toLowerCase();
return ruangData.value.filter(k =>
k.kodeKlinik.toLowerCase().includes(term) ||
k.namaKlinik.toLowerCase().includes(term) ||
k.namaRuang.toLowerCase().includes(term)
);
};
// Alias methods untuk backward compatibility dengan masterStore
const addRuang = (ruangPayload) => {
return createKlinikRuang(ruangPayload);
};
const updateRuang = (ruangPayload) => {
return updateKlinikRuang(ruangPayload.id, ruangPayload);
};
const deleteRuang = (ruangId) => {
return deleteKlinikRuang(ruangId);
};
// New method for replacing all rooms (used by MasterKlinikRuang when generating from API)
const replaceAllRooms = (newRoomsData) => {
// Group rooms by clinic CODE + JENIS LAYANAN (to keep Reguler and Eksekutif separate)
const groupedByClinic = {};
newRoomsData.forEach(room => {
// Use kodeKlinik + jenisLayanan as key to separate same clinic with different service types
const key = `${room.kodeKlinik}-${room.jenisLayanan}`;
if (!groupedByClinic[key]) {
groupedByClinic[key] = {
id: room.id || generateRoomId(),
kodeKlinik: room.kodeKlinik,
namaKlinik: room.namaKlinik,
jenisLayanan: room.jenisLayanan,
ruangList: []
};
}
groupedByClinic[key].ruangList.push({
nomorRuang: room.nomorRuang,
namaRuang: room.namaRuang,
nomorScreen: room.nomorScreen,
kodeRuang: room.kodeRuang
});
});
// Convert to array and add display names
const newRuangData = Object.values(groupedByClinic).map((clinic, index) => ({
...clinic,
no: index + 1,
namaRuang: clinic.ruangList.map(r => r.namaRuang).join(', ')
}));
ruangData.value = newRuangData;
return {
success: true,
message: `${newRuangData.length} klinik dengan total ${newRoomsData.length} ruangan berhasil dimuat`
};
};
// Helper to generate unique room ID
const generateRoomId = () => {
return Date.now() + Math.floor(Math.random() * 1000);
};
return {
// State
masterKlinikList,
ruangData,
// Computed
totalKlinikRuang,
totalRuangan,
getAllRuangList,
// Getters
getKlinikByCode,
getRuangByKlinik,
// Actions (new names)
createKlinikRuang,
updateKlinikRuang,
deleteKlinikRuang,
addRuangToKlinik,
removeRuangFromKlinik,
searchKlinikRuang,
// Alias for backward compatibility
addRuang,
updateRuang,
deleteRuang,
// New method for API-based room generation
replaceAllRooms,
};
}, {
persist: {
key: 'ruang-store-state',
storage: typeof window !== 'undefined' ? localStorage : undefined,
paths: ['ruangData'],
},
});