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:
31
MIND/PLAN/task-statistik-kesehatan-ringkasan.md
Normal file
31
MIND/PLAN/task-statistik-kesehatan-ringkasan.md
Normal 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
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "desa-darmasaba",
|
"name": "desa-darmasaba",
|
||||||
"version": "0.1.48",
|
"version": "0.1.49",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -2487,6 +2487,10 @@ model RingkasanKesehatanDesa {
|
|||||||
ibuHamilAkh Int @default(0)
|
ibuHamilAkh Int @default(0)
|
||||||
balitaTerdaftar Int @default(0)
|
balitaTerdaftar Int @default(0)
|
||||||
alertStunting 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())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ const RingkasanKesehatan = new Elysia({ prefix: "/ringkasankesehatan", tags: ["K
|
|||||||
ibuHamilAkh: t.Number(),
|
ibuHamilAkh: t.Number(),
|
||||||
balitaTerdaftar: t.Number(),
|
balitaTerdaftar: t.Number(),
|
||||||
alertStunting: 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 }),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ async function ringkasanKesehatanUpdate(context: Context) {
|
|||||||
ibuHamilAkh: Number(body.ibuHamilAkh),
|
ibuHamilAkh: Number(body.ibuHamilAkh),
|
||||||
balitaTerdaftar: Number(body.balitaTerdaftar),
|
balitaTerdaftar: Number(body.balitaTerdaftar),
|
||||||
alertStunting: Number(body.alertStunting),
|
alertStunting: Number(body.alertStunting),
|
||||||
|
imunisasiLengkapPct: Number(body.imunisasiLengkapPct),
|
||||||
|
pemeriksaanRutinPct: Number(body.pemeriksaanRutinPct),
|
||||||
|
giziBaikPct: Number(body.giziBaikPct),
|
||||||
|
targetStuntingPct: Number(body.targetStuntingPct),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
: await prisma.ringkasanKesehatanDesa.create({
|
: await prisma.ringkasanKesehatanDesa.create({
|
||||||
@@ -25,6 +29,10 @@ async function ringkasanKesehatanUpdate(context: Context) {
|
|||||||
ibuHamilAkh: Number(body.ibuHamilAkh),
|
ibuHamilAkh: Number(body.ibuHamilAkh),
|
||||||
balitaTerdaftar: Number(body.balitaTerdaftar),
|
balitaTerdaftar: Number(body.balitaTerdaftar),
|
||||||
alertStunting: Number(body.alertStunting),
|
alertStunting: Number(body.alertStunting),
|
||||||
|
imunisasiLengkapPct: Number(body.imunisasiLengkapPct),
|
||||||
|
pemeriksaanRutinPct: Number(body.pemeriksaanRutinPct),
|
||||||
|
giziBaikPct: Number(body.giziBaikPct),
|
||||||
|
targetStuntingPct: Number(body.targetStuntingPct),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user