Merge pull request #11099 from colinux/many-siret-champ-columns
ETQ instructeur je peux ajouter une colonne ou filtrer par des sous-valeurs d'un champ SIRET
This commit is contained in:
commit
6ed6d1e13e
29 changed files with 246 additions and 54 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -29,6 +29,7 @@ storage/
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
.yarn-integrity
|
.yarn-integrity
|
||||||
/.vscode
|
/.vscode
|
||||||
|
/.zed
|
||||||
/.idea
|
/.idea
|
||||||
/public/assets
|
/public/assets
|
||||||
/spec/support/spec_config.local.rb
|
/spec/support/spec_config.local.rb
|
||||||
|
|
|
@ -1497,8 +1497,7 @@ Style/WhileUntilModifier:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Style/WordArray:
|
Style/WordArray:
|
||||||
Enabled: true
|
Enabled: false
|
||||||
EnforcedStyle: brackets
|
|
||||||
|
|
||||||
Style/YodaCondition:
|
Style/YodaCondition:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
|
@ -374,7 +374,11 @@ ul.dropdown-items {
|
||||||
padding: 2 * $default-spacer;
|
padding: 2 * $default-spacer;
|
||||||
|
|
||||||
&.large {
|
&.large {
|
||||||
width: 340px;
|
width: 90vw;
|
||||||
|
|
||||||
|
@media (min-width: 62em) {
|
||||||
|
width: 40vw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ul {
|
ul {
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
= current_filter_tags
|
= current_filter_tags
|
||||||
|
|
||||||
.fr-select-group
|
.fr-select-group
|
||||||
= label_tag :column, t('.column'), class: 'fr-label fr-m-0', id: 'instructeur-filter-combo-label', for: 'search-filter'
|
= label_tag :column, t('.column'), class: 'fr-label fr-mb-1w', id: 'instructeur-filter-combo-label', for: 'search-filter'
|
||||||
%react-fragment
|
%react-fragment
|
||||||
= render ReactComponent.new "ComboBox/SingleComboBox", **filter_react_props
|
= render ReactComponent.new "ComboBox/SingleComboBox", **filter_react_props
|
||||||
|
|
||||||
|
|
|
@ -5,5 +5,6 @@ class APIEntreprise::EntrepriseJob < APIEntreprise::Job
|
||||||
find_etablissement(etablissement_id)
|
find_etablissement(etablissement_id)
|
||||||
etablissement_params = APIEntreprise::EntrepriseAdapter.new(etablissement.siret, procedure_id).to_params
|
etablissement_params = APIEntreprise::EntrepriseAdapter.new(etablissement.siret, procedure_id).to_params
|
||||||
etablissement.update!(etablissement_params)
|
etablissement.update!(etablissement_params)
|
||||||
|
etablissement.update_champ_value_json!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -50,6 +50,7 @@ class Column
|
||||||
|
|
||||||
def dossier_column? = false
|
def dossier_column? = false
|
||||||
def champ_column? = false
|
def champ_column? = false
|
||||||
|
def filterable? = filterable
|
||||||
|
|
||||||
def label_for_value(value)
|
def label_for_value(value)
|
||||||
if options_for_select.present?
|
if options_for_select.present?
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
class Columns::JSONPathColumn < Columns::ChampColumn
|
class Columns::JSONPathColumn < Columns::ChampColumn
|
||||||
attr_reader :jsonpath
|
attr_reader :jsonpath
|
||||||
|
|
||||||
def initialize(procedure_id:, label:, stable_id:, tdc_type:, jsonpath:, options_for_select: [], displayable:, type: :text)
|
def initialize(procedure_id:, label:, stable_id:, tdc_type:, jsonpath:, options_for_select: [], displayable:, filterable: true, type: :text)
|
||||||
@jsonpath = quote_string(jsonpath)
|
@jsonpath = quote_string(jsonpath)
|
||||||
|
|
||||||
super(
|
super(
|
||||||
|
@ -12,6 +12,7 @@ class Columns::JSONPathColumn < Columns::ChampColumn
|
||||||
stable_id:,
|
stable_id:,
|
||||||
tdc_type:,
|
tdc_type:,
|
||||||
displayable:,
|
displayable:,
|
||||||
|
filterable:,
|
||||||
type:,
|
type:,
|
||||||
options_for_select:
|
options_for_select:
|
||||||
)
|
)
|
||||||
|
|
|
@ -6,10 +6,10 @@ module AddressableColumnConcern
|
||||||
included do
|
included do
|
||||||
def addressable_columns(procedure:, displayable: true, prefix: nil)
|
def addressable_columns(procedure:, displayable: true, prefix: nil)
|
||||||
[
|
[
|
||||||
["code postal (5 chiffres)", '$.postal_code', :text, []],
|
["Code postal (5 chiffres)", '$.postal_code', :text, []],
|
||||||
["commune", '$.city_name', :text, []],
|
["Commune", '$.city_name', :text, []],
|
||||||
["département", '$.departement_code', :enum, APIGeoService.departement_options],
|
["Département", '$.departement_code', :enum, APIGeoService.departement_options],
|
||||||
["region", '$.region_name', :enum, APIGeoService.region_options]
|
["Région", '$.region_name', :enum, APIGeoService.region_options]
|
||||||
].map do |(label, jsonpath, type, options_for_select)|
|
].map do |(label, jsonpath, type, options_for_select)|
|
||||||
Columns::JSONPathColumn.new(
|
Columns::JSONPathColumn.new(
|
||||||
procedure_id: procedure.id,
|
procedure_id: procedure.id,
|
||||||
|
|
|
@ -154,17 +154,41 @@ module ColumnsConcern
|
||||||
end
|
end
|
||||||
|
|
||||||
def moral_columns
|
def moral_columns
|
||||||
etablissements = ['entreprise_forme_juridique', 'entreprise_siren', 'entreprise_nom_commercial', 'entreprise_raison_sociale', 'entreprise_siret_siege_social']
|
siret_column = dossier_col(table: 'etablissement', column: :siret)
|
||||||
.map { |column| dossier_col(table: 'etablissement', column:) }
|
|
||||||
|
|
||||||
etablissement_dates = ['entreprise_date_creation'].map { |column| dossier_col(table: 'etablissement', column:, type: :date) }
|
etablissements = Etablissement::DISPLAYABLE_COLUMNS.map do |(column, attributes)|
|
||||||
|
dossier_col(table: 'etablissement', column:, type: attributes[:type], filterable: attributes.fetch(:filterable, true))
|
||||||
|
end
|
||||||
|
|
||||||
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"]
|
others = %w[code_postal].map { |column| dossier_col(table: 'etablissement', column:) }
|
||||||
.map { |column| dossier_col(table: 'etablissement', column:, displayable: false, filterable: false) }
|
|
||||||
|
|
||||||
other = ['siret', 'libelle_naf', 'code_postal'].map { |column| dossier_col(table: 'etablissement', column:) }
|
for_export = %w[
|
||||||
|
siege_social
|
||||||
|
code_naf
|
||||||
|
adresse
|
||||||
|
numero_voie
|
||||||
|
type_voie
|
||||||
|
nom_voie
|
||||||
|
complement_adresse
|
||||||
|
localite
|
||||||
|
code_insee_localite
|
||||||
|
entreprise_capital_social
|
||||||
|
entreprise_numero_tva_intracommunautaire
|
||||||
|
entreprise_forme_juridique_code
|
||||||
|
entreprise_code_effectif_entreprise
|
||||||
|
entreprise_etat_administratif
|
||||||
|
entreprise_siret_siege_social
|
||||||
|
entreprise_nom
|
||||||
|
entreprise_prenom
|
||||||
|
association_rna
|
||||||
|
association_titre
|
||||||
|
association_objet
|
||||||
|
association_date_creation
|
||||||
|
association_date_declaration
|
||||||
|
association_date_publication
|
||||||
|
].map { |column| dossier_col(table: 'etablissement', column:, displayable: false, filterable: false) }
|
||||||
|
|
||||||
[etablissements, etablissement_dates, other, for_export].flatten
|
[siret_column, etablissements, others, for_export].flatten
|
||||||
end
|
end
|
||||||
|
|
||||||
def types_de_champ_columns
|
def types_de_champ_columns
|
||||||
|
|
|
@ -21,6 +21,19 @@ class Etablissement < ApplicationRecord
|
||||||
|
|
||||||
after_commit -> { dossier&.index_search_terms_later }
|
after_commit -> { dossier&.index_search_terms_later }
|
||||||
|
|
||||||
|
alias_attribute :code_naf, :naf
|
||||||
|
|
||||||
|
# See https://github.com/demarches-simplifiees/demarches-simplifiees.fr/pull/10591#discussion_r1819399688
|
||||||
|
# SIRET is already exposed as base column.
|
||||||
|
DISPLAYABLE_COLUMNS = {
|
||||||
|
"entreprise_raison_sociale" => { type: :text },
|
||||||
|
"entreprise_siren" => { type: :text },
|
||||||
|
"entreprise_nom_commercial" => { type: :text },
|
||||||
|
"entreprise_forme_juridique" => { type: :text },
|
||||||
|
"entreprise_date_creation" => { type: :date, filterable: false },
|
||||||
|
"libelle_naf" => { type: :text }
|
||||||
|
}.freeze
|
||||||
|
|
||||||
def entreprise_raison_sociale
|
def entreprise_raison_sociale
|
||||||
read_attribute(:entreprise_raison_sociale).presence || raison_sociale_for_ei
|
read_attribute(:entreprise_raison_sociale).presence || raison_sociale_for_ei
|
||||||
end
|
end
|
||||||
|
@ -193,6 +206,21 @@ class Etablissement < ApplicationRecord
|
||||||
adresse.nil? # TOOD: maybe dedicated column or more robust way
|
adresse.nil? # TOOD: maybe dedicated column or more robust way
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_champ_value_json!
|
||||||
|
return if champ.nil?
|
||||||
|
|
||||||
|
champ.update!(value_json: champ_value_json)
|
||||||
|
end
|
||||||
|
|
||||||
|
def champ_value_json
|
||||||
|
address_data = APIGeoService.parse_etablissement_address(self)
|
||||||
|
|
||||||
|
DISPLAYABLE_COLUMNS.keys.each_with_object(address_data) do |attr, hash|
|
||||||
|
value = public_send(attr)
|
||||||
|
hash[attr.to_sym] = value if value.present?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def bilans_new_keys
|
def bilans_new_keys
|
||||||
|
|
|
@ -10,6 +10,27 @@ class TypesDeChamp::SiretTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
def champ_blank_or_invalid?(champ) = Siret.new(siret: champ.value).invalid?
|
def champ_blank_or_invalid?(champ) = Siret.new(siret: champ.value).invalid?
|
||||||
|
|
||||||
def columns(procedure:, displayable: true, prefix: nil)
|
def columns(procedure:, displayable: true, prefix: nil)
|
||||||
super.concat(addressable_columns(procedure:, displayable:, prefix:))
|
super
|
||||||
|
.concat(etablissement_columns(procedure:, displayable:, prefix:))
|
||||||
|
.concat(addressable_columns(procedure:, displayable:, prefix:))
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def etablissement_columns(procedure:, displayable:, prefix:)
|
||||||
|
i18n_scope = [:activerecord, :attributes, :procedure_presentation, :fields, :etablissement]
|
||||||
|
|
||||||
|
Etablissement::DISPLAYABLE_COLUMNS.map do |(column, attributes)|
|
||||||
|
Columns::JSONPathColumn.new(
|
||||||
|
procedure_id: procedure.id,
|
||||||
|
stable_id:,
|
||||||
|
tdc_type: type_champ,
|
||||||
|
label: [prefix, libelle, I18n.t(column, scope: i18n_scope)].compact.join(' – '),
|
||||||
|
type: attributes[:type],
|
||||||
|
jsonpath: "$.#{column}",
|
||||||
|
displayable: true,
|
||||||
|
filterable: attributes.fetch(:filterable, true)
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -116,7 +116,12 @@ class TypesDeChamp::TypeDeChampBase
|
||||||
private
|
private
|
||||||
|
|
||||||
def libelle_with_prefix(prefix)
|
def libelle_with_prefix(prefix)
|
||||||
[prefix, libelle].compact.join(' – ')
|
# SIRET needs to be explicit in listings for better UI readability
|
||||||
|
if type_champ == "siret" && !libelle.upcase.include?("SIRET")
|
||||||
|
[prefix, libelle, "SIRET"].compact.join(' – ')
|
||||||
|
else
|
||||||
|
[prefix, libelle].compact.join(' – ')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def paths
|
def paths
|
||||||
|
|
|
@ -22,10 +22,7 @@ class APIEntrepriseService
|
||||||
|
|
||||||
etablissement = dossier_or_champ.build_etablissement(etablissement_params)
|
etablissement = dossier_or_champ.build_etablissement(etablissement_params)
|
||||||
etablissement.save!
|
etablissement.save!
|
||||||
|
etablissement.update_champ_value_json!
|
||||||
if dossier_or_champ.is_a?(Champ)
|
|
||||||
dossier_or_champ.update!(value_json: APIGeoService.parse_etablissement_address(etablissement))
|
|
||||||
end
|
|
||||||
|
|
||||||
perform_later_fetch_jobs(etablissement, procedure_id, user_id)
|
perform_later_fetch_jobs(etablissement, procedure_id, user_id)
|
||||||
|
|
||||||
|
@ -49,10 +46,7 @@ class APIEntrepriseService
|
||||||
return nil if etablissement_params.empty?
|
return nil if etablissement_params.empty?
|
||||||
|
|
||||||
etablissement.update!(etablissement_params)
|
etablissement.update!(etablissement_params)
|
||||||
|
etablissement.update_champ_value_json!
|
||||||
if etablissement.champ.present?
|
|
||||||
etablissement.champ.update!(value_json: APIGeoService.parse_etablissement_address(etablissement))
|
|
||||||
end
|
|
||||||
|
|
||||||
etablissement
|
etablissement
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,15 +4,20 @@
|
||||||
# la normalisation des adresses des champs RNA/RNF/SIRET
|
# la normalisation des adresses des champs RNA/RNF/SIRET
|
||||||
# le fait de stocker ces données normalisées dans le champs.value_json (un jsonb)
|
# le fait de stocker ces données normalisées dans le champs.value_json (un jsonb)
|
||||||
# le backfill les anciens champs RNA/RNF/SIRET
|
# le backfill les anciens champs RNA/RNF/SIRET
|
||||||
|
# A (re)jouer après déploiement de PR #11013 https://github.com/demarches-simplifiees/demarches-simplifiees.fr/pull/11013
|
||||||
module Maintenance
|
module Maintenance
|
||||||
class PopulateSiretValueJSONTask < MaintenanceTasks::Task
|
class PopulateSiretValueJSONTask < MaintenanceTasks::Task
|
||||||
|
include RunnableOnDeployConcern
|
||||||
|
|
||||||
|
run_on_first_deploy
|
||||||
|
|
||||||
def collection
|
def collection
|
||||||
Champs::SiretChamp.where.not(value: nil)
|
Champs::SiretChamp.where.not(value: nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
def process(champ)
|
def process(champ)
|
||||||
return if champ.etablissement.blank?
|
return if champ.etablissement.blank?
|
||||||
champ.update!(value_json: APIGeoService.parse_etablissement_address(champ.etablissement))
|
champ.update!(value_json: champ.etablissement.champ_value_json)
|
||||||
rescue ActiveRecord::RecordInvalid
|
rescue ActiveRecord::RecordInvalid
|
||||||
# noop, just a champ without dossier
|
# noop, just a champ without dossier
|
||||||
end
|
end
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
- c.with_value do
|
- c.with_value do
|
||||||
%p= etablissement.libelle_naf
|
%p= etablissement.libelle_naf
|
||||||
|
|
||||||
= render Dossiers::RowShowComponent.new(label: "Libellé NAF") do |c|
|
= render Dossiers::RowShowComponent.new(label: "Code NAF") do |c|
|
||||||
- c.with_value do
|
- c.with_value do
|
||||||
%p= etablissement.naf
|
%p= etablissement.naf
|
||||||
|
|
||||||
|
|
|
@ -47,13 +47,10 @@ en:
|
||||||
question_answer: Opinion yes/no
|
question_answer: Opinion yes/no
|
||||||
etablissement:
|
etablissement:
|
||||||
entreprise_etat_administratif: 'Entreprise état administratif'
|
entreprise_etat_administratif: 'Entreprise état administratif'
|
||||||
entreprise_forme_juridique: Forme juridique
|
|
||||||
entreprise_nom_commercial: Commercial name
|
|
||||||
entreprise_raison_sociale: Raison sociale
|
|
||||||
entreprise_siret_siege_social: SIRET siège social
|
|
||||||
entreprise_date_creation: Entreprise date de création
|
entreprise_date_creation: Entreprise date de création
|
||||||
siret: Établissement SIRET
|
siret: Établissement SIRET
|
||||||
libelle_naf: Libellé NAF
|
libelle_naf: Libellé NAF
|
||||||
|
code_naf: Code NAF
|
||||||
siege_social: "Établissement siège social"
|
siege_social: "Établissement siège social"
|
||||||
naf: "Établissement NAF"
|
naf: "Établissement NAF"
|
||||||
adresse: "Établissement Adresse"
|
adresse: "Établissement Adresse"
|
||||||
|
|
|
@ -51,13 +51,10 @@ fr:
|
||||||
question_answer: Avis oui/non
|
question_answer: Avis oui/non
|
||||||
etablissement:
|
etablissement:
|
||||||
entreprise_etat_administratif: 'Entreprise état administratif'
|
entreprise_etat_administratif: 'Entreprise état administratif'
|
||||||
entreprise_forme_juridique: Forme juridique
|
|
||||||
entreprise_nom_commercial: Nom commercial
|
|
||||||
entreprise_raison_sociale: Raison sociale
|
|
||||||
entreprise_siret_siege_social: SIRET siège social
|
|
||||||
entreprise_date_creation: Entreprise date de création
|
entreprise_date_creation: Entreprise date de création
|
||||||
siret: Établissement SIRET
|
siret: Établissement SIRET
|
||||||
libelle_naf: Libellé NAF
|
libelle_naf: Libellé NAF
|
||||||
|
code_naf: Code NAF
|
||||||
siege_social: "Établissement siège social"
|
siege_social: "Établissement siège social"
|
||||||
naf: "Établissement NAF"
|
naf: "Établissement NAF"
|
||||||
adresse: "Établissement Adresse"
|
adresse: "Établissement Adresse"
|
||||||
|
|
|
@ -165,7 +165,7 @@ FactoryBot.define do
|
||||||
factory :champ_do_not_use_siret, class: 'Champs::SiretChamp' do
|
factory :champ_do_not_use_siret, class: 'Champs::SiretChamp' do
|
||||||
association :etablissement, factory: [:etablissement]
|
association :etablissement, factory: [:etablissement]
|
||||||
value { '44011762001530' }
|
value { '44011762001530' }
|
||||||
value_json { AddressProxy::ADDRESS_PARTS.index_by(&:itself) }
|
value_json { etablissement.champ_value_json }
|
||||||
end
|
end
|
||||||
|
|
||||||
factory :champ_do_not_use_rna, class: 'Champs::RNAChamp' do
|
factory :champ_do_not_use_rna, class: 'Champs::RNAChamp' do
|
||||||
|
|
|
@ -19,7 +19,21 @@ describe Columns::ChampColumn do
|
||||||
expect_type_de_champ_values('pays', eq(['France']))
|
expect_type_de_champ_values('pays', eq(['France']))
|
||||||
expect_type_de_champ_values('epci', eq([nil]))
|
expect_type_de_champ_values('epci', eq([nil]))
|
||||||
expect_type_de_champ_values('iban', eq([nil]))
|
expect_type_de_champ_values('iban', eq([nil]))
|
||||||
expect_type_de_champ_values('siret', eq(["44011762001530", "postal_code", "city_name", "departement_code", "region_name"]))
|
expect_type_de_champ_values('siret', match_array(
|
||||||
|
[
|
||||||
|
"44011762001530",
|
||||||
|
"SA à conseil d'administration (s.a.i.)",
|
||||||
|
"440117620",
|
||||||
|
"GRTGAZ",
|
||||||
|
"GRTGAZ",
|
||||||
|
"1990-04-24",
|
||||||
|
"Transports par conduites",
|
||||||
|
"92270",
|
||||||
|
"Bois-Colombes",
|
||||||
|
"92",
|
||||||
|
"Île-de-France"
|
||||||
|
]
|
||||||
|
))
|
||||||
expect_type_de_champ_values('text', eq(['text']))
|
expect_type_de_champ_values('text', eq(['text']))
|
||||||
expect_type_de_champ_values('textarea', eq(['textarea']))
|
expect_type_de_champ_values('textarea', eq(['textarea']))
|
||||||
expect_type_de_champ_values('number', eq(['42']))
|
expect_type_de_champ_values('number', eq(['42']))
|
||||||
|
|
|
@ -36,9 +36,9 @@ describe Columns::DossierColumn do
|
||||||
expect(procedure.find_column(label: "Date de création").value(dossier)).to be_an_instance_of(ActiveSupport::TimeWithZone)
|
expect(procedure.find_column(label: "Date de création").value(dossier)).to be_an_instance_of(ActiveSupport::TimeWithZone)
|
||||||
expect(procedure.find_column(label: "Établissement SIRET").value(dossier)).to eq('44011762001530')
|
expect(procedure.find_column(label: "Établissement SIRET").value(dossier)).to eq('44011762001530')
|
||||||
expect(procedure.find_column(label: "Libellé NAF").value(dossier)).to eq('Transports par conduites')
|
expect(procedure.find_column(label: "Libellé NAF").value(dossier)).to eq('Transports par conduites')
|
||||||
|
expect(procedure.find_column(label: "Code NAF").value(dossier)).to eq('4950Z')
|
||||||
expect(procedure.find_column(label: "Établissement code postal").value(dossier)).to eq('92270')
|
expect(procedure.find_column(label: "Établissement code postal").value(dossier)).to eq('92270')
|
||||||
expect(procedure.find_column(label: "Établissement siège social").value(dossier)).to eq(true)
|
expect(procedure.find_column(label: "Établissement siège social").value(dossier)).to eq(true)
|
||||||
expect(procedure.find_column(label: "Établissement NAF").value(dossier)).to eq('4950Z')
|
|
||||||
expect(procedure.find_column(label: "Établissement Adresse").value(dossier)).to eq("GRTGAZ\r IMMEUBLE BORA\r 6 RUE RAOUL NORDLING\r 92270 BOIS COLOMBES\r")
|
expect(procedure.find_column(label: "Établissement Adresse").value(dossier)).to eq("GRTGAZ\r IMMEUBLE BORA\r 6 RUE RAOUL NORDLING\r 92270 BOIS COLOMBES\r")
|
||||||
expect(procedure.find_column(label: "Établissement numero voie").value(dossier)).to eq('6')
|
expect(procedure.find_column(label: "Établissement numero voie").value(dossier)).to eq('6')
|
||||||
expect(procedure.find_column(label: "Établissement type voie").value(dossier)).to eq('RUE')
|
expect(procedure.find_column(label: "Établissement type voie").value(dossier)).to eq('RUE')
|
||||||
|
|
|
@ -99,9 +99,9 @@ describe ColumnsConcern do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with rna' do
|
context 'with rna' do
|
||||||
let(:types_de_champ_public) { [{ type: :rna, libelle: 'rna' }] }
|
let(:types_de_champ_public) { [{ type: :rna, libelle: 'RNA' }] }
|
||||||
let(:types_de_champ_private) { [] }
|
let(:types_de_champ_private) { [] }
|
||||||
it { expect(subject.map(&:label)).to include('rna – commune') }
|
it { expect(subject.map(&:label)).to include('RNA – Commune') }
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with linked drop down list' do
|
context 'with linked drop down list' do
|
||||||
|
@ -187,8 +187,8 @@ describe ColumnsConcern do
|
||||||
procedure.find_column(label: "France connecté ?"),
|
procedure.find_column(label: "France connecté ?"),
|
||||||
procedure.find_column(label: "Établissement SIRET"),
|
procedure.find_column(label: "Établissement SIRET"),
|
||||||
procedure.find_column(label: "Établissement siège social"),
|
procedure.find_column(label: "Établissement siège social"),
|
||||||
procedure.find_column(label: "Établissement NAF"),
|
|
||||||
procedure.find_column(label: "Libellé NAF"),
|
procedure.find_column(label: "Libellé NAF"),
|
||||||
|
procedure.find_column(label: "Code NAF"),
|
||||||
procedure.find_column(label: "Établissement Adresse"),
|
procedure.find_column(label: "Établissement Adresse"),
|
||||||
procedure.find_column(label: "Établissement numero voie"),
|
procedure.find_column(label: "Établissement numero voie"),
|
||||||
procedure.find_column(label: "Établissement type voie"),
|
procedure.find_column(label: "Établissement type voie"),
|
||||||
|
|
|
@ -130,6 +130,43 @@ describe Etablissement do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#update_champ_value_json!' do
|
||||||
|
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: :siret }]) }
|
||||||
|
let(:dossier) { create(:dossier, procedure:) }
|
||||||
|
let(:etablissement) { create(:etablissement) }
|
||||||
|
let(:champ) { dossier.champs[0] }
|
||||||
|
let(:address_data) do
|
||||||
|
{
|
||||||
|
"street_number" => "6",
|
||||||
|
"street_name" => "RAOUL NORDLING",
|
||||||
|
"postal_code" => "92270",
|
||||||
|
"city_name" => "BOIS COLOMBES"
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(APIGeoService).to receive(:parse_etablissement_address)
|
||||||
|
.with(etablissement)
|
||||||
|
.and_return(address_data.dup)
|
||||||
|
|
||||||
|
etablissement.champ = champ
|
||||||
|
end
|
||||||
|
|
||||||
|
subject(:value_json) {
|
||||||
|
etablissement.update_champ_value_json!
|
||||||
|
champ.reload.value_json
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'updates the associated champ value_json with geocoded address' do
|
||||||
|
expect(value_json).to include(address_data.stringify_keys)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'includes jsonpathables columns entreprise attributes' do
|
||||||
|
expect(value_json["entreprise_siren"]).to eq(etablissement.siren)
|
||||||
|
expect(value_json["entreprise_raison_sociale"]).to eq(etablissement.entreprise_raison_sociale)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def csv_to_array_of_hash(lines)
|
def csv_to_array_of_hash(lines)
|
||||||
|
|
|
@ -123,11 +123,20 @@ describe ExportTemplate do
|
||||||
context 'when procedure has a TypeDeChamp::Siret' do
|
context 'when procedure has a TypeDeChamp::Siret' do
|
||||||
let(:types_de_champ_public) do
|
let(:types_de_champ_public) do
|
||||||
[
|
[
|
||||||
{ type: :siret, libelle: 'siret', stable_id: 20 }
|
{ type: :siret, libelle: 'SIRET', stable_id: 20 }
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
it 'is able to resolve stable_id' do
|
it 'is able to resolve stable_id' do
|
||||||
expect(export_template.columns_for_stable_id(20).size).to eq(5)
|
columns = export_template.columns_for_stable_id(20)
|
||||||
|
|
||||||
|
expect(columns.find { _1.libelle == "SIRET" }).to be_present
|
||||||
|
|
||||||
|
%w[
|
||||||
|
$.entreprise_nom_commercial
|
||||||
|
$.entreprise_raison_sociale
|
||||||
|
].each do |jsonpath|
|
||||||
|
expect(columns.find { _1.column.respond_to?(:jsonpath) && _1.column.jsonpath == jsonpath }).to be_present
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
context 'when procedure has a TypeDeChamp::Text' do
|
context 'when procedure has a TypeDeChamp::Text' do
|
||||||
|
|
40
spec/models/types_de_champ/siret_type_de_champ_spec.rb
Normal file
40
spec/models/types_de_champ/siret_type_de_champ_spec.rb
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
describe TypesDeChamp::SiretTypeDeChamp do
|
||||||
|
let(:tdc_siret) { build(:type_de_champ_siret, libelle: 'Numéro SIRET') }
|
||||||
|
let(:procedure) { build(:procedure) }
|
||||||
|
|
||||||
|
describe "#columns" do
|
||||||
|
subject(:columns) { tdc_siret.columns(procedure: procedure) }
|
||||||
|
|
||||||
|
it "returns base column without duplicating SIRET when already in libelle" do
|
||||||
|
expect(columns[0].label).to eq("Numéro SIRET")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns base column with SIRET when libelle doesn't contain SIRET" do
|
||||||
|
tdc_siret.update(libelle: "Identification de l'entreprise")
|
||||||
|
|
||||||
|
expect(columns[0].label).to eq("Identification de l'entreprise – SIRET")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "includes required jsonpaths" do
|
||||||
|
expected_paths = [
|
||||||
|
"$.entreprise_raison_sociale",
|
||||||
|
"$.entreprise_siren"
|
||||||
|
]
|
||||||
|
|
||||||
|
json_columns = columns.filter { _1.is_a?(Columns::JSONPathColumn) }
|
||||||
|
expect(json_columns.map(&:jsonpath)).to include(*expected_paths)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "includes address columns" do
|
||||||
|
address_columns = columns.filter { _1.is_a?(Columns::JSONPathColumn) && _1.jsonpath.match?(/adresse|postal_code/) }
|
||||||
|
|
||||||
|
expect(address_columns).not_to be_empty
|
||||||
|
end
|
||||||
|
|
||||||
|
it "does not include jsonpath SIRET column" do
|
||||||
|
expect(columns.find { |c| c.is_a?(Columns::JSONPathColumn) && c.jsonpath == "$.siret" }).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -572,7 +572,7 @@ describe DossierFilterService do
|
||||||
|
|
||||||
context "when searching by postal_code (text)" do
|
context "when searching by postal_code (text)" do
|
||||||
let(:value) { "60580" }
|
let(:value) { "60580" }
|
||||||
let(:filter) { ["rna – code postal (5 chiffres)", value] }
|
let(:filter) { ["rna – Code postal (5 chiffres)", value] }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
kept_dossier.project_champs_public.find { _1.stable_id == 1 }.update(value_json: { "postal_code" => value })
|
kept_dossier.project_champs_public.find { _1.stable_id == 1 }.update(value_json: { "postal_code" => value })
|
||||||
|
@ -589,7 +589,7 @@ describe DossierFilterService do
|
||||||
|
|
||||||
context "when searching by departement_code (enum)" do
|
context "when searching by departement_code (enum)" do
|
||||||
let(:value) { "99" }
|
let(:value) { "99" }
|
||||||
let(:filter) { ["rna – département", value] }
|
let(:filter) { ["rna – Département", value] }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
kept_dossier.project_champs_public.find { _1.stable_id == 1 }.update(value_json: { "departement_code" => value })
|
kept_dossier.project_champs_public.find { _1.stable_id == 1 }.update(value_json: { "departement_code" => value })
|
||||||
|
@ -606,7 +606,7 @@ describe DossierFilterService do
|
||||||
|
|
||||||
context "when searching by region_name" do
|
context "when searching by region_name" do
|
||||||
let(:value) { "60" }
|
let(:value) { "60" }
|
||||||
let(:filter) { ["rna – region", value] }
|
let(:filter) { ["rna – Région", value] }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
kept_dossier.project_champs_public.find { _1.stable_id == 1 }.update(value_json: { "region_name" => value })
|
kept_dossier.project_champs_public.find { _1.stable_id == 1 }.update(value_json: { "region_name" => value })
|
||||||
|
|
|
@ -239,9 +239,9 @@ describe DossierProjectionService do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'for a json column' do
|
context 'for a json column' do
|
||||||
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: :siret, libelle: 'siret' }]) }
|
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: :siret, libelle: 'SIRET' }]) }
|
||||||
let(:dossier) { create(:dossier, procedure:) }
|
let(:dossier) { create(:dossier, procedure:) }
|
||||||
let(:label) { "siret – département" }
|
let(:label) { "SIRET – Département" }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
dossier.project_champs_public.first.update(value_json: { 'departement_code': '38' })
|
dossier.project_champs_public.first.update(value_json: { 'departement_code': '38' })
|
||||||
|
|
|
@ -154,7 +154,7 @@ describe "procedure filters" do
|
||||||
rna_champ.reload
|
rna_champ.reload
|
||||||
champ_select_value = "37 – Indre-et-Loire"
|
champ_select_value = "37 – Indre-et-Loire"
|
||||||
|
|
||||||
add_filter("#{rna_champ.libelle} – département", champ_select_value, type: :enum)
|
add_filter("#{rna_champ.libelle} – Département", champ_select_value, type: :enum)
|
||||||
expect(page).to have_link(new_unfollow_dossier.id.to_s)
|
expect(page).to have_link(new_unfollow_dossier.id.to_s)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,6 +10,10 @@ module Maintenance
|
||||||
let(:element) { dossier.champs.first }
|
let(:element) { dossier.champs.first }
|
||||||
subject(:process) { described_class.process(element) }
|
subject(:process) { described_class.process(element) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
element.update!(value_json: nil)
|
||||||
|
end
|
||||||
|
|
||||||
it 'updates value_json' do
|
it 'updates value_json' do
|
||||||
expect { subject }.to change { element.reload.value_json }
|
expect { subject }.to change { element.reload.value_json }
|
||||||
.from(anything)
|
.from(anything)
|
||||||
|
@ -25,7 +29,14 @@ module Maintenance
|
||||||
"departement_code" => "92",
|
"departement_code" => "92",
|
||||||
"department_code" => "92",
|
"department_code" => "92",
|
||||||
"departement_name" => "Hauts-de-Seine",
|
"departement_name" => "Hauts-de-Seine",
|
||||||
"department_name" => "Hauts-de-Seine"
|
"department_name" => "Hauts-de-Seine",
|
||||||
|
|
||||||
|
"entreprise_date_creation" => "1990-04-24",
|
||||||
|
"entreprise_forme_juridique" => "SA à conseil d'administration (s.a.i.)",
|
||||||
|
"entreprise_nom_commercial" => "GRTGAZ",
|
||||||
|
"entreprise_raison_sociale" => "GRTGAZ",
|
||||||
|
"entreprise_siren" => "440117620",
|
||||||
|
"libelle_naf" => "Transports par conduites"
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,9 +9,12 @@ describe 'shared/dossiers/normalized_address', type: :view do
|
||||||
let(:address) { AddressProxy.new(dossier.champs.first) }
|
let(:address) { AddressProxy.new(dossier.champs.first) }
|
||||||
|
|
||||||
it 'render address' do
|
it 'render address' do
|
||||||
AddressProxy::ADDRESS_PARTS.each do |address_part|
|
expect(subject).to have_text("6 RUE RAOUL NORDLING")
|
||||||
expect(subject).to have_text(address_part)
|
expect(subject).to have_text("Bois-Colombes")
|
||||||
end
|
expect(subject).to have_text("92270")
|
||||||
|
expect(subject).to have_text("92009")
|
||||||
|
expect(subject).to have_text("Hauts-de-Seine – 92")
|
||||||
|
expect(subject).to have_text("Île-de-France – 11")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue