No Tanggal Penanggung Jawab Keterangan Pemasukan Pengeluaran Profit Total Aksi
function formatRupiah(n){ return "Rp " + (n||0).toLocaleString("id-ID"); } function render(){ const tbody=document.querySelector("tbody"); tbody.innerHTML=""; let total=0; data.forEach((d,i)=>{ const profit=d.in-d.out; total+=profit; tbody.innerHTML+=` ${i+1} ${formatRupiah(profit)} ${formatRupiah(total)} `; }); localStorage.setItem("ditabung",JSON.stringify(data)); } function addRow(){ data.push({date:"",pic:"",note:"",in:0,out:0}); render(); } function edit(i,k,v){ data[i][k]=k=="in"||k=="out"?Number(v):v; render(); } function hapus(i){ data.splice(i,1); render(); } function resetData(){ if(confirm("Hapus semua data?")){ data=[]; render(); } } /* DOWNLOAD */ function downloadTXT(){ let t="Ditabung Yokk\n\n"; data.forEach((d,i)=>{ t+=`${i+1}. ${d.date} | ${d.pic} | ${d.note} | +${d.in} -${d.out}\n`; }); saveFile(t,"laporan.txt","text/plain"); } function downloadWORD(){ let html="

Laporan Ditabung

"; data.forEach((d,i)=>{ html+=``; }); html+="
NoTanggalPJKetMasukKeluar
${i+1}${d.date}${d.pic}${d.note}${d.in}${d.out}
"; saveFile(html,"laporan.doc","application/msword"); } function downloadEXCEL(){ let csv="No,Tanggal,PJ,Keterangan,Pemasukan,Pengeluaran\n"; data.forEach((d,i)=>{ csv+=`${i+1},${d.date},${d.pic},${d.note},${d.in},${d.out}\n`; }); saveFile(csv,"laporan.xls","application/vnd.ms-excel"); } function downloadPDF(){ window.print(); } function saveFile(content,name,type){ const a=document.createElement("a"); a.href=URL.createObjectURL(new Blob([content],{type:type})); a.download=name; a.click(); } render();