Merge branch 'develop' into staging

This commit is contained in:
Xavier J 2016-03-15 17:20:57 +01:00
commit 72315254b0
18 changed files with 102 additions and 36 deletions

View file

@ -19,7 +19,7 @@ class Admin::TypesDeChampController < AdminController
end end
def update_params def update_params
params.require(:procedure).permit(types_de_champ_attributes: [:libelle, :description, :order_place, :type_champ, :id]) params.require(:procedure).permit(types_de_champ_attributes: [:libelle, :description, :order_place, :type_champ, :id, :mandatory])
end end
def move_up def move_up

View file

@ -4,8 +4,7 @@ class Users::DescriptionController < UsersController
end end
def show def show
@dossier = current_user_dossier @dossier = current_user_dossier.decorate
@dossier = @dossier.decorate
@procedure = @dossier.procedure @procedure = @dossier.procedure
@champs = @dossier.ordered_champs @champs = @dossier.ordered_champs
@ -24,10 +23,10 @@ class Users::DescriptionController < UsersController
def create def create
@dossier = current_user_dossier @dossier = current_user_dossier
@procedure = @dossier.procedure @procedure = @dossier.procedure
@champs = @dossier.ordered_champs
unless @dossier.update_attributes(create_params) unless @dossier.update_attributes(create_params)
@dossier = @dossier.decorate @dossier = @dossier.decorate
@procedure = @dossier.procedure
flash.now.alert = @dossier.errors.full_messages.join('<br />').html_safe flash.now.alert = @dossier.errors.full_messages.join('<br />').html_safe
return render 'show' return render 'show'
@ -47,6 +46,12 @@ class Users::DescriptionController < UsersController
unless params[:champs].nil? unless params[:champs].nil?
@dossier.champs.each do |champ| @dossier.champs.each do |champ|
champ.value = params[:champs]["'#{champ.id}'"] champ.value = params[:champs]["'#{champ.id}'"]
if champ.mandatory? && (champ.value.nil? || champ.value.blank?)
flash.now.alert = "Le champ #{champ.libelle} doit être rempli."
return render 'show'
end
champ.save champ.save
end end
end end

View file

@ -1,5 +1,10 @@
class Champ < ActiveRecord::Base class Champ < ActiveRecord::Base
belongs_to :dossier belongs_to :dossier
belongs_to :type_de_champ belongs_to :type_de_champ
delegate :libelle, :type_champ, :order_place, to: :type_de_champ
delegate :libelle, :type_champ, :order_place, :mandatory, to: :type_de_champ
def mandatory?
mandatory
end
end end

View file

@ -1,5 +1,7 @@
class CerfaSerializer < ActiveModel::Serializer class CerfaSerializer < ActiveModel::Serializer
attributes :content_url => :url attributes :created_at,
:content_url => :url
end end

View file

@ -1,5 +1,6 @@
class PieceJustificativeSerializer < ActiveModel::Serializer class PieceJustificativeSerializer < ActiveModel::Serializer
attributes :content_url => :url attributes :created_at,
:content_url => :url
has_one :type_de_piece_justificative has_one :type_de_piece_justificative
end end

View file

@ -9,6 +9,11 @@
.form-group .form-group
%h4 Description %h4 Description
= ff.text_area :description, class: 'form-control description', placeholder: 'Description' = ff.text_area :description, class: 'form-control description', placeholder: 'Description'
.form-group
%h4 Obligatoire ?
.center
= ff.check_box :mandatory, placeholder: 'Obligatoire ?'
.form-group .form-group
= ff.hidden_field :order_place, value: ff.index = ff.hidden_field :order_place, value: ff.index
= ff.hidden_field :id = ff.hidden_field :id

View file

