- 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>
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
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" };
|
|
}
|
|
}
|