// modules/kebutuhan.js — Manajemen Kebutuhan per Warga Miskin (F14) (function () { const KATEGORI_ICON = { 'Sembako' : 'shopping-cart', 'Biaya Sekolah' : 'graduation-cap', 'Biaya Kesehatan' : 'heart-pulse', 'Modal Usaha' : 'briefcase', 'Renovasi Rumah' : 'home', 'Perlengkapan Rumah': 'armchair', 'Pakaian' : 'shirt', 'Lainnya' : 'clipboard-list', }; const STATUS_COLOR = { 'Belum Terpenuhi': '#ef4444', 'Dalam Proses' : '#e3b341', 'Terpenuhi' : '#3fb950', }; const KATEGORI_LIST = [ 'Sembako','Biaya Sekolah','Biaya Kesehatan','Modal Usaha', 'Renovasi Rumah','Perlengkapan Rumah','Pakaian','Lainnya', ]; function isOp() { return window.APP_USER && (window.APP_USER.isOp || window.APP_USER.isAdmin); } function esc(str) { const d = document.createElement('div'); d.appendChild(document.createTextNode(str ?? '')); return d.innerHTML; } // ── Bangun seksi kebutuhan untuk popup penduduk ─────────────────────────── window._kebutuhanBuildSection = function (pendudukId, kebutuhanOpen, statusVerifikasi) { const count = parseInt(kebutuhanOpen) || 0; const canMutate = isOp() && statusVerifikasi === 'Terverifikasi'; const badgeHtml = count > 0 ? `${count} Belum Terpenuhi` : ``; const formHtml = canMutate ? ` ` : (isOp() ? `
Menunggu verifikasi admin
` : ''); return `
Kebutuhan ${badgeHtml}
${formHtml}
`; }; // ── Muat dan render daftar kebutuhan ───────────────────────────────────── window._kebutuhanLoad = function (pendudukId) { const body = document.getElementById('kebutuhanBody_' + pendudukId); if (!body) return; const statusVerifikasi = body.dataset.verifikasi || 'Pending'; const canMutate = isOp() && statusVerifikasi === 'Terverifikasi'; body.innerHTML = ' Memuat...'; if (typeof lucide !== 'undefined') lucide.createIcons(); fetch('api/kebutuhan/ambil.php?penduduk_id=' + pendudukId + '&_=' + Date.now(), { cache: 'no-store' }) .then(r => r.json()) .then(j => { if (j.status !== 'success') throw new Error(j.message); const rows = j.data; const openCount = rows.filter(r => r.status === 'Belum Terpenuhi').length; if (typeof window._pendudukRefreshKebutuhanCount === 'function') { window._pendudukRefreshKebutuhanCount(pendudukId, openCount); } if (rows.length === 0) { body.innerHTML = 'Belum ada kebutuhan tercatat.'; return; } body.innerHTML = rows.map(r => { const sc = STATUS_COLOR[r.status] || '#8b949e'; const icon = KATEGORI_ICON[r.kategori] || 'clipboard-list'; const iconHtml = ``; const statusBtns = canMutate ? ['Belum Terpenuhi', 'Dalam Proses', 'Terpenuhi'].map(s => `` ).join('') : `${esc(r.status)}`; return `
${iconHtml} ${esc(r.kategori)}
${r.deskripsi ? `
${esc(r.deskripsi)}
` : ''}
${statusBtns}
`; }).join(''); if (typeof lucide !== 'undefined') lucide.createIcons(); }) .catch(err => { const b = document.getElementById('kebutuhanBody_' + pendudukId); if (b) { b.innerHTML = ` Gagal: ${esc(err.message)}`; if (typeof lucide !== 'undefined') lucide.createIcons(); } }); }; // ── Simpan kebutuhan baru ───────────────────────────────────────────────── window._kebutuhanSimpan = function (pendudukId) { const kat = document.getElementById('kf_kat_' + pendudukId)?.value; const desc = document.getElementById('kf_desc_' + pendudukId)?.value?.trim() || ''; if (!kat) return; const fd = new FormData(); fd.append('penduduk_id', pendudukId); fd.append('kategori', kat); fd.append('deskripsi', desc); fetch('api/kebutuhan/simpan.php', { method: 'POST', body: appendCsrf(fd) }) .then(r => r.json()) .then(j => { if (j.status !== 'success') throw new Error(j.message); const formEl = document.getElementById('kebutuhanForm_' + pendudukId); const btnEl = document.getElementById('btnTambahKebutuhan_' + pendudukId); const descEl = document.getElementById('kf_desc_' + pendudukId); if (formEl) formEl.style.display = 'none'; if (btnEl) btnEl.style.display = ''; if (descEl) descEl.value = ''; window._kebutuhanLoad(pendudukId); if (typeof window.dispatchDataChanged === 'function') { window.dispatchDataChanged('kebutuhan', { pendudukId, mutation: 'create' }); } showToast('Kebutuhan berhasil disimpan.'); }) .catch(err => showToast(err.message || 'Gagal menyimpan kebutuhan.', 'error')); }; // ── Update status kebutuhan ─────────────────────────────────────────────── window._kebutuhanUpdateStatus = function (kebutuhanId, status, pendudukId) { const catatan = prompt('Catatan perubahan kebutuhan (opsional):', ''); if (catatan === null) return; const fd = new FormData(); fd.append('id', kebutuhanId); fd.append('status', status); fd.append('catatan', catatan); fetch('api/kebutuhan/update_status.php', { method: 'POST', body: appendCsrf(fd) }) .then(r => r.json()) .then(j => { if (j.status !== 'success') throw new Error(j.message); window._kebutuhanLoad(pendudukId); if (typeof window.dispatchDataChanged === 'function') { window.dispatchDataChanged('kebutuhan', { pendudukId, kebutuhanId, mutation: 'status' }); } showToast('Status kebutuhan diperbarui.'); }) .catch(err => showToast(err.message || 'Gagal memperbarui status.', 'error')); }; })();