diff --git a/MIND/PLAN/task-statistik-kesehatan-ringkasan.md b/MIND/PLAN/task-statistik-kesehatan-ringkasan.md new file mode 100644 index 00000000..48297bbb --- /dev/null +++ b/MIND/PLAN/task-statistik-kesehatan-ringkasan.md @@ -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 diff --git a/package.json b/package.json index 1edcb488..30b9c2f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "desa-darmasaba", - "version": "0.1.48", + "version": "0.1.49", "private": true, "scripts": { "dev": "next dev", diff --git a/prisma/migrations/20260504000000_add_statistik_pct_ringkasan_kesehatan/migration.sql b/prisma/migrations/20260504000000_add_statistik_pct_ringkasan_kesehatan/migration.sql new file mode 100644 index 00000000..6463a9aa --- /dev/null +++ b/prisma/migrations/20260504000000_add_statistik_pct_ringkasan_kesehatan/migration.sql @@ -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; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index b863283d..eeb4a9b0 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -2483,12 +2483,16 @@ model BeasiswaConfig { // ========================================= RINGKASAN KESEHATAN DESA ========================================= // model RingkasanKesehatanDesa { - id String @id @default(cuid()) - ibuHamilAkh Int @default(0) - balitaTerdaftar Int @default(0) - alertStunting Int @default(0) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - isActive Boolean @default(true) + id String @id @default(cuid()) + 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) } diff --git a/src/app/api/[[...slugs]]/_lib/kesehatan/ringkasan-kesehatan/index.ts b/src/app/api/[[...slugs]]/_lib/kesehatan/ringkasan-kesehatan/index.ts index 8de4ec93..733e7329 100644 --- a/src/app/api/[[...slugs]]/_lib/kesehatan/ringkasan-kesehatan/index.ts +++ b/src/app/api/[[...slugs]]/_lib/kesehatan/ringkasan-kesehatan/index.ts @@ -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 }), }), }); diff --git a/src/app/api/[[...slugs]]/_lib/kesehatan/ringkasan-kesehatan/updt.ts b/src/app/api/[[...slugs]]/_lib/kesehatan/ringkasan-kesehatan/updt.ts index 412f5302..df51dcfc 100644 --- a/src/app/api/[[...slugs]]/_lib/kesehatan/ringkasan-kesehatan/updt.ts +++ b/src/app/api/[[...slugs]]/_lib/kesehatan/ringkasan-kesehatan/updt.ts @@ -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), }, });