diff --git a/app/controllers/champs/siret_controller.rb b/app/controllers/champs/siret_controller.rb index 0eabd821e..a099f25c4 100644 --- a/app/controllers/champs/siret_controller.rb +++ b/app/controllers/champs/siret_controller.rb @@ -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 diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index ae24cf0ff..4d9c75b04 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -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) diff --git a/app/javascript/components/MapEditor/index.js b/app/javascript/components/MapEditor/index.js index aa329b524..04c55a708 100644 --- a/app/javascript/components/MapEditor/index.js +++ b/app/javascript/components/MapEditor/index.js @@ -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( - new DOMParser().parseFromString(event.target.result, 'text/xml') - ); + 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 ( <>
+
-

- Importer un fichier GPX -

-
-
- + {importInputs.map((input) => ( +
+ onFileImport(e, input.id)} + /> + {input.hasValue && ( + removeInputFile(e, input.id)} + > + )} +
+ ))}
= date_update + [today.strftime("%Y"), today.strftime("%m")] + else + date = today - 1.month + [date.strftime("%Y"), date.strftime("%m")] + end + end +end diff --git a/app/jobs/api_entreprise/entreprise_job.rb b/app/jobs/api_entreprise/entreprise_job.rb new file mode 100644 index 000000000..e22443a2d --- /dev/null +++ b/app/jobs/api_entreprise/entreprise_job.rb @@ -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 diff --git a/app/jobs/api_entreprise/exercices_job.rb b/app/jobs/api_entreprise/exercices_job.rb new file mode 100644 index 000000000..caf20a86b --- /dev/null +++ b/app/jobs/api_entreprise/exercices_job.rb @@ -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 diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb index 779825c4a..7538ed4f5 100644 --- a/app/jobs/application_job.rb +++ b/app/jobs/application_job.rb @@ -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 diff --git a/app/lib/api_entreprise/adapter.rb b/app/lib/api_entreprise/adapter.rb index 4e26e8a1f..fdf5527e4 100644 --- a/app/lib/api_entreprise/adapter.rb +++ b/app/lib/api_entreprise/adapter.rb @@ -25,4 +25,8 @@ class ApiEntreprise::Adapter def valid_params?(params) !params.has_value?(UNAVAILABLE) end + + def siren + @siret[0..8] + end end diff --git a/app/lib/api_entreprise/api.rb b/app/lib/api_entreprise/api.rb index 884cb1a3c..320ccd138 100644 --- a/app/lib/api_entreprise/api.rb +++ b/app/lib/api_entreprise/api.rb @@ -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 diff --git a/app/lib/api_entreprise/attestation_fiscale_adapter.rb b/app/lib/api_entreprise/attestation_fiscale_adapter.rb index 81489888a..f1e0adf39 100644 --- a/app/lib/api_entreprise/attestation_fiscale_adapter.rb +++ b/app/lib/api_entreprise/attestation_fiscale_adapter.rb @@ -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 diff --git a/app/lib/api_entreprise/attestation_sociale_adapter.rb b/app/lib/api_entreprise/attestation_sociale_adapter.rb index d901c0066..d43b19452 100644 --- a/app/lib/api_entreprise/attestation_sociale_adapter.rb +++ b/app/lib/api_entreprise/attestation_sociale_adapter.rb @@ -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 diff --git a/app/lib/api_entreprise/bilans_bdf_adapter.rb b/app/lib/api_entreprise/bilans_bdf_adapter.rb index 69ee6b6ec..02066545b 100644 --- a/app/lib/api_entreprise/bilans_bdf_adapter.rb +++ b/app/lib/api_entreprise/bilans_bdf_adapter.rb @@ -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 diff --git a/app/lib/api_entreprise/effectifs_adapter.rb b/app/lib/api_entreprise/effectifs_adapter.rb index ae768a3f9..ceb5f9906 100644 --- a/app/lib/api_entreprise/effectifs_adapter.rb +++ b/app/lib/api_entreprise/effectifs_adapter.rb @@ -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 diff --git a/app/lib/api_entreprise/effectifs_annuels_adapter.rb b/app/lib/api_entreprise/effectifs_annuels_adapter.rb index 2c56b41f6..cfc679cd6 100644 --- a/app/lib/api_entreprise/effectifs_annuels_adapter.rb +++ b/app/lib/api_entreprise/effectifs_annuels_adapter.rb @@ -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 diff --git a/app/lib/api_entreprise/entreprise_adapter.rb b/app/lib/api_entreprise/entreprise_adapter.rb index c1b4b8f4c..d15f4d29e 100644 --- a/app/lib/api_entreprise/entreprise_adapter.rb +++ b/app/lib/api_entreprise/entreprise_adapter.rb @@ -2,7 +2,6 @@ class ApiEntreprise::EntrepriseAdapter < ApiEntreprise::Adapter private def get_resource - siren = @siret[0..8] ApiEntreprise::API.entreprise(siren, @procedure_id) end diff --git a/app/services/api_entreprise_service.rb b/app/services/api_entreprise_service.rb index 3c7457075..1ac1e273e 100644 --- a/app/services/api_entreprise_service.rb +++ b/app/services/api_entreprise_service.rb @@ -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 - end + etablissement = dossier.build_etablissement(etablissement_params) + etablissement.save - 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) + [ + 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 - end + ApiEntreprise::AttestationFiscaleJob.perform_later(etablissement.id, dossier.procedure.id, user_id) - 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 diff --git a/app/views/users/dossiers/etablissement.html.haml b/app/views/users/dossiers/etablissement.html.haml index 5c469a98d..c54b26bbe 100644 --- a/app/views/users/dossiers/etablissement.html.haml +++ b/app/views/users/dossiers/etablissement.html.haml @@ -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' diff --git a/app/views/users/dossiers/etablissement/_infos_association.html.haml b/app/views/users/dossiers/etablissement/_infos_association.html.haml deleted file mode 100644 index d8afcbdb6..000000000 --- a/app/views/users/dossiers/etablissement/_infos_association.html.haml +++ /dev/null @@ -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) diff --git a/app/views/users/dossiers/etablissement/_infos_entreprise.html.haml b/app/views/users/dossiers/etablissement/_infos_entreprise.html.haml index 21ab7a5f8..3e43095af 100644 --- a/app/views/users/dossiers/etablissement/_infos_entreprise.html.haml +++ b/app/views/users/dossiers/etablissement/_infos_entreprise.html.haml @@ -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}", diff --git a/spec/controllers/champs/siret_controller_spec.rb b/spec/controllers/champs/siret_controller_spec.rb index cc9929ebb..4bd3e4eb3 100644 --- a/spec/controllers/champs/siret_controller_spec.rb +++ b/spec/controllers/champs/siret_controller_spec.rb @@ -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 diff --git a/spec/controllers/users/dossiers_controller_spec.rb b/spec/controllers/users/dossiers_controller_spec.rb index ad0bdae98..a64a2bd94 100644 --- a/spec/controllers/users/dossiers_controller_spec.rb +++ b/spec/controllers/users/dossiers_controller_spec.rb @@ -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 diff --git a/spec/features/users/dossier_creation_spec.rb b/spec/features/users/dossier_creation_spec.rb index 6c3edc750..91a9c971c 100644 --- a/spec/features/users/dossier_creation_spec.rb +++ b/spec/features/users/dossier_creation_spec.rb @@ -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)) diff --git a/spec/jobs/api_entreprise/association_job_spec.rb b/spec/jobs/api_entreprise/association_job_spec.rb new file mode 100644 index 000000000..8d8b3cb94 --- /dev/null +++ b/spec/jobs/api_entreprise/association_job_spec.rb @@ -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 diff --git a/spec/jobs/api_entreprise/attestation_fiscale_job_spec.rb b/spec/jobs/api_entreprise/attestation_fiscale_job_spec.rb new file mode 100644 index 000000000..7108f94d2 --- /dev/null +++ b/spec/jobs/api_entreprise/attestation_fiscale_job_spec.rb @@ -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 diff --git a/spec/jobs/api_entreprise/attestation_sociale_job_spec.rb b/spec/jobs/api_entreprise/attestation_sociale_job_spec.rb new file mode 100644 index 000000000..d68594ecf --- /dev/null +++ b/spec/jobs/api_entreprise/attestation_sociale_job_spec.rb @@ -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 diff --git a/spec/jobs/api_entreprise/bilans_bdf_job_spec.rb b/spec/jobs/api_entreprise/bilans_bdf_job_spec.rb new file mode 100644 index 000000000..b70cd79c0 --- /dev/null +++ b/spec/jobs/api_entreprise/bilans_bdf_job_spec.rb @@ -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 diff --git a/spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb b/spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb new file mode 100644 index 000000000..765f4be1b --- /dev/null +++ b/spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb @@ -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 diff --git a/spec/jobs/api_entreprise/effectifs_job_spec.rb b/spec/jobs/api_entreprise/effectifs_job_spec.rb new file mode 100644 index 000000000..77e87bf36 --- /dev/null +++ b/spec/jobs/api_entreprise/effectifs_job_spec.rb @@ -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 diff --git a/spec/jobs/api_entreprise/entreprise_job_spec.rb b/spec/jobs/api_entreprise/entreprise_job_spec.rb new file mode 100644 index 000000000..74b1e475d --- /dev/null +++ b/spec/jobs/api_entreprise/entreprise_job_spec.rb @@ -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 diff --git a/spec/jobs/api_entreprise/exercices_job_spec.rb b/spec/jobs/api_entreprise/exercices_job_spec.rb new file mode 100644 index 000000000..db25b91fc --- /dev/null +++ b/spec/jobs/api_entreprise/exercices_job_spec.rb @@ -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 diff --git a/spec/lib/api_entreprise/api_spec.rb b/spec/lib/api_entreprise/api_spec.rb index 3914fffbd..fda013960 100644 --- a/spec/lib/api_entreprise/api_spec.rb +++ b/spec/lib/api_entreprise/api_spec.rb @@ -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 } diff --git a/spec/lib/api_entreprise/attestation_fiscale_adapter_spec.rb b/spec/lib/api_entreprise/attestation_fiscale_adapter_spec.rb index dfc19b6bb..377c459ea 100644 --- a/spec/lib/api_entreprise/attestation_fiscale_adapter_spec.rb +++ b/spec/lib/api_entreprise/attestation_fiscale_adapter_spec.rb @@ -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) diff --git a/spec/lib/api_entreprise/attestation_sociale_adapter_spec.rb b/spec/lib/api_entreprise/attestation_sociale_adapter_spec.rb index 9c38eb95e..79660114d 100644 --- a/spec/lib/api_entreprise/attestation_sociale_adapter_spec.rb +++ b/spec/lib/api_entreprise/attestation_sociale_adapter_spec.rb @@ -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) diff --git a/spec/lib/api_entreprise/bilans_bdf_adapter_spec.rb b/spec/lib/api_entreprise/bilans_bdf_adapter_spec.rb index 572ea02ae..d34e9aa4c 100644 --- a/spec/lib/api_entreprise/bilans_bdf_adapter_spec.rb +++ b/spec/lib/api_entreprise/bilans_bdf_adapter_spec.rb @@ -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) diff --git a/spec/lib/api_entreprise/effectifs_adapter_spec.rb b/spec/lib/api_entreprise/effectifs_adapter_spec.rb index a34a4740a..bf0e85b6d 100644 --- a/spec/lib/api_entreprise/effectifs_adapter_spec.rb +++ b/spec/lib/api_entreprise/effectifs_adapter_spec.rb @@ -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 diff --git a/spec/lib/api_entreprise/effectifs_annuels_adapter_spec.rb b/spec/lib/api_entreprise/effectifs_annuels_adapter_spec.rb index 0c33626c9..37d858c8e 100644 --- a/spec/lib/api_entreprise/effectifs_annuels_adapter_spec.rb +++ b/spec/lib/api_entreprise/effectifs_annuels_adapter_spec.rb @@ -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 diff --git a/spec/services/api_entreprise_service_spec.rb b/spec/services/api_entreprise_service_spec.rb index 7b2e33cb7..ca0629328 100644 --- a/spec/services/api_entreprise_service_spec.rb +++ b/spec/services/api_entreprise_service_spec.rb @@ -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) + expect(subject[:siret]).to eq(siret) end - 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 - 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) + [ + 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 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 diff --git a/spec/views/users/dossiers/etablissement.html.haml_spec.rb b/spec/views/users/dossiers/etablissement.html.haml_spec.rb index a7d2cc3d7..df6399e82 100644 --- a/spec/views/users/dossiers/etablissement.html.haml_spec.rb +++ b/spec/views/users/dossiers/etablissement.html.haml_spec.rb @@ -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