diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4f3f5712..068ff545 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1401,6 +1401,15 @@ enum StatusLaporan { Gagal } +model Pelapor { + id String @id @default(cuid()) + nama String + alamat String + nomorTelepon String + image FileStorage @relation(fields: [imageId], references: [id]) + imageId String +} + // ========================================= CCTV KEAMANAN ========================================= // enum StatusCctv { Online @@ -1422,15 +1431,6 @@ model CctvKeamanan { isActive Boolean @default(true) } -model Pelapor { - id String @id @default(cuid()) - nama String - alamat String - nomorTelepon String - image FileStorage @relation(fields: [imageId], references: [id]) - imageId String -} - // ========================================= TIPS KEAMANAN ========================================= // model MenuTipsKeamanan { id String @id @default(cuid()) diff --git a/src/app/admin/(dashboard)/_state/pendidikan/ringkasan-pendidikan.ts b/src/app/admin/(dashboard)/_state/pendidikan/ringkasan-pendidikan.ts index f530b3cd..f782338e 100644 --- a/src/app/admin/(dashboard)/_state/pendidikan/ringkasan-pendidikan.ts +++ b/src/app/admin/(dashboard)/_state/pendidikan/ringkasan-pendidikan.ts @@ -1,6 +1,6 @@ import { proxy } from "valtio"; -type PerJenjang = { nama: string; jumlahSiswa: number }; +type PerJenjang = { nama: string; jumlahSiswa: number; jumlahPengajar: number }; type StatsPendidikan = { perJenjang: PerJenjang[]; diff --git a/src/app/api/[[...slugs]]/_lib/pendidikan/ringkasan/stats.ts b/src/app/api/[[...slugs]]/_lib/pendidikan/ringkasan/stats.ts index 98ac2f25..a66deef2 100644 --- a/src/app/api/[[...slugs]]/_lib/pendidikan/ringkasan/stats.ts +++ b/src/app/api/[[...slugs]]/_lib/pendidikan/ringkasan/stats.ts @@ -1,6 +1,6 @@ import prisma from "@/lib/prisma"; -type PerJenjang = { nama: string; jumlahSiswa: number }; +type PerJenjang = { nama: string; jumlahSiswa: number, jumlahPengajar: number }; type StatsResult = { perJenjang: PerJenjang[]; @@ -21,7 +21,7 @@ export default async function pendidikanRingkasanStats(): Promise<{ lembagas: { where: { isActive: true }, include: { - _count: { select: { siswa: { where: { isActive: true } } } }, + _count: { select: { siswa: { where: { isActive: true } }, pengajar: { where: { isActive: true } } } }, }, }, }, @@ -33,6 +33,7 @@ export default async function pendidikanRingkasanStats(): Promise<{ const perJenjang = jenjangList.map((j) => ({ nama: j.nama, jumlahSiswa: j.lembagas.reduce((acc, l) => acc + l._count.siswa, 0), + jumlahPengajar: j.lembagas.reduce((acc, l) => acc + l._count.pengajar, 0), })); return { diff --git a/tasks-sample.csv b/tasks-sample.csv index aeeed7ff..b9b546c6 100644 --- a/tasks-sample.csv +++ b/tasks-sample.csv @@ -3,4 +3,8 @@ "[Beasiswa] Tambah useProxy + useShallowEffect fetch stats beasiswa","Tambah useProxy(ringkasanBeasiswaState.findStats) dan useShallowEffect untuk memanggil statsBeasiswa.load() saat komponen mount di halaman publik beasiswa-desa/page.tsx.","TASK","MEDIUM","","","0.5","nicoarya20@gmail.com","" "[Beasiswa] Ubah dataBeasiswa dari static ke dynamic (penerima & dana tersalurkan)","Pindahkan dataBeasiswa dari static array di luar komponen menjadi computed array di dalam Page(). Field 'Penerima Beasiswa' diambil dari statsBeasiswa.data.jumlahPenerima dan 'Dana Tersalurkan' dari statsBeasiswa.data.danaTersalurkan. Fallback '-' bila data belum tersedia.","TASK","MEDIUM","","","0.5","nicoarya20@gmail.com","" "[Beasiswa] Buat fungsi formatDana untuk konversi angka ke format pendek Indonesia","Buat helper function formatDana(value: string | number) di halaman beasiswa-desa/page.tsx. Konversi: >= 1T → XT, >= 1M (miliar) → XM, >= 1Jt → XJt, >= 1Rb → XRb. Desimal 1 angka hanya muncul jika ada sisa (misal 1.5Jt), bilangan bulat tanpa desimal (misal 2Jt).","TASK","MEDIUM","","","0.5","nicoarya20@gmail.com","" -"[Beasiswa] Terapkan formatDana ke field Dana Tersalurkan di dataBeasiswa","Terapkan formatDana(statsBeasiswa.data.danaTersalurkan) pada entry Dana Tersalurkan di array dataBeasiswa agar nilai dari API otomatis diformat ke representasi singkat (Rb/Jt/M/T).","TASK","MEDIUM","","","0.5","nicoarya20@gmail.com","" \ No newline at end of file +"[Beasiswa] Terapkan formatDana ke field Dana Tersalurkan di dataBeasiswa","Terapkan formatDana(statsBeasiswa.data.danaTersalurkan) pada entry Dana Tersalurkan di array dataBeasiswa agar nilai dari API otomatis diformat ke representasi singkat (Rb/Jt/M/T).","TASK","MEDIUM","","","0.5","nicoarya20@gmail.com","" +"[Pendidikan] Fix sintaks _count.select di stats.ts — gabungkan siswa & pengajar","Perbaiki sintaks object _count.select di src/app/api/[[...slugs]]/_lib/pendidikan/ringkasan/stats.ts. Field pengajar ditaruh di luar object select (menjadi dua object terpisah), diperbaiki menjadi satu object select dengan dua key: siswa dan pengajar, masing-masing dengan filter where isActive: true.","BUG","HIGH","","","0.5","nicoarya20@gmail.com","" +"[Pendidikan] Tambah jumlahPengajar per jenjang ke query _count dan map perJenjang","Tambah pengajar ke _count.select di query jenjangPendidikan agar jumlah pengajar per jenjang bisa dihitung. Tambah field jumlahPengajar ke hasil map perJenjang menggunakan reduce _count.pengajar dari setiap lembaga.","TASK","HIGH","","","0.5","nicoarya20@gmail.com","" +"[Pendidikan] Update type PerJenjang di stats.ts tambah jumlahPengajar","Tambah field jumlahPengajar: number ke type PerJenjang di src/app/api/[[...slugs]]/_lib/pendidikan/ringkasan/stats.ts agar sesuai dengan data yang dikembalikan oleh map perJenjang.","TASK","MEDIUM","","","0.5","nicoarya20@gmail.com","" +"[Pendidikan] Update type PerJenjang di ringkasan-pendidikan.ts tambah jumlahPengajar","Tambah field jumlahPengajar: number ke type PerJenjang di src/app/admin/(dashboard)/_state/pendidikan/ringkasan-pendidikan.ts agar cocok dengan shape response API stats pendidikan.","TASK","MEDIUM","","","0.5","nicoarya20@gmail.com","" \ No newline at end of file