64 lines
1.7 KiB
JavaScript
64 lines
1.7 KiB
JavaScript
'use strict';
|
|
|
|
const mongoose = require('mongoose');
|
|
const uniqueCodePlugin = require('../../utils/mongooseUniqueCodePlugin');
|
|
|
|
const pendingStudentSchema = new mongoose.Schema({
|
|
user: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User',
|
|
required: true,
|
|
index: true
|
|
},
|
|
class: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'Class',
|
|
required: true,
|
|
index: true
|
|
},
|
|
course: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'Course',
|
|
required: true
|
|
},
|
|
type: {
|
|
type: String,
|
|
enum: ['enrollment', 'class_request'],
|
|
required: true
|
|
},
|
|
paymentPlan: {
|
|
type: String,
|
|
enum: ['full', 'installments', 'deposit'],
|
|
required: true
|
|
},
|
|
tuitionFee: { type: Number, required: true, min: 0 },
|
|
classDiscount: { type: Number, default: 0, min: 0 },
|
|
paymentDiscount: { type: Number, default: 0, min: 0 },
|
|
totalAmount: { type: Number, required: true, min: 0 },
|
|
amountDueNow: { type: Number, required: true, min: 0 },
|
|
secondInstallmentAmount: { type: Number, default: 0, min: 0 },
|
|
secondInstallmentDueDate: { type: Date },
|
|
status: {
|
|
type: String,
|
|
enum: ['pending_payment', 'pending_review', 'approved', 'rejected', 'cancelled'],
|
|
default: 'pending_review',
|
|
index: true
|
|
},
|
|
payment: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'Payment'
|
|
},
|
|
paymentReference: { type: String, trim: true },
|
|
adminNotes: { type: String, trim: true, maxlength: 2000 },
|
|
reviewedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
|
|
reviewedAt: { type: Date }
|
|
}, {
|
|
timestamps: true
|
|
});
|
|
|
|
pendingStudentSchema.plugin(uniqueCodePlugin);
|
|
|
|
pendingStudentSchema.index({ user: 1, class: 1, type: 1, status: 1 });
|
|
|
|
module.exports = mongoose.model('PendingStudent', pendingStudentSchema);
|