Merge branch 'develop' into staging

This commit is contained in:
gregoirenovel 2017-04-19 17:23:28 +02:00
commit 698416024d
52 changed files with 455 additions and 263 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -33,7 +33,7 @@ function display_cadastre(cadastre_array) {
else if (cadastre_array.length > 0) { else if (cadastre_array.length > 0) {
cadastre_array.forEach(function (cadastre) { cadastre_array.forEach(function (cadastre) {
$("#cadastre.list ul").append('<li> Parcelle n°' + cadastre.numero + ' - Feuille ' + cadastre.code_arr + ' ' + cadastre.section + ' ' + cadastre.feuille+ '</li>'); $("#cadastre.list ul").append('<li> Parcelle nº ' + cadastre.numero + ' - Feuille ' + cadastre.code_arr + ' ' + cadastre.section + ' ' + cadastre.feuille+ '</li>');
cadastreItems.addData(cadastre.geometry); cadastreItems.addData(cadastre.geometry);
}); });

View file

@ -0,0 +1,3 @@
.pieces_justificatives_fields {
.form-inline > .form-group { vertical-align: top; }
}

View file

@ -25,7 +25,7 @@ class Admin::PiecesJustificativesController < AdminController
def update_params def update_params
params params
.require(:procedure) .require(:procedure)
.permit(types_de_piece_justificative_attributes: [:libelle, :description, :id, :order_place, :lien_demarche]) .permit(types_de_piece_justificative_attributes: [:libelle, :description, :id, :order_place, :mandatory, :lien_demarche])
end end
def move_up def move_up

View file

@ -5,12 +5,13 @@ class Backoffice::PrivateFormulairesController < ApplicationController
dossier = current_gestionnaire.dossiers.find(params[:dossier_id]) dossier = current_gestionnaire.dossiers.find(params[:dossier_id])
unless params[:champs].nil? unless params[:champs].nil?
champs_service_errors = ChampsService.save_champs dossier.champs_private, params ChampsService.save_champs dossier.champs_private, params
champs_service_errors = ChampsService.build_error_messages(dossier.champs_private)
if champs_service_errors.empty? if champs_service_errors.empty?
flash[:notice] = "Formulaire enregistré" flash[:notice] = "Formulaire enregistré"
else else
flash[:alert] = (champs_service_errors.inject('') { |acc, error| acc+= error[:message]+'<br>' }).html_safe flash[:alert] = champs_service_errors.join('<br>').html_safe
end end
end end

View file

@ -15,8 +15,8 @@ class Users::CarteController < UsersController
def save def save
dossier = current_user_dossier dossier = current_user_dossier
dossier.quartier_prioritaires.map(&:destroy) dossier.quartier_prioritaires.each(&:destroy)
dossier.cadastres.map(&:destroy) dossier.cadastres.each(&:destroy)
unless params[:json_latlngs].blank? unless params[:json_latlngs].blank?
ModuleApiCartoService.save_qp! dossier, params[:json_latlngs] ModuleApiCartoService.save_qp! dossier, params[:json_latlngs]

View file

@ -24,50 +24,38 @@ class Users::DescriptionController < UsersController
end end
def update def update
@dossier = current_user_dossier dossier = current_user_dossier
@procedure = @dossier.procedure procedure = dossier.procedure
return head :forbidden unless @dossier.can_be_initiated? return head :forbidden unless dossier.can_be_initiated?
@champs = @dossier.ordered_champs ChampsService.save_champs(dossier.champs, params) if params[:champs]
check_mandatory_fields = !draft_submission? if procedure.cerfa_flag? && params[:cerfa_pdf]
cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: dossier, user: current_user)
if params[:champs] return redirect_to_description_with_errors(dossier, cerfa.errors.full_messages) unless cerfa.save
champs_service_errors = ChampsService.save_champs @dossier.champs,
params,
check_mandatory_fields
unless champs_service_errors.empty?
flash.alert = (champs_service_errors.inject('') { |acc, error| acc+= error[:message]+'<br>' }).html_safe
return redirect_to users_dossier_description_path(dossier_id: @dossier.id)
end
end end
if @procedure.cerfa_flag? && params[:cerfa_pdf] errors_upload = PiecesJustificativesService.upload!(dossier, current_user, params)
cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: @dossier, user: current_user) return redirect_to_description_with_errors(dossier, errors_upload) if errors_upload.any?
unless cerfa.save
flash.alert = cerfa.errors.full_messages.join('<br />').html_safe
return redirect_to users_dossier_description_path(dossier_id: @dossier.id)
end
end
errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params) if params[:champs] && !draft_submission?
unless errors_upload.empty? errors =
flash.alert = errors_upload.html_safe ChampsService.build_error_messages(dossier.champs) +
return redirect_to users_dossier_description_path(dossier_id: @dossier.id) PiecesJustificativesService.missing_pj_error_messages(dossier)
return redirect_to_description_with_errors(dossier, errors) if errors.any?
end end
if draft_submission? if draft_submission?
flash.notice = 'Votre brouillon a bien été sauvegardé.' flash.notice = 'Votre brouillon a bien été sauvegardé.'
redirect_to url_for(controller: :dossiers, action: :index, liste: :brouillon) redirect_to url_for(controller: :dossiers, action: :index, liste: :brouillon)
else else
if @dossier.draft? if dossier.draft?
@dossier.initiated! dossier.initiated!
NotificationMailer.send_notification(@dossier, @dossier.procedure.initiated_mail).deliver_now! NotificationMailer.send_notification(dossier, procedure.initiated_mail).deliver_now!
end end
flash.notice = 'Félicitations, votre demande a bien été enregistrée.' flash.notice = 'Félicitations, votre demande a bien été enregistrée.'
redirect_to url_for(controller: :recapitulatif, action: :show, dossier_id: @dossier.id) redirect_to url_for(controller: :recapitulatif, action: :show, dossier_id: dossier.id)
end end
end end
@ -88,9 +76,9 @@ class Users::DescriptionController < UsersController
if !((errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params)).empty?) if !((errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params)).empty?)
if flash.alert.nil? if flash.alert.nil?
flash.alert = errors_upload.html_safe flash.alert = errors_upload.join('<br>').html_safe
else else
flash.alert = (flash.alert + '<br />' + errors_upload.html_safe).html_safe flash.alert = (flash.alert + '<br />' + errors_upload.join('<br>').html_safe).html_safe
end end
else else
@ -111,6 +99,11 @@ class Users::DescriptionController < UsersController
private private
def redirect_to_description_with_errors(dossier, errors)
flash.alert = errors.join('<br>')
redirect_to users_dossier_description_path(dossier_id: dossier.id)
end
def draft_submission? def draft_submission?
params[:submit] && params[:submit].keys.first == 'brouillon' params[:submit] && params[:submit].keys.first == 'brouillon'
end end

