feat: add employee timing system, notification templates, and professor class plan sms

This commit is contained in:
2026-08-24 19:31:07 +03:30
parent 53fce86ad5
commit 282dd42422
18 changed files with 1152 additions and 175 deletions
+68 -3
View File
@@ -8,8 +8,9 @@ const PendingStudent = require('../pendingStudents/pendingStudentModel');
const Payment = require('../payments/paymentModel');
const AppError = require('../../utils/AppError');
const { calculateMeta, escapeRegex, getSearchTerm } = require('../../utils/pagination');
const { sendClassRegisteredSms } = require('../../utils/senders/smsMessages');
const { buildClassScheduleContext, normalizeWeekdays, normalizeClockTime, calculateClassEndDate } = require('../../utils/classSchedule');
const { sendClassRegisteredSms, sendClassPlanProfessorSms } = require('../../utils/senders/smsMessages');
const { buildClassScheduleContext, normalizeWeekdays, normalizeClockTime, calculateClassEndDate, formatClassDaysFromIndexes } = require('../../utils/classSchedule');
const { formatJalaliDate } = require('../../utils/jalaliDate');
const { resolveNotifyFlags } = require('../../utils/notifyResolver');
const { notifyAction } = require('../../utils/actionNotify');
const logger = require('../../utils/logger');
@@ -294,4 +295,68 @@ const getPublicOne = async (id) => {
return enrichClassForDisplay(cls);
};
module.exports = { getAll, getOne, create, update, remove, restore, registerUsers, removeUser, getMyClasses, getPublicClasses, getPublicOne };
const sendClassPlanToProfessor = async (classId) => {
const classDoc = await Class.findById(classId)
.populate('course', 'title')
.populate('professor', 'name surname phoneNumber');
if (!classDoc) {
throw new AppError('CLASS_NOT_FOUND', null, 'کلاس یافت نشد.');
}
if (!classDoc.professor) {
throw new AppError('VALIDATION_FAILED', { field: 'professor' }, 'برای این کلاس هیچ استادی تعیین نشده است.');
}
const professor = classDoc.professor;
if (!professor.phoneNumber) {
throw new AppError('VALIDATION_FAILED', { field: 'phoneNumber' }, 'شماره همراه استاد ثبت نشده است.');
}
const profName = `${professor.name || ''} ${professor.surname || ''}`.trim() || 'استاد';
const className = classDoc.name || classDoc.course?.title || 'کلاس';
const classDays = formatClassDaysFromIndexes(classDoc.days) || 'طبق هماهنگی';
const classTimes = (classDoc.startTime && classDoc.endTime)
? `${classDoc.startTime} الی ${classDoc.endTime}`
: (classDoc.startTime || classDoc.endTime || 'طبق هماهنگی');
const classStartDate = classDoc.startDate ? formatJalaliDate(classDoc.startDate) : '';
const classEndDate = classDoc.endDate ? formatJalaliDate(classDoc.endDate) : '';
const slotValues = {
professorName: profName,
className,
classDays,
classTimes,
classStartDate,
classEndDate,
phoneNumber: professor.phoneNumber
};
const result = await sendClassPlanProfessorSms(professor.phoneNumber, slotValues, professor._id);
return {
success: true,
result,
recipient: {
name: profName,
phoneNumber: professor.phoneNumber
},
slotValues
};
};
module.exports = {
getAll,
getOne,
create,
update,
remove,
restore,
registerUsers,
removeUser,
getMyClasses,
getPublicClasses,
getPublicOne,
sendClassPlanToProfessor
};