upd: tambah surat

deskripsi:
- layout form
- seeder category pelayanan
- api tambah surat

No Issues
This commit is contained in:
2025-12-18 17:42:25 +08:00
parent c897063eb5
commit 55fbf4836d
6 changed files with 657 additions and 180 deletions

View File

@@ -114,8 +114,14 @@ const PelayananRoute = new Elysia({
return;
}
const dataText: string[] = Array.isArray(data.dataText)
? data.dataText.filter((v): v is string => typeof v === "string")
const dataPelengkap: { key: string }[] = Array.isArray(data.dataPelengkap)
? data.dataPelengkap.filter(
(v): v is { key: string } =>
typeof v === "object" &&
v !== null &&
"key" in v &&
typeof (v as any).key === "string"
)
: [];
const syaratDokumen: { name: string }[] = Array.isArray(data.syaratDokumen)
@@ -132,7 +138,7 @@ const PelayananRoute = new Elysia({
return {
id: data.id,
name: data.name,
dataText,
dataPelengkap,
syaratDokumen,
};
}, {
@@ -208,8 +214,8 @@ const PelayananRoute = new Elysia({
CategoryPelayanan: {
select: {
name: true,
dataText: true,
syaratDokumen: true,
dataPelengkap:true
}
},
Warga: {
@@ -275,10 +281,11 @@ const PelayananRoute = new Elysia({
const syaratDokumen = (data?.CategoryPelayanan?.syaratDokumen ?? []) as {
name: string;
desc: string;
key: string;
}[];
const dataSyaratFix = dataSyarat.map((item) => {
const desc = syaratDokumen.find((v) => v.name == item.jenis)?.desc
const desc = syaratDokumen.find((v) => v.key == item.jenis)?.desc
return {
id: item.id,
jenis: desc,
@@ -286,11 +293,17 @@ const PelayananRoute = new Elysia({
}
})
const dataTextCategory = (data?.CategoryPelayanan?.dataPelengkap ?? []) as {
name: string;
desc: string;
key: string;
}[];
const dataTextFix = dataText.map((item) => {
const desc = data?.CategoryPelayanan?.dataText.find((v) => v == item.jenis)
const nama = dataTextCategory.find((v) => v.key == item.jenis)?.name
return {
id: item.id,
jenis: item.jenis,
jenis: nama,
value: item.value,
}
})
@@ -360,9 +373,9 @@ const PelayananRoute = new Elysia({
}
})
.post("/create", async ({ body, headers }) => {
const { kategoriId, dataText, syaratDokumen } = body
const namaWarga = headers['x-user'] || ""
const noTelepon = headers['x-phone'] || ""
const { kategoriId, dataPelengkap, syaratDokumen, nama, phone } = body
// const namaWarga = headers['x-user'] || ""
// const noTelepon = headers['x-phone'] || ""
const noPengajuan = await generateNoPengajuanSurat()
let idCategoryFix = kategoriId
let idWargaFix = ""
@@ -388,21 +401,21 @@ const PelayananRoute = new Elysia({
}
if (!isValidPhone(noTelepon)) {
if (!isValidPhone(phone)) {
return { success: false, message: 'nomor telepon tidak valid, harap masukkan nomor yang benar' }
}
const nomorHP = normalizePhoneNumber({ phone: noTelepon })
const nomorHP = normalizePhoneNumber({ phone: phone })
const dataWarga = await prisma.warga.upsert({
where: {
phone: nomorHP
},
create: {
name: namaWarga,
name: nama,
phone: nomorHP,
},
update: {
name: namaWarga,
name: nama,
},
select: {
id: true
@@ -433,16 +446,16 @@ const PelayananRoute = new Elysia({
dataInsertSyaratDokumen.push({
idPengajuanLayanan: pengaduan.id,
idCategory: idCategoryFix,
jenis: item.jenis,
jenis: item.key,
value: item.value,
})
}
for (const item of dataText) {
for (const item of dataPelengkap) {
dataInsertDataText.push({
idPengajuanLayanan: pengaduan.id,
idCategory: idCategoryFix,
jenis: item.jenis,
jenis: item.key,
value: item.value,
})
}
@@ -464,7 +477,7 @@ const PelayananRoute = new Elysia({
}
})
return { success: true, message: 'pengajuan layanan surat sudah dibuat dengan nomer ' + noPengajuan + ', nomer ini akan digunakan untuk mengakses pengajuan ini' }
return { success: true, message: 'Pengajuan layanan surat sudah dibuat dengan nomer ' + noPengajuan + ', nomer ini akan digunakan untuk mengakses pengajuan ini' }
}, {
body: t.Object({
kategoriId: t.String({
@@ -472,21 +485,20 @@ const PelayananRoute = new Elysia({
examples: ["skusaha"],
error: "ID kategori harus diisi"
}),
// namaWarga: t.String({
// description: "Nama warga",
// examples: ["Budi Santoso"],
// error: "Nama warga harus diisi"
// }),
nama: t.String({
description: "Nama warga",
examples: ["Budi Santoso"],
error: "Nama warga harus diisi"
}),
phone: t.String({
error: "Nomor telepon harus diisi",
examples: ["08123456789", "+628123456789"],
description: "Nomor telepon warga pelapor"
}),
// noTelepon: t.String({
// error: "Nomor telepon harus diisi",
// examples: ["08123456789", "+628123456789"],
// description: "Nomor telepon warga pelapor"
// }),
dataText: t.Array(
dataPelengkap: t.Array(
t.Object({
jenis: t.String({
key: t.String({
description: "Jenis field yang dibutuhkan oleh kategori pelayanan. Biasanya dinamis.",
examples: ["nama", "jenis kelamin", "tempat tanggal lahir", "negara", "agama", "status perkawinan", "alamat", "pekerjaan", "jenis usaha", "alamat usaha"],
error: "jenis harus diisi"
@@ -501,25 +513,25 @@ const PelayananRoute = new Elysia({
description: "Kumpulan data text dinamis sesuai kategori layanan.",
examples: [
[
{ jenis: "nama", value: "Budi Santoso" },
{ jenis: "jenis kelamin", value: "Laki-laki" },
{ jenis: "tempat tanggal lahir", value: "Denpasar, 28 Februari 1990" },
{ jenis: "negara", value: "Indonesia" },
{ jenis: "agama", value: "Islam" },
{ jenis: "status perkawinan", value: "Belum menikah" },
{ jenis: "alamat", value: "Jl. Mawar No. 10" },
{ jenis: "pekerjaan", value: "Karyawan Swasta" },
{ jenis: "jenis usaha", value: "usaha makanan" },
{ jenis: "alamat usaha", value: "Jl. Melati No. 21" },
{ key: "nama", value: "Budi Santoso" },
{ key: "jenis kelamin", value: "Laki-laki" },
{ key: "tempat tanggal lahir", value: "Denpasar, 28 Februari 1990" },
{ key: "negara", value: "Indonesia" },
{ key: "agama", value: "Islam" },
{ key: "status perkawinan", value: "Belum menikah" },
{ key: "alamat", value: "Jl. Mawar No. 10" },
{ key: "pekerjaan", value: "Karyawan Swasta" },
{ key: "jenis usaha", value: "usaha makanan" },
{ key: "alamat usaha", value: "Jl. Melati No. 21" },
]
],
error: "dataText harus berupa array"
error: "Data Pelengkap harus berupa array"
}
),
syaratDokumen: t.Array(
t.Object({
jenis: t.String({
key: t.String({
description: "Jenis dokumen persyaratan yang diminta oleh kategori layanan.",
examples: ["ktp", "kk", "surat_pengantar_rt"],
error: "jenis harus diisi"
@@ -534,19 +546,18 @@ const PelayananRoute = new Elysia({
description: "Kumpulan dokumen yang wajib diupload sesuai persyaratan layanan.",
examples: [
[
{ jenis: "pengantar kelian", value: "pengantar_kelurahan_budi.png" },
{ jenis: "ktp/kk", value: "kk_budi.png" },
{ jenis: "foto lokasi", value: "foto_lokasi_budi.png" }
{ key: "pengantar kelian", value: "pengantar_kelurahan_budi.png" },
{ key: "ktp/kk", value: "kk_budi.png" },
{ key: "foto lokasi", value: "foto_lokasi_budi.png" }
]
],
error: "syaratDokumen harus berupa array"
error: "Syarat Dokumen harus berupa array"
}
),
}),
detail: {
summary: "Buat Pengajuan Pelayanan Surat",
description: `tool untuk membuat pengajuan pelayanan surat dengan syarat dokumen serta data text sesuai kategori pelayanan surat yang dipilih`,
tags: ["mcp"]
}
})
.post("/detail-data", async ({ body }) => {
@@ -698,7 +709,6 @@ const PelayananRoute = new Elysia({
dataText: dataTextFix,
}
console.log('detail data syarat==', dataSyaratFix)
return datafix
@@ -778,7 +788,6 @@ const PelayananRoute = new Elysia({
.post("/update", async ({ body }) => {
const { nomerPengajuan, syaratDokumen, dataText } = body
let dataUpdate = []
console.log(body)
const pengajuan = await prisma.pelayananAjuan.findFirst({
where: {
@@ -787,18 +796,15 @@ const PelayananRoute = new Elysia({
})
if (!pengajuan) {
console.log("data pengajuan surat tidak ditemukan")
return { success: false, message: 'data pengajuan surat tidak ditemukan' }
}
if (pengajuan.status != "ditolak" && pengajuan.status != "antrian") {
console.log("pengajuan surat tidak dapat diupdate karena status " + pengajuan.status)
return { success: false, message: 'pengajuan surat tidak dapat diupdate karena status ' + pengajuan.status }
}
if (dataText && dataText.length > 0) {
console.log("dataText")
for (const item of dataText) {
dataUpdate.push(item.jenis)
const hasil = await prisma.dataTextPelayanan.findFirst({
@@ -842,10 +848,8 @@ const PelayananRoute = new Elysia({
if (syaratDokumen && syaratDokumen.length > 0) {
console.log("syaratDokumen")
for (const item of syaratDokumen) {
const pilih = syarat?.find((cat) => cat.desc.toLowerCase() == item.jenis.toLowerCase() || cat.name.toLowerCase() == item.jenis.toLowerCase())?.name;
console.log(syarat, pilih)
dataUpdate.push(pilih)
const hasil = await prisma.syaratDokumenPelayanan.findFirst({
@@ -854,7 +858,6 @@ const PelayananRoute = new Elysia({
jenis: pilih,
}
})
console.log(hasil, item)
if (hasil && hasil.id) {
const upd = await prisma.syaratDokumenPelayanan.upsert({
@@ -898,7 +901,6 @@ const PelayananRoute = new Elysia({
}
})
console.log("pengajuan surat sudah diperbarui")
return { success: true, message: 'pengajuan surat sudah diperbarui' }