commit
f672305d59
43 changed files with 497 additions and 411 deletions
|
@ -19,7 +19,7 @@ class Champs::SiretController < ApplicationController
|
|||
rescue ApiEntreprise::API::RequestFailed
|
||||
return siret_error(:network_error)
|
||||
end
|
||||
if etablissement.blank?
|
||||
if etablissement.nil?
|
||||
return siret_error(:not_found)
|
||||
end
|
||||
|
||||
|
@ -50,10 +50,7 @@ class Champs::SiretController < ApplicationController
|
|||
end
|
||||
|
||||
def find_etablissement_with_siret
|
||||
etablissement_attributes = ApiEntrepriseService.get_etablissement_params_for_siret(@siret, @procedure_id)
|
||||
if etablissement_attributes.present?
|
||||
Etablissement.new(etablissement_attributes)
|
||||
end
|
||||
ApiEntrepriseService.create_etablissement(@champ.dossier, @siret, current_user.id)
|
||||
end
|
||||
|
||||
def clear_siret_and_etablissement
|
||||
|
|
|
@ -104,20 +104,14 @@ module Users
|
|||
|
||||
sanitized_siret = siret_model.siret
|
||||
begin
|
||||
etablissement_attributes = ApiEntrepriseService.get_etablissement_params_for_siret(sanitized_siret, @dossier.procedure.id, current_user.id)
|
||||
etablissement = ApiEntrepriseService.create_etablissement(@dossier, sanitized_siret, current_user.id)
|
||||
rescue ApiEntreprise::API::RequestFailed
|
||||
return render_siret_error(t('errors.messages.siret_network_error'))
|
||||
end
|
||||
if etablissement_attributes.blank?
|
||||
if etablissement.nil?
|
||||
return render_siret_error(t('errors.messages.siret_unknown'))
|
||||
end
|
||||
|
||||
attestation_sociale_url = etablissement_attributes.delete(:entreprise_attestation_sociale_url)
|
||||
attestation_fiscale_url = etablissement_attributes.delete(:entreprise_attestation_fiscale_url)
|
||||
etablissement = @dossier.build_etablissement(etablissement_attributes)
|
||||
etablissement.upload_attestation_sociale(attestation_sociale_url) if attestation_sociale_url.present?
|
||||
etablissement.upload_attestation_fiscale(attestation_fiscale_url) if attestation_fiscale_url.present?
|
||||
etablissement.save!
|
||||
current_user.update!(siret: sanitized_siret)
|
||||
@dossier.update!(autorisation_donnees: true)
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import DrawControl from 'react-mapbox-gl-draw';
|
|||
import SwitchMapStyle from './SwitchMapStyle';
|
||||
import SearchInput from './SearchInput';
|
||||
import { getJSON, ajax } from '@utils';
|
||||
import { gpx } from '@tmcw/togeojson/dist/togeojson.es.js';
|
||||
import { gpx, kml } from '@tmcw/togeojson/dist/togeojson.es.js';
|
||||
import ortho from './styles/ortho.json';
|
||||
import vector from './styles/vector.json';
|
||||
import { polygonCadastresFill, polygonCadastresLine } from './utils';
|
||||
|
@ -32,6 +32,7 @@ function MapEditor({ featureCollection, url, preview }) {
|
|||
const [zoom, setZoom] = useState([5]);
|
||||
const [currentMap, setCurrentMap] = useState({});
|
||||
const [bbox, setBbox] = useState(featureCollection.bbox);
|
||||
const [importInputs, setImportInputs] = useState([]);
|
||||
const mapStyle = style === 'ortho' ? ortho : vector;
|
||||
const cadastresFeatureCollection = filterFeatureCollection(
|
||||
featureCollection,
|
||||
|
@ -50,6 +51,13 @@ function MapEditor({ featureCollection, url, preview }) {
|
|||
draw.setFeatureProperty(lid, 'id', feature.properties.id);
|
||||
}
|
||||
|
||||
const generateId = () => Math.random().toString(20).substr(2, 6);
|
||||
|
||||
const updateImportInputs = (inputs, inputId) => {
|
||||
const updatedInputs = inputs.filter((input) => input.id !== inputId);
|
||||
setImportInputs(updatedInputs);
|
||||
};
|
||||
|
||||
async function onDrawCreate({ features }) {
|
||||
for (const feature of features) {
|
||||
const data = await getJSON(url, { feature }, 'post');
|
||||
|
@ -95,29 +103,98 @@ function MapEditor({ featureCollection, url, preview }) {
|
|||
}
|
||||
};
|
||||
|
||||
const onGpxImport = (e) => {
|
||||
const onFileImport = (e, inputId) => {
|
||||
const isGpxFile = e.target.files[0].name.includes('.gpx');
|
||||
let reader = new FileReader();
|
||||
reader.readAsText(e.target.files[0], 'UTF-8');
|
||||
reader.onload = async (event) => {
|
||||
const featureCollection = gpx(
|
||||
let featureCollection;
|
||||
isGpxFile
|
||||
? (featureCollection = gpx(
|
||||
new DOMParser().parseFromString(event.target.result, 'text/xml')
|
||||
);
|
||||
))
|
||||
: (featureCollection = kml(
|
||||
new DOMParser().parseFromString(event.target.result, 'text/xml')
|
||||
));
|
||||
|
||||
const resultFeatureCollection = await getJSON(
|
||||
`${url}/import`,
|
||||
featureCollection,
|
||||
'post'
|
||||
);
|
||||
|
||||
let inputs = [...importInputs];
|
||||
const setInputs = inputs.map((input) => {
|
||||
if (input.id === inputId) {
|
||||
input.disabled = true;
|
||||
input.hasValue = true;
|
||||
resultFeatureCollection.features.forEach((feature) => {
|
||||
if (
|
||||
JSON.stringify(feature.geometry) ===
|
||||
JSON.stringify(featureCollection.features[0].geometry)
|
||||
) {
|
||||
input.featureId = feature.properties.id;
|
||||
}
|
||||
});
|
||||
}
|
||||
return input;
|
||||
});
|
||||
|
||||
drawControl.current.draw.set(
|
||||
filterFeatureCollection(
|
||||
resultFeatureCollection,
|
||||
'selection_utilisateur'
|
||||
)
|
||||
);
|
||||
|
||||
updateFeaturesList(resultFeatureCollection.features);
|
||||
setImportInputs(setInputs);
|
||||
setBbox(resultFeatureCollection.bbox);
|
||||
};
|
||||
};
|
||||
|
||||
const addInputFile = (e) => {
|
||||
e.preventDefault();
|
||||
let inputs = [...importInputs];
|
||||
inputs.push({
|
||||
id: generateId(),
|
||||
disabled: false,
|
||||
featureId: null,
|
||||
hasValue: false
|
||||
});
|
||||
setImportInputs(inputs);
|
||||
};
|
||||
|
||||
const removeInputFile = async (e, inputId) => {
|
||||
e.preventDefault();
|
||||
const draw = drawControl.current.draw;
|
||||
const featureCollection = draw.getAll();
|
||||
let inputs = [...importInputs];
|
||||
let drawFeatureIdToRemove;
|
||||
const inputToRemove = inputs.find((input) => input.id === inputId);
|
||||
|
||||
for (const feature of featureCollection.features) {
|
||||
if (inputToRemove.featureId === feature.properties.id) {
|
||||
drawFeatureIdToRemove = feature.id;
|
||||
}
|
||||
}
|
||||
|
||||
if (inputToRemove.featureId) {
|
||||
try {
|
||||
await getJSON(`${url}/${inputToRemove.featureId}`, null, 'delete');
|
||||
draw.delete(drawFeatureIdToRemove).getAll();
|
||||
} catch (e) {
|
||||
throw new Error(
|
||||
`La feature ${inputToRemove.featureId} a déjà été supprimée manuellement`,
|
||||
e
|
||||
);
|
||||
} finally {
|
||||
updateImportInputs(inputs, inputId);
|
||||
}
|
||||
}
|
||||
updateImportInputs(inputs, inputId);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
addEventListener('cadastres:update', onCadastresUpdate);
|
||||
return () => removeEventListener('cadastres:update', onCadastresUpdate);
|
||||
|
@ -136,13 +213,33 @@ function MapEditor({ featureCollection, url, preview }) {
|
|||
return (
|
||||
<>
|
||||
<div className="file-import" style={{ marginBottom: '20px' }}>
|
||||
<button className="button send primary" onClick={addInputFile}>
|
||||
Ajouter un fichier GPX ou KML
|
||||
</button>
|
||||
<div>
|
||||
<p style={{ fontWeight: 'bolder', marginBottom: '10px' }}>
|
||||
Importer un fichier GPX
|
||||
</p>
|
||||
{importInputs.map((input) => (
|
||||
<div key={input.id}>
|
||||
<input
|
||||
title="Choisir un fichier gpx ou kml"
|
||||
style={{ marginTop: '15px' }}
|
||||
id={input.id}
|
||||
type="file"
|
||||
accept=".gpx, .kml"
|
||||
disabled={input.disabled}
|
||||
onChange={(e) => onFileImport(e, input.id)}
|
||||
/>
|
||||
{input.hasValue && (
|
||||
<span
|
||||
title="Supprimer le fichier"
|
||||
className="icon refuse"
|
||||
style={{
|
||||
cursor: 'pointer'
|
||||
}}
|
||||
onClick={(e) => removeInputFile(e, input.id)}
|
||||
></span>
|
||||
)}
|
||||
</div>
|
||||
<div>
|
||||
<input type="file" accept=".gpx" onChange={onGpxImport} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
|
7
app/jobs/api_entreprise/association_job.rb
Normal file
7
app/jobs/api_entreprise/association_job.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class ApiEntreprise::AssociationJob < ApplicationJob
|
||||
def perform(etablissement_id, procedure_id)
|
||||
etablissement = Etablissement.find(etablissement_id)
|
||||
etablissement_params = ApiEntreprise::RNAAdapter.new(etablissement.siret, procedure_id).to_params
|
||||
etablissement.update!(etablissement_params)
|
||||
end
|
||||
end
|
8
app/jobs/api_entreprise/attestation_fiscale_job.rb
Normal file
8
app/jobs/api_entreprise/attestation_fiscale_job.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
class ApiEntreprise::AttestationFiscaleJob < ApplicationJob
|
||||
def perform(etablissement_id, procedure_id, user_id)
|
||||
etablissement = Etablissement.find(etablissement_id)
|
||||
etablissement_params = ApiEntreprise::AttestationFiscaleAdapter.new(etablissement.siret, procedure_id, user_id).to_params
|
||||
attestation_fiscale_url = etablissement_params.delete(:entreprise_attestation_fiscale_url)
|
||||
etablissement.upload_attestation_fiscale(attestation_fiscale_url) if attestation_fiscale_url.present?
|
||||
end
|
||||
end
|
8
app/jobs/api_entreprise/attestation_sociale_job.rb
Normal file
8
app/jobs/api_entreprise/attestation_sociale_job.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
class ApiEntreprise::AttestationSocialeJob < ApplicationJob
|
||||
def perform(etablissement_id, procedure_id)
|
||||
etablissement = Etablissement.find(etablissement_id)
|
||||
etablissement_params = ApiEntreprise::AttestationSocialeAdapter.new(etablissement.siret, procedure_id).to_params
|
||||
attestation_sociale_url = etablissement_params.delete(:entreprise_attestation_sociale_url)
|
||||
etablissement.upload_attestation_sociale(attestation_sociale_url) if attestation_sociale_url.present?
|
||||
end
|
||||
end
|
7
app/jobs/api_entreprise/bilans_bdf_job.rb
Normal file
7
app/jobs/api_entreprise/bilans_bdf_job.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class ApiEntreprise::BilansBdfJob < ApplicationJob
|
||||
def perform(etablissement_id, procedure_id)
|
||||
etablissement = Etablissement.find(etablissement_id)
|
||||
etablissement_params = ApiEntreprise::BilansBdfAdapter.new(etablissement.siret, procedure_id).to_params
|
||||
etablissement.update!(etablissement_params)
|
||||
end
|
||||
end
|
7
app/jobs/api_entreprise/effectifs_annuels_job.rb
Normal file
7
app/jobs/api_entreprise/effectifs_annuels_job.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class ApiEntreprise::EffectifsAnnuelsJob < ApplicationJob
|
||||
def perform(etablissement_id, procedure_id)
|
||||
etablissement = Etablissement.find(etablissement_id)
|
||||
etablissement_params = ApiEntreprise::EffectifsAnnuelsAdapter.new(etablissement.siret, procedure_id).to_params
|
||||
etablissement.update!(etablissement_params)
|
||||
end
|
||||
end
|
21
app/jobs/api_entreprise/effectifs_job.rb
Normal file
21
app/jobs/api_entreprise/effectifs_job.rb
Normal file
|
@ -0,0 +1,21 @@
|
|||
class ApiEntreprise::EffectifsJob < ApplicationJob
|
||||
def perform(etablissement_id, procedure_id)
|
||||
etablissement = Etablissement.find(etablissement_id)
|
||||
etablissement_params = ApiEntreprise::EffectifsAdapter.new(etablissement.siret, procedure_id, *get_current_valid_month_for_effectif).to_params
|
||||
etablissement.update!(etablissement_params)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def get_current_valid_month_for_effectif
|
||||
today = Date.today
|
||||
date_update = Date.new(today.year, today.month, 15)
|
||||
|
||||
if today >= date_update
|
||||
[today.strftime("%Y"), today.strftime("%m")]
|
||||
else
|
||||
date = today - 1.month
|
||||
[date.strftime("%Y"), date.strftime("%m")]
|
||||
end
|
||||
end
|
||||
end
|
7
app/jobs/api_entreprise/entreprise_job.rb
Normal file
7
app/jobs/api_entreprise/entreprise_job.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class ApiEntreprise::EntrepriseJob < ApplicationJob
|
||||
def perform(etablissement_id, procedure_id)
|
||||
etablissement = Etablissement.find(etablissement_id)
|
||||
etablissement_params = ApiEntreprise::EntrepriseAdapter.new(etablissement.siret, procedure_id).to_params
|
||||
etablissement.update!(etablissement_params)
|
||||
end
|
||||
end
|
7
app/jobs/api_entreprise/exercices_job.rb
Normal file
7
app/jobs/api_entreprise/exercices_job.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class ApiEntreprise::ExercicesJob < ApplicationJob
|
||||
def perform(etablissement_id, procedure_id)
|
||||
etablissement = Etablissement.find(etablissement_id)
|
||||
etablissement_params = ApiEntreprise::ExercicesAdapter.new(etablissement.siret, procedure_id).to_params
|
||||
etablissement.update!(etablissement_params)
|
||||
end
|
||||
end
|
|
@ -7,6 +7,14 @@ class ApplicationJob < ActiveJob::Base
|
|||
Rails.logger.info("#{job.class.name} ended at #{Time.zone.now}")
|
||||
end
|
||||
|
||||
rescue_from(ApiEntreprise::API::ResourceNotFound) do |exception|
|
||||
error(self, exception)
|
||||
end
|
||||
|
||||
rescue_from(ApiEntreprise::API::BadFormatRequest) do |exception|
|
||||
error(self, exception)
|
||||
end
|
||||
|
||||
def error(job, exception)
|
||||
Raven.capture_exception(exception)
|
||||
end
|
||||
|
|
|
@ -25,4 +25,8 @@ class ApiEntreprise::Adapter
|
|||
def valid_params?(params)
|
||||
!params.has_value?(UNAVAILABLE)
|
||||
end
|
||||
|
||||
def siren
|
||||
@siret[0..8]
|
||||
end
|
||||
end
|
||||
|
|
|
@ -17,6 +17,9 @@ class ApiEntreprise::API
|
|||
class RequestFailed < StandardError
|
||||
end
|
||||
|
||||
class BadFormatRequest < StandardError
|
||||
end
|
||||
|
||||
def self.entreprise(siren, procedure_id)
|
||||
call(ENTREPRISE_RESOURCE_NAME, siren, procedure_id)
|
||||
end
|
||||
|
@ -72,8 +75,10 @@ class ApiEntreprise::API
|
|||
JSON.parse(response.body, symbolize_names: true)
|
||||
elsif response.code&.between?(401, 499)
|
||||
raise ResourceNotFound
|
||||
elsif response.code == 400
|
||||
raise BadFormatRequest
|
||||
else
|
||||
raise RequestFailed
|
||||
raise RequestFailed, "HTTP Error Code: #{response.code}"
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
class ApiEntreprise::AttestationFiscaleAdapter < ApiEntreprise::Adapter
|
||||
def initialize(siren, procedure_id, user_id)
|
||||
@siren = siren
|
||||
def initialize(siret, procedure_id, user_id)
|
||||
@siret = siret
|
||||
@procedure_id = procedure_id
|
||||
@user_id = user_id
|
||||
end
|
||||
|
@ -8,7 +8,7 @@ class ApiEntreprise::AttestationFiscaleAdapter < ApiEntreprise::Adapter
|
|||
private
|
||||
|
||||
def get_resource
|
||||
ApiEntreprise::API.attestation_fiscale(@siren, @procedure_id, @user_id)
|
||||
ApiEntreprise::API.attestation_fiscale(siren, @procedure_id, @user_id)
|
||||
end
|
||||
|
||||
def process_params
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
class ApiEntreprise::AttestationSocialeAdapter < ApiEntreprise::Adapter
|
||||
def initialize(siren, procedure_id)
|
||||
@siren = siren
|
||||
def initialize(siret, procedure_id)
|
||||
@siret = siret
|
||||
@procedure_id = procedure_id
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def get_resource
|
||||
ApiEntreprise::API.attestation_sociale(@siren, @procedure_id)
|
||||
ApiEntreprise::API.attestation_sociale(siren, @procedure_id)
|
||||
end
|
||||
|
||||
def process_params
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
class ApiEntreprise::BilansBdfAdapter < ApiEntreprise::Adapter
|
||||
def initialize(siren, procedure_id)
|
||||
@siren = siren
|
||||
def initialize(siret, procedure_id)
|
||||
@siret = siret
|
||||
@procedure_id = procedure_id
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def get_resource
|
||||
ApiEntreprise::API.bilans_bdf(@siren, @procedure_id)
|
||||
ApiEntreprise::API.bilans_bdf(siren, @procedure_id)
|
||||
end
|
||||
|
||||
def process_params
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
class ApiEntreprise::EffectifsAdapter < ApiEntreprise::Adapter
|
||||
def initialize(siren, procedure_id, annee, mois)
|
||||
@siren = siren
|
||||
def initialize(siret, procedure_id, annee, mois)
|
||||
@siret = siret
|
||||
@procedure_id = procedure_id
|
||||
@annee = annee
|
||||
@mois = mois
|
||||
|
@ -9,7 +9,7 @@ class ApiEntreprise::EffectifsAdapter < ApiEntreprise::Adapter
|
|||
private
|
||||
|
||||
def get_resource
|
||||
ApiEntreprise::API.effectifs(@siren, @procedure_id, @annee, @mois)
|
||||
ApiEntreprise::API.effectifs(siren, @procedure_id, @annee, @mois)
|
||||
end
|
||||
|
||||
def process_params
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
class ApiEntreprise::EffectifsAnnuelsAdapter < ApiEntreprise::Adapter
|
||||
def initialize(siren, procedure_id)
|
||||
@siren = siren
|
||||
def initialize(siret, procedure_id)
|
||||
@siret = siret
|
||||
@procedure_id = procedure_id
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def get_resource
|
||||
ApiEntreprise::API.effectifs_annuels(@siren, @procedure_id)
|
||||
ApiEntreprise::API.effectifs_annuels(siren, @procedure_id)
|
||||
end
|
||||
|
||||
def process_params
|
||||
|
|
|
@ -2,7 +2,6 @@ class ApiEntreprise::EntrepriseAdapter < ApiEntreprise::Adapter
|
|||
private
|
||||
|
||||
def get_resource
|
||||
siren = @siret[0..8]
|
||||
ApiEntreprise::API.entreprise(siren, @procedure_id)
|
||||
end
|
||||
|
||||
|
|
|
@ -1,73 +1,28 @@
|
|||
class ApiEntrepriseService
|
||||
# Retrieve all informations we can get about a SIRET.
|
||||
# create etablissement with EtablissementAdapter
|
||||
# enqueue api_entreprise jobs to retrieve
|
||||
# all informations we can get about a SIRET.
|
||||
#
|
||||
# Returns nil if the SIRET is unknown; and nested params
|
||||
# suitable for being saved into a Etablissement object otherwise.
|
||||
# Returns nil if the SIRET is unknown
|
||||
#
|
||||
# Raises a ApiEntreprise::API::RequestFailed exception on transcient errors
|
||||
# Raises a ApiEntreprise::API::RequestFailed exception on transient errors
|
||||
# (timeout, 5XX HTTP error code, etc.)
|
||||
def self.get_etablissement_params_for_siret(siret, procedure_id, user_id = nil)
|
||||
etablissement_params = ApiEntreprise::EtablissementAdapter.new(siret, procedure_id).to_params
|
||||
entreprise_params = ApiEntreprise::EntrepriseAdapter.new(siret, procedure_id).to_params
|
||||
def self.create_etablissement(dossier, siret, user_id = nil)
|
||||
etablissement_params = ApiEntreprise::EtablissementAdapter.new(siret, dossier.procedure.id).to_params
|
||||
return nil if etablissement_params.empty?
|
||||
|
||||
if etablissement_params.present? && entreprise_params.present?
|
||||
begin
|
||||
association_params = ApiEntreprise::RNAAdapter.new(siret, procedure_id).to_params
|
||||
etablissement_params.merge!(association_params)
|
||||
rescue ApiEntreprise::API::RequestFailed
|
||||
etablissement = dossier.build_etablissement(etablissement_params)
|
||||
etablissement.save
|
||||
|
||||
[
|
||||
ApiEntreprise::EntrepriseJob, ApiEntreprise::AssociationJob, ApiEntreprise::ExercicesJob,
|
||||
ApiEntreprise::EffectifsJob, ApiEntreprise::EffectifsAnnuelsJob, ApiEntreprise::AttestationSocialeJob,
|
||||
ApiEntreprise::BilansBdfJob
|
||||
].each do |job|
|
||||
job.perform_later(etablissement.id, dossier.procedure.id)
|
||||
end
|
||||
ApiEntreprise::AttestationFiscaleJob.perform_later(etablissement.id, dossier.procedure.id, user_id)
|
||||
|
||||
begin
|
||||
exercices_params = ApiEntreprise::ExercicesAdapter.new(siret, procedure_id).to_params
|
||||
etablissement_params.merge!(exercices_params)
|
||||
rescue ApiEntreprise::API::RequestFailed
|
||||
end
|
||||
|
||||
begin
|
||||
effectifs_params = ApiEntreprise::EffectifsAdapter.new(entreprise_params[:entreprise_siren], procedure_id, *get_current_valid_month_for_effectif).to_params
|
||||
etablissement_params.merge!(effectifs_params)
|
||||
rescue ApiEntreprise::API::RequestFailed
|
||||
end
|
||||
|
||||
begin
|
||||
effectifs_annuels_params = ApiEntreprise::EffectifsAnnuelsAdapter.new(entreprise_params[:entreprise_siren], procedure_id).to_params
|
||||
etablissement_params.merge!(effectifs_annuels_params)
|
||||
rescue ApiEntreprise::API::RequestFailed
|
||||
end
|
||||
|
||||
begin
|
||||
attestation_sociale_params = ApiEntreprise::AttestationSocialeAdapter.new(entreprise_params[:entreprise_siren], procedure_id).to_params
|
||||
etablissement_params.merge!(attestation_sociale_params)
|
||||
rescue ApiEntreprise::API::RequestFailed
|
||||
end
|
||||
|
||||
begin
|
||||
attestation_fiscale_params = ApiEntreprise::AttestationFiscaleAdapter.new(entreprise_params[:entreprise_siren], procedure_id, user_id).to_params
|
||||
etablissement_params.merge!(attestation_fiscale_params)
|
||||
rescue ApiEntreprise::API::RequestFailed
|
||||
end
|
||||
|
||||
begin
|
||||
bilans_bdf_params = ApiEntreprise::BilansBdfAdapter.new(entreprise_params[:entreprise_siren], procedure_id).to_params
|
||||
etablissement_params.merge!(bilans_bdf_params)
|
||||
rescue ApiEntreprise::API::RequestFailed
|
||||
end
|
||||
|
||||
etablissement_params.merge(entreprise_params)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def self.get_current_valid_month_for_effectif
|
||||
today = Date.today
|
||||
date_update = Date.new(today.year, today.month, 15)
|
||||
|
||||
if today >= date_update
|
||||
[today.strftime("%Y"), today.strftime("%m")]
|
||||
else
|
||||
date = today - 1.month
|
||||
[date.strftime("%Y"), date.strftime("%m")]
|
||||
end
|
||||
etablissement
|
||||
end
|
||||
end
|
||||
|
|
|
@ -24,9 +24,6 @@
|
|||
|
||||
= render partial: 'users/dossiers/etablissement/infos_entreprise', locals: { etablissement: etablissement }
|
||||
|
||||
- if etablissement.association?
|
||||
= render partial: 'users/dossiers/etablissement/infos_association', locals: { etablissement: etablissement }
|
||||
|
||||
.actions
|
||||
= link_to 'Utiliser un autre numéro SIRET', siret_dossier_path(@dossier), class: 'button'
|
||||
= link_to 'Continuer avec ces informations', brouillon_dossier_path(@dossier), class: 'button primary'
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
%ul.etablissement-infos-association
|
||||
%li
|
||||
Numéro d’enregistrement au Registre National des Associations :
|
||||
= etablissement.association_rna
|
||||
|
||||
%li
|
||||
Titre :
|
||||
= etablissement.association_titre
|
||||
|
||||
%li
|
||||
Objet :
|
||||
= etablissement.association_objet
|
||||
|
||||
%li
|
||||
Date de création :
|
||||
= try_format_date(etablissement.association_date_creation)
|
||||
|
||||
%li
|
||||
Date de déclaration :
|
||||
= try_format_date(etablissement.association_date_declaration)
|
||||
|
||||
%li
|
||||
Date de publication :
|
||||
= try_format_date(etablissement.association_date_publication)
|
|
@ -3,15 +3,6 @@
|
|||
Siret :
|
||||
= etablissement.siret
|
||||
|
||||
- if etablissement.siret != etablissement.entreprise.siret_siege_social
|
||||
%li
|
||||
SIRET siègle social :
|
||||
= etablissement.entreprise.siret_siege_social
|
||||
|
||||
%li
|
||||
Forme juridique :
|
||||
= etablissement.entreprise.forme_juridique
|
||||
|
||||
%li
|
||||
Libellé NAF :
|
||||
= etablissement.libelle_naf
|
||||
|
@ -20,34 +11,24 @@
|
|||
Code NAF :
|
||||
= etablissement.naf
|
||||
|
||||
%li
|
||||
Date de création :
|
||||
= try_format_date(etablissement.entreprise.date_creation)
|
||||
|
||||
%li
|
||||
Effectif organisation :
|
||||
= effectif(etablissement)
|
||||
|
||||
%li
|
||||
Code effectif :
|
||||
= etablissement.entreprise.code_effectif_entreprise
|
||||
|
||||
%li
|
||||
Numéro TVA intracommunautaire :
|
||||
= etablissement.entreprise.numero_tva_intracommunautaire
|
||||
|
||||
%li
|
||||
Adresse :
|
||||
- etablissement.adresse.split("\n").each do |line|
|
||||
= line
|
||||
|
||||
%li
|
||||
Capital social :
|
||||
= pretty_currency(etablissement.entreprise.capital_social)
|
||||
%p.etablissement-exercices
|
||||
Nous allons également récupérer la forme juridique, la date de création, les effectifs, le numéro TVA intracommunautaire, le capital social de votre organisation.
|
||||
Pour les associations, nous récupérerons également l'objet, la date de création, de déclaration et de publication.
|
||||
|
||||
- if etablissement.exercices.present?
|
||||
%p.etablissement-exercices Les exercices comptables des trois dernières années seront joints à votre dossier.
|
||||
%p.etablissement-exercices Les exercices comptables des trois dernières années pourront être joints à votre dossier.
|
||||
|
||||
- procedure = etablissement.dossier.procedure
|
||||
- if procedure.api_entreprise_role?("attestations_sociales")
|
||||
%p.etablissement-exercices Une attestation sociale sera jointe à votre dossier
|
||||
- if procedure.api_entreprise_role?("attestations_fiscales")
|
||||
%p.etablissement-exercices Une attestation fiscale sera jointe à votre dossier
|
||||
- if procedure.api_entreprise_role?("bilans_bdf")
|
||||
%p.etablissement-exercices Les 3 derniers bilans connus de votre entreprise par la Banque de France ont été joints à votre dossier.
|
||||
%p
|
||||
= link_to '➡ Autres informations sur l’organisme sur « entreprise.data.gouv.fr »',
|
||||
"https://entreprise.data.gouv.fr/etablissement/#{etablissement.siret}",
|
||||
|
|
|
@ -20,7 +20,17 @@ describe Champs::SiretController, type: :controller do
|
|||
|
||||
context 'when the user is signed in' do
|
||||
render_views
|
||||
before { sign_in user }
|
||||
let(:api_etablissement_status) { 200 }
|
||||
let(:api_etablissement_body) { File.read('spec/fixtures/files/api_entreprise/etablissements.json') }
|
||||
let(:token_expired) { false }
|
||||
before do
|
||||
sign_in user
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/etablissements\/#{siret}?.*token=/)
|
||||
.to_return(status: api_etablissement_status, body: api_etablissement_body)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles)
|
||||
.and_return(["attestations_fiscales", "attestations_sociales", "bilans_entreprise_bdf"])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(token_expired)
|
||||
end
|
||||
|
||||
context 'when the SIRET is empty' do
|
||||
subject! { get :show, params: params, format: 'js' }
|
||||
|
@ -55,10 +65,7 @@ describe Champs::SiretController, type: :controller do
|
|||
|
||||
context 'when the API is unavailable' do
|
||||
let(:siret) { '82161143100015' }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:find_etablissement_with_siret).and_raise(ApiEntreprise::API::RequestFailed)
|
||||
end
|
||||
let(:api_etablissement_status) { 503 }
|
||||
|
||||
subject! { get :show, params: params, format: 'js' }
|
||||
|
||||
|
@ -75,10 +82,7 @@ describe Champs::SiretController, type: :controller do
|
|||
|
||||
context 'when the SIRET is valid but unknown' do
|
||||
let(:siret) { '00000000000000' }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:find_etablissement_with_siret).and_return(false)
|
||||
end
|
||||
let(:api_etablissement_status) { 404 }
|
||||
|
||||
subject! { get :show, params: params, format: 'js' }
|
||||
|
||||
|
@ -94,23 +98,17 @@ describe Champs::SiretController, type: :controller do
|
|||
end
|
||||
|
||||
context 'when the SIRET informations are retrieved successfully' do
|
||||
let(:siret) { etablissement.siret }
|
||||
let(:etablissement) { build(:etablissement) }
|
||||
|
||||
before do
|
||||
allow(controller).to receive(:find_etablissement_with_siret).and_return(etablissement)
|
||||
end
|
||||
let(:siret) { '41816609600051' }
|
||||
let(:api_etablissement_status) { 200 }
|
||||
let(:api_etablissement_body) { File.read('spec/fixtures/files/api_entreprise/etablissements.json') }
|
||||
|
||||
subject! { get :show, params: params, format: 'js' }
|
||||
|
||||
it 'populates the etablissement and SIRET on the model' do
|
||||
champ.reload
|
||||
expect(champ.value).to eq(etablissement.siret)
|
||||
expect(champ.etablissement.siret).to eq(etablissement.siret)
|
||||
end
|
||||
|
||||
it 'displays the name of the company' do
|
||||
expect(response.body).to include(etablissement.entreprise_raison_sociale)
|
||||
expect(champ.value).to eq(siret)
|
||||
expect(champ.etablissement.siret).to eq(siret)
|
||||
expect(champ.reload.etablissement.naf).to eq("6202A")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -200,72 +200,18 @@ describe Users::DossiersController, type: :controller do
|
|||
let(:dossier) { create(:dossier, user: user) }
|
||||
let(:siret) { params_siret.delete(' ') }
|
||||
let(:siren) { siret[0..8] }
|
||||
|
||||
let(:api_etablissement_status) { 200 }
|
||||
let(:api_etablissement_body) { File.read('spec/fixtures/files/api_entreprise/etablissements.json') }
|
||||
|
||||
let(:api_entreprise_status) { 200 }
|
||||
let(:api_entreprise_body) { File.read('spec/fixtures/files/api_entreprise/entreprises.json') }
|
||||
|
||||
let(:api_entreprise_effectifs_mensuels_status) { 200 }
|
||||
let(:api_entreprise_effectifs_mensuels_body) { File.read('spec/fixtures/files/api_entreprise/effectifs.json') }
|
||||
let(:annee) { "2020" }
|
||||
let(:mois) { "02" }
|
||||
|
||||
let(:api_entreprise_effectifs_annuels_status) { 200 }
|
||||
let(:api_entreprise_effectifs_annuels_body) { File.read('spec/fixtures/files/api_entreprise/effectifs_annuels.json') }
|
||||
|
||||
let(:api_exercices_status) { 200 }
|
||||
let(:api_exercices_body) { File.read('spec/fixtures/files/api_entreprise/exercices.json') }
|
||||
|
||||
let(:api_association_status) { 200 }
|
||||
let(:api_association_body) { File.read('spec/fixtures/files/api_entreprise/associations.json') }
|
||||
|
||||
let(:api_entreprise_attestation_sociale_status) { 200 }
|
||||
let(:api_entreprise_attestation_sociale_body) { File.read('spec/fixtures/files/api_entreprise/attestation_sociale.json') }
|
||||
|
||||
let(:api_entreprise_attestation_fiscale_status) { 200 }
|
||||
let(:api_entreprise_attestation_fiscale_body) { File.read('spec/fixtures/files/api_entreprise/attestation_fiscale.json') }
|
||||
|
||||
let(:api_entreprise_bilans_bdf_status) { 200 }
|
||||
let(:api_entreprise_bilans_bdf_body) { File.read('spec/fixtures/files/api_entreprise/bilans_entreprise_bdf.json') }
|
||||
|
||||
let(:token_expired) { false }
|
||||
|
||||
def stub_api_entreprise_requests
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/etablissements\/#{siret}?.*token=/)
|
||||
.to_return(status: api_etablissement_status, body: api_etablissement_body)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/entreprises\/#{siren}?.*token=/)
|
||||
.to_return(status: api_entreprise_status, body: api_entreprise_body)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/exercices\/#{siret}?.*token=/)
|
||||
.to_return(status: api_exercices_status, body: api_exercices_body)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/associations\/#{siret}?.*token=/)
|
||||
.to_return(status: api_association_status, body: api_association_body)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_mensuels_acoss_covid\/#{annee}\/#{mois}\/entreprise\/#{siren}?.*token=/)
|
||||
.to_return(body: api_entreprise_effectifs_mensuels_body, status: api_entreprise_effectifs_mensuels_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_annuels_acoss_covid\/#{siren}?.*token=/)
|
||||
.to_return(body: api_entreprise_effectifs_annuels_body, status: api_entreprise_effectifs_annuels_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_sociales_acoss\/#{siren}?.*token=/)
|
||||
.to_return(body: api_entreprise_attestation_sociale_body, status: api_entreprise_attestation_sociale_status)
|
||||
stub_request(:get, "https://storage.entreprise.api.gouv.fr/siade/1569156881-f749d75e2bfd443316e2e02d59015f-attestation_vigilance_acoss.pdf")
|
||||
.to_return(body: "body attestation", status: 200)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_fiscales_dgfip\/#{siren}?.*token=/)
|
||||
.to_return(body: api_entreprise_attestation_fiscale_body, status: api_entreprise_attestation_fiscale_status)
|
||||
stub_request(:get, "https://storage.entreprise.api.gouv.fr/siade/1569156756-f6b7779f99fa95cd60dc03c04fcb-attestation_fiscale_dgfip.pdf")
|
||||
.to_return(body: "body attestation", status: 200)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/bilans_entreprises_bdf\/#{siren}?.*token=/)
|
||||
.to_return(body: api_entreprise_bilans_bdf_body, status: api_entreprise_bilans_bdf_status)
|
||||
end
|
||||
|
||||
before do
|
||||
sign_in(user)
|
||||
stub_api_entreprise_requests
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/etablissements\/#{siret}?.*token=/)
|
||||
.to_return(status: api_etablissement_status, body: api_etablissement_body)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles)
|
||||
.and_return(["attestations_fiscales", "attestations_sociales", "bilans_entreprise_bdf"])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(token_expired)
|
||||
end
|
||||
before { Timecop.freeze(Time.zone.local(2020, 3, 14)) }
|
||||
after { Timecop.return }
|
||||
|
||||
subject! { post :update_siret, params: { id: dossier.id, user: { siret: params_siret } } }
|
||||
|
||||
|
@ -307,68 +253,29 @@ describe Users::DossiersController, type: :controller do
|
|||
let(:params_siret) { '418 166 096 00051' }
|
||||
context 'When API-Entreprise is down' do
|
||||
let(:api_etablissement_status) { 502 }
|
||||
let(:api_body_status) { File.read('spec/fixtures/files/api_entreprise/exercices_unavailable.json') }
|
||||
|
||||
it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_network_error')
|
||||
end
|
||||
|
||||
context 'when API-Entreprise doesn’t know this SIRET' do
|
||||
let(:api_etablissement_status) { 404 }
|
||||
let(:api_body_status) { '' }
|
||||
|
||||
it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_unknown')
|
||||
end
|
||||
|
||||
context 'when default token has expired' do
|
||||
let(:api_etablissement_status) { 200 }
|
||||
let(:api_body_status) { '' }
|
||||
let(:token_expired) { true }
|
||||
|
||||
it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_unknown')
|
||||
end
|
||||
|
||||
context 'when the API returns no Entreprise' do
|
||||
let(:api_entreprise_status) { 404 }
|
||||
let(:api_entreprise_body) { '' }
|
||||
|
||||
it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_unknown')
|
||||
end
|
||||
|
||||
context 'when the API returns no Exercices' do
|
||||
let(:api_exercices_status) { 404 }
|
||||
let(:api_exercices_body) { '' }
|
||||
|
||||
it_behaves_like 'SIRET informations are successfully saved'
|
||||
|
||||
it 'doesn’t save the etablissement exercices' do
|
||||
expect(dossier.reload.etablissement.exercices).to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the RNA doesn’t have informations on the SIRET' do
|
||||
let(:api_association_status) { 404 }
|
||||
let(:api_association_body) { '' }
|
||||
|
||||
it_behaves_like 'SIRET informations are successfully saved'
|
||||
|
||||
it 'doesn’t save the RNA informations' do
|
||||
expect(dossier.reload.etablissement.association?).to be(false)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when all API informations available' do
|
||||
it_behaves_like 'SIRET informations are successfully saved'
|
||||
|
||||
it 'saves the associated informations on the etablissement' do
|
||||
dossier.reload
|
||||
expect(dossier.etablissement.entreprise).to be_present
|
||||
expect(dossier.etablissement.exercices).to be_present
|
||||
expect(dossier.etablissement.association?).to be(true)
|
||||
expect(dossier.etablissement.entreprise_effectif_mensuel).to be_present
|
||||
expect(dossier.etablissement.entreprise_effectif_annuel).to be_present
|
||||
expect(dossier.etablissement.entreprise_attestation_sociale).to be_attached
|
||||
expect(dossier.etablissement.entreprise_attestation_fiscale).to be_attached
|
||||
expect(dossier.etablissement.entreprise_bilans_bdf).to be_present
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -95,7 +95,7 @@ feature 'Creating a new dossier:' do
|
|||
click_on 'Valider'
|
||||
|
||||
expect(page).to have_current_path(etablissement_dossier_path(dossier))
|
||||
expect(page).to have_content('OCTO-TECHNOLOGY')
|
||||
expect(page).to have_content('OCTO TECHNOLOGY')
|
||||
click_on 'Continuer avec ces informations'
|
||||
|
||||
expect(page).to have_current_path(brouillon_dossier_path(dossier))
|
||||
|
|
21
spec/jobs/api_entreprise/association_job_spec.rb
Normal file
21
spec/jobs/api_entreprise/association_job_spec.rb
Normal file
|
@ -0,0 +1,21 @@
|
|||
RSpec.describe ApiEntreprise::AssociationJob, type: :job do
|
||||
let(:siret) { '50480511000013' }
|
||||
let(:etablissement) { create(:etablissement, siret: siret) }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:procedure_id) { procedure.id }
|
||||
let(:body) { File.read('spec/fixtures/files/api_entreprise/associations.json') }
|
||||
let(:status) { 200 }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/associations\/.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
subject { ApiEntreprise::AssociationJob.new.perform(etablissement.id, procedure_id) }
|
||||
|
||||
it 'updates etablissement' do
|
||||
subject
|
||||
expect(Etablissement.find(etablissement.id).association_rna).to eq('W595001988')
|
||||
end
|
||||
end
|
25
spec/jobs/api_entreprise/attestation_fiscale_job_spec.rb
Normal file
25
spec/jobs/api_entreprise/attestation_fiscale_job_spec.rb
Normal file
|
@ -0,0 +1,25 @@
|
|||
RSpec.describe ApiEntreprise::AttestationFiscaleJob, type: :job do
|
||||
let(:etablissement) { create(:etablissement, siret: siret) }
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:user_id) { 1 }
|
||||
let(:body) { File.read('spec/fixtures/files/api_entreprise/attestation_fiscale.json') }
|
||||
let(:status) { 200 }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_fiscales_dgfip\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
stub_request(:get, "https://storage.entreprise.api.gouv.fr/siade/1569156756-f6b7779f99fa95cd60dc03c04fcb-attestation_fiscale_dgfip.pdf")
|
||||
.to_return(body: "body attestation", status: 200)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles).and_return(["attestations_fiscales"])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
subject { ApiEntreprise::AttestationFiscaleJob.new.perform(etablissement.id, procedure.id, user_id) }
|
||||
|
||||
it 'updates etablissement' do
|
||||
subject
|
||||
expect(Etablissement.find(etablissement.id).entreprise_attestation_fiscale).to be_attached
|
||||
end
|
||||
end
|
24
spec/jobs/api_entreprise/attestation_sociale_job_spec.rb
Normal file
24
spec/jobs/api_entreprise/attestation_sociale_job_spec.rb
Normal file
|
@ -0,0 +1,24 @@
|
|||
RSpec.describe ApiEntreprise::AttestationSocialeJob, type: :job do
|
||||
let(:etablissement) { create(:etablissement, siret: siret) }
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:body) { File.read('spec/fixtures/files/api_entreprise/attestation_sociale.json') }
|
||||
let(:status) { 200 }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_sociales_acoss\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
stub_request(:get, "https://storage.entreprise.api.gouv.fr/siade/1569156881-f749d75e2bfd443316e2e02d59015f-attestation_vigilance_acoss.pdf")
|
||||
.to_return(body: "body attestation", status: 200)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles).and_return(["attestations_sociales"])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
subject { ApiEntreprise::AttestationSocialeJob.new.perform(etablissement.id, procedure.id) }
|
||||
|
||||
it 'updates etablissement' do
|
||||
subject
|
||||
expect(Etablissement.find(etablissement.id).entreprise_attestation_sociale).to be_attached
|
||||
end
|
||||
end
|
24
spec/jobs/api_entreprise/bilans_bdf_job_spec.rb
Normal file
24
spec/jobs/api_entreprise/bilans_bdf_job_spec.rb
Normal file
|
@ -0,0 +1,24 @@
|
|||
RSpec.describe ApiEntreprise::BilansBdfJob, type: :job do
|
||||
let(:etablissement) { create(:etablissement, siret: siret) }
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:procedure_id) { procedure.id }
|
||||
let(:body) { File.read('spec/fixtures/files/api_entreprise/bilans_entreprise_bdf.json') }
|
||||
let(:status) { 200 }
|
||||
let(:bilans_bdf) { JSON.parse(body)["bilans"] }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/bilans_entreprises_bdf\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles).and_return(["bilans_entreprise_bdf"])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
subject { ApiEntreprise::BilansBdfJob.new.perform(etablissement.id, procedure_id) }
|
||||
|
||||
it 'updates etablissement' do
|
||||
subject
|
||||
expect(Etablissement.find(etablissement.id).entreprise_bilans_bdf).to eq(bilans_bdf)
|
||||
end
|
||||
end
|
22
spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb
Normal file
22
spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb
Normal file
|
@ -0,0 +1,22 @@
|
|||
RSpec.describe ApiEntreprise::EffectifsAnnuelsJob, type: :job do
|
||||
let(:etablissement) { create(:etablissement, siret: siret) }
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:procedure_id) { procedure.id }
|
||||
let(:body) { File.read('spec/fixtures/files/api_entreprise/effectifs_annuels.json') }
|
||||
let(:status) { 200 }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_annuels_acoss_covid\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
subject { ApiEntreprise::EffectifsAnnuelsJob.new.perform(etablissement.id, procedure_id) }
|
||||
|
||||
it 'updates etablissement' do
|
||||
subject
|
||||
expect(Etablissement.find(etablissement.id).entreprise_effectif_annuel).to eq(100.5)
|
||||
end
|
||||
end
|
28
spec/jobs/api_entreprise/effectifs_job_spec.rb
Normal file
28
spec/jobs/api_entreprise/effectifs_job_spec.rb
Normal file
|
@ -0,0 +1,28 @@
|
|||
RSpec.describe ApiEntreprise::EffectifsJob, type: :job do
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:etablissement) { create(:etablissement, siret: siret) }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:procedure_id) { procedure.id }
|
||||
let(:now) { Time.zone.local(2020, 3, 12) }
|
||||
let(:annee) { "2020" }
|
||||
let(:mois) { "02" }
|
||||
let(:body) { File.read('spec/fixtures/files/api_entreprise/effectifs.json') }
|
||||
let(:status) { 200 }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_mensuels_acoss_covid\/#{annee}\/#{mois}\/entreprise\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
before { Timecop.freeze(now) }
|
||||
after { Timecop.return }
|
||||
|
||||
subject { ApiEntreprise::EffectifsJob.new.perform(etablissement.id, procedure_id) }
|
||||
|
||||
it 'updates etablissement' do
|
||||
subject
|
||||
expect(Etablissement.find(etablissement.id).entreprise_effectif_mensuel).to eq(100.5)
|
||||
end
|
||||
end
|
22
spec/jobs/api_entreprise/entreprise_job_spec.rb
Normal file
22
spec/jobs/api_entreprise/entreprise_job_spec.rb
Normal file
|
@ -0,0 +1,22 @@
|
|||
RSpec.describe ApiEntreprise::EntrepriseJob, type: :job do
|
||||
let(:siret) { '41816609600051' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:etablissement) { create(:etablissement, siret: siret) }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:procedure_id) { procedure.id }
|
||||
let(:body) { File.read('spec/fixtures/files/api_entreprise/entreprises.json') }
|
||||
let(:status) { 200 }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/entreprises\/#{siren}?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
subject { ApiEntreprise::EntrepriseJob.new.perform(etablissement.id, procedure_id) }
|
||||
|
||||
it 'updates etablissement' do
|
||||
subject
|
||||
expect(Etablissement.find(etablissement.id).entreprise_numero_tva_intracommunautaire).to eq('FR16418166096')
|
||||
end
|
||||
end
|
20
spec/jobs/api_entreprise/exercices_job_spec.rb
Normal file
20
spec/jobs/api_entreprise/exercices_job_spec.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
RSpec.describe ApiEntreprise::ExercicesJob, type: :job do
|
||||
let(:siret) { '41816609600051' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:etablissement) { create(:etablissement, siret: siret) }
|
||||
let(:body) { File.read('spec/fixtures/files/api_entreprise/exercices.json') }
|
||||
let(:status) { 200 }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/exercices\/.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
subject { ApiEntreprise::ExercicesJob.new.perform(etablissement.id, procedure.id) }
|
||||
|
||||
it 'updates etablissement' do
|
||||
subject
|
||||
expect(Etablissement.find(etablissement.id).exercices[0].ca).to eq('21009417')
|
||||
end
|
||||
end
|
|
@ -32,6 +32,16 @@ describe ApiEntreprise::API do
|
|||
end
|
||||
end
|
||||
|
||||
context 'when request has bad format' do
|
||||
let(:siren) { '111111111' }
|
||||
let(:status) { 400 }
|
||||
let(:body) { File.read('spec/fixtures/files/api_entreprise/entreprises_not_found.json') }
|
||||
|
||||
it 'raises ApiEntreprise::API::BadFormatRequest' do
|
||||
expect { subject }.to raise_error(ApiEntreprise::API::BadFormatRequest)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when siren infos are private' do
|
||||
let(:siren) { '111111111' }
|
||||
let(:status) { 403 }
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
describe ApiEntreprise::AttestationFiscaleAdapter do
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:user_id) { 1 }
|
||||
let(:adapter) { described_class.new(siren, procedure.id, user_id) }
|
||||
let(:adapter) { described_class.new(siret, procedure.id, user_id) }
|
||||
subject { adapter.to_params }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_fiscales_dgfip\/#{siren}?.*token=/)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_fiscales_dgfip\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles).and_return(["attestations_fiscales"])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
describe ApiEntreprise::AttestationSocialeAdapter do
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:adapter) { described_class.new(siren, procedure.id) }
|
||||
let(:adapter) { described_class.new(siret, procedure.id) }
|
||||
subject { adapter.to_params }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_sociales_acoss\/#{siren}?.*token=/)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_sociales_acoss\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles).and_return(["attestations_sociales"])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
describe ApiEntreprise::BilansBdfAdapter do
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:procedure_id) { procedure.id }
|
||||
let(:adapter) { described_class.new(siren, procedure_id) }
|
||||
let(:adapter) { described_class.new(siret, procedure_id) }
|
||||
subject { adapter.to_params }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/bilans_entreprises_bdf\/#{siren}?.*token=/)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/bilans_entreprises_bdf\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles).and_return(["bilans_entreprise_bdf"])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
describe ApiEntreprise::EffectifsAdapter do
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:procedure_id) { procedure.id }
|
||||
let(:annee) { "2020" }
|
||||
let(:mois) { "02" }
|
||||
let(:adapter) { described_class.new(siren, procedure_id, annee, mois) }
|
||||
let(:adapter) { described_class.new(siret, procedure_id, annee, mois) }
|
||||
subject { adapter.to_params }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_mensuels_acoss_covid\/#{annee}\/#{mois}\/entreprise\/#{siren}?.*token=/)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_mensuels_acoss_covid\/#{annee}\/#{mois}\/entreprise\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
describe ApiEntreprise::EffectifsAnnuelsAdapter do
|
||||
let(:siret) { '41816609600069' }
|
||||
let(:siren) { '418166096' }
|
||||
let(:procedure) { create(:procedure) }
|
||||
let(:procedure_id) { procedure.id }
|
||||
let(:adapter) { described_class.new(siren, procedure_id) }
|
||||
let(:adapter) { described_class.new(siret, procedure_id) }
|
||||
subject { adapter.to_params }
|
||||
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_annuels_acoss_covid\/#{siren}?.*token=/)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_annuels_acoss_covid\/#{siren}\?.*token=/)
|
||||
.to_return(body: body, status: status)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
|
|
@ -1,129 +1,44 @@
|
|||
describe ApiEntrepriseService do
|
||||
describe '#get_etablissement_params_for_siret' do
|
||||
describe '#create_etablissement' do
|
||||
before do
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/entreprises\/#{siren}?.*token=/)
|
||||
.to_return(body: entreprises_body, status: entreprises_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/etablissements\/#{siret}?.*token=/)
|
||||
.to_return(body: etablissements_body, status: etablissements_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/exercices\/.*token=/)
|
||||
.to_return(body: exercices_body, status: exercices_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/associations\/.*token=/)
|
||||
.to_return(body: associations_body, status: associations_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_mensuels_acoss_covid\/#{annee}\/#{mois}\/entreprise\/#{siren}?.*token=/)
|
||||
.to_return(body: effectifs_mensuels_body, status: effectifs_mensuels_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_annuels_acoss_covid\/#{siren}?.*token=/)
|
||||
.to_return(body: effectifs_annuels_body, status: effectifs_annuels_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_sociales_acoss\/#{siren}?.*token=/)
|
||||
.to_return(body: attestation_sociale_body, status: attestation_sociale_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_sociales_acoss\/#{siren}?.*token=/)
|
||||
.to_return(body: attestation_sociale_body, status: attestation_sociale_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/attestations_fiscales_dgfip\/#{siren}?.*token=/)
|
||||
.to_return(body: attestation_fiscale_body, status: attestation_fiscale_status)
|
||||
stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/bilans_entreprises_bdf\/#{siren}?.*token=/)
|
||||
.to_return(body: bilans_bdf_body, status: bilans_bdf_status)
|
||||
end
|
||||
|
||||
before { Timecop.freeze(Time.zone.local(2020, 3, 14)) }
|
||||
after { Timecop.return }
|
||||
|
||||
let(:siren) { '418166096' }
|
||||
let(:siret) { '41816609600051' }
|
||||
let(:rna) { 'W595001988' }
|
||||
|
||||
let(:entreprises_status) { 200 }
|
||||
let(:entreprises_body) { File.read('spec/fixtures/files/api_entreprise/entreprises.json') }
|
||||
|
||||
let(:etablissements_status) { 200 }
|
||||
let(:etablissements_body) { File.read('spec/fixtures/files/api_entreprise/etablissements.json') }
|
||||
|
||||
let(:effectifs_mensuels_status) { 200 }
|
||||
let(:effectifs_mensuels_body) { File.read('spec/fixtures/files/api_entreprise/effectifs.json') }
|
||||
let(:annee) { "2020" }
|
||||
let(:mois) { "02" }
|
||||
let(:effectif_mensuel) { 100.5 }
|
||||
|
||||
let(:effectifs_annuels_status) { 200 }
|
||||
let(:effectifs_annuels_body) { File.read('spec/fixtures/files/api_entreprise/effectifs_annuels.json') }
|
||||
let(:effectif_annuel) { 100.5 }
|
||||
|
||||
let(:attestation_sociale_status) { 200 }
|
||||
let(:attestation_sociale_body) { File.read('spec/fixtures/files/api_entreprise/attestation_sociale.json') }
|
||||
let(:attestation_sociale_url) { "https://storage.entreprise.api.gouv.fr/siade/1569156881-f749d75e2bfd443316e2e02d59015f-attestation_vigilance_acoss.pdf" }
|
||||
|
||||
let(:attestation_fiscale_status) { 200 }
|
||||
let(:attestation_fiscale_body) { File.read('spec/fixtures/files/api_entreprise/attestation_fiscale.json') }
|
||||
let(:attestation_fiscale_url) { "https://storage.entreprise.api.gouv.fr/siade/1569156756-f6b7779f99fa95cd60dc03c04fcb-attestation_fiscale_dgfip.pdf" }
|
||||
|
||||
let(:bilans_bdf_status) { 200 }
|
||||
let(:bilans_bdf_body) { File.read('spec/fixtures/files/api_entreprise/bilans_entreprise_bdf.json') }
|
||||
let(:bilans_bdf) { JSON.parse(bilans_bdf_body, symbolize_names: true)[:bilans] }
|
||||
|
||||
let(:exercices_status) { 200 }
|
||||
let(:exercices_body) { File.read('spec/fixtures/files/api_entreprise/exercices.json') }
|
||||
|
||||
let(:associations_status) { 200 }
|
||||
let(:associations_body) { File.read('spec/fixtures/files/api_entreprise/associations.json') }
|
||||
|
||||
let(:procedure) { create(:procedure, api_entreprise_token: 'un-jeton') }
|
||||
let(:result) { ApiEntrepriseService.get_etablissement_params_for_siret(siret, procedure.id) }
|
||||
let(:dossier) { create(:dossier, procedure: procedure) }
|
||||
let(:subject) { ApiEntrepriseService.create_etablissement(dossier, siret, procedure.id) }
|
||||
|
||||
before do
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles)
|
||||
.and_return(["attestations_sociales", "attestations_fiscales", "bilans_entreprise_bdf"])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles).and_return([])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
context 'when service is up' do
|
||||
it 'should fetch etablissement params' do
|
||||
expect(result[:entreprise_siren]).to eq(siren)
|
||||
expect(result[:siret]).to eq(siret)
|
||||
expect(result[:association_rna]).to eq(rna)
|
||||
expect(result[:exercices_attributes]).to_not be_empty
|
||||
expect(result[:entreprise_effectif_mensuel]).to eq(effectif_mensuel)
|
||||
expect(result[:entreprise_effectif_annuel]).to eq(effectif_annuel)
|
||||
expect(result[:entreprise_attestation_sociale_url]).to eq(attestation_sociale_url)
|
||||
expect(result[:entreprise_attestation_fiscale_url]).to eq(attestation_fiscale_url)
|
||||
expect(result[:entreprise_bilans_bdf]).to eq(bilans_bdf)
|
||||
end
|
||||
expect(subject[:siret]).to eq(siret)
|
||||
end
|
||||
|
||||
context 'when exercices api down' do
|
||||
let(:exercices_status) { 400 }
|
||||
let(:exercices_body) { '' }
|
||||
|
||||
it 'should fetch etablissement params' do
|
||||
expect(result[:entreprise_siren]).to eq(siren)
|
||||
expect(result[:siret]).to eq(siret)
|
||||
expect(result[:exercices_attributes]).to be_nil
|
||||
[
|
||||
ApiEntreprise::EntrepriseJob, ApiEntreprise::AssociationJob, ApiEntreprise::ExercicesJob,
|
||||
ApiEntreprise::EffectifsJob, ApiEntreprise::EffectifsAnnuelsJob, ApiEntreprise::AttestationSocialeJob,
|
||||
ApiEntreprise::BilansBdfJob
|
||||
].each do |job|
|
||||
it "should enqueue #{job.class.name}" do
|
||||
expect { subject }.to have_enqueued_job(job)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when associations api down' do
|
||||
let(:associations_status) { 400 }
|
||||
let(:associations_body) { '' }
|
||||
|
||||
it 'should fetch etablissement params' do
|
||||
expect(result[:entreprise_siren]).to eq(siren)
|
||||
expect(result[:siret]).to eq(siret)
|
||||
expect(result[:association_rna]).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
context 'when entreprise api down' do
|
||||
let(:entreprises_status) { 400 }
|
||||
let(:entreprises_body) { '' }
|
||||
|
||||
it 'should raise ApiEntreprise::API::RequestFailed' do
|
||||
expect { result }.to raise_error(ApiEntreprise::API::RequestFailed)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when etablissement api down' do
|
||||
let(:etablissements_status) { 400 }
|
||||
let(:etablissements_status) { 504 }
|
||||
let(:etablissements_body) { '' }
|
||||
|
||||
it 'should raise ApiEntreprise::API::RequestFailed' do
|
||||
expect { result }.to raise_error(ApiEntreprise::API::RequestFailed)
|
||||
expect { subject }.to raise_error(ApiEntreprise::API::RequestFailed)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -132,16 +47,7 @@ describe ApiEntrepriseService do
|
|||
let(:etablissements_body) { '' }
|
||||
|
||||
it 'should return nil' do
|
||||
expect(result).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
context 'when entreprise not found' do
|
||||
let(:etablissements_status) { 404 }
|
||||
let(:etablissements_body) { '' }
|
||||
|
||||
it 'should return nil' do
|
||||
expect(result).to be_nil
|
||||
expect(subject).to be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -6,27 +6,16 @@ describe 'users/dossiers/etablissement.html.haml', type: :view do
|
|||
before do
|
||||
sign_in dossier.user
|
||||
assign(:dossier, dossier)
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:roles).and_return([])
|
||||
allow_any_instance_of(ApiEntrepriseToken).to receive(:expired?).and_return(false)
|
||||
end
|
||||
|
||||
subject! { render }
|
||||
|
||||
it 'affiche les informations de l’établissement' do
|
||||
expect(rendered).to have_text(etablissement.entreprise_raison_sociale)
|
||||
expect(rendered).to have_text(etablissement.siret)
|
||||
end
|
||||
|
||||
it 'n’affiche pas publiquement les derniers exercices comptables' do
|
||||
expect(rendered).not_to have_text(number_to_currency(etablissement.exercices.first.ca))
|
||||
end
|
||||
|
||||
context 'quand l’établissement est une association' do
|
||||
let(:etablissement) { create(:etablissement, :is_association) }
|
||||
|
||||
it 'affiche les informations de l’association' do
|
||||
expect(rendered).to have_text(etablissement.association_titre)
|
||||
end
|
||||
end
|
||||
|
||||
context 'etablissement avec infos non diffusables' do
|
||||
let(:etablissement) { create(:etablissement, :with_exercices, :non_diffusable) }
|
||||
it "affiche uniquement le nom de l'établissement si infos non diffusables" do
|
||||
|
|
Loading…
Reference in a new issue