jlp
This commit is contained in:
parent
46144e5802
commit
540bbaa443
@ -39,6 +39,18 @@ export default [
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "FOR-03",
|
||||||
|
icon: "ph:number-circle-two-fill",
|
||||||
|
child: [
|
||||||
|
{
|
||||||
|
title: "e-library",
|
||||||
|
path: "/e-library",
|
||||||
|
child: [],
|
||||||
|
meta: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
77
pages/e-library/index.vue
Normal file
77
pages/e-library/index.vue
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div class="flex justify-between items-center">
|
||||||
|
<h1>E-Library</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-4">
|
||||||
|
<rs-card class="py-1">
|
||||||
|
<rs-table
|
||||||
|
:data="tableData"
|
||||||
|
:options="{
|
||||||
|
variant: 'default',
|
||||||
|
striped: true,
|
||||||
|
borderless: true,
|
||||||
|
}"
|
||||||
|
:options-advanced="{
|
||||||
|
sortable: true,
|
||||||
|
filterable: false,
|
||||||
|
}"
|
||||||
|
advanced
|
||||||
|
>
|
||||||
|
<template v-slot:aksi="data">
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<rs-button
|
||||||
|
@click="viewItem(data.value.noSiri)"
|
||||||
|
variant="info"
|
||||||
|
size="sm"
|
||||||
|
class="p-1"
|
||||||
|
title="Lihat"
|
||||||
|
>
|
||||||
|
<Icon name="ic:outline-visibility" size="1.2rem" />
|
||||||
|
</rs-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</rs-table>
|
||||||
|
</rs-card>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, onMounted } from "vue";
|
||||||
|
|
||||||
|
const tableData = ref([]);
|
||||||
|
|
||||||
|
const generateData = () => {
|
||||||
|
const data = [];
|
||||||
|
for (let i = 1; i <= 10; i++) {
|
||||||
|
data.push({
|
||||||
|
noSiri: `NS${String(i).padStart(3, "0")}`,
|
||||||
|
pengguna: `Pengguna ${i}`,
|
||||||
|
subjek: `Subjek ${i}`,
|
||||||
|
tarikh: new Date(2023, 0, i).toLocaleDateString("ms-MY"),
|
||||||
|
aksi: { noSiri: `NS${String(i).padStart(3, "0")}` },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
|
const viewItem = (noSiri) => {
|
||||||
|
console.log(`View item with noSiri: ${noSiri}`);
|
||||||
|
// Implement view functionality
|
||||||
|
|
||||||
|
navigateTo(`/e-library/maklumat/${noSiri}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
const editItem = (noSiri) => {
|
||||||
|
console.log(`Edit item with noSiri: ${noSiri}`);
|
||||||
|
// Implement edit functionality
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
tableData.value = generateData();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
83
pages/e-library/maklumat/[noSiri]/index.vue
Normal file
83
pages/e-library/maklumat/[noSiri]/index.vue
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h1 class="text-2xl font-bold mb-4">Maklumat E-Library</h1>
|
||||||
|
<rs-card class="mt-4 p-4">
|
||||||
|
<div v-if="loading">Loading...</div>
|
||||||
|
<div v-else-if="error">{{ error }}</div>
|
||||||
|
<div v-else>
|
||||||
|
<h2 class="text-xl font-semibold mb-2">No. Siri: {{ noSiri }}</h2>
|
||||||
|
<div class="grid grid-cols-2 gap-4">
|
||||||
|
<div>
|
||||||
|
<p><strong>Nama Pemohon:</strong> {{ permohonanData.namaPemohon }}</p>
|
||||||
|
<p><strong>Pangkat Pemohon:</strong> {{ permohonanData.pangkatPemohon }}</p>
|
||||||
|
<p>
|
||||||
|
<strong>No. Pegawai Pemohon:</strong> {{ permohonanData.noPegawaiPemohon }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p><strong>Nama Penghantar:</strong> {{ permohonanData.namaPenghantar }}</p>
|
||||||
|
<p>
|
||||||
|
<strong>Pangkat Penghantar:</strong> {{ permohonanData.pangkatPenghantar }}
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong>No. Pegawai Penghantar:</strong>
|
||||||
|
{{ permohonanData.noPegawaiPenghantar }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-4">
|
||||||
|
<p>
|
||||||
|
<strong>Ringkasan Kenyataan Kes:</strong>
|
||||||
|
{{ permohonanData.ringkasanKenyataanKes }}
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong>No. Kertas Siasatan:</strong> {{ permohonanData.noKertasSiasatan }}
|
||||||
|
</p>
|
||||||
|
<p><strong>No. Laporan Polis:</strong> {{ permohonanData.noLaporanPolis }}</p>
|
||||||
|
<p><strong>Tarikh Temujanji:</strong> {{ permohonanData.tarikhTemujanji }}</p>
|
||||||
|
<p><strong>Slot Masa:</strong> {{ permohonanData.slotMasa }}</p>
|
||||||
|
</div>
|
||||||
|
<div class="mt-4">
|
||||||
|
<h3 class="text-lg font-semibold mb-2">Senarai Barang</h3>
|
||||||
|
<ul>
|
||||||
|
<li v-for="(barang, index) in permohonanData.barangList" :key="index">
|
||||||
|
{{ barang.jenisBarangDetailLabel }} - {{ barang.jenisBarangSiber }}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</rs-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
const route = useRoute();
|
||||||
|
const noSiri = ref(route.params.noSiri);
|
||||||
|
const permohonanData = ref({});
|
||||||
|
const loading = ref(true);
|
||||||
|
const error = ref(null);
|
||||||
|
|
||||||
|
const fetchPermohonanData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await $fetch(`/api/permohonan/${noSiri.value}`);
|
||||||
|
if (response.statusCode === 200) {
|
||||||
|
permohonanData.value = response.data;
|
||||||
|
} else {
|
||||||
|
throw new Error(response.message);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
error.value = "Failed to fetch permohonan data. Please try again.";
|
||||||
|
console.error(err);
|
||||||
|
} finally {
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
fetchPermohonanData();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* Add any scoped styles here if needed */
|
||||||
|
</style>
|
@ -35,6 +35,7 @@ model document {
|
|||||||
temujanji_temujanji_gambarSubjekTodocument temujanji[] @relation("temujanji_gambarSubjekTodocument")
|
temujanji_temujanji_gambarSubjekTodocument temujanji[] @relation("temujanji_gambarSubjekTodocument")
|
||||||
temujanji_temujanji_gambarCapJariTodocument temujanji[] @relation("temujanji_gambarCapJariTodocument")
|
temujanji_temujanji_gambarCapJariTodocument temujanji[] @relation("temujanji_gambarCapJariTodocument")
|
||||||
temujanji_detail temujanji_detail[]
|
temujanji_detail temujanji_detail[]
|
||||||
|
temujanji_log temujanji_log[]
|
||||||
|
|
||||||
@@index([userID], map: "userID")
|
@@index([userID], map: "userID")
|
||||||
}
|
}
|
||||||
@ -312,6 +313,7 @@ model report_doc_support {
|
|||||||
|
|
||||||
model temujanji {
|
model temujanji {
|
||||||
temujanjiID Int @id @default(autoincrement())
|
temujanjiID Int @id @default(autoincrement())
|
||||||
|
noSiri String @db.VarChar(255)
|
||||||
temujanjiDetailID Int?
|
temujanjiDetailID Int?
|
||||||
pemohonID Int
|
pemohonID Int
|
||||||
jenisSemakan String @db.VarChar(255)
|
jenisSemakan String @db.VarChar(255)
|
||||||
@ -326,6 +328,7 @@ model temujanji {
|
|||||||
document_temujanji_gambarCapJariTodocument document? @relation("temujanji_gambarCapJariTodocument", fields: [gambarCapJari], references: [documentID], onDelete: NoAction, onUpdate: NoAction, map: "fk_gambarCapJari")
|
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")
|
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")
|
temujanji_detail temujanji_detail? @relation(fields: [temujanjiDetailID], references: [temujanjiDetailID], onDelete: NoAction, onUpdate: NoAction, map: "temujanji_ibfk_4")
|
||||||
|
temujanji_log temujanji_log[]
|
||||||
|
|
||||||
@@index([gambarCapJari], map: "idx_gambarCapJari")
|
@@index([gambarCapJari], map: "idx_gambarCapJari")
|
||||||
@@index([gambarSubjek], map: "idx_gambarSubjek")
|
@@index([gambarSubjek], map: "idx_gambarSubjek")
|
||||||
@ -367,3 +370,49 @@ model temujanji_detail {
|
|||||||
|
|
||||||
@@index([laporanSystemTdb], map: "idx_laporanSystemTdb")
|
@@index([laporanSystemTdb], map: "idx_laporanSystemTdb")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
model temujanji_log {
|
||||||
|
temujanjiLogID Int @id @default(autoincrement())
|
||||||
|
temujanjiID Int
|
||||||
|
pemohonID Int?
|
||||||
|
jenisSemakan String? @db.VarChar(255)
|
||||||
|
tarikh DateTime? @db.Date
|
||||||
|
masa DateTime? @db.Time(0)
|
||||||
|
gambarSubjek Int?
|
||||||
|
gambarCapJari Int?
|
||||||
|
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)
|
||||||
|
document document? @relation(fields: [laporanSystemTdb], references: [documentID], onDelete: NoAction, onUpdate: NoAction, map: "temujanji_log_ibfk_1")
|
||||||
|
temujanji temujanji @relation(fields: [temujanjiID], references: [temujanjiID], onDelete: NoAction, onUpdate: NoAction, map: "temujanji_log_ibfk_2")
|
||||||
|
|
||||||
|
@@index([gambarCapJari], map: "gambarCapJari")
|
||||||
|
@@index([gambarSubjek], map: "gambarSubjek")
|
||||||
|
@@index([laporanSystemTdb], map: "laporanSystemTdb")
|
||||||
|
@@index([pemohonID], map: "pemohonID")
|
||||||
|
@@index([temujanjiID], map: "temujanjiID")
|
||||||
|
}
|
||||||
|
91
server/api/elibrary/index.get.js
Normal file
91
server/api/elibrary/index.get.js
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
export default defineEventHandler(async (event) => {
|
||||||
|
// Get the `noSiri` from the request parameters
|
||||||
|
const { noSiri } = event.context.params;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Fetch the permohonan by `no_siri` from the Prisma database
|
||||||
|
const permohonan = await prisma.permohonan.findUnique({
|
||||||
|
where: {
|
||||||
|
no_siri: noSiri, // Unique identifier for permohonan
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
// Include related fields if necessary
|
||||||
|
pemohon: {
|
||||||
|
select: {
|
||||||
|
user: {
|
||||||
|
select: {
|
||||||
|
userFullName: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
pangkat_pemohon: true,
|
||||||
|
no_pegawai_pemohon: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
penghantar: true,
|
||||||
|
report: {
|
||||||
|
select: {
|
||||||
|
jenis_barang: true,
|
||||||
|
lookup_report_jenis_barangTolookup: {
|
||||||
|
select: {
|
||||||
|
lookupID: true,
|
||||||
|
lookupValue: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tanda_barang: true,
|
||||||
|
keadaan_barang: true,
|
||||||
|
kuantiti_barang: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// If no permohonan found, return a 404 response
|
||||||
|
if (!permohonan) {
|
||||||
|
return {
|
||||||
|
statusCode: 404,
|
||||||
|
message: `Permohonan with noSiri ${noSiri} not found`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Map and return the data as expected by the frontend
|
||||||
|
return {
|
||||||
|
statusCode: 200,
|
||||||
|
data: {
|
||||||
|
namaPemohon: permohonan.pemohon?.user?.userFullName || "", // Get namaPemohon from userID
|
||||||
|
pangkatPemohon: permohonan.pemohon?.pangkat_pemohon || "",
|
||||||
|
noPegawaiPemohon: permohonan.pemohon?.no_pegawai_pemohon || "",
|
||||||
|
namaPenghantar: permohonan.penghantar?.nama_penghantar || "",
|
||||||
|
pangkatPenghantar: permohonan.penghantar?.pangkat_penghantar || "",
|
||||||
|
noPegawaiPenghantar: permohonan.penghantar?.no_pegawai_penghantar || "",
|
||||||
|
ringkasanKenyataanKes: permohonan.ringkasan_kenyataan_kes || "",
|
||||||
|
bilangan: permohonan.bilangan || 0,
|
||||||
|
barangList: permohonan.report.map((barang) => ({
|
||||||
|
jenisBarangDetail:
|
||||||
|
barang.lookup_report_jenis_barangTolookup.lookupID || "",
|
||||||
|
jenisBarangDetailLabel:
|
||||||
|
barang.lookup_report_jenis_barangTolookup.lookupValue || "",
|
||||||
|
tandaBarang: barang.tanda_barang || "",
|
||||||
|
keadaanBarang: barang.keadaan_barang || "",
|
||||||
|
kuantitiBarang: barang.kuantiti_barang || 0,
|
||||||
|
})),
|
||||||
|
noKertasSiasatan: permohonan.no_kertas_siasatan || "",
|
||||||
|
noLaporanPolis: permohonan.no_laporan_polis || "",
|
||||||
|
tarikhTemujanji:
|
||||||
|
permohonan.tarikh_temujanji?.toISOString().split("T")[0] || "",
|
||||||
|
slotMasa: permohonan.slot_masa
|
||||||
|
? new Date(permohonan.slot_masa).toLocaleTimeString("en-US", {
|
||||||
|
hour: "2-digit",
|
||||||
|
minute: "2-digit",
|
||||||
|
hour12: false,
|
||||||
|
})
|
||||||
|
: "",
|
||||||
|
isPenghantarSameAsPemohon: !permohonan.penghantar,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching permohonan:", error);
|
||||||
|
return {
|
||||||
|
statusCode: 500,
|
||||||
|
message: "An error occurred while fetching the permohonan data.",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
@ -7,7 +7,13 @@ export default defineEventHandler(async (event) => {
|
|||||||
const temujanjiDetailsID = await prisma.temujanji.findFirst({
|
const temujanjiDetailsID = await prisma.temujanji.findFirst({
|
||||||
where: { temujanjiID: parseInt(temujanjiID) },
|
where: { temujanjiID: parseInt(temujanjiID) },
|
||||||
select: {
|
select: {
|
||||||
|
temujanjiID: true,
|
||||||
temujanjiDetailID: true,
|
temujanjiDetailID: true,
|
||||||
|
noSiri: true,
|
||||||
|
jenisSemakan: true,
|
||||||
|
tarikh: true,
|
||||||
|
masa: true,
|
||||||
|
status: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -47,6 +53,40 @@ export default defineEventHandler(async (event) => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// insert temujanji_log
|
||||||
|
await prisma.temujanji_log.create({
|
||||||
|
data: {
|
||||||
|
temujanjiID: parseInt(temujanjiID),
|
||||||
|
jenisSemakan: temujanjiDetailsID.jenisSemakan,
|
||||||
|
tarikh: temujanjiDetailsID.tarikh,
|
||||||
|
masa: temujanjiDetailsID.masa,
|
||||||
|
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,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
statusCode: 200,
|
statusCode: 200,
|
||||||
message: "Temujanji berjaya dikemaskini.",
|
message: "Temujanji berjaya dikemaskini.",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user