From 26241fd36c00d7d2189d37c5db0656437d63b21e Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Mon, 3 Nov 2025 17:40:38 +0800 Subject: [PATCH] upd: api pelayanan surat Deskripsi: - create - update status - list - detail No Issues " git statys --- prisma/schema.prisma | 1 + src/server/lib/no-pengajuan-surat.ts | 23 +++ src/server/routes/pelayanan_surat_route.ts | 212 ++++++++++++++++++++- 3 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 src/server/lib/no-pengajuan-surat.ts diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8429423..5034611 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -142,6 +142,7 @@ model HistoryPelayanan { User User? @relation(fields: [idUser], references: [id]) idUser String? deskripsi String? + keteranganAlasan String? status StatusPengaduan @default(antrian) isActive Boolean @default(true) createdAt DateTime @default(now()) diff --git a/src/server/lib/no-pengajuan-surat.ts b/src/server/lib/no-pengajuan-surat.ts new file mode 100644 index 0000000..70f1e82 --- /dev/null +++ b/src/server/lib/no-pengajuan-surat.ts @@ -0,0 +1,23 @@ +import { prisma } from "./prisma" + +export const generateNoPengajuanSurat = async () => { + const date = new Date() + const year = String(date.getFullYear()).slice(-2) // ambil 2 digit terakhir + const month = String(date.getMonth() + 1).padStart(2, "0") + const day = String(date.getDate()).padStart(2, "0") + + const prefix = `PS-${day}${month}${year}` + + const count = await prisma.pelayananAjuan.count({ + where: { + noPengajuan: { + contains: prefix + } + } + }) + + // pastikan nomor urut selalu 3 digit + const number = String(count + 1).padStart(3, "0") + + return `${prefix}-${number}` +} diff --git a/src/server/routes/pelayanan_surat_route.ts b/src/server/routes/pelayanan_surat_route.ts index c6680f5..c7b05fd 100644 --- a/src/server/routes/pelayanan_surat_route.ts +++ b/src/server/routes/pelayanan_surat_route.ts @@ -1,5 +1,7 @@ -import Elysia, { t } from "elysia" +import Elysia, { StatusMap, t } from "elysia" +import { generateNoPengajuanSurat } from "../lib/no-pengajuan-surat" import { prisma } from "../lib/prisma" +import type { StatusPengaduan } from "generated/prisma" const PelayananRoute = new Elysia({ prefix: "pelayanan", @@ -103,4 +105,212 @@ const PelayananRoute = new Elysia({ } }) + + // --- PELAYANAN SURAT --- + .get("/", async () => { + const data = await prisma.pelayananAjuan.findMany({ + where: { + isActive: true + } + }) + return data + }, { + detail: { + summary: "List Ajuan Pelayanan Surat", + description: `tool untuk mendapatkan list ajuan pelayanan surat`, + tags: ["mcp"] + } + }) + .get("/detail", async ({ query }) => { + const { id } = query + const data = await prisma.pelayananAjuan.findUnique({ + where: { + id, + } + }) + return data + }, { + query: t.Object({ + id: t.String({ minLength: 1, error: "id harus diisi" }), + }), + detail: { + summary: "Detail Ajuan Pelayanan Surat", + description: `tool untuk mendapatkan detail ajuan pelayanan surat`, + tags: ["mcp"] + } + }) + .post("/create", async ({ body }) => { + const { idCategory, idWarga, phone, dataText, syaratDokumen } = body + const noPengajuan = await generateNoPengajuanSurat() + let idCategoryFix = idCategory + let idWargaFix = idWarga + const category = await prisma.categoryPelayanan.findUnique({ + where: { + id: idCategory, + } + }) + + if (!category) { + const cariCategory = await prisma.categoryPelayanan.findFirst({ + where: { + name: idCategory, + } + }) + + if (!cariCategory) { + throw new Error("kategori pelayanan surat tidak ditemukan") + } else { + idCategoryFix = cariCategory.id + } + + } + + const warga = await prisma.warga.findUnique({ + where: { + id: idWarga, + } + }) + + if (!warga) { + const cariWarga = await prisma.warga.findFirst({ + where: { + phone, + } + }) + + if (!cariWarga) { + const wargaCreate = await prisma.warga.create({ + data: { + name: idWarga, + phone, + }, + select: { + id: true + } + }) + idWargaFix = wargaCreate.id + } else { + idWargaFix = cariWarga.id + } + + } + + const pengaduan = await prisma.pelayananAjuan.create({ + data: { + noPengajuan, + idCategory: idCategoryFix, + idWarga: idWargaFix, + }, + select: { + id: true, + } + }) + + if (!pengaduan.id) { + throw new Error("gagal membuat pengaduan") + } + + let dataInsertSyaratDokumen = [] + let dataInsertDataText = [] + + for (const item of syaratDokumen) { + dataInsertSyaratDokumen.push({ + idPengajuanLayanan: pengaduan.id, + idCategory: idCategoryFix, + jenis: item.jenis, + value: item.value, + }) + } + + for (const item of dataText) { + dataInsertDataText.push({ + idPengajuanLayanan: pengaduan.id, + idCategory: idCategoryFix, + jenis: item.jenis, + value: item.value, + }) + } + + await prisma.syaratDokumenPelayanan.createMany({ + data: dataInsertSyaratDokumen, + }) + + await prisma.dataTextPelayanan.createMany({ + data: dataInsertDataText, + }) + + + await prisma.historyPelayanan.create({ + data: { + idPengajuanLayanan: pengaduan.id, + deskripsi: "Pengajuan surat dibuat", + } + }) + + return ` + ${JSON.stringify(body)} + + pengaduan sudah dibuat` + }, { + body: t.Object({ + idCategory: t.String({ minLength: 1, error: "idCategory harus diisi" }), + idWarga: t.String({ minLength: 1, error: "idWarga harus diisi" }), + phone: t.String({ minLength: 1, error: "phone harus diisi" }), + dataText: t.Array(t.Object({ + jenis: t.String({ minLength: 1, error: "jenis harus diisi" }), + value: t.String({ minLength: 1, error: "value harus diisi" }), + })), + syaratDokumen: t.Array(t.Object({ + jenis: t.String({ minLength: 1, error: "jenis harus diisi" }), + value: t.String({ minLength: 1, error: "value harus diisi" }), + })), + }), + detail: { + summary: "Create Pengajuan Pelayanan Surat", + description: `tool untuk membuat pengajuan pelayanan surat`, + tags: ["mcp"] + } + }) + .post("/update-status", async ({ body }) => { + const { id, status, keterangan, idUser } = body + + const pengajuan = await prisma.pelayananAjuan.update({ + where: { + id, + }, + data: { + status: status as StatusPengaduan, + } + }) + + if (!pengajuan) { + throw new Error("gagal membuat pengajuan") + } + + await prisma.historyPelayanan.create({ + data: { + idPengajuanLayanan: pengajuan.id, + deskripsi: "Pengajuan surat diperbarui", + keteranganAlasan: keterangan, + } + }) + + return ` + ${JSON.stringify(body)} + + pengajuan surat sudah diperbarui` + }, { + body: t.Object({ + id: t.String({ minLength: 1, error: "id harus diisi" }), + status: t.String({ minLength: 1, error: "status harus diisi" }), + keterangan: t.String({ minLength: 1, error: "keterangan harus diisi" }), + idUser: t.String({ minLength: 1, error: "idUser harus diisi" }), + }), + detail: { + summary: "Update status pengajuan pelayanan surat", + description: `tool untuk update status pengajuan pelayanan surat`, + tags: ["mcp"] + } + }) + export default PelayananRoute