diff --git a/app/controllers/instructeurs/avis_controller.rb b/app/controllers/instructeurs/avis_controller.rb index 28bcd74b1..9f5cb46b2 100644 --- a/app/controllers/instructeurs/avis_controller.rb +++ b/app/controllers/instructeurs/avis_controller.rb @@ -14,17 +14,12 @@ module Instructeurs end end - def revive + def remind avis = Avis.find(params[:id]) - if avis.revivable_by?(current_instructeur) - if avis.answer.blank? - AvisMailer.avis_invitation(avis).deliver_later - flash.notice = "Un mail de relance a été envoyé à #{avis.expert.email}" - redirect_back(fallback_location: avis_instructeur_dossier_path(avis.procedure, avis.dossier)) - else - flash.alert = "#{avis.expert.email} a déjà donné son avis" - redirect_back(fallback_location: avis_instructeur_dossier_path(avis.procedure, avis.dossier)) - end + if avis.remind_by!(current_instructeur) + AvisMailer.avis_invitation(avis).deliver_later + flash.notice = "Un mail de relance a été envoyé à #{avis.expert.email}" + redirect_back(fallback_location: avis_instructeur_dossier_path(avis.procedure, avis.dossier)) end end end diff --git a/app/models/avis.rb b/app/models/avis.rb index 9efa98164..724b904bc 100644 --- a/app/models/avis.rb +++ b/app/models/avis.rb @@ -84,8 +84,8 @@ class Avis < ApplicationRecord revoked_at.present? end - def revivable_by?(reviver) - revokable_by?(reviver) + def remindable_by?(reminder) + revokable_by?(reminder) end def revokable_by?(revocator) @@ -101,4 +101,9 @@ class Avis < ApplicationRecord destroy! end end + + def remind_by!(revocator) + return false if !remindable_by?(revocator) || answer.present? + update!(reminded_at: Time.zone.now) + end end diff --git a/app/views/instructeurs/shared/avis/_list.html.haml b/app/views/instructeurs/shared/avis/_list.html.haml index bf5edc858..2ed87cfbe 100644 --- a/app/views/instructeurs/shared/avis/_list.html.haml +++ b/app/views/instructeurs/shared/avis/_list.html.haml @@ -36,10 +36,13 @@ %span.fr-text--xs.fr-text-mention--grey = t('en_attente', scope: 'views.shared.avis') | - %span= link_to(t('revive', scope: 'helpers.label'), revive_instructeur_avis_path(avis.procedure, avis), data: { confirm: t('revive', scope: 'helpers.confirmation', email: avis.expert.email) }) + %span= link_to(t('remind', scope: 'helpers.label'), remind_instructeur_avis_path(avis.procedure, avis), data: { confirm: t('remind', scope: 'helpers.confirmation', email: avis.expert.email) }) - if avis.revokable_by?(current_instructeur) | = link_to(t('revoke', scope: 'helpers.label'), revoquer_instructeur_avis_path(avis.procedure, avis), data: { confirm: t('revoke', scope: 'helpers.confirmation', email: avis.expert.email) }, method: :patch) + - if avis.reminded_at + %span.date.fr-text--xs.fr-text-mention--grey{ class: highlight_if_unseen_class(avis_seen_at, avis.reminded_at) } + = t('relance_effectuee_le', scope: 'views.shared.avis', date: l(avis.reminded_at, format: '%d/%m/%y à %H:%M')) - if avis.introduction_file.attached? = render Attachment::ShowComponent.new(attachment: avis.introduction_file.attachment) .answer-body.mb-3 diff --git a/config/locales/models/avis/fr.yml b/config/locales/models/avis/fr.yml index 93f238d1e..1428849ce 100644 --- a/config/locales/models/avis/fr.yml +++ b/config/locales/models/avis/fr.yml @@ -13,9 +13,9 @@ fr: one: Inviter aussi l’expert sur le dossier lié n° %{ids} other: Inviter aussi l’expert sur les dossiers liés n° %{ids} revoke: Révoquer la demande d’avis - revive: Relancer l’expert + remind: Relancer l’expert hint: confidentiel: "Cet avis n’est pas affiché avec les autres experts consultés" confirmation: revoke: "Souhaitez-vous révoquer la demande d’avis à %{email} ?" - revive: "Souhaitez-vous relancer %{email} ?" + remind: "Souhaitez-vous relancer %{email} ?" diff --git a/config/locales/views/shared/en.yml b/config/locales/views/shared/en.yml index 2d6d9c9a6..e0bba14f4 100644 --- a/config/locales/views/shared/en.yml +++ b/config/locales/views/shared/en.yml @@ -7,6 +7,7 @@ en: avis: demande_envoyee_le: "Feedback send at %{date}" demande_revoquee_le: "Feedback revoked at %{date}" + relance_effectuee_le: "Reminder sent at %{date}" reponse_donnee_le: "Response sent at %{date}" en_attente: "Waiting for response" france_connect_login: diff --git a/config/locales/views/shared/fr.yml b/config/locales/views/shared/fr.yml index 3498b8737..f880fcab5 100644 --- a/config/locales/views/shared/fr.yml +++ b/config/locales/views/shared/fr.yml @@ -7,6 +7,7 @@ fr: avis: demande_envoyee_le: "Demande d’avis envoyée le %{date}" demande_revoquee_le: "Demande d’avis révoquée le %{date}" + relance_effectuee_le: "Relance effectuée le %{date}" reponse_donnee_le: "Réponse donnée le %{date}" en_attente: "En attente de réponse" france_connect_login: diff --git a/config/routes.rb b/config/routes.rb index 325b6557c..0bbe21ec2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -393,7 +393,7 @@ Rails.application.routes.draw do get '', action: 'procedure', on: :collection, as: :procedure member do patch 'revoquer' - get 'revive' + get 'remind' end end diff --git a/spec/controllers/instructeurs/avis_controller_spec.rb b/spec/controllers/instructeurs/avis_controller_spec.rb index fe4d55b77..0a01e8108 100644 --- a/spec/controllers/instructeurs/avis_controller_spec.rb +++ b/spec/controllers/instructeurs/avis_controller_spec.rb @@ -24,15 +24,16 @@ describe Instructeurs::AvisController, type: :controller do end end - describe 'revive' do + describe 'remind' do before do allow(AvisMailer).to receive(:avis_invitation).and_return(double(deliver_later: nil)) end it 'sends a reminder to the expert' do - get :revive, params: { procedure_id: procedure.id, id: avis.id } + get :remind, params: { procedure_id: procedure.id, id: avis.id } expect(AvisMailer).to have_received(:avis_invitation).once.with(avis) expect(flash.notice).to eq("Un mail de relance a été envoyé à #{avis.expert.email}") + expect(avis.reload.reminded_at).to be_present end end end