Skip to content

Commit

Permalink
Merge pull request #3737 from betagouv/mail-demo
Browse files Browse the repository at this point in the history
Mail d'invitation aux démo
  • Loading branch information
clairezed authored Dec 19, 2024
2 parents 901ea2a + f63119c commit bad32b7
Show file tree
Hide file tree
Showing 13 changed files with 187 additions and 1 deletion.
17 changes: 17 additions & 0 deletions app/admin/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
item t('active_admin.user.impersonate', name: u.full_name), impersonate_engine.impersonate_user_path(u)
item t('active_admin.person.normalize_values'), normalize_values_admin_user_path(u)
item t('active_admin.user.do_invite'), invite_user_admin_user_path(u)
item(t('active_admin.user.invite_to_demo'), invite_to_demo_admin_user_path(u)) if u.first_expert_with_subject.present?
end
end

Expand Down Expand Up @@ -141,12 +142,16 @@
row :inviter
row :invitation_sent_at
row :invitation_accepted_at
row :demo_invited_at
end
end

sidebar I18n.t('active_admin.user.send_emails'), only: :show do
ul class: 'actions' do
li link_to t('active_admin.user.do_invite'), invite_user_admin_user_path(user), class: 'action'
if user.first_expert_with_subject.present?
li link_to t('active_admin.user.invite_to_demo'), invite_to_demo_admin_user_path(user), class: 'action'
end
li link_to t('active_admin.user.do_reset_password'), reset_password_admin_user_path(user), class: 'action'
end
end
Expand Down Expand Up @@ -225,6 +230,11 @@
redirect_back fallback_location: collection_path, notice: t('active_admin.user.do_invite_done')
end

member_action :invite_to_demo do
resource.invite_to_demo unless resource.deleted?
redirect_back fallback_location: collection_path, notice: t('active_admin.user.invited_to_demo')
end

member_action :reset_password do
resource.send_reset_password_instructions
redirect_back fallback_location: collection_path, notice: t('active_admin.user.do_reset_password_done')
Expand All @@ -242,6 +252,13 @@
redirect_back fallback_location: collection_path, notice: I18n.t('active_admin.user.do_invite_done')
end

batch_action I18n.t('active_admin.user.invite_to_demo') do |ids|
batch_action_collection.find(ids).each do |user|
user.invite_to_demo unless user.deleted?
end
redirect_back fallback_location: collection_path, notice: I18n.t('active_admin.user.invited_to_demo')
end

batch_action :destroy, confirm: I18n.t('active_admin.users.delete_confirmation') do |ids|
User.where(id: ids).find_each { |u| u.soft_delete }
redirect_to collection_path, notice: I18n.t('active_admin.user.deleted')
Expand Down
13 changes: 13 additions & 0 deletions app/mailers/user_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,19 @@ def quarterly_report
end
end

def invite_to_demo
with_user_init do
@expert_email = @user.first_expert_with_subject&.email
return if @expert_email.nil?

@demo_dates = DemoPlanning.new.call
mail(
to: @user.email_with_display_name,
subject: t('mailers.user_mailer.invite_to_demo.subject')
)
end
end

private

def with_user_init
Expand Down
6 changes: 6 additions & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
# current_sign_in_at :datetime
# current_sign_in_ip :inet
# deleted_at :datetime
# demo_invited_at :datetime
# email :string default("")
# encrypted_password :string default(""), not null
# full_name :string
Expand Down Expand Up @@ -229,6 +230,11 @@ def invitation_not_accepted?
invitation_accepted_at.nil?
end

def invite_to_demo
UserMailer.with(user: self).invite_to_demo.deliver_later
self.update(demo_invited_at: Time.zone.now)
end

## Deactivation and soft deletion
#
def active_for_authentication?
Expand Down
21 changes: 21 additions & 0 deletions app/services/demo_planning.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
class DemoPlanning
def initialize
@dates = YAML.load_file("#{Rails.root.join("config", "data", "demo_planning.yml")}")
end

def call
@dates = cast_dates
return next_dates(4)
end

private

def cast_dates
list = @dates["demo_planning"].map{ |date| Date.parse(date) }
end

def next_dates(number)
today = Date.today
@dates.select { |date| date > today }.first(number)
end
end
32 changes: 32 additions & 0 deletions app/views/mailers/user_mailer/invite_to_demo.mjml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<mj-section>
<mj-column>
<mj-text>
<p><%= t('devise.mailer.hello', user_full_name: @user.full_name) %></p>
<p><%= t('.intro_html', link_to_root: link_to(t('app_name'), root_url)) %></p>
<p><%= t('.confirmation_html', user_email: @user.email, expert_email: @expert_email) %></p>
<p><%= t('.demo_time_intro') %></p>
</mj-text>

<% if @demo_dates.any? %>
<mj-text>
<p><%= t('.next_dates') %></p>
<ul>
<% @demo_dates.each do |date| %>
<li><%= I18n.l(date, format: :long) %></li>
<% end %>
</ul>
</mj-text>
<% end %>

<mj-text>
<p><%= t('.webinaire_link_html') %></p>
<p><%= t('.video_tutorial_html') %></p>
<p><%= t('mailers.looking_forward') %></p>

<p><%= @support_user.full_name %></p>

</mj-text>
</mj-column>
</mj-section>

<%= render 'mailers/expert_mailer/support_user_signature', support_user: @support_user, sent_personally: true %>
47 changes: 47 additions & 0 deletions config/data/demo_planning.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
demo_planning:
- '09/01/2025'
- '16/01/2025'
- '23/01/2025'
- '30/01/2025'
- '06/02/2025'
- '13/02/2025'
- '20/02/2025'
- '27/02/2025'
- '06/03/2025'
- '13/03/2025'
- '20/03/2025'
- '27/03/2025'
- '03/04/2025'
- '10/04/2025'
- '17/04/2025'
- '24/04/2025'
- '15/05/2025'
- '22/05/2025'
- '05/06/2025'
- '12/06/2025'
- '19/06/2025'
- '26/06/2025'
- '03/07/2025'
- '10/07/2025'
- '17/07/2025'
- '24/07/2025'
- '31/07/2025'
- '07/08/2025'
- '21/08/2025'
- '28/08/2025'
- '04/09/2025'
- '11/09/2025'
- '18/09/2025'
- '25/09/2025'
- '02/10/2025'
- '09/10/2025'
- '16/10/2025'
- '23/10/2025'
- '30/10/2025'
- '06/11/2025'
- '13/11/2025'
- '20/11/2025'
- '27/11/2025'
- '04/12/2025'
- '11/12/2025'
- '18/12/2025'
8 changes: 8 additions & 0 deletions config/locales/mailers.fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,14 @@ fr:
thanks_for_your_comprehension: Nous vous remercions pour votre compréhension.
thanks_for_your_trust: Merci pour votre confiance,
user_mailer:
invite_to_demo:
confirmation_html: Après avoir choisi votre mot de passe, vous recevrez sur le mail <a href="mailto:%{expert_email}">%{expert_email}</a> les besoins d'entreprises sur votre champ de compétences. Vous pourrez échanger avec d’autres institutions partenaires sur les situations d’entreprise.
demo_time_intro: Je vous invite à participer au webinaire de présentation du service (30 minutes) qui se déroule chaque jeudi à 14h30 (heure de Paris).
intro_html: Dans le cadre de votre référencement au sein du service %{link_to_root}, je viens de vous envoyer une invitation afin de valider votre compte utilisateur. Attention, elle peut arriver dans vos indésirables.
next_dates: 'Les prochaines dates :'
subject: Vous êtes invité(e) ! Webinaire de présentation de Conseillers-Entreprises.Service-Public.fr
video_tutorial_html: 'Ou venez découvrir notre tutoriel vidéo : <a href=''https://conseillers-entreprises.service-public.fr/tutoriels''>conseillers-entreprises.service-public.fr/tutoriels</a>'
webinaire_link_html: 'Lien participant : <a href=''https://webinaire.numerique.gouv.fr//meeting/signin/34546/creator/17678/hash/0033028ea90c21b6bb2cca160d0e663f85b82f7d''>cliquez ici pour accéder à la visio</a>'
quarterly_report:
antenne_manager:
one: Vous êtes identifié(e) comme responsable de l’antenne %{antennes} au sein du service Conseillers-Entreprises.
Expand Down
3 changes: 3 additions & 0 deletions config/locales/models.fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,8 @@ fr:
do_reset_password_done: Réinitialisation du mot de passe envoyée
duplicate_territories: Dupliquer les territoires spécifiques
impersonate: Voir le site comme %{name}
invite_to_demo: Inviter à une démo
invited_to_demo: Invitation(s) à la démo envoyée(s)
roles: Rôles
saved: Conseiller mis à jour
send_emails: Envoi d’emails
Expand Down Expand Up @@ -586,6 +588,7 @@ fr:
current_password: Mot de passe actuel
current_sign_in_at: Date de connexion
current_sign_in_ip: IP de connexion
demo_invited_at: Invitation démo
encrypted_password: Mot de passe chiffré
experts:
one: Équipe
Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20241212161520_add_demo_invited_at_to_users.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddDemoInvitedAtToUsers < ActiveRecord::Migration[7.0]
def change
add_column :users, :demo_invited_at, :datetime
end
end
3 changes: 2 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.2].define(version: 2024_11_28_160019) do
ActiveRecord::Schema[7.2].define(version: 2024_12_12_161520) do
# These are extensions that must be enabled in order to support this database
enable_extension "pg_trgm"
enable_extension "plpgsql"
Expand Down Expand Up @@ -723,6 +723,7 @@
t.datetime "deleted_at", precision: nil
t.datetime "cgu_accepted_at", precision: nil
t.jsonb "app_info", default: {}
t.datetime "demo_invited_at"
t.index ["antenne_id"], name: "index_users_on_antenne_id"
t.index ["deleted_at"], name: "index_users_on_deleted_at"
t.index ["email"], name: "index_users_on_email", unique: true, where: "((email)::text <> NULL::text)"
Expand Down
Binary file modified doc/domain_model.pdf
Binary file not shown.
4 changes: 4 additions & 0 deletions spec/mailers/previews/user_mailer_preview.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,8 @@ class UserMailerPreview < ActionMailer::Preview
def quarterly_report
UserMailer.with(user: User.active.managers.sample).quarterly_report
end

def invite_to_demo
UserMailer.with(user: User.active.joins(:experts).merge(Expert.not_deleted.with_subjects).sample).invite_to_demo
end
end
29 changes: 29 additions & 0 deletions spec/mailers/user_mailer_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# frozen_string_literal: true

require 'rails_helper'
require 'mailers/shared_examples_for_an_email'

describe UserMailer do
describe '#invite_to_demo' do
let!(:national_referent) { create :user, :national_referent }

subject(:mail) { described_class.with(user: user).invite_to_demo.deliver_now }

context 'when user has subjects' do
let(:user) { create :user, :with_expert_subjects }

it_behaves_like 'an email'

it { expect(mail.header[:from].value).to eq ExpertMailer::SENDER }
end

context 'when user has no subjects' do
let(:user) { create :user }

let(:mail) { subject }

it { expect(mail).to be_nil }
end

end
end

0 comments on commit bad32b7

Please sign in to comment.