diff --git a/app/jobs/sendinblue/sms_credits_warning_job.rb b/app/jobs/sendinblue/sms_credits_warning_job.rb new file mode 100644 index 0000000000000000000000000000000000000000..a4d75d464d47b18c0ff881c1664d97552722285c --- /dev/null +++ b/app/jobs/sendinblue/sms_credits_warning_job.rb @@ -0,0 +1,13 @@ +class Sendinblue::SmsCreditsWarningJob < ApplicationJob + queue_as :default + + def perform + return unless ENV['APPLICATION_ENV'] == 'production' + sms_service = Sendinblue::SmsService.new + if sms_service.low? + # this message is sent to server_admins only, and server_admins are duplicated between all universities. + # so we take the first university + NotificationMailer.low_sms_credits(University.first, sms_service.sms_credits).deliver_later + end + end +end \ No newline at end of file diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb index 0f4326c20c5ad6427ebbecbb9ab30e204386e643..c4c9aa3b11e0c942ef52317d3bf54b3525f615cb 100644 --- a/app/mailers/notification_mailer.rb +++ b/app/mailers/notification_mailer.rb @@ -29,5 +29,13 @@ class NotificationMailer < ApplicationMailer subject = t('mailers.notifications.website_invalid_access_token.subject', website: website) mail(from: user.university.mail_from[:full], to: user.email, subject: subject) end + + def low_sms_credits(university, credits) + merge_with_university_infos(university, {}) + @credits = credits.to_i + mails = university.users.server_admin.pluck(:email) + subject = t('mailers.notifications.low_sms_credits.subject', credits: @credits) + mail(from: university.mail_from[:full], to: mails, subject: subject) + end end diff --git a/app/services/sendinblue/sms_service.rb b/app/services/sendinblue/sms_service.rb index 41b11efe98e0921b771b3b526540e51748df35f9..3df91bfe31029695ef3f2d6cc3dded5b2f782010 100644 --- a/app/services/sendinblue/sms_service.rb +++ b/app/services/sendinblue/sms_service.rb @@ -1,26 +1,35 @@ module Sendinblue class SmsService DEFAULT_SENDER_NAME = 'Osuny'.freeze - + SMS_CREDITS_LIMIT = 500 + def self.send_mfa_code(user, code) duration = ActiveSupport::Duration.build(Rails.application.config.devise.direct_otp_valid_for).inspect message = I18n.t('sms_code', code: code, context: user.registration_context, duration: duration) self.send_message(user, message) end - private + def sms_credits + @sms_credits ||= plan.detect { |plan| plan.type == 'sms' }&.credits + end + def low? + sms_credits.present? && sms_credits < SMS_CREDITS_LIMIT + end + + private + def self.send_message(user, message) sender_name = user.university.sms_sender_name sender_name ||= DEFAULT_SENDER_NAME - + api_instance = SibApiV3Sdk::TransactionalSMSApi.new send_transac_sms = SibApiV3Sdk::SendTransacSms.new( sender: sender_name, recipient: user.mobile_phone, content: message ) - + begin # Send SMS message to a mobile number result = api_instance.send_transac_sms(send_transac_sms) @@ -29,5 +38,13 @@ module Sendinblue puts "Exception when calling TransactionalSMSApi->send_transac_sms: #{e}" end end + + def plan + @plan ||= account_api.get_account.plan + end + + def account_api + @account_api ||= SibApiV3Sdk::AccountApi.new + end end end diff --git a/app/views/mailers/notifications/low_sms_credits.html.erb b/app/views/mailers/notifications/low_sms_credits.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..1407e04402742964ae4c37e023a62c8265f7cc82 --- /dev/null +++ b/app/views/mailers/notifications/low_sms_credits.html.erb @@ -0,0 +1,3 @@ +<%= t('mailers.notifications.low_sms_credits.body_1_html', credits: @credits) %> +<br> +<%= t('mailers.notifications.low_sms_credits.body_2_html', link: 'https://app.sendinblue.com/billing/addon/customize/sms') %> \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index ca4e14f229a396f67bc176a9e9bf43d30002d53d..e3b18745ed26133871fd7b07ef9b356d266b12ed 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -270,6 +270,10 @@ en: text_line_3_html: "Number of lines in the file: %{number}." text_error_msg: "Line %{line}: %{error}" text_errors_title: "Some errors have occured:" + low_sms_credits: + body_1_html: "Warning, your SMS credits are low: %{credits} credits remaining!" + body_2_html: "Click <a href=\"%{link}\" target=\"_blank\" style=\"color: #c72b43;\">here</a> to refull." + subject: "Osuny - Low SMS Credits (%{credits})" website_invalid_access_token: subject: "Expired access token for \"%{website}\"" text_line_1_html: "The access token used for the website \"%{website}\" has expired and does not allow the website to be updated anymore." diff --git a/config/locales/fr.yml b/config/locales/fr.yml index aa61ec47d90638731970dff4ff1ce263b2442739..0b58be5c53d1c62376ee17beae0ef7bc8ba7dd9d 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -270,6 +270,10 @@ fr: text_line_3_html: "Nombre de lignes traitées : %{number}." text_error_msg: "Ligne %{line} : %{error}" text_errors_title: "Des erreurs sont survenues :" + low_sms_credits: + body_1_html: "Attention, vos crédits SMS sont bas : %{credits} crédits restants !" + body_2_html: "Cliquez <a href=\"%{link}\" target=\"_blank\" style=\"color: #c72b43;\">ici</a> pour recharger le compte." + subject: "Osuny - Credits SMS bas (%{credits})" website_invalid_access_token: subject: Jeton d'accès expiré pour « %{website} » text_line_1_html: Le jeton d'accès utilisé pour le site « %{website} » a expiré et ne permet plus la mise à jour du site. diff --git a/test/mailers/previews/notification_mailer_preview.rb b/test/mailers/previews/notification_mailer_preview.rb index 33256351021ef84873e9a03b69f1c020649d1c25..d5557f836e051baa7aea245d9486f0f97b8b3848 100644 --- a/test/mailers/previews/notification_mailer_preview.rb +++ b/test/mailers/previews/notification_mailer_preview.rb @@ -1,14 +1,27 @@ +# Preview all emails at http://localhost:3000/rails/mailers/notification_mailer + class NotificationMailerPreview < BaseMailerPreview + + # Preview this email at http://localhost:3000/rails/mailers/notification_mailer/import def import NotificationMailer.import(organizations_import) end - + + # Preview this email at http://localhost:3000/rails/mailers/notification_mailer/emergency_message def emergency_message NotificationMailer.emergency_message(sample_emergency_message, user, 'fr') end - + + # Preview this email at http://localhost:3000/rails/mailers/notification_mailer/website_invalid_access_token def website_invalid_access_token NotificationMailer.website_invalid_access_token(website, user) end + # Preview this email at http://localhost:3000/rails/mailers/notification_mailer/low_sms_credits + def low_sms_credits + credits = 22.0 + NotificationMailer.low_sms_credits(university, credits) + end + + end