// /utils/senders/smsMessages.js 'use strict'; const { sendSingleSms } = require('./sms.base'); const { recordAndSend } = require('./notificationRecorder'); const { getSmsTemplate } = require('../../components/settings/settingService'); const { buildSmsParameters } = require('../../components/settings/smsTemplates'); const User = require('../../components/users/userModel'); const resolveUserIdByPhone = async (phoneNumber) => { if (!phoneNumber) return null; const user = await User.findOne({ phoneNumber: String(phoneNumber) }).select('_id').lean(); return user?._id || null; }; const sendAccountCreatedSms = async (receiver, username, password, userId = null) => { const resolvedUserId = userId || await resolveUserIdByPhone(receiver); const { templateId, variables } = await getSmsTemplate('accountCreated'); return recordAndSend({ userId: resolvedUserId, channel: 'sms', subject: 'ایجاد حساب کاربری', body: `حساب کاربری شما ایجاد شد. نام کاربری: ${username}`, relatedEvent: 'user.created', sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, { username, password })) }); }; const sendClassRegisteredSms = async (receiver, className, userId = null) => { const resolvedUserId = userId || await resolveUserIdByPhone(receiver); const { templateId, variables } = await getSmsTemplate('classRegistered'); return recordAndSend({ userId: resolvedUserId, channel: 'sms', subject: 'ثبت‌نام در کلاس', body: `ثبت‌نام شما در کلاس «${className}» انجام شد.`, relatedEvent: 'user.enrolled', sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, { className })) }); }; const sendClassReminderSms = async (receiver, className, time, place = '', userId = null) => { const resolvedUserId = userId || await resolveUserIdByPhone(receiver); const { templateId, variables } = await getSmsTemplate('classReminder'); return recordAndSend({ userId: resolvedUserId, channel: 'sms', subject: 'یادآوری کلاس', body: `یادآوری کلاس «${className}» ساعت ${time} — مکان: ${place || '-'}`, relatedEvent: 'session.reminder', sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, { className, time, place: place || '-' })) }); }; const sendInvoiceCreatedSms = async (receiver, payloadOrAmount, userId = null, extraCourse = '') => { const isObject = typeof payloadOrAmount === 'object' && payloadOrAmount !== null; const resolvedUserId = (isObject && payloadOrAmount.userId) ? payloadOrAmount.userId : (userId || await resolveUserIdByPhone(receiver)); let fullName = ''; let amount = 0; let course = ''; if (isObject) { fullName = payloadOrAmount.fullName || ''; amount = payloadOrAmount.amount ?? 0; course = payloadOrAmount.course || ''; } else { amount = payloadOrAmount; course = typeof extraCourse === 'string' ? extraCourse : ''; } if (!fullName && resolvedUserId) { const user = await User.findById(resolvedUserId).select('name').lean(); fullName = user?.name || ''; } const { templateId, variables } = await getSmsTemplate('invoiceCreated'); const amountLabel = String(amount); const fullNameLabel = String(fullName || '').trim(); const courseLabel = String(course || '').trim(); return recordAndSend({ userId: resolvedUserId, channel: 'sms', subject: 'ایجاد صورتحساب', body: `صورتحساب جدید به مبلغ ${amountLabel} تومان بابت دوره «${courseLabel || '-'}» برای ${fullNameLabel || 'کارآموز'} صادر شد.`, relatedEvent: 'payment.created', sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, { fullName: fullNameLabel, amount: amountLabel, course: courseLabel })) }); }; module.exports = { sendAccountCreatedSms, sendClassRegisteredSms, sendClassReminderSms, sendInvoiceCreatedSms };