Files
web-antrean/stores/klinikruangstore.js
T
2026-05-25 08:43:30 +07:00

137 lines
5.2 KiB
JavaScript

// stores/klinikruangstore.js
// Konfigurasi mapping klinik ke ruangan — data disimpan di server SQLite via /api/config/klinik-ruang
import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import { useClinicStore } from './clinicStore';
export const useKlinikRuangStore = defineStore('klinikRuang', () => {
const clinicStore = useClinicStore();
// Master klinik list (from clinicStore — in-memory, from API)
const masterKlinikList = computed(() => {
const baseList = typeof clinicStore.getClinicsForDropdown === 'function'
? clinicStore.getClinicsForDropdown()
: [];
return baseList.map((c) => ({ kode: c.kode, nama: c.name }));
});
const klinikRuangList = ref([]);
const isLoading = ref(false);
const error = ref(null);
const totalKlinikRuang = computed(() => klinikRuangList.value.length);
const totalRuangan = computed(() =>
klinikRuangList.value.reduce((total, k) => total + (k.ruangList?.length || 0), 0)
);
const getKlinikByCode = (kode) => klinikRuangList.value.find(k => k.kodeKlinik === kode);
const getRuangByKlinik = (kodeKlinik) => {
const klinik = klinikRuangList.value.find(k => k.kodeKlinik === kodeKlinik);
return klinik ? klinik.ruangList : [];
};
const searchKlinikRuang = (searchTerm) => {
if (!searchTerm) return klinikRuangList.value;
const term = searchTerm.toLowerCase();
return klinikRuangList.value.filter(k =>
k.kodeKlinik?.toLowerCase().includes(term) ||
k.namaKlinik?.toLowerCase().includes(term)
);
};
// ── Fetch from API ─────────────────────────────────────────────────────────
const fetchKlinikRuang = async () => {
if (isLoading.value) return;
isLoading.value = true;
error.value = null;
try {
const res = await $fetch('/api/config/klinik-ruang');
klinikRuangList.value = (res.data || []).map((item, idx) => ({
...item,
no: idx + 1,
namaRuang: (item.ruangList || []).map(r => r.namaRuang).filter(Boolean).join(', '),
}));
} catch (e) {
error.value = e.message;
console.error('❌ [klinikRuangStore] Gagal fetch config:', e);
} finally {
isLoading.value = false;
}
};
// ── CRUD via API ───────────────────────────────────────────────────────────
const createKlinikRuang = async (data) => {
try {
const res = await $fetch('/api/config/klinik-ruang', { method: 'POST', body: data });
const newItem = { ...res.data, no: klinikRuangList.value.length + 1, namaRuang: (res.data.ruangList || []).map(r => r.namaRuang).join(', ') };
klinikRuangList.value.push(newItem);
return { success: true, message: res.message, data: newItem };
} catch (e) {
return { success: false, message: e.data?.message || e.message };
}
};
const updateKlinikRuang = async (id, data) => {
try {
const res = await $fetch(`/api/config/klinik-ruang/${id}`, { method: 'PUT', body: data });
const index = klinikRuangList.value.findIndex(r => r.id === id);
if (index !== -1) {
klinikRuangList.value[index] = {
...res.data,
no: klinikRuangList.value[index].no,
namaRuang: (res.data.ruangList || []).map(r => r.namaRuang).join(', '),
};
}
return { success: true, message: res.message, data: res.data };
} catch (e) {
return { success: false, message: e.data?.message || e.message };
}
};
const deleteKlinikRuang = async (id) => {
try {
const res = await $fetch(`/api/config/klinik-ruang/${id}`, { method: 'DELETE' });
klinikRuangList.value = klinikRuangList.value.filter(r => r.id !== id);
// Reorder 'no'
klinikRuangList.value.forEach((r, idx) => { r.no = idx + 1; });
return { success: true, message: res.message };
} catch (e) {
return { success: false, message: e.data?.message || e.message };
}
};
const addRuangToKlinik = async (klinikId, ruangData) => {
const klinik = klinikRuangList.value.find(k => k.id === klinikId);
if (!klinik) return { success: false, message: 'Klinik tidak ditemukan' };
const newRuangList = [...(klinik.ruangList || []), ruangData];
return updateKlinikRuang(klinikId, { ...klinik, ruangList: newRuangList });
};
const removeRuangFromKlinik = async (klinikId, ruangIndex) => {
const klinik = klinikRuangList.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 newRuangList = klinik.ruangList.filter((_, i) => i !== ruangIndex);
return updateKlinikRuang(klinikId, { ...klinik, ruangList: newRuangList });
};
return {
masterKlinikList,
klinikRuangList,
isLoading,
error,
totalKlinikRuang,
totalRuangan,
getKlinikByCode,
getRuangByKlinik,
searchKlinikRuang,
fetchKlinikRuang,
createKlinikRuang,
updateKlinikRuang,
deleteKlinikRuang,
addRuangToKlinik,
removeRuangFromKlinik,
};
}, {
persist: false,
});