Notification: add service to send notifications

This commit is contained in:
simon lehericey 2019-03-13 17:59:33 +01:00
parent ed6828c66c
commit 6607de4827
8 changed files with 243 additions and 1 deletions

View file

@ -43,4 +43,11 @@ class GestionnaireMailer < ApplicationMailer
mail(to: gestionnaire.email, subject: subject) mail(to: gestionnaire.email, subject: subject)
end end
def send_notifications(gestionnaire, data)
@data = data
subject = "Vous avez du nouveau sur vos démarches"
mail(to: gestionnaire.email, subject: subject)
end
end end

View file

@ -209,6 +209,25 @@ class Gestionnaire < ApplicationRecord
trusted_device_token&.token_young? trusted_device_token&.token_young?
end end
def email_notification_data
procedures_with_email_notifications
.reduce([]) do |acc, procedure|
h = {
nb_en_construction: procedure.dossiers.en_construction.count,
nb_notification: notifications_per_procedure(procedure).count
}
if h[:nb_en_construction] > 0 || h[:nb_notification] > 0
h[:procedure_id] = procedure.id
h[:procedure_libelle] = procedure.libelle
acc << h
end
acc
end
end
private private
def annotations_hash(demande, annotations_privees, avis, messagerie) def annotations_hash(demande, annotations_privees, avis, messagerie)

View file

@ -0,0 +1,19 @@
class NotificationService
class << self
def send_gestionnaire_email_notification
Gestionnaire
.includes(assign_to: { procedure: :dossiers })
.where(assign_tos: { email_notifications_enabled: true })
.find_in_batches { |gestionnaires| send_batch_of_gestionnaires_email_notification(gestionnaires) }
end
private
def send_batch_of_gestionnaires_email_notification(gestionnaires)
gestionnaires
.map { |gestionnaire| [gestionnaire, gestionnaire.email_notification_data] }
.reject { |(_gestionnaire, data)| data.empty? }
.each { |(gestionnaire, data)| GestionnaireMailer.send_notifications(gestionnaire, data).deliver_later }
end
end
end

View file

@ -0,0 +1,20 @@
- content_for(:title, 'Du nouveau sur vos démarches')
%p
Bonjour,
%p
Vous avez du nouveau sur demarches-simplifiees.fr.
%ul
- @data.each do |datum|
%li
= link_to(datum[:procedure_libelle], procedure_url(datum[:procedure_id]))
- if datum[:nb_en_construction] > 0
%br
#{datum[:nb_en_construction]} #{'dossier'.pluralize(datum[:nb_en_construction])} en construction
- if datum[:nb_notification] > 0
%br
#{datum[:nb_notification]} #{'notification'.pluralize(datum[:nb_notification])}
= render partial: "layouts/mailers/signature"

View file

@ -19,6 +19,24 @@ class GestionnaireMailerPreview < ActionMailer::Preview
GestionnaireMailer.user_to_gestionnaire(gestionnaire.email) GestionnaireMailer.user_to_gestionnaire(gestionnaire.email)
end end
def send_notifications
data = [
{
procedure_libelle: 'une superbe démarche',
procedure_id: 213,
nb_en_construction: 2,
nb_notification: 2
},
{
procedure_libelle: 'une démarche incroyable',
procedure_id: 213,
nb_en_construction: 1,
nb_notification: 1
}
]
GestionnaireMailer.send_notifications(gestionnaire, data)
end
private private
def gestionnaire def gestionnaire
@ -30,6 +48,10 @@ class GestionnaireMailerPreview < ActionMailer::Preview
end end
def procedure def procedure
Procedure.new(id: 15) Procedure.new(id: 15, libelle: 'libelle')
end
def dossier
Dossier.new(id: 15, procedure: procedure)
end end
end end

View file

