Files
gameno-api/components/classes/classModel.js
T
kavehhn 0d57854dc3 Add class numberOfSessions and fix attendance completion detection.
Sessions with full student attendance are now excluded from the pending list reliably by loading class rosters from the database.
2026-08-16 08:55:03 +03:30

102 lines
1.6 KiB
JavaScript

// /components/classes/classModel.js
'use strict';
const mongoose = require('mongoose');
const classSchema = new mongoose.Schema({
name: {
type: String,
required: true,
trim: true
},
course: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Course',
required: true
},
professor: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Professor'
},
students: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}],
capacity: {
type: Number,
default: 30
},
tuitionFee: {
type: Number,
default: 0
},
hasDiscount: {
type: Boolean,
default: false
},
discount: {
type: Number,
default: 0,
min: 0
},
freeSpots: {
type: Number,
min: 0,
default: null
},
showOnFrontend: {
type: Boolean,
default: true,
index: true
},
startDate: {
type: Date
},
endDate: {
type: Date
},
days: {
type: [{
type: Number,
min: 0,
max: 6
}],
default: []
},
startTime: {
type: String,
trim: true,
default: ''
},
endTime: {
type: String,
trim: true,
default: ''
},
numberOfSessions: {
type: Number,
min: 1,
default: null
},
isActive: {
type: Boolean,
default: true
},
adminNotes: {
type: [String],
default: []
}
}, {
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true }
});
classSchema.virtual('finalTuitionFee').get(function () {
const tuition = this.tuitionFee || 0;
if (!this.hasDiscount) return tuition;
return Math.max(0, tuition - (this.discount || 0));
});
module.exports = mongoose.model('Class', classSchema);