From 9472537536f1cc41f0c5ad1ecb642ca41239cd7f Mon Sep 17 00:00:00 2001 From: Kavehhn174 Date: Sat, 15 Aug 2026 19:07:17 +0330 Subject: [PATCH] fix(professors): handle nationalId and phone aliases with trimming; update payment sms --- components/payments/paymentService.js | 19 +++++++------ components/professors/professorService.js | 34 +++++++++++++++++++---- utils/senders/smsMessages.js | 33 ++++++++-------------- 3 files changed, 52 insertions(+), 34 deletions(-) diff --git a/components/payments/paymentService.js b/components/payments/paymentService.js index 560685c..30e6e17 100644 --- a/components/payments/paymentService.js +++ b/components/payments/paymentService.js @@ -7,11 +7,10 @@ const eventEmitter = require('../../events/eventEmitter'); const EVENT_NAMES = require('../../constants/eventNames'); const { calculateMeta, escapeRegex, getSearchTerm } = require('../../utils/pagination'); 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 { sendInvoiceCreatedSms } = require('../../utils/senders/smsMessages'); +const logger = require('../../utils/logger'); const getAllPayments = async (query) => { const page = parseInt(query.page) || 1; @@ -81,17 +80,21 @@ const createPayment = async (body, actorId = null) => { if (user?.phoneNumber) { let courseName = ''; if (payment.course) { - const courseDoc = await Course.findById(payment.course).select('title').lean(); - courseName = courseDoc?.title || ''; + const course = await Course.findById(payment.course).select('title').lean(); + if (course?.title) courseName = course.title; } else if (payment.classes && payment.classes.length > 0) { - const classDoc = await Class.findById(payment.classes[0]).select('name').lean(); - courseName = classDoc?.name || ''; + const cls = await Class.findById(payment.classes[0]).populate('course', 'title').lean(); + if (cls?.course?.title) { + courseName = cls.course.title; + } else if (cls?.name) { + courseName = cls.name; + } } await sendInvoiceCreatedSms(user.phoneNumber, { fullName: user.name || '', amount: payment.amount, - course: courseName + course: courseName || '-' }, user._id); } } catch (err) { diff --git a/components/professors/professorService.js b/components/professors/professorService.js index 933ea81..72b2058 100644 --- a/components/professors/professorService.js +++ b/components/professors/professorService.js @@ -7,18 +7,27 @@ const EVENT_NAMES = require('../../constants/eventNames'); const { parsePaginationAndSort, buildFilterQuery, calculateMeta } = require('../../utils/pagination'); const createProfessor = async (data) => { + const payload = { + ...data, + name: String(data.name || '').trim(), + surname: String(data.surname || '').trim(), + nationalIdCode: String(data.nationalIdCode || data.nationalId || '').trim(), + phoneNumber: String(data.phoneNumber || data.phone || '').trim(), + email: data.email ? String(data.email).trim().toLowerCase() : undefined + }; + const existing = await Professor.findOne({ $or: [ - { nationalIdCode: data.nationalIdCode }, - { phoneNumber: data.phoneNumber }, - ...(data.email ? [{ email: data.email }] : []) + { nationalIdCode: payload.nationalIdCode }, + { phoneNumber: payload.phoneNumber }, + ...(payload.email ? [{ email: payload.email }] : []) ] }); if (existing) { throw new AppError('PROFESSOR_ALREADY_EXISTS'); } - const professor = await Professor.create(data); + const professor = await Professor.create(payload); eventEmitter.emit(EVENT_NAMES.PROFESSOR_CREATED, { professorId: professor._id, name: `${professor.name} ${professor.surname}` }); return professor; }; @@ -50,7 +59,22 @@ const updateProfessor = async (id, updateData) => { throw new AppError('PROFESSOR_NOT_FOUND'); } - Object.assign(professor, updateData); + const payload = { ...updateData }; + if (payload.nationalIdCode !== undefined || payload.nationalId !== undefined) { + payload.nationalIdCode = String(payload.nationalIdCode || payload.nationalId || '').trim(); + delete payload.nationalId; + } + if (payload.phoneNumber !== undefined || payload.phone !== undefined) { + payload.phoneNumber = String(payload.phoneNumber || payload.phone || '').trim(); + delete payload.phone; + } + if (payload.name !== undefined) payload.name = String(payload.name).trim(); + if (payload.surname !== undefined) payload.surname = String(payload.surname).trim(); + if (payload.email !== undefined) { + payload.email = payload.email ? String(payload.email).trim().toLowerCase() : undefined; + } + + Object.assign(professor, payload); await professor.save(); return professor; }; diff --git a/utils/senders/smsMessages.js b/utils/senders/smsMessages.js index eac8710..23f66d3 100644 --- a/utils/senders/smsMessages.js +++ b/utils/senders/smsMessages.js @@ -61,40 +61,31 @@ const sendClassReminderSms = async (receiver, className, time, place = '', userI }); }; -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)); +const sendInvoiceCreatedSms = async (receiver, payload, userId = null) => { + const resolvedUserId = userId || await resolveUserIdByPhone(receiver); + const { templateId, variables } = await getSmsTemplate('invoiceCreated'); let fullName = ''; - let amount = 0; + let amount = ''; let course = ''; - if (isObject) { - fullName = payloadOrAmount.fullName || ''; - amount = payloadOrAmount.amount ?? 0; - course = payloadOrAmount.course || ''; + if (typeof payload === 'object' && payload !== null) { + fullName = payload.fullName || ''; + amount = payload.amount != null ? String(payload.amount) : ''; + course = payload.course || ''; } else { - amount = payloadOrAmount; - course = typeof extraCourse === 'string' ? extraCourse : ''; + amount = String(payload || ''); } - 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(); + const courseLabel = course || '-'; + const fullNameLabel = fullName || 'کارآموز'; return recordAndSend({ userId: resolvedUserId, channel: 'sms', subject: 'ایجاد صورتحساب', - body: `صورتحساب جدید به مبلغ ${amountLabel} تومان بابت دوره «${courseLabel || '-'}» برای ${fullNameLabel || 'کارآموز'} صادر شد.`, + body: `کارآموز عزیز، ${fullNameLabel}، یک صورتحساب به مبلغ ${amountLabel} تومان بابت دوره «${courseLabel}» برای شما ایجاد شد.`, relatedEvent: 'payment.created', sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, { fullName: fullNameLabel,