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
+10 -16
View File
@@ -4,19 +4,7 @@
const mongoose = require('mongoose');
const { getPayableAmount, normalizeDiscount } = require('../../utils/paymentAmount');
const transactionSchema = new mongoose.Schema({
amount: { type: Number, required: true },
method: {
type: String,
enum: ['online', 'card', 'cash'],
default: 'card'
},
receiptNumber: { type: String, trim: true },
notes: { type: String, trim: true, maxlength: 5000 },
recordedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
date: { type: Date, default: Date.now }
}, { _id: true });
require('./transactionModel');
const paymentSchema = new mongoose.Schema({
user: {
@@ -56,13 +44,19 @@ const paymentSchema = new mongoose.Schema({
enum: ['pending', 'partial', 'paid', 'overdue'],
default: 'pending'
},
transactions: [transactionSchema],
notes: { type: String, trim: true, maxlength: 5000 }
}, {
timestamps: true
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true }
});
paymentSchema.virtual('transactions', {
ref: 'Transaction',
localField: '_id',
foreignField: 'payment'
});
// Auto-update status based on paid amount vs payable (amount - discount)
paymentSchema.pre('save', function (next) {
this.discount = normalizeDiscount(this.discount, this.amount);
const payable = getPayableAmount(this);