feat(sosial-dashboard): tambah API ringkasan pendidikan & beasiswa + CRUD event budaya - bump 0.1.55

- API GET /api/pendidikan/ringkasan/stats: siswa per jenjang, jumlah lembaga & pengajar
- API GET /api/pendidikan/beasiswa/ringkasan/stats: jumlah penerima, dana, tahun ajaran
- Schema + migration: model EventBudaya (nama, tanggal, lokasi, deskripsi)
- API CRUD /api/desa/eventbudaya: create, find-many, findUnique, updt, del
- State admin: eventBudaya.ts (valtio proxy, create/findMany/edit/delete)
- Admin CMS: /admin/desa/event-budaya (list, create, edit)
- Navbar: tambah entry Desa_9 Event Budaya di semua role
- Seeder: 8 event budaya Bali untuk Desa Darmasaba

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-05 15:25:34 +08:00
parent 2497298703
commit ff25ead2df
24 changed files with 1006 additions and 1 deletions

View File

@@ -0,0 +1,46 @@
import prisma from "@/lib/prisma";
type PerJenjang = { nama: string; jumlahSiswa: number };
type StatsResult = {
perJenjang: PerJenjang[];
jumlahLembaga: number;
jumlahPengajar: number;
};
export default async function pendidikanRingkasanStats(): Promise<{
success: boolean;
data?: StatsResult;
message?: string;
}> {
try {
const [jenjangList, jumlahLembaga, jumlahPengajar] = await Promise.all([
prisma.jenjangPendidikan.findMany({
where: { isActive: true },
include: {
lembagas: {
where: { isActive: true },
include: {
_count: { select: { siswa: { where: { isActive: true } } } },
},
},
},
}),
prisma.lembaga.count({ where: { isActive: true } }),
prisma.pengajar.count({ where: { isActive: true } }),
]);
const perJenjang = jenjangList.map((j) => ({
nama: j.nama,
jumlahSiswa: j.lembagas.reduce((acc, l) => acc + l._count.siswa, 0),
}));
return {
success: true,
data: { perJenjang, jumlahLembaga, jumlahPengajar },
};
} catch (e) {
console.error("pendidikanRingkasanStats error:", e);
return { success: false, message: "Gagal menghitung statistik pendidikan" };
}
}