// 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'));
};
})();