Files
antrean-operasi/store/pendaftaran.ts
2026-02-02 08:13:15 +07:00

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;
}
}
});