const Keluarga = (() => {
let all = [], editId = null;
const DEMO = [
{ id:1, no_kk:'6171010101010001', nama_kepala:'Ahmad Suryana', kecamatan:'Pontianak Timur', kelurahan:'Dalam Bugis', jumlah_anggota:3, total_penghasilan:900000, nama_ri:"Masjid Jami'", status_ekonomi:'miskin', total_bantuan:2 },
{ id:2, no_kk:'6171010101010002', nama_kepala:'Samsul Bahri', kecamatan:'Pontianak Kota', kelurahan:'Sungai Bangkong',jumlah_anggota:2,total_penghasilan:1700000, nama_ri:"Masjid Jami'", status_ekonomi:'rentan', total_bantuan:0 },
{ id:3, no_kk:'6171010101010003', nama_kepala:'Maria Magdalena', kecamatan:'Pontianak Selatan', kelurahan:'Akcaya', jumlah_anggota:3, total_penghasilan:800000, nama_ri:'Katedral', status_ekonomi:'miskin', total_bantuan:1 },
{ id:4, no_kk:'6171010101010004', nama_kepala:'Hendra Wijaya', kecamatan:'Pontianak Selatan', kelurahan:'Parit Tokaya', jumlah_anggota:2, total_penghasilan:1500000, nama_ri:'Mujahidin', status_ekonomi:'rentan', total_bantuan:0 },
{ id:5, no_kk:'6171010101010005', nama_kepala:'Lim Ah Kow', kecamatan:'Pontianak Kota', kelurahan:'Darat Sekip', jumlah_anggota:2, total_penghasilan:700000, nama_ri:'Vihara', status_ekonomi:'miskin', total_bantuan:1 },
{ id:6, no_kk:'6171010101010006', nama_kepala:'Mulyadi', kecamatan:'Pontianak Timur', kelurahan:'Dalam Bugis', jumlah_anggota:2, total_penghasilan:4500000, nama_ri:"Masjid Jami'", status_ekonomi:'mampu', total_bantuan:0 },
{ id:7, no_kk:'6171010101010007', nama_kepala:'Yohanes Kristian',kecamatan:'Pontianak Selatan', kelurahan:'Akcaya', jumlah_anggota:2, total_penghasilan:1100000, nama_ri:'Katedral', status_ekonomi:'rentan', total_bantuan:0 },
{ id:8, no_kk:'6171010101010008', nama_kepala:'Tan Eng Huat', kecamatan:'Pontianak Kota', kelurahan:'Pontianak Kota',jumlah_anggota:1,total_penghasilan:600000, nama_ri:'Klenteng', status_ekonomi:'miskin', total_bantuan:1 },
];
async function load() {
try { all = await Api.get('/keluarga'); } catch { all = DEMO; }
applyFilter();
}
function search(q) { applyFilter(); }
function applyFilter() {
const q = gv('kf-search');
const ek = gv('kf-ekonomi');
const data = all.filter(k =>
(!q || k.nama_kepala?.toLowerCase().includes(q.toLowerCase()) || k.no_kk?.includes(q)) &&
(!ek || k.status_ekonomi === ek)
);
render(data);
}
function render(data) {
const tb = ge('tbody-keluarga');
if (!data.length) { tb.innerHTML = '
|
'; return; }
tb.innerHTML = data.map(k => `
| ${k.no_kk} |
${k.nama_kepala} ${k.kelurahan||''} |
${k.kecamatan||'—'} |
${k.jumlah_anggota||0} |
${rp(k.total_penghasilan)} |
${k.nama_ri||'—'} |
${bdg(k.status_ekonomi,'')} |
${k.total_bantuan > 0
? `✅ ${k.total_bantuan}x`
: `❌ Belum`}
|
${App.canEdit() ? `
` : ''}
|
`).join('');
}
async function showForm(id = null) {
editId = id;
ge('mk-title').textContent = id ? '✏️ Edit Data Keluarga' : '🏠 Tambah Kartu Keluarga';
ge('fk-nokk').readOnly = !!id;
// Load RI dropdown
try {
const riList = await Api.get('/rumah-ibadah');
ge('fk-ri').innerHTML = '' +
riList.map(r => ``).join('');
} catch {
ge('fk-ri').innerHTML = '';
}
if (id) {
const k = all.find(x => x.id == id) || {};
sv('fk-nokk', k.no_kk); sv('fk-kepala', k.nama_kepala);
sv('fk-alamat', k.alamat); sv('fk-kecamatan', k.kecamatan);
sv('fk-kelurahan', k.kelurahan); sv('fk-ekonomi', k.status_ekonomi || 'rentan');
sv('fk-lat', k.lat); sv('fk-lng', k.lng);
if (k.id_rumah_ibadah) sv('fk-ri', k.id_rumah_ibadah);
} else {
['fk-nokk','fk-kepala','fk-alamat','fk-kecamatan','fk-kelurahan','fk-lat','fk-lng'].forEach(i => sv(i,''));
sv('fk-ekonomi','rentan');
}
App.showModal('modal-keluarga');
}
async function save() {
const nokk = gv('fk-nokk');
if (!nokk || nokk.length !== 16) { App.toast('No. KK harus 16 digit','error'); return; }
if (!gv('fk-kepala')) { App.toast('Nama kepala wajib diisi','error'); return; }
const body = {
no_kk: nokk, nama_kepala: gv('fk-kepala'),
id_rumah_ibadah: gv('fk-ri') || null,
alamat: gv('fk-alamat'), kecamatan: gv('fk-kecamatan'),
kelurahan: gv('fk-kelurahan'), status_ekonomi: gv('fk-ekonomi'),
lat: gv('fk-lat') || null, lng: gv('fk-lng') || null,
};
try {
if (editId) { await Api.put(`/keluarga/${editId}`, body); App.toast('Data KK diperbarui ✅','success'); }
else { await Api.post('/keluarga', body); App.toast('KK ditambahkan ✅','success'); }
App.closeModal('modal-keluarga');
load();
} catch(e) { App.toast(e.message,'error'); }
}
async function hapus(id) {
if (!confirm('Hapus data keluarga ini?\nPastikan semua anggota sudah dipindah atau dihapus.')) return;
try { await Api.delete(`/keluarga/${id}`); App.toast('Data KK dihapus','success'); load(); }
catch(e) { App.toast(e.message,'error'); }
}
async function showAnggota(id) {
const k = all.find(x => x.id == id);
let anggota = [];
try {
const detail = await Api.get(`/keluarga/${id}`);
anggota = detail.anggota || [];
} catch {
anggota = [];
}
if (!anggota.length) { App.toast('Tidak ada data anggota (atau belum terhubung ke API)','info'); return; }
// Tampilkan dalam alert atau panel detail
const info = anggota.map(a => `• ${a.nama_lengkap} (${a.umur}th) — ${cap(a.status_keluarga)} — ${a.status_ekonomi}`).join('\n');
alert(`Anggota KK: ${k?.nama_kepala}\n\n${info}`);
}
return { load, search, applyFilter, showForm, save, hapus, showAnggota };
})();