Files
D1041231091-WebGIS-All/05/ambil_user.php
T

77 lines
2.7 KiB
PHP

<?php
/**
* ambil_user.php
* Mengambil daftar akun untuk tabel kelola akun di dashboard.
* Filter: role, status_akun, keyword.
*/
require_once __DIR__ . '/auth.php';
require_login(true);
require_role(['super_admin', 'admin_rumah_ibadah'], true);
$actor = current_user();
$actorRole = $actor['role'];
$filterRole = getv('role', 'semua');
$status = getv('status_akun', 'semua');
$keyword = clean_text(getv('keyword', ''), 100);
$where = [];
$types = '';
$params = [];
if ($actorRole === 'super_admin') {
// Super admin mengelola akun admin rumah ibadah dan penerima saja.
$where[] = "u.role IN ('admin_rumah_ibadah','penerima')";
if (in_array($filterRole, ['admin_rumah_ibadah', 'penerima'], true)) {
$where[] = "u.role=?";
$types .= 's';
$params[] = $filterRole;
}
} else {
// Admin rumah ibadah hanya mengelola akun penerima.
$where[] = "u.role='penerima'";
// Jika admin punya lebih dari satu rumah ibadah, semua ID rumah ibadah miliknya harus ikut terbaca.
// Akun penerima tanpa titik tetap ditampilkan agar bisa dipakai saat tambah penerima.
$ids = get_admin_rumah_ibadah_ids((int)$actor['id'], true);
if (!empty($ids)) {
$in = build_in_condition('pb.rumah_ibadah_id', $ids, $types, $params);
$where[] = "(pb.id IS NULL OR $in)";
} else {
$where[] = "pb.id IS NULL";
}
}
if (in_array($status, ['aktif', 'nonaktif'], true)) {
$where[] = "u.status_akun=?";
$types .= 's';
$params[] = $status;
}
if ($keyword !== '') {
$where[] = "(u.nama LIKE ? OR u.username LIKE ?)";
$kw = '%' . $keyword . '%';
$types .= 'ss';
$params[] = $kw;
$params[] = $kw;
}
$sql = "SELECT
u.id, u.nama, u.username, u.role, u.status_akun, u.created_at, u.updated_at,
COUNT(DISTINCT pb.id) AS jumlah_titik_penerima,
COUNT(DISTINCT ri.id) AS jumlah_rumah_ibadah,
GROUP_CONCAT(DISTINCT ri.nama_rumah_ibadah SEPARATOR ', ') AS rumah_ibadah_dikelola,
GROUP_CONCAT(DISTINCT rpb.nama_rumah_ibadah SEPARATOR ', ') AS rumah_ibadah_penerima
FROM users u
LEFT JOIN penerima_bantuan pb ON pb.user_id=u.id AND COALESCE(pb.status_hapus,'normal')<>'disetujui'
LEFT JOIN rumah_ibadah rpb ON rpb.id=pb.rumah_ibadah_id
LEFT JOIN rumah_ibadah ri ON ri.user_id=u.id AND COALESCE(ri.status_hapus,'normal')<>'disetujui'
WHERE " . implode(' AND ', $where) . "
GROUP BY u.id
ORDER BY u.updated_at DESC, u.id DESC";
$stmt = $koneksi->prepare($sql);
if (!$stmt) json_response('err', 'Query daftar akun gagal: ' . $koneksi->error, [], 500);
if ($types) stmt_bind($stmt, $types, $params);
$rows = fetch_all_stmt($stmt);
json_response('ok', 'Daftar akun berhasil diambil.', $rows);
?>