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) {
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);
});

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
params
.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
def move_up

View file

@ -5,12 +5,13 @@ class Backoffice::PrivateFormulairesController < ApplicationController
dossier = current_gestionnaire.dossiers.find(params[:dossier_id])
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?
flash[:notice] = "Formulaire enregistré"
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

View file

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

View file

@ -24,50 +24,38 @@ class Users::DescriptionController < UsersController
end
def update
@dossier = current_user_dossier
@procedure = @dossier.procedure
dossier = current_user_dossier
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 params[:champs]
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
if procedure.cerfa_flag? && params[:cerfa_pdf]
cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: dossier, user: current_user)
return redirect_to_description_with_errors(dossier, cerfa.errors.full_messages) unless cerfa.save
end
if @procedure.cerfa_flag? && params[:cerfa_pdf]
cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: @dossier, user: current_user)
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)
return redirect_to_description_with_errors(dossier, errors_upload) if errors_upload.any?
errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params)
unless errors_upload.empty?
flash.alert = errors_upload.html_safe
return redirect_to users_dossier_description_path(dossier_id: @dossier.id)
if params[:champs] && !draft_submission?
errors =
ChampsService.build_error_messages(dossier.champs) +
PiecesJustificativesService.missing_pj_error_messages(dossier)
return redirect_to_description_with_errors(dossier, errors) if errors.any?
end
if draft_submission?
flash.notice = 'Votre brouillon a bien été sauvegardé.'
redirect_to url_for(controller: :dossiers, action: :index, liste: :brouillon)
else
if @dossier.draft?
@dossier.initiated!
NotificationMailer.send_notification(@dossier, @dossier.procedure.initiated_mail).deliver_now!
if dossier.draft?
dossier.initiated!
NotificationMailer.send_notification(dossier, procedure.initiated_mail).deliver_now!
end
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
@ -88,9 +76,9 @@ class Users::DescriptionController < UsersController
if !((errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params)).empty?)
if flash.alert.nil?
flash.alert = errors_upload.html_safe
flash.alert = errors_upload.join('<br>').html_safe
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
else
@ -111,6 +99,11 @@ class Users::DescriptionController < UsersController
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?
params[:submit] && params[:submit].keys.first == 'brouillon'
end

View file

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

View file

@ -3,6 +3,6 @@ class NotificationDecorator < Draper::Decorator
def index_display
['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

View file

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

View file

@ -12,7 +12,7 @@ class NotificationMailer < ApplicationMailer
end
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
private

View file

@ -7,7 +7,7 @@ class Commentaire < ActiveRecord::Base
after_save :internal_notification
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
private

View file

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

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern
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

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern
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

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern
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

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern
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

View file

@ -3,7 +3,7 @@ module Mails
include MailTemplateConcern
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

View file

@ -13,7 +13,7 @@ class Notification < ActiveRecord::Base
# def broadcast_notification
# 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}
# end
end

View file

@ -36,7 +36,7 @@ class PreferenceListDossier < ActiveRecord::Base
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),
updated_at: create_column('Mise à jour le', table, 'updated_at', 'last_update', 2),
state: create_column('État', table, 'state', 'display_state', 1)

View file

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

View file

@ -1,11 +1,14 @@
class ChampsService
class << self
def save_champs(champs, params, check_mandatory = true)
def save_champs(champs, params)
fill_champs(champs, params)
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
private
@ -28,14 +31,5 @@ class ChampsService
def extract_minute(champ_id, h)
h[:time_minute]["'#{champ_id}'"]
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

View file

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

View file

@ -1,40 +1,51 @@
class PiecesJustificativesService
def self.upload! dossier, user, params
errors = ''
def self.upload!(dossier, user, params)
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|
unless params["piece_justificative_#{type_de_pieces_justificatives.id}"].nil?
without_virus, with_virus = tpj_contents
.partition { |_, content| ClamavService.safe_file?(content.path) }
if ClamavService.safe_file? params["piece_justificative_#{type_de_pieces_justificatives.id}"].path
piece_justificative = PieceJustificative.new(content: params["piece_justificative_#{type_de_pieces_justificatives.id}"],
dossier: dossier,
type_de_piece_justificative: type_de_pieces_justificatives,
user: user)
errors = with_virus
.map { |_, content| content.original_filename + ' : virus détecté' }
unless piece_justificative.save
errors << piece_justificative.errors.messages[:content][0]+" (#{piece_justificative.libelle})"+"<br>"
end
else
errors << params["piece_justificative_#{type_de_pieces_justificatives.id}"].original_filename+": <b>Virus détecté !!</b>"+"<br>"
end
end
end
errors
errors += without_virus
.map { |tpj, content| save_pj(content, dossier, tpj, user) }
.compact()
end
def self.upload_one! dossier, user, params
if ClamavService.safe_file? params[:piece_justificative][:content].path
piece_justificative = PieceJustificative.new(content: params[:piece_justificative][:content],
dossier: dossier,
type_de_piece_justificative: nil,
user: user)
content = params[:piece_justificative][:content]
if ClamavService.safe_file? content.path
pj = PieceJustificative.new(content: content,
dossier: dossier,
type_de_piece_justificative: nil,
user: user)
piece_justificative.save
pj.save
else
piece_justificative = PieceJustificative.new
piece_justificative.errors.add(:content, params[:piece_justificative][:content].original_filename+": <b>Virus détecté !!</b>")
pj = PieceJustificative.new
pj.errors.add(:content, content.original_filename + ': <b>Virus détecté !!</b>')
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

