Add SIRET Type De Champ
This commit is contained in:
parent
0b79a3d79d
commit
45ef32e6d9
18 changed files with 210 additions and 5 deletions
27
app/assets/javascripts/new_design/champs/siret.js
Normal file
27
app/assets/javascripts/new_design/champs/siret.js
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
document.addEventListener('turbolinks:load', function() {
|
||||||
|
$('[data-siret]').on('input', function(evt) {
|
||||||
|
var input = $(evt.target);
|
||||||
|
var value = input.val();
|
||||||
|
var url = input.attr('data-siret');
|
||||||
|
switch (value.length) {
|
||||||
|
case 0:
|
||||||
|
$.get(url+'?siret=blank');
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
input.attr('disabled', 'disabled');
|
||||||
|
$.get(url+'?siret='+value).then(function() {
|
||||||
|
input.removeAttr('data-invalid');
|
||||||
|
input.removeAttr('disabled');
|
||||||
|
}, function() {
|
||||||
|
input.removeAttr('disabled');
|
||||||
|
input.attr('data-invalid', true);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!input.attr('data-invalid')) {
|
||||||
|
input.attr('data-invalid', true);
|
||||||
|
$.get(url+'?siret=invalid');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
|
@ -48,6 +48,10 @@
|
||||||
.updated-at.highlighted {
|
.updated-at.highlighted {
|
||||||
visibility: visible;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.etablissement-titre {
|
||||||
|
margin-bottom: 2 * $default-padding;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.radios {
|
.radios {
|
||||||
|
@ -82,6 +86,10 @@
|
||||||
&.small {
|
&.small {
|
||||||
padding: $default-padding / 2;
|
padding: $default-padding / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.small-margin {
|
||||||
|
margin-bottom: $default-padding / 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text],
|
input[type=text],
|
||||||
|
|
29
app/controllers/champs/siret_controller.rb
Normal file
29
app/controllers/champs/siret_controller.rb
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
class Champs::SiretController < ApplicationController
|
||||||
|
def index
|
||||||
|
siret, champ_id = params.required([:siret, :champ_id])
|
||||||
|
@champ = Champs::SiretChamp.find(champ_id)
|
||||||
|
@etablissement = @champ.etablissement
|
||||||
|
if siret == 'blank'
|
||||||
|
if @etablissement
|
||||||
|
@etablissement.mark_for_destruction
|
||||||
|
end
|
||||||
|
@blank = true
|
||||||
|
elsif siret == 'invalid'
|
||||||
|
if @etablissement
|
||||||
|
@etablissement.mark_for_destruction
|
||||||
|
end
|
||||||
|
@error = "SIRET invalide"
|
||||||
|
else
|
||||||
|
etablissement_attributes = SIRETService.fetch(siret, @champ.dossier.procedure_id)
|
||||||
|
if etablissement_attributes.present?
|
||||||
|
@etablissement = @champ.build_etablissement(etablissement_attributes)
|
||||||
|
@etablissement.champ = @champ
|
||||||
|
else
|
||||||
|
@error = "SIRET invalide"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
respond_to do |format|
|
||||||
|
format.js
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -198,7 +198,10 @@ module NewGestionnaire
|
||||||
end
|
end
|
||||||
|
|
||||||
def champs_private_params
|
def champs_private_params
|
||||||
params.require(:dossier).permit(champs_private_attributes: [:id, :piece_justificative_file, :value, value: []])
|
params.require(:dossier).permit(champs_private_attributes: [
|
||||||
|
:id, :piece_justificative_file, :value, value: [],
|
||||||
|
etablissement_attributes: Champs::SiretChamp::ETABLISSEMENT_ATTRIBUTES
|
||||||
|
])
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_attestation_emailable
|
def check_attestation_emailable
|
||||||
|
|
|
@ -116,7 +116,12 @@ module NewUser
|
||||||
|
|
||||||
# FIXME: require(:dossier) when all the champs are united
|
# FIXME: require(:dossier) when all the champs are united
|
||||||
def champs_params
|
def champs_params
|
||||||
params.permit(dossier: { champs_attributes: [:id, :value, :piece_justificative_file, value: []] })
|
params.permit(dossier: {
|
||||||
|
champs_attributes: [
|
||||||
|
:id, :value, :piece_justificative_file, value: [],
|
||||||
|
etablissement_attributes: Champs::SiretChamp::ETABLISSEMENT_ATTRIBUTES
|
||||||
|
]
|
||||||
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
def dossier
|
def dossier
|
||||||
|
|
|
@ -6,6 +6,10 @@ module TypeDeChampHelper
|
||||||
tdcs.reject! { |tdc| tdc.last == "piece_justificative" }
|
tdcs.reject! { |tdc| tdc.last == "piece_justificative" }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if !current_administrateur.feature_enabled?(:champ_siret_allowed)
|
||||||
|
tdcs.reject! { |tdc| tdc.last == "siret" }
|
||||||
|
end
|
||||||
|
|
||||||
tdcs
|
tdcs
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,42 @@
|
||||||
class Champs::SiretChamp < Champ
|
class Champs::SiretChamp < Champ
|
||||||
|
ETABLISSEMENT_ATTRIBUTES = [
|
||||||
|
:id,
|
||||||
|
:_destroy,
|
||||||
|
:signature,
|
||||||
|
:siret,
|
||||||
|
:siege_social,
|
||||||
|
:naf,
|
||||||
|
:libelle_naf,
|
||||||
|
:adresse,
|
||||||
|
:numero_voie,
|
||||||
|
:type_voie,
|
||||||
|
:nom_voie,
|
||||||
|
:code_postal,
|
||||||
|
:localite,
|
||||||
|
:code_insee_localite,
|
||||||
|
:entreprise_siren,
|
||||||
|
:entreprise_capital_social,
|
||||||
|
:entreprise_numero_tva_intracommunautaire,
|
||||||
|
:entreprise_forme_juridique,
|
||||||
|
:entreprise_forme_juridique_code,
|
||||||
|
:entreprise_nom_commercial,
|
||||||
|
:entreprise_raison_sociale,
|
||||||
|
:entreprise_siret_siege_social,
|
||||||
|
:entreprise_code_effectif_entreprise,
|
||||||
|
:entreprise_date_creation,
|
||||||
|
:entreprise_nom,
|
||||||
|
:entreprise_prenom,
|
||||||
|
:association_rna,
|
||||||
|
:association_titre,
|
||||||
|
:association_objet,
|
||||||
|
:association_date_creation,
|
||||||
|
:association_date_declaration,
|
||||||
|
:association_date_publication,
|
||||||
|
exercices_attributes: [
|
||||||
|
[:id, :ca, :date_fin_exercice, :date_fin_exercice_timestamp]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
belongs_to :etablissement, dependent: :destroy
|
belongs_to :etablissement, dependent: :destroy
|
||||||
accepts_nested_attributes_for :etablissement, allow_destroy: true, update_only: true
|
accepts_nested_attributes_for :etablissement, allow_destroy: true, update_only: true
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,7 +8,10 @@ class Etablissement < ApplicationRecord
|
||||||
accepts_nested_attributes_for :exercices
|
accepts_nested_attributes_for :exercices
|
||||||
accepts_nested_attributes_for :entreprise, update_only: true
|
accepts_nested_attributes_for :entreprise, update_only: true
|
||||||
|
|
||||||
validates :dossier_id, uniqueness: true
|
validates :siret, presence: true
|
||||||
|
validates :dossier_id, uniqueness: { allow_nil: true }
|
||||||
|
|
||||||
|
validate :validate_signature
|
||||||
|
|
||||||
def geo_adresse
|
def geo_adresse
|
||||||
[numero_voie, type_voie, nom_voie, complement_adresse, code_postal, localite].join(' ')
|
[numero_voie, type_voie, nom_voie, complement_adresse, code_postal, localite].join(' ')
|
||||||
|
@ -18,6 +21,11 @@ class Etablissement < ApplicationRecord
|
||||||
# squeeze needed because of space in excess in the data
|
# squeeze needed because of space in excess in the data
|
||||||
"#{numero_voie} #{type_voie} #{nom_voie}, #{complement_adresse}, #{code_postal} #{localite}".squeeze(' ')
|
"#{numero_voie} #{type_voie} #{nom_voie}, #{complement_adresse}, #{code_postal} #{localite}".squeeze(' ')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def titre
|
||||||
|
entreprise_raison_sociale || association_titre
|
||||||
|
end
|
||||||
|
|
||||||
def verify
|
def verify
|
||||||
SignatureService.verify(signature, message_for_signature)
|
SignatureService.verify(signature, message_for_signature)
|
||||||
end
|
end
|
||||||
|
@ -28,6 +36,14 @@ class Etablissement < ApplicationRecord
|
||||||
|
|
||||||
attr_accessor :signature
|
attr_accessor :signature
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def validate_signature
|
||||||
|
if champ && !verify
|
||||||
|
errors.add(:base, 'Numéro SIRET introuvable.')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def message_for_signature
|
def message_for_signature
|
||||||
JSON.pretty_generate(as_json(include: {
|
JSON.pretty_generate(as_json(include: {
|
||||||
exercices: { only: [:ca, :date_fin_exercice, :date_fin_exercice_timestamp] }
|
exercices: { only: [:ca, :date_fin_exercice, :date_fin_exercice_timestamp] }
|
||||||
|
|
|
@ -20,7 +20,8 @@ class TypeDeChamp < ApplicationRecord
|
||||||
header_section: 'header_section',
|
header_section: 'header_section',
|
||||||
explication: 'explication',
|
explication: 'explication',
|
||||||
dossier_link: 'dossier_link',
|
dossier_link: 'dossier_link',
|
||||||
piece_justificative: 'piece_justificative'
|
piece_justificative: 'piece_justificative',
|
||||||
|
siret: 'siret'
|
||||||
}
|
}
|
||||||
|
|
||||||
belongs_to :procedure
|
belongs_to :procedure
|
||||||
|
|
8
app/views/champs/siret/index.js.erb
Normal file
8
app/views/champs/siret/index.js.erb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
(function() {
|
||||||
|
<% if @blank || @error %>
|
||||||
|
var html = "<%= escape_javascript(render partial: 'shared/champs/siret/delete_etablissement', locals: { message: @error, position: @champ.order_place, etablissement: @etablissement }) %>";
|
||||||
|
<% else %>
|
||||||
|
var html = "<%= escape_javascript(render partial: 'shared/champs/siret/etablissement', locals: { position: @champ.order_place, etablissement: @etablissement }) %>";
|
||||||
|
<% end %>
|
||||||
|
$("#etablissement-for-<%= @champ.id %>").html(html);
|
||||||
|
})();
|
|
@ -0,0 +1,6 @@
|
||||||
|
= message
|
||||||
|
- if etablissement.present?
|
||||||
|
- champ_attributes = etablissement.champ.private? ? 'champs_private_attributes' : 'champs_attributes'
|
||||||
|
= fields_for "dossier[#{champ_attributes}][#{position}][etablissement_attributes]", etablissement do |form|
|
||||||
|
= form.hidden_field :_destroy
|
||||||
|
|
4
app/views/shared/champs/siret/_etablissement.html.haml
Normal file
4
app/views/shared/champs/siret/_etablissement.html.haml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
= render partial: 'shared/dossiers/editable_champs/etablissement_titre', locals: { etablissement: etablissement }
|
||||||
|
- champ_attributes = etablissement.champ.private? ? 'champs_private_attributes' : 'champs_attributes'
|
||||||
|
= fields_for "dossier[#{champ_attributes}][#{position}][etablissement_attributes]", etablissement do |form|
|
||||||
|
= render partial: 'shared/dossiers/editable_champs/etablissement', locals: { form: form, signature: etablissement.sign }
|
|
@ -0,0 +1,34 @@
|
||||||
|
= form.hidden_field :signature, value: signature
|
||||||
|
= form.hidden_field :siret
|
||||||
|
= form.hidden_field :siege_social
|
||||||
|
= form.hidden_field :naf
|
||||||
|
= form.hidden_field :libelle_naf
|
||||||
|
= form.hidden_field :adresse
|
||||||
|
= form.hidden_field :numero_voie
|
||||||
|
= form.hidden_field :type_voie
|
||||||
|
= form.hidden_field :nom_voie
|
||||||
|
= form.hidden_field :code_postal
|
||||||
|
= form.hidden_field :localite
|
||||||
|
= form.hidden_field :code_insee_localite
|
||||||
|
= form.hidden_field :entreprise_siren
|
||||||
|
= form.hidden_field :entreprise_capital_social
|
||||||
|
= form.hidden_field :entreprise_numero_tva_intracommunautaire
|
||||||
|
= form.hidden_field :entreprise_forme_juridique
|
||||||
|
= form.hidden_field :entreprise_forme_juridique_code
|
||||||
|
= form.hidden_field :entreprise_nom_commercial
|
||||||
|
= form.hidden_field :entreprise_raison_sociale
|
||||||
|
= form.hidden_field :entreprise_siret_siege_social
|
||||||
|
= form.hidden_field :entreprise_code_effectif_entreprise
|
||||||
|
= form.hidden_field :entreprise_date_creation
|
||||||
|
= form.hidden_field :entreprise_nom
|
||||||
|
= form.hidden_field :entreprise_prenom
|
||||||
|
= form.hidden_field :association_rna
|
||||||
|
= form.hidden_field :association_titre
|
||||||
|
= form.hidden_field :association_objet
|
||||||
|
= form.hidden_field :association_date_creation
|
||||||
|
= form.hidden_field :association_date_declaration
|
||||||
|
= form.hidden_field :association_date_publication
|
||||||
|
= form.fields_for :exercices do |form|
|
||||||
|
= form.hidden_field :ca
|
||||||
|
= form.hidden_field :date_fin_exercice
|
||||||
|
= form.hidden_field :date_fin_exercice_timestamp
|
|
@ -0,0 +1,6 @@
|
||||||
|
.etablissement-titre
|
||||||
|
= etablissement.titre
|
||||||
|
= etablissement.entreprise_forme_juridique
|
||||||
|
- if etablissement.entreprise_capital_social.present?
|
||||||
|
au capital social de
|
||||||
|
= number_to_currency(etablissement.entreprise_capital_social)
|
10
app/views/shared/dossiers/editable_champs/_siret.html.haml
Normal file
10
app/views/shared/dossiers/editable_champs/_siret.html.haml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
= form.text_field :value,
|
||||||
|
placeholder: champ.libelle,
|
||||||
|
class: 'small-margin',
|
||||||
|
data: { siret: champs_siret_path(format: :js, champ_id: champ) },
|
||||||
|
required: champ.mandatory?
|
||||||
|
%div{ id: "etablissement-for-#{champ.id}" }
|
||||||
|
- if champ.etablissement.present?
|
||||||
|
= render partial: 'shared/dossiers/editable_champs/etablissement_titre', locals: { etablissement: champ.etablissement }
|
||||||
|
= form.fields_for :etablissement do |form|
|
||||||
|
= render partial: 'shared/dossiers/editable_champs/etablissement', locals: { form: form, signature: champ.etablissement.sign }
|
|
@ -2,3 +2,5 @@ remote_storage: false
|
||||||
weekly_overview: false
|
weekly_overview: false
|
||||||
champ_pj_allowed_for_admin_ids:
|
champ_pj_allowed_for_admin_ids:
|
||||||
- 0
|
- 0
|
||||||
|
champ_siret_allowed_for_admin_ids:
|
||||||
|
- 0
|
||||||
|
|
|
@ -72,6 +72,10 @@ Rails.application.routes.draw do
|
||||||
get 'particulier/callback' => 'particulier#callback'
|
get 'particulier/callback' => 'particulier#callback'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
namespace :champs do
|
||||||
|
get ':champ_id/siret' => 'siret#index', as: 'siret'
|
||||||
|
end
|
||||||
|
|
||||||
namespace :users do
|
namespace :users do
|
||||||
namespace :dossiers do
|
namespace :dossiers do
|
||||||
resources :invites, only: [:index, :show]
|
resources :invites, only: [:index, :show]
|
||||||
|
|
|
@ -235,7 +235,7 @@ describe NewUser::DossiersController, type: :controller do
|
||||||
|
|
||||||
context 'when the update fails' do
|
context 'when the update fails' do
|
||||||
before do
|
before do
|
||||||
expect_any_instance_of(Dossier).to receive(:update).and_return(false)
|
expect_any_instance_of(Dossier).to receive(:save).and_return(false)
|
||||||
expect_any_instance_of(Dossier).to receive(:errors)
|
expect_any_instance_of(Dossier).to receive(:errors)
|
||||||
.and_return(double(full_messages: ['nop']))
|
.and_return(double(full_messages: ['nop']))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue