feat: store payment installments in a transactions collection

Move embedded payment rows into Transaction documents with due dates so remaining tuition can be tracked separately from paid amounts.
This commit is contained in:
2026-08-16 07:32:27 +03:30
parent b4ca5678bf
commit 06efcd5b90
7 changed files with 341 additions and 53 deletions
+26 -1
View File
@@ -22,9 +22,34 @@ const sanitizeNotes = (notes) => {
return String(notes).trim().slice(0, NOTES_MAX_LENGTH);
};
const rialsToToman = (value) => Math.floor(toNonNegativeNumber(value) / 10);
const isPaidTransaction = (trx = {}) => {
const status = String(trx.status || '').toLowerCase();
if (status === 'pending') return false;
if (status === 'paid') return true;
return Boolean(trx.date);
};
const sumPaidTransactions = (transactions = []) => {
if (!Array.isArray(transactions)) return 0;
return transactions.reduce((sum, trx) => {
if (!isPaidTransaction(trx)) return sum;
return sum + toNonNegativeNumber(trx.amount);
}, 0);
};
const remainingPayable = (payment = {}, transactions = []) => {
return Math.max(0, getPayableAmount(payment) - sumPaidTransactions(transactions));
};
module.exports = {
NOTES_MAX_LENGTH,
getPayableAmount,
normalizeDiscount,
sanitizeNotes
sanitizeNotes,
rialsToToman,
isPaidTransaction,
sumPaidTransactions,
remainingPayable
};