View file

@ -54,10 +54,11 @@ class Users::SessionsController < Sessions::SessionsController
sign_out :user sign_out :user
if connected_with_france_connect == 'entreprise' case connected_with_france_connect
when 'entreprise'
redirect_to FRANCE_CONNECT.entreprise_logout_endpoint redirect_to FRANCE_CONNECT.entreprise_logout_endpoint
return return
elsif connected_with_france_connect == 'particulier' when 'particulier'
redirect_to FRANCE_CONNECT.particulier_logout_endpoint redirect_to FRANCE_CONNECT.particulier_logout_endpoint
return return
end end

View file

@ -3,6 +3,6 @@ class NotificationDecorator < Draper::Decorator
def index_display def index_display
['champs', 'piece_justificative'].include?(type_notif) ? type = liste.join(" ") : type = liste.last ['champs', 'piece_justificative'].include?(type_notif) ? type = liste.join(" ") : type = liste.last
{ dossier: "Dossier n°#{dossier.id}", date: created_at.strftime('%d/%m %H:%M'), type: type } { dossier: "Dossier nº #{dossier.id}", date: created_at.strftime('%d/%m %H:%M'), type: type }
end end
end end

View file

@ -2,8 +2,12 @@ class UserDecorator < Draper::Decorator
delegate_all delegate_all
def gender_fr def gender_fr
return 'M.' if gender == 'male' case gender
return 'Mme' if gender == 'female' when 'male'
'M.'
when 'female'
'Mme'
end
end end
def birthdate_fr def birthdate_fr

View file

@ -12,7 +12,7 @@ class NotificationMailer < ApplicationMailer
end end
def new_answer dossier def new_answer dossier
send_mail dossier, "Nouveau message pour votre dossier TPS #{dossier.id}" send_mail dossier, "Nouveau message pour votre dossier TPS  #{dossier.id}"
end end
private private

View file

@ -7,7 +7,7 @@ class Commentaire < ActiveRecord::Base
after_save :internal_notification after_save :internal_notification
def header def header
"#{email}, " + created_at.localtime.strftime('%d %b %Y %H:%M') "#{email}, " + I18n.l(created_at.localtime, format: '%d %b %Y %H:%M')
end end
private private

View file

@ -111,47 +111,49 @@ class Dossier < ActiveRecord::Base
fail 'role is not valid' fail 'role is not valid'
end end
if role == 'user' case role
when 'user'
case action case action
when 'initiate' when 'initiate'
if draft? if draft?
initiated! initiated!
end end
when 'update' when 'update'
if replied? if replied?
updated! updated!
end end
when 'comment' when 'comment'
if replied? if replied?
updated! updated!
end end
end end
elsif role == 'gestionnaire' when 'gestionnaire'
case action case action
when 'comment' when 'comment'
if updated? if updated?
replied! replied!
elsif initiated? elsif initiated?
replied! replied!
end end
when 'follow' when 'follow'
if initiated? if initiated?
updated! updated!
end end
when 'close' when 'close'
if received? if received?
closed! closed!
end end
when 'refuse' when 'refuse'
if received? if received?
refused! refused!
end end
when 'without_continuation' when 'without_continuation'
if received? if received?
without_continuation! without_continuation!
end end
end end
end end
state state
end end

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern include MailTemplateConcern
DISPLAYED_NAME = "Accusé d'acceptation" DISPLAYED_NAME = "Accusé d'acceptation"
DEFAULT_OBJECT = 'Votre dossier TPS --numero_dossier-- a été accepté' DEFAULT_OBJECT = 'Votre dossier TPS  --numero_dossier-- a été accepté'
end end
end end

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern include MailTemplateConcern
DISPLAYED_NAME = 'Accusé de réception' DISPLAYED_NAME = 'Accusé de réception'
DEFAULT_OBJECT = 'Votre dossier TPS --numero_dossier-- a été bien reçu' DEFAULT_OBJECT = 'Votre dossier TPS  --numero_dossier-- a été bien reçu'
end end
end end

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern include MailTemplateConcern
DISPLAYED_NAME = 'Accusé de passage en instruction' DISPLAYED_NAME = 'Accusé de passage en instruction'
DEFAULT_OBJECT = 'Votre dossier TPS --numero_dossier-- va être instruit' DEFAULT_OBJECT = 'Votre dossier TPS  --numero_dossier-- va être instruit'
end end
end end

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern include MailTemplateConcern
DISPLAYED_NAME = 'Accusé de rejet du dossier' DISPLAYED_NAME = 'Accusé de rejet du dossier'
DEFAULT_OBJECT = 'Votre dossier TPS --numero_dossier-- a été refusé' DEFAULT_OBJECT = 'Votre dossier TPS  --numero_dossier-- a été refusé'
end end
end end

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern include MailTemplateConcern
DISPLAYED_NAME = 'Accusé de classement sans suite' DISPLAYED_NAME = 'Accusé de classement sans suite'
DEFAULT_OBJECT = 'Votre dossier TPS --numero_dossier-- a été classé sans suite' DEFAULT_OBJECT = 'Votre dossier TPS  --numero_dossier-- a été classé sans suite'
end end
end end

View file

@ -13,7 +13,7 @@ class Notification < ActiveRecord::Base
# def broadcast_notification # def broadcast_notification
# ActionCable.server.broadcast 'notifications', # ActionCable.server.broadcast 'notifications',
# message: "Dossier n°#{self.dossier.id} : #{self.liste.last}", # message: "Dossier nº #{self.dossier.id} : #{self.liste.last}",
# dossier: {id: self.dossier.id} # dossier: {id: self.dossier.id}
# end # end
end end

View file

