Files
2026-06-10 21:46:56 +07:00

119 lines
5.1 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// api/export_excel.php v2.0
// ============================================================
// Export Data Penduduk Miskin ke Excel (format CSV UTF-8 BOM)
// Tidak memerlukan library eksternal
// ============================================================
require_once __DIR__ . '/../includes/config.php';
$db = getDB();
// ── Filter dari query string ───────────────────────────────
$kelurahan = $_GET['kelurahan'] ?? null;
$kecamatan = $_GET['kecamatan'] ?? null;
$kategori = $_GET['kategori'] ?? null;
$verifikasi = $_GET['verifikasi'] ?? null;
$bantuan = $_GET['bantuan'] ?? null;
$where = "WHERE 1=1";
$params = [];
if ($kelurahan) { $where .= " AND w.kelurahan = ?"; $params[] = $kelurahan; }
if ($kecamatan) { $where .= " AND w.kecamatan = ?"; $params[] = $kecamatan; }
if ($kategori) { $where .= " AND pm.kategori_kemiskinan = ?"; $params[] = $kategori; }
if ($verifikasi) { $where .= " AND pm.status_verifikasi = ?"; $params[] = $verifikasi; }
if ($bantuan === 'tidak') {
$where .= " AND (SELECT COUNT(*) FROM bantuan_penduduk bp WHERE bp.penduduk_id = pm.id AND bp.status='aktif') = 0";
} elseif ($bantuan === 'ada') {
$where .= " AND (SELECT COUNT(*) FROM bantuan_penduduk bp WHERE bp.penduduk_id = pm.id AND bp.status='aktif') > 0";
}
$stmt = $db->prepare("
SELECT
pm.nik_kk, pm.nama_kk, pm.no_hp,
pm.alamat, pm.rt, pm.rw,
COALESCE(w.kelurahan,'') AS kelurahan,
COALESCE(w.kecamatan,'') AS kecamatan,
pm.jumlah_anggota, pm.jumlah_anak_sekolah,
pm.penghasilan_bulanan, pm.sumber_penghasilan, pm.status_pekerjaan,
pm.kategori_kemiskinan, pm.kondisi_rumah, pm.kepemilikan_rumah,
CASE pm.punya_bpjs WHEN 1 THEN 'Ya' ELSE 'Tidak' END AS punya_bpjs,
pm.jenis_bpjs,
pm.lat, pm.lng,
pm.status_verifikasi,
COALESCE(u.nama,'') AS nama_surveyor,
DATE_FORMAT(pm.created_at,'%d/%m/%Y %H:%i') AS tgl_input,
(SELECT GROUP_CONCAT(jb.kode ORDER BY jb.kode SEPARATOR ', ')
FROM bantuan_penduduk bp JOIN jenis_bantuan jb ON jb.id = bp.bantuan_id
WHERE bp.penduduk_id = pm.id AND bp.status='aktif') AS bantuan_diterima
FROM penduduk_miskin pm
LEFT JOIN wilayah w ON w.id = pm.wilayah_id
LEFT JOIN users u ON u.id = pm.surveyor_id
$where
ORDER BY w.kelurahan, pm.nama_kk
");
$stmt->execute($params);
$rows = $stmt->fetchAll();
// ── Nama file ─────────────────────────────────────────────
$filter = $kelurahan ? "_" . preg_replace('/\s+/', '-', $kelurahan) : '';
$filename = "data_kemiskinan{$filter}_" . date('Ymd_His') . ".csv";
// ── Output header HTTP ─────────────────────────────────────
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
// BOM UTF-8 agar Excel baca karakter Indonesia dengan benar
echo "\xEF\xBB\xBF";
$out = fopen('php://output', 'w');
// ── Header kolom ──────────────────────────────────────────
fputcsv($out, [
'No','NIK KK','Nama KK','No HP',
'Alamat','RT','RW','Kelurahan','Kecamatan',
'Jml Anggota','Anak Sekolah',
'Penghasilan/Bln','Sumber Penghasilan','Status Pekerjaan',
'Kategori Kemiskinan','Kondisi Rumah','Kepemilikan Rumah',
'Punya BPJS','Jenis BPJS',
'Latitude','Longitude',
'Status Verifikasi','Bantuan Diterima',
'Petugas Input','Tgl Input',
], ';');
// ── Data rows ─────────────────────────────────────────────
$no = 1;
foreach ($rows as $r) {
fputcsv($out, [
$no++,
$r['nik_kk'],
$r['nama_kk'],
$r['no_hp'] ?? '',
$r['alamat'] ?? '',
$r['rt'] ?? '',
$r['rw'] ?? '',
$r['kelurahan'],
$r['kecamatan'],
$r['jumlah_anggota'],
$r['jumlah_anak_sekolah'],
$r['penghasilan_bulanan'] ? 'Rp ' . number_format($r['penghasilan_bulanan'],0,',','.') : '',
$r['sumber_penghasilan'] ?? '',
ucwords(str_replace('_',' ', $r['status_pekerjaan'])),
$r['kategori_kemiskinan'] === 'hampir_miskin' ? 'Nyaris Miskin' : ucwords(str_replace('_',' ', $r['kategori_kemiskinan'])),
ucwords(str_replace('_',' ', $r['kondisi_rumah'])),
ucwords(str_replace('_',' ', $r['kepemilikan_rumah'])),
$r['punya_bpjs'],
strtoupper(str_replace('_',' ', $r['jenis_bpjs'])),
$r['lat'],
$r['lng'],
ucwords(str_replace('_',' ', $r['status_verifikasi'])),
$r['bantuan_diterima'] ?? 'Belum Ada',
$r['nama_surveyor'],
$r['tgl_input'],
], ';');
}
fclose($out);
exit;