204 lines
5.8 KiB
JavaScript

export default defineEventHandler(async (event) => {
const body = await readBody(event);
const { userID } = event.context.user;
const {
namaPemohon,
pangkatPemohon,
noPegawaiPemohon,
namaPenghantar,
pangkatPenghantar,
noPegawaiPenghantar,
ringkasanKenyataanKes,
isPenghantarSameAsPemohon,
bilangan,
barangList,
noKertasSiasatan,
noLaporanPolis,
tarikhTemujanji,
slotMasa,
isDraft,
} = body;
// 1. Mandatory fields validation
const mandatoryFields = [
namaPemohon,
pangkatPemohon,
noPegawaiPemohon,
ringkasanKenyataanKes,
bilangan,
noKertasSiasatan,
noLaporanPolis,
tarikhTemujanji,
slotMasa,
...barangList,
];
if (mandatoryFields.some((field) => !field || field === "")) {
return {
statusCode: 400,
message:
"Setiap medan mandatori yang bertanda * telah diisi. (Ralat CMN-E001)",
};
}
// 2. Validate date for the appointment
const appointmentDate = new Date(tarikhTemujanji);
const currentDate = new Date();
if (appointmentDate <= currentDate) {
return {
statusCode: 400,
message:
"Perlu memastikan tarikh janji temu yang dimasukkan adalah tarikh selepas tarikh semasa. (Ralat CMN-E002)",
};
}
// 3. Check if the session is expired
const sessionExpired = false; // Implement session logic here
if (sessionExpired) {
return {
statusCode: 401,
message:
"Sesi aktif pengguna berada dalam sistem telah tamat. (Ralat CMN-E005)",
};
}
// 4. Check for invalid symbols in text fields
const hasInvalidSymbols = (text) => /[^a-zA-Z0-9\s]/.test(text); // Allow alphanumeric and spaces
const fieldsToCheck = [
namaPemohon,
pangkatPemohon,
noPegawaiPemohon,
...barangList.map((barang) => barang.tandaBarang),
];
if (fieldsToCheck.some((field) => hasInvalidSymbols(field))) {
return {
statusCode: 400,
message:
"Perlu memastikan tiada penggunaan simbol dalam medan yang ditetapkan. (Ralat CMN-E011)",
};
}
// 5. Insert data into the database
const caseReferenceID = generateCaseReferenceID();
let permohonanStatus = isDraft ? "Permohonan Draf" : "Permohonan Dihantar";
try {
// Insert into `permohonan` table
const newPermohonan = await prisma.permohonan.create({
data: {
no_siri: caseReferenceID,
status_permohonan: permohonanStatus,
pemohon: {
create: {
userID: userID, // Assuming the user is authenticated, replace with actual user ID
pangkat_pemohon: pangkatPemohon,
no_pegawai_pemohon: noPegawaiPemohon,
},
},
penghantar: {
create: {
nama_penghantar: namaPenghantar,
pangkat_penghantar: pangkatPenghantar,
no_pegawai_penghantar: noPegawaiPenghantar,
},
},
ringkasan_kenyataan_kes: ringkasanKenyataanKes,
bilangan: parseInt(bilangan),
penghantar_sama_dengan_pemohon: isPenghantarSameAsPemohon ? 1 : 0,
no_kertas_siasatan: noKertasSiasatan,
no_laporan_polis: noLaporanPolis,
tarikh_temujanji: new Date(tarikhTemujanji),
slot_masa: new Date(`1970-01-01T${slotMasa}`), // Convert slotMasa string to Time
create_at: new Date(),
},
});
// Insert related `report` and `document` data
for (const barang of barangList) {
// await prisma.report.create({
// data: {
// permohonanID: newPermohonan.id,
// jenis_barang: barang.jenisBarangDetail,
// kuantiti_barang: barang.kuantitiBarang,
// tanda_barang: barang.tandaBarang,
// keadaan_barang: barang.keadaanBarang,
// create_by: userID,
// create_at: new Date(),
// },
// });
await prisma.report.create({
data: {
permohonanID: newPermohonan.id,
jenis_barang: barang.jenisBarangDetail,
create_by: userID,
create_at: new Date(),
},
});
}
// 6. Send confirmation email
if (!isDraft) {
await sendEmail({
to: [
/* pemohon, pegawai_kaunter, ketua_bahagian */
],
subject: `Permohonan Baru: ${caseReferenceID}`,
body: `
Case ID: ${caseReferenceID}
Appointment Date: ${tarikhTemujanji}
Time Slot: ${slotMasa}
Barang: ${barangList
.map(
(barang) =>
`${barang.tandaBarang} - ${barang.kuantitiBarang} units`
)
.join(", ")}
Pemohon Details: ${namaPemohon} (${pangkatPemohon})
${
isPenghantarSameAsPemohon
? ""
: `Penghantar Details: ${namaPenghantar} (${pangkatPenghantar})`
}
Ringkasan Kenyataan Kes: ${ringkasanKenyataanKes}
`,
});
}
return {
statusCode: 200,
message: isDraft
? "Rekod telah berjaya disimpan. (Status CMN-S001)"
: "Permohonan pemeriksaan forensik telah dihantar. (Status FOR-S001)",
};
} catch (error) {
console.log(error);
return {
statusCode: 500,
message: "Terdapat masalah. Silakan cuba lagi.",
};
}
});
// Helper function to generate case reference number
const generateCaseReferenceID = () => {
const now = new Date();
const year = now.getFullYear().toString();
const month = String(now.getMonth() + 1).padStart(2, "0"); // JS month is zero-indexed
const day = String(now.getDate()).padStart(2, "0");
const uniqueSerial = String(Math.floor(Math.random() * 1000000)).padStart(
6,
"0"
);
return `${year}${month}${day}-${uniqueSerial}`;
};
const sendEmail = async ({ to, subject, body }) => {
console.log("Sending email to", to);
return true;
};