diff --git a/error.vue b/error.vue index 7736c76..887d095 100644 --- a/error.vue +++ b/error.vue @@ -31,14 +31,14 @@ const redirectClearError = () => {
Oops!

- The page you are looking for does not exist. + Halaman yang anda cari tidak ada.

diff --git a/navigation/index.js b/navigation/index.js index 3ff5fd2..106b839 100644 --- a/navigation/index.js +++ b/navigation/index.js @@ -27,6 +27,18 @@ export default [ // }, ], }, + { + title: "FOR-02", + icon: "ph:number-circle-two-fill", + child: [ + { + title: "Pengesanan Penyamaran", + path: "/pengesanan-penyamaran/senarai", + child: [], + meta: {}, + }, + ], + }, ], }, { diff --git a/pages/pengesanan-penyamaran/baru/index.vue b/pages/pengesanan-penyamaran/baru/index.vue new file mode 100644 index 0000000..a32b9f3 --- /dev/null +++ b/pages/pengesanan-penyamaran/baru/index.vue @@ -0,0 +1,116 @@ + + + diff --git a/pages/pengesanan-penyamaran/kemaskini/[kesID]/index.vue b/pages/pengesanan-penyamaran/kemaskini/[kesID]/index.vue new file mode 100644 index 0000000..58b7497 --- /dev/null +++ b/pages/pengesanan-penyamaran/kemaskini/[kesID]/index.vue @@ -0,0 +1,293 @@ + + + + + diff --git a/pages/pengesanan-penyamaran/senarai/index.vue b/pages/pengesanan-penyamaran/senarai/index.vue new file mode 100644 index 0000000..9fcf442 --- /dev/null +++ b/pages/pengesanan-penyamaran/senarai/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 928f547..8506d7b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -17,21 +17,24 @@ model audit { } model document { - documentID Int @id @default(autoincrement()) - userID Int? - documentName String? @db.VarChar(255) - documentURL String? @db.VarChar(255) - documentType String? @db.VarChar(255) - documentExtension String? @db.VarChar(255) - imageMIMEType String? @db.VarChar(255) - documentSize Int? - documentStatus String? @default("ACTIVE") @db.VarChar(255) - documentCreatedDate String? @db.VarChar(255) - documentModifiedDate String? @db.VarChar(255) - user user? @relation(fields: [userID], references: [userID], onDelete: NoAction, onUpdate: NoAction, map: "document_ibfk_1") - permohonan_forensik_checking permohonan_forensik_checking[] - report report[] - report_doc_support report_doc_support[] + documentID Int @id @default(autoincrement()) + userID Int? + documentName String? @db.VarChar(255) + documentURL String? @db.VarChar(255) + documentType String? @db.VarChar(255) + documentExtension String? @db.VarChar(255) + imageMIMEType String? @db.VarChar(255) + documentSize Int? + documentStatus String? @default("ACTIVE") @db.VarChar(255) + documentCreatedDate String? @db.VarChar(255) + documentModifiedDate String? @db.VarChar(255) + user user? @relation(fields: [userID], references: [userID], onDelete: NoAction, onUpdate: NoAction, map: "document_ibfk_1") + permohonan_forensik_checking permohonan_forensik_checking[] + report report[] + report_doc_support report_doc_support[] + temujanji_temujanji_gambarSubjekTodocument temujanji[] @relation("temujanji_gambarSubjekTodocument") + temujanji_temujanji_gambarCapJariTodocument temujanji[] @relation("temujanji_gambarCapJariTodocument") + temujanji_detail temujanji_detail[] @@index([userID], map: "userID") } @@ -69,6 +72,7 @@ model pemohon { no_pegawai_pemohon String @db.VarChar(255) user user @relation(fields: [userID], references: [userID], onDelete: NoAction, onUpdate: NoAction, map: "pemohon_ibfk_1") permohonan permohonan[] + temujanji temujanji[] @@index([userID], map: "userID") } @@ -305,3 +309,61 @@ model report_doc_support { @@index([documentID], map: "documentID") @@index([reportID], map: "reportID") } + +model temujanji { + temujanjiID Int @id @default(autoincrement()) + temujanjiDetailID Int? + pemohonID Int + jenisSemakan String @db.VarChar(255) + tarikh DateTime @db.Date + masa DateTime @db.Time(0) + status String? @db.VarChar(255) + gambarSubjek Int? + gambarCapJari Int? + create_at DateTime? @default(now()) @db.DateTime(0) + modified_at DateTime? @db.DateTime(0) + document_temujanji_gambarSubjekTodocument document? @relation("temujanji_gambarSubjekTodocument", fields: [gambarSubjek], references: [documentID], onDelete: NoAction, onUpdate: NoAction, map: "fk_gambarSubjek") + document_temujanji_gambarCapJariTodocument document? @relation("temujanji_gambarCapJariTodocument", fields: [gambarCapJari], references: [documentID], onDelete: NoAction, onUpdate: NoAction, map: "fk_gambarCapJari") + pemohon pemohon @relation(fields: [pemohonID], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "temujanji_ibfk_1") + temujanji_detail temujanji_detail? @relation(fields: [temujanjiDetailID], references: [temujanjiDetailID], onDelete: NoAction, onUpdate: NoAction, map: "temujanji_ibfk_4") + + @@index([gambarCapJari], map: "idx_gambarCapJari") + @@index([gambarSubjek], map: "idx_gambarSubjek") + @@index([pemohonID], map: "idx_pemohonID") + @@index([temujanjiDetailID], map: "temujanjiDetailID") +} + +model temujanji_detail { + temujanjiDetailID Int @id @default(autoincrement()) + negara String? @db.VarChar(255) + namaPemilik String? @db.VarChar(255) + noDokumen String? @db.VarChar(255) + kewarganegaraan String? @db.VarChar(255) + tarikhLahir DateTime? @db.Date + jantina String? @db.VarChar(255) + tarikhLuputDokumen DateTime? @db.Date + skorPersamaanMuka Decimal? @db.Decimal(10, 2) + skorPersamaanCapJari Decimal? @db.Decimal(10, 2) + umur Int? + tinggi Decimal? @db.Decimal(10, 2) + warnaRambut String? @db.VarChar(255) + bangsa String? @db.VarChar(255) + etnik String? @db.VarChar(255) + bentukKepala String? @db.VarChar(255) + mata String? @db.VarChar(255) + telinga String? @db.VarChar(255) + hidung String? @db.VarChar(255) + mulut String? @db.VarChar(255) + parut String? @db.VarChar(255) + sejarahPerjalanan String? @db.VarChar(255) + persamaanTandaTangan String? @db.VarChar(255) + pemeriksaanLain String? @db.VarChar(255) + dapatan String @db.VarChar(255) + laporanSystemTdb Int? + create_at DateTime? @db.DateTime(0) + modified_at DateTime? @db.DateTime(0) + temujanji temujanji[] + document document? @relation(fields: [laporanSystemTdb], references: [documentID], onDelete: NoAction, onUpdate: NoAction, map: "temujanji_detail_ibfk_2") + + @@index([laporanSystemTdb], map: "idx_laporanSystemTdb") +} diff --git a/server/api/temujanji/[temujanjiID].delete.js b/server/api/temujanji/[temujanjiID].delete.js new file mode 100644 index 0000000..22b08d7 --- /dev/null +++ b/server/api/temujanji/[temujanjiID].delete.js @@ -0,0 +1,34 @@ +export default defineEventHandler(async (event) => { + const { temujanjiID } = event.context.params; + + try { + // Check if temujanji_detail exists before deleting + const detailExists = await prisma.temujanji_detail.findFirst({ + where: { temujanjiID: parseInt(temujanjiID) }, + }); + + if (detailExists) { + await prisma.temujanji_detail.deleteMany({ + where: { temujanjiID: parseInt(temujanjiID) }, + }); + } + + const pemohonExists = await prisma.pemohon.findFirst({ + where: { temujanjiID: parseInt(temujanjiID) }, + }); + + if (pemohonExists) { + await prisma.pemohon.delete({ + where: { temujanjiID: parseInt(temujanjiID) }, + }); + } + + await prisma.temujanji.delete({ + where: { temujanjiID: parseInt(temujanjiID) }, + }); + + return { statusCode: 200, message: "Berjaya" }; + } catch (error) { + return { statusCode: 500, message: error.message }; + } +}); diff --git a/server/api/temujanji/[temujanjiID].get.js b/server/api/temujanji/[temujanjiID].get.js new file mode 100644 index 0000000..800e2c8 --- /dev/null +++ b/server/api/temujanji/[temujanjiID].get.js @@ -0,0 +1,64 @@ +export default defineEventHandler(async (event) => { + const { temujanjiID } = event.context.params; + + try { + // Fetch the appointment data and related details from temujanji_detail + const appointment = await prisma.temujanji.findUnique({ + where: { temujanjiID: parseInt(temujanjiID) }, + include: { + pemohon: true, // Include pemohon (applicant) details + temujanji_detail: true, + }, + }); + + console.log(appointment); + + if (!appointment) { + return { + statusCode: 404, + message: "Temujanji tidak dijumpai.", + }; + } + + // Format the data to fit the front-end expectations + return { + statusCode: 200, + data: { + temujanjiID: appointment.temujanjiID, + jenisDokumen: appointment.temujanji_detail.jenisDokumen, + negara: appointment.temujanji_detail.negara, + namaPemilik: appointment.temujanji_detail.namaPemilik, + noDokumen: appointment.temujanji_detail.noDokumen, + kewarganegaraan: appointment.temujanji_detail.kewarganegaraan, + tarikhLahir: appointment.temujanji_detail.tarikhLahir, + jantina: appointment.temujanji_detail.jantina, + tarikhLuputDokumen: appointment.temujanji_detail.tarikhLuputDokumen, + skorPersamaanMuka: appointment.temujanji_detail.skorPersamaanMuka, + skorPersamaanCapJari: appointment.temujanji_detail.skorPersamaanCapJari, + umur: appointment.temujanji_detail.umur, + tinggi: appointment.temujanji_detail.tinggi, + warnaRambut: appointment.temujanji_detail.warnaRambut, + bangsa: appointment.temujanji_detail.bangsa, + etnik: appointment.temujanji_detail.etnik, + bentukKepala: appointment.temujanji_detail.bentukKepala, + mata: appointment.temujanji_detail.mata, + telinga: appointment.temujanji_detail.telinga, + hidung: appointment.temujanji_detail.hidung, + mulut: appointment.temujanji_detail.mulut, + parut: appointment.temujanji_detail.parut, + sejarahPerjalanan: appointment.temujanji_detail.sejarahPerjalanan, + persamaanTandaTangan: appointment.temujanji_detail.persamaanTandaTangan, + pemeriksaanLain: appointment.temujanji_detail.pemeriksaanLain, + dapatan: appointment.temujanji_detail.dapatan, + laporanSystemTdb: + appointment.temujanji_detail?.document?.documentURL || null, + }, + }; + } catch (error) { + console.error("Error fetching temujanji:", error); + return { + statusCode: 500, + message: "Error fetching appointment data.", + }; + } +}); diff --git a/server/api/temujanji/[temujanjiID].put.js b/server/api/temujanji/[temujanjiID].put.js new file mode 100644 index 0000000..5e1995e --- /dev/null +++ b/server/api/temujanji/[temujanjiID].put.js @@ -0,0 +1,58 @@ +export default defineEventHandler(async (event) => { + const { temujanjiID } = event.context.params; + const body = await readBody(event); + + try { + // Get temujanji details ID + const temujanjiDetailsID = await prisma.temujanji_detail.findFirst({ + where: { temujanjiID: parseInt(temujanjiID) }, + }); + + console.log(temujanjiDetailsID); + + // Update the main `temujanji` table and related details in `temujanji_detail` + await prisma.temujanji_detail.update({ + where: { + temujanjiDetailID: temujanjiDetailsID.temujanjiDetailID, + }, + data: { + negara: body.negara, + namaPemilik: body.namaPemilik, + noDokumen: body.noDokumen, + kewarganegaraan: body.kewarganegaraan, + tarikhLahir: new Date(body.tarikhLahir), + jantina: body.jantina, + tarikhLuputDokumen: new Date(body.tarikhLuputDokumen), + skorPersamaanMuka: parseFloat(body.skorPersamaanMuka), + skorPersamaanCapJari: parseFloat(body.skorPersamaanCapJari), + umur: body.umur ? parseInt(body.umur) : null, + tinggi: body.tinggi ? parseFloat(body.tinggi) : null, + warnaRambut: body.warnaRambut || null, + bangsa: body.bangsa || null, + etnik: body.etnik || null, + bentukKepala: body.bentukKepala || null, + mata: body.mata || null, + telinga: body.telinga || null, + hidung: body.hidung || null, + mulut: body.mulut || null, + parut: body.parut || null, + sejarahPerjalanan: body.sejarahPerjalanan || null, + persamaanTandaTangan: body.persamaanTandaTangan || null, + pemeriksaanLain: body.pemeriksaanLain || null, + dapatan: body.dapatan, + modified_at: new Date(), + }, + }); + + return { + statusCode: 200, + message: "Temujanji berjaya dikemaskini.", + }; + } catch (error) { + console.error("Error updating temujanji:", error); + return { + statusCode: 500, + message: "Gagal mengemaskini temujanji.", + }; + } +}); diff --git a/server/api/temujanji/index.get.js b/server/api/temujanji/index.get.js new file mode 100644 index 0000000..bb3a72e --- /dev/null +++ b/server/api/temujanji/index.get.js @@ -0,0 +1,31 @@ +export default defineEventHandler(async (event) => { + try { + const appointments = await prisma.temujanji.findMany({ + include: { + pemohon: { + include: { + user: true, + }, + }, // Join with pemohon table to get applicant details + }, + }); + + return { + statusCode: 200, + data: appointments.map((appointment, index) => ({ + no: index + 1, + kesId: appointment.temujanjiID, + namaPemohon: appointment.pemohon.user.userFullName, + caraSemakan: appointment.jenisSemakan, + status: appointment.status || "Pending", + tindakan: appointment.temujanjiID, + })), + }; + } catch (error) { + console.log(error); + return { + statusCode: 500, + message: "Failed to fetch appointments.", + }; + } +}); diff --git a/server/api/temujanji/tambah.js b/server/api/temujanji/tambah.js new file mode 100644 index 0000000..b8a7298 --- /dev/null +++ b/server/api/temujanji/tambah.js @@ -0,0 +1,82 @@ +export default defineEventHandler(async (event) => { + const body = await readBody(event); + const { userID } = event.context.user; + + const { pemohon, jenisSemakan, tarikh, masa, gambarSubjek, gambarCapJari } = + body; + + try { + // Validate required fields + if ( + !pemohon.nama || + !pemohon.jawatan || + !pemohon.noPegawai || + !jenisSemakan || + !tarikh || + !masa + ) { + return { + statusCode: 400, + message: "Sila isi semua medan yang diperlukan.", + }; + } + + // Save the appointment (temujanji) into the database using Prisma + const temujanjiBaru = await prisma.temujanji.create({ + data: { + jenisSemakan: jenisSemakan, + tarikh: new Date(tarikh), + masa: new Date(`${tarikh}T${masa}:00`), + status: "Temujanji Diterima", + gambarSubjek: gambarSubjek + ? await saveDocument(gambarSubjek, "Subjek") + : undefined, + gambarCapJari: gambarCapJari + ? await saveDocument(gambarCapJari, "Cap Jari") + : undefined, + pemohon: { + create: { + userID: userID, + pangkat_pemohon: pemohon.jawatan, + no_pegawai_pemohon: pemohon.noPegawai, + }, + }, + temujanji_detail: { + create: { + create_at: new Date(), + }, + }, + }, + }); + + return { + statusCode: 200, + message: "Temujanji berjaya ditambah.", + data: temujanjiBaru, + }; + } catch (error) { + console.error("Error adding appointment:", error); + return { + statusCode: 500, + message: "Terdapat ralat semasa menambah temujanji.", + }; + } +}); + +// Helper function to save uploaded documents to the database +async function saveDocument(file, fileType) { + try { + const savedDocument = await prisma.document.create({ + data: { + name: file.name, + url: `/uploads/${file.name}`, + type: fileType, + size: file.size, + }, + }); + return savedDocument.id; + } catch (error) { + console.error("Error saving document:", error); + throw new Error("Gagal menyimpan dokumen."); + } +}