query( "SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'kebutuhan' LIMIT 1" )->num_rows > 0; if ($kebutuhan_exists) { $sql = " SELECT pm.id, pm.nama_kk, pm.nik, pm.kategori, pm.alamat, pm.catatan, pm.jumlah_jiwa, pm.lat, pm.lng, pm.ibadah_id, pm.jarak_m, pm.is_blank_spot, pm.status_bantuan, pm.status_verifikasi, pm.created_at, ri.nama AS nama_ibadah, ri.jenis AS jenis_ibadah, COALESCE(kstat.kebutuhan_open, 0) AS kebutuhan_open, COALESCE(kstat.kebutuhan_proses, 0) AS kebutuhan_proses, COALESCE(kstat.kebutuhan_terpenuhi,0) AS kebutuhan_terpenuhi, kstat.kebutuhan_kategori_open FROM penduduk_miskin pm LEFT JOIN rumah_ibadah ri ON pm.ibadah_id = ri.id AND ri.deleted_at IS NULL LEFT JOIN ( SELECT penduduk_id, SUM(CASE WHEN status='Belum Terpenuhi' THEN 1 ELSE 0 END) AS kebutuhan_open, SUM(CASE WHEN status='Dalam Proses' THEN 1 ELSE 0 END) AS kebutuhan_proses, SUM(CASE WHEN status='Terpenuhi' THEN 1 ELSE 0 END) AS kebutuhan_terpenuhi, GROUP_CONCAT(DISTINCT CASE WHEN status='Belum Terpenuhi' THEN kategori ELSE NULL END ORDER BY kategori SEPARATOR ',') AS kebutuhan_kategori_open FROM kebutuhan GROUP BY penduduk_id ) kstat ON kstat.penduduk_id = pm.id WHERE pm.is_active = 1 AND pm.deleted_at IS NULL {$public_verif_sql} {$operator_scope_sql} ORDER BY pm.created_at DESC "; } else { $sql = " SELECT pm.id, pm.nama_kk, pm.nik, pm.kategori, pm.alamat, pm.catatan, pm.jumlah_jiwa, pm.lat, pm.lng, pm.ibadah_id, pm.jarak_m, pm.is_blank_spot, pm.status_bantuan, pm.status_verifikasi, pm.created_at, ri.nama AS nama_ibadah, ri.jenis AS jenis_ibadah, 0 AS kebutuhan_open, 0 AS kebutuhan_proses, 0 AS kebutuhan_terpenuhi, NULL AS kebutuhan_kategori_open FROM penduduk_miskin pm LEFT JOIN rumah_ibadah ri ON pm.ibadah_id = ri.id AND ri.deleted_at IS NULL WHERE pm.is_active = 1 AND pm.deleted_at IS NULL {$public_verif_sql} {$operator_scope_sql} ORDER BY pm.created_at DESC "; } $result = $conn->query($sql); if (!$result) { error_log('penduduk/ambil query failed: ' . $conn->error); echo json_encode(['status' => 'error', 'message' => 'Gagal memuat data penduduk.']); exit; } $data = []; while ($row = $result->fetch_assoc()) { if (!$can_see_sensitive) { // Publik tidak boleh lihat data pribadi $row['nik'] = null; $row['nama_kk'] = null; $row['alamat'] = null; $row['catatan'] = null; } if (!$can_see_coords) { // Publik tidak boleh lihat koordinat rumah warga $row['lat'] = null; $row['lng'] = null; } $data[] = $row; } echo json_encode(['status' => 'success', 'total' => count($data), 'data' => $data]); $conn->close();