Files
WebGIS-Poverty-MAP/api/export.php
T

212 lines
9.8 KiB
PHP

<?php
// ================================================================
// API: Export Data ke CSV atau HTML Print
// ================================================================
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../config/config.php';
require_once __DIR__ . '/../includes/functions.php';
// Wajib login untuk export
session_name(SESSION_NAME);
session_start();
if (empty($_SESSION['user_id'])) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'Unauthorized']);
exit;
}
$db = getDB();
$type = $_GET['type'] ?? 'penduduk'; // penduduk | ibadah
$format = $_GET['format'] ?? 'csv'; // csv | print
// ── Query Penduduk Miskin ──────────────────────────────────────
if ($type === 'penduduk') {
$where = ['1=1'];
$params = [];
if (!empty($_GET['status'])) { $where[] = 'pm.status_bantuan = ?'; $params[] = $_GET['status']; }
if (!empty($_GET['kecamatan'])) { $where[] = 'pm.kecamatan = ?'; $params[] = $_GET['kecamatan']; }
if (!empty($_GET['ibadah_id'])) { $where[] = 'pm.rumah_ibadah_id = ?'; $params[] = (int)$_GET['ibadah_id']; }
if (!empty($_GET['dari'])) { $where[] = 'DATE(pm.created_at) >= ?'; $params[] = $_GET['dari']; }
if (!empty($_GET['sampai'])) { $where[] = 'DATE(pm.created_at) <= ?'; $params[] = $_GET['sampai']; }
$ws = implode(' AND ', $where);
$stmt = $db->prepare("
SELECT pm.id, pm.kk_nama, pm.nik, pm.jumlah_anggota, pm.alamat,
pm.kelurahan, pm.kecamatan, pm.lat, pm.lng,
pm.status_bantuan, pm.jenis_bantuan, pm.tanggal_bantuan, pm.nominal_bantuan, pm.jarak_ke_ibadah,
pm.created_at, ri.nama AS ibadah_nama, ri.jenis AS ibadah_jenis
FROM penduduk_miskin pm
LEFT JOIN rumah_ibadah ri ON pm.rumah_ibadah_id = ri.id
WHERE $ws ORDER BY pm.kecamatan, pm.kk_nama
");
$stmt->execute($params);
$rows = $stmt->fetchAll();
if ($format === 'csv') {
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="penduduk_miskin_' . date('Ymd_His') . '.csv"');
$out = fopen('php://output', 'w');
// BOM for Excel UTF-8
fputs($out, "\xEF\xBB\xBF");
fputcsv($out, ['No','Nama KK','NIK','Jumlah Anggota','Alamat','Kelurahan','Kecamatan',
'Latitude','Longitude','Status Bantuan','Jenis Bantuan','Tanggal Bantuan','Nominal Bantuan',
'Jarak ke Ibadah (m)','Rumah Ibadah','Jenis Ibadah','Terdaftar']);
foreach ($rows as $i => $row) {
fputcsv($out, [
$i + 1,
$row['kk_nama'],
$row['nik'] ?: '',
$row['jumlah_anggota'],
$row['alamat'] ?: '',
$row['kelurahan'] ?: '',
$row['kecamatan'] ?: '',
$row['lat'],
$row['lng'],
$row['status_bantuan'],
$row['jenis_bantuan'] ?: '',
$row['tanggal_bantuan'] ?: '',
$row['nominal_bantuan'] ? $row['nominal_bantuan'] : '',
$row['jarak_ke_ibadah'] ? round($row['jarak_ke_ibadah']) : '',
$row['ibadah_nama'] ?: '',
$row['ibadah_jenis'] ?: '',
$row['created_at'],
]);
}
fclose($out);
exit;
}
// Print / PDF view
$title = 'Data Penduduk Miskin';
$subtitle = 'WebGIS Sebaran Penduduk Miskin — ' . APP_NAME;
$cols = ['No', 'Nama KK', 'NIK', 'Anggota', 'Kecamatan', 'Status', 'Nominal Bantuan', 'Rumah Ibadah', 'Jarak'];
$tableRows = array_map(function($r, $i) {
$sc = ['sudah' => '#22c55e', 'menunggu' => '#f59e0b', 'belum' => '#ef4444', 'darurat' => '#a855f7'][$r['status_bantuan']] ?? '#ef4444';
return [$i + 1, $r['kk_nama'], $r['nik'] ?: '—', $r['jumlah_anggota'],
$r['kecamatan'] ?: '—',
"<span style='color:{$sc};font-weight:700'>".ucfirst($r['status_bantuan']).'</span>',
$r['nominal_bantuan'] ? 'Rp '.number_format($r['nominal_bantuan'],0,',','.') : '—',
$r['ibadah_nama'] ?: '—',
$r['jarak_ke_ibadah'] ? round($r['jarak_ke_ibadah']).' m' : '—'];
}, $rows, array_keys($rows));
}
// ── Query Rumah Ibadah ────────────────────────────────────────
if ($type === 'ibadah') {
$where = ['1=1'];
$params = [];
if (!empty($_GET['jenis'])) { $where[] = 'jenis = ?'; $params[] = $_GET['jenis']; }
if (!empty($_GET['kecamatan'])) { $where[] = 'kecamatan = ?'; $params[] = $_GET['kecamatan']; }
$ws = implode(' AND ', $where);
$stmt = $db->prepare("
SELECT ri.*,
(SELECT COUNT(*) FROM penduduk_miskin pm WHERE pm.rumah_ibadah_id = ri.id) AS jumlah_binaan
FROM rumah_ibadah ri WHERE $ws ORDER BY jenis, nama
");
$stmt->execute($params);
$rows = $stmt->fetchAll();
if ($format === 'csv') {
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="rumah_ibadah_' . date('Ymd_His') . '.csv"');
$out = fopen('php://output', 'w');
fputs($out, "\xEF\xBB\xBF");
fputcsv($out, ['No','Nama','Jenis','Kontak','Alamat','Kelurahan','Kecamatan',
'Latitude','Longitude','Radius (m)','Jumlah Binaan','Terdaftar']);
foreach ($rows as $i => $row) {
fputcsv($out, [
$i + 1, $row['nama'], $row['jenis'], $row['kontak'] ?: '',
$row['alamat'] ?: '', $row['kelurahan'] ?: '', $row['kecamatan'] ?: '',
$row['lat'], $row['lng'], $row['radius'], $row['jumlah_binaan'], $row['created_at']
]);
}
fclose($out);
exit;
}
$title = 'Data Rumah Ibadah';
$subtitle = 'WebGIS Sebaran Penduduk Miskin — ' . APP_NAME;
$cols = ['No', 'Nama', 'Jenis', 'Kontak', 'Kecamatan', 'Radius', 'Binaan'];
$tableRows = array_map(function($r, $i) {
return [$i + 1, $r['nama'], $r['jenis'], $r['kontak'] ?: '—',
$r['kecamatan'] ?: '—', formatRadius($r['radius']), $r['jumlah_binaan']];
}, $rows, array_keys($rows));
}
// ── HTML Print View ───────────────────────────────────────────
$total = count($rows);
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= $title ?></title>
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Plus Jakarta Sans', sans-serif; background: #fff; color: #1a1a2e; padding: 20px; font-size: 12px; }
.print-header { text-align: center; margin-bottom: 24px; border-bottom: 2px solid #5b7fff; padding-bottom: 16px; }
.print-header h1 { font-size: 20px; font-weight: 800; color: #1a1a2e; }
.print-header p { font-size: 12px; color: #666; margin-top: 4px; }
.print-meta { display: flex; gap: 16px; justify-content: center; margin-top: 8px; flex-wrap: wrap; font-size: 11px; color: #555; }
table { width: 100%; border-collapse: collapse; margin-top: 16px; }
th { background: #5b7fff; color: #fff; padding: 8px 10px; text-align: left; font-size: 11px; font-weight: 600; }
td { padding: 6px 10px; border-bottom: 1px solid #eee; font-size: 11px; vertical-align: top; }
tr:nth-child(even) td { background: #f8f9ff; }
.print-footer { margin-top: 20px; text-align: right; font-size: 10px; color: #999; }
.no-print { position: fixed; top: 20px; right: 20px; display: flex; gap: 8px; z-index: 999; }
.btn-print { background: #5b7fff; color: #fff; border: none; padding: 10px 20px; border-radius: 8px; cursor: pointer; font-family: inherit; font-weight: 600; font-size: 13px; }
.btn-close-p { background: #ef4444; color: #fff; border: none; padding: 10px 20px; border-radius: 8px; cursor: pointer; font-family: inherit; font-weight: 600; font-size: 13px; }
@media print { .no-print { display: none; } body { padding: 0; } }
</style>
</head>
<body>
<div class="no-print">
<button class="btn-print" onclick="window.print()">🖨️ Cetak / Save PDF</button>
<button class="btn-close-p" onclick="window.close()">✕ Tutup</button>
</div>
<div class="print-header">
<h1><?= htmlspecialchars($title) ?></h1>
<p><?= htmlspecialchars($subtitle) ?></p>
<div class="print-meta">
<span>📅 Dicetak: <?= date('d F Y, H:i') ?> WIB</span>
<span>📊 Total: <?= $total ?> data</span>
<?php if (!empty($_GET['status'])): ?>
<span>🔍 Status: <?= htmlspecialchars(ucfirst($_GET['status'])) ?></span>
<?php endif; ?>
<?php if (!empty($_GET['kecamatan'])): ?>
<span>📍 Kecamatan: <?= htmlspecialchars($_GET['kecamatan']) ?></span>
<?php endif; ?>
</div>
</div>
<table>
<thead>
<tr><?php foreach ($cols as $c) echo "<th>$c</th>"; ?></tr>
</thead>
<tbody>
<?php foreach ($tableRows as $tr): ?>
<tr><?php foreach ($tr as $td) echo "<td>$td</td>"; ?></tr>
<?php endforeach; ?>
<?php if (empty($tableRows)): ?>
<tr><td colspan="<?= count($cols) ?>" style="text-align:center;padding:20px;color:#999;">Tidak ada data</td></tr>
<?php endif; ?>
</tbody>
</table>
<div class="print-footer">
<?= APP_NAME ?> v<?= APP_VERSION ?> — <?= BASE_URL ?>
</div>
<script>
// Auto-trigger print dialog for print format
<?php if ($format === 'print'): ?>
window.addEventListener('load', () => setTimeout(() => {}, 500));
<?php endif; ?>
</script>
</body>
</html>