@ -413,6 +413,53 @@ describe Gestionnaire, type: :model do
end end
end end
describe '#email_notification_data' do
let(:gestionnaire) { create(:gestionnaire) }
let(:procedure_to_assign) { create(:procedure) }
before do
create(:assign_to, gestionnaire: gestionnaire, procedure: procedure_to_assign, email_notifications_enabled: true)
end
context 'when a dossier in construction exists' do
let!(:dossier) { create(:dossier, procedure: procedure_to_assign, state: Dossier.states.fetch(:en_construction)) }
it do
expect(gestionnaire.email_notification_data).to eq([
{
nb_en_construction: 1,
nb_notification: 0,
procedure_id: procedure_to_assign.id,
procedure_libelle: procedure_to_assign.libelle
}
])
end
end
context 'when a notification exists' do
before do
allow(gestionnaire).to receive(:notifications_per_procedure)
.with(procedure_to_assign)
.and_return([1, 2, 3])
end
it do
expect(gestionnaire.email_notification_data).to eq([
{
nb_en_construction: 0,
nb_notification: 3,
procedure_id: procedure_to_assign.id,
procedure_libelle: procedure_to_assign.libelle
}
])
end
end
context 'otherwise' do
it { expect(gestionnaire.email_notification_data).to eq([]) }
end
end
private private
def assign(procedure_to_assign) def assign(procedure_to_assign)

View file

@ -0,0 +1,63 @@
describe NotificationService do
describe '.send_gestionnaire_email_notification' do
let(:procedure) { create(:procedure) }
before do
allow(GestionnaireMailer).to receive(:send_notifications)
.and_return(double(deliver_later: true))
end
subject { NotificationService.send_gestionnaire_email_notification }
context 'when a gestionnaire does not enable its email notification' do
let!(:dossier) { create(:dossier, :en_construction, procedure: procedure) }
let(:gestionnaire) { create(:gestionnaire) }
before { create(:assign_to, gestionnaire: gestionnaire, procedure: procedure) }
it do
subject
expect(GestionnaireMailer).not_to have_received(:send_notifications)
end
end
context 'when a gestionnaire enables its email_notification on one procedure' do
let(:gestionnaire_with_email_notifications) { create(:gestionnaire) }
before do
create(:assign_to,
gestionnaire: gestionnaire_with_email_notifications,
procedure: procedure,
email_notifications_enabled: true)
end
context "when there is no activity on the gestionnaire's procedures" do
it do
subject
expect(GestionnaireMailer).not_to have_received(:send_notifications)
end
end
context 'when a dossier en construction exists on this procedure' do
let!(:dossier) { create(:dossier, :en_construction, procedure: procedure) }
it do
subject
expect(GestionnaireMailer).to have_received(:send_notifications)
end
end
context 'when there is a notification on this procedure' do
before do
allow_any_instance_of(Gestionnaire).to receive(:notifications_per_procedure)
.and_return([12])
end
it do
subject
expect(GestionnaireMailer).to have_received(:send_notifications)
end
end
end
end
end

View file

@ -0,0 +1,45 @@
require 'rails_helper'
describe 'gestionnaire_mailer/send_notifications.html.haml', type: :view do
let(:gestionnaire) { create(:gestionnaire) }
before do
assign(:data, data)
render
end
context 'when there is one dossier in contruction' do
let(:data) do
[
{
procedure_libelle: 'une superbe démarche',
procedure_id: 213,
nb_en_construction: 1,
nb_notification: 0
}
]
end
it { expect(rendered).to have_link('une superbe démarche', href: procedure_url(213)) }
it { expect(rendered).to have_text('une superbe démarche') }
it { expect(rendered).to have_text('1 dossier en construction') }
it { expect(rendered).not_to have_text('notification') }
end
context 'when there is one notification' do
let(:data) do
[
{
procedure_libelle: 'une superbe démarche',
procedure_id: 213,
nb_en_construction: 0,
nb_notification: 1
}
]
end
it { expect(rendered).not_to have_text('en construction') }
it { expect(rendered).to have_text('1 notification') }
end
end