Merge pull request #11067 from tchak/refactor-dossier-controller
refactor(dossier): cleanup user controller
This commit is contained in:
commit
755a526d12
25 changed files with 139 additions and 158 deletions
|
@ -12,14 +12,13 @@ class Attachment::EditComponent < ApplicationComponent
|
||||||
|
|
||||||
EXTENSIONS_ORDER = ['jpeg', 'png', 'pdf', 'zip'].freeze
|
EXTENSIONS_ORDER = ['jpeg', 'png', 'pdf', 'zip'].freeze
|
||||||
|
|
||||||
def initialize(champ: nil, auto_attach_url: nil, attached_file:, direct_upload: true, index: 0, as_multiple: false, view_as: :link, user_can_destroy: true, user_can_replace: false, attachments: [], max: nil, **kwargs)
|
def initialize(champ: nil, auto_attach_url: nil, attached_file:, direct_upload: true, index: 0, as_multiple: false, view_as: :link, user_can_destroy: true, attachments: [], max: nil, **kwargs)
|
||||||
@champ = champ
|
@champ = champ
|
||||||
@attached_file = attached_file
|
@attached_file = attached_file
|
||||||
@direct_upload = direct_upload
|
@direct_upload = direct_upload
|
||||||
@index = index
|
@index = index
|
||||||
@view_as = view_as
|
@view_as = view_as
|
||||||
@user_can_destroy = user_can_destroy
|
@user_can_destroy = user_can_destroy
|
||||||
@user_can_replace = user_can_replace
|
|
||||||
@as_multiple = as_multiple
|
@as_multiple = as_multiple
|
||||||
@auto_attach_url = auto_attach_url
|
@auto_attach_url = auto_attach_url
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ class Attachment::MultipleComponent < ApplicationComponent
|
||||||
|
|
||||||
delegate :count, :empty?, to: :attachments, prefix: true
|
delegate :count, :empty?, to: :attachments, prefix: true
|
||||||
|
|
||||||
def initialize(champ: nil, attached_file:, form_object_name: nil, view_as: :link, user_can_destroy: true, user_can_replace: false, max: nil)
|
def initialize(champ: nil, attached_file:, form_object_name: nil, view_as: :link, user_can_destroy: true, max: nil)
|
||||||
@champ = champ
|
@champ = champ
|
||||||
@attached_file = attached_file
|
@attached_file = attached_file
|
||||||
@form_object_name = form_object_name
|
@form_object_name = form_object_name
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Dossiers::EditFooterComponent < ApplicationComponent
|
class Dossiers::EditFooterComponent < ApplicationComponent
|
||||||
delegate :can_passer_en_construction?, to: :@dossier
|
delegate :can_passer_en_construction?, :can_transition_to_en_construction?, :forked_with_changes?, to: :@dossier
|
||||||
|
|
||||||
def initialize(dossier:, annotation:)
|
def initialize(dossier:, annotation:)
|
||||||
@dossier = dossier
|
@dossier = dossier
|
||||||
|
@ -18,7 +18,43 @@ class Dossiers::EditFooterComponent < ApplicationComponent
|
||||||
@annotation.present?
|
@annotation.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def disabled_submit_buttons_options
|
def can_submit?
|
||||||
|
can_submit_draft? || can_submit_en_construction?
|
||||||
|
end
|
||||||
|
|
||||||
|
def can_submit_draft?
|
||||||
|
!annotation? && can_transition_to_en_construction?
|
||||||
|
end
|
||||||
|
|
||||||
|
def can_submit_en_construction?
|
||||||
|
forked_with_changes?
|
||||||
|
end
|
||||||
|
|
||||||
|
def submit_button_label
|
||||||
|
if can_submit_draft?
|
||||||
|
t('.submit')
|
||||||
|
else
|
||||||
|
t('.submit_changes')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def submit_button_path
|
||||||
|
if can_submit_draft?
|
||||||
|
brouillon_dossier_path(@dossier)
|
||||||
|
else
|
||||||
|
modifier_dossier_path(@dossier.editing_fork_origin)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def submit_button_options
|
||||||
|
if can_submit_draft?
|
||||||
|
submit_draft_button_options
|
||||||
|
else
|
||||||
|
submit_en_construction_button_options
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def disabled_submit_button_options
|
||||||
{
|
{
|
||||||
class: 'fr-text--sm fr-mb-0 fr-mr-2w',
|
class: 'fr-text--sm fr-mb-0 fr-mr-2w',
|
||||||
data: { 'fr-opened': "true" },
|
data: { 'fr-opened': "true" },
|
||||||
|
|
|
@ -2,16 +2,10 @@
|
||||||
.send-dossier-actions-bar
|
.send-dossier-actions-bar
|
||||||
= render Dossiers::AutosaveFooterComponent.new(dossier: @dossier, annotation: annotation?)
|
= render Dossiers::AutosaveFooterComponent.new(dossier: @dossier, annotation: annotation?)
|
||||||
|
|
||||||
- if !annotation? && @dossier.can_transition_to_en_construction?
|
- if can_submit?
|
||||||
- if !can_passer_en_construction?
|
- if !can_passer_en_construction?
|
||||||
= link_to t('.submit_disabled'), "#", disabled_submit_buttons_options
|
= link_to t('.submit_disabled'), "#", disabled_submit_button_options
|
||||||
= button_to t('.submit'), brouillon_dossier_url(@dossier), submit_draft_button_options
|
= button_to submit_button_label, submit_button_path, submit_button_options
|
||||||
|
|
||||||
- if @dossier.forked_with_changes?
|
|
||||||
- if !can_passer_en_construction?
|
|
||||||
= link_to t('.submit_disabled'), "#", disabled_submit_buttons_options
|
|
||||||
= button_to t('.submit_changes'), modifier_dossier_url(@dossier.editing_fork_origin), submit_en_construction_button_options
|
|
||||||
|
|
||||||
|
|
||||||
- if @dossier.brouillon? && !owner?
|
- if @dossier.brouillon? && !owner?
|
||||||
.fr-pb-2w.invite-cannot-submit
|
.fr-pb-2w.invite-cannot-submit
|
||||||
|
@ -19,7 +13,5 @@
|
||||||
- c.with_body do
|
- c.with_body do
|
||||||
%p.fr-pb-0= t('.invite_notice').html_safe
|
%p.fr-pb-0= t('.invite_notice').html_safe
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- if !annotation?
|
- if !annotation?
|
||||||
= render partial: "shared/dossiers/submit_is_over", locals: { dossier: @dossier }
|
= render partial: "shared/dossiers/submit_is_over", locals: { dossier: @dossier }
|
||||||
|
|
|
@ -13,10 +13,6 @@ class EditableChamp::PieceJustificativeComponent < EditableChamp::EditableChampB
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_can_destroy?
|
|
||||||
!@champ.mandatory? || @champ.dossier.brouillon?
|
|
||||||
end
|
|
||||||
|
|
||||||
def max
|
def max
|
||||||
[true, nil].include?(@champ.procedure&.piece_justificative_multiple?) ? Attachment::MultipleComponent::DEFAULT_MAX_ATTACHMENTS : 1
|
[true, nil].include?(@champ.procedure&.piece_justificative_multiple?) ? Attachment::MultipleComponent::DEFAULT_MAX_ATTACHMENTS : 1
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
= render Attachment::MultipleComponent.new(champ: @champ, attached_file: @champ.piece_justificative_file, form_object_name: @form.object_name, view_as:, user_can_destroy: user_can_destroy?, max:) do |c|
|
= render Attachment::MultipleComponent.new(champ: @champ, attached_file: @champ.piece_justificative_file, form_object_name: @form.object_name, view_as:, max:) do |c|
|
||||||
- if @champ.type_de_champ.piece_justificative_template&.attached?
|
- if @champ.type_de_champ.piece_justificative_template&.attached?
|
||||||
- c.with_template do
|
- c.with_template do
|
||||||
= render partial: "shared/piece_justificative_template", locals: { champ: @champ }
|
= render partial: "shared/piece_justificative_template", locals: { champ: @champ }
|
||||||
|
|
|
@ -4,8 +4,4 @@ class EditableChamp::TitreIdentiteComponent < EditableChamp::EditableChampBaseCo
|
||||||
def dsfr_input_classname
|
def dsfr_input_classname
|
||||||
'fr-input'
|
'fr-input'
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_can_destroy?
|
|
||||||
!@champ.mandatory? || @champ.dossier.brouillon?
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
- if @champ.type_de_champ.piece_justificative_template&.attached?
|
- if @champ.type_de_champ.piece_justificative_template&.attached?
|
||||||
= render partial: "shared/piece_justificative_template", locals: { champ: @champ }
|
= render partial: "shared/piece_justificative_template", locals: { champ: @champ }
|
||||||
= render Attachment::EditComponent.new(champ: @form.object, attached_file: @champ.piece_justificative_file, attachment: @champ.piece_justificative_file[0], form_object_name: @form.object_name,
|
= render Attachment::EditComponent.new(champ: @form.object, attached_file: @champ.piece_justificative_file, attachment: @champ.piece_justificative_file[0], form_object_name: @form.object_name)
|
||||||
user_can_destroy: user_can_destroy?)
|
|
||||||
|
|
|
@ -30,8 +30,14 @@ class Champs::PieceJustificativeController < Champs::ChampController
|
||||||
save_succeed = @champ.save
|
save_succeed = @champ.save
|
||||||
end
|
end
|
||||||
|
|
||||||
@champ.dossier.update(last_champ_updated_at: Time.zone.now.utc) if save_succeed
|
if save_succeed && dossier.brouillon?
|
||||||
|
dossier.touch(:last_champ_updated_at, :last_champ_piece_jointe_updated_at)
|
||||||
|
end
|
||||||
|
|
||||||
save_succeed
|
save_succeed
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def dossier
|
||||||
|
@champ.dossier
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -57,7 +57,7 @@ module CreateAvisConcern
|
||||||
persisted, failed = create_results.partition(&:persisted?)
|
persisted, failed = create_results.partition(&:persisted?)
|
||||||
|
|
||||||
if persisted.any?
|
if persisted.any?
|
||||||
dossier.update!(last_avis_updated_at: Time.zone.now)
|
dossier.touch(:last_avis_updated_at)
|
||||||
sent_emails_addresses = []
|
sent_emails_addresses = []
|
||||||
persisted.each do |avis|
|
persisted.each do |avis|
|
||||||
avis.dossier.demander_un_avis!(avis)
|
avis.dossier.demander_un_avis!(avis)
|
||||||
|
|
|
@ -250,7 +250,7 @@ module Instructeurs
|
||||||
|
|
||||||
if commentaire.valid?
|
if commentaire.valid?
|
||||||
dossier.flag_as_pending_correction!(commentaire, params[:reason].presence)
|
dossier.flag_as_pending_correction!(commentaire, params[:reason].presence)
|
||||||
dossier.update!(last_commentaire_updated_at: Time.zone.now)
|
dossier.touch(:last_commentaire_updated_at)
|
||||||
current_instructeur.follow(dossier)
|
current_instructeur.follow(dossier)
|
||||||
|
|
||||||
flash.notice = "Dossier marqué comme en attente de correction."
|
flash.notice = "Dossier marqué comme en attente de correction."
|
||||||
|
@ -275,7 +275,7 @@ module Instructeurs
|
||||||
@commentaire = CommentaireService.create(current_instructeur, dossier, commentaire_params)
|
@commentaire = CommentaireService.create(current_instructeur, dossier, commentaire_params)
|
||||||
|
|
||||||
if @commentaire.errors.empty?
|
if @commentaire.errors.empty?
|
||||||
@commentaire.dossier.update!(last_commentaire_updated_at: Time.zone.now)
|
@commentaire.dossier.touch(:last_commentaire_updated_at)
|
||||||
current_instructeur.follow(dossier)
|
current_instructeur.follow(dossier)
|
||||||
flash.notice = "Message envoyé"
|
flash.notice = "Message envoyé"
|
||||||
redirect_to messagerie_instructeur_dossier_path(procedure, dossier)
|
redirect_to messagerie_instructeur_dossier_path(procedure, dossier)
|
||||||
|
@ -300,7 +300,7 @@ module Instructeurs
|
||||||
def update_annotations
|
def update_annotations
|
||||||
dossier_with_champs.update_champs_attributes(champs_private_attributes_params, :private, updated_by: current_user.email)
|
dossier_with_champs.update_champs_attributes(champs_private_attributes_params, :private, updated_by: current_user.email)
|
||||||
if dossier.champs.any?(&:changed_for_autosave?)
|
if dossier.champs.any?(&:changed_for_autosave?)
|
||||||
dossier.last_champ_private_updated_at = Time.zone.now
|
dossier.touch(:last_champ_private_updated_at)
|
||||||
end
|
end
|
||||||
|
|
||||||
dossier.save(context: :champs_private_value)
|
dossier.save(context: :champs_private_value)
|
||||||
|
|
|
@ -237,7 +237,7 @@ module Instructeurs
|
||||||
dossiers.each do |dossier|
|
dossiers.each do |dossier|
|
||||||
commentaire = CommentaireService.create(current_instructeur, dossier, bulk_message_params.except(:targets))
|
commentaire = CommentaireService.create(current_instructeur, dossier, bulk_message_params.except(:targets))
|
||||||
if commentaire.errors.empty?
|
if commentaire.errors.empty?
|
||||||
commentaire.dossier.update!(last_commentaire_updated_at: Time.zone.now)
|
commentaire.dossier.touch(:last_commentaire_updated_at)
|
||||||
else
|
else
|
||||||
errors << dossier.id
|
errors << dossier.id
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,11 +9,11 @@ module Users
|
||||||
layout 'procedure_context', only: [:identite, :update_identite, :siret, :update_siret]
|
layout 'procedure_context', only: [:identite, :update_identite, :siret, :update_siret]
|
||||||
|
|
||||||
ACTIONS_ALLOWED_TO_ANY_USER = [:index, :new, :transferer_all, :deleted_dossiers]
|
ACTIONS_ALLOWED_TO_ANY_USER = [:index, :new, :transferer_all, :deleted_dossiers]
|
||||||
ACTIONS_ALLOWED_TO_OWNER_OR_INVITE = [:show, :destroy, :demande, :messagerie, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :modifier_legacy, :update, :create_commentaire, :papertrail, :restore, :champ]
|
ACTIONS_ALLOWED_TO_OWNER_OR_INVITE = [:show, :destroy, :demande, :messagerie, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :update, :create_commentaire, :papertrail, :restore, :champ]
|
||||||
|
|
||||||
before_action :ensure_ownership!, except: ACTIONS_ALLOWED_TO_ANY_USER + ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
before_action :ensure_ownership!, except: ACTIONS_ALLOWED_TO_ANY_USER + ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
||||||
before_action :ensure_ownership_or_invitation!, only: ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
before_action :ensure_ownership_or_invitation!, only: ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
||||||
before_action :ensure_dossier_can_be_updated, only: [:update_identite, :update_siret, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :modifier_legacy, :update, :champ]
|
before_action :ensure_dossier_can_be_updated, only: [:update_identite, :update_siret, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :update, :champ]
|
||||||
before_action :ensure_dossier_can_be_filled, only: [:brouillon, :modifier, :submit_brouillon, :submit_en_construction, :update]
|
before_action :ensure_dossier_can_be_filled, only: [:brouillon, :modifier, :submit_brouillon, :submit_en_construction, :update]
|
||||||
before_action :ensure_dossier_can_be_viewed, only: [:show]
|
before_action :ensure_dossier_can_be_viewed, only: [:show]
|
||||||
before_action :forbid_invite_submission!, only: [:submit_brouillon]
|
before_action :forbid_invite_submission!, only: [:submit_brouillon]
|
||||||
|
@ -233,17 +233,9 @@ module Users
|
||||||
|
|
||||||
if @dossier.errors.blank? && @dossier.can_passer_en_construction?
|
if @dossier.errors.blank? && @dossier.can_passer_en_construction?
|
||||||
@dossier.passer_en_construction!
|
@dossier.passer_en_construction!
|
||||||
@dossier.process_declarative!
|
|
||||||
@dossier.process_sva_svr!
|
|
||||||
@dossier.groupe_instructeur.instructeurs.with_instant_email_dossier_notifications.each do |instructeur|
|
|
||||||
DossierMailer.notify_new_dossier_depose_to_instructeur(@dossier, instructeur.email).deliver_later
|
|
||||||
end
|
|
||||||
redirect_to merci_dossier_path(@dossier)
|
redirect_to merci_dossier_path(@dossier)
|
||||||
else
|
else
|
||||||
respond_to do |format|
|
render :brouillon
|
||||||
format.html { render :brouillon }
|
|
||||||
format.turbo_stream
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -261,17 +253,7 @@ module Users
|
||||||
|
|
||||||
def modifier
|
def modifier
|
||||||
@dossier = dossier_with_champs
|
@dossier = dossier_with_champs
|
||||||
end
|
@dossier_for_editing = dossier.owner_editing_fork
|
||||||
|
|
||||||
# Transition to en_construction forks,
|
|
||||||
# so users editing en_construction dossiers won't completely break their changes.
|
|
||||||
# TODO: remove me after fork en_construction feature deploy (PR #8790)
|
|
||||||
def modifier_legacy
|
|
||||||
respond_to do |format|
|
|
||||||
format.turbo_stream do
|
|
||||||
flash.alert = "Une mise à jour de cette page est nécessaire pour poursuivre, veuillez la recharger (touche F5). Attention: le dernier champ modifié n’a pas été sauvegardé, vous devrez le ressaisir."
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def submit_en_construction
|
def submit_en_construction
|
||||||
|
@ -284,29 +266,21 @@ module Users
|
||||||
|
|
||||||
submit_dossier_and_compute_errors
|
submit_dossier_and_compute_errors
|
||||||
|
|
||||||
if @dossier.errors.blank? && @dossier.can_passer_en_construction?
|
if dossier.errors.blank? && dossier.can_passer_en_construction?
|
||||||
editing_fork_origin.merge_fork(@dossier)
|
editing_fork_origin.merge_fork(dossier)
|
||||||
editing_fork_origin.submit_en_construction!
|
editing_fork_origin.submit_en_construction!
|
||||||
|
|
||||||
redirect_to dossier_path(editing_fork_origin)
|
redirect_to dossier_path(editing_fork_origin)
|
||||||
else
|
else
|
||||||
respond_to do |format|
|
@dossier_for_editing = dossier
|
||||||
format.html do
|
@dossier = editing_fork_origin
|
||||||
render :modifier
|
render :modifier
|
||||||
end
|
|
||||||
|
|
||||||
format.turbo_stream do
|
|
||||||
@to_show, @to_hide, @to_update = champs_to_turbo_update(champs_public_attributes_params, dossier.champs.filter(&:public?))
|
|
||||||
render :update, layout: false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@dossier = dossier.en_construction? ? dossier.find_editing_fork(dossier.user) : dossier
|
@dossier = dossier.en_construction? ? dossier.find_editing_fork(dossier.user) : dossier
|
||||||
@dossier = dossier_with_champs(pj_template: false)
|
@dossier = dossier_with_champs(pj_template: false)
|
||||||
@can_passer_en_construction_was, @can_passer_en_construction_is = @dossier.track_can_passer_en_construction do
|
@can_passer_en_construction_was, @can_passer_en_construction_is = dossier.track_can_passer_en_construction do
|
||||||
update_dossier_and_compute_errors
|
update_dossier_and_compute_errors
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -324,8 +298,8 @@ module Users
|
||||||
|
|
||||||
def champ
|
def champ
|
||||||
@dossier = dossier_with_champs(pj_template: false)
|
@dossier = dossier_with_champs(pj_template: false)
|
||||||
type_de_champ = @dossier.find_type_de_champ_by_stable_id(params[:stable_id], :public)
|
type_de_champ = dossier.find_type_de_champ_by_stable_id(params[:stable_id], :public)
|
||||||
champ = @dossier.project_champ(type_de_champ, params[:row_id])
|
champ = dossier.project_champ(type_de_champ, params[:row_id])
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.turbo_stream do
|
format.turbo_stream do
|
||||||
|
@ -559,36 +533,34 @@ module Users
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_dossier_and_compute_errors
|
def update_dossier_and_compute_errors
|
||||||
@dossier.update_champs_attributes(champs_public_attributes_params, :public, updated_by: current_user.email)
|
dossier.update_champs_attributes(champs_public_attributes_params, :public, updated_by: current_user.email)
|
||||||
updated_champs = @dossier.champs.filter(&:changed_for_autosave?)
|
updated_champs = dossier.champs.filter(&:changed_for_autosave?)
|
||||||
if updated_champs.present?
|
|
||||||
@dossier.last_champ_updated_at = Time.zone.now
|
|
||||||
end
|
|
||||||
|
|
||||||
# We save the dossier without validating fields, and if it is successful and the client
|
# We save the dossier without validating fields, and if it is successful and the client
|
||||||
# requests it, we ask for field validation errors.
|
# requests it, we ask for field validation errors.
|
||||||
if @dossier.save
|
if dossier.save
|
||||||
if updated_champs.any?(&:used_by_routing_rules?)
|
if dossier.brouillon? && updated_champs.present?
|
||||||
@update_contact_information = true
|
dossier.touch(:last_champ_updated_at)
|
||||||
RoutingEngine.compute(@dossier)
|
if updated_champs.any?(&:used_by_routing_rules?)
|
||||||
|
@update_contact_information = true
|
||||||
|
RoutingEngine.compute(dossier)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if params[:validate].present?
|
if params[:validate].present?
|
||||||
@dossier.valid?(:champs_public_value)
|
dossier.valid?(:champs_public_value)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@dossier.errors
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def submit_dossier_and_compute_errors
|
def submit_dossier_and_compute_errors
|
||||||
@dossier.validate(:champs_public_value)
|
dossier.validate(:champs_public_value)
|
||||||
@dossier.check_mandatory_and_visible_champs
|
dossier.check_mandatory_and_visible_champs
|
||||||
|
|
||||||
if @dossier.editing_fork_origin&.pending_correction?
|
if dossier.editing_fork_origin&.pending_correction?
|
||||||
@dossier.editing_fork_origin.validate(:champs_public_value)
|
dossier.editing_fork_origin.validate(:champs_public_value)
|
||||||
@dossier.editing_fork_origin.errors.where(:pending_correction).each do |error|
|
dossier.editing_fork_origin.errors.where(:pending_correction).each do |error|
|
||||||
@dossier.errors.import(error)
|
dossier.errors.import(error)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -26,12 +26,6 @@ module DossierCloneConcern
|
||||||
find_or_create_editing_fork(user).tap { DossierPreloader.load_one(_1) }
|
find_or_create_editing_fork(user).tap { DossierPreloader.load_one(_1) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def reset_editing_fork!
|
|
||||||
if editing_fork? && forked_with_changes?
|
|
||||||
destroy_editing_fork!
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy_editing_fork!
|
def destroy_editing_fork!
|
||||||
if editing_fork?
|
if editing_fork?
|
||||||
update!(hidden_by_administration_at: Time.current, hidden_by_reason: :stale_fork)
|
update!(hidden_by_administration_at: Time.current, hidden_by_reason: :stale_fork)
|
||||||
|
@ -43,6 +37,18 @@ module DossierCloneConcern
|
||||||
editing_fork_origin_id.present?
|
editing_fork_origin_id.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def forked_with_changes?
|
||||||
|
if forked_diff.present?
|
||||||
|
forked_diff.values.any?(&:present?) || forked_groupe_instructeur_changed?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def champ_forked_with_changes?(champ)
|
||||||
|
if forked_diff.present?
|
||||||
|
forked_diff.values.any? { |champs| champs.any? { _1.public_id == champ.public_id } }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def make_diff(editing_fork)
|
def make_diff(editing_fork)
|
||||||
origin_champs_index = project_champs_public_all.index_by(&:public_id)
|
origin_champs_index = project_champs_public_all.index_by(&:public_id)
|
||||||
forked_champs_index = editing_fork.project_champs_public_all.index_by(&:public_id)
|
forked_champs_index = editing_fork.project_champs_public_all.index_by(&:public_id)
|
||||||
|
@ -126,18 +132,6 @@ module DossierCloneConcern
|
||||||
cloned_dossier.reload
|
cloned_dossier.reload
|
||||||
end
|
end
|
||||||
|
|
||||||
def forked_with_changes?
|
|
||||||
if forked_diff.present?
|
|
||||||
forked_diff.values.any?(&:present?) || forked_groupe_instructeur_changed?
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def champ_forked_with_changes?(champ)
|
|
||||||
if forked_diff.present?
|
|
||||||
forked_diff.values.any? { _1.include?(champ) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def forked_diff
|
def forked_diff
|
||||||
|
|
|
@ -3,6 +3,19 @@
|
||||||
module DossierStateConcern
|
module DossierStateConcern
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
def submit_en_construction!
|
||||||
|
self.traitements.submit_en_construction
|
||||||
|
save!
|
||||||
|
|
||||||
|
RoutingEngine.compute(self)
|
||||||
|
|
||||||
|
resolve_pending_correction!
|
||||||
|
process_sva_svr!
|
||||||
|
remove_piece_justificative_file_not_visible!
|
||||||
|
|
||||||
|
editing_forks.each(&:destroy_editing_fork!)
|
||||||
|
end
|
||||||
|
|
||||||
def after_passer_en_construction
|
def after_passer_en_construction
|
||||||
self.conservation_extension = 0.days
|
self.conservation_extension = 0.days
|
||||||
self.depose_at = self.en_construction_at = self.traitements
|
self.depose_at = self.en_construction_at = self.traitements
|
||||||
|
@ -16,12 +29,18 @@ module DossierStateConcern
|
||||||
MailTemplatePresenterService.create_commentaire_for_state(self, Dossier.states.fetch(:en_construction))
|
MailTemplatePresenterService.create_commentaire_for_state(self, Dossier.states.fetch(:en_construction))
|
||||||
procedure.compute_dossiers_count
|
procedure.compute_dossiers_count
|
||||||
|
|
||||||
|
process_declarative!
|
||||||
|
process_sva_svr!
|
||||||
|
|
||||||
index_search_terms_later
|
index_search_terms_later
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_commit_passer_en_construction
|
def after_commit_passer_en_construction
|
||||||
NotificationMailer.send_en_construction_notification(self).deliver_later
|
NotificationMailer.send_en_construction_notification(self).deliver_later
|
||||||
NotificationMailer.send_notification_for_tiers(self).deliver_later if self.for_tiers?
|
NotificationMailer.send_notification_for_tiers(self).deliver_later if self.for_tiers?
|
||||||
|
groupe_instructeur.instructeurs.with_instant_email_dossier_notifications.each do |instructeur|
|
||||||
|
DossierMailer.notify_new_dossier_depose_to_instructeur(self, instructeur.email).deliver_later
|
||||||
|
end
|
||||||
remove_piece_justificative_file_not_visible!
|
remove_piece_justificative_file_not_visible!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -49,6 +68,8 @@ module DossierStateConcern
|
||||||
NotificationMailer.send_en_instruction_notification(self).deliver_later
|
NotificationMailer.send_en_instruction_notification(self).deliver_later
|
||||||
NotificationMailer.send_notification_for_tiers(self).deliver_later if self.for_tiers?
|
NotificationMailer.send_notification_for_tiers(self).deliver_later if self.for_tiers?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
editing_forks.each(&:destroy_editing_fork!)
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_passer_automatiquement_en_instruction
|
def after_passer_automatiquement_en_instruction
|
||||||
|
|
|
@ -865,17 +865,6 @@ class Dossier < ApplicationRecord
|
||||||
procedure.email_template_for(state)
|
procedure.email_template_for(state)
|
||||||
end
|
end
|
||||||
|
|
||||||
def submit_en_construction!
|
|
||||||
self.traitements.submit_en_construction
|
|
||||||
save!
|
|
||||||
|
|
||||||
RoutingEngine.compute(self)
|
|
||||||
|
|
||||||
resolve_pending_correction!
|
|
||||||
process_sva_svr!
|
|
||||||
remove_piece_justificative_file_not_visible!
|
|
||||||
end
|
|
||||||
|
|
||||||
def process_declarative!
|
def process_declarative!
|
||||||
if procedure.declarative_accepte? && may_accepter_automatiquement?
|
if procedure.declarative_accepte? && may_accepter_automatiquement?
|
||||||
accepter_automatiquement!
|
accepter_automatiquement!
|
||||||
|
|
|
@ -13,6 +13,6 @@
|
||||||
active: @tab == 'annotations-privees')
|
active: @tab == 'annotations-privees')
|
||||||
|
|
||||||
- if @tab == 'dossier'
|
- if @tab == 'dossier'
|
||||||
= render partial: "shared/dossiers/edit", locals: { dossier: @dossier }
|
= render partial: "shared/dossiers/edit", locals: { dossier: @dossier, dossier_for_editing: @dossier }
|
||||||
- else
|
- else
|
||||||
= render partial: "shared/dossiers/edit_annotations", locals: { dossier: @dossier, seen_at: nil }
|
= render partial: "shared/dossiers/edit_annotations", locals: { dossier: @dossier, seen_at: nil }
|
||||||
|
|
|
@ -12,4 +12,4 @@
|
||||||
.fr-container
|
.fr-container
|
||||||
%h2.fr-h4= t('.title')
|
%h2.fr-h4= t('.title')
|
||||||
|
|
||||||
= render partial: "shared/dossiers/edit", locals: { dossier: @dossier }
|
= render partial: "shared/dossiers/edit", locals: { dossier: @dossier, dossier_for_editing: @dossier }
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
- dossier_for_editing = dossier.en_construction? ? dossier.owner_editing_fork : dossier
|
|
||||||
|
|
||||||
- if dossier.france_connected_with_one_identity? && current_user.instructeur? && !current_user.owns_or_invite?(dossier)
|
- if dossier.france_connected_with_one_identity? && current_user.instructeur? && !current_user.owns_or_invite?(dossier)
|
||||||
- content_for(:notice_info) do
|
- content_for(:notice_info) do
|
||||||
= render partial: "shared/dossiers/france_connect_informations_notice", locals: { user_information: dossier.user.france_connect_informations.first }
|
= render partial: "shared/dossiers/france_connect_informations_notice", locals: { user_information: dossier.user.france_connect_informations.first }
|
||||||
|
@ -10,7 +8,7 @@
|
||||||
= render NestedForms::FormOwnerComponent.new
|
= render NestedForms::FormOwnerComponent.new
|
||||||
= form_for dossier_for_editing, url: brouillon_dossier_url(dossier), method: :patch, html: { id: 'dossier-edit-form', class: 'form', multipart: true, novalidate: 'novalidate' } do |f|
|
= form_for dossier_for_editing, url: brouillon_dossier_url(dossier), method: :patch, html: { id: 'dossier-edit-form', class: 'form', multipart: true, novalidate: 'novalidate' } do |f|
|
||||||
|
|
||||||
= render Dossiers::ErrorsFullMessagesComponent.new(dossier: dossier)
|
= render Dossiers::ErrorsFullMessagesComponent.new(dossier: dossier_for_editing)
|
||||||
%header.mb-6
|
%header.mb-6
|
||||||
.fr-highlight
|
.fr-highlight
|
||||||
%p.fr-text--sm
|
%p.fr-text--sm
|
||||||
|
|
|
@ -9,4 +9,4 @@
|
||||||
.fr-container
|
.fr-container
|
||||||
= render partial: "shared/dossiers/header", locals: { dossier: @dossier }
|
= render partial: "shared/dossiers/header", locals: { dossier: @dossier }
|
||||||
|
|
||||||
= render partial: "shared/dossiers/edit", locals: { dossier: @dossier }
|
= render partial: "shared/dossiers/edit", locals: { dossier: @dossier, dossier_for_editing: @dossier }
|
||||||
|
|
|
@ -7,4 +7,4 @@
|
||||||
= render partial: 'users/dossiers/show/header', locals: { dossier: @dossier }
|
= render partial: 'users/dossiers/show/header', locals: { dossier: @dossier }
|
||||||
|
|
||||||
.container
|
.container
|
||||||
= render partial: "shared/dossiers/edit", locals: { dossier: @dossier }
|
= render partial: "shared/dossiers/edit", locals: { dossier: @dossier, dossier_for_editing: @dossier_for_editing }
|
||||||
|
|
|
@ -380,7 +380,6 @@ Rails.application.routes.draw do
|
||||||
post 'brouillon', to: 'dossiers#submit_brouillon'
|
post 'brouillon', to: 'dossiers#submit_brouillon'
|
||||||
get 'modifier', to: 'dossiers#modifier'
|
get 'modifier', to: 'dossiers#modifier'
|
||||||
post 'modifier', to: 'dossiers#submit_en_construction'
|
post 'modifier', to: 'dossiers#submit_en_construction'
|
||||||
patch 'modifier', to: 'dossiers#modifier_legacy'
|
|
||||||
get 'champs/:stable_id', to: 'dossiers#champ', as: :champ
|
get 'champs/:stable_id', to: 'dossiers#champ', as: :champ
|
||||||
get 'merci'
|
get 'merci'
|
||||||
get 'demande'
|
get 'demande'
|
||||||
|
|
|
@ -96,14 +96,6 @@ RSpec.describe Attachment::MultipleComponent, type: :component do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when user can replace' do
|
|
||||||
let(:kwargs) { { user_can_replace: true } }
|
|
||||||
|
|
||||||
before do
|
|
||||||
attach_to_champ(attached_file, champ)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def attach_to_champ(attached_file, champ)
|
def attach_to_champ(attached_file, champ)
|
||||||
attached_file.attach(
|
attached_file.attach(
|
||||||
io: StringIO.new("x" * 2),
|
io: StringIO.new("x" * 2),
|
||||||
|
|
|
@ -836,10 +836,11 @@ describe Users::DossiersController, type: :controller do
|
||||||
before { sign_in(user) }
|
before { sign_in(user) }
|
||||||
|
|
||||||
let(:procedure) { create(:procedure, :published, types_de_champ_public: [{}, { type: :piece_justificative }]) }
|
let(:procedure) { create(:procedure, :published, types_de_champ_public: [{}, { type: :piece_justificative }]) }
|
||||||
let!(:dossier) { create(:dossier, :en_construction, user:, procedure:) }
|
let(:dossier) { create(:dossier, :en_construction, user:, procedure:) }
|
||||||
let(:first_champ) { dossier.project_champs_public.first }
|
let!(:editing_fork) { dossier.owner_editing_fork }
|
||||||
|
let(:first_champ) { editing_fork.project_champs_public.first }
|
||||||
|
let(:piece_justificative_champ) { editing_fork.project_champs_public.last }
|
||||||
let(:anchor_to_first_champ) { controller.helpers.link_to I18n.t('views.users.dossiers.fix_champ'), brouillon_dossier_path(anchor: first_champ.labelledby_id), class: 'error-anchor' }
|
let(:anchor_to_first_champ) { controller.helpers.link_to I18n.t('views.users.dossiers.fix_champ'), brouillon_dossier_path(anchor: first_champ.labelledby_id), class: 'error-anchor' }
|
||||||
let(:piece_justificative_champ) { dossier.project_champs_public.last }
|
|
||||||
let(:value) { 'beautiful value' }
|
let(:value) { 'beautiful value' }
|
||||||
let(:file) { fixture_file_upload('spec/fixtures/files/piece_justificative_0.pdf', 'application/pdf') }
|
let(:file) { fixture_file_upload('spec/fixtures/files/piece_justificative_0.pdf', 'application/pdf') }
|
||||||
let(:now) { Time.zone.parse('01/01/2100') }
|
let(:now) { Time.zone.parse('01/01/2100') }
|
||||||
|
@ -887,14 +888,9 @@ describe Users::DossiersController, type: :controller do
|
||||||
|
|
||||||
it 'updates the dossier timestamps' do
|
it 'updates the dossier timestamps' do
|
||||||
subject
|
subject
|
||||||
dossier.reload
|
editing_fork.reload
|
||||||
expect(dossier.updated_at).to eq(now)
|
expect(editing_fork.updated_at).to eq(now)
|
||||||
expect(dossier.last_champ_updated_at).to eq(now)
|
expect(editing_fork.last_champ_updated_at).to eq(now)
|
||||||
end
|
|
||||||
|
|
||||||
it 'updates the dossier state' do
|
|
||||||
subject
|
|
||||||
expect(dossier.reload.state).to eq(Dossier.states.fetch(:en_construction))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it { is_expected.to have_http_status(:ok) }
|
it { is_expected.to have_http_status(:ok) }
|
||||||
|
@ -923,9 +919,9 @@ describe Users::DossiersController, type: :controller do
|
||||||
|
|
||||||
it 'updates the dossier timestamps' do
|
it 'updates the dossier timestamps' do
|
||||||
subject
|
subject
|
||||||
dossier.reload
|
editing_fork.reload
|
||||||
expect(dossier.updated_at).to eq(now)
|
expect(editing_fork.updated_at).to eq(now)
|
||||||
expect(dossier.last_champ_updated_at).to eq(now)
|
expect(editing_fork.last_champ_updated_at).to eq(now)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -958,14 +954,10 @@ describe Users::DossiersController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'iban error' do
|
context 'iban error' do
|
||||||
|
let(:types_de_champ_public) { [{ type: :iban }] }
|
||||||
let(:value) { 'abc' }
|
let(:value) { 'abc' }
|
||||||
|
|
||||||
before do
|
before { subject }
|
||||||
first_champ.type_de_champ.update!(type_champ: :iban, mandatory: true, libelle: 'l')
|
|
||||||
dossier.project_champs_public.first.becomes!(Champs::IbanChamp).save!
|
|
||||||
|
|
||||||
subject
|
|
||||||
end
|
|
||||||
|
|
||||||
it { expect(response).to have_http_status(:success) }
|
it { expect(response).to have_http_status(:success) }
|
||||||
end
|
end
|
||||||
|
@ -998,9 +990,7 @@ describe Users::DossiersController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the champ is a phone number' do
|
context 'when the champ is a phone number' do
|
||||||
let(:procedure) { create(:procedure, :published, types_de_champ_public: [{ type: :phone }]) }
|
let(:types_de_champ_public) { [{ type: :phone }] }
|
||||||
let!(:dossier) { create(:dossier, :en_construction, user:, procedure:) }
|
|
||||||
let(:first_champ) { dossier.project_champs_public.first }
|
|
||||||
let(:now) { Time.zone.parse('01/01/2100') }
|
let(:now) { Time.zone.parse('01/01/2100') }
|
||||||
|
|
||||||
let(:submit_payload) do
|
let(:submit_payload) do
|
||||||
|
|
|
@ -6,10 +6,11 @@ describe 'shared/dossiers/edit', type: :view do
|
||||||
allow(view).to receive(:administrateur_signed_in?).and_return(false)
|
allow(view).to receive(:administrateur_signed_in?).and_return(false)
|
||||||
end
|
end
|
||||||
|
|
||||||
subject { render 'shared/dossiers/edit', dossier: dossier, apercu: false }
|
subject { render 'shared/dossiers/edit', dossier:, dossier_for_editing:, apercu: false }
|
||||||
|
|
||||||
let(:procedure) { create(:procedure, types_de_champ_public:) }
|
let(:procedure) { create(:procedure, types_de_champ_public:) }
|
||||||
let(:dossier) { create(:dossier, :with_populated_champs, procedure:) }
|
let(:dossier) { create(:dossier, :with_populated_champs, procedure:) }
|
||||||
|
let(:dossier_for_editing) { dossier }
|
||||||
|
|
||||||
context 'when there are some champs' do
|
context 'when there are some champs' do
|
||||||
let(:type_de_champ_header_section) { procedure.draft_types_de_champ_public.find(&:header_section?) }
|
let(:type_de_champ_header_section) { procedure.draft_types_de_champ_public.find(&:header_section?) }
|
||||||
|
@ -116,6 +117,7 @@ describe 'shared/dossiers/edit', type: :view do
|
||||||
|
|
||||||
context 'when dossier is en construction' do
|
context 'when dossier is en construction' do
|
||||||
let(:dossier) { create(:dossier, :en_construction, :with_populated_champs, procedure:) }
|
let(:dossier) { create(:dossier, :en_construction, :with_populated_champs, procedure:) }
|
||||||
|
let(:dossier_for_editing) { dossier.owner_editing_fork }
|
||||||
|
|
||||||
it 'can delete a piece justificative' do
|
it 'can delete a piece justificative' do
|
||||||
expect(subject).to have_selector("[title='Supprimer le fichier #{champ.piece_justificative_file.attachments[0].filename}']")
|
expect(subject).to have_selector("[title='Supprimer le fichier #{champ.piece_justificative_file.attachments[0].filename}']")
|
||||||
|
|
Loading…
Reference in a new issue