query("SHOW COLUMNS FROM pemukiman_miskin_points")->fetchAll(PDO::FETCH_COLUMN, 0); $hasNew = in_array('kk_nama', $cols, true); $out = fopen('php://output', 'w'); if ($hasNew) { fputcsv($out, ['id','kk_nama','nik','jumlah_anggota','lat','lng','alamat','kelurahan','kecamatan','status_bantuan','jenis_bantuan','tanggal_bantuan','rumah_ibadah_id','jarak_meter']); $rows = $pdo->query("SELECT id, kk_nama, nik, jumlah_anggota, latitude, longitude, address, kelurahan, kecamatan, status_bantuan, jenis_bantuan, tanggal_bantuan, rumah_ibadah_id, jarak_meter FROM pemukiman_miskin_points ORDER BY id ASC")->fetchAll(); foreach ($rows as $r) { fputcsv($out, [ $r['id'], $r['kk_nama'], $r['nik'], $r['jumlah_anggota'], $r['latitude'], $r['longitude'], $r['address'], $r['kelurahan'], $r['kecamatan'], $r['status_bantuan'], $r['jenis_bantuan'], $r['tanggal_bantuan'], $r['rumah_ibadah_id'], $r['jarak_meter'] ]); } } else { fputcsv($out, ['id','nama','lat','lng','alamat','rumah_ibadah_id']); $rows = $pdo->query("SELECT id, nama, latitude, longitude, address, rumah_ibadah_id FROM pemukiman_miskin_points ORDER BY id ASC")->fetchAll(); foreach ($rows as $r) fputcsv($out, [$r['id'],$r['nama'],$r['latitude'],$r['longitude'],$r['address'],$r['rumah_ibadah_id']]); } fclose($out); exit; } $msg = ''; $err = ''; // Delete if (isset($_GET['delete'])) { $id = (int)$_GET['delete']; try { $stmt = $pdo->prepare("DELETE FROM pemukiman_miskin_points WHERE id=:id"); $stmt->execute([':id' => $id]); $msg = 'Berhasil dihapus.'; } catch (Exception $e) { $err = $e->getMessage(); } } // Import CSV (minimal) if (isset($_POST['import_csv'])) { if (!isset($_FILES['csv_file']) || ($_FILES['csv_file']['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) { $err = 'CSV tidak ditemukan.'; } else { try { $cols = $pdo->query("SHOW COLUMNS FROM pemukiman_miskin_points")->fetchAll(PDO::FETCH_COLUMN, 0); $hasNew = in_array('kk_nama', $cols, true); $fp = fopen($_FILES['csv_file']['tmp_name'], 'r'); $header = fgetcsv($fp); if (!$header) throw new Exception('Header CSV kosong.'); $map = []; foreach ($header as $i => $hcol) $map[strtolower(trim($hcol))] = $i; $pdo->beginTransaction(); $ins = $hasNew ? $pdo->prepare("INSERT INTO pemukiman_miskin_points (kk_nama, nik, jumlah_anggota, latitude, longitude, address, kelurahan, kecamatan, status_bantuan, jenis_bantuan, tanggal_bantuan) VALUES (:kk,:nik,:j,:lat,:lng,:a,:kel,:kec,:s,:jb,:tb)") : $pdo->prepare("INSERT INTO pemukiman_miskin_points (nama, latitude, longitude, address) VALUES (:kk,:lat,:lng,:a)"); $n = 0; while (($row = fgetcsv($fp)) !== false) { $kk = $row[$map['kk_nama'] ?? $map['nama'] ?? -1] ?? ''; $lat = $row[$map['lat'] ?? $map['latitude'] ?? -1] ?? ''; $lng = $row[$map['lng'] ?? $map['longitude'] ?? -1] ?? ''; if (trim($kk) === '' || trim($lat) === '' || trim($lng) === '') continue; if ($hasNew) { $ins->execute([ ':kk' => $kk, ':nik' => ($row[$map['nik'] ?? -1] ?? '') ?: null, ':j' => (int)($row[$map['jumlah_anggota'] ?? -1] ?? 0), ':lat' => $lat, ':lng' => $lng, ':a' => ($row[$map['alamat'] ?? $map['address'] ?? -1] ?? '') ?: null, ':kel' => ($row[$map['kelurahan'] ?? -1] ?? '') ?: null, ':kec' => ($row[$map['kecamatan'] ?? -1] ?? '') ?: null, ':s' => ($row[$map['status_bantuan'] ?? -1] ?? 'Belum dibantu') ?: 'Belum dibantu', ':jb' => ($row[$map['jenis_bantuan'] ?? -1] ?? '') ?: null, ':tb' => ($row[$map['tanggal_bantuan'] ?? -1] ?? '') ?: null ]); } else { $ins->execute([ ':kk' => $kk, ':lat' => $lat, ':lng' => $lng, ':a' => ($row[$map['alamat'] ?? $map['address'] ?? -1] ?? '') ?: null ]); } $n++; } $pdo->commit(); fclose($fp); $msg = "Import selesai: $n baris."; } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); $err = $e->getMessage(); } } } // Simple edit/create (without anggota details) if (isset($_POST['save_penduduk'])) { $id = (int)($_POST['id'] ?? 0); $kk = trim($_POST['kk_nama'] ?? ''); $nik = trim($_POST['nik'] ?? ''); $jml = (int)($_POST['jumlah_anggota'] ?? 0); $lat = $_POST['latitude'] ?? null; $lng = $_POST['longitude'] ?? null; $addr = trim($_POST['address'] ?? ''); $kel = trim($_POST['kelurahan'] ?? ''); $kec = trim($_POST['kecamatan'] ?? ''); $status = trim($_POST['status_bantuan'] ?? 'Belum dibantu'); $jb = trim($_POST['jenis_bantuan'] ?? ''); $tb = trim($_POST['tanggal_bantuan'] ?? ''); if ($kk === '' || $lat === null || $lng === null) $err = 'Data belum lengkap (nama/lat/lng).'; else { try { $cols = $pdo->query("SHOW COLUMNS FROM pemukiman_miskin_points")->fetchAll(PDO::FETCH_COLUMN, 0); $hasNew = in_array('kk_nama', $cols, true); if (!$hasNew) throw new Exception('Schema belum mendukung fitur penduduk detail. Jalankan schema terbaru.'); if ($id > 0) { $stmt = $pdo->prepare("UPDATE pemukiman_miskin_points SET kk_nama=:kk, nik=:nik, jumlah_anggota=:j, latitude=:lat, longitude=:lng, address=:a, kelurahan=:kel, kecamatan=:kec, status_bantuan=:s, jenis_bantuan=:jb, tanggal_bantuan=:tb WHERE id=:id"); $stmt->execute([':kk'=>$kk,':nik'=>$nik ?: null,':j'=>$jml,':lat'=>$lat,':lng'=>$lng,':a'=>$addr ?: null,':kel'=>$kel ?: null,':kec'=>$kec ?: null,':s'=>$status ?: 'Belum dibantu',':jb'=>$jb ?: null,':tb'=>$tb ?: null,':id'=>$id]); $msg = 'Berhasil diupdate.'; } else { $stmt = $pdo->prepare("INSERT INTO pemukiman_miskin_points (kk_nama, nik, jumlah_anggota, latitude, longitude, address, kelurahan, kecamatan, status_bantuan, jenis_bantuan, tanggal_bantuan) VALUES (:kk,:nik,:j,:lat,:lng,:a,:kel,:kec,:s,:jb,:tb)"); $stmt->execute([':kk'=>$kk,':nik'=>$nik ?: null,':j'=>$jml,':lat'=>$lat,':lng'=>$lng,':a'=>$addr ?: null,':kel'=>$kel ?: null,':kec'=>$kec ?: null,':s'=>$status ?: 'Belum dibantu',':jb'=>$jb ?: null,':tb'=>$tb ?: null]); $msg = 'Berhasil ditambahkan.'; } } catch (Exception $e) { $err = $e->getMessage(); } } } $edit = null; if (isset($_GET['edit'])) { $id = (int)$_GET['edit']; $stmt = $pdo->prepare("SELECT * FROM pemukiman_miskin_points WHERE id=:id"); $stmt->execute([':id' => $id]); $edit = $stmt->fetch() ?: null; } $rows = []; try { $cols = $pdo->query("SHOW COLUMNS FROM pemukiman_miskin_points")->fetchAll(PDO::FETCH_COLUMN, 0); $hasNew = in_array('kk_nama', $cols, true); if ($hasNew) { $rows = $pdo->query(" SELECT p.*, r.nama AS rumah_ibadah_nama FROM pemukiman_miskin_points p LEFT JOIN rumah_ibadah_points r ON r.id=p.rumah_ibadah_id ORDER BY p.id ASC ")->fetchAll(); } else { $rows = $pdo->query("SELECT * FROM pemukiman_miskin_points ORDER BY id ASC")->fetchAll(); } } catch (Exception $e) {} render_header('Admin Penduduk Miskin'); ?>