View file

@ -1,31 +1,36 @@
= f.fields_for :types_de_piece_justificative, types_de_piece_justificative, remote: true do |ff|
.form-inline
.form-group
%h4 Libellé
= ff.text_field :libelle, class: 'form-control libelle', placeholder: 'Libellé'
.form-group
%h4 Description
= ff.text_area :description, class: 'form-control description', placeholder: 'Description'
.form-group
%h4
Lien du formulaire vierge
%small
(optionel)
= ff.url_field :lien_demarche, class: 'form-control', placeholder: 'Lien du document vierge'
.pieces_justificatives_fields
= f.fields_for :types_de_piece_justificative, types_de_piece_justificative, remote: true do |ff|
.form-inline
.form-group
%h4 Libellé
= ff.text_field :libelle, class: 'form-control libelle', placeholder: 'Libellé'
.form-group
%h4 Description
= ff.text_area :description, class: 'form-control description', placeholder: 'Description'
.form-group
%h4
Lien du formulaire vierge
%small
(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
%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
%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) )
- 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
.fa.fa-info-circle.text-info{ style: 'font-size: 2em; margin-top: 20%;' }
.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
%b
n'ont jamais été ouvert par votre service.
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
%b
en cours de construction avec l'usager.
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
%b
complets
@ -23,14 +24,14 @@
%b
plus modifiables 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é
%b
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.
- 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
%b
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".

View file

@ -35,7 +35,7 @@
%br/
Code APE 6202A
%br/
N° TVA : FR 22 424 761 419
Nº TVA : FR 22 424 761 419
%br/
Siège social : 2 rue Kellermann - 59100 Roubaix - France.
%br
@ -61,7 +61,7 @@
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 :
%ul
%li N° de sécurité sociale,
%li Nº de sécurité sociale,
%li Infractions, condamnations, mesures de sécurité,
%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.
@ -77,10 +77,10 @@
Traitement des données à caractère personnel
%h4 Données personnelles :
%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
%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
%h3#entreprise_information

View file

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

View file

@ -6,6 +6,10 @@
= t('dynamics.page_title')
%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 'print', media: 'print', '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|
= link_to backoffice_dossier_path(dossier.id) do
.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')
.count= dossier.unreaded_notifications.count

View file

@ -1,7 +1,7 @@
Bonjour
%br
%br
Votre dossier --numero_dossier-- a été accepté.
Votre dossier  --numero_dossier-- a été accepté.
%br
%br
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
%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
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
%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
Bonne journée

View file

@ -1,7 +1,7 @@
Bonjour
%br
%br
Votre dossier --numero_dossier-- a été refusé.
Votre dossier  --numero_dossier-- a été refusé.
%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--

View file

@ -1,7 +1,7 @@
Bonjour
%br
%br
Votre dossier --numero_dossier-- a été classé sans suite.
Votre dossier  --numero_dossier-- a été classé sans suite.
%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--

View file

@ -43,11 +43,11 @@
.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-number
= @procedures_count
= number_with_delimiter(@procedures_count)
.stat-card.stat-card-half.big-number-card.pull-left
%span.big-number-card-title TOTAL DOSSIERS DÉPOSÉS
%span.big-number-card-number
= @dossiers_count
= number_with_delimiter(@dossiers_count)
.clearfix

View file

