// 4 management pages: small income / small expense / big income / big expense // ====== ຄັງນ້ອຍ ລາຍຮັບ ====== function SmallIncomePage({ store, setStore, toast }) { const EMPTY_AMTS = { kip: '', baht: '', usd: '', yuan: '' }; const [donor, setDonor] = useState(''); const [nameI, setNameI] = useState(''); const [date, setDate] = useState(todayISO()); const [amts, setAmts] = useState(EMPTY_AMTS); const [editId, setEditId] = useState(null); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const useDropdown = donor !== ''; const useManual = nameI.trim() !== ''; const startEdit = (row) => { const inList = store.donors.includes(row.donor); setDonor(inList ? row.donor : ''); setNameI(inList ? '' : row.donor); setDate(row.date); setAmts({ kip: row.kip || '', baht: row.baht || '', usd: row.usd || '', yuan: row.yuan || '' }); setEditId(row.id); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const cancelEdit = () => { setEditId(null); setDonor(''); setNameI(''); setDate(todayISO()); setAmts(EMPTY_AMTS); }; const submit = () => { const finalDonor = useDropdown ? donor : nameI.trim(); if (!finalDonor) { toast('ກະລຸນາເລືອກ ຫຼື ປ້ອນຊື່ເຈົ້າສັດທາ'); return; } if (!date) { toast('ກະລຸນາເລືອກວັນທີ'); return; } if (!CURRENCIES.some(c => Number(amts[c.code]) > 0)) { toast('ກະລຸນາປ້ອນຈຳນວນເງິນຢ່າງໜ້ອຍ 1 ສະກຸນ'); return; } const values = { date, donor: finalDonor, kip: Number(amts.kip)||0, baht: Number(amts.baht)||0, usd: Number(amts.usd)||0, yuan: Number(amts.yuan)||0 }; const nextDonors = (!useDropdown && nameI.trim() && !store.donors.includes(nameI.trim())) ? [nameI.trim(), ...store.donors] : store.donors; if (editId) { setStore({ ...store, smallIncome: store.smallIncome.map(r => r.id === editId ? { ...r, ...values } : r), donors: nextDonors }); toast('ອັບເດດລາຍຮັບແລ້ວ'); } else { setStore({ ...store, smallIncome: [{ id: uid(), ...values }, ...store.smallIncome], donors: nextDonors }); setPage(1); toast('ບັນທຶກລາຍຮັບສຳເລັດ'); } cancelEdit(); }; const remove = (id) => { setStore({ ...store, smallIncome: store.smallIncome.filter(r => r.id !== id) }); toast('ລຶບລາຍການແລ້ວ'); }; const totals = sumCurr(store.smallIncome); const q = search.trim().toLowerCase(); const rows = q ? store.smallIncome.filter(r => r.donor.toLowerCase().includes(q) || r.date.includes(q) ) : store.smallIncome; const slice = rows.slice((page - 1) * PER_PAGE, page * PER_PAGE); return (
ຄັງນ້ອຍ

ຈັດການລາຍຮັບ

ບັນທຶກເງິນທີ່ໄດ້ຮັບຈາກເຈົ້າສັດທາໃນແຕ່ລະວັນ

{editId ? 'ແກ້ໄຂລາຍຮັບ' : 'ປ້ອນຂໍ້ມູນລາຍຮັບ'}

ຄັງນ້ອຍ
setNameI(e.target.value)} />
setDate(e.target.value)} />
{editId && ( )}

ລາຍການລາຍຮັບທັງໝົດ

