diff --git a/app/controllers/backoffice/private_formulaires_controller.rb b/app/controllers/backoffice/private_formulaires_controller.rb index 8a9283959..81a728085 100644 --- a/app/controllers/backoffice/private_formulaires_controller.rb +++ b/app/controllers/backoffice/private_formulaires_controller.rb @@ -5,7 +5,7 @@ class Backoffice::PrivateFormulairesController < ApplicationController dossier = current_gestionnaire.dossiers.find(params[:dossier_id]) unless params[:champs].nil? - champs_service_errors = ChampsService.save_formulaire dossier.champs_private, params + champs_service_errors = ChampsService.save_champs dossier.champs_private, params if champs_service_errors.empty? flash[:notice] = "Formulaire enregistré" diff --git a/app/controllers/users/description_controller.rb b/app/controllers/users/description_controller.rb index 71bc8aa29..e8d83cd20 100644 --- a/app/controllers/users/description_controller.rb +++ b/app/controllers/users/description_controller.rb @@ -34,18 +34,12 @@ class Users::DescriptionController < UsersController @champs = @dossier.ordered_champs - mandatory = true - mandatory = !(params[:submit].keys.first == 'brouillon') unless params[:submit].nil? + check_mandatory_fields = !draft_submission? - unless @dossier.update_attributes(create_params) - @dossier = @dossier.decorate - - flash.alert = @dossier.errors.full_messages.join('
').html_safe - return redirect_to users_dossier_description_path(dossier_id: @dossier.id) - end - - unless params[:champs].nil? - champs_service_errors = ChampsService.save_formulaire @dossier.champs, params, mandatory + if params[:champs] + champs_service_errors = ChampsService.save_champs @dossier.champs, + params, + check_mandatory_fields unless champs_service_errors.empty? flash.alert = (champs_service_errors.inject('') { |acc, error| acc+= error[:message]+'
' }).html_safe @@ -53,33 +47,30 @@ class Users::DescriptionController < UsersController end end - if @procedure.cerfa_flag? - unless params[:cerfa_pdf].nil? - cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: @dossier, user: current_user) - unless cerfa.save - flash.alert = cerfa.errors.full_messages.join('
').html_safe - return redirect_to users_dossier_description_path(dossier_id: @dossier.id) - end + if @procedure.cerfa_flag? && params[:cerfa_pdf] + cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: @dossier, user: current_user) + unless cerfa.save + flash.alert = cerfa.errors.full_messages.join('
').html_safe + return redirect_to users_dossier_description_path(dossier_id: @dossier.id) end end - unless (errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params)).empty? + errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params) + unless errors_upload.empty? flash.alert = errors_upload.html_safe return redirect_to users_dossier_description_path(dossier_id: @dossier.id) end - - if mandatory + if draft_submission? + flash.notice = 'Votre brouillon a bien été sauvegardé.' + redirect_to url_for(controller: :dossiers, action: :index, liste: :brouillon) + else if @dossier.draft? @dossier.initiated! NotificationMailer.send_notification(@dossier, @dossier.procedure.initiated_mail).deliver_now! end - flash.notice = 'Félicitations, votre demande a bien été enregistrée.' redirect_to url_for(controller: :recapitulatif, action: :show, dossier_id: @dossier.id) - else - flash.notice = 'Votre brouillon a bien été sauvegardé.' - redirect_to url_for(controller: :dossiers, action: :index, liste: :brouillon) end end @@ -123,6 +114,10 @@ class Users::DescriptionController < UsersController private + def draft_submission? + params[:submit] && params[:submit].keys.first == 'brouillon' + end + def check_autorisation_donnees @dossier = current_user_dossier @@ -137,9 +132,4 @@ class Users::DescriptionController < UsersController redirect_to url_for(users_dossier_path(@dossier.id)) end end - - def create_params - params.permit() - end - end diff --git a/app/models/champ.rb b/app/models/champ.rb index e4a6e820e..ce12e32a3 100644 --- a/app/models/champ.rb +++ b/app/models/champ.rb @@ -28,6 +28,10 @@ class Champ < ActiveRecord::Base same_date? num, '%M' end + def mandatory_and_blank? + mandatory? && value.blank? + end + def same_date? num, compare if type_champ == 'datetime' && !value.nil? if value.to_datetime.strftime(compare) == num diff --git a/app/services/champs_service.rb b/app/services/champs_service.rb index 04fdf9602..31b53973f 100644 --- a/app/services/champs_service.rb +++ b/app/services/champs_service.rb @@ -1,27 +1,41 @@ class ChampsService - def self.save_formulaire champs, params, check_mandatory=true - errors = Array.new + class << self + def save_champs(champs, params, check_mandatory = true) + fill_champs(champs, params) - champs.each do |champ| - champ.value = params[:champs]["'#{champ.id}'"] + champs.select(&:changed?).each(&:save) - if champ.type_champ == 'datetime' - champ.value = params[:champs]["'#{champ.id}'"]+ - ' ' + - params[:time_hour]["'#{champ.id}'"] + - ':' + - params[:time_minute]["'#{champ.id}'"] - end - - if check_mandatory - if champ.mandatory? && (champ.value.nil? || champ.value.blank?) - errors.push({message: "Le champ #{champ.libelle} doit être rempli."}) - end - end - - champ.save if champ.changed? + check_mandatory ? build_error_messages(champs) : [] end - errors + private + + def fill_champs(champs, h) + datetimes, not_datetimes = champs.partition { |c| c.type_champ == 'datetime' } + + not_datetimes.each { |c| c.value = h[:champs]["'#{c.id}'"] } + datetimes.each { |c| c.value = parse_datetime(c.id, h) } + end + + def parse_datetime(champ_id, h) + "#{h[:champs]["'#{champ_id}'"]} #{extract_hour(champ_id, h)}:#{extract_minute(champ_id, h)}" + end + + def extract_hour(champ_id, h) + h[:time_hour]["'#{champ_id}'"] + end + + def extract_minute(champ_id, h) + h[:time_minute]["'#{champ_id}'"] + end + + def build_error_messages(champs) + champs.select(&:mandatory_and_blank?) + .map { |c| build_champ_error_message(c) } + end + + def build_champ_error_message(champ) + { message: "Le champ #{champ.libelle} doit être rempli." } + end end end diff --git a/spec/models/champ_shared_example.rb b/spec/models/champ_shared_example.rb index 9922fd38d..b404154df 100644 --- a/spec/models/champ_shared_example.rb +++ b/spec/models/champ_shared_example.rb @@ -14,6 +14,33 @@ shared_examples 'champ_spec' do it { is_expected.to delegate_method(:order_place).to(:type_de_champ) } end + describe 'mandatory_and_blank?' do + let(:type_de_champ) { TypeDeChamp.new(mandatory: mandatory) } + let(:champ) { Champ.new(type_de_champ: type_de_champ, value: value) } + let(:value) { '' } + let(:mandatory) { true } + + context 'when mandatory and blank' do + it { expect(champ.mandatory_and_blank?).to be(true) } + end + + context 'when not blank' do + let(:value) { 'yop' } + it { expect(champ.mandatory_and_blank?).to be(false) } + end + + context 'when not mandatory' do + let(:mandatory) { false } + it { expect(champ.mandatory_and_blank?).to be(false) } + end + + context 'when not mandatory or blank' do + let(:value) { 'u' } + let(:mandatory) { false } + it { expect(champ.mandatory_and_blank?).to be(false) } + end + end + describe 'data_provide' do let(:champ) { create :champ } diff --git a/spec/services/champs_service_spec.rb b/spec/services/champs_service_spec.rb new file mode 100644 index 000000000..4e8ce53a1 --- /dev/null +++ b/spec/services/champs_service_spec.rb @@ -0,0 +1,49 @@ +require 'spec_helper' + +describe ChampsService do + describe 'save_champs' do + let!(:champ) { Champ.create(value: 'toto', type_de_champ: TypeDeChamp.new) } + let!(:champ_mandatory_empty) { Champ.create(type_de_champ: TypeDeChamp.new(libelle: 'mandatory', mandatory: true)) } + let!(:champ_datetime) do + champ_datetime = TypeDeChamp.new(type_champ: 'datetime') + Champ.create(type_de_champ: champ_datetime) + end + let!(:champs) { [champ, champ_mandatory_empty, champ_datetime] } + + before :each do + params_hash = { + champs: { + "'#{champ.id}'" => 'yop', + "'#{champ_datetime.id}'" => 'd' + }, + time_hour: { "'#{champ_datetime.id}'" => '12' }, + time_minute: { "'#{champ_datetime.id}'" => '24' } + } + @errors = ChampsService.save_champs(champs, params_hash, check_mandatory) + champs.each(&:reload) + end + + context 'check_mandatory is true' do + let(:check_mandatory) { true } + it 'saves the changed champ' do + expect(champ.value).to eq('yop') + end + + it 'parses and save the date' do + expect(champ_datetime.value).to eq('d 12:24') + end + + it 'adds error for the missing mandatory champ' do + expect(@errors).to match([{ message: 'Le champ mandatory doit être rempli.' }]) + end + end + + context 'check_mandatory is false' do + let(:check_mandatory) { false } + + it 'does not add errors' do + expect(@errors).to match([]) + end + end + end +end