feat(kesehatan): tambah 4 field statistik pct ke RingkasanKesehatanDesa - bump ke 0.1.49

Tambah imunisasiLengkapPct, pemeriksaanRutinPct, giziBaikPct, targetStuntingPct
ke schema + migration + Elysia body validation (range 0-100) + updt handler.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-04 14:19:27 +08:00
parent 3cc30bf0ff
commit ba2b90be75
6 changed files with 61 additions and 8 deletions

View File

@@ -0,0 +1,31 @@
# Task: Tambah Statistik Persentase ke RingkasanKesehatanDesa
## Tujuan
Lengkapi schema + API `RingkasanKesehatanDesa` dengan 4 field persentase
agar dashboard Statistik Kesehatan (Imunisasi, Pemeriksaan Rutin, Gizi Baik,
Target Stunting) punya backend yang bisa di-fetch.
## Field Baru
Tambah ke model `RingkasanKesehatanDesa` (additive, tidak ubah field lama):
| Field | Tipe | Default | Keterangan |
|---|---|---|---|
| `imunisasiLengkapPct` | Int | 0 | Persentase imunisasi lengkap (0-100) |
| `pemeriksaanRutinPct` | Int | 0 | Persentase pemeriksaan rutin (0-100) |
| `giziBaikPct` | Int | 0 | Persentase gizi baik (0-100) |
| `targetStuntingPct` | Int | 0 | Persentase target stunting (0-100) |
## Step
- [ ] 1. Edit `prisma/schema.prisma` — tambah 4 field
- [ ] 2. Run migration: `bunx prisma migrate dev --name add-statistik-pct-ringkasan-kesehatan`
- [ ] 3. Update `kesehatan/ringkasan-kesehatan/findUnique.ts` — select field baru
- [ ] 4. Update `kesehatan/ringkasan-kesehatan/updt.ts` — tambah validasi Elysia + update logic
- [ ] 5. `bun run build` — pastikan 0 error
- [ ] 6. Bump version `package.json`
- [ ] 7. Commit + push branch baru
## Prinsip
- Additive only — field lama (`ibuHamilAkh`, `balitaTerdaftar`, `alertStunting`) tidak disentuh
- Validasi range 0-100 di Elysia `updt.ts`
- Tidak ada breaking change kontrak

View File

@@ -1,6 +1,6 @@
{
"name": "desa-darmasaba",
"version": "0.1.48",
"version": "0.1.49",
"private": true,
"scripts": {
"dev": "next dev",

View File

@@ -0,0 +1,6 @@
-- AlterTable
ALTER TABLE "RingkasanKesehatanDesa"
ADD COLUMN "imunisasiLengkapPct" INTEGER NOT NULL DEFAULT 0,
ADD COLUMN "pemeriksaanRutinPct" INTEGER NOT NULL DEFAULT 0,
ADD COLUMN "giziBaikPct" INTEGER NOT NULL DEFAULT 0,
ADD COLUMN "targetStuntingPct" INTEGER NOT NULL DEFAULT 0;

View File

@@ -2487,6 +2487,10 @@ model RingkasanKesehatanDesa {
ibuHamilAkh Int @default(0)
balitaTerdaftar Int @default(0)
alertStunting Int @default(0)
imunisasiLengkapPct Int @default(0)
pemeriksaanRutinPct Int @default(0)
giziBaikPct Int @default(0)
targetStuntingPct Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
isActive Boolean @default(true)

View File

@@ -9,6 +9,10 @@ const RingkasanKesehatan = new Elysia({ prefix: "/ringkasankesehatan", tags: ["K
ibuHamilAkh: t.Number(),
balitaTerdaftar: t.Number(),
alertStunting: t.Number(),
imunisasiLengkapPct: t.Number({ minimum: 0, maximum: 100 }),
pemeriksaanRutinPct: t.Number({ minimum: 0, maximum: 100 }),
giziBaikPct: t.Number({ minimum: 0, maximum: 100 }),
targetStuntingPct: t.Number({ minimum: 0, maximum: 100 }),
}),
});

View File

@@ -18,6 +18,10 @@ async function ringkasanKesehatanUpdate(context: Context) {
ibuHamilAkh: Number(body.ibuHamilAkh),
balitaTerdaftar: Number(body.balitaTerdaftar),
alertStunting: Number(body.alertStunting),
imunisasiLengkapPct: Number(body.imunisasiLengkapPct),
pemeriksaanRutinPct: Number(body.pemeriksaanRutinPct),
giziBaikPct: Number(body.giziBaikPct),
targetStuntingPct: Number(body.targetStuntingPct),
},
})
: await prisma.ringkasanKesehatanDesa.create({
@@ -25,6 +29,10 @@ async function ringkasanKesehatanUpdate(context: Context) {
ibuHamilAkh: Number(body.ibuHamilAkh),
balitaTerdaftar: Number(body.balitaTerdaftar),
alertStunting: Number(body.alertStunting),
imunisasiLengkapPct: Number(body.imunisasiLengkapPct),
pemeriksaanRutinPct: Number(body.pemeriksaanRutinPct),
giziBaikPct: Number(body.giziBaikPct),
targetStuntingPct: Number(body.targetStuntingPct),
},
});