Merge branch 'develop' into staging
This commit is contained in:
commit
698416024d
52 changed files with 455 additions and 263 deletions
BIN
app/assets/images/favicons/16x16.png
Normal file
BIN
app/assets/images/favicons/16x16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 466 B |
BIN
app/assets/images/favicons/32x32.png
Normal file
BIN
app/assets/images/favicons/32x32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 889 B |
BIN
app/assets/images/favicons/96x96.png
Normal file
BIN
app/assets/images/favicons/96x96.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
3
app/assets/stylesheets/pieces_justificatives_fields.scss
Normal file
3
app/assets/stylesheets/pieces_justificatives_fields.scss
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
.pieces_justificatives_fields {
|
||||||
|
.form-inline > .form-group { vertical-align: top; }
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 N°#{dossier.id}"
|
send_mail dossier, "Nouveau message pour votre dossier TPS nº #{dossier.id}"
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 N°--numero_dossier-- a été accepté'
|
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été accepté'
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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 N°--numero_dossier-- a été bien reçu'
|
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été bien reçu'
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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 N°--numero_dossier-- va être instruit'
|
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- va être instruit'
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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 N°--numero_dossier-- a été refusé'
|
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été refusé'
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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 N°--numero_dossier-- a été classé sans suite'
|
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été classé sans suite'
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
= 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
|
%br
|
||||||
= 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
|
|
||||||
- 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) )
|
|
||||||
|
|
|
@ -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".
|
||||||
|
|
|
@ -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 qu’elles 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 qu’elles 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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
Bonjour
|
Bonjour
|
||||||
%br
|
%br
|
||||||
%br
|
%br
|
||||||
Votre dossier N°--numero_dossier-- a été accepté.
|
Votre dossier nº --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--
|
||||||
|
|
|
@ -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--
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
Bonjour
|
Bonjour
|
||||||
%br
|
%br
|
||||||
%br
|
%br
|
||||||
Votre dossier N°--numero_dossier-- a été refusé.
|
Votre dossier nº --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--
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
Bonjour
|
Bonjour
|
||||||
%br
|
%br
|
||||||
%br
|
%br
|
||||||
Votre dossier N°--numero_dossier-- a été classé sans suite.
|
Votre dossier nº --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--
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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}']",
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddMandatoryColumnToTypesDePieceJustificative < ActiveRecord::Migration[5.0]
|
||||||
|
def change
|
||||||
|
add_column :types_de_piece_justificative, :mandatory, :boolean, default: false
|
||||||
|
end
|
||||||
|
end
|
|
@ -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|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 N°#{dossier.id}") }
|
it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS nº #{dossier.id}") }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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' }
|
||||||
|
|
|
@ -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
|
||||||
|
|
92
spec/services/pieces_justificatives_service_spec.rb
Normal file
92
spec/services/pieces_justificatives_service_spec.rb
Normal 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
|
Loading…
Reference in a new issue