Merge branch 'dev'
This commit is contained in:
commit
32914a5d08
33 changed files with 166 additions and 131 deletions
2
Gemfile
2
Gemfile
|
@ -38,8 +38,6 @@ gem 'kaminari'
|
|||
# Decorators
|
||||
gem 'draper'
|
||||
|
||||
gem 'unicode_utils'
|
||||
|
||||
# Gestion des comptes utilisateurs
|
||||
gem 'devise'
|
||||
gem 'devise-async'
|
||||
|
|
|
@ -746,7 +746,6 @@ GEM
|
|||
unf_ext
|
||||
unf_ext (0.0.7.5)
|
||||
unicode-display_width (1.3.2)
|
||||
unicode_utils (1.4.0)
|
||||
unicorn (5.4.0)
|
||||
kgio (~> 2.6)
|
||||
raindrops (~> 0.7)
|
||||
|
@ -866,7 +865,6 @@ DEPENDENCIES
|
|||
turbolinks
|
||||
typhoeus
|
||||
uglifier
|
||||
unicode_utils
|
||||
unicorn
|
||||
vcr
|
||||
warden!
|
||||
|
|
|
@ -71,7 +71,7 @@ class Admin::AttestationTemplatesController < AdminController
|
|||
end
|
||||
|
||||
def uninterlaced_png(uploaded_file)
|
||||
if uploaded_file.present? && uploaded_file.content_type == 'image/png'
|
||||
if uploaded_file&.content_type == 'image/png'
|
||||
chunky_img = ChunkyPNG::Image.from_io(uploaded_file)
|
||||
chunky_img.save(uploaded_file.tempfile.to_path, interlace: false)
|
||||
uploaded_file.tempfile.reopen(uploaded_file.tempfile.to_path, 'rb')
|
||||
|
|
|
@ -225,7 +225,7 @@ class Admin::ProceduresController < AdminController
|
|||
|
||||
def procedure_params
|
||||
editable_params = [:libelle, :description, :organisation, :direction, :lien_site_web, :notice, :web_hook_url, :euro_flag, :logo, :auto_archive_on]
|
||||
if @procedure.try(:locked?)
|
||||
if @procedure&.locked?
|
||||
params.require(:procedure).permit(*editable_params)
|
||||
else
|
||||
params.require(:procedure).permit(*editable_params, :lien_demarche, :cerfa_flag, :for_individual, :individual_with_siret, :ask_birthday, module_api_carto_attributes: [:id, :use_api_carto, :quartiers_prioritaires, :cadastre]).merge(administrateur_id: current_administrateur.id)
|
||||
|
|
|
@ -118,7 +118,7 @@ module NewGestionnaire
|
|||
# a gestionnaire is authenticated ... lets see if it can view the dossier
|
||||
|
||||
redirect_to gestionnaire_avis_url(avis)
|
||||
elsif avis.gestionnaire.present? && avis.gestionnaire.email == params[:email]
|
||||
elsif avis.gestionnaire&.email == params[:email]
|
||||
# the avis gestionnaire has already signed up and it sould sign in
|
||||
|
||||
redirect_to new_gestionnaire_session_url
|
||||
|
|
|
@ -138,7 +138,7 @@ module NewUser
|
|||
end
|
||||
|
||||
def dossier_with_champs
|
||||
@dossier_with_champs ||= Dossier.with_ordered_champs.find(params[:id])
|
||||
Dossier.with_ordered_champs.find(params[:id])
|
||||
end
|
||||
|
||||
def ensure_ownership!
|
||||
|
|
|
@ -15,9 +15,9 @@ module ApplicationHelper
|
|||
end
|
||||
|
||||
def current_email
|
||||
current_user.try(:email) ||
|
||||
current_gestionnaire.try(:email) ||
|
||||
current_administrateur.try(:email)
|
||||
current_user&.email ||
|
||||
current_gestionnaire&.email ||
|
||||
current_administrateur&.email
|
||||
end
|
||||
|
||||
def root_path_for_profile(nav_bar_profile)
|
||||
|
|
|
@ -3,8 +3,9 @@ class FindDubiousProceduresJob < ApplicationJob
|
|||
|
||||
FORBIDDEN_KEYWORDS = [
|
||||
'NIR', 'NIRPP', 'race', 'religion',
|
||||
'carte bancaire', 'carte bleue', 'sécurité sociale', 'nationalité',
|
||||
'agdref', 'handicap', 'syndicat', 'politique'
|
||||
'carte bancaire', 'carte bleue', 'sécurité sociale',
|
||||
'agdref', 'handicap', 'syndicat', 'syndical',
|
||||
'parti politique', 'opinion politique', 'bord politique', 'courant politique'
|
||||
]
|
||||
|
||||
def perform(*args)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class AvisMailer < ApplicationMailer
|
||||
def avis_invitation(avis)
|
||||
@avis = avis
|
||||
email = @avis.gestionnaire.try(:email) || @avis.email
|
||||
email = @avis.gestionnaire&.email || @avis.email
|
||||
mail(to: email, subject: "Donnez votre avis sur le dossier nº #{@avis.dossier.id} (#{@avis.dossier.procedure.libelle})")
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
class NotificationMailer < ApplicationMailer
|
||||
default to: Proc.new { @user.email }
|
||||
def new_answer(dossier)
|
||||
subject = "Nouveau message pour votre dossier demarches-simplifiees.fr nº #{dossier.id}"
|
||||
|
||||
def send_dossier_received(dossier_id)
|
||||
dossier = Dossier.find(dossier_id)
|
||||
send_notification(dossier, dossier.procedure.received_mail_template)
|
||||
send_mail(dossier, subject)
|
||||
end
|
||||
|
||||
def send_draft_notification(dossier)
|
||||
vars_mailer(dossier)
|
||||
subject = "Retrouvez votre brouillon pour la démarche : #{dossier.procedure.libelle}"
|
||||
|
||||
@subject = "Retrouvez votre brouillon pour la démarche : #{dossier.procedure.libelle}"
|
||||
send_mail(dossier, subject)
|
||||
end
|
||||
|
||||
mail(subject: @subject)
|
||||
def send_dossier_received(dossier)
|
||||
send_notification(dossier, dossier.procedure.received_mail_template)
|
||||
end
|
||||
|
||||
def send_initiated_notification(dossier)
|
||||
|
@ -30,39 +31,31 @@ class NotificationMailer < ApplicationMailer
|
|||
send_notification(dossier, dossier.procedure.without_continuation_mail_template)
|
||||
end
|
||||
|
||||
def new_answer(dossier)
|
||||
send_mail dossier, "Nouveau message pour votre dossier demarches-simplifiees.fr nº #{dossier.id}"
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def send_notification(dossier, mail_template)
|
||||
vars_mailer(dossier)
|
||||
def send_mail(dossier, subject)
|
||||
@dossier = dossier
|
||||
email = dossier.user.email
|
||||
|
||||
@subject = mail_template.subject_for_dossier dossier
|
||||
@body = mail_template.body_for_dossier dossier
|
||||
|
||||
create_commentaire_for_notification
|
||||
|
||||
mail(subject: @subject) { |format| format.html { @body } }
|
||||
mail(subject: subject, to: email)
|
||||
end
|
||||
|
||||
def create_commentaire_for_notification
|
||||
def send_notification(dossier, mail_template)
|
||||
email = dossier.user.email
|
||||
|
||||
subject = mail_template.subject_for_dossier(dossier)
|
||||
body = mail_template.body_for_dossier(dossier)
|
||||
|
||||
create_commentaire_for_notification(dossier, subject, body)
|
||||
|
||||
mail(subject: subject, to: email) { |format| format.html { body } }
|
||||
end
|
||||
|
||||
def create_commentaire_for_notification(dossier, subject, body)
|
||||
Commentaire.create(
|
||||
dossier: @dossier,
|
||||
dossier: dossier,
|
||||
email: I18n.t("dynamics.contact_email"),
|
||||
body: ["[#{@subject}]", @body].join("<br><br>")
|
||||
body: ["[#{subject}]", body].join("<br><br>")
|
||||
)
|
||||
end
|
||||
|
||||
def vars_mailer(dossier)
|
||||
@dossier = dossier
|
||||
@user = dossier.user
|
||||
end
|
||||
|
||||
def send_mail(dossier, subject)
|
||||
vars_mailer dossier
|
||||
|
||||
mail(subject: subject)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -19,7 +19,7 @@ class Avis < ApplicationRecord
|
|||
scope :updated_since?, -> (date) { where('avis.updated_at > ?', date) }
|
||||
|
||||
def email_to_display
|
||||
gestionnaire.try(:email) || email
|
||||
gestionnaire&.email || email
|
||||
end
|
||||
|
||||
def self.link_avis_to_gestionnaire(gestionnaire)
|
||||
|
@ -27,8 +27,7 @@ class Avis < ApplicationRecord
|
|||
end
|
||||
|
||||
def self.avis_exists_and_email_belongs_to_avis?(avis_id, email)
|
||||
avis = Avis.find_by(id: avis_id)
|
||||
avis.present? && avis.email == email
|
||||
Avis.find_by(id: avis_id)&.email == email
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -323,7 +323,7 @@ class Dossier < ApplicationRecord
|
|||
|
||||
def send_dossier_received
|
||||
if saved_change_to_state? && en_instruction?
|
||||
NotificationMailer.send_dossier_received(id).deliver_later
|
||||
NotificationMailer.send_dossier_received(self).deliver_later
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ module Mails
|
|||
|
||||
def self.default_template_name_for_procedure(procedure)
|
||||
attestation_template = procedure.attestation_template
|
||||
if attestation_template.present? && attestation_template.activated?
|
||||
if attestation_template&.activated?
|
||||
"mails/closed_mail_with_attestation"
|
||||
else
|
||||
"mails/closed_mail"
|
||||
|
|
|
@ -209,11 +209,11 @@ class Procedure < ApplicationRecord
|
|||
end
|
||||
|
||||
procedure.administrateur = admin
|
||||
procedure.initiated_mail = initiated_mail.try(:dup)
|
||||
procedure.received_mail = received_mail.try(:dup)
|
||||
procedure.closed_mail = closed_mail.try(:dup)
|
||||
procedure.refused_mail = refused_mail.try(:dup)
|
||||
procedure.without_continuation_mail = without_continuation_mail.try(:dup)
|
||||
procedure.initiated_mail = initiated_mail&.dup
|
||||
procedure.received_mail = received_mail&.dup
|
||||
procedure.closed_mail = closed_mail&.dup
|
||||
procedure.refused_mail = refused_mail&.dup
|
||||
procedure.without_continuation_mail = without_continuation_mail&.dup
|
||||
|
||||
procedure.cloned_from_library = from_library
|
||||
procedure.parent_procedure = self
|
||||
|
|
|
@ -31,7 +31,7 @@ class DossierSerializer < ActiveModel::Serializer
|
|||
end
|
||||
|
||||
def email
|
||||
object.user.try(:email)
|
||||
object.user&.email
|
||||
end
|
||||
|
||||
def entreprise
|
||||
|
|
|
@ -18,7 +18,7 @@ class DossierTableExportSerializer < ActiveModel::Serializer
|
|||
:individual_birthdate
|
||||
|
||||
def email
|
||||
object.user.try(:email)
|
||||
object.user&.email
|
||||
end
|
||||
|
||||
def state
|
||||
|
@ -47,19 +47,19 @@ class DossierTableExportSerializer < ActiveModel::Serializer
|
|||
end
|
||||
|
||||
def individual_prenom
|
||||
object.individual.try(:prenom)
|
||||
object.individual&.prenom
|
||||
end
|
||||
|
||||
def individual_nom
|
||||
object.individual.try(:nom)
|
||||
object.individual&.nom
|
||||
end
|
||||
|
||||
def individual_birthdate
|
||||
object.individual.try(:birthdate)
|
||||
object.individual&.birthdate
|
||||
end
|
||||
|
||||
def individual_gender
|
||||
object.individual.try(:gender)
|
||||
object.individual&.gender
|
||||
end
|
||||
|
||||
def emails_accompagnateurs
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
class IndividualSerializer < ActiveModel::Serializer
|
||||
attribute :gender, key: :civilite
|
||||
attributes :nom, :prenom
|
||||
attribute :birthdate, key: :date_naissance, if: :include_birthdate?
|
||||
|
||||
def include_birthdate?
|
||||
object&.dossier&.procedure&.ask_birthday
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
- if user_signed_in? && (@facade.dossier.owner_or_invite?(current_user))
|
||||
%a#maj_carte.action{ href: "/users/dossiers/#{@facade.dossier.id}/carte" }
|
||||
.col-lg-2.col-md-2.col-sm-2.col-xs-2.action
|
||||
= 'éditer'.upcase
|
||||
= 'ÉDITER'
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
- if user_signed_in? && (@facade.dossier.owner_or_invite?(current_user))
|
||||
= link_to modifier_dossier_path(@facade.dossier), class: 'action', id: 'maj_infos' do
|
||||
#edit-dossier.col-lg-2.col-md-2.col-sm-2.col-xs-2.action
|
||||
= "éditer".upcase
|
||||
= "ÉDITER"
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
- if @facade.procedure.for_individual?
|
||||
.row.title-row
|
||||
.col-xs-4.split-hr
|
||||
.col-xs-4.dossier-title= t('utils.depositaire').upcase
|
||||
.col-xs-4.dossier-title= t('utils.depositaire')
|
||||
.col-xs-4.split-hr
|
||||
.row
|
||||
.col-xs-6.depositaire-label Civilité
|
||||
|
@ -29,7 +29,7 @@
|
|||
- if champ.type_champ == 'header_section'
|
||||
.row.title-row.margin-top-40
|
||||
.col-xs-3.split-hr
|
||||
.col-xs-6.dossier-title= champ.libelle.upcase
|
||||
.col-xs-6.dossier-title= champ.libelle
|
||||
.col-xs-3.split-hr
|
||||
- else
|
||||
.row
|
||||
|
@ -60,7 +60,7 @@
|
|||
.col-xs-12
|
||||
.row.title-row
|
||||
.col-xs-4.split-hr
|
||||
.col-xs-4.dossier-title= t('utils.pieces').upcase
|
||||
.col-xs-4.dossier-title= t('utils.pieces')
|
||||
.col-xs-4.split-hr
|
||||
|
||||
.col-xs-12#pieces-justificatives.margin-bot-40
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/ We can't use &. because the controller may not implement #nav_bar_profile
|
||||
- nav_bar_profile = controller.try(:nav_bar_profile)
|
||||
|
||||
.new-header{ class: current_page?(root_path) ? nil : "new-header-with-border" }
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
.en-cours
|
||||
%b
|
||||
= dossier_count = current_administrateur.procedures.count
|
||||
= ("Procedures".pluralize(dossier_count)).upcase
|
||||
= "Procedures".pluralize(dossier_count)
|
||||
|
||||
#action-block
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#first-block
|
||||
.en-cours
|
||||
= dossier_count = current_user.dossiers.count
|
||||
= ("Dossier".pluralize(dossier_count)).upcase
|
||||
= "Dossier".pluralize(dossier_count)
|
||||
%br
|
||||
EN COURS
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
</h1>
|
||||
</header>
|
||||
|
||||
<% if @pending_demandes.present? %>
|
||||
<section class="main-content__body main-content__body--flush">
|
||||
<table>
|
||||
<thead>
|
||||
|
@ -59,3 +60,6 @@
|
|||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
<% else %>
|
||||
<h1>Aucune demande</h1>
|
||||
<% end %>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
- dossier = Dossier.find_by(id: champ.value)
|
||||
- show_text_summary = dossier.present?
|
||||
- show_warning = !show_text_summary && champ.value.present?
|
||||
- text_summary = sanitize(dossier.try(:text_summary))
|
||||
- text_summary = sanitize(dossier&.text_summary)
|
||||
|
||||
.dossier-link
|
||||
= form.number_field :value,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
- dossier = Dossier.find_by(id: champ.value)
|
||||
- show_text_summary = dossier.present?
|
||||
- show_warning = !show_text_summary && champ.value.present?
|
||||
- text_summary = dossier.try(:text_summary)
|
||||
- text_summary = dossier&.text_summary
|
||||
|
||||
.dossier-link
|
||||
%input.form-control{ name: "champs['#{ champ.id }']",
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
require "unicode_utils/upcase"
|
||||
|
||||
class String
|
||||
def upcase
|
||||
UnicodeUtils.upcase(self)
|
||||
end
|
||||
end
|
|
@ -1,11 +1,11 @@
|
|||
namespace :'2018_02_28_clean_invalid_emails_accounts' do
|
||||
task clean: :environment do
|
||||
Gestionnaire.pluck(:email, :id).select { |e, id| e.include?(" ") }.each do |email, id|
|
||||
Gestionnaire.find_by(id: id, current_sign_in_at: nil).try(:destroy) # ensure account was never used
|
||||
Gestionnaire.find_by(id: id, current_sign_in_at: nil)&.destroy # ensure account was never used
|
||||
end
|
||||
|
||||
User.pluck(:email, :id).select { |e, id| e.include?(" ") }.each do |email, id|
|
||||
User.find_by(id: id, current_sign_in_at: nil).try(:destroy) # ensure account was never used
|
||||
User.find_by(id: id, current_sign_in_at: nil)&.destroy # ensure account was never used
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
29
lib/tasks/2018_05_30_missed_ar_messages.rake
Normal file
29
lib/tasks/2018_05_30_missed_ar_messages.rake
Normal file
|
@ -0,0 +1,29 @@
|
|||
namespace :'2018_05_30_missed_ar_messages' do
|
||||
task restore: :environment do
|
||||
create_commentaires(:en_construction_at, :initiated_mail_template)
|
||||
create_commentaires(:processed_at, :closed_mail_template, Dossier.where(state: 'accepte'))
|
||||
create_commentaires(:processed_at, :refused_mail_template, Dossier.where(state: 'refuse'))
|
||||
create_commentaires(:processed_at, :without_continuation_mail_template, Dossier.where(state: 'sans_suite'))
|
||||
end
|
||||
|
||||
def create_commentaires(date_name, template_name, dossiers = Dossier)
|
||||
error_range = DateTime.new(2018, 05, 28, 13, 33)..DateTime.new(2018, 05, 30, 15, 39)
|
||||
|
||||
dossiers.includes(:procedure).where(date_name => error_range).find_each(batch_size: 100) do |dossier|
|
||||
print "#{dossier.id}\n"
|
||||
create_commentaire(dossier, dossier.procedure.send(template_name), dossier.send(date_name))
|
||||
end
|
||||
end
|
||||
|
||||
def create_commentaire(dossier, template, date)
|
||||
subject = template.subject_for_dossier(dossier)
|
||||
body = template.body_for_dossier(dossier)
|
||||
|
||||
Commentaire.create(
|
||||
dossier: dossier,
|
||||
email: I18n.t("dynamics.contact_email"),
|
||||
body: "[#{subject}]<br><br>#{body}",
|
||||
created_at: date
|
||||
)
|
||||
end
|
||||
end
|
|
@ -71,7 +71,10 @@ namespace :dev do
|
|||
task :import_db do
|
||||
filename = "tps_prod_#{1.day.ago.strftime("%d-%m-%Y")}.sql"
|
||||
local_file = "/tmp/#{filename}"
|
||||
|
||||
if !File.exist?(local_file)
|
||||
run_and_stop_if_error "scp -C deploy@sgmap_backup:/var/backup/production1/db/#{filename} #{local_file}"
|
||||
end
|
||||
|
||||
dev_env_param = "RAILS_ENV=development"
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ RSpec.describe NotificationMailer, type: :mailer do
|
|||
end
|
||||
|
||||
describe '.send_dossier_received' do
|
||||
subject { described_class.send_dossier_received(dossier.id) }
|
||||
subject { described_class.send_dossier_received(dossier) }
|
||||
let(:email_template) { create(:received_mail) }
|
||||
|
||||
before do
|
||||
|
|
|
@ -603,7 +603,7 @@ describe Dossier do
|
|||
|
||||
it "sends an email when the dossier becomes en_instruction" do
|
||||
dossier.en_instruction!
|
||||
expect(NotificationMailer).to have_received(:send_dossier_received).with(dossier.id)
|
||||
expect(NotificationMailer).to have_received(:send_dossier_received).with(dossier)
|
||||
end
|
||||
|
||||
it "does not an email when the dossier becomes accepte" do
|
||||
|
|
|
@ -1,10 +1,20 @@
|
|||
describe IndividualSerializer do
|
||||
describe '#attributes' do
|
||||
let(:individual){ Individual.create(nom: 'nom', prenom: 'prenom') }
|
||||
let(:procedure) { build(:procedure) }
|
||||
let(:dossier) { build(:dossier, procedure: procedure) }
|
||||
let(:individual) { build(:individual, gender: 'M.', nom: 'nom', prenom: 'prenom', birthdate: Date.new(2001, 8, 27), dossier: dossier) }
|
||||
|
||||
subject { IndividualSerializer.new(individual).serializable_hash }
|
||||
|
||||
it { is_expected.to include(civilite: 'M.') }
|
||||
it { is_expected.to include(nom: 'nom') }
|
||||
it { is_expected.to include(prenom: 'prenom') }
|
||||
it { is_expected.not_to have_key(:date_naissance) }
|
||||
|
||||
context 'when the procedure asks for a birthdate' do
|
||||
let(:procedure) { build(:procedure, ask_birthday: true) }
|
||||
|
||||
it { is_expected.to include(date_naissance: Date.new(2001, 8, 27)) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue