From 93f3aeb7193eeeec3ea0c24b1efd800816858203 Mon Sep 17 00:00:00 2001 From: Kavehhn174 Date: Sat, 15 Aug 2026 18:55:17 +0330 Subject: [PATCH] feat(sms): add FULLNAME, PAYMENT_PRICE, and COURSE template variables for invoice SMS --- components/payments/paymentService.js | 20 +++++++++++++-- components/settings/smsTemplates.js | 4 ++- utils/senders/smsMessages.js | 35 ++++++++++++++++++++++++--- 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/components/payments/paymentService.js b/components/payments/paymentService.js index 1b329c0..560685c 100644 --- a/components/payments/paymentService.js +++ b/components/payments/paymentService.js @@ -10,6 +10,9 @@ const User = require('../users/userModel'); const { sendInvoiceCreatedSms } = require('../../utils/senders/smsMessages'); const logger = require('../../utils/logger'); +const Course = require('../courses/courseModel'); +const Class = require('../classes/classModel'); + const getAllPayments = async (query) => { const page = parseInt(query.page) || 1; const limit = Math.min(parseInt(query.limit) || 20, 200); @@ -74,9 +77,22 @@ const createPayment = async (body, actorId = null) => { } try { - const user = await User.findById(payment.user).select('phoneNumber').lean(); + const user = await User.findById(payment.user).select('name phoneNumber').lean(); if (user?.phoneNumber) { - await sendInvoiceCreatedSms(user.phoneNumber, payment.amount, user._id); + let courseName = ''; + if (payment.course) { + const courseDoc = await Course.findById(payment.course).select('title').lean(); + courseName = courseDoc?.title || ''; + } else if (payment.classes && payment.classes.length > 0) { + const classDoc = await Class.findById(payment.classes[0]).select('name').lean(); + courseName = classDoc?.name || ''; + } + + await sendInvoiceCreatedSms(user.phoneNumber, { + fullName: user.name || '', + amount: payment.amount, + course: courseName + }, user._id); } } catch (err) { logger.error(`[createPayment] Invoice SMS failed for payment ${payment._id}: ${err.message}`); diff --git a/components/settings/smsTemplates.js b/components/settings/smsTemplates.js index 45d148d..619586d 100644 --- a/components/settings/smsTemplates.js +++ b/components/settings/smsTemplates.js @@ -33,7 +33,9 @@ const SMS_TEMPLATE_DEFS = [ label: 'ایجاد صورتحساب', envKey: 'SMS_TEMPLATE_INVOICE_CREATED', slots: [ - { key: 'amount', label: 'مبلغ', defaultName: 'amount' } + { key: 'fullName', label: 'نام کارآموز', defaultName: 'FULLNAME' }, + { key: 'amount', label: 'مبلغ', defaultName: 'PAYMENT_PRICE' }, + { key: 'course', label: 'نام دوره', defaultName: 'COURSE' } ] } ]; diff --git a/utils/senders/smsMessages.js b/utils/senders/smsMessages.js index 5e280ff..eac8710 100644 --- a/utils/senders/smsMessages.js +++ b/utils/senders/smsMessages.js @@ -61,18 +61,45 @@ const sendClassReminderSms = async (receiver, className, time, place = '', userI }); }; -const sendInvoiceCreatedSms = async (receiver, amount, userId = null) => { - const resolvedUserId = userId || await resolveUserIdByPhone(receiver); +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} تومان صادر شد.`, + body: `صورتحساب جدید به مبلغ ${amountLabel} تومان بابت دوره «${courseLabel || '-'}» برای ${fullNameLabel || 'کارآموز'} صادر شد.`, relatedEvent: 'payment.created', sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, { - amount: amountLabel + fullName: fullNameLabel, + amount: amountLabel, + course: courseLabel })) }); };