Merge branch 'develop' into staging
This commit is contained in:
commit
73bd852e20
64 changed files with 490 additions and 204 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -35,3 +35,4 @@ coverage/**/*
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.byebug_history
|
.byebug_history
|
||||||
.env
|
.env
|
||||||
|
Procfile.dev
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
exclude: 'app/assets/stylesheets/reset.scss'
|
||||||
|
|
||||||
linters:
|
linters:
|
||||||
BangFormat:
|
BangFormat:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
1
Gemfile
1
Gemfile
|
@ -78,7 +78,6 @@ gem 'smart_listing'
|
||||||
|
|
||||||
gem 'bootstrap-wysihtml5-rails', '~> 0.3.3.8'
|
gem 'bootstrap-wysihtml5-rails', '~> 0.3.3.8'
|
||||||
|
|
||||||
gem 'as_csv'
|
|
||||||
gem 'spreadsheet_architect'
|
gem 'spreadsheet_architect'
|
||||||
|
|
||||||
gem 'apipie-rails'
|
gem 'apipie-rails'
|
||||||
|
|
|
@ -74,10 +74,6 @@ GEM
|
||||||
apipie-rails (0.3.7)
|
apipie-rails (0.3.7)
|
||||||
json
|
json
|
||||||
arel (7.1.4)
|
arel (7.1.4)
|
||||||
as_csv (2.0.2)
|
|
||||||
actionpack (>= 3.0)
|
|
||||||
activemodel (>= 3.0)
|
|
||||||
responders
|
|
||||||
ast (2.3.0)
|
ast (2.3.0)
|
||||||
attr_required (1.0.1)
|
attr_required (1.0.1)
|
||||||
autoprefixer-rails (6.5.4)
|
autoprefixer-rails (6.5.4)
|
||||||
|
@ -669,7 +665,6 @@ DEPENDENCIES
|
||||||
actioncable (= 5.0.0.1)
|
actioncable (= 5.0.0.1)
|
||||||
active_model_serializers
|
active_model_serializers
|
||||||
apipie-rails
|
apipie-rails
|
||||||
as_csv
|
|
||||||
bootstrap-datepicker-rails
|
bootstrap-datepicker-rails
|
||||||
bootstrap-sass (~> 3.3.5)
|
bootstrap-sass (~> 3.3.5)
|
||||||
bootstrap-wysihtml5-rails (~> 0.3.3.8)
|
bootstrap-wysihtml5-rails (~> 0.3.3.8)
|
||||||
|
|
18
README.md
18
README.md
|
@ -1,8 +1,8 @@
|
||||||
# TPS - TéléProcédure Simplifiée
|
# TPS - Téléprocédures Simplifiées
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
|
|
||||||
TéléProcédure Simplifiée, ou TPS pour les intimes, est une plateforme 100 % web et 0 % email, conçue afin de répondre au besoin urgent de l'État d'appliquer la directive sur le 100 % démat' à l'horizon 2018 pour les démarches administratives.
|
Téléprocédures Simplifiées, ou TPS pour les intimes, est une plateforme 100 % web et 0 % email, conçue afin de répondre au besoin urgent de l'État d'appliquer la directive sur le 100 % démat' à l'horizon 2018 pour les procédures administratives.
|
||||||
|
|
||||||
|
|
||||||
## Dépendances
|
## Dépendances
|
||||||
|
@ -10,6 +10,11 @@ TéléProcédure Simplifiée, ou TPS pour les intimes, est une plateforme 100 %
|
||||||
### Tous environnements
|
### Tous environnements
|
||||||
|
|
||||||
- postgresql
|
- postgresql
|
||||||
|
- redis
|
||||||
|
|
||||||
|
### Développement
|
||||||
|
|
||||||
|
- Mailcatcher : `gem install mailcatcher`
|
||||||
|
|
||||||
### Tests
|
### Tests
|
||||||
|
|
||||||
|
@ -39,6 +44,14 @@ Afin de générer la BDD de l'application, il est nécessaire d'éxécuter les c
|
||||||
rake db:create db:schema:load db:migrate RAILS_ENV=test
|
rake db:create db:schema:load db:migrate RAILS_ENV=test
|
||||||
|
|
||||||
|
|
||||||
|
## Lancement de l'application
|
||||||
|
|
||||||
|
redis-server
|
||||||
|
sidekiq
|
||||||
|
mailcatcher -f
|
||||||
|
rails s
|
||||||
|
|
||||||
|
|
||||||
## Exécution des tests (RSpec)
|
## Exécution des tests (RSpec)
|
||||||
|
|
||||||
Pour exécuter les tests de l'application, plusieurs possibilités :
|
Pour exécuter les tests de l'application, plusieurs possibilités :
|
||||||
|
@ -61,6 +74,7 @@ Pour exécuter les tests de l'application, plusieurs possibilités :
|
||||||
## Linting
|
## Linting
|
||||||
|
|
||||||
- Linter les fichiers HAML : `bundle exec haml-lint app/views/`
|
- Linter les fichiers HAML : `bundle exec haml-lint app/views/`
|
||||||
|
- Linter les fichiers SCSS : `bundle exec scss-lint app/assets/stylesheets/`
|
||||||
|
|
||||||
## Régénérer les binstubs
|
## Régénérer les binstubs
|
||||||
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
// Action Cable provides the framework to deal with WebSockets in Rails.
|
|
||||||
// You can generate new channels where WebSocket features live using the rails generate channel command.
|
|
||||||
//
|
|
||||||
//= require action_cable
|
|
||||||
//= require_self
|
|
||||||
//= require_tree ./channels
|
|
||||||
|
|
||||||
//(function() {
|
|
||||||
// this.App || (this.App = {});
|
|
||||||
//
|
|
||||||
// App.cable = ActionCable.createConsumer();
|
|
||||||
//
|
|
||||||
//}).call(this);
|
|
|
@ -1,23 +0,0 @@
|
||||||
//App.messages = App.cable.subscriptions.create('NotificationsChannel', {
|
|
||||||
// received: function (data) {
|
|
||||||
// if (window.location.href.indexOf('backoffice') !== -1) {
|
|
||||||
// $("#notification-alert").html(data['message']);
|
|
||||||
//
|
|
||||||
// slideIn_notification_alert();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//});
|
|
||||||
|
|
||||||
function slideIn_notification_alert (){
|
|
||||||
$("#notification-alert").animate({
|
|
||||||
right: '20px'
|
|
||||||
}, 250);
|
|
||||||
|
|
||||||
setTimeout(slideOut_notification_alert, 3500);
|
|
||||||
}
|
|
||||||
|
|
||||||
function slideOut_notification_alert (){
|
|
||||||
$("#notification-alert").animate({
|
|
||||||
right: '-250px'
|
|
||||||
}, 200);
|
|
||||||
}
|
|
|
@ -3,3 +3,7 @@ $light-blue: rgba(61, 149, 236, 0.8);
|
||||||
$black: #333333;
|
$black: #333333;
|
||||||
$grey: #999999;
|
$grey: #999999;
|
||||||
$light-grey: #F8F8F8;
|
$light-grey: #F8F8F8;
|
||||||
|
$border-grey: #CCCCCC;
|
||||||
|
$dark-red: #A94442;
|
||||||
|
$light-red: #EBCCD1;
|
||||||
|
$lighter-red: #F2DEDE;
|
||||||
|
|
|
@ -12,7 +12,47 @@
|
||||||
// defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
// defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
||||||
// file per style scope.
|
// file per style scope.
|
||||||
//
|
//
|
||||||
// = require_tree .
|
// = require _card
|
||||||
|
// = require _colors
|
||||||
|
// = require _constants
|
||||||
|
// = require _helpers
|
||||||
|
// = require _mixins
|
||||||
|
// = require _placeholders
|
||||||
|
// = require _turbolinks
|
||||||
|
// = require _typography
|
||||||
|
// = require admin_procedures_modal
|
||||||
|
// = require admin_type_de_champ
|
||||||
|
// = require backoffice
|
||||||
|
// = require carte
|
||||||
|
// = require cgu
|
||||||
|
// = require custom_mails
|
||||||
|
// = require default_data_block
|
||||||
|
// = require description
|
||||||
|
// = require dossier_show
|
||||||
|
// = require dossiers
|
||||||
|
// = require etapes
|
||||||
|
// = require fonts
|
||||||
|
// = require france_connect_particulier
|
||||||
|
// = require landing
|
||||||
|
// = require left_panel
|
||||||
|
// = require login
|
||||||
|
// = require main_container
|
||||||
|
// = require navbar
|
||||||
|
// = require notification_alert
|
||||||
|
// = require pieces_justificatives_fields
|
||||||
|
// = require pj_modal
|
||||||
|
// = require pref_list_menu
|
||||||
|
// = require print
|
||||||
|
// = require procedure
|
||||||
|
// = require recapitulatif
|
||||||
|
// = require search
|
||||||
|
// = require siret
|
||||||
|
// = require stats
|
||||||
|
// = require support_navigator_banner
|
||||||
|
// = require switch_menu
|
||||||
|
// = require typeahead
|
||||||
|
// = require users
|
||||||
|
|
||||||
// = require_self
|
// = require_self
|
||||||
// = require bootstrap-datepicker3
|
// = require bootstrap-datepicker3
|
||||||
// = require leaflet
|
// = require leaflet
|
||||||
|
|
7
app/assets/stylesheets/common.scss
Normal file
7
app/assets/stylesheets/common.scss
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
@import "typography";
|
||||||
|
|
||||||
|
body {
|
||||||
|
@extend %new-type;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.42857143;
|
||||||
|
}
|
27
app/assets/stylesheets/custom_reset.scss
Normal file
27
app/assets/stylesheets/custom_reset.scss
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
box-sizing: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove dotted outline on firefox
|
||||||
|
:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-moz-focus-inner {
|
||||||
|
border: none;
|
||||||
|
}
|
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
background-color: #003C92;
|
background-color: #003C92;
|
||||||
height: 40px;
|
min-height: 40px;
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
@ -42,7 +42,6 @@
|
||||||
.title-no-expanse,
|
.title-no-expanse,
|
||||||
.action,
|
.action,
|
||||||
.count {
|
.count {
|
||||||
height: 100%;
|
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
|
@ -58,6 +57,11 @@
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.title-content {
|
||||||
|
width: calc(100% - 50px);
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
.action {
|
.action {
|
||||||
background-color: #E45B51;
|
background-color: #E45B51;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
|
@ -138,3 +138,11 @@
|
||||||
width: 160px;
|
width: 160px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.piece-description {
|
||||||
|
display: block;
|
||||||
|
margin-top: 5px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
color: #737373;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
|
@ -2,10 +2,8 @@
|
||||||
@import "colors";
|
@import "colors";
|
||||||
@import "mixins";
|
@import "mixins";
|
||||||
@import "placeholders";
|
@import "placeholders";
|
||||||
@import "typography";
|
|
||||||
|
|
||||||
.landing {
|
.landing {
|
||||||
@extend %new-type;
|
|
||||||
background-color: #FFFFFF;
|
background-color: #FFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
12
app/assets/stylesheets/new_alert.scss
Normal file
12
app/assets/stylesheets/new_alert.scss
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
@import "colors";
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
padding: 15px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-danger {
|
||||||
|
background-color: $lighter-red;
|
||||||
|
border-color: $light-red;
|
||||||
|
color: $dark-red;
|
||||||
|
}
|
10
app/assets/stylesheets/new_application.scss
Normal file
10
app/assets/stylesheets/new_application.scss
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// = require reset
|
||||||
|
// = require custom_reset
|
||||||
|
// = require common
|
||||||
|
// = require utils
|
||||||
|
// = require fonts
|
||||||
|
// = require new_alert
|
||||||
|
// = require new_header
|
||||||
|
// = require new_footer
|
||||||
|
// = require landing
|
||||||
|
// = require navbar
|
|
@ -1,12 +1,12 @@
|
||||||
|
@import "colors";
|
||||||
@import "constants";
|
@import "constants";
|
||||||
@import "mixins";
|
@import "mixins";
|
||||||
@import "placeholders";
|
@import "placeholders";
|
||||||
@import "typography";
|
|
||||||
|
|
||||||
.footer {
|
.footer {
|
||||||
@extend %new-type;
|
|
||||||
@include vertical-padding(72px);
|
@include vertical-padding(72px);
|
||||||
background-color: $light-grey;
|
background-color: $light-grey;
|
||||||
|
border-top: 1px solid $border-grey;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-inner-content {
|
.footer-inner-content {
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
@import "constants";
|
@import "constants";
|
||||||
@import "colors";
|
@import "colors";
|
||||||
@import "mixins";
|
@import "mixins";
|
||||||
@import "typography";
|
|
||||||
|
|
||||||
// FIXME: Rename when the header is generalized
|
// FIXME: Rename when the header is generalized
|
||||||
.new-header {
|
.new-header {
|
||||||
@extend %new-type;
|
|
||||||
height: 72px;
|
height: 72px;
|
||||||
background-color: #FFFFFF;
|
background-color: #FFFFFF;
|
||||||
// FIXME: Delete when the header is generalized
|
}
|
||||||
margin-top: -60px;
|
|
||||||
|
.new-header-with-border {
|
||||||
|
border-bottom: 1px solid $border-grey;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-inner-content {
|
.header-inner-content {
|
48
app/assets/stylesheets/reset.scss
Normal file
48
app/assets/stylesheets/reset.scss
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/* http://meyerweb.com/eric/tools/css/reset/
|
||||||
|
v2.0 | 20110126
|
||||||
|
License: none (public domain)
|
||||||
|
*/
|
||||||
|
|
||||||
|
html, body, div, span, applet, object, iframe,
|
||||||
|
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||||
|
a, abbr, acronym, address, big, cite, code,
|
||||||
|
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||||
|
small, strike, strong, sub, sup, tt, var,
|
||||||
|
b, u, i, center,
|
||||||
|
dl, dt, dd, ol, ul, li,
|
||||||
|
fieldset, form, label, legend,
|
||||||
|
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||||
|
article, aside, canvas, details, embed,
|
||||||
|
figure, figcaption, footer, header, hgroup,
|
||||||
|
menu, nav, output, ruby, section, summary,
|
||||||
|
time, mark, audio, video {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
font: inherit;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
/* HTML5 display-role reset for older browsers */
|
||||||
|
article, aside, details, figcaption, figure,
|
||||||
|
footer, header, hgroup, menu, nav, section {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
ol, ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
blockquote, q {
|
||||||
|
quotes: none;
|
||||||
|
}
|
||||||
|
blockquote:before, blockquote:after,
|
||||||
|
q:before, q:after {
|
||||||
|
content: '';
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
}
|
15
app/assets/stylesheets/utils.scss
Normal file
15
app/assets/stylesheets/utils.scss
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
.pull-left {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pull-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clearfix {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ class Admin::MailTemplatesController < AdminController
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
@mail_template = find_the_right_mail params[:id]
|
@mail_template = find_the_right_mail params[:id]
|
||||||
|
@mail_template_name = params[:id]
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
|
|
|
@ -5,10 +5,10 @@ class StatsController < ApplicationController
|
||||||
dossiers = Dossier.where.not(:state => :draft)
|
dossiers = Dossier.where.not(:state => :draft)
|
||||||
|
|
||||||
@procedures_30_days_flow = thirty_days_flow_hash(procedures)
|
@procedures_30_days_flow = thirty_days_flow_hash(procedures)
|
||||||
@dossiers_30_days_flow = thirty_days_flow_hash(dossiers)
|
@dossiers_30_days_flow = thirty_days_flow_hash(dossiers, :initiated_at)
|
||||||
|
|
||||||
@procedures_cumulative = cumulative_hash(procedures)
|
@procedures_cumulative = cumulative_hash(procedures)
|
||||||
@dossiers_cumulative = cumulative_hash(dossiers)
|
@dossiers_cumulative = cumulative_hash(dossiers, :initiated_at)
|
||||||
|
|
||||||
@procedures_count = procedures.count
|
@procedures_count = procedures.count
|
||||||
@dossiers_count = dossiers.count
|
@dossiers_count = dossiers.count
|
||||||
|
@ -16,13 +16,13 @@ class StatsController < ApplicationController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def thirty_days_flow_hash(association)
|
def thirty_days_flow_hash(association, date_attribute = :created_at)
|
||||||
min_date = 30.days.ago.to_date
|
min_date = 30.days.ago.to_date
|
||||||
max_date = Time.now.to_date
|
max_date = Time.now.to_date
|
||||||
|
|
||||||
thirty_days_flow_hash = association
|
thirty_days_flow_hash = association
|
||||||
.where(:created_at => min_date..max_date)
|
.where(date_attribute => min_date..max_date)
|
||||||
.group("date_trunc('day', created_at)")
|
.group("date_trunc('day', #{date_attribute.to_s})")
|
||||||
.count
|
.count
|
||||||
|
|
||||||
clean_hash(thirty_days_flow_hash, min_date, max_date)
|
clean_hash(thirty_days_flow_hash, min_date, max_date)
|
||||||
|
@ -42,10 +42,10 @@ class StatsController < ApplicationController
|
||||||
h
|
h
|
||||||
end
|
end
|
||||||
|
|
||||||
def cumulative_hash(association)
|
def cumulative_hash(association, date_attribute = :created_at)
|
||||||
sum = 0
|
sum = 0
|
||||||
association
|
association
|
||||||
.group("DATE_TRUNC('month', created_at)")
|
.group("DATE_TRUNC('month', #{date_attribute.to_s})")
|
||||||
.count
|
.count
|
||||||
.to_a
|
.to_a
|
||||||
.sort{ |x, y| x[0] <=> y[0] }
|
.sort{ |x, y| x[0] <=> y[0] }
|
||||||
|
|
|
@ -10,5 +10,4 @@ class ChampDecorator < Draper::Decorator
|
||||||
def description_with_links
|
def description_with_links
|
||||||
description.gsub(URI.regexp, '<a target="_blank" href="\0">\0</a>').html_safe if description
|
description.gsub(URI.regexp, '<a target="_blank" href="\0">\0</a>').html_safe if description
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
class DossierDecorator < Draper::Decorator
|
class DossierDecorator < Draper::Decorator
|
||||||
|
include Rails.application.routes.url_helpers
|
||||||
|
|
||||||
delegate :current_page, :per_page, :offset, :total_entries, :total_pages
|
delegate :current_page, :per_page, :offset, :total_entries, :total_pages
|
||||||
delegate_all
|
delegate_all
|
||||||
|
|
||||||
|
@ -14,6 +16,16 @@ class DossierDecorator < Draper::Decorator
|
||||||
DossierDecorator.case_state_fr state
|
DossierDecorator.case_state_fr state
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def url(gestionnaire_signed_in)
|
||||||
|
if gestionnaire_signed_in
|
||||||
|
backoffice_dossier_path(id)
|
||||||
|
elsif brouillon?
|
||||||
|
users_dossier_description_path(id)
|
||||||
|
else
|
||||||
|
users_dossier_recapitulatif_path(id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.case_state_fr state=self.state
|
def self.case_state_fr state=self.state
|
||||||
h.t("activerecord.attributes.dossier.state.#{state}")
|
h.t("activerecord.attributes.dossier.state.#{state}")
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,7 +11,7 @@ class AdminTypesDeChampFacades
|
||||||
end
|
end
|
||||||
|
|
||||||
def active
|
def active
|
||||||
@private ? 'Champs privés' : 'Champs'
|
@private ? 'Annotations privées' : 'Champs'
|
||||||
end
|
end
|
||||||
|
|
||||||
def url
|
def url
|
||||||
|
|
|
@ -6,25 +6,58 @@ module MailTemplateConcern
|
||||||
|
|
||||||
TAGS = {
|
TAGS = {
|
||||||
numero_dossier: {
|
numero_dossier: {
|
||||||
description: "Permet d'afficher le numéro de dossier de l'utilisateur."
|
description: "Permet d'afficher le numéro de dossier de l'utilisateur.",
|
||||||
|
templates: [
|
||||||
|
"initiated_mail",
|
||||||
|
"received_mail",
|
||||||
|
"closed_mail",
|
||||||
|
"refused_mail",
|
||||||
|
"without_continuation_mail"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
lien_dossier: {
|
lien_dossier: {
|
||||||
description: "Permet d'afficher un lien vers le dossier de l'utilisateur."
|
description: "Permet d'afficher un lien vers le dossier de l'utilisateur.",
|
||||||
|
templates: [
|
||||||
|
"initiated_mail",
|
||||||
|
"received_mail",
|
||||||
|
"closed_mail",
|
||||||
|
"refused_mail",
|
||||||
|
"without_continuation_mail"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
libelle_procedure: {
|
libelle_procedure: {
|
||||||
description: "Permet d'afficher le libellé de la procédure."
|
description: "Permet d'afficher le libellé de la procédure.",
|
||||||
|
templates: [
|
||||||
|
"initiated_mail",
|
||||||
|
"received_mail",
|
||||||
|
"closed_mail",
|
||||||
|
"refused_mail",
|
||||||
|
"without_continuation_mail"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
date_de_decision: {
|
||||||
|
description: "Permet d'afficher la date à laquelle la décision finale (acceptation, refus, classement sans suite) sur le dossier a été prise.",
|
||||||
|
templates: [
|
||||||
|
"closed_mail",
|
||||||
|
"refused_mail",
|
||||||
|
"without_continuation_mail"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def object_for_dossier dossier
|
def self.tags_for_template(template)
|
||||||
|
TAGS.select { |key, value| value[:templates].include?(template) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def object_for_dossier(dossier)
|
||||||
replace_tags(object, dossier)
|
replace_tags(object, dossier)
|
||||||
end
|
end
|
||||||
|
|
||||||
def body_for_dossier dossier
|
def body_for_dossier(dossier)
|
||||||
replace_tags(body, dossier)
|
replace_tags(body, dossier)
|
||||||
end
|
end
|
||||||
|
|
||||||
def replace_tags string, dossier
|
def replace_tags(string, dossier)
|
||||||
TAGS.inject(string) do |acc, tag|
|
TAGS.inject(string) do |acc, tag|
|
||||||
acc.gsub!("--#{tag.first}--", replace_tag(tag.first.to_sym, dossier)) || acc
|
acc.gsub!("--#{tag.first}--", replace_tag(tag.first.to_sym, dossier)) || acc
|
||||||
end
|
end
|
||||||
|
@ -43,7 +76,7 @@ module MailTemplateConcern
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def replace_tag tag, dossier
|
def replace_tag(tag, dossier)
|
||||||
case tag
|
case tag
|
||||||
when :numero_dossier
|
when :numero_dossier
|
||||||
dossier.id.to_s
|
dossier.id.to_s
|
||||||
|
@ -51,6 +84,8 @@ module MailTemplateConcern
|
||||||
link_to users_dossier_recapitulatif_url(dossier), users_dossier_recapitulatif_url(dossier), target: '_blank'
|
link_to users_dossier_recapitulatif_url(dossier), users_dossier_recapitulatif_url(dossier), target: '_blank'
|
||||||
when :libelle_procedure
|
when :libelle_procedure
|
||||||
dossier.procedure.libelle
|
dossier.procedure.libelle
|
||||||
|
when :date_de_decision
|
||||||
|
dossier.processed_at.present? ? dossier.processed_at.strftime("%d/%m/%Y") : ""
|
||||||
else
|
else
|
||||||
'--BALISE_NON_RECONNUE--'
|
'--BALISE_NON_RECONNUE--'
|
||||||
end
|
end
|
||||||
|
|
|
@ -281,18 +281,18 @@ class Dossier < ActiveRecord::Base
|
||||||
def text_summary
|
def text_summary
|
||||||
if brouillon?
|
if brouillon?
|
||||||
parts = [
|
parts = [
|
||||||
"Dossier en brouillon répondant à la démarche ",
|
"Dossier en brouillon répondant à la procédure ",
|
||||||
procedure.libelle,
|
procedure.libelle,
|
||||||
", gérée par l'organisme ",
|
" gérée par l'organisme ",
|
||||||
procedure.organisation
|
procedure.organisation
|
||||||
]
|
]
|
||||||
else
|
else
|
||||||
parts = [
|
parts = [
|
||||||
"Dossier déposé le ",
|
"Dossier déposé le ",
|
||||||
initiated_at.strftime("%d/%m/%Y"),
|
initiated_at.strftime("%d/%m/%Y"),
|
||||||
", sur la démarche ",
|
" sur la procédure ",
|
||||||
procedure.libelle,
|
procedure.libelle,
|
||||||
", gérée par l'organisme ",
|
" gérée par l'organisme ",
|
||||||
procedure.organisation
|
procedure.organisation
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
|
@ -48,7 +48,7 @@ class PreferenceListDossier < ActiveRecord::Base
|
||||||
|
|
||||||
{
|
{
|
||||||
libelle: create_column('Libellé procédure', table, 'libelle', 'libelle', 4),
|
libelle: create_column('Libellé procédure', table, 'libelle', 'libelle', 4),
|
||||||
organisation: create_column('Organisation', table, 'organisation', 'organisation', 3),
|
organisation: create_column('Organisme', table, 'organisation', 'organisation', 3),
|
||||||
direction: create_column('Direction', table, 'direction', 'direction', 3)
|
direction: create_column('Direction', table, 'direction', 'direction', 3)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,14 +15,14 @@
|
||||||
= f.button :submit, 'Mettre à jour', class: "btn-success"
|
= f.button :submit, 'Mettre à jour', class: "btn-success"
|
||||||
|
|
||||||
.row
|
.row
|
||||||
.col-md-8
|
.col-md-12
|
||||||
%table.table
|
%table.table
|
||||||
%tr
|
%tr
|
||||||
%th
|
%th.col-md-3
|
||||||
Balise
|
Balise
|
||||||
%th
|
%th
|
||||||
Description
|
Description
|
||||||
- MailTemplateConcern::TAGS.each do |balise|
|
- MailTemplateConcern.tags_for_template(@mail_template_name).each do |balise|
|
||||||
%tr
|
%tr
|
||||||
%td.center
|
%td.center
|
||||||
= "--#{balise.first}--"
|
= "--#{balise.first}--"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
.alert.alert-info
|
.alert.alert-info
|
||||||
Cette procédure est publiée, certains éléments de la description ne sont plus modifiables
|
Cette procédure est publiée, certains éléments de la description ne sont plus modifiables
|
||||||
|
|
||||||
- { libelle: 'Libellé*', description: 'Description*', organisation: 'Organisation', direction: 'Direction', lien_site_web: 'Lien site internet', lien_notice: 'Lien notice' }.each do |key, value|
|
- { libelle: 'Libellé*', description: 'Description*', organisation: 'Organisme', direction: 'Direction', lien_site_web: 'Lien site internet', lien_notice: 'Lien notice' }.each do |key, value|
|
||||||
.form-group
|
.form-group
|
||||||
%h4
|
%h4
|
||||||
= value
|
= value
|
||||||
|
|
|
@ -73,7 +73,7 @@
|
||||||
|
|
||||||
.champs_private.col-xs-6.col-md-3
|
.champs_private.col-xs-6.col-md-3
|
||||||
%h4.text-info
|
%h4.text-info
|
||||||
Champs privés
|
Annotations privées
|
||||||
.badge.progress-bar-info
|
.badge.progress-bar-info
|
||||||
= @facade.procedure.types_de_champ_private.size
|
= @facade.procedure.types_de_champ_private.size
|
||||||
%ul
|
%ul
|
||||||
|
@ -102,7 +102,7 @@
|
||||||
%div
|
%div
|
||||||
= @facade.dossiers_waiting_gestionnaire_total
|
= @facade.dossiers_waiting_gestionnaire_total
|
||||||
|
|
||||||
%h4.text-info Attente Utilisateur
|
%h4.text-info Attente Usager
|
||||||
%div
|
%div
|
||||||
= @facade.dossiers_waiting_user_total
|
= @facade.dossiers_waiting_user_total
|
||||||
|
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
#state_description.row{ style: 'width: 50%; margin-left: auto; margin-right: auto;' }
|
|
||||||
.panel.panel-info
|
|
||||||
.panel-body.center
|
|
||||||
.row
|
|
||||||
.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
|
|
||||||
- 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.
|
|
||||||
- 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.
|
|
||||||
- when 'fige'
|
|
||||||
Tous les dossiers présents dans cette liste ont été déclarés
|
|
||||||
%b
|
|
||||||
complets
|
|
||||||
et ne sont
|
|
||||||
%b
|
|
||||||
plus modifiables par l'usager.
|
|
||||||
Ils attendent donc leurs dépots officiels qui doit être effectué par l'usager.
|
|
||||||
- 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.
|
|
||||||
- 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.
|
|
||||||
- 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".
|
|
|
@ -1,6 +1,6 @@
|
||||||
#cgu
|
#cgu
|
||||||
%h2
|
%h2
|
||||||
Condition d’utilisation du service « TPS » pour téléprocédure simplifiée
|
Condition d’utilisation du service « TPS » pour téléprocédures simplifiées
|
||||||
%br
|
%br
|
||||||
%h3#editeur
|
%h3#editeur
|
||||||
Editeur
|
Editeur
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
%a{ :href => "https://tps.apientreprise.fr/" }
|
%a{ :href => "https://tps.apientreprise.fr/" }
|
||||||
%strong tps.apientreprise.fr
|
%strong tps.apientreprise.fr
|
||||||
%p
|
%p
|
||||||
Le site internet tps.apientreprise.fr a pour objet de faciliter la création de démarches administratives en ligne par les acteurs publics, et l’examen par plusieurs services des demandes formulées par les usagers auprès d’un ou organismes publics.
|
Le site internet tps.apientreprise.fr a pour objet de faciliter la création de procédures administratives en ligne par les acteurs publics, et l’examen par plusieurs services des demandes formulées par les usagers auprès d’un ou organismes publics.
|
||||||
%br
|
%br
|
||||||
%h3#acteurs
|
%h3#acteurs
|
||||||
Acteurs de
|
Acteurs de
|
||||||
|
@ -53,8 +53,8 @@
|
||||||
%p Les acteurs de TPS sont les suivants :
|
%p Les acteurs de TPS sont les suivants :
|
||||||
%ul
|
%ul
|
||||||
%li Le SGMAP qui héberge le service TPS, le maintien en condition opérationnelle et gère les droits d’accès
|
%li Le SGMAP qui héberge le service TPS, le maintien en condition opérationnelle et gère les droits d’accès
|
||||||
%li L’administrateur au sein d’une administration donnée qui crée la démarche en ligne
|
%li L’administrateur au sein d’une administration donnée qui crée la procédure en ligne
|
||||||
%li Le ou les accompagnateurs au sein d’une administration donnée, qui reçoivent les démarches des usagers, les accompagnent le cas échéant dans le bouclage de leurs dossier, instruisent la demande et décident des suites à donner aux demandes
|
%li Le ou les accompagnateurs au sein d’une administration donnée, qui reçoivent les dossiers des usagers, les accompagnent le cas échéant dans le bouclage de leurs dossier, instruisent la demande et décident des suites à donner aux demandes
|
||||||
%li Les Usagers qui formulent les demandes en ligne via le formulaire qui leur est mis à disposition
|
%li Les Usagers qui formulent les demandes en ligne via le formulaire qui leur est mis à disposition
|
||||||
%br
|
%br
|
||||||
%h3#CNIL
|
%h3#CNIL
|
||||||
|
@ -67,10 +67,10 @@
|
||||||
%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.
|
||||||
%br
|
%br
|
||||||
%h3#data_collects
|
%h3#data_collects
|
||||||
Données collectées et responsabilité des organismes publics à l’initiative de démarches en ligne avec TPS.
|
Données collectées et responsabilité des organismes publics à l’initiative de procédures en ligne avec TPS.
|
||||||
%p Les données collectées par le service sont définis par les services publics utilisateurs du service qui arrêtent, sous leur responsabilité, la liste des informations qui seront demandées à l’usager.
|
%p Les données collectées par le service sont définis par les services publics utilisateurs du service qui arrêtent, sous leur responsabilité, la liste des informations qui seront demandées à l’usager.
|
||||||
%p Les organismes publics s’engagent à créer des démarches pour collecter les informations strictement nécessaires à l’examen des demandes formulées auprès des acteurs publics, dans le cadre juridique prévu par chacune des démarches.
|
%p Les organismes publics s’engagent à créer des procédures pour collecter les informations strictement nécessaires à l’examen des demandes formulées auprès des acteurs publics, dans le cadre juridique prévu par chacune des procédures.
|
||||||
%p Ces données sont collectées et traitées par les seuls services concernés par l’examen des demandes, et précisées dans la notice d’utilisation de chaque démarche publiée par l’organisme public.
|
%p Ces données sont collectées et traitées par les seuls services concernés par l’examen des demandes, et précisées dans la notice d’utilisation de chaque procédure publiée par l’organisme public.
|
||||||
|
|
||||||
%br
|
%br
|
||||||
%h3#individual_data
|
%h3#individual_data
|
||||||
|
@ -117,7 +117,7 @@
|
||||||
%a{ :href => "https://www.infogreffe.fr/societes/cgu-cgv.html" } Conditions générales d’utilisation des données d’infogreffe
|
%a{ :href => "https://www.infogreffe.fr/societes/cgu-cgv.html" } Conditions générales d’utilisation des données d’infogreffe
|
||||||
|
|
||||||
%br
|
%br
|
||||||
%h4 TPS fait appel à d’autres services opérés par le SGMAP afin de faciliter les démarches administratives :
|
%h4 TPS fait appel à d’autres services opérés par le SGMAP afin de faciliter les procédures administratives :
|
||||||
%br
|
%br
|
||||||
%p
|
%p
|
||||||
%strong> France CONNECT
|
%strong> France CONNECT
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
%h3
|
%h3
|
||||||
La campagne de création de nouveau dossier
|
La campagne de création de nouveau dossier
|
||||||
%br
|
%br
|
||||||
pour cette démarche en ligne est maintenant terminée.
|
pour cette procédure en ligne est maintenant terminée.
|
||||||
|
|
||||||
%br
|
%br
|
||||||
%p
|
%p
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
%th= smart_listing.sortable 'ID', 'id'
|
%th= smart_listing.sortable 'ID', 'id'
|
||||||
%th= smart_listing.sortable 'Titre', 'libelle'
|
%th= smart_listing.sortable 'Titre', 'libelle'
|
||||||
%th Description
|
%th Description
|
||||||
%th= smart_listing.sortable 'Organisation', 'organisation'
|
%th= smart_listing.sortable 'Organisme', 'organisation'
|
||||||
|
|
||||||
- smart_listing.collection.each do |procedure|
|
- smart_listing.collection.each do |procedure|
|
||||||
- procedure = procedure.decorate
|
- procedure = procedure.decorate
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
- if champ.type_champ == 'dossier_link'
|
- if champ.type_champ == 'dossier_link'
|
||||||
- dossier = Dossier.includes(:procedure).find_by(id: champ.decorate.value)
|
- dossier = Dossier.includes(:procedure).find_by(id: champ.decorate.value)
|
||||||
- if dossier
|
- if dossier
|
||||||
= link_to("Dossier #{dossier.id}", backoffice_dossier_path(champ.decorate.value), target: '_blank')
|
= link_to("Dossier #{dossier.id}", dossier.decorate.url(gestionnaire_signed_in?), target: '_blank')
|
||||||
%br
|
%br
|
||||||
= dossier.text_summary
|
= dossier.text_summary
|
||||||
- else
|
- else
|
||||||
|
@ -127,7 +127,7 @@
|
||||||
%table.table
|
%table.table
|
||||||
%thead
|
%thead
|
||||||
%th
|
%th
|
||||||
Utilisateur
|
Usager
|
||||||
%th
|
%th
|
||||||
Date d'envoi
|
Date d'envoi
|
||||||
%th
|
%th
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
%label{ style: 'font-weight: normal;' }
|
%label{ style: 'font-weight: normal;' }
|
||||||
= f.check_box :autorisation_donnees
|
= f.check_box :autorisation_donnees
|
||||||
= " ".html_safe
|
= " ".html_safe
|
||||||
Vos informations personnelles ne seront jamais utilisées dans un but lucratif ou commercial. Elles ne pourront être communiquées à de tiers personnes sans votre accord préalable. Elles pourront en revanche être communiquées aux administrations compétentes afin d'instruire votre dossier, conformément à la déclaration CNIL effectué par le service TPS.
|
Vos informations personnelles ne seront jamais utilisées dans un but lucratif ou commercial. Elles ne pourront être communiquées à de tierces personnes sans votre accord préalable. Elles pourront en revanche être communiquées aux administrations compétentes afin d'instruire votre dossier, conformément à la déclaration CNIL effectuée par le service TPS.
|
||||||
= link_to 'en savoir plus', cgu_path, target: '_blank'
|
= link_to 'en savoir plus', cgu_path, target: '_blank'
|
||||||
.row
|
.row
|
||||||
.col-xs-5.col-xs-5
|
.col-xs-5.col-xs-5
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
- if flash.notice.present? || flash.alert.present?
|
||||||
#flash_message.center
|
#flash_message.center
|
||||||
- if flash.notice
|
- if flash.notice.present?
|
||||||
.alert.alert-success
|
.alert.alert-success
|
||||||
= flash.notice
|
= flash.notice
|
||||||
- if flash.alert
|
- if flash.alert.present?
|
||||||
.alert.alert-danger
|
.alert.alert-danger
|
||||||
= flash.alert.html_safe
|
= flash.alert.html_safe
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.new-header
|
.new-header{ class: current_page?(root_path) ? nil : 'new-header-with-border' }
|
||||||
.header-inner-content
|
.header-inner-content
|
||||||
%img.header-logo.pull-left{ src: image_url("header/logo-tps.svg") }
|
%img.header-logo.pull-left{ src: image_url("header/logo-tps.svg") }
|
||||||
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
#notification-alert.alert.alert-success
|
|
|
@ -9,7 +9,7 @@
|
||||||
= link_to(users_dossiers_path, id: :menu_item_procedure) do
|
= link_to(users_dossiers_path, id: :menu_item_procedure) do
|
||||||
%i.fa.fa-user
|
%i.fa.fa-user
|
||||||
|
|
||||||
Utilisateur
|
Usager
|
||||||
- if gestionnaire_signed_in?
|
- if gestionnaire_signed_in?
|
||||||
%li
|
%li
|
||||||
= link_to(backoffice_dossiers_path) do
|
= link_to(backoffice_dossiers_path) do
|
||||||
|
|
|
@ -54,7 +54,6 @@
|
||||||
%i.fa.fa-times{ style: 'position: fixed; top: 10; right: 30; color: white;' }
|
%i.fa.fa-times{ style: 'position: fixed; top: 10; right: 30; color: white;' }
|
||||||
|
|
||||||
= render partial: 'layouts/switch_devise_profile_module'
|
= render partial: 'layouts/switch_devise_profile_module'
|
||||||
= render partial: 'layouts/notifications_alert'
|
|
||||||
|
|
||||||
= render partial: 'layouts/footer', locals: { main_container_size: main_container_size }
|
= render partial: 'layouts/footer', locals: { main_container_size: main_container_size }
|
||||||
= render partial: 'layouts/google_analytics'
|
= render partial: 'layouts/google_analytics'
|
||||||
|
|
|
@ -34,8 +34,8 @@
|
||||||
|
|
||||||
- unless @procedure.locked?
|
- unless @procedure.locked?
|
||||||
%a#onglet-private-champs{ :href => "#{url_for admin_procedure_types_de_champ_private_path(@procedure)}" }
|
%a#onglet-private-champs{ :href => "#{url_for admin_procedure_types_de_champ_private_path(@procedure)}" }
|
||||||
.procedure-list-element{ class: ('active' if active == 'Champs privés') }
|
.procedure-list-element{ class: ('active' if active == 'Annotations privées') }
|
||||||
Champs privés
|
Annotations privées
|
||||||
|
|
||||||
%a#onglet-inemailsfos{ :href => "#{url_for admin_procedure_mail_templates_path(@procedure)}" }
|
%a#onglet-inemailsfos{ :href => "#{url_for admin_procedure_mail_templates_path(@procedure)}" }
|
||||||
.procedure-list-element{ class: ('active' if active == 'E-mails') }
|
.procedure-list-element{ class: ('active' if active == 'E-mails') }
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
= render partial: 'layouts/left_panels/left_panel_admin_procedurescontroller_navbar', locals: { active: "Champs privés" }
|
= render partial: 'layouts/left_panels/left_panel_admin_procedurescontroller_navbar', locals: { active: "Annotations privées" }
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
= favicon_link_tag(image_url("favicons/32x32.png"), type: "image/png", sizes: "32x32")
|
= 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")
|
= 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 "new_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
|
||||||
|
|
||||||
%body
|
%body
|
||||||
|
@ -30,7 +30,6 @@
|
||||||
= yield
|
= yield
|
||||||
|
|
||||||
= render :partial => "layouts/switch_devise_profile_module"
|
= render :partial => "layouts/switch_devise_profile_module"
|
||||||
= render :partial => "layouts/notifications_alert"
|
|
||||||
|
|
||||||
= render partial: "layouts/new_footer"
|
= render partial: "layouts/new_footer"
|
||||||
= render partial: "layouts/google_analytics"
|
= render partial: "layouts/google_analytics"
|
||||||
|
|
|
@ -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é le --date_de_decision--.
|
||||||
%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 dossier nº --numero_dossier-- a été refusé.
|
Votre dossier nº --numero_dossier-- a été refusé le --date_de_decision--.
|
||||||
%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 le --date_de_decision--.
|
||||||
%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--
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
%p.hero-tagline
|
%p.hero-tagline
|
||||||
%em.hero-tagline-em Dématérialisez
|
%em.hero-tagline-em Dématérialisez
|
||||||
%br
|
%br
|
||||||
vos démarches administratives en quelques minutes
|
vos procédures administratives en quelques minutes
|
||||||
|
|
||||||
= link_to "Demander une démo",
|
= link_to "Demander une démo",
|
||||||
"mailto:#{t("dynamics.contact_email")}?subject=Demande de démo TPS",
|
"mailto:#{t("dynamics.contact_email")}?subject=Demande de démo TPS",
|
||||||
|
@ -135,7 +135,7 @@
|
||||||
%p.cta-panel-phone-cta
|
%p.cta-panel-phone-cta
|
||||||
ou nous appeler au 01 40 15 68 49
|
ou nous appeler au 01 40 15 68 49
|
||||||
.pull-left
|
.pull-left
|
||||||
%h1.cta-panel-title Commencez à dématerialiser vos démarches
|
%h1.cta-panel-title Commencez à dématerialiser vos procédures
|
||||||
%p.cta-panel-explanation Nous vous accompagnons dans la prise en main de l’outil
|
%p.cta-panel-explanation Nous vous accompagnons dans la prise en main de l’outil
|
||||||
.clearfix
|
.clearfix
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
= javascript_include_tag 'https://code.highcharts.com/highcharts.js', 'chartkick'
|
= javascript_include_tag 'https://code.highcharts.com/highcharts.js', 'chartkick', "data-turbolinks-track" => true
|
||||||
|
|
||||||
.statistiques
|
.statistiques
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
Cumul
|
Cumul
|
||||||
%li.segmented-control-item{ :onclick => "TPS.toggleChart(event, '.flux-procedures-chart');" }
|
%li.segmented-control-item{ :onclick => "TPS.toggleChart(event, '.flux-procedures-chart');" }
|
||||||
Flux (30 jours)
|
Flux (30 jours)
|
||||||
%span.stat-card-title.pull-left Démarches dématérialisées
|
%span.stat-card-title.pull-left Procédures dématérialisées
|
||||||
.clearfix
|
.clearfix
|
||||||
|
|
||||||
.chart-container
|
.chart-container
|
||||||
|
@ -41,7 +41,7 @@
|
||||||
:colors => ["rgba(61, 149, 236, 1)"]
|
:colors => ["rgba(61, 149, 236, 1)"]
|
||||||
|
|
||||||
.card.stat-card.stat-card-half.big-number-card.pull-left
|
.card.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 PROCÉDURES DÉMATÉRIALISÉES
|
||||||
%span.big-number-card-number
|
%span.big-number-card-number
|
||||||
= number_with_delimiter(@procedures_count)
|
= number_with_delimiter(@procedures_count)
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
%tr
|
%tr
|
||||||
%th.piece-libelle
|
%th.piece-libelle
|
||||||
= tpj.mandatory ? tpj.libelle + ' *' : tpj.libelle
|
= tpj.mandatory ? tpj.libelle + ' *' : tpj.libelle
|
||||||
|
%br
|
||||||
|
.piece-description= tpj.description
|
||||||
|
|
||||||
%td
|
%td
|
||||||
- unless tpj.lien_demarche.blank?
|
- unless tpj.lien_demarche.blank?
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
.col-xs-12.title
|
.col-xs-12.title
|
||||||
.carret-right
|
.carret-right
|
||||||
.carret-down
|
.carret-down
|
||||||
|
.title-content
|
||||||
= libelle
|
= libelle
|
||||||
|
.clearfix
|
||||||
.body
|
.body
|
||||||
= render partial: 'users/description/champs/render_list_champs', locals: { champs: champs, order_place: order_place }
|
= render partial: 'users/description/champs/render_list_champs', locals: { champs: champs, order_place: order_place }
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
- when '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 le service instructeur.
|
||||||
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.
|
||||||
- when 'valides'
|
- when 'valides'
|
||||||
Les dossiers présents dans cette liste ont été
|
Les dossiers présents dans cette liste ont été
|
||||||
|
|
|
@ -8,4 +8,4 @@ Rails.application.config.assets.version = '1.0'
|
||||||
|
|
||||||
# Precompile additional assets.
|
# Precompile additional assets.
|
||||||
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
|
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
|
||||||
Rails.application.config.assets.precompile += %w(print.css)
|
Rails.application.config.assets.precompile += %w(print.css new_application.css)
|
||||||
|
|
|
@ -121,6 +121,7 @@ fr:
|
||||||
blank: est vide
|
blank: est vide
|
||||||
password:
|
password:
|
||||||
blank: ': Le mot de passe est vide'
|
blank: ': Le mot de passe est vide'
|
||||||
|
too_short: ': Le mot de passe est trop court'
|
||||||
|
|
||||||
devise:
|
devise:
|
||||||
confirmations:
|
confirmations:
|
||||||
|
@ -187,7 +188,7 @@ fr:
|
||||||
france_connect:
|
france_connect:
|
||||||
connexion: "Erreur lors de la connexion à France Connect."
|
connexion: "Erreur lors de la connexion à France Connect."
|
||||||
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 procédure en ligne a été fermée, il n'est plus possible de déposer de dossier."
|
||||||
|
|
||||||
date:
|
date:
|
||||||
abbr_day_names:
|
abbr_day_names:
|
||||||
|
|
|
@ -16,7 +16,7 @@ common: &default_settings
|
||||||
|
|
||||||
# Your application name. Renaming here affects where data displays in New
|
# Your application name. Renaming here affects where data displays in New
|
||||||
# Relic. For more details, see https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/renaming-applications
|
# Relic. For more details, see https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/renaming-applications
|
||||||
app_name: Téléprocédure Simplifiée
|
app_name: Téléprocédures Simplifiées
|
||||||
|
|
||||||
# To disable the agent regardless of other settings, uncomment the following:
|
# To disable the agent regardless of other settings, uncomment the following:
|
||||||
# agent_enabled: false
|
# agent_enabled: false
|
||||||
|
@ -30,7 +30,7 @@ common: &default_settings
|
||||||
# If your application has other named environments, configure them here.
|
# If your application has other named environments, configure them here.
|
||||||
development:
|
development:
|
||||||
<<: *default_settings
|
<<: *default_settings
|
||||||
app_name: Téléprocédure Simplifiée (Development)
|
app_name: Téléprocédures Simplifiées (Development)
|
||||||
|
|
||||||
# NOTE: There is substantial overhead when running in developer mode.
|
# NOTE: There is substantial overhead when running in developer mode.
|
||||||
# Do not use for production or load testing.
|
# Do not use for production or load testing.
|
||||||
|
@ -43,7 +43,7 @@ test:
|
||||||
|
|
||||||
staging:
|
staging:
|
||||||
<<: *default_settings
|
<<: *default_settings
|
||||||
app_name: Téléprocédure Simplifiée (Staging)
|
app_name: Téléprocédures Simplifiées (Staging)
|
||||||
|
|
||||||
production:
|
production:
|
||||||
<<: *default_settings
|
<<: *default_settings
|
||||||
|
|
|
@ -2,6 +2,7 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe StatsController, type: :controller do
|
describe StatsController, type: :controller do
|
||||||
describe '#thirty_days_flow_hash' do
|
describe '#thirty_days_flow_hash' do
|
||||||
|
context "without a date_attribut" do
|
||||||
before do
|
before do
|
||||||
FactoryGirl.create(:procedure, :created_at => 45.days.ago)
|
FactoryGirl.create(:procedure, :created_at => 45.days.ago)
|
||||||
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
|
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
|
||||||
|
@ -24,7 +25,32 @@ describe StatsController, type: :controller do
|
||||||
it { expect(subject).to eq(@expected_hash) }
|
it { expect(subject).to eq(@expected_hash) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "with a date_attribut" do
|
||||||
|
before do
|
||||||
|
FactoryGirl.create(:procedure, :created_at => 45.days.ago, :updated_at => 50.days.ago)
|
||||||
|
FactoryGirl.create(:procedure, :created_at => 15.days.ago, :updated_at => 10.days.ago)
|
||||||
|
FactoryGirl.create(:procedure, :created_at => 1.day.ago, :updated_at => 3.days.ago)
|
||||||
|
|
||||||
|
@expected_hash = {}
|
||||||
|
(30.days.ago.to_date..Time.now.to_date).each do |day|
|
||||||
|
if [10.days.ago.to_date, 3.day.ago.to_date].include?(day)
|
||||||
|
@expected_hash[day] = 1
|
||||||
|
else
|
||||||
|
@expected_hash[day] = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
let (:association) { Procedure.all }
|
||||||
|
|
||||||
|
subject { StatsController.new.send(:thirty_days_flow_hash, association, :updated_at) }
|
||||||
|
|
||||||
|
it { expect(subject).to eq(@expected_hash) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#cumulative_hash' do
|
describe '#cumulative_hash' do
|
||||||
|
context "without a date attribute" do
|
||||||
before do
|
before do
|
||||||
FactoryGirl.create(:procedure, :created_at => 45.days.ago)
|
FactoryGirl.create(:procedure, :created_at => 45.days.ago)
|
||||||
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
|
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
|
||||||
|
@ -41,3 +67,21 @@ describe StatsController, type: :controller do
|
||||||
}) }
|
}) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "with a date attribute" do
|
||||||
|
before do
|
||||||
|
FactoryGirl.create(:procedure, :created_at => 45.days.ago, :updated_at => 20.days.ago)
|
||||||
|
FactoryGirl.create(:procedure, :created_at => 15.days.ago, :updated_at => 20.days.ago)
|
||||||
|
FactoryGirl.create(:procedure, :created_at => 15.days.ago, :updated_at => 10.days.ago)
|
||||||
|
end
|
||||||
|
|
||||||
|
let (:association) { Procedure.all }
|
||||||
|
|
||||||
|
subject { StatsController.new.send(:cumulative_hash, association, :updated_at) }
|
||||||
|
|
||||||
|
it { expect(subject).to eq({
|
||||||
|
20.days.ago.beginning_of_month => 2,
|
||||||
|
10.days.ago.beginning_of_month => 3
|
||||||
|
}) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -563,7 +563,7 @@ describe Users::DossiersController, type: :controller do
|
||||||
context 'when the dossier exist' do
|
context 'when the dossier exist' do
|
||||||
before { get :text_summary, params: { dossier_id: dossier.id } }
|
before { get :text_summary, params: { dossier_id: dossier.id } }
|
||||||
it 'returns the procedure name' do
|
it 'returns the procedure name' do
|
||||||
expect(JSON.parse(response.body)).to eq("textSummary" => "Dossier en brouillon répondant à la démarche #{procedure.libelle}, gérée par l'organisme #{procedure.organisation}")
|
expect(JSON.parse(response.body)).to eq("textSummary" => "Dossier en brouillon répondant à la procédure #{procedure.libelle} gérée par l'organisme #{procedure.organisation}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -57,4 +57,36 @@ describe DossierDecorator do
|
||||||
expect(subject).to eq('Refusé')
|
expect(subject).to eq('Refusé')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#url' do
|
||||||
|
context "when a gestionnaire is signed_in" do
|
||||||
|
subject { super().url(true) }
|
||||||
|
|
||||||
|
it { is_expected.to eq("/backoffice/dossiers/#{dossier.id}") }
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when a gestionnaire is not signed_in" do
|
||||||
|
context "when the dossier is in brouillon state" do
|
||||||
|
before do
|
||||||
|
dossier.state = 'draft'
|
||||||
|
dossier.save
|
||||||
|
end
|
||||||
|
|
||||||
|
subject { super().url(false) }
|
||||||
|
|
||||||
|
it { is_expected.to eq("/users/dossiers/#{dossier.id}/description") }
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the dossier is not in brouillon state" do
|
||||||
|
before do
|
||||||
|
dossier.state = 'updated'
|
||||||
|
dossier.save
|
||||||
|
end
|
||||||
|
|
||||||
|
subject { super().url(false) }
|
||||||
|
|
||||||
|
it { is_expected.to eq("/users/dossiers/#{dossier.id}/recapitulatif") }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -810,14 +810,14 @@ describe Dossier do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#text_summary" do
|
describe "#text_summary" do
|
||||||
let(:procedure) { create(:procedure, libelle: "Démarche", organisation: "Organisation") }
|
let(:procedure) { create(:procedure, libelle: "Procédure", organisation: "Organisme") }
|
||||||
|
|
||||||
context 'when the dossier has been initiated' do
|
context 'when the dossier has been initiated' do
|
||||||
let(:dossier) { create :dossier, procedure: procedure, state: 'initiated', initiated_at: "31/12/2010".to_date }
|
let(:dossier) { create :dossier, procedure: procedure, state: 'initiated', initiated_at: "31/12/2010".to_date }
|
||||||
|
|
||||||
subject { dossier.text_summary }
|
subject { dossier.text_summary }
|
||||||
|
|
||||||
it { is_expected.to eq("Dossier déposé le 31/12/2010, sur la démarche Démarche, gérée par l'organisme Organisation") }
|
it { is_expected.to eq("Dossier déposé le 31/12/2010 sur la procédure Procédure gérée par l'organisme Organisme") }
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the dossier has not been initiated' do
|
context 'when the dossier has not been initiated' do
|
||||||
|
@ -825,7 +825,7 @@ describe Dossier do
|
||||||
|
|
||||||
subject { dossier.text_summary }
|
subject { dossier.text_summary }
|
||||||
|
|
||||||
it { is_expected.to eq("Dossier en brouillon répondant à la démarche Démarche, gérée par l'organisme Organisation") }
|
it { is_expected.to eq("Dossier en brouillon répondant à la procédure Procédure gérée par l'organisme Organisme") }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ describe PreferenceListDossier do
|
||||||
describe 'organisation' do
|
describe 'organisation' do
|
||||||
subject { super()[:organisation] }
|
subject { super()[:organisation] }
|
||||||
|
|
||||||
it { expect(subject[:libelle]).to eq 'Organisation' }
|
it { expect(subject[:libelle]).to eq 'Organisme' }
|
||||||
it { expect(subject[:table]).to eq 'procedure' }
|
it { expect(subject[:table]).to eq 'procedure' }
|
||||||
it { expect(subject[:attr]).to eq 'organisation' }
|
it { expect(subject[:attr]).to eq 'organisation' }
|
||||||
it { expect(subject[:attr_decorate]).to eq 'organisation' }
|
it { expect(subject[:attr_decorate]).to eq 'organisation' }
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe 'users/description/_pieces_justificatives.html.haml', type: :view do
|
||||||
|
let!(:procedure) { create(:procedure) }
|
||||||
|
let!(:tpj1) { create(:type_de_piece_justificative,
|
||||||
|
procedure: procedure,
|
||||||
|
libelle: "Première pièce jointe",
|
||||||
|
description: "Première description",
|
||||||
|
order_place: 1,
|
||||||
|
mandatory: true
|
||||||
|
)}
|
||||||
|
let!(:tpj2) { create(:type_de_piece_justificative,
|
||||||
|
procedure: procedure,
|
||||||
|
libelle: "Seconde pièce jointe",
|
||||||
|
description: "Seconde description",
|
||||||
|
order_place: 2,
|
||||||
|
lien_demarche: "https://www.google.fr"
|
||||||
|
)}
|
||||||
|
let!(:dossier) { create(:dossier, :procedure => procedure) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
render 'users/description/pieces_justificatives.html.haml', dossier: dossier
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should render two PJ with their title, mandatory status and description' do
|
||||||
|
expect(rendered).to include("Première pièce jointe *")
|
||||||
|
expect(rendered).to include("Seconde pièce jointe")
|
||||||
|
expect(rendered.index("Première pièce jointe")).to be < rendered.index("Seconde pièce jointe")
|
||||||
|
|
||||||
|
expect(rendered).to include("Première description")
|
||||||
|
expect(rendered).to include("Seconde description")
|
||||||
|
|
||||||
|
expect(rendered).to have_selector("input[type=file]", count: 2)
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,7 +1,20 @@
|
||||||
describe 'users/description/champs/render_list_champs.html.haml', type: :view do
|
describe 'users/description/champs/render_list_champs.html.haml', type: :view do
|
||||||
let(:type_champ) { create(:type_de_champ_public, :checkbox) }
|
let(:type_champ) { create(:type_de_champ_public, :checkbox) }
|
||||||
|
|
||||||
context "with a checkbox champ with value equals nil" do
|
context "with any champ" do
|
||||||
|
let!(:champ) { create(:champ, type_de_champ: type_champ, value: nil) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
render 'users/description/champs/render_list_champs.html.haml', champs: Champ.all, order_place: 0
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should render the champ's libelle" do
|
||||||
|
expect(rendered).to have_content(champ.libelle)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with a checkbox champ" do
|
||||||
|
context "whose value equals nil" do
|
||||||
let!(:champ_checkbox_checked) { create(:champ, type_de_champ: type_champ, value: nil) }
|
let!(:champ_checkbox_checked) { create(:champ, type_de_champ: type_champ, value: nil) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
@ -13,7 +26,7 @@ describe 'users/description/champs/render_list_champs.html.haml', type: :view do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with a checkbox champ with value equals 'on'" do
|
context "whose value equals 'on'" do
|
||||||
let!(:champ_checkbox_checked) { create(:champ, type_de_champ: type_champ, value: 'on') }
|
let!(:champ_checkbox_checked) { create(:champ, type_de_champ: type_champ, value: 'on') }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
@ -24,6 +37,7 @@ describe 'users/description/champs/render_list_champs.html.haml', type: :view do
|
||||||
expect(rendered).to have_css('input[type=checkbox][checked]')
|
expect(rendered).to have_css('input[type=checkbox][checked]')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'with a dossier_link' do
|
context 'with a dossier_link' do
|
||||||
let(:type_champ) { create(:type_de_champ_public, type_champ: :dossier_link) }
|
let(:type_champ) { create(:type_de_champ_public, type_champ: :dossier_link) }
|
||||||
|
|
Loading…
Reference in a new issue