Add DossierController#update
This commit is contained in:
parent
cd46ee06e1
commit
1341074325
4 changed files with 155 additions and 4 deletions
|
@ -4,9 +4,9 @@ module NewUser
|
||||||
|
|
||||||
helper_method :new_demarche_url
|
helper_method :new_demarche_url
|
||||||
|
|
||||||
before_action :ensure_ownership!, except: [:index, :show, :demande, :messagerie, :brouillon, :update_brouillon, :modifier, :recherche]
|
before_action :ensure_ownership!, except: [:index, :show, :demande, :messagerie, :brouillon, :update_brouillon, :modifier, :update, :recherche]
|
||||||
before_action :ensure_ownership_or_invitation!, only: [:show, :demande, :messagerie, :brouillon, :update_brouillon, :modifier, :create_commentaire]
|
before_action :ensure_ownership_or_invitation!, only: [:show, :demande, :messagerie, :brouillon, :update_brouillon, :modifier, :update, :create_commentaire]
|
||||||
before_action :ensure_dossier_can_be_updated, only: [:update_identite, :update_brouillon, :modifier]
|
before_action :ensure_dossier_can_be_updated, only: [:update_identite, :update_brouillon, :modifier, :update]
|
||||||
before_action :forbid_invite_submission!, only: [:update_brouillon]
|
before_action :forbid_invite_submission!, only: [:update_brouillon]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
@ -127,6 +127,44 @@ module NewUser
|
||||||
@dossier = dossier_with_champs
|
@dossier = dossier_with_champs
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# FIXME: remove PiecesJustificativesService
|
||||||
|
# delegate draft save logic to champ ?
|
||||||
|
def update
|
||||||
|
@dossier = dossier_with_champs
|
||||||
|
|
||||||
|
errors = PiecesJustificativesService.upload!(@dossier, current_user, params)
|
||||||
|
|
||||||
|
if champs_params[:dossier] && !@dossier.update(champs_params[:dossier])
|
||||||
|
errors += @dossier.errors.full_messages
|
||||||
|
end
|
||||||
|
|
||||||
|
if !draft?
|
||||||
|
errors += @dossier.champs.select(&:mandatory_and_blank?)
|
||||||
|
.map { |c| "Le champ #{c.libelle.truncate(200)} doit être rempli." }
|
||||||
|
errors += PiecesJustificativesService.missing_pj_error_messages(@dossier)
|
||||||
|
end
|
||||||
|
|
||||||
|
if errors.present?
|
||||||
|
flash.now.alert = errors
|
||||||
|
render :modifier
|
||||||
|
elsif draft?
|
||||||
|
flash.now.notice = 'Votre brouillon a bien été sauvegardé.'
|
||||||
|
render :modifier
|
||||||
|
elsif @dossier.can_transition_to_en_construction?
|
||||||
|
@dossier.en_construction!
|
||||||
|
NotificationMailer.send_initiated_notification(@dossier).deliver_later
|
||||||
|
redirect_to merci_dossier_path(@dossier)
|
||||||
|
elsif current_user.owns?(dossier)
|
||||||
|
if Flipflop.new_dossier_details?
|
||||||
|
redirect_to demande_dossier_path(@dossier)
|
||||||
|
else
|
||||||
|
redirect_to users_dossier_recapitulatif_path(@dossier)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
redirect_to users_dossiers_invite_path(@dossier.invite_for_user(current_user))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def merci
|
def merci
|
||||||
@dossier = current_user.dossiers.includes(:procedure).find(params[:id])
|
@dossier = current_user.dossiers.includes(:procedure).find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,8 +3,10 @@
|
||||||
|
|
||||||
- if apercu
|
- if apercu
|
||||||
- form_options = { url: '', method: :get, html: { class: 'form', multipart: true } }
|
- form_options = { url: '', method: :get, html: { class: 'form', multipart: true } }
|
||||||
- else
|
- elsif dossier.brouillon?
|
||||||
- form_options = { url: brouillon_dossier_url(dossier), method: :patch, html: { class: 'form', multipart: true } }
|
- form_options = { url: brouillon_dossier_url(dossier), method: :patch, html: { class: 'form', multipart: true } }
|
||||||
|
- else
|
||||||
|
- form_options = { url: dossier_url(dossier), method: :patch, html: { class: 'form', multipart: true } }
|
||||||
|
|
||||||
= form_for dossier, form_options do |f|
|
= form_for dossier, form_options do |f|
|
||||||
|
|
||||||
|
|
|
@ -278,6 +278,7 @@ Rails.application.routes.draw do
|
||||||
get 'brouillon'
|
get 'brouillon'
|
||||||
patch 'brouillon', to: 'dossiers#update_brouillon'
|
patch 'brouillon', to: 'dossiers#update_brouillon'
|
||||||
get 'modifier', to: 'dossiers#modifier'
|
get 'modifier', to: 'dossiers#modifier'
|
||||||
|
patch ':id', to: 'dossiers#update'
|
||||||
get 'merci'
|
get 'merci'
|
||||||
get 'demande'
|
get 'demande'
|
||||||
get 'messagerie'
|
get 'messagerie'
|
||||||
|
|
|
@ -410,6 +410,116 @@ describe NewUser::DossiersController, type: :controller do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#update' do
|
||||||
|
before { sign_in(user) }
|
||||||
|
let!(:dossier) { create(:dossier, :en_construction, user: user) }
|
||||||
|
let(:first_champ) { dossier.champs.first }
|
||||||
|
let(:value) { 'beautiful value' }
|
||||||
|
let(:submit_payload) do
|
||||||
|
{
|
||||||
|
id: dossier.id,
|
||||||
|
dossier: {
|
||||||
|
champs_attributes: {
|
||||||
|
id: first_champ.id,
|
||||||
|
value: value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
let(:payload) { submit_payload }
|
||||||
|
|
||||||
|
subject { patch :update, params: payload }
|
||||||
|
|
||||||
|
context 'when the dossier cannot be updated by the user' do
|
||||||
|
let!(:dossier) { create(:dossier, :en_instruction, user: user) }
|
||||||
|
|
||||||
|
it 'redirects to the dossiers list' do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(response).to redirect_to(dossiers_path)
|
||||||
|
expect(flash.alert).to eq('Votre dossier ne peut plus être modifié')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when dossier can be updated by the owner' do
|
||||||
|
it 'updates the champs' do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(response).to redirect_to(users_dossier_recapitulatif_path(dossier))
|
||||||
|
expect(first_champ.reload.value).to eq('beautiful value')
|
||||||
|
expect(dossier.reload.state).to eq(Dossier.states.fetch(:en_construction))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the update fails' do
|
||||||
|
before do
|
||||||
|
expect_any_instance_of(Dossier).to receive(:save).and_return(false)
|
||||||
|
expect_any_instance_of(Dossier).to receive(:errors)
|
||||||
|
.and_return(double(full_messages: ['nop']))
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(response).to render_template(:modifier) }
|
||||||
|
it { expect(flash.alert).to eq(['nop']) }
|
||||||
|
|
||||||
|
it 'does not send an email' do
|
||||||
|
expect(NotificationMailer).not_to receive(:send_initiated_notification)
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the pj service returns an error' do
|
||||||
|
before do
|
||||||
|
expect(PiecesJustificativesService).to receive(:upload!).and_return(['nop'])
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(response).to render_template(:modifier) }
|
||||||
|
it { expect(flash.alert).to eq(['nop']) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when a mandatory champ is missing' do
|
||||||
|
let(:value) { nil }
|
||||||
|
|
||||||
|
before do
|
||||||
|
first_champ.type_de_champ.update(mandatory: true, libelle: 'l')
|
||||||
|
allow(PiecesJustificativesService).to receive(:missing_pj_error_messages).and_return(['pj'])
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(response).to render_template(:modifier) }
|
||||||
|
it { expect(flash.alert).to eq(['Le champ l doit être rempli.', 'pj']) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when dossier has no champ' do
|
||||||
|
let(:submit_payload) { { id: dossier.id } }
|
||||||
|
|
||||||
|
it 'does not raise any errors' do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(response).to redirect_to(users_dossier_recapitulatif_path(dossier))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the user has an invitation but is not the owner' do
|
||||||
|
let(:dossier) { create(:dossier) }
|
||||||
|
let!(:invite) { create(:invite, dossier: dossier, user: user, type: 'InviteUser') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
dossier.en_construction!
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(first_champ.reload.value).to eq('beautiful value') }
|
||||||
|
it { expect(dossier.reload.state).to eq(Dossier.states.fetch(:en_construction)) }
|
||||||
|
it { expect(response).to redirect_to(users_dossiers_invite_path(invite)) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#index' do
|
describe '#index' do
|
||||||
before { sign_in(user) }
|
before { sign_in(user) }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue