190 lines
8.1 KiB
PHP
190 lines
8.1 KiB
PHP
<?php
|
|
require_once __DIR__ . '/layout_header.php';
|
|
$db = db();
|
|
|
|
$message = '';
|
|
|
|
// Handle Delete
|
|
if (isset($_GET['delete'])) {
|
|
$id = (int)$_GET['delete'];
|
|
$db->prepare("DELETE FROM pembayaran WHERE id = ?")->execute([$id]);
|
|
$message = '<div class="alert alert-success">Catatan pembayaran berhasil dihapus.</div>';
|
|
}
|
|
|
|
// Handle Add
|
|
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['save_pembayaran'])) {
|
|
$warga_id = $_POST['warga_id'];
|
|
$jenis_iuran_id = $_POST['jenis_iuran_id'];
|
|
$periode_awal = $_POST['periode_awal']; // Format YYYY-MM
|
|
$jumlah_bulan = (int)$_POST['jumlah_bulan'];
|
|
$nominal = (float)$_POST['nominal'];
|
|
$tanggal_bayar = $_POST['tanggal_bayar'];
|
|
$catatan = $_POST['catatan'];
|
|
|
|
try {
|
|
$db->beginTransaction();
|
|
|
|
$current_periode = $periode_awal;
|
|
for ($i = 0; $i < $jumlah_bulan; $i++) {
|
|
// Check if already paid
|
|
$check = $db->prepare("SELECT id FROM pembayaran WHERE warga_id=? AND jenis_iuran_id=? AND periode=?");
|
|
$check->execute([$warga_id, $jenis_iuran_id, $current_periode]);
|
|
|
|
if ($check->fetch()) {
|
|
throw new Exception("Periode $current_periode sudah pernah dibayar untuk warga ini.");
|
|
}
|
|
|
|
$stmt = $db->prepare("INSERT INTO pembayaran (warga_id, jenis_iuran_id, periode, jumlah, tanggal_bayar, catatan) VALUES (?, ?, ?, ?, ?, ?)");
|
|
$stmt->execute([$warga_id, $jenis_iuran_id, $current_periode, $nominal, $tanggal_bayar, $catatan]);
|
|
|
|
// Advance to next month
|
|
$current_periode = date('Y-m', strtotime($current_periode . " +1 month"));
|
|
}
|
|
|
|
$db->commit();
|
|
$message = '<div class="alert alert-success">Pembayaran untuk '.$jumlah_bulan.' periode berhasil dicatat.</div>';
|
|
} catch (Exception $e) {
|
|
$db->rollBack();
|
|
$message = '<div class="alert alert-danger">Gagal: ' . $e->getMessage() . '</div>';
|
|
}
|
|
}
|
|
|
|
// Fetch lists
|
|
$warga_list = $db->query("SELECT id, nama, blok, nomor_rumah FROM warga WHERE status='aktif' ORDER BY nama ASC")->fetchAll();
|
|
$iuran_list = $db->query("SELECT * FROM jenis_iuran ORDER BY nama ASC")->fetchAll();
|
|
|
|
// Pagination or Limit for history
|
|
$history = $db->query("
|
|
SELECT p.*, w.nama as nama_warga, w.blok, w.nomor_rumah, j.nama as nama_iuran
|
|
FROM pembayaran p
|
|
JOIN warga w ON p.warga_id = w.id
|
|
JOIN jenis_iuran j ON p.jenis_iuran_id = j.id
|
|
ORDER BY p.tanggal_bayar DESC, p.id DESC
|
|
LIMIT 100
|
|
")->fetchAll();
|
|
?>
|
|
|
|
<div class="top-bar">
|
|
<h1 class="h3 fw-bold m-0">Pembayaran Iuran</h1>
|
|
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#bayarModal">
|
|
<i class="bi bi-plus-lg"></i> Catat Pembayaran
|
|
</button>
|
|
</div>
|
|
|
|
<?= $message ?>
|
|
|
|
<div class="card">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h2 class="h5 fw-bold m-0">Riwayat Pembayaran Terbaru</h2>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle">
|
|
<thead>
|
|
<tr>
|
|
<th>Tanggal</th>
|
|
<th>Warga</th>
|
|
<th>Iuran</th>
|
|
<th>Periode</th>
|
|
<th>Jumlah</th>
|
|
<th class="text-end">Aksi</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($history as $h): ?>
|
|
<tr>
|
|
<td><?= date('d/m/Y', strtotime($h['tanggal_bayar'])) ?></td>
|
|
<td>
|
|
<div class="fw-bold"><?= htmlspecialchars($h['nama_warga']) ?></div>
|
|
<div class="small text-muted">Blok <?= htmlspecialchars($h['blok']) ?>/<?= htmlspecialchars($h['nomor_rumah']) ?></div>
|
|
</td>
|
|
<td><?= htmlspecialchars($h['nama_iuran']) ?></td>
|
|
<td><span class="badge bg-light text-dark"><?= $h['periode'] ?></span></td>
|
|
<td>Rp <?= number_format($h['jumlah'], 0, ',', '.') ?></td>
|
|
<td class="text-end">
|
|
<a href="?delete=<?= $h['id'] ?>" class="btn btn-sm btn-outline-danger" onclick="return confirm('Yakin ingin menghapus?')">
|
|
<i class="bi bi-trash"></i>
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
<?php if (empty($history)): ?>
|
|
<tr>
|
|
<td colspan="6" class="text-center py-4 text-muted">Belum ada riwayat pembayaran.</td>
|
|
</tr>
|
|
<?php endif; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Modal -->
|
|
<div class="modal fade" id="bayarModal" tabindex="-1">
|
|
<div class="modal-dialog">
|
|
<form method="POST" class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Catat Pembayaran Baru</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="mb-3">
|
|
<label class="form-label">Warga</label>
|
|
<select name="warga_id" class="form-select" required>
|
|
<option value="">-- Pilih Warga --</option>
|
|
<?php foreach ($warga_list as $w): ?>
|
|
<option value="<?= $w['id'] ?>"><?= htmlspecialchars($w['nama']) ?> (<?= $w['blok'] ?>/<?= $w['nomor_rumah'] ?>)</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label">Jenis Iuran</label>
|
|
<select name="jenis_iuran_id" id="select_iuran" class="form-select" required onchange="updateNominal()">
|
|
<option value="">-- Pilih Iuran --</option>
|
|
<?php foreach ($iuran_list as $i): ?>
|
|
<option value="<?= $i['id'] ?>" data-nominal="<?= $i['nominal_default'] ?>"><?= htmlspecialchars($i['nama']) ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label">Mulai Periode</label>
|
|
<input type="month" name="periode_awal" class="form-control" value="<?= date('Y-m') ?>" required>
|
|
</div>
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label">Jumlah Bulan</label>
|
|
<input type="number" name="jumlah_bulan" class="form-control" value="1" min="1" required>
|
|
</div>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label">Nominal per Bulan (Rp)</label>
|
|
<input type="number" name="nominal" id="input_nominal" class="form-control" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label">Tanggal Bayar</label>
|
|
<input type="date" name="tanggal_bayar" class="form-control" value="<?= date('Y-m-d') ?>" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label">Catatan (Opsional)</label>
|
|
<textarea name="catatan" class="form-control" rows="2"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
|
|
<button type="submit" name="save_pembayaran" class="btn btn-primary">Simpan Pembayaran</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function updateNominal() {
|
|
const select = document.getElementById('select_iuran');
|
|
const option = select.options[select.selectedIndex];
|
|
const nominal = option.getAttribute('data-nominal');
|
|
if (nominal) {
|
|
document.getElementById('input_nominal').value = nominal;
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<?php require_once __DIR__ . '/layout_footer.php'; ?>
|