39065-vm/index.php
2026-03-09 14:12:06 +00:00

173 lines
6.0 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/layout.php';
$pdo = db();
$stats = [
'employees' => (int)$pdo->query("SELECT COUNT(*) FROM employees")->fetchColumn(),
'departments' => (int)$pdo->query("SELECT COUNT(*) FROM departments")->fetchColumn(),
'positions' => (int)$pdo->query("SELECT COUNT(*) FROM positions")->fetchColumn(),
];
$deptSummary = $pdo->query("
SELECT d.name, d.code, COUNT(e.id) AS total
FROM departments d
LEFT JOIN employees e ON e.dept_id = d.id
GROUP BY d.id
ORDER BY total DESC, d.name ASC
LIMIT 6
")->fetchAll();
$posSummary = $pdo->query("
SELECT p.name, p.level, COUNT(e.id) AS total
FROM positions p
LEFT JOIN employees e ON e.position_id = p.id
GROUP BY p.id
ORDER BY total DESC, p.name ASC
LIMIT 6
")->fetchAll();
$recentEmployees = $pdo->query("
SELECT e.id, e.full_name, e.employee_code, e.status, d.name AS dept_name, p.name AS position_name
FROM employees e
LEFT JOIN departments d ON d.id = e.dept_id
LEFT JOIN positions p ON p.id = e.position_id
ORDER BY e.created_at DESC
LIMIT 5
")->fetchAll();
render_header('Dashboard HRIS', 'dashboard');
?>
<div class="mb-4">
<h1 class="display-6 fw-semibold">Dashboard HRIS</h1>
<p class="small-muted">Ringkasan data pegawai, departemen, dan jabatan terbaru untuk tim HR dan manajer.</p>
</div>
<div class="row g-3 mb-4">
<div class="col-md-4">
<div class="stat-card">
<div class="stat-label">Total Pegawai</div>
<div class="stat-value"><?= e((string)$stats['employees']) ?></div>
<div class="small-muted">Termasuk status aktif & probation</div>
</div>
</div>
<div class="col-md-4">
<div class="stat-card">
<div class="stat-label">Departemen</div>
<div class="stat-value"><?= e((string)$stats['departments']) ?></div>
<div class="small-muted">Struktur organisasi aktif</div>
</div>
</div>
<div class="col-md-4">
<div class="stat-card">
<div class="stat-label">Jabatan</div>
<div class="stat-value"><?= e((string)$stats['positions']) ?></div>
<div class="small-muted">Role yang tersedia</div>
</div>
</div>
</div>
<div class="row g-4">
<div class="col-lg-7">
<div class="card mb-4">
<div class="card-header d-flex align-items-center justify-content-between">
<span class="section-title">Distribusi Departemen</span>
<a href="departments.php" class="btn btn-outline-primary btn-sm">Kelola Departemen</a>
</div>
<div class="card-body">
<?php if (count($deptSummary) === 0): ?>
<div class="empty-state">Belum ada departemen. Tambahkan data departemen pertama Anda.</div>
<?php else: ?>
<div class="table-responsive">
<table class="table align-middle">
<thead>
<tr>
<th>Departemen</th>
<th>Kode</th>
<th>Total Pegawai</th>
</tr>
</thead>
<tbody>
<?php foreach ($deptSummary as $dept): ?>
<tr>
<td><?= e($dept['name']) ?></td>
<td><span class="badge-soft"><?= e($dept['code']) ?></span></td>
<td><?= e((string)$dept['total']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
</div>
</div>
<div class="card">
<div class="card-header d-flex align-items-center justify-content-between">
<span class="section-title">Distribusi Jabatan</span>
<a href="positions.php" class="btn btn-outline-primary btn-sm">Kelola Jabatan</a>
</div>
<div class="card-body">
<?php if (count($posSummary) === 0): ?>
<div class="empty-state">Belum ada jabatan. Tambahkan jabatan untuk tim Anda.</div>
<?php else: ?>
<div class="table-responsive">
<table class="table align-middle">
<thead>
<tr>
<th>Jabatan</th>
<th>Level</th>
<th>Total Pegawai</th>
</tr>
</thead>
<tbody>
<?php foreach ($posSummary as $pos): ?>
<tr>
<td><?= e($pos['name']) ?></td>
<td><?= e($pos['level'] ?? '-') ?></td>
<td><?= e((string)$pos['total']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
</div>
</div>
</div>
<div class="col-lg-5">
<div class="card">
<div class="card-header d-flex align-items-center justify-content-between">
<span class="section-title">Pegawai Terbaru</span>
<a href="employees.php" class="btn btn-outline-primary btn-sm">Lihat Semua</a>
</div>
<div class="card-body">
<?php if (count($recentEmployees) === 0): ?>
<div class="empty-state">Belum ada pegawai. Mulai tambah data pegawai baru.</div>
<?php else: ?>
<div class="d-grid gap-3">
<?php foreach ($recentEmployees as $emp): ?>
<div class="d-flex align-items-start justify-content-between">
<div>
<div class="fw-semibold"><?= e($emp['full_name']) ?></div>
<div class="small-muted"><?= e($emp['employee_code']) ?> · <?= e($emp['dept_name'] ?? 'Tanpa Departemen') ?></div>
<div class="small text-muted"><?= e($emp['position_name'] ?? 'Tanpa Jabatan') ?></div>
</div>
<div class="text-end">
<span class="badge bg-light text-dark border"><?= e($emp['status']) ?></span>
<div><a class="small text-decoration-none" href="employee_view.php?id=<?= e((string)$emp['id']) ?>">Detail</a></div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php render_footer(); ?>