{rows.length} ລາຍການ {store.smallIncome.length > 0 && ( )}
{ setSearch(e.target.value); setPage(1); }} /> {search && }
{rows.length === 0 ? (
) : ( <>
{slice.map((r, i) => ( ))}
#ວັນທີເຈົ້າສັດທາ ກີບບາດ ໂດລາຢວນ
{(page - 1) * PER_PAGE + i + 1} {fmtDate(r.date)} {r.donor} {fmt(r.kip)} {fmt(r.baht)} {fmt(r.usd)} {fmt(r.yuan)}
)}
); } // ====== ຄັງນ້ອຍ ລາຍຈ່າຍ ====== function SmallExpensePage({ store, setStore, toast }) { const EMPTY_AMTS = { kip: '', baht: '', usd: '', yuan: '' }; const [item, setItem] = useState(''); const [nameI, setNameI] = useState(''); const [date, setDate] = useState(todayISO()); const [qty, setQty] = useState('1'); const [amts, setAmts] = useState(EMPTY_AMTS); const [editId, setEditId] = useState(null); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const useDropdown = item !== ''; const useManual = nameI.trim() !== ''; const startEdit = (row) => { const inList = store.expenseItemsSmall.includes(row.item); setItem(inList ? row.item : ''); setNameI(inList ? '' : row.item); setDate(row.date); setQty(String(row.qty || 1)); setAmts({ kip: row.kip || '', baht: row.baht || '', usd: row.usd || '', yuan: row.yuan || '' }); setEditId(row.id); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const cancelEdit = () => { setEditId(null); setItem(''); setNameI(''); setDate(todayISO()); setQty('1'); setAmts(EMPTY_AMTS); }; const submit = () => { const final = useDropdown ? item : nameI.trim(); if (!final) { toast('ກະລຸນາເລືອກ ຫຼື ປ້ອນລາຍການ'); return; } if (!date) { toast('ກະລຸນາເລືອກວັນທີ'); return; } if (!CURRENCIES.some(c => Number(amts[c.code]) > 0)) { toast('ກະລຸນາປ້ອນຈຳນວນເງິນຢ່າງໜ້ອຍ 1 ສະກຸນ'); return; } const values = { date, item: final, qty: Number(qty)||1, kip: Number(amts.kip)||0, baht: Number(amts.baht)||0, usd: Number(amts.usd)||0, yuan: Number(amts.yuan)||0 }; const nextItems = (!useDropdown && nameI.trim() && !store.expenseItemsSmall.includes(nameI.trim())) ? [nameI.trim(), ...store.expenseItemsSmall] : store.expenseItemsSmall; if (editId) { setStore({ ...store, smallExpense: store.smallExpense.map(r => r.id === editId ? { ...r, ...values } : r), expenseItemsSmall: nextItems }); toast('ອັບເດດລາຍຈ່າຍແລ້ວ'); } else { setStore({ ...store, smallExpense: [{ id: uid(), ...values }, ...store.smallExpense], expenseItemsSmall: nextItems }); setPage(1); toast('ບັນທຶກລາຍຈ່າຍສຳເລັດ'); } cancelEdit(); }; const remove = (id) => { setStore({ ...store, smallExpense: store.smallExpense.filter(r => r.id !== id) }); toast('ລຶບລາຍການແລ້ວ'); }; const totals = sumCurr(store.smallExpense); const q = search.trim().toLowerCase(); const rows = q ? store.smallExpense.filter(r => r.item.toLowerCase().includes(q) || r.date.includes(q) ) : store.smallExpense; const slice = rows.slice((page - 1) * PER_PAGE, page * PER_PAGE); return (
ຄັງນ້ອຍ

ຈັດການລາຍຈ່າຍ

ບັນທຶກຄ່າໃຊ້ຈ່າຍປະຈຳວັນຂອງວັດ

{editId ? 'ແກ້ໄຂລາຍຈ່າຍ' : 'ປ້ອນຂໍ້ມູນລາຍຈ່າຍ'}

ຄັງນ້ອຍ
setNameI(e.target.value)} />
setDate(e.target.value)} />
setQty(e.target.value)} />
{editId && ( )}

ລາຍການລາຍຈ່າຍທັງໝົດ

