Merge pull request 'upd: api pelayanan surat' (#7) from amalia/03-nov-25 into main

Reviewed-on: http://wibugit.wibudev.com/wibu/jenna-mcp/pulls/7
This commit is contained in:
2025-11-03 17:42:23 +08:00
3 changed files with 235 additions and 1 deletions

View File

@@ -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())

View File

@@ -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}`
}

View File

@@ -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