+
+
+
${canEditMiskin ? `` : ''}
${canEditMiskin ? `` : ''}
@@ -711,6 +834,128 @@
setTimeout(() => t.remove(), 3000);
}
+ // ── ANGGOTA KELUARGA ───────────────────────────────────────────────────
+ let currentAnggotaRumah = null;
+ const canEditAnggota = {{ auth()->user()->hasRole('administrator') || auth()->user()->hasRole('petugas_pendataan') ? 'true' : 'false' }};
+
+ async function openAnggotaModal(idRumah) {
+ currentAnggotaRumah = idRumah;
+ const rm = miskinData.find(m => m.id_rumah === idRumah);
+ document.getElementById('anggota_rumah_label').textContent = `ID: ${idRumah} — ${rm?.nama_kk || '-'}`;
+ document.getElementById('modal_anggota').showModal();
+ await loadAnggota(idRumah);
+ }
+
+ async function loadAnggota(idRumah) {
+ const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(idRumah)}/anggota`, { headers: { 'X-CSRF-TOKEN': csrfToken } });
+ const list = await res.json();
+ document.getElementById('bodyAnggota').innerHTML = list.length ? list.map(a => `
+
+ | ${esc(a.nama)} |
+ ${esc(a.hubungan.replace('_', ' '))} |
+ ${a.jenis_kelamin === 'laki_laki' ? 'L' : a.jenis_kelamin === 'perempuan' ? 'P' : '-'} |
+ ${a.umur !== null ? esc(String(a.umur)) + ' th' : '-'} |
+ ${a.pendidikan ? esc(a.pendidikan.replace(/_/g, ' ')) : '-'} |
+ ${esc(a.status_hidup)} |
+ ${canEditAnggota ? `` : ''} |
+
`).join('')
+ : '
| Belum ada anggota |
';
+ }
+
+ async function simpanAnggota() {
+ const body = {
+ nama: document.getElementById('anggota_nama').value.trim(),
+ hubungan: document.getElementById('anggota_hubungan').value,
+ jenis_kelamin: document.getElementById('anggota_kelamin').value || null,
+ tanggal_lahir: document.getElementById('anggota_tgl_lahir').value || null,
+ pendidikan: document.getElementById('anggota_pendidikan').value || null,
+ status_hidup: document.getElementById('anggota_status').value,
+ };
+ if (!body.nama) { showToast('Nama wajib diisi', 'error'); return; }
+ const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(currentAnggotaRumah)}/anggota`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken },
+ body: JSON.stringify(body),
+ });
+ const json = await res.json();
+ if (json.success) { showToast('Anggota ditambahkan', 'success'); loadAnggota(currentAnggotaRumah); }
+ else showToast('Gagal menambah anggota', 'error');
+ }
+
+ async function deleteAnggota(id) {
+ if (!confirm('Hapus anggota ini?')) return;
+ const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(currentAnggotaRumah)}/anggota/${id}`, {
+ method: 'DELETE', headers: { 'X-CSRF-TOKEN': csrfToken },
+ });
+ const json = await res.json();
+ if (json.success) { showToast('Anggota dihapus', 'success'); loadAnggota(currentAnggotaRumah); }
+ else showToast('Gagal hapus', 'error');
+ }
+
+ // ── RIWAYAT BANTUAN ────────────────────────────────────────────────────
+ let currentBantuanRumah = null;
+ const canDeleteBantuan = {{ auth()->user()->hasRole('administrator') ? 'true' : 'false' }};
+
+ async function openBantuanModal(idRumah) {
+ currentBantuanRumah = idRumah;
+ const rm = miskinData.find(m => m.id_rumah === idRumah);
+ document.getElementById('bantuan_rumah_label').textContent = `ID: ${idRumah} — ${rm?.nama_kk || '-'}`;
+
+ const sel = document.getElementById('bantuan_ibadah');
+ if (sel) {
+ sel.innerHTML = '
' +
+ ibadahData.map(ib => `
`).join('');
+ }
+
+ const tgl = document.getElementById('bantuan_tanggal');
+ if (tgl) tgl.value = new Date().toISOString().split('T')[0];
+
+ document.getElementById('modal_bantuan').showModal();
+ await loadBantuan(idRumah);
+ }
+
+ async function loadBantuan(idRumah) {
+ const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(idRumah)}/bantuan`, { headers: { 'X-CSRF-TOKEN': csrfToken } });
+ const list = await res.json();
+ document.getElementById('bodyBantuan').innerHTML = list.length ? list.map(b => `
+
+ | ${esc(b.tanggal_bantuan)} |
+ ${esc(b.jenis_bantuan)} |
+ ${esc(b.ibadah_nama || '-')} |
+ ${esc(b.pencatat_nama)} |
+ ${canDeleteBantuan ? `` : ''} |
+
`).join('')
+ : '
| Belum ada riwayat bantuan |
';
+ }
+
+ async function simpanBantuan() {
+ const body = {
+ jenis_bantuan: document.getElementById('bantuan_jenis').value.trim(),
+ tanggal_bantuan: document.getElementById('bantuan_tanggal').value,
+ keterangan: document.getElementById('bantuan_ket').value.trim() || null,
+ ibadah_id: document.getElementById('bantuan_ibadah').value || null,
+ };
+ if (!body.jenis_bantuan || !body.tanggal_bantuan) { showToast('Jenis bantuan dan tanggal wajib diisi', 'error'); return; }
+ const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(currentBantuanRumah)}/bantuan`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken },
+ body: JSON.stringify(body),
+ });
+ const json = await res.json();
+ if (json.success) { showToast('Bantuan dicatat', 'success'); loadBantuan(currentBantuanRumah); }
+ else showToast('Gagal menyimpan bantuan', 'error');
+ }
+
+ async function deleteBantuan(id) {
+ if (!confirm('Hapus riwayat bantuan ini?')) return;
+ const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(currentBantuanRumah)}/bantuan/${id}`, {
+ method: 'DELETE', headers: { 'X-CSRF-TOKEN': csrfToken },
+ });
+ const json = await res.json();
+ if (json.success) { showToast('Bantuan dihapus', 'success'); loadBantuan(currentBantuanRumah); }
+ else showToast('Gagal hapus', 'error');
+ }
+
// ── NOTIFIKASI PERUBAHAN DATA ────────────────────────────────────────
(function initNotifPolling() {
const POLL_MS = 30000;