{rows.length} ລາຍການ {store.smallExpense.length > 0 && ( )}
{ setSearch(e.target.value); setPage(1); }} /> {search && }
{rows.length === 0 ? (
) : ( <>
{slice.map((r, i) => ( ))}
#ວັນທີລາຍການຈຳນວນ ກີບບາດ ໂດລາຢວນ
{(page - 1) * PER_PAGE + i + 1} {fmtDate(r.date)} {r.item} {r.qty} {fmt(r.kip)} {fmt(r.baht)} {fmt(r.usd)} {fmt(r.yuan)}
)}
); } // ====== ຄັງໃຫຍ່ ລາຍຮັບ ====== function BigIncomePage({ store, setStore, toast }) { const EMPTY_AMTS = { kip: '', baht: '', usd: '', yuan: '' }; const [event, setEvent] = useState(''); const [date, setDate] = useState(todayISO()); const [amts, setAmts] = useState(EMPTY_AMTS); const [editId, setEditId] = useState(null); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const startEdit = (row) => { setEvent(row.event); setDate(row.date); setAmts({ kip: row.kip || '', baht: row.baht || '', usd: row.usd || '', yuan: row.yuan || '' }); setEditId(row.id); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const cancelEdit = () => { setEditId(null); setEvent(''); setDate(todayISO()); setAmts(EMPTY_AMTS); }; const submit = () => { if (!event.trim()) { toast('ກະລຸນາປ້ອນລາຍການງານບຸນ'); return; } if (!date) { toast('ກະລຸນາເລືອກວັນທີ'); return; } if (!CURRENCIES.some(c => Number(amts[c.code]) > 0)) { toast('ກະລຸນາປ້ອນຈຳນວນເງິນຢ່າງໜ້ອຍ 1 ສະກຸນ'); return; } const values = { date, event: event.trim(), kip: Number(amts.kip)||0, baht: Number(amts.baht)||0, usd: Number(amts.usd)||0, yuan: Number(amts.yuan)||0 }; if (editId) { setStore({ ...store, bigIncome: store.bigIncome.map(r => r.id === editId ? { ...r, ...values } : r) }); toast('ອັບເດດລາຍຮັບງານບຸນແລ້ວ'); } else { setStore({ ...store, bigIncome: [{ id: uid(), ...values }, ...store.bigIncome] }); setPage(1); toast('ບັນທຶກລາຍຮັບງານບຸນແລ້ວ'); } cancelEdit(); }; const remove = (id) => { setStore({ ...store, bigIncome: store.bigIncome.filter(r => r.id !== id) }); toast('ລຶບລາຍການແລ້ວ'); }; const totals = sumCurr(store.bigIncome); const q = search.trim().toLowerCase(); const rows = q ? store.bigIncome.filter(r => r.event.toLowerCase().includes(q) || r.date.includes(q) ) : store.bigIncome; const slice = rows.slice((page - 1) * PER_PAGE, page * PER_PAGE); return (
ຄັງໃຫຍ່

ຈັດການລາຍຮັບ

ບັນທຶກລາຍຮັບຈາກງານບຸນ ແລະ ກິດຈະກຳໃຫຍ່

{editId ? 'ແກ້ໄຂລາຍຮັບ' : 'ປ້ອນຂໍ້ມູນລາຍຮັບ'}

ຄັງໃຫຍ່
setEvent(e.target.value)} />
setDate(e.target.value)} />
{editId && ( )}

ລາຍການລາຍຮັບທັງໝົດ

