Merge branch 'develop' into staging

This commit is contained in:
gregoirenovel 2017-05-09 15:39:58 +02:00
commit 73bd852e20
64 changed files with 490 additions and 204 deletions

1
.gitignore vendored
View file

@ -35,3 +35,4 @@ coverage/**/*
.DS_Store
.byebug_history
.env
Procfile.dev

View file

@ -1,3 +1,5 @@
exclude: 'app/assets/stylesheets/reset.scss'
linters:
BangFormat:
enabled: true

View file

@ -78,7 +78,6 @@ gem 'smart_listing'
gem 'bootstrap-wysihtml5-rails', '~> 0.3.3.8'
gem 'as_csv'
gem 'spreadsheet_architect'
gem 'apipie-rails'

View file

@ -74,10 +74,6 @@ GEM
apipie-rails (0.3.7)
json
arel (7.1.4)
as_csv (2.0.2)
actionpack (>= 3.0)
activemodel (>= 3.0)
responders
ast (2.3.0)
attr_required (1.0.1)
autoprefixer-rails (6.5.4)
@ -669,7 +665,6 @@ DEPENDENCIES
actioncable (= 5.0.0.1)
active_model_serializers
apipie-rails
as_csv
bootstrap-datepicker-rails
bootstrap-sass (~> 3.3.5)
bootstrap-wysihtml5-rails (~> 0.3.3.8)

View file

@ -1,8 +1,8 @@
# TPS - TéléProcédure Simplifiée
# TPS - Téléprocédures Simplifiées
## 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
@ -10,6 +10,11 @@ TéléProcédure Simplifiée, ou TPS pour les intimes, est une plateforme 100 %
### Tous environnements
- postgresql
- redis
### Développement
- Mailcatcher : `gem install mailcatcher`
### 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
## Lancement de l'application
redis-server
sidekiq
mailcatcher -f
rails s
## Exécution des tests (RSpec)
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
- 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

View file

@ -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);

View file

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

View file

@ -3,3 +3,7 @@ $light-blue: rgba(61, 149, 236, 0.8);
$black: #333333;
$grey: #999999;
$light-grey: #F8F8F8;
$border-grey: #CCCCCC;
$dark-red: #A94442;
$light-red: #EBCCD1;
$lighter-red: #F2DEDE;

View file

@ -12,7 +12,47 @@
// defined in the other CSS/SCSS files in this directory. It is generally better to create a new
// 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 bootstrap-datepicker3
// = require leaflet

View file

@ -0,0 +1,7 @@
@import "typography";
body {
@extend %new-type;
font-size: 16px;
line-height: 1.42857143;
}

View 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;
}

View file

@ -33,7 +33,7 @@
.header {
background-color: #003C92;
height: 40px;
min-height: 40px;
color: #FFFFFF;
font-size: 18px;
font-weight: bold;
@ -42,7 +42,6 @@
.title-no-expanse,
.action,
.count {
height: 100%;
line-height: 40px;
padding: 0px;
text-transform: uppercase;
@ -58,6 +57,11 @@
cursor: pointer;
}
.title-content {
width: calc(100% - 50px);
float: left;
}
.action {
background-color: #E45B51;
text-align: center;

View file

@ -138,3 +138,11 @@
width: 160px;
}
}
.piece-description {
display: block;
margin-top: 5px;
margin-bottom: 10px;
color: #737373;
font-weight: normal;
}

View file

@ -2,10 +2,8 @@
@import "colors";
@import "mixins";
@import "placeholders";
@import "typography";
.landing {
@extend %new-type;
background-color: #FFFFFF;
}

View 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;
}

View 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

View file

