// 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 ? 'ແກ້ໄຂລາຍຮັບ' : 'ປ້ອນຂໍ້ມູນລາຍຮັບ'}
ຄັງນ້ອຍ
ລາຍການລາຍຮັບທັງໝົດ
{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)} />
{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 ? 'ແກ້ໄຂລາຍຮັບ' : 'ປ້ອນຂໍ້ມູນລາຍຮັບ'}
ຄັງໃຫຍ່
ລາຍການລາຍຮັບທັງໝົດ
{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 ? 'ແກ້ໄຂລາຍຈ່າຍ' : 'ປ້ອນຂໍ້ມູນລາຍຈ່າຍ'}
ຄັງໃຫຍ່
ລາຍການລາຍຈ່າຍທັງໝົດ
{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 });