123 lines
6.1 KiB
PHP
123 lines
6.1 KiB
PHP
<?php
|
|
// api/manajemen_akun.php
|
|
// Endpoint khusus admin untuk mendapatkan data manajemen akun rumah ibadah
|
|
require_once __DIR__ . '/config/database.php';
|
|
require_once __DIR__ . '/helpers/response.php';
|
|
// CORS dan RBAC sudah diproses secara global di response.php
|
|
|
|
// Hanya admin yang boleh mengakses
|
|
if ($_SESSION['role'] !== 'admin') {
|
|
sendError('Forbidden - Hanya admin yang dapat mengakses halaman ini', 403);
|
|
}
|
|
|
|
$db = getDB();
|
|
$method = getMethod();
|
|
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
|
|
|
|
switch ($method) {
|
|
|
|
// GET: Ambil semua rumah ibadah beserta statistik dan info akun
|
|
case 'GET':
|
|
if ($id > 0) {
|
|
// Detail satu rumah ibadah
|
|
$stmt = $db->prepare("
|
|
SELECT ri.id, ri.nama, ri.jenis, ri.alamat, ri.no_wa,
|
|
ri.latitude, ri.longitude, ri.radius_meter, ri.created_at,
|
|
u.id AS user_id, u.username, u.password_plain, u.created_at AS akun_dibuat,
|
|
(SELECT COUNT(*) FROM penduduk_miskin pm WHERE pm.rumah_ibadah_id = ri.id AND pm.status_proximity = 'dalam_radius') AS pm_dalam_radius,
|
|
(SELECT COUNT(*) FROM log_bantuan lb WHERE lb.rumah_ibadah_id = ri.id) AS total_penyaluran,
|
|
(SELECT COUNT(*) FROM log_bantuan lb WHERE lb.rumah_ibadah_id = ri.id AND lb.tipe_bantuan = 'Pemberdayaan') AS bantuan_pemberdayaan,
|
|
(SELECT COUNT(*) FROM log_bantuan lb WHERE lb.rumah_ibadah_id = ri.id AND lb.tipe_bantuan = 'Konsumtif') AS bantuan_konsumtif,
|
|
(SELECT IFNULL(SUM(lb.nilai_bantuan), 0) FROM log_bantuan lb WHERE lb.rumah_ibadah_id = ri.id) AS total_nilai_bantuan,
|
|
(SELECT COUNT(DISTINCT lb.penduduk_miskin_id) FROM log_bantuan lb WHERE lb.rumah_ibadah_id = ri.id) AS jumlah_penerima_unik,
|
|
(SELECT lb.tanggal_bantuan FROM log_bantuan lb WHERE lb.rumah_ibadah_id = ri.id ORDER BY lb.tanggal_bantuan DESC LIMIT 1) AS tanggal_bantuan_terakhir
|
|
FROM rumah_ibadah ri
|
|
LEFT JOIN users u ON u.rumah_ibadah_id = ri.id
|
|
WHERE ri.id = ?
|
|
");
|
|
$stmt->bind_param('i', $id);
|
|
$stmt->execute();
|
|
$row = $stmt->get_result()->fetch_assoc();
|
|
|
|
if (!$row) sendError('Data tidak ditemukan', 404);
|
|
|
|
// Cast types
|
|
$row['latitude'] = (float)$row['latitude'];
|
|
$row['longitude'] = (float)$row['longitude'];
|
|
$row['radius_meter'] = (int)$row['radius_meter'];
|
|
$row['pm_dalam_radius'] = (int)$row['pm_dalam_radius'];
|
|
$row['total_penyaluran'] = (int)$row['total_penyaluran'];
|
|
$row['bantuan_pemberdayaan'] = (int)$row['bantuan_pemberdayaan'];
|
|
$row['bantuan_konsumtif'] = (int)$row['bantuan_konsumtif'];
|
|
$row['total_nilai_bantuan'] = (float)$row['total_nilai_bantuan'];
|
|
$row['jumlah_penerima_unik'] = (int)$row['jumlah_penerima_unik'];
|
|
// password_plain: null if no account
|
|
if ($row['password_plain'] === null) $row['password_plain'] = null;
|
|
|
|
// Ambil 5 riwayat bantuan terbaru
|
|
$stmtLog = $db->prepare("
|
|
SELECT lb.tipe_bantuan, lb.sub_kategori, lb.tanggal_bantuan, lb.nilai_bantuan,
|
|
pm.nama AS nama_penerima
|
|
FROM log_bantuan lb
|
|
JOIN penduduk_miskin pm ON pm.id = lb.penduduk_miskin_id
|
|
WHERE lb.rumah_ibadah_id = ?
|
|
ORDER BY lb.tanggal_bantuan DESC, lb.id DESC
|
|
LIMIT 10
|
|
");
|
|
$stmtLog->bind_param('i', $id);
|
|
$stmtLog->execute();
|
|
$logs = [];
|
|
$resLog = $stmtLog->get_result();
|
|
while ($l = $resLog->fetch_assoc()) {
|
|
$l['nilai_bantuan'] = $l['nilai_bantuan'] ? (float)$l['nilai_bantuan'] : null;
|
|
$logs[] = $l;
|
|
}
|
|
$row['riwayat_bantuan'] = $logs;
|
|
|
|
sendSuccess($row);
|
|
} else {
|
|
// Semua rumah ibadah dengan ringkasan statistik
|
|
$sql = "
|
|
SELECT ri.id, ri.nama, ri.jenis, ri.alamat, ri.no_wa,
|
|
ri.latitude, ri.longitude, ri.radius_meter, ri.created_at,
|
|
u.id AS user_id, u.username,
|
|
(SELECT COUNT(*) FROM penduduk_miskin pm WHERE pm.rumah_ibadah_id = ri.id AND pm.status_proximity = 'dalam_radius') AS pm_dalam_radius,
|
|
(SELECT COUNT(*) FROM log_bantuan lb WHERE lb.rumah_ibadah_id = ri.id) AS total_penyaluran,
|
|
(SELECT IFNULL(SUM(lb.nilai_bantuan), 0) FROM log_bantuan lb WHERE lb.rumah_ibadah_id = ri.id) AS total_nilai_bantuan,
|
|
(SELECT COUNT(DISTINCT lb.penduduk_miskin_id) FROM log_bantuan lb WHERE lb.rumah_ibadah_id = ri.id) AS jumlah_penerima_unik
|
|
FROM rumah_ibadah ri
|
|
LEFT JOIN users u ON u.rumah_ibadah_id = ri.id
|
|
ORDER BY ri.created_at DESC
|
|
";
|
|
$result = $db->query($sql);
|
|
$rows = [];
|
|
while ($r = $result->fetch_assoc()) {
|
|
$r['latitude'] = (float)$r['latitude'];
|
|
$r['longitude'] = (float)$r['longitude'];
|
|
$r['radius_meter'] = (int)$r['radius_meter'];
|
|
$r['pm_dalam_radius'] = (int)$r['pm_dalam_radius'];
|
|
$r['total_penyaluran'] = (int)$r['total_penyaluran'];
|
|
$r['total_nilai_bantuan'] = (float)$r['total_nilai_bantuan'];
|
|
$r['jumlah_penerima_unik'] = (int)$r['jumlah_penerima_unik'];
|
|
$rows[] = $r;
|
|
}
|
|
sendSuccess($rows);
|
|
}
|
|
break;
|
|
|
|
// DELETE: Hapus akun user rumah ibadah (tidak hapus rumah ibadahnya)
|
|
case 'DELETE':
|
|
if ($id <= 0) sendError('ID wajib disertakan');
|
|
$stmt = $db->prepare("DELETE FROM users WHERE rumah_ibadah_id = ?");
|
|
$stmt->bind_param('i', $id);
|
|
if ($stmt->execute()) {
|
|
sendSuccess(null, $stmt->affected_rows > 0 ? 'Akun berhasil dihapus' : 'Tidak ada akun untuk dihapus');
|
|
} else {
|
|
sendError('Gagal menghapus akun');
|
|
}
|
|
break;
|
|
|
|
default:
|
|
sendError('Method tidak diizinkan', 405);
|
|
}
|