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)
|
||||
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
|
||||
|
|
|
@ -209,6 +209,25 @@ class Gestionnaire < ApplicationRecord
|
|||
trusted_device_token&.token_young?
|
||||
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
|
||||
|
||||
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)
|
||||
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
|
||||
|
||||
def gestionnaire
|
||||
|
@ -30,6 +48,10 @@ class GestionnaireMailerPreview < ActionMailer::Preview
|
|||
end
|
||||
|
||||
def procedure
|
||||
Procedure.new(id: 15)
|
||||
Procedure.new(id: 15, libelle: 'libelle')
|
||||
end
|
||||
|
||||
def dossier
|
||||
Dossier.new(id: 15, procedure: procedure)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -413,6 +413,53 @@ describe Gestionnaire, type: :model do
|
|||
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
|
||||
|
||||
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