Files
Webgis-Poverty/api/manajemen_akun.php
T
2026-06-11 01:50:37 +07:00

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);
}