{rows.length} ລາຍການ {store.bigIncome.length > 0 && ( )}
{ setSearch(e.target.value); setPage(1); }} /> {search && }
{rows.length === 0 ? (
) : ( <>
{slice.map((r, i) => ( ))}
#ວັນທີງານບຸນ ກີບບາດ ໂດລາຢວນ
{(page - 1) * PER_PAGE + i + 1} {fmtDate(r.date)} {r.event} {fmt(r.kip)} {fmt(r.baht)} {fmt(r.usd)} {fmt(r.yuan)}
)}
); } // ====== ຄັງໃຫຍ່ ລາຍຈ່າຍ ====== function BigExpensePage({ store, setStore, toast }) { const EMPTY_AMTS = { kip: '', baht: '', usd: '', yuan: '' }; const [item, setItem] = useState(''); const [date, setDate] = useState(todayISO()); const [qty, setQty] = useState('1'); const [amts, setAmts] = useState(EMPTY_AMTS); const [editId, setEditId] = useState(null); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const startEdit = (row) => { setItem(row.item); setDate(row.date); setQty(String(row.qty || 1)); setAmts({ kip: row.kip || '', baht: row.baht || '', usd: row.usd || '', yuan: row.yuan || '' }); setEditId(row.id); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const cancelEdit = () => { setEditId(null); setItem(''); setDate(todayISO()); setQty('1'); setAmts(EMPTY_AMTS); }; const submit = () => { if (!item.trim()) { toast('ກະລຸນາປ້ອນຊື່ລາຍການ'); return; } if (!date) { toast('ກະລຸນາເລືອກວັນທີ'); return; } if (!CURRENCIES.some(c => Number(amts[c.code]) > 0)) { toast('ກະລຸນາປ້ອນຈຳນວນເງິນຢ່າງໜ້ອຍ 1 ສະກຸນ'); return; } const values = { date, item: item.trim(), qty: Number(qty)||1, kip: Number(amts.kip)||0, baht: Number(amts.baht)||0, usd: Number(amts.usd)||0, yuan: Number(amts.yuan)||0 }; if (editId) { setStore({ ...store, bigExpense: store.bigExpense.map(r => r.id === editId ? { ...r, ...values } : r) }); toast('ອັບເດດລາຍຈ່າຍແລ້ວ'); } else { setStore({ ...store, bigExpense: [{ id: uid(), ...values }, ...store.bigExpense] }); setPage(1); toast('ບັນທຶກລາຍຈ່າຍແລ້ວ'); } cancelEdit(); }; const remove = (id) => { setStore({ ...store, bigExpense: store.bigExpense.filter(r => r.id !== id) }); toast('ລຶບລາຍການແລ້ວ'); }; const totals = sumCurr(store.bigExpense); const q = search.trim().toLowerCase(); const rows = q ? store.bigExpense.filter(r => r.item.toLowerCase().includes(q) || r.date.includes(q) ) : store.bigExpense; const slice = rows.slice((page - 1) * PER_PAGE, page * PER_PAGE); return (
ຄັງໃຫຍ່

ຈັດການລາຍຈ່າຍ

ບັນທຶກຄ່າໃຊ້ຈ່າຍງານບຸນ ແລະ ການກໍ່ສ້າງ

{editId ? 'ແກ້ໄຂລາຍຈ່າຍ' : 'ປ້ອນຂໍ້ມູນລາຍຈ່າຍ'}

ຄັງໃຫຍ່
setItem(e.target.value)} />
setDate(e.target.value)} />
setQty(e.target.value)} />
{editId && ( )}

ລາຍການລາຍຈ່າຍທັງໝົດ

{rows.length} ລາຍການ {store.bigExpense.length > 0 && ( )}
{ setSearch(e.target.value); setPage(1); }} /> {search && }
{rows.length === 0 ? (
) : ( <>
{slice.map((r, i) => ( ))}
#ວັນທີລາຍການຈຳນວນ ກີບບາດ ໂດລາຢວນ
{(page - 1) * PER_PAGE + i + 1} {fmtDate(r.date)} {r.item} {r.qty} {fmt(r.kip)} {fmt(r.baht)} {fmt(r.usd)} {fmt(r.yuan)}
)}
); } Object.assign(window, { SmallIncomePage, SmallExpensePage, BigIncomePage, BigExpensePage });