demarches-normaliennes/app/models/concerns/columns_concern.rb

162 lines
7.2 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2024-08-19 14:34:36 +02:00
module ColumnsConcern
extend ActiveSupport::Concern
included do
2024-10-09 09:21:44 +02:00
# we cannot use column.id ( == { procedure_id, column_id }.to_json)
# as the order of the keys is not guaranteed
# instead, we are using h_id == { procedure_id:, column_id: }
# another way to find a column is to look for its label
def find_column(h_id: nil, label: nil)
column = columns.find { _1.h_id == h_id } if h_id.present?
column = columns.find { _1.label == label } if label.present?
2024-10-11 11:23:36 +02:00
raise ActiveRecord::RecordNotFound.new("Column: unable to find h_id: #{h_id} or label: #{label} for procedure_id #{id}") if column.nil?
column
end
2024-08-19 14:34:36 +02:00
def columns
Current.procedure_columns ||= {}
Current.procedure_columns[id] ||= begin
columns = dossier_columns
columns.concat(standard_columns)
columns.concat(individual_columns) if for_individual
columns.concat(moral_columns) if !for_individual
columns.concat(chorus_columns)
columns.concat(types_de_champ_columns)
end
2024-08-19 14:34:36 +02:00
end
def chorus_columns
['domaine_fonctionnel', 'referentiel_prog', 'centre_de_cout']
.map { |column| Column.new(procedure_id: id, table: 'procedure', column:, displayable: false, filterable: false) }
end
def all_usager_columns_for_export
columns = [dossier_id_column, email_for_display_column, france_connected_column]
columns.concat(individual_columns) if for_individual
columns.concat(moral_columns) if !for_individual
columns.concat(chorus_columns) if chorusable? && chorus_configuration.complete?
columns.flatten.compact
end
def all_dossier_columns_for_export
states = [dossier_state_column]
routing =
if self.routing_enabled?
[Column.new(procedure_id: id, table: 'groupe_instructeur', column: 'id')]
else
[]
end
instructeurs = [Column.new(procedure_id: id, table: 'followers_instructeurs', column: 'email')]
[states, dossier_archived_column, dossier_dates_columns, dossier_motivation_column, sva_svr_columns(for_export: true), routing, instructeurs].flatten.compact
end
def dossier_id_column
Column.new(procedure_id: id, table: 'self', column: 'id', type: :number)
end
2024-10-09 15:16:13 +02:00
def dossier_state_column
Column.new(procedure_id: id, table: 'self', column: 'state', label: I18n.t('activerecord.attributes.procedure_presentation.fields.self.state'), type: :enum, scope: 'instructeurs.dossiers.filterable_state', displayable: false)
2024-10-09 15:16:13 +02:00
end
def email_for_display_column = Column.new(procedure_id: id, table: 'self', column: 'user_email_for_display', filterable: false, displayable: false)
def france_connected_column = Column.new(procedure_id: id, table: 'self', column: 'user_from_france_connect?', filterable: false, displayable: false)
def notifications_column
Column.new(procedure_id: id, table: 'notifications', column: 'notifications', label: "notifications", filterable: false)
end
2024-08-19 14:34:36 +02:00
def dossier_columns
common = [dossier_id_column, notifications_column]
2024-08-19 14:34:36 +02:00
states = [dossier_state_column]
2024-08-19 14:34:36 +02:00
non_displayable_dates = ['updated_since', 'depose_since', 'en_construction_since', 'en_instruction_since', 'processed_since']
.map { |column| Column.new(procedure_id: id, table: 'self', column:, type: :date, displayable: false) }
2024-08-19 14:34:36 +02:00
[common, states, dossier_archived_column, dossier_dates_columns, dossier_motivation_column, sva_svr_columns(for_export: false), non_displayable_dates].flatten.compact
2024-08-19 14:34:36 +02:00
end
def dossier_dates_columns
['created_at', 'updated_at', 'last_champ_updated_at', 'depose_at', 'en_construction_at', 'en_instruction_at', 'processed_at']
.map { |column| Column.new(procedure_id: id, table: 'self', column:, type: :date) }
end
def sva_svr_columns(for_export: false)
2024-08-19 14:34:36 +02:00
return if !sva_svr_enabled?
scope = [:activerecord, :attributes, :procedure_presentation, :fields, :self]
columns = [
Column.new(procedure_id: id, table: 'self', column: 'sva_svr_decision_on', type: :date,
label: I18n.t("#{sva_svr_decision}_decision_on", scope:, type: sva_svr_configuration.human_decision))
2024-08-19 14:34:36 +02:00
]
if !for_export
columns << Column.new(procedure_id: id, table: 'self', column: 'sva_svr_decision_before', type: :date, displayable: false,
label: I18n.t("#{sva_svr_decision}_decision_before", scope:))
end
2024-08-19 14:34:36 +02:00
columns
end
2024-09-25 17:37:11 +02:00
def default_sorted_column
SortedColumn.new(column: notifications_column, order: 'desc')
end
2024-10-09 11:08:41 +02:00
def default_displayed_columns = [email_column]
def dossier_archived_column = Column.new(procedure_id: id, table: 'self', column: 'archived', type: :text, displayable: false, filterable: false);
def dossier_motivation_column = Column.new(procedure_id: id, table: 'self', column: 'motivation', type: :text, displayable: false, filterable: false);
2024-08-19 14:34:36 +02:00
private
2024-10-09 11:08:41 +02:00
def email_column
Column.new(procedure_id: id, table: 'user', column: 'email')
2024-10-09 11:08:41 +02:00
end
2024-08-19 14:34:36 +02:00
def standard_columns
[
2024-10-09 11:08:41 +02:00
email_column,
email_for_display_column,
Column.new(procedure_id: id, table: 'followers_instructeurs', column: 'email'),
Column.new(procedure_id: id, table: 'groupe_instructeur', column: 'id', type: :enum),
Column.new(procedure_id: id, table: 'avis', column: 'question_answer', filterable: false),
Column.new(procedure_id: id, table: 'user', column: 'id', filterable: false, displayable: false),
france_connected_column
2024-08-19 14:34:36 +02:00
]
end
def individual_columns
['gender', 'nom', 'prenom'].map { |column| Column.new(procedure_id: id, table: 'individual', column:) }
.concat ['for_tiers', 'mandataire_last_name', 'mandataire_first_name'].map { |column| Column.new(procedure_id: id, table: 'self', column:) }
2024-08-19 14:34:36 +02:00
end
def moral_columns
etablissements = ['entreprise_forme_juridique', 'entreprise_siren', 'entreprise_nom_commercial', 'entreprise_raison_sociale', 'entreprise_siret_siege_social']
.map { |column| Column.new(procedure_id: id, table: 'etablissement', column:) }
etablissement_dates = ['entreprise_date_creation'].map { |column| Column.new(procedure_id: id, table: 'etablissement', column:, type: :date) }
2024-08-19 14:34:36 +02:00
for_export = ["siege_social", "naf", "adresse", "numero_voie", "type_voie", "nom_voie", "complement_adresse", "localite", "code_insee_localite", "entreprise_siren", "entreprise_capital_social", "entreprise_numero_tva_intracommunautaire", "entreprise_forme_juridique_code", "entreprise_code_effectif_entreprise", "entreprise_etat_administratif", "entreprise_nom", "entreprise_prenom", "association_rna", "association_titre", "association_objet", "association_date_creation", "association_date_declaration", "association_date_publication"]
.map { |column| Column.new(procedure_id: id, table: 'etablissement', column:, displayable: false, filterable: false) }
2024-08-19 14:34:36 +02:00
other = ['siret', 'libelle_naf', 'code_postal'].map { |column| Column.new(procedure_id: id, table: 'etablissement', column:) }
2024-08-19 14:34:36 +02:00
[etablissements, etablissement_dates, other, for_export].flatten
2024-08-19 14:34:36 +02:00
end
def types_de_champ_columns
2024-10-07 21:46:59 +02:00
all_revisions_types_de_champ.flat_map { _1.columns(procedure_id: id) }
2024-08-19 14:34:36 +02:00
end
end
end