feat: add employee timing system, notification templates, and professor class plan sms
This commit is contained in:
@@ -59,3 +59,8 @@ exports.getPublicOne = catchAsync(async (req, res) => {
|
||||
const cls = await classService.getPublicOne(req.params.id);
|
||||
return successResponse(res, 200, 'Class retrieved successfully', cls);
|
||||
});
|
||||
|
||||
exports.sendClassPlanToProfessor = catchAsync(async (req, res) => {
|
||||
const result = await classService.sendClassPlanToProfessor(req.params.id);
|
||||
return successResponse(res, 200, 'برنامه کلاس با موفقیت برای استاد ارسال شد.', result);
|
||||
});
|
||||
|
||||
@@ -27,5 +27,6 @@ router.delete('/admin/delete/:id', perm.requires([PERMISSIONS.CLASSES_DELETE, PE
|
||||
router.post('/admin/restore/:id', perm.requires([PERMISSIONS.CLASSES_DELETE, PERMISSIONS.CLASSES_UPDATE]), classController.restore);
|
||||
router.post('/admin/:id/register-users', perm.requires(PERMISSIONS.CLASSES_REGISTER_USERS), classController.registerUsers);
|
||||
router.delete('/admin/:id/students/:userId', perm.requires(PERMISSIONS.CLASSES_REGISTER_USERS), classController.removeUser);
|
||||
router.post('/admin/:id/send-plan-professor', perm.requires(PERMISSIONS.CLASSES_UPDATE), classController.sendClassPlanToProfessor);
|
||||
|
||||
module.exports = router;
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user