Merge pull request #5396 from betagouv/5395-relancer-expert

5395 instructeur : relance un expert pour une demande d'avis
This commit is contained in:
krichtof 2020-07-21 15:02:53 +02:00 committed by GitHub
commit 8c5308b9dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 60 additions and 9 deletions

View file

@ -123,6 +123,20 @@ module Instructeurs
end
end
def revive
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.email_to_display}"
redirect_back(fallback_location: avis_instructeur_dossier_path(avis.procedure, avis.dossier))
else
flash.alert = "#{avis.email} a déjà donné son avis"
redirect_back(fallback_location: avis_instructeur_dossier_path(avis.procedure, avis.dossier))
end
end
end
private
def set_avis_and_dossier

View file

@ -60,6 +60,10 @@ class Avis < ApplicationRecord
revoked_at.present?
end
def revivable_by?(reviver)
revokable_by?(reviver)
end
def revokable_by?(revocator)
revocator.dossiers.include?(dossier) || revocator == claimant
end

View file

@ -8,14 +8,14 @@
%li.one-avis.flex.align-start
.width-100
%h2.claimant
Demandeur :
= "#{t('claimant', scope: 'activerecord.attributes.avis')} :"
%span.email= (avis.claimant.email == current_instructeur.email) ? 'Vous' : avis.claimant.email
- if avis.confidentiel?
%span.confidentiel
confidentiel
%span.icon.lock{ title: "Cet avis n'est pas affiché avec les autres experts consultés" }
= t('confidentiel', scope: 'activerecord.attributes.avis')
%span.icon.lock{ title: t('confidentiel', scope: 'helpers.hint') }
%span.date{ class: highlight_if_unseen_class(avis_seen_at, avis.created_at) }
Demande d'avis envoyée le #{l(avis.created_at, format: '%d/%m/%y à %H:%M')}
= t('demande_envoyee_le', scope: 'views.shared.avis', date: l(avis.created_at, format: '%d/%m/%y à %H:%M'))
%p= avis.introduction
.answer.flex.align-start
@ -26,17 +26,20 @@
- if avis.answer.present?
- if avis.revoked?
%span.waiting{ class: highlight_if_unseen_class(avis_seen_at, avis.revoked_at) }
Demande d'avis révoquée le #{l(avis.revoked_at, format: '%d/%m/%y à %H:%M')}
= t('demande_revoquee_le', scope: 'views.shared.avis', date: l(avis.revoked_at, format: '%d/%m/%y à %H:%M'))
- else
- if avis.revokable_by?(current_instructeur)
%span.waiting= link_to("Révoquer l'avis", revoquer_instructeur_avis_path(avis.procedure, avis), data: { confirm: "Souhaitez-vous révoquer la demande d'avis à #{avis.email_to_display} ?" }, method: :patch)
%span.waiting= link_to(t('revoke', scope: 'helpers.label'), revoquer_instructeur_avis_path(avis.procedure, avis), data: { confirm: t('revoke', scope: 'helpers.confirmation', email: avis.email_to_display) }, method: :patch)
%span.date{ class: highlight_if_unseen_class(avis_seen_at, avis.updated_at) }
Réponse donnée le #{l(avis.updated_at, format: '%d/%m/%y à %H:%M')}
= t('reponse_donnee_le', scope: 'views.shared.avis', date: l(avis.updated_at, format: '%d/%m/%y à %H:%M'))
- else
%span.waiting
En attente de réponse
= t('en_attente', scope: 'views.shared.avis')
|
%span.waiting= link_to(t('revive', scope: 'helpers.label'), revive_instructeur_avis_path(avis.procedure, avis), data: { confirm: t('revive', scope: 'helpers.confirmation', email: avis.email_to_display) })
- if avis.revokable_by?(current_instructeur)
= link_to("Révoquer l'avis", revoquer_instructeur_avis_path(avis.procedure, avis), data: { confirm: "Souhaitez-vous révoquer la demande d'avis à #{avis.email_to_display} ?" }, method: :patch)
|
= link_to(t('revoke', scope: 'helpers.label'), revoquer_instructeur_avis_path(avis.procedure, avis), data: { confirm: t('revoke', scope: 'helpers.confirmation', email: avis.email_to_display) }, method: :patch)
- if avis.piece_justificative_file.attached?
= render partial: 'shared/attachment/show', locals: { attachment: avis.piece_justificative_file.attachment }
.answer-body

View file

@ -5,8 +5,17 @@ fr:
attributes:
avis:
answer: "Réponse"
claimant: Demandeur
confidentiel: confidentiel
helpers:
label:
invite_linked_dossiers:
one: Inviter aussi lexpert sur le dossier lié n° %{ids}
other: Inviter aussi lexpert sur les dossiers liés n° %{ids}
revoke: Révoquer la demande d'avis
revive: 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} ?"

View file

@ -4,3 +4,8 @@ fr:
dossiers:
identite_entreprise:
warning_for_private_info: "Létablissement %{etablissement} a exercé son droit à la non publication des informations relatives à son identité. Les informations ne seront donc visibles que de la part des services instructeurs"
avis:
demande_envoyee_le: "Demande d'avis envoyée le %{date}"
demande_revoquee_le: "Demande d'avis révoquée le %{date}"
reponse_donnee_le: "Réponse donnée le %{date}"
en_attente: "En attente de réponse"

View file

@ -319,6 +319,7 @@ Rails.application.routes.draw do
post 'commentaire' => 'avis#create_commentaire'
post 'avis' => 'avis#create_avis'
patch 'revoquer'
get 'revive'
get 'bilans_bdf'
get 'sign_up/email/:email' => 'avis#sign_up', constraints: { email: /.*/ }, as: 'sign_up'

View file

@ -282,6 +282,21 @@ describe Instructeurs::AvisController, type: :controller do
expect(flash.notice).to eq("#{avis.email} ne peut plus donner son avis sur ce dossier.")
end
end
describe 'revive' do
let(:avis) { create(:avis, claimant: instructeur, email: 'expert@gouv.fr') }
let(:procedure) { avis.procedure }
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 }
expect(AvisMailer).to have_received(:avis_invitation).once.with(avis)
expect(flash.notice).to eq("Un mail de relance a été envoyé à #{avis.email}")
end
end
end
context 'without a instructeur signed in' do