import Elysia, { StatusMap, t } from "elysia" import { generateNoPengajuanSurat } from "../lib/no-pengajuan-surat" import { prisma } from "../lib/prisma" import type { StatusPengaduan } from "generated/prisma" import { normalizePhoneNumber } from "../lib/normalizePhone" const PelayananRoute = new Elysia({ prefix: "pelayanan", tags: ["pelayanan"], }) // --- KATEGORI PELAYANAN --- .get("/category", async () => { const data = await prisma.categoryPelayanan.findMany({ where: { isActive: true }, orderBy:{ name: "asc" } }) return data }, { detail: { summary: "List Kategori Pelayanan Surat", description: `tool untuk mendapatkan list kategori pelayanan surat beserta syaratnya untuk memenuhi syarat dokumen sesuai kategori yg dipilih saat melakukan pengajuan surat`, tags: ["mcp"] } }) .post("/category/create", async ({ body }) => { const { name, syaratDokumen, dataText } = body await prisma.categoryPelayanan.create({ data: { name, syaratDokumen, dataText, } }) return ` ${JSON.stringify(body)} kategori pelayanan surat sudah dibuat` }, { body: t.Object({ name: t.String({ minLength: 1, error: "name harus diisi" }), syaratDokumen: t.Array(t.String({ minLength: 1, error: "syaratDokumen harus diisi" })), dataText: t.Array(t.String({ minLength: 1, error: "dataText harus diisi" })), }), detail: { summary: "buat kategori pelayanan surat", description: `tool untuk membuat kategori pelayanan surat` } }) .post("/category/update", async ({ body }) => { const { id, name, syaratDokumen, dataText } = body await prisma.categoryPelayanan.update({ where: { id, }, data: { name, syaratDokumen, dataText, } }) return ` ${JSON.stringify(body)} kategori pelayanan surat sudah diperbarui` }, { body: t.Object({ id: t.String({ minLength: 1, error: "id harus diisi" }), name: t.String({ minLength: 1, error: "name harus diisi" }), syaratDokumen: t.Array(t.String({ minLength: 1, error: "syaratDokumen harus diisi" })), dataText: t.Array(t.String({ minLength: 1, error: "dataText harus diisi" })), }), detail: { summary: "update kategori pelayanan surat", description: `tool untuk update kategori pelayanan surat` } }) .post("/category/delete", async ({ body }) => { const { id } = body await prisma.categoryPelayanan.update({ where: { id, }, data: { isActive: false } }) return ` ${JSON.stringify(body)} kategori pelayanan surat sudah dihapus` }, { body: t.Object({ id: t.String({ minLength: 1, error: "id harus diisi" }), }), detail: { summary: "delete kategori pelayanan surat", description: `tool untuk delete kategori pelayanan surat` } }) // --- 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 nomorHP = normalizePhoneNumber({ phone }) const cariWarga = await prisma.warga.findFirst({ where: { phone: nomorHP, } }) if (!cariWarga) { const wargaCreate = await prisma.warga.create({ data: { name: idWarga, phone: nomorHP, }, 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 pengajuan surat") } 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 dengan syarat dokumen serta data text sesuai kategori pelayanan surat yang dipilih`, 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