@ -26,11 +26,15 @@
-if champ.type_champ == 'checkbox' -if champ.type_champ == 'checkbox'
%h4{style:'margin-left:15px;'} %h4{style:'margin-left:15px;'}
= champ.libelle = champ.libelle
- if champ.mandatory?
= '*'
%input{type: 'hidden', name:"champs['#{champ.id}']", id: "champs_#{champ.id}", value: ''} %input{type: 'hidden', name:"champs['#{champ.id}']", id: "champs_#{champ.id}", value: ''}
%input{type: 'checkbox', style:'margin-left: 15px;', name:"champs['#{champ.id}']", id: "champs_#{champ.id}", checked: ('checked' if champ.value == 'on')} %input{type: 'checkbox', style:'margin-left: 15px;', name:"champs['#{champ.id}']", id: "champs_#{champ.id}", checked: ('checked' if champ.value == 'on')}
-else -else
%h4 %h4
= champ.libelle = champ.libelle
- if champ.mandatory?
= '*'
-if champ.type_champ == 'textarea' -if champ.type_champ == 'textarea'
%textarea.form-control{name:"champs['#{champ.id}']", %textarea.form-control{name:"champs['#{champ.id}']",
@ -62,7 +66,7 @@
- if @procedure.cerfa_flag - if @procedure.cerfa_flag
%tr %tr
%th{class:'col-lg-6'} %th{class:'col-lg-6'}
='Formulaire (.pdf / .doc / .docx / .xls / .xlsx)' ='Formulaire'
%td{class:'col-lg-5'} %td{class:'col-lg-5'}
-if @dossier.cerfa_available? -if @dossier.cerfa_available?

View file

@ -0,0 +1,5 @@
class AddCreatedAtToCerfa < ActiveRecord::Migration
def change
add_column :cerfas, :created_at, :datetime
end
end

View file

@ -0,0 +1,5 @@
class AddCreatedAtToPieceJustificative < ActiveRecord::Migration
def change
add_column :pieces_justificatives, :created_at, :datetime
end
end

View file

@ -0,0 +1,5 @@
class AddMandatoryToTypeDeChamps < ActiveRecord::Migration
def change
add_column :types_de_champ, :mandatory, :boolean, default: false
end
end

View file

@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160314102523) do ActiveRecord::Schema.define(version: 20160315101245) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -68,8 +68,9 @@ ActiveRecord::Schema.define(version: 20160314102523) do
end end
create_table "cerfas", force: :cascade do |t| create_table "cerfas", force: :cascade do |t|
t.string "content" t.string "content"
t.integer "dossier_id" t.integer "dossier_id"
t.datetime "created_at"
end end
add_index "cerfas", ["dossier_id"], name: "index_cerfas_on_dossier_id", using: :btree add_index "cerfas", ["dossier_id"], name: "index_cerfas_on_dossier_id", using: :btree
@ -195,9 +196,10 @@ ActiveRecord::Schema.define(version: 20160314102523) do
add_index "module_api_cartos", ["procedure_id"], name: "index_module_api_cartos_on_procedure_id", unique: true, using: :btree add_index "module_api_cartos", ["procedure_id"], name: "index_module_api_cartos_on_procedure_id", unique: true, using: :btree
create_table "pieces_justificatives", force: :cascade do |t| create_table "pieces_justificatives", force: :cascade do |t|
t.string "content" t.string "content"
t.integer "dossier_id" t.integer "dossier_id"
t.integer "type_de_piece_justificative_id" t.integer "type_de_piece_justificative_id"
t.datetime "created_at"
end end
add_index "pieces_justificatives", ["type_de_piece_justificative_id"], name: "index_pieces_justificatives_on_type_de_piece_justificative_id", using: :btree add_index "pieces_justificatives", ["type_de_piece_justificative_id"], name: "index_pieces_justificatives_on_type_de_piece_justificative_id", using: :btree
@ -242,6 +244,7 @@ ActiveRecord::Schema.define(version: 20160314102523) do
t.integer "order_place" t.integer "order_place"
t.integer "procedure_id" t.integer "procedure_id"
t.text "description" t.text "description"
t.boolean "mandatory", default: false
end end
create_table "types_de_piece_justificative", force: :cascade do |t| create_table "types_de_piece_justificative", force: :cascade do |t|

View file

@ -37,6 +37,7 @@ describe Admin::TypesDeChampController, type: :controller do
let(:description) { 'titi' } let(:description) { 'titi' }
let(:order_place) { '' } let(:order_place) { '' }
let(:types_de_champ_id) { '' } let(:types_de_champ_id) { '' }
let(:mandatory) { 'on' }
let(:procedure_params) do let(:procedure_params) do
{ types_de_champ_attributes: { types_de_champ_attributes:
@ -46,7 +47,8 @@ describe Admin::TypesDeChampController, type: :controller do
type_champ: type_champ, type_champ: type_champ,
description: description, description: description,
order_place: order_place, order_place: order_place,
id: types_de_champ_id id: types_de_champ_id,
mandatory: mandatory
} }
} }
} }
@ -67,7 +69,7 @@ describe Admin::TypesDeChampController, type: :controller do
it { expect(subject.libelle).to eq('mon libelle') } it { expect(subject.libelle).to eq('mon libelle') }
it { expect(subject.type_champ).to eq('text') } it { expect(subject.type_champ).to eq('text') }
it { expect(subject.description).to eq('titi') } it { expect(subject.description).to eq('titi') }
# it { expect(subject.order_place).to eq('0') } it { expect(subject.mandatory).to be_truthy }
end end
context 'when type_de_champ already exist' do context 'when type_de_champ already exist' do
@ -78,6 +80,7 @@ describe Admin::TypesDeChampController, type: :controller do
let(:type_champ) { 'text' } let(:type_champ) { 'text' }
let(:description) { 'citrouille' } let(:description) { 'citrouille' }
let(:order_place) { '0' } let(:order_place) { '0' }
let(:mandatory) { 'on' }
before do before do
request request
procedure.reload procedure.reload
@ -86,7 +89,8 @@ describe Admin::TypesDeChampController, type: :controller do
it { expect(subject.libelle).to eq('toto') } it { expect(subject.libelle).to eq('toto') }
it { expect(subject.type_champ).to eq('text') } it { expect(subject.type_champ).to eq('text') }
it { expect(subject.description).to eq('citrouille') } it { expect(subject.description).to eq('citrouille') }
# it { expect(subject.order_place).to eq(0) } it { expect(subject.order_place).to eq(0) }
it { expect(subject.order_place).to be_truthy }
end end
end end
context 'when procedure is not found' do context 'when procedure is not found' do

