diff --git a/app/controllers/champs/siret_controller.rb b/app/controllers/champs/siret_controller.rb index fbf8d2495..2ef8aefd5 100644 --- a/app/controllers/champs/siret_controller.rb +++ b/app/controllers/champs/siret_controller.rb @@ -17,9 +17,22 @@ class Champs::SiretController < ApplicationController begin etablissement = find_etablissement_with_siret - rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::BadGateway, APIEntreprise::API::Error::TimedOut, APIEntreprise::API::Error::ServiceUnavailable, APIEntrepriseToken::TokenError - # i18n-tasks-use t('errors.messages.siret_network_error') - return siret_error(:network_error) + rescue => error + if error.try(:network_error?) && !APIEntrepriseService.api_up? + # TODO: notify ops + etablissement = APIEntrepriseService.create_etablissement_as_degraded_mode(@champ, @siret, current_user.id) + + if !@champ.nil? + @champ.update!(value: etablissement.siret, etablissement: etablissement) + end + + @siret = :api_entreprise_down + return + else + Sentry.capture_exception(error, extra: { dossier_id: @champ.dossier_id, siret: @siret }) + # i18n-tasks-use t('errors.messages.siret_network_error') + return siret_error(:network_error) + end end if etablissement.nil? # i18n-tasks-use t('errors.messages.siret_not_found') diff --git a/app/views/shared/champs/siret/_etablissement.html.haml b/app/views/shared/champs/siret/_etablissement.html.haml index ef2174a2d..9b376a7d2 100644 --- a/app/views/shared/champs/siret/_etablissement.html.haml +++ b/app/views/shared/champs/siret/_etablissement.html.haml @@ -9,6 +9,12 @@ - when :network_error = t('errors.messages.siret_network_error') +- when :api_entreprise_down + = t('errors.messages.api_entreprise_down') + - else - - if siret.present? && siret == etablissement&.siret - = render EditableChamp::EtablissementTitreComponent.new(etablissement: etablissement) + - if siret.present? + - if siret == etablissement&.siret && raison_sociale_or_name(etablissement).present? + = render EditableChamp::EtablissementTitreComponent.new(etablissement: etablissement) + - else + Ce SIRET existe, nous en récupérons les informations. diff --git a/config/locales/fr.yml b/config/locales/fr.yml index ff8847661..1d3178bbd 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -371,6 +371,7 @@ fr: siret_unknown: 'Désolé, nous n’avons pas trouvé d’établissement enregistré correspondant à ce numéro SIRET.' siret_network_error: 'Désolé, la récupération des informations SIRET est temporairement indisponible. Veuillez réessayer dans quelques instants.' siret_not_found: 'Nous n’avons pas trouvé d’établissement correspondant à ce numéro de SIRET.' + api_entreprise_down: 'Notre fournisseur de données semble en panne, nous récupérerons les données plus tard.' # etablissement_fail: 'Désolé, nous n’avons pas réussi à enregistrer l’établissement correspondant à ce numéro SIRET' france_connect: connexion: "Erreur lors de la connexion à France Connect." diff --git a/spec/controllers/champs/siret_controller_spec.rb b/spec/controllers/champs/siret_controller_spec.rb index f7ae6a832..83fa28e77 100644 --- a/spec/controllers/champs/siret_controller_spec.rb +++ b/spec/controllers/champs/siret_controller_spec.rb @@ -66,10 +66,14 @@ describe Champs::SiretController, type: :controller do end end - context 'when the API is unavailable' do + context 'when the API is unavailable due to network error' do let(:siret) { '82161143100015' } let(:api_etablissement_status) { 503 } + before do + expect(APIEntrepriseService).to receive(:api_up?).and_return(true) + end + subject! { get :show, params: params, format: :turbo_stream } it 'clears the etablissement and SIRET on the model' do @@ -83,6 +87,28 @@ describe Champs::SiretController, type: :controller do end end + context 'when the API is unavailable due to an api maintenance or pb' do + let(:siret) { '82161143100015' } + let(:api_etablissement_status) { 502 } + + before do + expect(APIEntrepriseService).to receive(:api_up?).and_return(false) + end + + subject! { get :show, params: params, format: :turbo_stream } + + it 'saves the etablissement in degraded mode and SIRET on the model' do + champ.reload + expect(champ.value).to eq(siret) + expect(champ.etablissement.siret).to eq(siret) + expect(champ.etablissement.as_degraded_mode?).to be true + end + + it 'displays a “API entreprise down” error message' do + expect(response.body).to include('Notre fournisseur de données semble en panne, nous récupérerons les données plus tard.') + end + end + context 'when the SIRET is valid but unknown' do let(:siret) { '00000000000000' } let(:api_etablissement_status) { 404 }