39037-vm/index.php
Flatlogic Bot 463712fc0c SMS
2026-03-07 09:22:35 +00:00

176 lines
7.4 KiB
PHP

<?php
declare(strict_types=1);
@date_default_timezone_set('UTC');
require_once __DIR__ . '/includes/db_init.php';
$db = db();
ensure_schema($db);
seed_classes($db);
$roles = ['admin', 'guru', 'orang_tua', 'siswa', 'bendahara'];
$role = $_GET['role'] ?? 'admin';
if (!in_array($role, $roles, true)) {
$role = 'admin';
}
$roleLabels = [
'admin' => 'Admin Sekolah',
'guru' => 'Guru',
'orang_tua' => 'Orang Tua',
'siswa' => 'Siswa',
'bendahara' => 'Bendahara',
];
$navItems = [
'admin' => ['Dashboard', 'Siswa', 'Kelas', 'Absensi', 'Ujian', 'Keuangan', 'Laporan'],
'guru' => ['Dashboard', 'Jadwal', 'Kelas', 'Absensi', 'Tugas', 'Nilai'],
'orang_tua' => ['Dashboard', 'Perkembangan', 'Tagihan', 'Pengumuman'],
'siswa' => ['Dashboard', 'Jadwal', 'Tugas', 'Ujian', 'Nilai'],
'bendahara' => ['Dashboard', 'Tagihan', 'Pembayaran', 'Rekonsiliasi'],
];
$studentCount = (int)$db->query("SELECT COUNT(*) FROM students")->fetchColumn();
$classCount = (int)$db->query("SELECT COUNT(*) FROM classes")->fetchColumn();
$latestStudent = $db->query("SELECT full_name, created_at FROM students ORDER BY created_at DESC LIMIT 1")->fetch();
$projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? '';
$projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
$projectName = $_SERVER['PROJECT_NAME'] ?? 'School Management System';
?>
<!doctype html>
<html lang="id">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title><?= htmlspecialchars($projectName) ?> — Dashboard</title>
<?php if ($projectDescription): ?>
<meta name="description" content="<?= htmlspecialchars($projectDescription) ?>" />
<meta property="og:description" content="<?= htmlspecialchars($projectDescription) ?>" />
<meta property="twitter:description" content="<?= htmlspecialchars($projectDescription) ?>" />
<?php endif; ?>
<?php if ($projectImageUrl): ?>
<meta property="og:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
<meta property="twitter:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
<?php endif; ?>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="assets/css/custom.css?v=<?= time(); ?>">
</head>
<body>
<div class="app-shell">
<nav class="navbar navbar-expand-lg">
<div class="container-fluid px-4">
<a class="navbar-brand" href="/">EduCore CMS</a>
<div class="d-flex align-items-center gap-3 ms-auto">
<span class="badge badge-role">Role: <?= htmlspecialchars($roleLabels[$role]) ?></span>
<select id="roleSelect" class="form-select form-select-sm">
<?php foreach ($roles as $r): ?>
<option value="<?= htmlspecialchars($r) ?>" <?= $r === $role ? 'selected' : '' ?>><?= htmlspecialchars($roleLabels[$r]) ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
</nav>
<main class="container-fluid px-4 py-4">
<div class="hero mb-4">
<div class="d-flex flex-column flex-lg-row align-items-start align-items-lg-center justify-content-between gap-3">
<div>
<h1 class="h4 mb-2">Dashboard Operasional Sekolah</h1>
<p class="text-muted mb-0">Pantau data siswa, kelas, dan modul harian dari satu panel. Gunakan menu sesuai hak akses role.</p>
</div>
<div class="d-flex gap-2">
<a class="btn btn-primary" href="students.php?role=<?= urlencode($role) ?>">Kelola Siswa</a>
<a class="btn btn-outline-secondary" href="#api">Dokumentasi API</a>
</div>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-4">
<div class="card-soft p-3 h-100">
<div class="section-title">Ringkasan Data</div>
<div class="d-flex justify-content-between">
<div>
<div class="text-muted">Total Siswa</div>
<div class="h5 mb-2"><?= $studentCount ?></div>
</div>
<div>
<div class="text-muted">Total Kelas</div>
<div class="h5 mb-2"><?= $classCount ?></div>
</div>
</div>
<div class="text-muted small">
Terakhir ditambah: <?= $latestStudent ? htmlspecialchars($latestStudent['full_name']) . ' (' . htmlspecialchars($latestStudent['created_at']) . ')' : 'Belum ada data' ?>
</div>
</div>
</div>
<div class="col-md-8">
<div class="card-soft p-3 h-100">
<div class="section-title">Menu Cepat (<?= htmlspecialchars($roleLabels[$role]) ?>)</div>
<div class="d-flex flex-wrap gap-2">
<?php foreach ($navItems[$role] as $item): ?>
<span class="badge text-bg-light border"><?= htmlspecialchars($item) ?></span>
<?php endforeach; ?>
</div>
<p class="text-muted small mt-3 mb-0">Menu ditampilkan sesuai RBAC. Modul yang belum tersedia akan segera ditambahkan.</p>
</div>
</div>
</div>
<div class="row g-3">
<div class="col-lg-4">
<div class="module-card card h-100">
<div class="card-body">
<div class="module-title">Master Data Siswa</div>
<div class="module-meta mb-3">Registrasi, kelas, wali, status</div>
<p class="text-muted small">Input data siswa baru, lihat daftar, dan detail profil.</p>
<a class="btn btn-sm btn-primary" href="students.php?role=<?= urlencode($role) ?>">Buka Modul</a>
</div>
</div>
</div>
<div class="col-lg-4">
<div class="module-card card h-100">
<div class="card-body">
<div class="module-title">Absensi Harian</div>
<div class="module-meta mb-3">QR/manual + rekap</div>
<p class="text-muted small mb-3">Tandai hadir/sakit/izin dan lihat ringkasan kelas.</p>
<a class="btn btn-sm btn-primary" href="attendance.php?role=<?= urlencode($role) ?>">Buka Modul</a>
<a class="btn btn-sm btn-outline-primary" href="attendance_recap.php?role=<?= urlencode($role) ?>">Lihat Rekap</a>
</div>
</div>
</div>
<div class="col-lg-4">
<div class="module-card card h-100">
<div class="card-body">
<div class="module-title">Keuangan & Tagihan</div>
<div class="module-meta mb-3">Pembayaran + verifikasi</div>
<p class="text-muted small mb-3">Kelola tagihan SPP dan konfirmasi pembayaran.</p>
<a class="btn btn-sm btn-primary" href="attendance.php?role=<?= urlencode($role) ?>">Buka Modul</a>
</div>
</div>
</div>
</div>
<div id="api" class="card-soft p-3 mt-4">
<div class="section-title">Endpoint API Mobile (Preview)</div>
<div class="small text-muted">Gunakan endpoint berikut untuk aplikasi Android/iOS hybrid:</div>
<ul class="mb-0">
<li><code>/api/students.php</code> — daftar siswa (GET)</li>
</ul>
</div>
</main>
<footer class="footer text-center">
© <?= date('Y') ?> EduCore CMS • Role aktif: <?= htmlspecialchars($roleLabels[$role]) ?>
</footer>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="assets/js/main.js?v=<?= time(); ?>"></script>
</body>
</html>