View file

@ -172,6 +172,7 @@ describe API::V1::DossiersController do
subject { super().first } subject { super().first }
it { expect(subject.keys.include?(:url)).to be_truthy } it { expect(subject.keys.include?(:url)).to be_truthy }
it { expect(subject[:created_at]).not_to be_nil }
it { expect(subject.keys.include?(:type_de_piece_justificative)).to be_truthy } it { expect(subject.keys.include?(:type_de_piece_justificative)).to be_truthy }
describe 'type de piece justificative' do describe 'type de piece justificative' do
@ -242,6 +243,7 @@ describe API::V1::DossiersController do
subject { super()[:cerfa] } subject { super()[:cerfa] }
it { expect(subject[:created_at]).not_to be_nil }
it { expect(subject[:url]).to match /^http:\/\/.*downloads.*_CERFA\.pdf$/ } it { expect(subject[:url]).to match /^http:\/\/.*downloads.*_CERFA\.pdf$/ }
end end

View file

@ -4,7 +4,7 @@ describe Users::DescriptionController, type: :controller do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:procedure) { create(:procedure, :with_two_type_de_piece_justificative, :with_type_de_champ, cerfa_flag: true) } let(:procedure) { create(:procedure, :with_two_type_de_piece_justificative, :with_type_de_champ, cerfa_flag: true) }
let!(:dossier) { create(:dossier, procedure: procedure, user: user) } let(:dossier) { create(:dossier, procedure: procedure, user: user) }
let(:dossier_id) { dossier.id } let(:dossier_id) { dossier.id }
let(:bad_dossier_id) { Dossier.count + 10000 } let(:bad_dossier_id) { Dossier.count + 10000 }
@ -103,9 +103,9 @@ describe Users::DescriptionController, type: :controller do
context 'Attribut(s) manquant(s)' do context 'Attribut(s) manquant(s)' do
subject { subject {
post :create, post :create,
dossier_id: dossier_id, dossier_id: dossier_id,
nom_projet: nom_projet, nom_projet: nom_projet,
description: description description: description
} }
before { subject } before { subject }
@ -126,9 +126,9 @@ describe Users::DescriptionController, type: :controller do
context 'Sauvegarde du CERFA PDF' do context 'Sauvegarde du CERFA PDF' do
before do before do
post :create, dossier_id: dossier_id, post :create, dossier_id: dossier_id,
nom_projet: nom_projet, nom_projet: nom_projet,
description: description, description: description,
cerfa_pdf: cerfa_pdf cerfa_pdf: cerfa_pdf
dossier.reload dossier.reload
end end
@ -164,11 +164,11 @@ describe Users::DescriptionController, type: :controller do
context 'Quand la procédure n\'accepte pas les CERFA' do context 'Quand la procédure n\'accepte pas les CERFA' do
context 'Sauvegarde du CERFA PDF' do context 'Sauvegarde du CERFA PDF' do
let!(:procedure) { create(:procedure) } let!(:procedure) { create(:procedure) }
before do before do
post :create, dossier_id: dossier_id, post :create, dossier_id: dossier_id,
nom_projet: nom_projet, nom_projet: nom_projet,
description: description, description: description,
cerfa_pdf: cerfa_pdf cerfa_pdf: cerfa_pdf
dossier.reload dossier.reload
end end
@ -178,7 +178,7 @@ describe Users::DescriptionController, type: :controller do
end end
end end
context 'Sauvegarde des champs' do describe 'Sauvegarde des champs' do
let(:champs_dossier) { dossier.champs } let(:champs_dossier) { dossier.champs }
let(:dossier_champs_first) { 'test value' } let(:dossier_champs_first) { 'test value' }
@ -194,22 +194,31 @@ describe Users::DescriptionController, type: :controller do
end end
it { expect(dossier.champs.first.value).to eq(dossier_champs_first) } it { expect(dossier.champs.first.value).to eq(dossier_champs_first) }
it { expect(response).to redirect_to users_dossier_recapitulatif_path }
context 'when champs value is empty' do context 'when champs value is empty' do
let(:dossier_champs_first) { 'test value' } let(:dossier_champs_first) { '' }
it { expect(dossier.champs.first.value).to eq(dossier_champs_first) } it { expect(dossier.champs.first.value).to eq(dossier_champs_first) }
it { expect(response).to redirect_to users_dossier_recapitulatif_path }
context 'when champs is mandatory' do
let(:procedure) { create(:procedure, :with_two_type_de_piece_justificative, :with_type_de_champ_mandatory, cerfa_flag: true) }
it { expect(response).not_to redirect_to users_dossier_recapitulatif_path }
it { expect(flash[:alert]).to be_present }
end
end end
end end
context 'Sauvegarde des pièces justificatives' do context 'Sauvegarde des pièces justificatives' do
let(:all_pj_type){ dossier.procedure.type_de_piece_justificative_ids } let(:all_pj_type) { dossier.procedure.type_de_piece_justificative_ids }
before do before do
post :create, {dossier_id: dossier_id, post :create, {dossier_id: dossier_id,
nom_projet: nom_projet, nom_projet: nom_projet,
description: description, description: description,
'piece_justificative_'+all_pj_type[0].to_s => piece_justificative_0, 'piece_justificative_'+all_pj_type[0].to_s => piece_justificative_0,
'piece_justificative_'+all_pj_type[1].to_s => piece_justificative_1} 'piece_justificative_'+all_pj_type[1].to_s => piece_justificative_1}
dossier.reload dossier.reload
end end

