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
+37 -9
View File
@@ -4,7 +4,7 @@
const { sendSingleSms } = require('./sms.base');
const { recordAndSend } = require('./notificationRecorder');
const { getSmsTemplate } = require('../../components/settings/settingService');
const { buildSmsParameters } = require('../../components/settings/smsTemplates');
const { buildSmsParameters, renderSmsText } = require('../../components/settings/smsTemplates');
const User = require('../../components/users/userModel');
const logger = require('../logger');
@@ -33,22 +33,28 @@ const sendTemplateSms = async ({
slotValues = {}
}) => {
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
const { templateId, variables, enabled } = await getSmsTemplate(templateKey);
const { templateId, variables, enabled, text: templateText } = await getSmsTemplate(templateKey);
if (enabled === false) {
logger.info(`[SMS] Template ${templateKey} is disabled. Skipping SMS send to ${receiver}.`);
return { success: true, skipped: true, reason: 'template_disabled' };
}
const paramsContext = {
phoneNumber: receiver,
mobile: receiver,
...slotValues
};
const renderedExactBody = renderSmsText(templateText, variables, paramsContext);
const finalBody = (renderedExactBody && renderedExactBody.trim()) ? renderedExactBody.trim() : (body || subject || 'پیامک');
return recordAndSend({
userId: resolvedUserId,
channel: 'sms',
subject,
body,
body: finalBody,
relatedEvent,
sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, {
phoneNumber: receiver,
mobile: receiver,
...slotValues
}))
sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, paramsContext))
});
};
@@ -375,6 +381,27 @@ const sendCertificateIssuedSms = async (receiver, payload, userId = null) => {
});
};
const sendClassPlanProfessorSms = async (receiver, payload, userId = null) => {
const data = payload || {};
return sendTemplateSms({
templateKey: 'classPlanProfessor',
receiver,
userId,
subject: 'برنامه کلاس به استاد',
body: `استاد ${data.professorName || ''}، برنامه کلاس ${data.className || ''}: ${data.classDays || ''}، ${data.classTimes || ''} از ${data.classStartDate || ''} الی ${data.classEndDate || ''}`,
relatedEvent: 'class.plan_to_professor',
slotValues: {
professorName: data.professorName || 'استاد',
className: data.className || '-',
classDays: data.classDays || '',
classTimes: data.classTimes || '',
classStartDate: data.classStartDate || '',
classEndDate: data.classEndDate || '',
phoneNumber: receiver
}
});
};
module.exports = {
sendAccountCreatedSms,
sendPasswordResetSms,
@@ -389,5 +416,6 @@ module.exports = {
sendClassRequestApprovedSms,
sendClassRequestRejectedSms,
sendPendingRegistrationSms,
sendCertificateIssuedSms
sendCertificateIssuedSms,
sendClassPlanProfessorSms
};