@ -1,12 +1,12 @@
@import "colors";
@import "constants";
@import "mixins";
@import "placeholders";
@import "typography";
.footer {
@extend %new-type;
@include vertical-padding(72px);
background-color: $light-grey;
border-top: 1px solid $border-grey;
}
.footer-inner-content {

View file

@ -1,15 +1,15 @@
@import "constants";
@import "colors";
@import "mixins";
@import "typography";
// FIXME: Rename when the header is generalized
.new-header {
@extend %new-type;
height: 72px;
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 {

View 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;
}

View file

@ -0,0 +1,15 @@
.pull-left {
float: left;
}
.pull-right {
float: right;
}
.clearfix {
clear: both;
}
.center {
text-align: center;
}

View file

@ -7,6 +7,7 @@ class Admin::MailTemplatesController < AdminController
def edit
@mail_template = find_the_right_mail params[:id]
@mail_template_name = params[:id]
end
def update

View file

@ -5,10 +5,10 @@ class StatsController < ApplicationController
dossiers = Dossier.where.not(:state => :draft)
@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)
@dossiers_cumulative = cumulative_hash(dossiers)
@dossiers_cumulative = cumulative_hash(dossiers, :initiated_at)
@procedures_count = procedures.count
@dossiers_count = dossiers.count
@ -16,13 +16,13 @@ class StatsController < ApplicationController
private
def thirty_days_flow_hash(association)
def thirty_days_flow_hash(association, date_attribute = :created_at)
min_date = 30.days.ago.to_date
max_date = Time.now.to_date
thirty_days_flow_hash = association
.where(:created_at => min_date..max_date)
.group("date_trunc('day', created_at)")
.where(date_attribute => min_date..max_date)
.group("date_trunc('day', #{date_attribute.to_s})")
.count
clean_hash(thirty_days_flow_hash, min_date, max_date)
@ -42,10 +42,10 @@ class StatsController < ApplicationController
h
end
def cumulative_hash(association)
def cumulative_hash(association, date_attribute = :created_at)
sum = 0
association
.group("DATE_TRUNC('month', created_at)")
.group("DATE_TRUNC('month', #{date_attribute.to_s})")
.count
.to_a
.sort{ |x, y| x[0] <=> y[0] }

View file

@ -10,5 +10,4 @@ class ChampDecorator < Draper::Decorator
def description_with_links
description.gsub(URI.regexp, '<a target="_blank" href="\0">\0</a>').html_safe if description
end
end

View file

@ -1,4 +1,6 @@
class DossierDecorator < Draper::Decorator
include Rails.application.routes.url_helpers
delegate :current_page, :per_page, :offset, :total_entries, :total_pages
delegate_all
@ -14,6 +16,16 @@ class DossierDecorator < Draper::Decorator
DossierDecorator.case_state_fr state
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
h.t("activerecord.attributes.dossier.state.#{state}")
end

View file

@ -11,7 +11,7 @@ class AdminTypesDeChampFacades
end
def active
@private ? 'Champs privés' : 'Champs'
@private ? 'Annotations privées' : 'Champs'
end
def url

View file

@ -5,26 +5,59 @@ module MailTemplateConcern
include ActionView::Helpers::UrlHelper
TAGS = {
numero_dossier: {
description: "Permet d'afficher le numéro de dossier de l'utilisateur."
},
lien_dossier: {
description: "Permet d'afficher un lien vers le dossier de l'utilisateur."
},
libelle_procedure: {
description: "Permet d'afficher le libellé de la procédure."
}
}
numero_dossier: {
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: {
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: {
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)
end
def body_for_dossier dossier
def body_for_dossier(dossier)
replace_tags(body, dossier)
end
def replace_tags string, dossier
def replace_tags(string, dossier)
TAGS.inject(string) do |acc, tag|
acc.gsub!("--#{tag.first}--", replace_tag(tag.first.to_sym, dossier)) || acc
end
@ -43,7 +76,7 @@ module MailTemplateConcern
private
def replace_tag tag, dossier
def replace_tag(tag, dossier)
case tag
when :numero_dossier
dossier.id.to_s
@ -51,6 +84,8 @@ module MailTemplateConcern
link_to users_dossier_recapitulatif_url(dossier), users_dossier_recapitulatif_url(dossier), target: '_blank'
when :libelle_procedure
dossier.procedure.libelle
when :date_de_decision
dossier.processed_at.present? ? dossier.processed_at.strftime("%d/%m/%Y") : ""
else
'--BALISE_NON_RECONNUE--'
end

View file

@ -281,18 +281,18 @@ class Dossier < ActiveRecord::Base
def text_summary
if brouillon?
parts = [
"Dossier en brouillon répondant à la démarche ",
"Dossier en brouillon répondant à la procédure ",
procedure.libelle,
", gérée par l'organisme ",
" gérée par l'organisme ",
procedure.organisation
]
else
parts = [
"Dossier déposé le ",
initiated_at.strftime("%d/%m/%Y"),
", sur la démarche ",
" sur la procédure ",
procedure.libelle,
", gérée par l'organisme ",
" gérée par l'organisme ",
procedure.organisation
]
end

View file

@ -48,7 +48,7 @@ class PreferenceListDossier < ActiveRecord::Base
{
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)
}
end

View file

@ -15,14 +15,14 @@
= f.button :submit, 'Mettre à jour', class: "btn-success"
.row
.col-md-8
.col-md-12
%table.table
%tr
%th
%th.col-md-3
Balise
%th
Description
- MailTemplateConcern::TAGS.each do |balise|
- MailTemplateConcern.tags_for_template(@mail_template_name).each do |balise|
%tr
%td.center
= "--#{balise.first}--"

View file

@ -2,7 +2,7 @@
.alert.alert-info
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
%h4
= value

View file

@ -73,7 +73,7 @@
.champs_private.col-xs-6.col-md-3
%h4.text-info
Champs privés
Annotations privées
.badge.progress-bar-info
= @facade.procedure.types_de_champ_private.size
%ul
@ -102,7 +102,7 @@
%div
= @facade.dossiers_waiting_gestionnaire_total
%h4.text-info Attente Utilisateur
%h4.text-info Attente Usager
%div
= @facade.dossiers_waiting_user_total

View file

@ -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".

View file

@ -1,6 +1,6 @@
#cgu
%h2
Condition dutilisation du service « TPS » pour téléprocédure simplifiée
Condition dutilisation du service « TPS » pour téléprocédures simplifiées
%br
%h3#editeur
Editeur
@ -44,7 +44,7 @@
%a{ :href => "https://tps.apientreprise.fr/" }
%strong tps.apientreprise.fr
%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 lexamen par plusieurs services des demandes formulées par les usagers auprès dun 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 lexamen par plusieurs services des demandes formulées par les usagers auprès dun ou organismes publics.
%br
%h3#acteurs
Acteurs de
@ -53,8 +53,8 @@
%p Les acteurs de TPS sont les suivants :
%ul
%li Le SGMAP qui héberge le service TPS, le maintien en condition opérationnelle et gère les droits daccès
%li Ladministrateur au sein dune administration donnée qui crée la démarche en ligne
%li Le ou les accompagnateurs au sein dune 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 Ladministrateur au sein dune administration donnée qui crée la procédure en ligne
%li Le ou les accompagnateurs au sein dune 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
%br
%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.
%br
%h3#data_collects
Données collectées et responsabilité des organismes publics à linitiative de démarches en ligne avec TPS.
Données collectées et responsabilité des organismes publics à linitiative 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 à lusager.
%p Les organismes publics sengagent à créer des démarches pour collecter les informations strictement nécessaires à lexamen des demandes formulées auprès des acteurs publics, dans le cadre juridique prévu par chacune des démarches.
%p Ces données sont collectées et traitées par les seuls services concernés par lexamen des demandes, et précisées dans la notice dutilisation de chaque démarche publiée par lorganisme public.
%p Les organismes publics sengagent à créer des procédures pour collecter les informations strictement nécessaires à lexamen 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 lexamen des demandes, et précisées dans la notice dutilisation de chaque procédure publiée par lorganisme public.
%br
%h3#individual_data
@ -117,7 +117,7 @@
%a{ :href => "https://www.infogreffe.fr/societes/cgu-cgv.html" } Conditions générales dutilisation des données dinfogreffe
%br
%h4 TPS fait appel à dautres services opérés par le SGMAP afin de faciliter les démarches administratives :
%h4 TPS fait appel à dautres services opérés par le SGMAP afin de faciliter les procédures administratives :
%br
%p
%strong> France CONNECT

View file

@ -6,7 +6,7 @@
%h3
La campagne de création de nouveau dossier
%br
pour cette démarche en ligne est maintenant terminée.
pour cette procédure en ligne est maintenant terminée.
%br
%p

View file

@ -7,7 +7,7 @@
%th= smart_listing.sortable 'ID', 'id'
%th= smart_listing.sortable 'Titre', 'libelle'
%th Description
%th= smart_listing.sortable 'Organisation', 'organisation'
%th= smart_listing.sortable 'Organisme', 'organisation'
- smart_listing.collection.each do |procedure|
- procedure = procedure.decorate

View file

@ -41,7 +41,7 @@
- if champ.type_champ == 'dossier_link'
- dossier = Dossier.includes(:procedure).find_by(id: champ.decorate.value)
- 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
= dossier.text_summary
- else
@ -127,7 +127,7 @@
%table.table
%thead
%th
Utilisateur
Usager
%th
Date d'envoi
%th

View file

@ -37,7 +37,7 @@
%label{ style: 'font-weight: normal;' }
= f.check_box :autorisation_donnees
= "&nbsp;".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'
.row
.col-xs-5.col-xs-5

View file

@ -1,7 +1,8 @@
#flash_message.center
- if flash.notice
.alert.alert-success
= flash.notice
- if flash.alert
.alert.alert-danger
= flash.alert.html_safe
- if flash.notice.present? || flash.alert.present?
#flash_message.center
- if flash.notice.present?
.alert.alert-success
= flash.notice
- if flash.alert.present?
.alert.alert-danger
= flash.alert.html_safe

View file

@ -1,4 +1,4 @@
.new-header
.new-header{ class: current_page?(root_path) ? nil : 'new-header-with-border' }
.header-inner-content
%img.header-logo.pull-left{ src: image_url("header/logo-tps.svg") }

View file

@ -1 +0,0 @@
#notification-alert.alert.alert-success

View file

@ -9,7 +9,7 @@
= link_to(users_dossiers_path, id: :menu_item_procedure) do
%i.fa.fa-user
&nbsp;
Utilisateur
Usager
- if gestionnaire_signed_in?
%li
= link_to(backoffice_dossiers_path) do

View file

@ -54,7 +54,6 @@
%i.fa.fa-times{ style: 'position: fixed; top: 10; right: 30; color: white;' }
= 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/google_analytics'

View file

@ -34,8 +34,8 @@
- unless @procedure.locked?
%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') }
Champs privés
.procedure-list-element{ class: ('active' if active == 'Annotations privées') }
Annotations privées
%a#onglet-inemailsfos{ :href => "#{url_for admin_procedure_mail_templates_path(@procedure)}" }
.procedure-list-element{ class: ('active' if active == 'E-mails') }

View file

@ -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" }

View file

@ -13,7 +13,7 @@
= 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 "new_application", :media => "all", "data-turbolinks-track" => true
= stylesheet_link_tag "print", :media => "print", "data-turbolinks-track" => true
%body
@ -30,7 +30,6 @@
= yield
= render :partial => "layouts/switch_devise_profile_module"
= render :partial => "layouts/notifications_alert"
= render partial: "layouts/new_footer"
= render partial: "layouts/google_analytics"

View file

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

View file

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

View file

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

View file

@ -5,7 +5,7 @@
%p.hero-tagline
%em.hero-tagline-em Dématérialisez
%br
vos démarches administratives en quelques minutes
vos procédures administratives en quelques minutes
= link_to "Demander une démo",
"mailto:#{t("dynamics.contact_email")}?subject=Demande de démo TPS",
@ -135,7 +135,7 @@
%p.cta-panel-phone-cta
ou nous appeler au 01 40 15 68 49
.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 loutil
.clearfix

View file

@ -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
@ -12,7 +12,7 @@
Cumul
%li.segmented-control-item{ :onclick => "TPS.toggleChart(event, '.flux-procedures-chart');" }
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
.chart-container
@ -41,7 +41,7 @@
:colors => ["rgba(61, 149, 236, 1)"]
.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
= number_with_delimiter(@procedures_count)

View file

@ -22,6 +22,8 @@
%tr
%th.piece-libelle
= tpj.mandatory ? tpj.libelle + ' *' : tpj.libelle
%br
.piece-description= tpj.description
%td
- unless tpj.lien_demarche.blank?

View file

@ -4,6 +4,8 @@
.col-xs-12.title
.carret-right
.carret-down
= libelle
.title-content
= libelle
.clearfix
.body
= render partial: 'users/description/champs/render_list_champs', locals: { champs: champs, order_place: order_place }

View file

@ -25,7 +25,7 @@
- when 'en_attente'
Les dossiers présents dans cette liste sont
%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.
- when 'valides'
Les dossiers présents dans cette liste ont été

View file

@ -8,4 +8,4 @@ Rails.application.config.assets.version = '1.0'
# Precompile additional assets.
# 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)

View file

@ -121,6 +121,7 @@ fr:
blank: est vide
password:
blank: ': Le mot de passe est vide'
too_short: ': Le mot de passe est trop court'
devise:
confirmations:
@ -187,7 +188,7 @@ fr:
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."
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:
abbr_day_names:

View file

@ -16,7 +16,7 @@ common: &default_settings
# 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
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:
# agent_enabled: false
@ -30,7 +30,7 @@ common: &default_settings
# If your application has other named environments, configure them here.
development:
<<: *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.
# Do not use for production or load testing.
@ -43,7 +43,7 @@ test:
staging:
<<: *default_settings
app_name: Téléprocédure Simplifiée (Staging)
app_name: Téléprocédures Simplifiées (Staging)
production:
<<: *default_settings

View file

@ -2,42 +2,86 @@ require 'spec_helper'
describe StatsController, type: :controller do
describe '#thirty_days_flow_hash' do
before do
FactoryGirl.create(:procedure, :created_at => 45.days.ago)
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
FactoryGirl.create(:procedure, :created_at => 1.day.ago)
context "without a date_attribut" do
before do
FactoryGirl.create(:procedure, :created_at => 45.days.ago)
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
FactoryGirl.create(:procedure, :created_at => 1.day.ago)
@expected_hash = {}
(30.days.ago.to_date..Time.now.to_date).each do |day|
if [15.days.ago.to_date, 1.day.ago.to_date].include?(day)
@expected_hash[day] = 1
else
@expected_hash[day] = 0
@expected_hash = {}
(30.days.ago.to_date..Time.now.to_date).each do |day|
if [15.days.ago.to_date, 1.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) }
it { expect(subject).to eq(@expected_hash) }
end
let (:association) { Procedure.all }
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)
subject { StatsController.new.send(:thirty_days_flow_hash, association) }
@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
it { expect(subject).to eq(@expected_hash) }
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
context "without a date attribute" do
before do
FactoryGirl.create(:procedure, :created_at => 45.days.ago)
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
end
let (:association) { Procedure.all }
subject { StatsController.new.send(:cumulative_hash, association) }
it { expect(subject).to eq({
45.days.ago.beginning_of_month => 1,
15.days.ago.beginning_of_month => 3
}) }
end
end
context "with a date attribute" do
before do
FactoryGirl.create(:procedure, :created_at => 45.days.ago)
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
FactoryGirl.create(:procedure, :created_at => 15.days.ago)
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) }
subject { StatsController.new.send(:cumulative_hash, association, :updated_at) }
it { expect(subject).to eq({
45.days.ago.beginning_of_month => 1,
15.days.ago.beginning_of_month => 3
20.days.ago.beginning_of_month => 2,
10.days.ago.beginning_of_month => 3
}) }
end
end

