add files and folders

This commit is contained in:
2026-06-10 17:28:32 +07:00
parent 52f4cf86ab
commit 61f4fb2e71
80 changed files with 17551 additions and 0 deletions
+155
View File
@@ -0,0 +1,155 @@
<?php
require_once __DIR__ . '/_layout.php';
require_login(['admin','pengurus']);
$msg = ''; $err = '';
$nikPre = $_GET['nik'] ?? '';
$namaPre = $_GET['nama'] ?? '';
if (isset($_POST['save'])) {
$nik = trim($_POST['nik'] ?? '');
$idJb = (int)($_POST['id_jenis_bantuan'] ?? 0);
$tgl = $_POST['tanggal'] ?? date('Y-m-d');
if (!preg_match('/^\d{16}$/', $nik)) $err = 'NIK tidak valid.';
elseif (!$idJb) $err = 'Jenis bantuan wajib dipilih.';
else {
try {
// Cek penduduk ada
$pddk = $pdo->prepare("SELECT nik,id_keluarga FROM penduduk WHERE nik=:nik AND status_hidup='hidup'");
$pddk->execute([':nik'=>$nik]);
$pddk = $pddk->fetch();
if (!$pddk) throw new Exception("Penduduk dengan NIK $nik tidak ditemukan / meninggal.");
$bukti = null;
if (!empty($_FILES['bukti']['name'])) {
$bukti = uploadFile($_FILES['bukti'], UPLOAD_BUKTI);
}
$stmt = $pdo->prepare("
INSERT INTO histori_bantuan (nik,id_jenis_bantuan,id_keluarga,rumah_ibadah_id,tanggal,jumlah,nilai_rupiah,status_penyaluran,catatan,bukti_file,disalurkan_oleh)
VALUES(:nik,:jb,:kk,:ri,:tgl,:jml,:rp,:status,:cat,:bukti,:user)
");
$stmt->execute([
':nik'=>$nik, ':jb'=>$idJb, ':kk'=>$pddk['id_keluarga'],
':ri'=>$_SESSION['rumah_ibadah_id'] ?: null,
':tgl'=>$tgl, ':jml'=>$_POST['jumlah']??'' ?: null,
':rp'=>$_POST['nilai_rupiah']??'' ?: null,
':status'=>$_POST['status_penyaluran']??'disalurkan',
':cat'=>$_POST['catatan']??'' ?: null,
':bukti'=>$bukti, ':user'=>$_SESSION['user_id'],
]);
logAktivitas($pdo, (int)$_SESSION['user_id'], 'CREATE', 'histori_bantuan', (string)$pdo->lastInsertId());
$msg = "Bantuan untuk NIK $nik berhasil dicatat.";
} catch(Exception $e) { $err = $e->getMessage(); }
}
}
$jenisList = $pdo->query("SELECT * FROM jenis_bantuan WHERE aktif=1 ORDER BY kategori,nama")->fetchAll();
render_header('Catat Bantuan');
?>
<div class="page-title">🎁 Catat Penyaluran Bantuan</div>
<?php if ($msg): ?><div class="notice" style="border-color:#bbf7d0;background:#f0fdf4;color:#166534"><?= h($msg) ?></div><?php endif; ?>
<?php if ($err): ?><div class="notice" style="border-color:#fecaca;background:#fef2f2;color:#991b1b"><?= h($err) ?></div><?php endif; ?>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">
<div>
<div class="card">
<form method="POST" enctype="multipart/form-data">
<div class="form-grid">
<div class="form-group full">
<label>NIK Penerima *</label>
<input name="nik" maxlength="16" value="<?= h($nikPre) ?>" placeholder="16 digit NIK" required onblur="cekPenduduk(this.value)">
</div>
<div class="form-group full" id="info-pddk" style="background:#334155;border-radius:8px;padding:10px;font-size:12px;display:<?= $namaPre?'block':'none' ?>">
<?= $namaPre ? '👤 '.$namaPre : '' ?>
</div>
<div class="form-group full">
<label>Jenis Bantuan *</label>
<select name="id_jenis_bantuan" required>
<option value="">— Pilih —</option>
<?php foreach ($jenisList as $j): ?>
<option value="<?= $j['id'] ?>"><?= h($j['nama']) ?> (<?= h($j['kategori']) ?>)</option>
<?php endforeach; ?>
</select>
</div>
<div class="form-group">
<label>Tanggal *</label>
<input type="date" name="tanggal" required value="<?= date('Y-m-d') ?>">
</div>
<div class="form-group">
<label>Status</label>
<select name="status_penyaluran">
<option value="disalurkan">Disalurkan</option>
<option value="dijadwalkan">Dijadwalkan</option>
</select>
</div>
<div class="form-group">
<label>Jumlah / Keterangan</label>
<input name="jumlah" placeholder="mis: 1 paket sembako">
</div>
<div class="form-group">
<label>Nilai (Rp)</label>
<input type="number" name="nilai_rupiah" placeholder="0">
</div>
<div class="form-group full">
<label>Catatan</label>
<textarea name="catatan" rows="2" placeholder="Opsional"></textarea>
</div>
<div class="form-group full">
<label>Bukti Foto/Dokumen</label>
<input type="file" name="bukti" accept=".jpg,.jpeg,.png,.webp,.pdf">
</div>
</div>
<button type="submit" name="save" value="1" class="btn btn-success" style="margin-top:14px;width:100%">✅ Simpan Bantuan</button>
</form>
</div>
</div>
<div>
<div class="card">
<strong>📋 Bantuan Terakhir Disalurkan</strong>
<table style="margin-top:12px">
<thead><tr><th>Penerima</th><th>Bantuan</th><th>Tanggal</th></tr></thead>
<tbody>
<?php
$recent = $pdo->query("
SELECT p.nama_lengkap, jb.nama AS nama_bantuan, hb.tanggal
FROM histori_bantuan hb
JOIN penduduk p ON p.nik=hb.nik
JOIN jenis_bantuan jb ON jb.id=hb.id_jenis_bantuan
WHERE hb.status_penyaluran='disalurkan'
ORDER BY hb.created_at DESC LIMIT 10
")->fetchAll();
foreach ($recent as $r): ?>
<tr>
<td><?= h($r['nama_lengkap']) ?></td>
<td><?= h($r['nama_bantuan']) ?></td>
<td style="font-size:11px"><?= date('d/m/Y', strtotime($r['tanggal'])) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<script>
async function cekPenduduk(nik) {
if (!/^\d{16}$/.test(nik)) return;
const res = await fetch('../php/api/penduduk.php?action=detail&nik='+nik);
const json = await res.json();
const info = document.getElementById('info-pddk');
if (json.success) {
const p = json.data;
info.style.display = 'block';
info.innerHTML = `👤 <strong>${p.nama_lengkap}</strong> | ${p.umur}th |
<span style="color:${p.status_ekonomi==='miskin'?'#ef4444':'#f59e0b'}">${p.status_ekonomi}</span> |
Sudah dibantu: ${json.histori.length}x`;
} else {
info.style.display = 'block';
info.innerHTML = '<span style="color:#ef4444">❌ NIK tidak ditemukan</span>';
}
}
</script>
<?php render_footer(); ?>