@ -18,24 +18,24 @@
- else
%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
%th.piece-libelle
= type_de_piece_justificative.libelle
= tpj.mandatory ? tpj.libelle + ' *' : tpj.libelle
%td
- unless type_de_piece_justificative.lien_demarche.blank?
- unless tpj.lien_demarche.blank?
%em
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
- if type_de_piece_justificative.api_entreprise
%span.text-success{ id: "piece_justificative_#{type_de_piece_justificative.id}" } Nous l'avons récupéré pour vous.
- if tpj.api_entreprise
%span.text-success{ id: "piece_justificative_#{tpj.id}" } Nous l'avons récupéré pour vous.
- else
- if dossier.retrieve_last_piece_justificative_by_type(type_de_piece_justificative.id).nil?
= file_field_tag "piece_justificative_#{type_de_piece_justificative.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes
- if dossier.retrieve_last_piece_justificative_by_type(tpj.id).nil?
= file_field_tag "piece_justificative_#{tpj.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes
- else
%span.btn.btn-sm.btn-file.btn-success
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.type_champ == 'textarea'
- case champ.type_champ
- when 'textarea'
= 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 }
- elsif champ.type_champ == 'civilite'
- when 'civilite'
= 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 }
- elsif champ.type_champ == 'yes_no'
- when 'yes_no'
= 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 }
- elsif champ.type_champ == 'pays'
- when 'pays'
= 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 }
- elsif champ.type_champ == 'engagement'
- when 'engagement'
= 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 }
- elsif champ.type_champ == 'dossier_link'
- when 'dossier_link'
= render partial: 'users/description/champs/dossier_link', locals: { champ: champ }
- elsif champ.type_champ == 'explication'
- when 'explication'
- else
%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
.fa.fa-info-circle.text-info{ style: 'font-size: 2em; margin-top: 20%;' }
.col-xs-11
- if dossiers_list_facade.liste == 'brouillon'
- case dossiers_list_facade.liste
- when 'brouillon'
Les dossiers présents dans cette liste
%b
n'ont pas encore été soumis aux services instructeurs.
Ils ne sont visibles que par vous.
- elsif dossiers_list_facade.liste == 'nouveaux'
- when 'nouveaux'
Les dossiers présents dans cette liste
%b
n'ont pas encore été ouverts
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
%b
visibles par les services instructeurs.
%br
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
%b
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.
- elsif dossiers_list_facade.liste == 'valides'
- when 'valides'
Les dossiers présents dans cette liste ont été
%b
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.
- elsif dossiers_list_facade.liste == 'en_instruction'
- when 'en_instruction'
Les dossiers présents dans cette liste sont
%b
en cours de réception
@ -39,12 +40,12 @@
%b
en cours d'examen
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
%b
une décision finale a été rendue.
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
%b
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)
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?
@ -24,7 +24,8 @@ set :port, 2200
set :deploy_to, '/var/www/tps_dev'
if ENV["to"] == "staging"
case ENV["to"]
when "staging"
if ENV['branch'].nil?
set :branch, 'staging'
else
@ -33,7 +34,7 @@ if ENV["to"] == "staging"
set :deploy_to, '/var/www/tps_dev'
set :user, 'tps_dev' # Username in the server to SSH to.
appname = 'tps_dev'
elsif ENV["to"] == "production"
when "production"
if ENV['branch'].nil?
set :branch, 'master'
else
@ -42,23 +43,10 @@ elsif ENV["to"] == "production"
set :deploy_to, '/var/www/tps'
set :user, 'tps' # Username in the server to SSH to.
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
set :rails_env, ENV["to"]
if ENV["to"] == "tps_v2"
set :rails_env, "staging"
end
# For system-wide RVM install.
# set :rvm_path, '/usr/local/rvm/bin/rvm'

View file

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

View file

@ -37,13 +37,53 @@ fr:
first: Premier
number:
currency:
format:
unit: '€'
delimiter: ' '
separator: ','
precision: 2
format: '%n %u'
currency:
format:
delimiter: " "
format: "%n %u"
precision: 2
separator: ","
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:
errors:
models:
@ -149,6 +189,59 @@ fr:
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."
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:
distance_in_words:
about_x_hours:

View file

@ -11,11 +11,11 @@ class InitiatedAllReceivedMailForProcedure < ActiveRecord::Migration
before_save :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,
<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>
En vous souhaitant une bonne journée,
<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.
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
enable_extension "plpgsql"
@ -403,6 +403,7 @@ ActiveRecord::Schema.define(version: 20170313140834) do
t.integer "procedure_id"
t.integer "order_place"
t.string "lien_demarche"
t.boolean "mandatory", default: false
end
create_table "users", force: :cascade do |t|

View file

@ -13,8 +13,8 @@ FactoryGirl.define do
end
trait :dossier_received do
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--"
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--"
type 'MailReceived'
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 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

View file

@ -26,7 +26,7 @@ describe PreferenceListDossier do
describe 'dossier_id' do
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[:attr]).to eq 'id' }
it { expect(subject[:attr_decorate]).to eq 'id' }

View file

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