From ac1391f9cef912b768386e0850ac05b7549a1756 Mon Sep 17 00:00:00 2001 From: mahyargdz Date: Wed, 9 Jul 2025 11:55:58 +0330 Subject: [PATCH] feat: sms module --- server/_env.js | 2 +- server/controllers/GPS.Auth.js | 24 +- server/controllers/GPS.User.js | 6 +- server/controllers/bufferRequestController.js | 55 +- .../controllers/guaranteeReportController.js | 16 +- server/controllers/lotteryController.js | 21 +- .../controllers/oldPieceRequestController.js | 55 +- server/controllers/pieceRequestController.js | 55 +- .../controllers/representationController.js | 68 +- server/controllers/smsBroadcastController.js | 7 +- server/controllers/thirdPartyController.js | 75 +- server/controllers/transactionController.js | 77 +- server/controllers/userController.js | 19 +- server/plugins/SMS_Module.js | 1128 ++++++++++++++++- server/plugins/cronJobs.js | 31 +- 15 files changed, 1175 insertions(+), 464 deletions(-) diff --git a/server/_env.js b/server/_env.js index bed4862..4011c7c 100644 --- a/server/_env.js +++ b/server/_env.js @@ -6,7 +6,7 @@ const EnvirementVariables = { // server ports DevServerPort: 4000, - WebSocketPort: 5000, + WebSocketPort: 5001, NuxtPort: 7420, NuxtHost: '0.0.0.0', WebSocketURL() { diff --git a/server/controllers/GPS.Auth.js b/server/controllers/GPS.Auth.js index 081b388..869597c 100644 --- a/server/controllers/GPS.Auth.js +++ b/server/controllers/GPS.Auth.js @@ -5,9 +5,8 @@ const { secretKey } = require('../authentication') const { _sr } = require('../plugins/serverResponses') const { checkValidations } = require('../plugins/controllersHelperFunctions') const UserGPS = require('../models/GPS.User') -const { generateRandomDigits -} = require('../plugins/controllersHelperFunctions') -const { SMS } = require('../plugins/SMS_Module') +const { generateRandomDigits } = require('../plugins/controllersHelperFunctions') +const sms = require('../plugins/SMS_Module') module.exports.login_with_pass = [ [ body('username') @@ -56,7 +55,7 @@ module.exports.login_with_pass = [ }) // eslint-disable-next-line eqeqeq if (user?.lastIP && user?.lastIP != req.ip) { - SMS([user.mobile_number], "کاربر گرامی، \n با دستگاه جدیدی به اکانت شما در آسان سرویس وارد شدند") + await sms.auth.deviceLogin(user.mobile_number, req.ip) } user.lastIP = req.ip user.token = token @@ -72,12 +71,8 @@ module.exports.login_with_pass = [ module.exports.login_with_otp = [ [ - body('mobile_number') - .notEmpty() - .withMessage(_sr.fa.required.phone_number), - body('otp') - .notEmpty() - .withMessage(_sr.fa.required.phone_number) + body('mobile_number').notEmpty().withMessage(_sr.fa.required.phone_number), + body('otp').notEmpty().withMessage(_sr.fa.required.phone_number) ], checkValidations(validationResult), async (req, res) => { @@ -85,7 +80,7 @@ module.exports.login_with_otp = [ const { mobile_number, otp } = req.body const user = await UserGPS.findOne({ mobile_number }) if (!user) throw new Error(_sr.fa.not_found.user_id) - if (user.otp !== otp) throw new Error("کد اشتباه است") + if (user.otp !== otp) throw new Error('کد اشتباه است') if (user.otp === otp) { if (!user.active) { throw new Error('حساب شما هنوز تاییده نشده است') @@ -95,21 +90,18 @@ module.exports.login_with_otp = [ }) // eslint-disable-next-line eqeqeq if (user?.lastIP && user?.lastIP != req.ip) { - SMS([user.mobile_number], "کاربر گرامی، \n با دستگاه جدیدی به اکانت شما در آسان سرویس وارد شدند") + await sms.auth.deviceLogin(user.mobile_number, req.ip) } user.otp = generateRandomDigits(6) user.lastIP = req.ip user.token = token user.save() return res.status(200).json({ token }) - } } catch (err) { return res.status(422).json({ validation: { otp: { msg: err.message } } }) - } - } -] \ No newline at end of file +] diff --git a/server/controllers/GPS.User.js b/server/controllers/GPS.User.js index 85c438d..6100eeb 100644 --- a/server/controllers/GPS.User.js +++ b/server/controllers/GPS.User.js @@ -4,7 +4,7 @@ const { body, validationResult, param } = require('express-validator') const uid = require('uuid') const User = require('../models/GPS.User') const { _sr } = require('../plugins/serverResponses') -const { SMS } = require('../plugins/SMS_Module') +const sms = require('../plugins/SMS_Module') const { res500, checkValidations, @@ -29,9 +29,7 @@ function sendConfirmationSMS(userId) { user.otp = mobileKey await user.save() - const smsMsg = ['این شماره در وبسایت آسان سرویس ثبت گردیده.', ' کد تایید شماره همراه: ', mobileKey] - - await SMS([user.mobile_number], smsMsg.join('')) + await sms.auth.mobileVerificationCode(user.mobile_number, mobileKey, new Date()) resolve() } catch (err) { diff --git a/server/controllers/bufferRequestController.js b/server/controllers/bufferRequestController.js index 82d4ff2..332bf07 100644 --- a/server/controllers/bufferRequestController.js +++ b/server/controllers/bufferRequestController.js @@ -9,7 +9,7 @@ const { checkValidations, generateRandomDigits } = require('../plugins/controllersHelperFunctions') -const { SMS } = require('../plugins/SMS_Module') +const sms = require('../plugins/SMS_Module') // const { phrases } = require('../plugins/SMS_Phrases') // const { notifyAgent } = require('../WebSocket/controllers/agent_EventsController') const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController') @@ -20,10 +20,6 @@ function ArpaDateFormat(date) { return moment(date).format('YYYY-MM-DD HH:mm:ss') } -function SmsDateFormat(date) { - return moment(date).format('jYYYY/jMM/jDD') -} - /// ///////////////// agent module.exports.add_buffer_request = [ async (req, res) => { @@ -172,15 +168,7 @@ module.exports.change_br_status_to_sent_by_agent = [ br.sendDate = ArpaDateFormat(thisTime) // send sms for agent - const smsMsg = [ - ' نماینده گرامی درخواست کالای بافر شما در تاریخ ', - SmsDateFormat(thisTime), - ' با کد پیگیری ', - trackingCode, - ' برای شرکت ارسال شد. ' - ] - - SMS([br.agent_id.mobile_number], smsMsg.join('')) + await sms.bufferRequest.sent(br.agent_id.mobile_number, trackingCode, thisTime) await br.save() notifyAdmin('updateNewBufferRequests') @@ -244,15 +232,7 @@ module.exports.get_one_br_for_admin = [ br.statusHistory.push({ status: 'ongoing', date: thisTime }) await br.save() - const smsMsg = [ - ' نماینده گرامی درخواست کالای بافر شما با کد پیگیری ', - br.trackingCode, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' در دست اقدام قرار گرفت. ' - ] - - SMS([br.agent_id.mobile_number], smsMsg.join('')) + await sms.bufferRequest.ongoing(br.agent_id.mobile_number, br.trackingCode, thisTime) notifyAdmin('updateNewBufferRequests') } return res.json(br) @@ -294,38 +274,15 @@ module.exports.change_br_status_by_admin = [ br.status = status br.statusHistory.push({ status, date: thisTime }) - let smsMessage - // differenet status methods + // different status methods if (status === 'waiting') { - smsMessage = [ - ' نماینده گرامی درخواست کالای بافر شما با کد پیگیری ', - br.trackingCode, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' در انتظار قطعه میباشد. ' - ] + await sms.bufferRequest.waiting(br.agent_id.mobile_number, br.trackingCode, thisTime) } if (status === 'delivered') { if (deliveryCode) br.deliveryCode = deliveryCode - - function deliveryCodePhrase() { - if (deliveryCode.length) return `کد پیگیری مرسوله: ${deliveryCode}` + '\n' - else return '' - } - - smsMessage = [ - ' نماینده گرامی درخواست کالای بافر شما با کد پیگیری ', - br.trackingCode, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' تحویل شد. ', - '\n', - deliveryCodePhrase() - ] + await sms.bufferRequest.delivered(br.agent_id.mobile_number, br.trackingCode, deliveryCode, thisTime) } - - await SMS([br.agent_id.mobile_number], smsMessage.join('')) await br.save() return res.json({ message: _faSr.response.success_save }) } catch (e) { diff --git a/server/controllers/guaranteeReportController.js b/server/controllers/guaranteeReportController.js index d2319dd..d3608db 100644 --- a/server/controllers/guaranteeReportController.js +++ b/server/controllers/guaranteeReportController.js @@ -9,7 +9,7 @@ const { checkValidations, generateRandomDigits } = require('../plugins/controllersHelperFunctions') -const { SMS } = require('../plugins/SMS_Module') +const sms = require('../plugins/SMS_Module') const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController') const _faSr = _sr.fa @@ -18,10 +18,6 @@ function ArpaDateFormat(date) { return moment(date).format('YYYY-MM-DD HH:mm:ss') } -function SmsDateFormat(date) { - return moment(date).format('jYYYY/jMM/jDD') -} - /// ///////////////// agent module.exports.add_guaranteeReport = [ async (req, res) => { @@ -201,15 +197,7 @@ module.exports.change_gr_status_to_sent_by_agent = [ gr.sendDate = ArpaDateFormat(thisTime) // send sms for agent - const smsMsg = [ - ' نماینده گرامی فرم گزارش عملکرد گارانتی شما در تاریخ ', - SmsDateFormat(thisTime), - ' با کد پیگیری ', - trackingCode, - ' برای شرکت ارسال شد. ' - ] - - SMS([gr.agent_id.mobile_number], smsMsg.join('')) + await sms.guaranteeReport.sent(gr.agent_id.mobile_number, trackingCode, thisTime) await gr.save() notifyAdmin('updateNewGuaranteeReports') diff --git a/server/controllers/lotteryController.js b/server/controllers/lotteryController.js index b29d1ed..b59737f 100644 --- a/server/controllers/lotteryController.js +++ b/server/controllers/lotteryController.js @@ -14,17 +14,11 @@ const { checkMobileNumber, normalizeMobileNumber } = require('../plugins/controllersHelperFunctions') -const { SMS } = require('../plugins/SMS_Module') -const { phrases } = require('../plugins/SMS_Phrases') +const sms = require('../plugins/SMS_Module') /// const _faSr = _sr.fa -// date formaters -function SmsDateFormat(date) { - return moment(date).format('jYYYY/jMM/jDD') -} - module.exports.addLottery = [ [ body('title').notEmpty().withMessage(_faSr.required.title), @@ -338,18 +332,7 @@ module.exports.enrollParticipant = [ lottery.markModified('participants') await lottery.save() - const msg = [ - fullName, - ' عزیز، اطلاعات شما در تاریخ ', - SmsDateFormat(Date.now()), - ' برای شرکت در قرعه کشی آسان سرویس ثبت گردید. ', - '\n', - 'کد پیگیری: ', - enrollCode, - '\n', - phrases.signature - ] - SMS([normalizedMN], msg.join('')) + await sms.lottery.enrollment(normalizedMN, fullName, enrollCode, Date.now()) return res.json({ message: 'اطلاعات شما با موفیقت در سیستم ثبت شد. کد پیگیری به تلفن همراه شما ارسال گردید' }) } catch (e) { return res500(res, `there is an error here --- ${e}`) diff --git a/server/controllers/oldPieceRequestController.js b/server/controllers/oldPieceRequestController.js index 36bcbe0..f83a0cb 100644 --- a/server/controllers/oldPieceRequestController.js +++ b/server/controllers/oldPieceRequestController.js @@ -9,7 +9,7 @@ const { checkValidations, generateRandomDigits } = require('../plugins/controllersHelperFunctions') -const { SMS } = require('../plugins/SMS_Module') +const sms = require('../plugins/SMS_Module') const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController') const _faSr = _sr.fa @@ -18,10 +18,6 @@ function ArpaDateFormat(date) { return moment(date).format('YYYY-MM-DD HH:mm:ss') } -function SmsDateFormat(date) { - return moment(date).format('jYYYY/jMM/jDD') -} - /// ///////////////// agent module.exports.add_oldPiece_request = [ async (req, res) => { @@ -177,15 +173,7 @@ module.exports.change_opr_status_to_sent_by_agent = [ opr.sendDate = ArpaDateFormat(thisTime) // send sms for agent - const smsMsg = [ - ' نماینده گرامی درخواست قطعه داغی شما در تاریخ ', - SmsDateFormat(thisTime), - ' با کد پیگیری ', - trackingCode, - ' برای شرکت ارسال شد. ' - ] - - SMS([opr.agent_id.mobile_number], smsMsg.join('')) + await sms.oldPieceRequest.sent(opr.agent_id.mobile_number, trackingCode, thisTime) await opr.save() notifyAdmin('updateNewOldPieceRequests') @@ -247,15 +235,7 @@ module.exports.get_one_opr_for_admin = [ opr.statusHistory.push({ status: 'ongoing', date: thisTime }) await opr.save() - const smsMsg = [ - ' نماینده گرامی درخواست قطعه داغی شما با کد پیگیری ', - opr.trackingCode, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' در دست اقدام قرار گرفت. ' - ] - - SMS([opr.agent_id.mobile_number], smsMsg.join('')) + await sms.oldPieceRequest.ongoing(opr.agent_id.mobile_number, opr.trackingCode, thisTime) notifyAdmin('updateNewOldPieceRequests') } return res.json(opr) @@ -297,38 +277,15 @@ module.exports.change_opr_status_by_admin = [ opr.status = status opr.statusHistory.push({ status, date: thisTime }) - let smsMessage - // differenet status methods + // different status methods if (status === 'waiting') { - smsMessage = [ - ' نماینده گرامی درخواست قطعه داغی شما با کد پیگیری ', - opr.trackingCode, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' در انتظار قطعه میباشد. ' - ] + await sms.oldPieceRequest.waiting(opr.agent_id.mobile_number, opr.trackingCode, thisTime) } if (status === 'delivered') { if (deliveryCode) opr.deliveryCode = deliveryCode - - function deliveryCodePhrase() { - if (deliveryCode.length) return `کد پیگیری مرسوله: ${deliveryCode}` + '\n' - else return '' - } - - smsMessage = [ - ' نماینده گرامی درخواست قطعه داغی شما با کد پیگیری ', - opr.trackingCode, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' تحویل شد. ', - '\n', - deliveryCodePhrase() - ] + await sms.oldPieceRequest.delivered(opr.agent_id.mobile_number, opr.trackingCode, deliveryCode, thisTime) } - - await SMS([opr.agent_id.mobile_number], smsMessage.join('')) await opr.save() return res.json({ message: _faSr.response.success_save }) } catch (e) { diff --git a/server/controllers/pieceRequestController.js b/server/controllers/pieceRequestController.js index 9892923..a740a66 100644 --- a/server/controllers/pieceRequestController.js +++ b/server/controllers/pieceRequestController.js @@ -9,7 +9,7 @@ const { checkValidations, generateRandomDigits } = require('../plugins/controllersHelperFunctions') -const { SMS } = require('../plugins/SMS_Module') +const sms = require('../plugins/SMS_Module') const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController') const _faSr = _sr.fa @@ -18,10 +18,6 @@ function ArpaDateFormat(date) { return moment(date).format('YYYY-MM-DD HH:mm:ss') } -function SmsDateFormat(date) { - return moment(date).format('jYYYY/jMM/jDD') -} - /// ///////////////// agent module.exports.add_piece_request = [ async (req, res) => { @@ -197,16 +193,7 @@ module.exports.change_pr_status_to_sent_by_agent = [ pr.trackingCode = trackingCode pr.sendDate = ArpaDateFormat(thisTime) - // send sms for agent - const smsMsg = [ - ' نماینده گرامی درخواست قطعه شما در تاریخ ', - SmsDateFormat(thisTime), - ' با کد پیگیری ', - trackingCode, - ' برای شرکت ارسال شد. ' - ] - - SMS([pr.agent_id.mobile_number], smsMsg.join('')) + await sms.pieceRequest.sent(pr.agent_id.mobile_number, trackingCode, thisTime) await pr.save() notifyAdmin('updateNewPieceRequests') @@ -268,15 +255,7 @@ module.exports.get_one_pr_for_admin = [ pr.statusHistory.push({ status: 'ongoing', date: thisTime }) await pr.save() - const smsMsg = [ - ' نماینده گرامی درخواست قطعه شما با کد پیگیری ', - pr.trackingCode, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' در دست اقدام قرار گرفت. ' - ] - - SMS([pr.agent_id.mobile_number], smsMsg.join('')) + await sms.pieceRequest.ongoing(pr.agent_id.mobile_number, pr.trackingCode, thisTime) notifyAdmin('updateNewPieceRequests') } return res.json(pr) @@ -318,38 +297,14 @@ module.exports.change_pr_status_by_admin = [ pr.status = status pr.statusHistory.push({ status, date: thisTime }) - let smsMessage - // differenet status methods if (status === 'waiting') { - smsMessage = [ - ' نماینده گرامی درخواست قطعه شما با کد پیگیری ', - pr.trackingCode, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' در انتظار قطعه میباشد. ' - ] + await sms.pieceRequest.waiting(pr.agent_id.mobile_number, pr.trackingCode, thisTime) } if (status === 'delivered') { if (deliveryCode) pr.deliveryCode = deliveryCode - - function deliveryCodePhrase() { - if (deliveryCode.length) return `کد پیگیری مرسوله: ${deliveryCode}` + '\n' - else return '' - } - - smsMessage = [ - ' نماینده گرامی درخواست قطعه شما با کد پیگیری ', - pr.trackingCode, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' تحویل شد. ', - '\n', - deliveryCodePhrase() - ] + await sms.pieceRequest.delivered(pr.agent_id.mobile_number, pr.trackingCode, deliveryCode, thisTime) } - - await SMS([pr.agent_id.mobile_number], smsMessage.join('')) await pr.save() return res.json({ message: _faSr.response.success_save }) } catch (e) { diff --git a/server/controllers/representationController.js b/server/controllers/representationController.js index c2ba7c4..93e400c 100644 --- a/server/controllers/representationController.js +++ b/server/controllers/representationController.js @@ -4,8 +4,8 @@ const moment = require('moment-jalaali') const Mongoose = require('mongoose') const Representation = require('../models/Representation') const User = require('../models/User') -const { SMS } = require('../plugins/SMS_Module') -const { phrases } = require('../plugins/SMS_Phrases') +const sms = require('../plugins/SMS_Module') + const { _sr } = require('../plugins/serverResponses') const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController') const { @@ -26,10 +26,6 @@ const _faSr = _sr.fa // return moment(date).format('YYYY-MM-DD HH:mm:ss') // } -function SmsDateFormat(date) { - return moment(date).format('jYYYY/jMM/jDD') -} - module.exports.add_representation = [ [ body('representation_type') @@ -302,23 +298,9 @@ module.exports.add_representation = [ user.representation_code = representation_code await user.save() - const smsMessage = [ - ' متقاضی گرامی درخواست شما با کد پیگیری ', - representation_code, - ' در تاریخ ', - SmsDateFormat(Date.now()), - ' در سامانه ثبت شد. ', - '\n', - ' بعد از بررسی مدارک توسط کارشناسان نتیجه از طریق پیامک برای شما ارسال خواهد شد، همچنین میتوانید با کد پیگیری از طریق نشانی زیر وضعیت درخواست خود را بررسی کند. ', - '\n', - 'https://asan-service.com/representation', - '\n', - phrases.signature - ] - const responseMsg = ['درخواست شما باموفقیت ثبت شد.', '\n', ' کد پیگیری: ', representation_code] - SMS([mobile_number], smsMessage.join('')) + await sms.representation.submitted(mobile_number, representation_code, Date.now()) notifyAdmin('updateNewRepresentations') return res.json({ message: responseMsg.join('') }) } catch (e) { @@ -610,16 +592,12 @@ module.exports.getOne = [ if (representation.status === 'registered') { representation.status = 'ongoing' await representation.save() - const smsMsg = [ - ' متقاصی گرامی درخواست شما برای اخذ نمایندگی آسان سرویس به کد پیگیری ', + + await sms.representation.underReview( + representation.mobile_number, representation.representation_code, - ' مورخ ', - SmsDateFormat(Date.now()), - ' توسط کارشناسان آسان سرویس مشاهده و مورد بررسی قرار گرفت. ', - '\n', - phrases.signature - ] - SMS([representation.mobile_number], smsMsg.join('')) + Date.now() + ) notifyAdmin('updateNewRepresentations') return res.json(representation) } else return res.json(representation) @@ -683,14 +661,11 @@ module.exports.change_form_status = [ if (status === 'uploadOn') { representation.upload = true await representation.save() - const smsMsg = [ - ' متقاصی گرامی دسرسی آپلود مدارک برای درخواست ', + await sms.representation.uploadAccess( + representation.mobile_number, representation.representation_code, - ' ایجاد شد، لطفا هرچه سریع تر نسبت به آپلود مدارک خود اقدام کنید. ', - '\n', - phrases.signature - ] - SMS([representation.mobile_number], smsMsg.join('')) + Date.now() + ) return res.json({ message: 'وضعیت جدید در سیستم ثبت شد و پیامک اطلاع رسانی برای متقاضی ارسال شد' }) } if (status === 'uploadOff') { @@ -702,12 +677,7 @@ module.exports.change_form_status = [ if (status === 'editAccessOn') { representation.editAccess = true await representation.save() - const smsMsg = [ - ' نماینده گرامی دسرسی ویرایش اطلاعات نمایندگی برای شما ایجاد شد، لطفا هرچه سریع تر نسبت به ویرایش اطلاعات خود اقدام کنید.', - '\n', - phrases.signature - ] - SMS([representation.mobile_number], smsMsg.join('')) + await sms.representation.editAccess(representation.mobile_number, Date.now()) return res.json({ message: 'وضعیت جدید در سیستم ثبت شد و پیامک اطلاع رسانی برای متقاضی ارسال شد' }) } if (status === 'editAccessOff') { @@ -763,16 +733,12 @@ module.exports.change_form_status = [ else return ' مورد قبول قرار گرفت. برای ادامه ی فرایند از طرف شرکت با شما تماس گرفته خواهد شد. ' } - const smsMsg = [ - ' متقاصی گرامی درخواست شما برای اخذ نمایندگی آسان سرویس به کد پیگیری ', + await sms.representation.statusUpdate( + representation.mobile_number, representation.representation_code, - ' مورخ ', - SmsDateFormat(Date.now()), statusToPhrase(), - '\n', - phrases.signature - ] - SMS([representation.mobile_number], smsMsg.join('')) + Date.now() + ) return res.json({ message: 'وضعیت جدید در سیستم ثبت شد و پیامک اطلاع رسانی برای متقاضی ارسال شد' }) } catch (e) { return res404(res, `there is an error here --- ${e}`) diff --git a/server/controllers/smsBroadcastController.js b/server/controllers/smsBroadcastController.js index dbca0f2..40d1edd 100644 --- a/server/controllers/smsBroadcastController.js +++ b/server/controllers/smsBroadcastController.js @@ -2,7 +2,7 @@ const { body, validationResult } = require('express-validator') const SMSBroadcast = require('../models/SMSBroadcast') const { _sr } = require('../plugins/serverResponses') const { res500, checkValidations } = require('../plugins/controllersHelperFunctions') -const { SMS } = require('../plugins/SMS_Module') +const sms = require('../plugins/SMS_Module') const _faSr = _sr.fa module.exports.broadcast = [ @@ -19,9 +19,8 @@ module.exports.broadcast = [ const data = { message, recievers, _creator: user_id } const smsBroadcast = new SMSBroadcast(data) await smsBroadcast.save() - for await (const item of recievers) { - await SMS([item.mobile_number], message) - } + const mobileNumbers = recievers.map(item => item.mobile_number) + await sms.broadcast(mobileNumbers, message) return res.json({ message: 'پیامک برای همه مخاطبین ارسال گردید' }) } catch (e) { return res500(res, e) diff --git a/server/controllers/thirdPartyController.js b/server/controllers/thirdPartyController.js index ff7a733..0d59528 100644 --- a/server/controllers/thirdPartyController.js +++ b/server/controllers/thirdPartyController.js @@ -2,8 +2,7 @@ const { body, validationResult } = require('express-validator') const User = require('../models/User') const SurveyCheck = require('../models/SurveyCheck') const { res406, res500, checkValidations } = require('../plugins/controllersHelperFunctions') -const { SMS } = require('../plugins/SMS_Module') -const { phrases } = require('../plugins/SMS_Phrases') +const sms = require('../plugins/SMS_Module') module.exports.reception = [ [ @@ -19,23 +18,13 @@ module.exports.reception = [ const user = await User.findOne({ $or: [{ verity_businessID: BusinessID }, { panatech_businessID: BusinessID }] }) if (!user) return res406(res, 'Incorrect BusinessID') - function getMessageTxt() { - const msgArray = [ - 'مشتری گرامی', - user.first_name + ' ' + user.last_name, - '\n', - 'کالاهای شما با شماره پذیرش موقت', - TempReceiptTransNumber, - 'توسط واحد گارانتی آسان سرویس دریافت شد و با شماره پذیرش دائم', - ItemReceptionTransNumber, - 'دردست بررسی می باشد. به محض آماده شدن کالاها به شما اطلاع رسانی خواهد شد.', - '\n', - phrases.signature - ] - return msgArray.join(' ') - } - - SMS([user.mobile_number], getMessageTxt()) + await sms.warranty.reception( + user.mobile_number, + user.first_name + ' ' + user.last_name, + TempReceiptTransNumber, + ItemReceptionTransNumber, + Date.now() + ) return res.json({ message: 'Message sent successfully' }) } catch (e) { return res500(res, e) @@ -57,23 +46,13 @@ module.exports.repair = [ const user = await User.findOne({ $or: [{ verity_businessID: BusinessID }, { panatech_businessID: BusinessID }] }) if (!user) return res406(res, 'Incorrect BusinessID') - function getMessageTxt() { - const msgArray = [ - 'مشتری گرامی', - user.first_name + ' ' + user.last_name, - '\n', - 'مراحل تعمیر و بررسی کالاهای ارسالی شما با شماره پذیرش', - ItemReceptionTransNumber, - 'توسط واحد گارانتی آسان سرویس انجام شد و با شماره فاکتور گارانتی', - TransNumber, - 'ثبت شد. به زودی کالاها به آدرس شما ارسال می گردد. ', - '\n', - phrases.signature - ] - return msgArray.join(' ') - } - - SMS([user.mobile_number], getMessageTxt()) + await sms.warranty.repairCompleted( + user.mobile_number, + user.first_name + ' ' + user.last_name, + ItemReceptionTransNumber, + TransNumber, + Date.now() + ) return res.json({ message: 'Message sent successfully' }) } catch (e) { return res500(res, e) @@ -95,22 +74,6 @@ module.exports.sendBack = [ const user = await User.findOne({ $or: [{ verity_businessID: BusinessID }, { panatech_businessID: BusinessID }] }) if (!user) return res406(res, 'Incorrect BusinessID') - function getMessageTxt() { - const msgArray = [ - 'مشتری گرامی', - user.first_name + ' ' + user.last_name, - '\n', - 'کالاهای ارسالی شما با شماره پذیرش', - ItemReceptionTransNumber, - 'پس از انجام مراحل گارانتی توسط واحد گارانتی به آدرس شما ارسال شد. شماره بیجک بسته ارسالی', - DeliveryCode, - 'می باشد. از همراهی و خرید شما سپاس گزاریم. ', - '\n', - phrases.signature - ] - return msgArray.join(' ') - } - const surveyData = { code: ItemReceptionTransNumber, user: user._id, @@ -121,7 +84,13 @@ module.exports.sendBack = [ if (err) console.log('surveyCheck save error', err) }) - SMS([user.mobile_number], getMessageTxt()) + await sms.warranty.sendback( + user.mobile_number, + user.first_name + ' ' + user.last_name, + ItemReceptionTransNumber, + DeliveryCode, + Date.now() + ) return res.json({ message: 'Message sent successfully' }) } catch (e) { return res500(res, e) diff --git a/server/controllers/transactionController.js b/server/controllers/transactionController.js index bce5398..c788bd2 100644 --- a/server/controllers/transactionController.js +++ b/server/controllers/transactionController.js @@ -13,8 +13,7 @@ const { checkValidations, generateRandomDigits } = require('../plugins/controllersHelperFunctions') -const { SMS } = require('../plugins/SMS_Module') -const { phrases } = require('../plugins/SMS_Phrases') +const sms = require('../plugins/SMS_Module') const { notifyAgent } = require('../WebSocket/controllers/agent_EventsController') const { notifyUser } = require('../WebSocket/controllers/user_EventsController') const _faSr = _sr.fa @@ -24,10 +23,6 @@ function ArpaDateFormat(date) { return moment(date).format('YYYY-MM-DD HH:mm:ss') } -function SmsDateFormat(date) { - return moment(date).format('jYYYY/jMM/jDD') -} - /// ///////////////// users module.exports.add_transaction = [ [ @@ -60,24 +55,10 @@ module.exports.add_transaction = [ if (user.isAgent && agent !== 'main') return res406(res, 'نمایندگان فقط میتوانند به خود شرکت آسان سرویس فرم ارسال نمایند') - function getMessageTxt(transNumber) { - const msgArray = [ - 'مشتری گرامی', - user.first_name + ' ' + user.last_name, - '\n', - 'کالاهای شما با شماره پذیرش موقت', - transNumber, - 'در سایت آسان سرویس ثبت گردید. کالاهای ارسالی شما پس از دریافت توسط واحد گارانتی، بررسی شده و به شما اطلاع رسانی خواهد شد.', - '\n', - phrases.signature - ] - return msgArray.join(' ') - } - // TODO: here arpa service if (agent === 'main') { const ArpaResponse = await saveTransactionToArpa(data, items, db_name) await TransactionDraft.findByIdAndRemove(draftId) - SMS([user.mobile_number], getMessageTxt(ArpaResponse)) + await sms.transaction.submitted(user.mobile_number, ArpaResponse, thisTime) notifyUser('updateDraftsCount', userId) return res.json({ host: 'ar', @@ -97,7 +78,7 @@ module.exports.add_transaction = [ const transaction = new Transaction(data) await transaction.save() await TransactionDraft.findByIdAndRemove(draftId) - SMS([user.mobile_number], getMessageTxt(transaction.TempReceiptTransNumber)) + await sms.transaction.submitted(user.mobile_number, transaction.TempReceiptTransNumber, thisTime) notifyUser('updateDraftsCount', userId) notifyAgent('newAgentInbox', agent) notifyAgent('updateAgentInbox', agent) @@ -202,69 +183,27 @@ module.exports.change_transaction_status_by_agent = [ transaction.status = status transaction.statusHistory.push({ status, date: thisTime }) - let smsMessage // different status methods if (status === 'recieved') { const receiptTN = transaction.TempReceiptTransNumber + 'R' + generateRandomDigits(2) transaction.ItemReceptionTransNumber = receiptTN transaction.ItemReceptionTransDate = ArpaDateFormat(thisTime) - smsMessage = [ - ' کاربر گرامی فرم گارانتی شما با کد پذیرش موقت ', - transaction.TempReceiptTransNumber, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' تحویل دفتر نمایندگی و پذیرش شد. ', - '\n', - ' کد پذیرش: ', - receiptTN, - '\n', - phrases.signature - ] + await sms.transaction.received(transaction.cTel1, transaction.TempReceiptTransNumber, receiptTN, thisTime) } if (status === 'ongoing') { - smsMessage = [ - ' کاربر گرامی فرم گارانتی شما با کد پذیرش ', - transaction.ItemReceptionTransNumber, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' در دست اقدام قرار گرفت. ', - '\n', - phrases.signature - ] + await sms.transaction.ongoing(transaction.cTel1, transaction.ItemReceptionTransNumber, thisTime) } if (status === 'waiting') { - smsMessage = [ - ' کاربر گرامی فرم گارانتی شما با کد پذیرش ', - transaction.ItemReceptionTransNumber, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' در انتظار قطعه میباشد. ', - '\n', - phrases.signature - ] + await sms.transaction.waiting(transaction.cTel1, transaction.ItemReceptionTransNumber, thisTime) } if (status === 'delivered') { if (deliveryCode) transaction.deliveryCode = deliveryCode - function deliveryCodePhrase() { - if (deliveryCode.length) return `کد پیگیری مرسوله: ${deliveryCode}` + '\n' - else return '' - } - - smsMessage = [ - ' کاربر گرامی فرم گارانتی شما با کد پذیرش ', - transaction.ItemReceptionTransNumber, - ' در تاریخ ', - SmsDateFormat(thisTime), - ' تحویل شد. ', - '\n', - deliveryCodePhrase(), - phrases.signature - ] + await sms.transaction.delivered(transaction.cTel1, transaction.ItemReceptionTransNumber, deliveryCode, thisTime) const surveyData = { code: transaction.ItemReceptionTransNumber, @@ -277,7 +216,7 @@ module.exports.change_transaction_status_by_agent = [ }) } - await SMS([transaction.cTel1], smsMessage.join('')) + // SMS call now handled above in the individual status methods await transaction.save() return res.json({ message: _faSr.response.success_save }) diff --git a/server/controllers/userController.js b/server/controllers/userController.js index 32d065a..796422c 100644 --- a/server/controllers/userController.js +++ b/server/controllers/userController.js @@ -7,7 +7,7 @@ const User = require('../models/User') const { secretKey } = require('../authentication') const permissions = require('../plugins/permissions') const { _sr } = require('../plugins/serverResponses') -const { SMS } = require('../plugins/SMS_Module') +const sms = require('../plugins/SMS_Module') const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController') const { saveUserToArpa, updateUserOnArpa } = require('../ArpaWebservice.js') const { @@ -98,13 +98,7 @@ function sendConfirmationSMS(userId) { user.mobileConfirmationKey = mobileKey await user.save() - // const smsMsg = [ - // 'این شماره در وبسایت آسان سرویس جهت ارائه خدمات گارانتی ثبت گردیده.', - // ' کد تایید شماره همراه: ', - // mobileKey - // ] - - await SMS(user.mobile_number, mobileKey) + await sms.auth.mobileVerificationCode(user.mobile_number, mobileKey, new Date()) resolve() } catch (err) { @@ -676,6 +670,8 @@ module.exports.generate_reset_user_password_link = [ if (type === 'email') query.email = email.toLowerCase().trim() if (type === 'mobile') query.mobile_number = normalizeMobileNumber(mobile) + console.log('queryyyy', query) + const user = await User.findOne(query) if (!user) throw new Error('err') @@ -715,11 +711,8 @@ module.exports.generate_reset_user_password_link = [ html: emailHTMLTemplate }) } else { - const smsMsg = [ - ' لینک بازیابی کلمه عبور آسان سرویس: ', - `https://${hostURL}/auth/resetpass-newpass/${resetPassKey}` - ] - await SMS([user.mobile_number], smsMsg.join('')) + const resetLink = `https://${hostURL}/auth/resetpass-newpass/${resetPassKey}` + await sms.auth.passwordReset(user.mobile_number, resetLink, new Date()) } await user.save() diff --git a/server/plugins/SMS_Module.js b/server/plugins/SMS_Module.js index 7d2714b..695275c 100644 --- a/server/plugins/SMS_Module.js +++ b/server/plugins/SMS_Module.js @@ -1,67 +1,66 @@ const axios = require('axios') -// const accountInfo = { -// Username: 'asanservice.sms@gmail.com', -// Password: '9u&8[Ve9', -// Number: '5000467341', -// url: 'http://www.afe.ir/WebService/V4/BoxService.asmx' -// } - -/// /////// http post soap method -// module.exports.SMS = (mobileNumbersArray, message) => { -// return new Promise((resolve, reject) => { -// function renderMobileNumbers(array) { -// return array.map(item => `${item}`).join('') -// } - -// const xml = ` -// -// -// -// ${accountInfo.Username} -// ${accountInfo.Password} -// ${accountInfo.Number} -// -// ${renderMobileNumbers(mobileNumbersArray)} -// -// ${message} -// 1 -// -// -// ` - -// console.log('here') -// axios -// .post(accountInfo.url, xml, { -// headers: { -// 'Content-Type': 'text/xml; charset=utf-8', -// SOAPAction: 'http://www.afe.ir/SendMessage' -// } -// }) -// .then(res => { -// resolve(res) -// }) -// .catch(err => { -// console.log( -// 'this is sms module error ------------------ status code: ', -// err.response.status, -// 'error message: ', -// err.response.data -// ) -// reject(err) -// }) -// }) -// } - -module.exports.SMS = async (mobile, message) => { - const smsService = new SmsService('QkkNxhyXZ6GtEf1soOTtikomO3mA4LaNQDH8mol8huDIwh00') - return await smsService.sendOTPSms(message, mobile) +// Helper function to format SMS date +function formatSMSDate(date) { + return new Date(date).toLocaleString('fa-IR', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }) } class SmsService { constructor(apiKey) { this.API_URL_FAST = 'https://api.sms.ir/v1' this.OTP_PATTERN = '83604' + this.TRANSACTION_SUBMITTED_PATTERN = '565621' + this.TRANSACTION_RECEIVED_PATTERN = '700980' + this.TRANSACTION_ONGOING_PATTERN = '359158' + this.TRANSACTION_WAITING_PATTERN = '595406' + this.TRANSACTION_DELIVERED_PATTERN = '921981' + // + this.DEVICE_LOGIN_PATTERN = '970395' // ورود با دستگاه جدید + this.OTP_VERIFICATION_PATTERN = '403891' // تأیید شماره موبایل + this.MOBILE_VERIFICATION_CODE_PATTERN = '795491' // کد تایید شماره همراه + this.PASSWORD_RESET_PATTERN = '252168' // بازیابی کلمه عبور + // + this.LOTTERY_ENROLLMENT_PATTERN = '254556' // ثبت نام در قرعه کشی + this.WARRANTY_RECEPTION_PATTERN = '239482' // دریافت کالا برای گارانتی + this.WARRANTY_REPAIR_COMPLETED_PATTERN = '968726' // اتمام تعمیر گارانتی + this.WARRANTY_SENDBACK_PATTERN = '128079' // ارسال کالا پس از گارانتی + // + this.PIECE_REQUEST_SENT_PATTERN = '656765' // ارسال درخواست قطعه + this.PIECE_REQUEST_ONGOING_PATTERN = '153240' // در دست اقدام درخواست قطعه + this.PIECE_REQUEST_WAITING_PATTERN = '611156' // انتظار درخواست قطعه + this.PIECE_REQUEST_DELIVERED_PATTERN = '312081' // تحویل درخواست قطعه + // + this.REPRESENTATION_SUBMITTED_PATTERN = '117321' // ثبت درخواست نمایندگی + this.REPRESENTATION_STATUS_UPDATE_PATTERN = '765284' // به‌روزرسانی وضعیت نمایندگی + this.REPRESENTATION_UPLOAD_ACCESS_PATTERN = '564752' // دسترسی آپلود نمایندگی + this.REPRESENTATION_EDIT_ACCESS_PATTERN = '863757' // دسترسی ویرایش نمایندگی + this.REPRESENTATION_UNDER_REVIEW_PATTERN = '800883' // نمایندگی در حال بررسی + // + // Guarantee Report Patterns + this.GUARANTEE_REPORT_SENT_PATTERN = '752621' // ارسال گزارش گارانتی + this.GUARANTEE_FORM_DELIVERED_PATTERN = '752315' // تحویل فرم گارانتی + this.GUARANTEE_FORM_WAITING_PATTERN = '903583' // در انتظار قطعه برای فرم گارانتی + this.GUARANTEE_FORM_ONGOING_PATTERN = '495824' // اقدام برای فرم گارانتی + this.GUARANTEE_FORM_OFFICE_DELIVERY_PATTERN = '518885' // تحویل فرم گارانتی به دفتر + this.GUARANTEE_FORM_REGISTRATION_PATTERN = '146994' // ثبت فرم گارانتی + + // + this.OLD_PIECE_REQUEST_PATTERN = '859135' // ارسال درخواست قطعه داغی + this.OLD_PIECE_REQUEST_ONGOING_PATTERN = '474942' // در دست اقدام بودن قطعه داغی + this.OLD_PIECE_REQUEST_WAITING_PATTERN = '575103' // انتظار قطعه برای قطعه داغی + this.OLD_PIECE_REQUEST_DELIVERED_PATTERN = '262772' // تحویل قطعه داغی + // this.OLD_PIECE_REQUEST_CANCELED_PATTERN = '83619' + this.BROADCAST_PATTERN = '83615' + this.BUFFER_REQUEST_PATTERN = '981226' // ارسال درخواست کالای بافر + this.BUFFER_REQUEST_ONGOING_PATTERN = '438301' // در دست اقدام بودن کالای بافر + this.BUFFER_REQUEST_WAITING_PATTERN = '300864' // انتظار قطعه برای کالای بافر + this.BUFFER_REQUEST_DELIVERED_PATTERN = '649466' // تحویل کالای بافر this.SMS_API_KEY = apiKey } @@ -81,6 +80,1023 @@ class SmsService { return data } catch (error) { console.error('Error in sending OTP SMS', error) + throw error } } + + /// //////////////////////////////////////////////////////////// + async sendTransactionSubmittedSMS(mobile, transactionNumber, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'transactionNumber', value: `${transactionNumber}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.TRANSACTION_SUBMITTED_PATTERN + } + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Transaction SMS', error) + throw error + } + } + /// //////////////////////////////////////////////////////////// + + async sendTransactionReceivedSMS(mobile, tempNumber, receiptNumber, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'tempNumber', value: `${tempNumber}` }, + { name: 'receiptNumber', value: `${receiptNumber}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.TRANSACTION_RECEIVED_PATTERN + } + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Transaction Received SMS', error.response.data) + throw error + } + } + + async sendTransactionOngoingSMS(mobile, receiptNumber, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'receiptNumber', value: `${receiptNumber}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.TRANSACTION_ONGOING_PATTERN + } + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Transaction Ongoing SMS', error) + throw error + } + } + + async sendTransactionWaitingSMS(mobile, receiptNumber, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'receiptNumber', value: `${receiptNumber}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.TRANSACTION_WAITING_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Transaction Waiting SMS', error) + throw error + } + } + /// //////////////////////////////////////////////////////////// + + async sendTransactionDeliveredSMS(mobile, receiptNumber, deliveryCode = '', date = new Date()) { + const smsData = { + Parameters: [ + { name: 'receiptNumber', value: `${receiptNumber}` }, + { name: 'deliveryCode', value: `${deliveryCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.TRANSACTION_DELIVERED_PATTERN + } + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Transaction Delivered SMS', error) + throw error + } + } + + async sendDeviceLoginSMS(mobile, deviceName) { + const smsData = { + Parameters: [{ name: 'deviceName', value: `${deviceName}` }], + Mobile: mobile, + TemplateId: this.DEVICE_LOGIN_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Device Login SMS', error) + throw error + } + } + + async sendOTPVerificationSMS(mobile, otp, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'otp', value: `${otp}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.OTP_VERIFICATION_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending OTP Verification SMS', error) + throw error + } + } + + async sendGuaranteeReportSentSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.GUARANTEE_REPORT_SENT_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Guarantee Report SMS', error) + throw error + } + } + + async sendGuaranteeFormDeliveredSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.GUARANTEE_FORM_DELIVERED_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Guarantee Form Delivered SMS', error) + throw error + } + } + + async sendGuaranteeFormWaitingSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.GUARANTEE_FORM_WAITING_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Guarantee Form Waiting SMS', error) + throw error + } + } + + async sendGuaranteeFormOngoingSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.GUARANTEE_FORM_ONGOING_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Guarantee Form Ongoing SMS', error) + throw error + } + } + + async sendGuaranteeFormOfficeDeliverySMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.GUARANTEE_FORM_OFFICE_DELIVERY_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Guarantee Form Office Delivery SMS', error) + throw error + } + } + + async sendGuaranteeFormRegistrationSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.GUARANTEE_FORM_REGISTRATION_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Guarantee Form Registration SMS', error) + throw error + } + } + + async sendMobileVerificationCodeSMS(mobile, mobileKey, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'MOBILEKEY', value: `${mobileKey}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.MOBILE_VERIFICATION_CODE_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Mobile Verification Code SMS', error) + throw error + } + } + + async sendPasswordResetSMS(mobile, resetUrl, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'resetlink', value: `${resetUrl}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.PASSWORD_RESET_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Password Reset SMS', error) + throw error + } + } + + async sendLotteryEnrollmentSMS(mobile, fullName, enrollCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'fullName', value: `${fullName}` }, + { name: 'enrollCode', value: `${enrollCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.LOTTERY_ENROLLMENT_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Lottery Enrollment SMS', error) + throw error + } + } + + async sendWarrantyReceptionSMS(mobile, fullName, tempReceiptNumber, permanentReceiptNumber, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'fullName', value: `${fullName}` }, + { name: 'tempReceiptNumber', value: `${tempReceiptNumber}` }, + { name: 'permanentReceiptNumber', value: `${permanentReceiptNumber}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.WARRANTY_RECEPTION_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Warranty Reception SMS', error) + throw error + } + } + + async sendWarrantyRepairCompletedSMS(mobile, fullName, itemReceptionNumber, invoiceNumber, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'fullName', value: `${fullName}` }, + { name: 'itemReceptionNumber', value: `${itemReceptionNumber}` }, + { name: 'invoiceNumber', value: `${invoiceNumber}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.WARRANTY_REPAIR_COMPLETED_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Warranty Repair Completed SMS', error) + throw error + } + } + + async sendWarrantySendbackSMS(mobile, fullName, itemReceptionNumber, deliveryCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'fullName', value: `${fullName}` }, + { name: 'itemReceptionNumber', value: `${itemReceptionNumber}` }, + { name: 'deliveryCode', value: `${deliveryCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.WARRANTY_SENDBACK_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Warranty Sendback SMS', error) + throw error + } + } + + async sendPieceRequestSentSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.PIECE_REQUEST_SENT_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Piece Request Sent SMS', error) + throw error + } + } + + async sendPieceRequestOngoingSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.PIECE_REQUEST_ONGOING_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Piece Request Ongoing SMS', error) + throw error + } + } + + async sendPieceRequestWaitingSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.PIECE_REQUEST_WAITING_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Piece Request Waiting SMS', error) + throw error + } + } + + async sendPieceRequestDeliveredSMS(mobile, trackingCode, deliveryCode = '', date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'deliveryCode', value: `${deliveryCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.PIECE_REQUEST_DELIVERED_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Piece Request Delivered SMS', error) + throw error + } + } + + async sendRepresentationSubmittedSMS(mobile, representationCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'representationCode', value: `${representationCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.REPRESENTATION_SUBMITTED_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Representation Submitted SMS', error) + throw error + } + } + + async sendRepresentationStatusUpdateSMS(mobile, representationCode, statusPhrase, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'representationCode', value: `${representationCode}` }, + { name: 'statusPhrase', value: `${statusPhrase}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.REPRESENTATION_STATUS_UPDATE_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Representation Status Update SMS', error) + throw error + } + } + + async sendRepresentationUploadAccessSMS(mobile, representationCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'representationCode', value: `${representationCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.REPRESENTATION_UPLOAD_ACCESS_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Representation Upload Access SMS', error) + throw error + } + } + + async sendRepresentationEditAccessSMS(mobile, date = new Date()) { + const smsData = { + Parameters: [{ name: 'date', value: `${formatSMSDate(date)}` }], + Mobile: mobile, + TemplateId: this.REPRESENTATION_EDIT_ACCESS_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Representation Edit Access SMS', error) + throw error + } + } + + async sendRepresentationUnderReviewSMS(mobile, representationCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'representationCode', value: `${representationCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.REPRESENTATION_UNDER_REVIEW_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Representation Under Review SMS', error) + throw error + } + } + + async sendOldPieceRequestSentSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.OLD_PIECE_REQUEST_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Old Piece Request SMS', error) + throw error + } + } + + async sendOldPieceRequestOngoingSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.OLD_PIECE_REQUEST_ONGOING_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Old Piece Request Ongoing SMS', error) + throw error + } + } + + async sendOldPieceRequestWaitingSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.OLD_PIECE_REQUEST_WAITING_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Old Piece Request Waiting SMS', error) + throw error + } + } + + async sendOldPieceRequestDeliveredSMS(mobile, trackingCode, deliveryCode = '', date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` }, + { name: 'deliveryCode', value: `${deliveryCode}` } + ], + Mobile: mobile, + TemplateId: this.OLD_PIECE_REQUEST_DELIVERED_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Old Piece Request Delivered SMS', error) + throw error + } + } + + /// //////////////////////////////////////////////////////////// + + async sendBufferRequestSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.BUFFER_REQUEST_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Buffer Request SMS', error) + throw error + } + } + + async sendBufferRequestOngoingSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.BUFFER_REQUEST_ONGOING_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Buffer Request Ongoing SMS', error) + throw error + } + } + + async sendBufferRequestWaitingSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.BUFFER_REQUEST_WAITING_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Buffer Request Waiting SMS', error) + throw error + } + } + + async sendBufferRequestDeliveredSMS(mobile, trackingCode, deliveryCode = '', date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` }, + { name: 'deliveryCode', value: `${deliveryCode}` } + ], + Mobile: mobile, + TemplateId: this.BUFFER_REQUEST_DELIVERED_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Buffer Request Delivered SMS', error) + throw error + } + } + + async sendBroadcastSMS(mobile, message) { + const smsData = { + Parameters: [{ name: 'message', value: `${message}` }], + Mobile: mobile, + TemplateId: this.BROADCAST_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Broadcast SMS', error) + throw error + } + } + + async sendOldPieceRequestCanceledSMS(mobile, trackingCode, date = new Date()) { + const smsData = { + Parameters: [ + { name: 'trackingCode', value: `${trackingCode}` }, + { name: 'date', value: `${formatSMSDate(date)}` } + ], + Mobile: mobile, + TemplateId: this.OLD_PIECE_REQUEST_CANCELED_PATTERN + } + + try { + const { data } = await axios.post(`${this.API_URL_FAST}/send/verify`, smsData, { + headers: { + 'X-API-KEY': this.SMS_API_KEY, + 'Content-Type': 'application/json' + } + }) + return data + } catch (error) { + console.error('Error in sending Old Piece Request Canceled SMS', error) + throw error + } + } + + /// //////////////////////////////////////////////////////////// +} + +// Create a shared SMS service instance +const smsService = new SmsService('QkkNxhyXZ6GtEf1soOTtikomO3mA4LaNQDH8mol8huDIwh00') + +// Clean SMS service exports - organized structure +module.exports = { + // Service class export for advanced usage + SmsService, + + // Organized SMS methods by category + auth: { + sendOTP: (mobile, otp) => smsService.sendOTPSms(otp, mobile), + deviceLogin: (mobile, deviceName) => smsService.sendDeviceLoginSMS(mobile, deviceName), + otpVerification: (mobile, otp, date) => smsService.sendOTPVerificationSMS(mobile, otp, date), + mobileVerificationCode: (mobile, mobileKey, date) => + smsService.sendMobileVerificationCodeSMS(mobile, mobileKey, date), + passwordReset: (mobile, resetUrl, date) => smsService.sendPasswordResetSMS(mobile, resetUrl, date) + }, + + transaction: { + submitted: (mobile, transactionNumber, date) => + smsService.sendTransactionSubmittedSMS(mobile, transactionNumber, date), + received: (mobile, tempNumber, receiptNumber, date) => + smsService.sendTransactionReceivedSMS(mobile, tempNumber, receiptNumber, date), + ongoing: (mobile, receiptNumber, date) => smsService.sendTransactionOngoingSMS(mobile, receiptNumber, date), + waiting: (mobile, receiptNumber, date) => smsService.sendTransactionWaitingSMS(mobile, receiptNumber, date), + delivered: (mobile, receiptNumber, deliveryCode, date) => + smsService.sendTransactionDeliveredSMS(mobile, receiptNumber, deliveryCode, date) + }, + + bufferRequest: { + sent: (mobile, trackingCode, date) => smsService.sendBufferRequestSMS(mobile, trackingCode, date), + ongoing: (mobile, trackingCode, date) => smsService.sendBufferRequestOngoingSMS(mobile, trackingCode, date), + waiting: (mobile, trackingCode, date) => smsService.sendBufferRequestWaitingSMS(mobile, trackingCode, date), + delivered: (mobile, trackingCode, deliveryCode, date) => + smsService.sendBufferRequestDeliveredSMS(mobile, trackingCode, deliveryCode, date) + }, + + oldPieceRequest: { + sent: (mobile, trackingCode, date) => smsService.sendOldPieceRequestSentSMS(mobile, trackingCode, date), + ongoing: (mobile, trackingCode, date) => smsService.sendOldPieceRequestOngoingSMS(mobile, trackingCode, date), + waiting: (mobile, trackingCode, date) => smsService.sendOldPieceRequestWaitingSMS(mobile, trackingCode, date), + delivered: (mobile, trackingCode, deliveryCode, date) => + smsService.sendOldPieceRequestDeliveredSMS(mobile, trackingCode, deliveryCode, date), + canceled: (mobile, trackingCode, date) => smsService.sendOldPieceRequestCanceledSMS(mobile, trackingCode, date) + }, + + guaranteeReport: { + sent: (mobile, trackingCode, date) => smsService.sendGuaranteeReportSentSMS(mobile, trackingCode, date) + }, + + guaranteeForm: { + delivered: (mobile, trackingCode, date) => smsService.sendGuaranteeFormDeliveredSMS(mobile, trackingCode, date), + waiting: (mobile, trackingCode, date) => smsService.sendGuaranteeFormWaitingSMS(mobile, trackingCode, date), + ongoing: (mobile, trackingCode, date) => smsService.sendGuaranteeFormOngoingSMS(mobile, trackingCode, date), + officeDelivery: (mobile, trackingCode, date) => + smsService.sendGuaranteeFormOfficeDeliverySMS(mobile, trackingCode, date), + registration: (mobile, trackingCode, date) => + smsService.sendGuaranteeFormRegistrationSMS(mobile, trackingCode, date) + }, + /// /////////////////////////////////////////////////////////// + lottery: { + enrollment: (mobile, fullName, enrollCode, date) => + smsService.sendLotteryEnrollmentSMS(mobile, fullName, enrollCode, date) + }, + + warranty: { + reception: (mobile, fullName, tempReceiptNumber, permanentReceiptNumber, date) => + smsService.sendWarrantyReceptionSMS(mobile, fullName, tempReceiptNumber, permanentReceiptNumber, date), + repairCompleted: (mobile, fullName, itemReceptionNumber, invoiceNumber, date) => + smsService.sendWarrantyRepairCompletedSMS(mobile, fullName, itemReceptionNumber, invoiceNumber, date), + sendback: (mobile, fullName, itemReceptionNumber, deliveryCode, date) => + smsService.sendWarrantySendbackSMS(mobile, fullName, itemReceptionNumber, deliveryCode, date) + }, + + pieceRequest: { + sent: (mobile, trackingCode, date) => smsService.sendPieceRequestSentSMS(mobile, trackingCode, date), + ongoing: (mobile, trackingCode, date) => smsService.sendPieceRequestOngoingSMS(mobile, trackingCode, date), + waiting: (mobile, trackingCode, date) => smsService.sendPieceRequestWaitingSMS(mobile, trackingCode, date), + delivered: (mobile, trackingCode, deliveryCode, date) => + smsService.sendPieceRequestDeliveredSMS(mobile, trackingCode, deliveryCode, date) + }, + + representation: { + submitted: (mobile, representationCode, date) => + smsService.sendRepresentationSubmittedSMS(mobile, representationCode, date), + statusUpdate: (mobile, representationCode, statusPhrase, date) => + smsService.sendRepresentationStatusUpdateSMS(mobile, representationCode, statusPhrase, date), + uploadAccess: (mobile, representationCode, date) => + smsService.sendRepresentationUploadAccessSMS(mobile, representationCode, date), + editAccess: (mobile, date) => smsService.sendRepresentationEditAccessSMS(mobile, date), + underReview: (mobile, representationCode, date) => + smsService.sendRepresentationUnderReviewSMS(mobile, representationCode, date) + }, + + broadcast: (mobile, message) => smsService.sendBroadcastSMS(mobile, message) } diff --git a/server/plugins/cronJobs.js b/server/plugins/cronJobs.js index 5c52d70..464f9b6 100644 --- a/server/plugins/cronJobs.js +++ b/server/plugins/cronJobs.js @@ -7,10 +7,10 @@ const Survey = require('../models/Survey') const Announcement = require('../models/Announcement') const { saveUserToArpa, updateUserOnArpa } = require('../ArpaWebservice') const { generateRandomDigitsInRangeOf } = require('./controllersHelperFunctions') -const { SMS } = require('./SMS_Module') +const sms = require('./SMS_Module') const { phrases } = require('./SMS_Phrases') // eslint-disable-next-line import/order -const Cron = require("cron").CronJob; +const Cron = require('cron').CronJob /// /////// times const minute = 1000 * 60 @@ -19,33 +19,32 @@ const day = hour * 24 /// /////// jobs -const job = new Cron("0 0 * * *", async () => { +const job = new Cron('0 0 * * *', async () => { console.log('✅ --job: check devices for activation is running') try { const devices = await InstalledDevice.find({ - $or: [ - { status: 0 }, - { status: 2 } - ] - }).populate('userId', 'mobile_number').populate('deviceId', 'model') + $or: [{ status: 0 }, { status: 2 }] + }) + .populate('userId', 'mobile_number') + .populate('deviceId', 'model') for await (const device of devices) { // item time and timeout const itemTime = Date.parse(device.created_at) - const timeout = itemTime + (day * 3) + const timeout = itemTime + day * 3 if (Date.now() >= timeout && !device.check) { - device.check = true; + device.check = true await device.save() - SMS([device.userId.mobile_number], `کاربر گرامی\n \n \nجهت ثبت سیمکارت برای دستگاه ${device.deviceId.model} \nبا شناسه : ${device.IMEI} \nلطفا زود تر اقدام کنید `) + await sms.auth.sendOTP( + device.userId.mobile_number, + `کاربر گرامی\n \n \nجهت ثبت سیمکارت برای دستگاه ${device.deviceId.model} \nبا شناسه : ${device.IMEI} \nلطفا زود تر اقدام کنید ` + ) } } - } catch (e) { console.log(e) } - - }) const jobs = { checkUserActivation() { @@ -179,7 +178,7 @@ const jobs = { phrases.signature ] - SMS([item.mobile], msg.join('')) + await sms.auth.sendOTP(item.mobile, msg.join('')) } /// /////////////////////////////////////////////////////// fake data for tests @@ -227,7 +226,7 @@ const jobs = { '\n', `https://asan-service.com/account/survey?code=${item.code}` ] - SMS([item.user.mobile_number], msg.join(' ')) + await sms.auth.sendOTP(item.user.mobile_number, msg.join(' ')) item.smsSent = true await item.save() }