276 lines
9.2 KiB
TypeScript
276 lines
9.2 KiB
TypeScript
import { defineStore } from 'pinia';
|
|
import spesialisData from '~/data/mock/spesialis.json';
|
|
import subSpesialisData from '~/data/mock/subSpesialis.json';
|
|
import api from '~/services/api';
|
|
import type { Dokter, DiagnosisItem, TindakanItem } from '~/types/pendaftaran';
|
|
|
|
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;
|
|
}
|
|
|
|
export const usePendaftaranStore = defineStore('pendaftaran', {
|
|
state: () => ({
|
|
// Form data
|
|
formData: {
|
|
noRekamMedis: '',
|
|
noKtp: '',
|
|
namaPasien: '',
|
|
jenisKelamin: '',
|
|
tanggalLahir: '',
|
|
umur: '',
|
|
alamat: '',
|
|
nomorTelepon: []
|
|
} as FormData,
|
|
|
|
// Medical data
|
|
diagnosisItems: [] as DiagnosisItem[],
|
|
tindakanItems: [] as TindakanItem[],
|
|
|
|
// 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)');
|
|
} else if (this.rencanaOperasiData.tanggalDaftar &&
|
|
this.statusPasienData.tanggalSelesai < this.rencanaOperasiData.tanggalDaftar) {
|
|
errors.push('Tanggal Selesai Operasi tidak boleh kurang dari Tanggal Daftar');
|
|
}
|
|
}
|
|
|
|
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 {
|
|
// Prepare submission data
|
|
const submissionData = {
|
|
formData: this.formData,
|
|
diagnosisItems: this.diagnosisItems,
|
|
tindakanItems: this.tindakanItems,
|
|
rencanaOperasiData: {
|
|
...this.rencanaOperasiData,
|
|
// Convert tanggalDaftar to ISO format if needed
|
|
tanggalDaftar: this.rencanaOperasiData.tanggalDaftar
|
|
? new Date(this.rencanaOperasiData.tanggalDaftar).toISOString()
|
|
: ''
|
|
},
|
|
dokterPelaksanaItems: this.dokterPelaksanaItems.map(dokter => ({
|
|
id: dokter.id,
|
|
nip: dokter.nip,
|
|
nama: dokter.nama_lengkap
|
|
})),
|
|
statusPasienData: {
|
|
...this.statusPasienData,
|
|
// Convert tanggalSelesai to ISO format or null
|
|
tanggalSelesai: this.statusPasienData.tanggalSelesai
|
|
? new Date(this.statusPasienData.tanggalSelesai).toISOString()
|
|
: null
|
|
}
|
|
};
|
|
|
|
console.log('Submitting data:', submissionData);
|
|
|
|
// Make API call
|
|
const response = await api.post('/antrian-operasi', submissionData);
|
|
|
|
console.log('API Response:', response.data);
|
|
|
|
// Show success message
|
|
this.showSnackbar('Data berhasil disimpan!', 'success');
|
|
|
|
return { success: true, data: response.data };
|
|
} catch (error: any) {
|
|
console.error('Error submitting form:', error);
|
|
|
|
// Handle error message
|
|
const errorMessage = error.response?.data?.message
|
|
|| error.message
|
|
|| 'Terjadi kesalahan saat menyimpan data!';
|
|
|
|
this.showSnackbar(errorMessage, '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;
|
|
}
|
|
}
|
|
});
|