View file

@ -27,6 +27,14 @@ FactoryGirl.define do
end end
end end
trait :with_type_de_champ_mandatory do
after(:build) do |procedure, _evaluator|
type_de_champ = create(:type_de_champ, mandatory: true)
procedure.types_de_champ << type_de_champ
end
end
trait :with_two_type_de_piece_justificative do trait :with_two_type_de_piece_justificative do
after(:build) do |procedure, _evaluator| after(:build) do |procedure, _evaluator|
rib = create(:type_de_piece_justificative, :rib) rib = create(:type_de_piece_justificative, :rib)

View file

@ -4,5 +4,6 @@ FactoryGirl.define do
description 'description de votre projet' description 'description de votre projet'
type_champ 'textarea' type_champ 'textarea'
order_place 1 order_place 1
mandatory false
end end
end end

View file

@ -3,6 +3,7 @@ require 'spec_helper'
describe Cerfa do describe Cerfa do
describe 'database columns' do describe 'database columns' do
it { is_expected.to have_db_column(:content) } it { is_expected.to have_db_column(:content) }
it { is_expected.to have_db_column(:created_at) }
end end
describe 'associations' do describe 'associations' do

View file

@ -3,6 +3,7 @@ require 'spec_helper'
describe PieceJustificative do describe PieceJustificative do
describe 'database columns' do describe 'database columns' do
it { is_expected.to have_db_column(:content) } it { is_expected.to have_db_column(:content) }
it { is_expected.to have_db_column(:created_at) }
end end
describe 'associations' do describe 'associations' do