Notification: add service to send notifications
This commit is contained in:
parent
ed6828c66c
commit
6607de4827
8 changed files with 243 additions and 1 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
19
app/services/notification_service.rb
Normal file
19
app/services/notification_service.rb
Normal 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
|
20
app/views/gestionnaire_mailer/send_notifications.html.haml
Normal file
20
app/views/gestionnaire_mailer/send_notifications.html.haml
Normal 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"
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
63
spec/services/notification_service_spec.rb
Normal file
63
spec/services/notification_service_spec.rb
Normal 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
|
|
@ -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
|
Loading…
Reference in a new issue