View file

@ -563,7 +563,7 @@ describe Users::DossiersController, type: :controller do
context 'when the dossier exist' do
before { get :text_summary, params: { dossier_id: dossier.id } }
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

View file

@ -57,4 +57,36 @@ describe DossierDecorator do
expect(subject).to eq('Refusé')
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

View file

@ -810,14 +810,14 @@ describe Dossier do
end
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
let(:dossier) { create :dossier, procedure: procedure, state: 'initiated', initiated_at: "31/12/2010".to_date }
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
context 'when the dossier has not been initiated' do
@ -825,7 +825,7 @@ describe Dossier do
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

View file

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

View file

@ -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

View file

@ -1,27 +1,41 @@
describe 'users/description/champs/render_list_champs.html.haml', type: :view do
let(:type_champ) { create(:type_de_champ_public, :checkbox) }
context "with a checkbox champ with value equals nil" do
let!(:champ_checkbox_checked) { create(:champ, type_de_champ: type_champ, value: nil) }
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 not render a checked checkbox' do
expect(rendered).not_to have_css('input[type=checkbox][checked]')
it "should render the champ's libelle" do
expect(rendered).to have_content(champ.libelle)
end
end
context "with a checkbox champ with value equals 'on'" do
let!(:champ_checkbox_checked) { create(:champ, type_de_champ: type_champ, value: 'on') }
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) }
before do
render 'users/description/champs/render_list_champs.html.haml', champs: Champ.all, order_place: 0
before do
render 'users/description/champs/render_list_champs.html.haml', champs: Champ.all, order_place: 0
end
it 'should not render a checked checkbox' do
expect(rendered).not_to have_css('input[type=checkbox][checked]')
end
end
it 'should render a checked checkbox' do
expect(rendered).to have_css('input[type=checkbox][checked]')
context "whose value equals 'on'" do
let!(:champ_checkbox_checked) { create(:champ, type_de_champ: type_champ, value: 'on') }
before do
render 'users/description/champs/render_list_champs.html.haml', champs: Champ.all, order_place: 0
end
it 'should render a checked checkbox' do
expect(rendered).to have_css('input[type=checkbox][checked]')
end
end
end