246 lines
7.5 KiB
TypeScript
246 lines
7.5 KiB
TypeScript
import { defineStore } from 'pinia';
|
|
import spesialisData from '~/data/mock/spesialis.json';
|
|
import subSpesialisData from '~/data/mock/subSpesialis.json';
|
|
|
|
interface FormData {
|
|
noRekamMedis: string;
|
|
noKtp: string;
|
|
namaPasien: string;
|
|
jenisKelamin: string;
|
|
tanggalLahir: string;
|
|
umur: string;
|
|
alamat: string;
|
|
nomorTelepon: string[];
|
|
}
|
|
|
|
interface RencanaOperasiData {
|
|
spesialis: number | null | undefined;
|
|
subSpesialis: number | null | undefined;
|
|
tanggalDaftar: string;
|
|
kategoriOperasi: number | null | undefined;
|
|
rencanaOperasi: string;
|
|
keterangan: string;
|
|
}
|
|
|
|
interface StatusPasienData {
|
|
tanggalSelesai: string;
|
|
statusOperasi: string;
|
|
keteranganStatus: string;
|
|
}
|
|
|
|
interface Dokter {
|
|
id: number;
|
|
nip: string;
|
|
nama: string;
|
|
satuan_kerja: string;
|
|
}
|
|
|
|
export const usePendaftaranStore = defineStore('pendaftaran', {
|
|
state: () => ({
|
|
// Form data
|
|
formData: {
|
|
noRekamMedis: '',
|
|
noKtp: '',
|
|
namaPasien: '',
|
|
jenisKelamin: '',
|
|
tanggalLahir: '',
|
|
umur: '',
|
|
alamat: '',
|
|
nomorTelepon: []
|
|
} as FormData,
|
|
|
|
// Medical data
|
|
diagnosisItems: [] as any[],
|
|
tindakanItems: [] as any[],
|
|
|
|
// Rencana Operasi data
|
|
rencanaOperasiData: {
|
|
spesialis: null as number | null | undefined,
|
|
subSpesialis: null as number | null | undefined,
|
|
tanggalDaftar: '',
|
|
kategoriOperasi: null as number | null | undefined,
|
|
rencanaOperasi: '',
|
|
keterangan: ''
|
|
} as RencanaOperasiData,
|
|
|
|
dokterPelaksanaItems: [] as Dokter[],
|
|
|
|
// Status Pasien data
|
|
statusPasienData: {
|
|
tanggalSelesai: '',
|
|
statusOperasi: 'Belum',
|
|
keteranganStatus: ''
|
|
} as StatusPasienData,
|
|
|
|
// UI state
|
|
loading: false,
|
|
snackbar: false,
|
|
snackbarMessage: '',
|
|
snackbarColor: 'error'
|
|
}),
|
|
|
|
getters: {
|
|
// Check if form has any data
|
|
hasFormData: (state) => {
|
|
return !!(
|
|
state.formData.noRekamMedis ||
|
|
state.formData.namaPasien ||
|
|
state.diagnosisItems.length > 0 ||
|
|
state.tindakanItems.length > 0 ||
|
|
state.rencanaOperasiData.spesialis ||
|
|
state.dokterPelaksanaItems.length > 0
|
|
);
|
|
},
|
|
|
|
// Get all form data for submission
|
|
getSubmissionData: (state) => {
|
|
return {
|
|
formData: state.formData,
|
|
diagnosisItems: state.diagnosisItems,
|
|
tindakanItems: state.tindakanItems,
|
|
rencanaOperasiData: state.rencanaOperasiData,
|
|
dokterPelaksanaItems: state.dokterPelaksanaItems,
|
|
statusPasienData: state.statusPasienData
|
|
};
|
|
}
|
|
},
|
|
|
|
actions: {
|
|
// Initialize form with query parameters
|
|
async initializeFromQuery(kodeSpesialis?: string, kodeSubSpesialis?: string) {
|
|
if (kodeSpesialis) {
|
|
const spesialis = spesialisData.find(s => s.kode === kodeSpesialis);
|
|
if (spesialis) {
|
|
this.rencanaOperasiData.spesialis = spesialis.id;
|
|
|
|
// Wait for next tick to ensure watch has processed
|
|
if (kodeSubSpesialis) {
|
|
await nextTick();
|
|
const subSpesialis = subSpesialisData.find(s => s.kode === kodeSubSpesialis);
|
|
if (subSpesialis) {
|
|
this.rencanaOperasiData.subSpesialis = subSpesialis.id;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
// Reset entire form
|
|
resetForm() {
|
|
this.formData = {
|
|
noRekamMedis: '',
|
|
noKtp: '',
|
|
namaPasien: '',
|
|
jenisKelamin: '',
|
|
tanggalLahir: '',
|
|
umur: '',
|
|
alamat: '',
|
|
nomorTelepon: []
|
|
};
|
|
|
|
this.diagnosisItems = [];
|
|
this.tindakanItems = [];
|
|
|
|
this.rencanaOperasiData = {
|
|
spesialis: null,
|
|
subSpesialis: null,
|
|
tanggalDaftar: '',
|
|
kategoriOperasi: null,
|
|
rencanaOperasi: '',
|
|
keterangan: ''
|
|
};
|
|
|
|
this.dokterPelaksanaItems = [];
|
|
|
|
this.statusPasienData = {
|
|
tanggalSelesai: '',
|
|
statusOperasi: 'Belum',
|
|
keteranganStatus: ''
|
|
};
|
|
},
|
|
|
|
// Validate form data
|
|
validateForm(): { valid: boolean; errors: string[] } {
|
|
const errors: string[] = [];
|
|
|
|
// Validate formData
|
|
if (!this.formData.noRekamMedis) {
|
|
errors.push('No Rekam Medis');
|
|
}
|
|
|
|
// Validate rencanaOperasiData
|
|
if (!this.rencanaOperasiData.spesialis) {
|
|
errors.push('Spesialis');
|
|
}
|
|
if (!this.rencanaOperasiData.subSpesialis) {
|
|
errors.push('Sub Spesialis');
|
|
}
|
|
if (!this.rencanaOperasiData.tanggalDaftar) {
|
|
errors.push('Tanggal Daftar');
|
|
}
|
|
if (!this.rencanaOperasiData.kategoriOperasi) {
|
|
errors.push('Kategori Operasi');
|
|
}
|
|
|
|
// Validate status operasi
|
|
if (!this.statusPasienData.statusOperasi) {
|
|
errors.push('Status Operasi');
|
|
}
|
|
|
|
// Conditional validation based on status operasi
|
|
if (this.statusPasienData.statusOperasi === 'Selesai') {
|
|
if (!this.statusPasienData.tanggalSelesai) {
|
|
errors.push('Tanggal Selesai Operasi (wajib diisi untuk status Selesai)');
|
|
}
|
|
}
|
|
|
|
if (this.statusPasienData.statusOperasi === 'Tunda' || this.statusPasienData.statusOperasi === 'Batal') {
|
|
if (!this.statusPasienData.keteranganStatus) {
|
|
errors.push('Keterangan Status Pasien (wajib diisi untuk status Tunda/Batal)');
|
|
}
|
|
}
|
|
|
|
return {
|
|
valid: errors.length === 0,
|
|
errors
|
|
};
|
|
},
|
|
|
|
// Submit form
|
|
async submitForm() {
|
|
this.loading = true;
|
|
try {
|
|
// API call simulation
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
// Convert to plain object for cleaner logging
|
|
const submissionData = JSON.parse(JSON.stringify(this.getSubmissionData));
|
|
console.log('Form is valid : ', submissionData);
|
|
|
|
// Show success message
|
|
this.showSnackbar('Data berhasil disimpan!', 'success');
|
|
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error('Error submitting form:', error);
|
|
this.showSnackbar('Terjadi kesalahan saat menyimpan data!', 'error');
|
|
return { success: false, error };
|
|
} finally {
|
|
this.loading = false;
|
|
}
|
|
},
|
|
|
|
// Show snackbar notification
|
|
showSnackbar(message: string, color: string = 'error') {
|
|
this.snackbarMessage = message;
|
|
this.snackbarColor = color;
|
|
this.snackbar = true;
|
|
},
|
|
|
|
// Close snackbar
|
|
closeSnackbar() {
|
|
this.snackbar = false;
|
|
}
|
|
}
|
|
});
|