@ -36,7 +36,7 @@ class PreferenceListDossier < ActiveRecord::Base
table = nil table = nil
{ {
dossier_id: create_column('N°', table, 'id', 'id', 1), dossier_id: create_column('Nº', table, 'id', 'id', 1),
created_at: create_column('Créé le', table, 'created_at', 'first_creation', 2), created_at: create_column('Créé le', table, 'created_at', 'first_creation', 2),
updated_at: create_column('Mise à jour le', table, 'updated_at', 'last_update', 2), updated_at: create_column('Mise à jour le', table, 'updated_at', 'last_update', 2),
state: create_column('État', table, 'state', 'display_state', 1) state: create_column('État', table, 'state', 'display_state', 1)

View file

@ -9,9 +9,10 @@ class AccompagnateurService
end end
def change_assignement! def change_assignement!
if @to == ASSIGN case @to
when ASSIGN
AssignTo.create(gestionnaire: @accompagnateur, procedure: @procedure) AssignTo.create(gestionnaire: @accompagnateur, procedure: @procedure)
elsif @to == NOT_ASSIGN when NOT_ASSIGN
AssignTo.where(gestionnaire: @accompagnateur, procedure: @procedure).delete_all AssignTo.where(gestionnaire: @accompagnateur, procedure: @procedure).delete_all
end end
end end

View file

@ -1,11 +1,14 @@
class ChampsService class ChampsService
class << self class << self
def save_champs(champs, params, check_mandatory = true) def save_champs(champs, params)
fill_champs(champs, params) fill_champs(champs, params)
champs.select(&:changed?).each(&:save) champs.select(&:changed?).each(&:save)
end
check_mandatory ? build_error_messages(champs) : [] def build_error_messages(champs)
champs.select(&:mandatory_and_blank?)
.map { |c| "Le champ #{c.libelle} doit être rempli." }
end end
private private
@ -28,14 +31,5 @@ class ChampsService
def extract_minute(champ_id, h) def extract_minute(champ_id, h)
h[:time_minute]["'#{champ_id}'"] h[:time_minute]["'#{champ_id}'"]
end end
def build_error_messages(champs)
champs.select(&:mandatory_and_blank?)
.map { |c| build_champ_error_message(c) }
end
def build_champ_error_message(champ)
{ message: "Le champ #{champ.libelle} doit être rempli." }
end
end end
end end

View file

@ -34,7 +34,7 @@ class NotificationService
when 'champs' when 'champs'
attribut attribut
when 'submitted' when 'submitted'
"Le dossier n°#{@dossier_id} a été déposé." "Le dossier nº #{@dossier_id} a été déposé."
else else
'Notification par défaut' 'Notification par défaut'
end end

View file

@ -1,40 +1,51 @@
class PiecesJustificativesService class PiecesJustificativesService
def self.upload! dossier, user, params def self.upload!(dossier, user, params)
errors = '' tpj_contents = dossier.types_de_piece_justificative
.map { |tpj| [tpj, params["piece_justificative_#{tpj.id}"]] }
.select { |_, content| content.present? }
dossier.types_de_piece_justificative.each do |type_de_pieces_justificatives| without_virus, with_virus = tpj_contents
unless params["piece_justificative_#{type_de_pieces_justificatives.id}"].nil? .partition { |_, content| ClamavService.safe_file?(content.path) }
if ClamavService.safe_file? params["piece_justificative_#{type_de_pieces_justificatives.id}"].path errors = with_virus
piece_justificative = PieceJustificative.new(content: params["piece_justificative_#{type_de_pieces_justificatives.id}"], .map { |_, content| content.original_filename + ' : virus détecté' }
dossier: dossier,
type_de_piece_justificative: type_de_pieces_justificatives,
user: user)
unless piece_justificative.save errors += without_virus
errors << piece_justificative.errors.messages[:content][0]+" (#{piece_justificative.libelle})"+"<br>" .map { |tpj, content| save_pj(content, dossier, tpj, user) }
end .compact()
else
errors << params["piece_justificative_#{type_de_pieces_justificatives.id}"].original_filename+": <b>Virus détecté !!</b>"+"<br>"
end
end
end
errors
end end
def self.upload_one! dossier, user, params def self.upload_one! dossier, user, params
if ClamavService.safe_file? params[:piece_justificative][:content].path content = params[:piece_justificative][:content]
piece_justificative = PieceJustificative.new(content: params[:piece_justificative][:content], if ClamavService.safe_file? content.path
dossier: dossier, pj = PieceJustificative.new(content: content,
type_de_piece_justificative: nil, dossier: dossier,
user: user) type_de_piece_justificative: nil,
user: user)
piece_justificative.save pj.save
else else
piece_justificative = PieceJustificative.new pj = PieceJustificative.new
piece_justificative.errors.add(:content, params[:piece_justificative][:content].original_filename+": <b>Virus détecté !!</b>") pj.errors.add(:content, content.original_filename + ': <b>Virus détecté !!</b>')
end end
piece_justificative pj
end
def self.save_pj(content, dossier, tpj, user)
pj = PieceJustificative.new(content: content,
dossier: dossier,
type_de_piece_justificative: tpj,
user: user)
pj.save ? nil : "le fichier #{content.original_filename} (#{pj.libelle}) n'a pas pu être sauvegardé"
end
def self.missing_pj_error_messages(dossier)
mandatory_pjs = dossier.types_de_piece_justificative.select(&:mandatory)
present_pjs = dossier.pieces_justificatives.map(&:type_de_piece_justificative)
missing_pjs = mandatory_pjs - present_pjs
missing_pjs.map { |pj| "La pièce jointe #{pj.libelle} doit être fournie." }
end end
end end

View file

@ -1,31 +1,36 @@
= f.fields_for :types_de_piece_justificative, types_de_piece_justificative, remote: true do |ff| .pieces_justificatives_fields
.form-inline = f.fields_for :types_de_piece_justificative, types_de_piece_justificative, remote: true do |ff|
.form-group .form-inline
%h4 Libellé .form-group
= ff.text_field :libelle, class: 'form-control libelle', placeholder: 'Libellé' %h4 Libellé
.form-group = ff.text_field :libelle, class: 'form-control libelle', placeholder: 'Libellé'
%h4 Description .form-group
= ff.text_area :description, class: 'form-control description', placeholder: 'Description' %h4 Description
.form-group = ff.text_area :description, class: 'form-control description', placeholder: 'Description'
%h4 .form-group
Lien du formulaire vierge %h4
%small Lien du formulaire vierge
(optionel) %small
= ff.url_field :lien_demarche, class: 'form-control', placeholder: 'Lien du document vierge' (optionel)
= ff.url_field :lien_demarche, class: 'form-control', placeholder: 'Lien du document vierge'
.form-group
= ff.hidden_field :order_place, value: ff.index
= ff.hidden_field :id
- unless ff.object.id.nil?
.form-group
%br &nbsp;
= ff.object.button_up(index: ff.index, url: move_up_admin_procedure_pieces_justificatives_path(@procedure, ff.index))
= ff.object.button_down(index: ff.index, url: move_down_admin_procedure_pieces_justificatives_path(@procedure, ff.index))
.form-group
%h4 Obligatoire ?
.center
= ff.check_box :mandatory
.form-group
= ff.hidden_field :order_place, value: ff.index
= ff.hidden_field :id
- unless ff.object.id.nil?
.form-group .form-group
%br &nbsp; %br &nbsp;
= ff.object.button_up(index: ff.index, url: move_up_admin_procedure_pieces_justificatives_path(@procedure, ff.index)) - if ff.object.id.nil?
= ff.object.button_down(index: ff.index, url: move_down_admin_procedure_pieces_justificatives_path(@procedure, ff.index)) = f.submit('Ajouter la pièce', class: 'btn btn-success', id: 'add_piece_justificative')
- else
= link_to("", admin_procedure_piece_justificative_path(@procedure, ff.object.id), method: :delete, remote: true, id: "delete_type_de_piece_justificative_#{ff.object.id}", class: %w(form-control btn btn-danger fa fa-trash-o) )
.form-group
%br &nbsp;
- if ff.object.id.nil?
= f.submit('Ajouter la pièce', class: 'btn btn-success', id: 'add_piece_justificative')
- else
= link_to("", admin_procedure_piece_justificative_path(@procedure, ff.object.id), method: :delete, remote: true, id: "delete_type_de_piece_justificative_#{ff.object.id}", class: %w(form-control btn btn-danger fa fa-trash-o) )

View file

@ -5,17 +5,18 @@
.col-md-1.col-lg-1.col-sm-1.col-xs-1.col-sm-1.col-xs-1 .col-md-1.col-lg-1.col-sm-1.col-xs-1.col-sm-1.col-xs-1
.fa.fa-info-circle.text-info{ style: 'font-size: 2em; margin-top: 20%;' } .fa.fa-info-circle.text-info{ style: 'font-size: 2em; margin-top: 20%;' }
.col-xs-11 .col-xs-11
- if dossiers_list_facade.liste == 'nouveaux' - case dossiers_list_facade.liste
- when 'nouveaux'
Tous les dossiers présents dans cette liste sont ceux qui Tous les dossiers présents dans cette liste sont ceux qui
%b %b
n'ont jamais été ouvert par votre service. n'ont jamais été ouvert par votre service.
Il attende une première lecture et intervention de votre part. Il attende une première lecture et intervention de votre part.
- elsif dossiers_list_facade.liste == 'a_traiter' - when 'a_traiter'
Tous les dossiers présents dans cette liste sont ceux qui sont Tous les dossiers présents dans cette liste sont ceux qui sont
%b %b
en cours de construction avec l'usager. en cours de construction avec l'usager.
Ils ne sont pas figés et ne sont donc pas complets. Ils ne sont pas figés et ne sont donc pas complets.
- elsif dossiers_list_facade.liste == 'fige' - when 'fige'
Tous les dossiers présents dans cette liste ont été déclarés Tous les dossiers présents dans cette liste ont été déclarés
%b %b
complets complets
@ -23,14 +24,14 @@
%b %b
plus modifiables par l'usager. plus modifiables par l'usager.
Ils attendent donc leurs dépots officiels qui doit être effectué par l'usager. Ils attendent donc leurs dépots officiels qui doit être effectué par l'usager.
- elsif dossiers_list_facade.liste == 'deposes' - when 'deposes'
Tous les dossiers présents dans cette liste ont été Tous les dossiers présents dans cette liste ont été
%b %b
officiellement déposé par l'usager pour examen. officiellement déposé par l'usager pour examen.
Il faut donc que vous confirmiez par "accusé de réception" la bonne réception de toutes les informations et documents demandés avant examen final. Il faut donc que vous confirmiez par "accusé de réception" la bonne réception de toutes les informations et documents demandés avant examen final.
- elsif dossiers_list_facade.liste == 'a_instruire' - when 'a_instruire'
Tous les dossiers présents dans cette liste sont à instruire. Ceux sont tous les dossiers Tous les dossiers présents dans cette liste sont à instruire. Ceux sont tous les dossiers
%b %b
qui ont reçu bonne réception. qui ont reçu bonne réception.
- elsif dossiers_list_facade.liste == 'termine' - when 'termine'
Tous les dossiers présents dans cette liste sont considérés comme cloturé car ils ont tous reçu un verdict final qui peut être "Validé", "Refusé" ou "Sans suite". Tous les dossiers présents dans cette liste sont considérés comme cloturé car ils ont tous reçu un verdict final qui peut être "Validé", "Refusé" ou "Sans suite".

View file

@ -35,7 +35,7 @@
%br/ %br/
Code APE 6202A Code APE 6202A
%br/ %br/
N° TVA : FR 22 424 761 419 Nº TVA : FR 22 424 761 419
%br/ %br/
Siège social : 2 rue Kellermann - 59100 Roubaix - France. Siège social : 2 rue Kellermann - 59100 Roubaix - France.
%br %br
@ -61,7 +61,7 @@
Déclaration CNIL Déclaration CNIL
%p Le SGMAP a procédé à la déclaration CNIL de TPS. Celle-ci porte le numéro "1986658 v 0" à la date du 30 août 2016. Néanmoins les administrations devront procéder à une déclaration complémentaire auprès de la CNIL si les données du formulaire quelles ont produit comportent des données de la nature suivante : %p Le SGMAP a procédé à la déclaration CNIL de TPS. Celle-ci porte le numéro "1986658 v 0" à la date du 30 août 2016. Néanmoins les administrations devront procéder à une déclaration complémentaire auprès de la CNIL si les données du formulaire quelles ont produit comportent des données de la nature suivante :
%ul %ul
%li N° de sécurité sociale, %li Nº de sécurité sociale,
%li Infractions, condamnations, mesures de sécurité, %li Infractions, condamnations, mesures de sécurité,
%li %li
%a{ :href => "https://www.declaration.cnil.fr/declarations/declaration/donneesSensibles_DN.display.action" } Opinions philosophiques, politiques, religieuses, syndicales, vie sexuelle, données de santé, origine raciale. %a{ :href => "https://www.declaration.cnil.fr/declarations/declaration/donneesSensibles_DN.display.action" } Opinions philosophiques, politiques, religieuses, syndicales, vie sexuelle, données de santé, origine raciale.
@ -77,10 +77,10 @@
Traitement des données à caractère personnel Traitement des données à caractère personnel
%h4 Données personnelles : %h4 Données personnelles :
%p %p
En application de la loi n°78-17 Informatique et Libertés du 6 janvier 1978, vous disposez d'un droit d'accès, de rectification, de modification et de suppression concernant les données qui vous concernent. Vous pouvez exercer ce droit à travers la rubrique En application de la loi nº 78-17 Informatique et Libertés du 6 janvier 1978, vous disposez d'un droit d'accès, de rectification, de modification et de suppression concernant les données qui vous concernent. Vous pouvez exercer ce droit à travers la rubrique
%a{ :href => "http://www.faire-simple.gouv.fr/contact" } Contact %a{ :href => "http://www.faire-simple.gouv.fr/contact" } Contact
%h4 Données de connexion : %h4 Données de connexion :
%p Conformément à la loi n°2004-575 du 21 juin 2004 pour la confiance dans léconomie numérique, certaines données de connexion sont conservées par le service aux fins de protection contre les intrusions et de poursuites judiciaires le cas échéant. Ces données sont conservées pendant un an. %p Conformément à la loi nº 2004-575 du 21 juin 2004 pour la confiance dans léconomie numérique, certaines données de connexion sont conservées par le service aux fins de protection contre les intrusions et de poursuites judiciaires le cas échéant. Ces données sont conservées pendant un an.
%br %br
%h3#entreprise_information %h3#entreprise_information

View file

@ -4,4 +4,4 @@
= flash.notice = flash.notice
- if flash.alert - if flash.alert
.alert.alert-danger .alert.alert-danger
= flash.alert = flash.alert.html_safe

View file

@ -6,6 +6,10 @@
= t('dynamics.page_title') = t('dynamics.page_title')
%meta{ 'http-equiv' => "X-UA-Compatible", :content => "IE=edge" } %meta{ 'http-equiv' => "X-UA-Compatible", :content => "IE=edge" }
= favicon_link_tag(image_url("favicons/16x16.png"), type: "image/png", sizes: "16x16")
= favicon_link_tag(image_url("favicons/32x32.png"), type: "image/png", sizes: "32x32")
= favicon_link_tag(image_url("favicons/96x96.png"), type: "image/png", sizes: "96x96")
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true
= stylesheet_link_tag 'print', media: 'print', 'data-turbolinks-track' => true = stylesheet_link_tag 'print', media: 'print', 'data-turbolinks-track' => true
= javascript_include_tag 'application', 'data-turbolinks-track' => true = javascript_include_tag 'application', 'data-turbolinks-track' => true

View file

@ -39,6 +39,6 @@
- @facade_data_view.dossiers_with_unread_notifications.each do |dossier| - @facade_data_view.dossiers_with_unread_notifications.each do |dossier|
= link_to backoffice_dossier_path(dossier.id) do = link_to backoffice_dossier_path(dossier.id) do
.notification .notification
.dossier-index= "Dossier n°#{dossier.id}" .dossier-index= "Dossier nº #{dossier.id}"
.updated-at-index= dossier.first_unread_notification.created_at.strftime('%d/%m %H:%M') .updated-at-index= dossier.first_unread_notification.created_at.strftime('%d/%m %H:%M')
.count= dossier.unreaded_notifications.count .count= dossier.unreaded_notifications.count

View file

@ -1,7 +1,7 @@
Bonjour Bonjour
%br %br
%br %br
Votre dossier --numero_dossier-- a été accepté. Votre dossier  --numero_dossier-- a été accepté.
%br %br
%br %br
A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier--

View file

@ -1,7 +1,7 @@
Bonjour Bonjour
%br %br
%br %br
Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier--. Votre administration vous confirme la bonne réception de votre dossier nº --numero_dossier--.
%br %br
%br %br
A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier--

View file

@ -1,7 +1,7 @@
Bonjour Bonjour
%br %br
%br %br
Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier--. Celui-ci sera instruit dans le délai légal déclaré par votre interlocuteur. Votre administration vous confirme la bonne réception de votre dossier nº --numero_dossier--. Celui-ci sera instruit dans le délai légal déclaré par votre interlocuteur.
%br %br
%br %br
Bonne journée Bonne journée

View file

@ -1,7 +1,7 @@
Bonjour Bonjour
%br %br
%br %br
Votre dossier --numero_dossier-- a été refusé. Votre dossier  --numero_dossier-- a été refusé.
%br %br
%br %br
Pour en savoir plus sur le motif du refus, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- Pour en savoir plus sur le motif du refus, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier--

View file

@ -1,7 +1,7 @@
Bonjour Bonjour
%br %br
%br %br
Votre dossier --numero_dossier-- a été classé sans suite. Votre dossier  --numero_dossier-- a été classé sans suite.
%br %br
%br %br
Pour en savoir plus sur les raisons de ce classement sans suite, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- Pour en savoir plus sur les raisons de ce classement sans suite, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier--

View file

@ -43,11 +43,11 @@
.stat-card.stat-card-half.big-number-card.pull-left .stat-card.stat-card-half.big-number-card.pull-left
%span.big-number-card-title TOTAL DÉMARCHES DÉMATÉRIALISÉES %span.big-number-card-title TOTAL DÉMARCHES DÉMATÉRIALISÉES
%span.big-number-card-number %span.big-number-card-number
= @procedures_count = number_with_delimiter(@procedures_count)
.stat-card.stat-card-half.big-number-card.pull-left .stat-card.stat-card-half.big-number-card.pull-left
%span.big-number-card-title TOTAL DOSSIERS DÉPOSÉS %span.big-number-card-title TOTAL DOSSIERS DÉPOSÉS
%span.big-number-card-number %span.big-number-card-number
= @dossiers_count = number_with_delimiter(@dossiers_count)
.clearfix .clearfix

View file

@ -18,24 +18,24 @@
- else - else
%input{ type: 'file', name: 'cerfa_pdf', id: 'cerfa_pdf', accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes } %input{ type: 'file', name: 'cerfa_pdf', id: 'cerfa_pdf', accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes }
- dossier.types_de_piece_justificative.order('order_place ASC').each do |type_de_piece_justificative| - dossier.types_de_piece_justificative.order('order_place ASC').each do |tpj|
%tr %tr
%th.piece-libelle %th.piece-libelle
= type_de_piece_justificative.libelle = tpj.mandatory ? tpj.libelle + ' *' : tpj.libelle
%td %td
- unless type_de_piece_justificative.lien_demarche.blank? - unless tpj.lien_demarche.blank?
%em %em
Récupérer le formulaire vierge pour mon dossier : Récupérer le formulaire vierge pour mon dossier :
= link_to "Télécharger", type_de_piece_justificative.lien_demarche, target: :blank = link_to "Télécharger", tpj.lien_demarche, target: :blank
%td %td
- if type_de_piece_justificative.api_entreprise - if tpj.api_entreprise
%span.text-success{ id: "piece_justificative_#{type_de_piece_justificative.id}" } Nous l'avons récupéré pour vous. %span.text-success{ id: "piece_justificative_#{tpj.id}" } Nous l'avons récupéré pour vous.
- else - else
- if dossier.retrieve_last_piece_justificative_by_type(type_de_piece_justificative.id).nil? - if dossier.retrieve_last_piece_justificative_by_type(tpj.id).nil?
= file_field_tag "piece_justificative_#{type_de_piece_justificative.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes = file_field_tag "piece_justificative_#{tpj.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes
- else - else
%span.btn.btn-sm.btn-file.btn-success %span.btn.btn-sm.btn-file.btn-success
Modifier Modifier
= file_field_tag "piece_justificative_#{type_de_piece_justificative.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes = file_field_tag "piece_justificative_#{tpj.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes

View file

@ -11,40 +11,41 @@
- if champ.mandatory? - if champ.mandatory?
* *
- if champ.type_champ == 'textarea' - case champ.type_champ
- when 'textarea'
= render partial: 'users/description/champs/textarea', locals: { champ: champ } = render partial: 'users/description/champs/textarea', locals: { champ: champ }
- elsif champ.type_champ == 'checkbox' - when 'checkbox'
= render partial: 'users/description/champs/checkbox', locals: { champ: champ } = render partial: 'users/description/champs/checkbox', locals: { champ: champ }
- elsif champ.type_champ == 'civilite' - when 'civilite'
= render partial: 'users/description/champs/civilite', locals: { champ: champ } = render partial: 'users/description/champs/civilite', locals: { champ: champ }
- elsif champ.type_champ == 'datetime' - when 'datetime'
= render partial: 'users/description/champs/datetime', locals: { champ: champ } = render partial: 'users/description/champs/datetime', locals: { champ: champ }
- elsif champ.type_champ == 'yes_no' - when 'yes_no'
= render partial: 'users/description/champs/yes_no', locals: { champ: champ } = render partial: 'users/description/champs/yes_no', locals: { champ: champ }
- elsif %w(drop_down_list multiple_drop_down_list).include?(champ.type_champ) - when 'drop_down_list', 'multiple_drop_down_list'
= render partial: 'users/description/champs/drop_down_list', locals: { champ: champ } = render partial: 'users/description/champs/drop_down_list', locals: { champ: champ }
- elsif champ.type_champ == 'pays' - when 'pays'
= render partial: 'users/description/champs/pays', locals: { champ: champ } = render partial: 'users/description/champs/pays', locals: { champ: champ }
- elsif champ.type_champ == 'regions' - when 'regions'
= render partial: 'users/description/champs/regions', locals: { champ: champ } = render partial: 'users/description/champs/regions', locals: { champ: champ }
- elsif champ.type_champ == 'engagement' - when 'engagement'
= render partial: 'users/description/champs/engagement', locals: { champ: champ } = render partial: 'users/description/champs/engagement', locals: { champ: champ }
- elsif champ.type_champ == 'departements' - when 'departements'
= render partial: 'users/description/champs/departements', locals: { champ: champ } = render partial: 'users/description/champs/departements', locals: { champ: champ }
- elsif champ.type_champ == 'dossier_link' - when 'dossier_link'
= render partial: 'users/description/champs/dossier_link', locals: { champ: champ } = render partial: 'users/description/champs/dossier_link', locals: { champ: champ }
- elsif champ.type_champ == 'explication' - when 'explication'
- else - else
%input.form-control{ name: "champs['#{champ.id}']", %input.form-control{ name: "champs['#{champ.id}']",

View file

@ -5,33 +5,34 @@
.col-md-1.col-lg-1.col-sm-1.col-xs-1 .col-md-1.col-lg-1.col-sm-1.col-xs-1
.fa.fa-info-circle.text-info{ style: 'font-size: 2em; margin-top: 20%;' } .fa.fa-info-circle.text-info{ style: 'font-size: 2em; margin-top: 20%;' }
.col-xs-11 .col-xs-11
- if dossiers_list_facade.liste == 'brouillon' - case dossiers_list_facade.liste
- when 'brouillon'
Les dossiers présents dans cette liste Les dossiers présents dans cette liste
%b %b
n'ont pas encore été soumis aux services instructeurs. n'ont pas encore été soumis aux services instructeurs.
Ils ne sont visibles que par vous. Ils ne sont visibles que par vous.
- elsif dossiers_list_facade.liste == 'nouveaux' - when 'nouveaux'
Les dossiers présents dans cette liste Les dossiers présents dans cette liste
%b %b
n'ont pas encore été ouverts n'ont pas encore été ouverts
par les services instructeurs. Une notification vous sera envoyée quand votre demande aura été étudiée. par les services instructeurs. Une notification vous sera envoyée quand votre demande aura été étudiée.
- elsif dossiers_list_facade.liste == 'a_traiter' - when 'a_traiter'
Les dossiers présents dans cette liste sont Les dossiers présents dans cette liste sont
%b %b
visibles par les services instructeurs. visibles par les services instructeurs.
%br %br
Ces dossiers ne sont pas encore figés et peuvent être modifiés à souhait. Ces dossiers ne sont pas encore figés et peuvent être modifiés à souhait.
- elsif dossiers_list_facade.liste == 'en_attente' - when 'en_attente'
Les dossiers présents dans cette liste sont Les dossiers présents dans cette liste sont
%b %b
en cours de relecture par les services instructeurs. en cours de relecture par les services instructeurs.
Il reviendra vers vous si des informations ou documents sont manquants pour le futur examen de votre dossier. Il reviendra vers vous si des informations ou documents sont manquants pour le futur examen de votre dossier.
- elsif dossiers_list_facade.liste == 'valides' - when 'valides'
Les dossiers présents dans cette liste ont été Les dossiers présents dans cette liste ont été
%b %b
relus et considérés comme complets relus et considérés comme complets
pour examen par les services instructeurs. Ceux-ci ne peuvent maintenant plus être modifiés. Il faut que vous procédiez à leur dépôt afin qu'une décision finale soit rendue. pour examen par les services instructeurs. Ceux-ci ne peuvent maintenant plus être modifiés. Il faut que vous procédiez à leur dépôt afin qu'une décision finale soit rendue.
- elsif dossiers_list_facade.liste == 'en_instruction' - when 'en_instruction'
Les dossiers présents dans cette liste sont Les dossiers présents dans cette liste sont
%b %b
en cours de réception en cours de réception
@ -39,12 +40,12 @@
%b %b
en cours d'examen en cours d'examen
par les services instructeurs. Une notification vous sera envoyée une fois qu'une décision aura été rendue. par les services instructeurs. Une notification vous sera envoyée une fois qu'une décision aura été rendue.
- elsif dossiers_list_facade.liste == 'termine' - when 'termine'
Les dossiers présents dans cette liste sont ceux qui ont été instruits et pour lesquels Les dossiers présents dans cette liste sont ceux qui ont été instruits et pour lesquels
%b %b
une décision finale a été rendue. une décision finale a été rendue.
Ils peuvent posséder trois états différents : Accepté, Refusé ou Sans Suite. Ils peuvent posséder trois états différents : Accepté, Refusé ou Sans Suite.
- elsif dossiers_list_facade.liste == 'invite' - when 'invite'
Les dossiers présents dans cette liste sont ceux Les dossiers présents dans cette liste sont ceux
%b %b
auxquels vous avez été invités auxquels vous avez été invités

View file

@ -11,7 +11,7 @@ require 'mina/rbenv' # for rbenv support. (http://rbenv.org)
# branch - Branch name to deploy. (needed by mina/git) # branch - Branch name to deploy. (needed by mina/git)
ENV['to'] ||= "staging" ENV['to'] ||= "staging"
raise "Bad to=#{+ENV['to']}" unless ["staging", "production", "tps_v2"].include?(ENV['to']) raise "Bad to=#{+ENV['to']}" unless ["staging", "production"].include?(ENV['to'])
raise "missing domain, run with 'rake deploy domain=37.187.154.237'" if ENV['domain'].nil? raise "missing domain, run with 'rake deploy domain=37.187.154.237'" if ENV['domain'].nil?
@ -24,7 +24,8 @@ set :port, 2200
set :deploy_to, '/var/www/tps_dev' set :deploy_to, '/var/www/tps_dev'
if ENV["to"] == "staging" case ENV["to"]
when "staging"
if ENV['branch'].nil? if ENV['branch'].nil?
set :branch, 'staging' set :branch, 'staging'
else else
@ -33,7 +34,7 @@ if ENV["to"] == "staging"
set :deploy_to, '/var/www/tps_dev' set :deploy_to, '/var/www/tps_dev'
set :user, 'tps_dev' # Username in the server to SSH to. set :user, 'tps_dev' # Username in the server to SSH to.
appname = 'tps_dev' appname = 'tps_dev'
elsif ENV["to"] == "production" when "production"
if ENV['branch'].nil? if ENV['branch'].nil?
set :branch, 'master' set :branch, 'master'
else else
@ -42,23 +43,10 @@ elsif ENV["to"] == "production"
set :deploy_to, '/var/www/tps' set :deploy_to, '/var/www/tps'
set :user, 'tps' # Username in the server to SSH to. set :user, 'tps' # Username in the server to SSH to.
appname = 'tps' appname = 'tps'
elsif ENV["to"] == "tps_v2"
if ENV['branch'].nil?
set :branch, 'staging_v2'
else
set :branch, ENV['branch']
end
set :deploy_to, '/var/www/tps_v2'
set :user, 'tps_v2' # Username in the server to SSH to.
appname = 'tps_v2'
end end
set :rails_env, ENV["to"] set :rails_env, ENV["to"]
if ENV["to"] == "tps_v2"
set :rails_env, "staging"
end
# For system-wide RVM install. # For system-wide RVM install.
# set :rvm_path, '/usr/local/rvm/bin/rvm' # set :rvm_path, '/usr/local/rvm/bin/rvm'

View file

@ -23,7 +23,7 @@ fr:
dossiers: dossiers:
depositaite: "Dépositaire" depositaite: "Dépositaire"
numéro: 'Dossier n°' numéro: 'Dossier nº '
followers: followers:
title: "Personnes suivant l'activité de ce dossier" title: "Personnes suivant l'activité de ce dossier"
empty: "Aucune personne ne suit ce dossier" empty: "Aucune personne ne suit ce dossier"

View file

@ -37,13 +37,53 @@ fr:
first: Premier first: Premier
number: number:
currency: currency:
format: format:
unit: '€' delimiter: " "
delimiter: ' ' format: "%n %u"
separator: ',' precision: 2
precision: 2 separator: ","
format: '%n %u' significant: false
strip_insignificant_zeros: false
unit: "€"
format:
delimiter: " "
precision: 3
separator: ","
significant: false
strip_insignificant_zeros: false
human:
decimal_units:
format: "%n %u"
units:
billion: milliard
million: million
quadrillion: million de milliards
thousand: millier
trillion: billion
unit: ''
format:
delimiter: ''
precision: 3
significant: true
strip_insignificant_zeros: true
storage_units:
format: "%n %u"
units:
byte:
one: octet
other: octets
gb: Go
kb: ko
mb: Mo
tb: To
percentage:
format:
delimiter: ''
format: "%n%"
precision:
format:
delimiter: ''
activerecord: activerecord:
errors: errors:
models: models:
@ -149,6 +189,59 @@ fr:
extension_white_list_error: "Le format de fichier de la pièce jointe n'est pas valide." extension_white_list_error: "Le format de fichier de la pièce jointe n'est pas valide."
procedure_archived: "Cette démarche en ligne a été fermée, il n'est plus possible de déposer de dossier." procedure_archived: "Cette démarche en ligne a été fermée, il n'est plus possible de déposer de dossier."
date:
abbr_day_names:
- dim
- lun
- mar
- mer
- jeu
- ven
- sam
abbr_month_names:
-
- jan.
- fév.
- mar.
- avr.
- mai
- juin
- juil.
- août
- sept.
- oct.
- nov.
- déc.
day_names:
- dimanche
- lundi
- mardi
- mercredi
- jeudi
- vendredi
- samedi
formats:
default: "%d/%m/%Y"
short: "%e %b"
long: "%e %B %Y"
month_names:
-
- janvier
- février
- mars
- avril
- mai
- juin
- juillet
- août
- septembre
- octobre
- novembre
- décembre
order:
- :day
- :month
- :year
datetime: datetime:
distance_in_words: distance_in_words:
about_x_hours: about_x_hours:

View file

@ -11,11 +11,11 @@ class InitiatedAllReceivedMailForProcedure < ActiveRecord::Migration
before_save :default_values before_save :default_values
def default_values def default_values
self.object ||= "[TPS] Accusé de réception pour votre dossier n°--numero_dossier--" self.object ||= "[TPS] Accusé de réception pour votre dossier nº --numero_dossier--"
self.body ||= "Bonjour, self.body ||= "Bonjour,
<br> <br>
<br> <br>
Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier-- complet. Celui-ci sera instruit dans le délais légal déclaré par votre interlocuteur.<br> Votre administration vous confirme la bonne réception de votre dossier nº--numero_dossier-- complet. Celui-ci sera instruit dans le délais légal déclaré par votre interlocuteur.<br>
<br> <br>
En vous souhaitant une bonne journée, En vous souhaitant une bonne journée,
<br> <br>

View file

@ -0,0 +1,5 @@
class AddMandatoryColumnToTypesDePieceJustificative < ActiveRecord::Migration[5.0]
def change
add_column :types_de_piece_justificative, :mandatory, :boolean, default: false
end
end

View file

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170313140834) do ActiveRecord::Schema.define(version: 20170328142700) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -403,6 +403,7 @@ ActiveRecord::Schema.define(version: 20170313140834) do
t.integer "procedure_id" t.integer "procedure_id"
t.integer "order_place" t.integer "order_place"
t.string "lien_demarche" t.string "lien_demarche"
t.boolean "mandatory", default: false
end end
create_table "users", force: :cascade do |t| create_table "users", force: :cascade do |t|

View file

@ -13,8 +13,8 @@ FactoryGirl.define do
end end
trait :dossier_received do trait :dossier_received do
object "[TPS] Accusé de réception pour votre dossier n°--numero_dossier--" object "[TPS] Accusé de réception pour votre dossier nº --numero_dossier--"
body "Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier--" body "Votre administration vous confirme la bonne réception de votre dossier nº --numero_dossier--"
type 'MailReceived' type 'MailReceived'
end end
end end

View file

@ -19,6 +19,6 @@ RSpec.describe NotificationMailer, type: :mailer do
it { expect(subject.body).to match('Un nouveau message est disponible dans votre espace TPS.') } it { expect(subject.body).to match('Un nouveau message est disponible dans votre espace TPS.') }
it { expect(subject.body).to include("Pour le consulter, merci de vous rendre sur #{users_dossier_recapitulatif_url(dossier_id: dossier.id)}") } it { expect(subject.body).to include("Pour le consulter, merci de vous rendre sur #{users_dossier_recapitulatif_url(dossier_id: dossier.id)}") }
it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS #{dossier.id}") } it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS  #{dossier.id}") }
end end
end end

View file

@ -26,7 +26,7 @@ describe PreferenceListDossier do
describe 'dossier_id' do describe 'dossier_id' do
subject { super()[:dossier_id] } subject { super()[:dossier_id] }
it { expect(subject[:libelle]).to eq 'N°' } it { expect(subject[:libelle]).to eq 'Nº' }
it { expect(subject[:table]).to be_nil } it { expect(subject[:table]).to be_nil }
it { expect(subject[:attr]).to eq 'id' } it { expect(subject[:attr]).to eq 'id' }
it { expect(subject[:attr_decorate]).to eq 'id' } it { expect(subject[:attr_decorate]).to eq 'id' }

View file

@ -1,15 +1,15 @@
require 'spec_helper' require 'spec_helper'
describe ChampsService do describe ChampsService do
describe 'save_champs' do let!(:champ) { Champ.create(value: 'toto', type_de_champ: TypeDeChamp.new) }
let!(:champ) { Champ.create(value: 'toto', type_de_champ: TypeDeChamp.new) } let!(:champ_mandatory_empty) { Champ.create(type_de_champ: TypeDeChamp.new(libelle: 'mandatory', mandatory: true)) }
let!(:champ_mandatory_empty) { Champ.create(type_de_champ: TypeDeChamp.new(libelle: 'mandatory', mandatory: true)) } let!(:champ_datetime) do
let!(:champ_datetime) do champ_datetime = TypeDeChamp.new(type_champ: 'datetime')
champ_datetime = TypeDeChamp.new(type_champ: 'datetime') Champ.create(type_de_champ: champ_datetime)
Champ.create(type_de_champ: champ_datetime) end
end let!(:champs) { [champ, champ_mandatory_empty, champ_datetime] }
let!(:champs) { [champ, champ_mandatory_empty, champ_datetime] }
describe 'save_champs' do
before :each do before :each do
params_hash = { params_hash = {
champs: { champs: {
@ -19,31 +19,22 @@ describe ChampsService do
time_hour: { "'#{champ_datetime.id}'" => '12' }, time_hour: { "'#{champ_datetime.id}'" => '12' },
time_minute: { "'#{champ_datetime.id}'" => '24' } time_minute: { "'#{champ_datetime.id}'" => '24' }
} }
@errors = ChampsService.save_champs(champs, params_hash, check_mandatory) ChampsService.save_champs(champs, params_hash)
champs.each(&:reload) champs.each(&:reload)
end end
context 'check_mandatory is true' do it 'saves the changed champ' do
let(:check_mandatory) { true } expect(champ.value).to eq('yop')
it 'saves the changed champ' do
expect(champ.value).to eq('yop')
end
it 'parses and save the date' do
expect(champ_datetime.value).to eq('d 12:24')
end
it 'adds error for the missing mandatory champ' do
expect(@errors).to match([{ message: 'Le champ mandatory doit être rempli.' }])
end
end end
context 'check_mandatory is false' do it 'parses and save the date' do
let(:check_mandatory) { false } expect(champ_datetime.value).to eq('d 12:24')
end
end
it 'does not add errors' do describe 'build_error_message' do
expect(@errors).to match([]) it 'adds error for the missing mandatory champ' do
end expect(ChampsService.build_error_messages(champs)).to match(['Le champ mandatory doit être rempli.'])
end end
end end
end end

View file

@ -0,0 +1,92 @@
require 'spec_helper'
describe PiecesJustificativesService do
let(:user) { create(:user) }
let(:safe_file) { true }
before :each do
allow(ClamavService).to receive(:safe_file?).and_return(safe_file)
end
let(:hash) { {} }
let!(:tpj_not_mandatory) do
TypeDePieceJustificative.create(libelle: 'not mandatory', mandatory: false)
end
let!(:tpj_mandatory) do
TypeDePieceJustificative.create(libelle: 'justificatif', mandatory: true)
end
let(:procedure) { Procedure.create(types_de_piece_justificative: tpjs) }
let(:dossier) { Dossier.create(procedure: procedure) }
let(:errors) { PiecesJustificativesService.upload!(dossier, user, hash) }
let(:tpjs) { [tpj_not_mandatory] }
describe 'self.upload!' do
context 'when no params are given' do
it { expect(errors).to eq([]) }
end
context 'when there is something wrong with file save' do
let(:hash) do
{
"piece_justificative_#{tpj_not_mandatory.id}" =>
double(path: '', original_filename: 'filename')
}
end
it { expect(errors).to match(["le fichier filename (not mandatory) n'a pas pu être sauvegardé"]) }
end
context 'when a virus is provided' do
let(:safe_file) { false }
let(:hash) do
{
"piece_justificative_#{tpj_not_mandatory.id}" =>
double(path: '', original_filename: 'bad_file')
}
end
it { expect(errors).to match(['bad_file : virus détecté']) }
end
context 'when a regular file is provided' do
let(:content) { double(path: '', original_filename: 'filename') }
let(:hash) do
{
"piece_justificative_#{tpj_not_mandatory.id}" =>
content
}
end
before :each do
expect(PiecesJustificativesService).to receive(:save_pj)
.with(content, dossier, tpj_not_mandatory, user)
.and_return(nil)
end
it 'is saved' do
expect(errors).to match([])
end
end
end
describe 'missing_pj_error_messages' do
let(:errors) { PiecesJustificativesService.missing_pj_error_messages(dossier) }
let(:tpjs) { [tpj_mandatory] }
context 'when no params are given' do
it { expect(errors).to match(['La pièce jointe justificatif doit être fournie.']) }
end
context 'when the piece justificative is provided' do
before :each do
# we are messing around piece_justificative
# because directly doubling carrierwave params seems complicated
piece_justificative_double = double(type_de_piece_justificative: tpj_mandatory)
expect(dossier).to receive(:pieces_justificatives).and_return([piece_justificative_double])
end
it { expect(errors).to match([]) }
end
end
end