Files
2026-06-12 12:01:54 +07:00

141 lines
6.9 KiB
PHP

<?php
// vendor mPDF ada di folder webgus/vendor (sudah di-install sebelumnya)
require_once __DIR__ . '/uas/vendor/autoload.php';
include 'koneksi.php';
$allMasjid = mysqli_fetch_all(mysqli_query($conn, "SELECT * FROM masjid"), MYSQLI_ASSOC);
$allKemiskinan = mysqli_fetch_all(mysqli_query($conn, "SELECT * FROM kemiskinan"), MYSQLI_ASSOC);
function haversine($lat1, $lng1, $lat2, $lng2) {
$R = 6371000;
$phi1 = deg2rad($lat1); $phi2 = deg2rad($lat2);
$dp = deg2rad($lat2 - $lat1);
$dl = deg2rad($lng2 - $lng1);
$a = sin($dp/2)**2 + cos($phi1)*cos($phi2)*sin($dl/2)**2;
return (int)round(2 * $R * asin(sqrt($a)));
}
// Analisis coverage
$kkCoverage = []; $masjidCoverage = [];
foreach ($allMasjid as $m) $masjidCoverage[$m['id']] = ['kk'=>[], 'jiwa'=>0];
foreach ($allKemiskinan as $kk) {
$kkCoverage[$kk['id']] = [];
foreach ($allMasjid as $m) {
$dist = haversine($kk['lat'], $kk['lng'], $m['lat'], $m['lng']);
if ($dist <= (int)$m['radius_m']) {
$kkCoverage[$kk['id']][] = $m;
$masjidCoverage[$m['id']]['kk'][] = $kk;
$masjidCoverage[$m['id']]['jiwa'] += (int)$kk['jumlah_kk'];
}
}
}
$totalKK = count($allKemiskinan);
$totalJiwa = array_sum(array_column($allKemiskinan, 'jumlah_kk'));
$countT = 0; $jiwaT = 0;
foreach ($allKemiskinan as $kk) {
if (count($kkCoverage[$kk['id']]) > 0) { $countT++; $jiwaT += (int)$kk['jumlah_kk']; }
}
$countTT = $totalKK - $countT; $jiwaTT = $totalJiwa - $jiwaT;
$pct = $totalKK > 0 ? number_format($countT / $totalKK * 100, 1) : '0.0';
$pctTT = $totalKK > 0 ? number_format($countTT / $totalKK * 100, 1) : '0.0';
$bulan = ['','Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember'];
$tgl = date('j') . ' ' . $bulan[(int)date('n')] . ' ' . date('Y');
$rowsMasjid = '';
foreach ($allMasjid as $i => $m) {
$cov = $masjidCoverage[$m['id']];
$bg = ($i % 2 === 0) ? '#ffffff' : '#f9fafb';
$rowsMasjid .= "<tr style='background:{$bg};'>
<td style='text-align:center;'>" . ($i+1) . "</td>
<td>{$m['nama_masjid']}</td>
<td style='text-align:center;'>{$m['radius_m']}</td>
<td style='text-align:center;'><b>" . count($cov['kk']) . "</b></td>
<td style='text-align:center;'><b>{$cov['jiwa']}</b></td>
</tr>";
}
if (!$rowsMasjid) $rowsMasjid = "<tr><td colspan='5' style='text-align:center;color:#999;'>Belum ada data masjid.</td></tr>";
$rowsKK = '';
foreach ($allKemiskinan as $i => $kk) {
$covers = $kkCoverage[$kk['id']];
$covered = count($covers) > 0;
$minDist = '-';
if (count($allMasjid) > 0) {
$dists = array_map(fn($m) => haversine($kk['lat'], $kk['lng'], $m['lat'], $m['lng']), $allMasjid);
$minDist = min($dists);
}
$statusTxt = $covered ? '<span style="color:#1a7a3e;font-weight:bold;">Terjangkau</span>' : '<span style="color:#c0392b;font-weight:bold;">Tidak Terjangkau</span>';
$masjidNames = $covered ? implode(', ', array_column($covers, 'nama_masjid')) : '-';
$bg = ($i % 2 === 0) ? '#ffffff' : '#f9fafb';
$pkhTxt = $kk['pkh'] ? '<span style="color:#155724;">✓</span>' : '-';
$bpntTxt = $kk['bpnt'] ? '<span style="color:#004085;">✓</span>' : '-';
$bltTxt = $kk['blt'] ? '<span style="color:#856404;">✓</span>' : '-';
$rowsKK .= "<tr style='background:{$bg};'>
<td style='text-align:center;'>" . ($i+1) . "</td>
<td>{$kk['nama_kk']}</td>
<td style='text-align:center;'>{$kk['jumlah_kk']}</td>
<td style='font-size:9px;'>{$kk['alamat']}</td>
<td style='text-align:center;'>{$pkhTxt}</td>
<td style='text-align:center;'>{$bpntTxt}</td>
<td style='text-align:center;'>{$bltTxt}</td>
<td style='text-align:center;'>{$statusTxt}</td>
<td style='font-size:9px;'>{$masjidNames}</td>
<td style='text-align:center;'>{$minDist}</td>
</tr>";
}
if (!$rowsKK) $rowsKK = "<tr><td colspan='10' style='text-align:center;color:#999;'>Belum ada data kemiskinan.</td></tr>";
$html = <<<HTML
<style>
body { font-family: sans-serif; font-size: 11px; color: #222; }
h1 { font-size: 15px; text-align: center; margin-bottom: 2px; color: #1e3a5f; }
.subtitle { text-align: center; font-size: 10px; color: #555; margin-bottom: 14px; }
.section { font-size: 12px; font-weight: bold; color: #1e3a5f; border-bottom: 2px solid #1e3a5f; padding-bottom: 3px; margin: 12px 0 7px; }
table { width: 100%; border-collapse: collapse; font-size: 10px; }
th { background: #1e3a5f; color: white; padding: 5px; text-align: center; }
td { padding: 4px 5px; border-bottom: 1px solid #e5e7eb; vertical-align: top; }
.sg { width: 100%; border-collapse: collapse; margin-bottom: 4px; }
.sc { width: 25%; padding: 7px; text-align: center; border: 1px solid #ddd; }
.sn { font-size: 20px; font-weight: bold; }
.sl { font-size: 9px; color: #666; margin-top: 1px; }
.g { color: #1a7a3e; } .r { color: #c0392b; }
</style>
<h1>Laporan Analisis Kemiskinan &amp; Jangkauan Masjid</h1>
<div class="subtitle">Sistem WebGIS SIG B &mdash; Universitas Tanjungpura &nbsp;|&nbsp; Dicetak: {$tgl}</div>
<div class="section">Ringkasan Statistik</div>
<table class="sg">
<tr>
<td class="sc"><div class="sn">{$totalKK}</div><div class="sl">Total KK Miskin</div></td>
<td class="sc"><div class="sn">{$totalJiwa}</div><div class="sl">Total Jiwa</div></td>
<td class="sc"><div class="sn g">{$countT} ({$pct}%)</div><div class="sl">KK Terjangkau &bull; {$jiwaT} jiwa</div></td>
<td class="sc"><div class="sn r">{$countTT} ({$pctTT}%)</div><div class="sl">KK Tidak Terjangkau &bull; {$jiwaTT} jiwa</div></td>
</tr>
</table>
<div class="section">Statistik per Masjid</div>
<table>
<thead><tr><th width="5%">No</th><th width="40%">Nama Masjid</th><th width="15%">Radius (m)</th><th width="20%">KK Terjangkau</th><th width="20%">Jiwa Terjangkau</th></tr></thead>
<tbody>{$rowsMasjid}</tbody>
</table>
<div class="section">Daftar KK Miskin &amp; Status Jangkauan</div>
<table>
<thead><tr>
<th width="4%">No</th><th width="14%">Nama KK</th><th width="5%">Jiwa</th>
<th width="15%">Alamat</th><th width="5%">PKH</th><th width="5%">BPNT</th><th width="5%">BLT</th>
<th width="10%">Status</th><th width="22%">Dijangkau Masjid</th><th width="15%">Jarak Terdekat (m)</th>
</tr></thead>
<tbody>{$rowsKK}</tbody>
</table>
HTML;
try {
$mpdf = new \Mpdf\Mpdf(['mode'=>'utf-8','format'=>'A4-L','margin_top'=>14,'margin_bottom'=>14,'margin_left'=>12,'margin_right'=>12]);
$mpdf->SetTitle('Laporan Kemiskinan & Jangkauan Masjid');
$mpdf->WriteHTML($html);
$mpdf->Output('laporan_kemiskinan_' . date('Y-m-d') . '.pdf', 'D');
} catch (\Mpdf\MpdfException $e) {
http_response_code(500);
echo '<pre>Gagal membuat PDF: ' . htmlspecialchars($e->getMessage()) . '</pre>';
}