demarches-normaliennes/app/services/api_entreprise_service.rb

107 lines
3.6 KiB
Ruby

# frozen_string_literal: true
class APIEntrepriseService
class << self
# 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
#
# Raises a APIEntreprise::API::Error::RequestFailed exception on transient errors
# (timeout, 5XX HTTP error code, etc.)
#
def create_etablissement(dossier_or_champ, siret, user_id = nil)
procedure_id = dossier_or_champ.procedure.id
etablissement_params = APIEntreprise::EtablissementAdapter.new(siret, procedure_id).to_params
return nil if etablissement_params.empty?
entreprise_params = APIEntreprise::EntrepriseAdapter.new(siret, procedure_id).to_params
etablissement_params.merge!(entreprise_params) if entreprise_params.any?
etablissement = dossier_or_champ.build_etablissement(etablissement_params)
etablissement.save!
if dossier_or_champ.is_a?(Champ)
dossier_or_champ.update!(value_json: APIGeoService.parse_etablissement_address(etablissement))
end
perform_later_fetch_jobs(etablissement, procedure_id, user_id)
etablissement
end
def create_etablissement_as_degraded_mode(dossier_or_champ, siret, user_id = nil)
etablissement = dossier_or_champ.build_etablissement(siret: siret)
etablissement.save!
procedure_id = dossier_or_champ.procedure.id
perform_later_fetch_jobs(etablissement, procedure_id, user_id, wait: 30.minutes)
etablissement
end
def update_etablissement_from_degraded_mode(etablissement, procedure_id)
siret = etablissement.siret
etablissement_params = APIEntreprise::EtablissementAdapter.new(siret, procedure_id).to_params
return nil if etablissement_params.empty?
etablissement.update!(etablissement_params)
if etablissement.champ.present?
etablissement.champ.update!(value_json: APIGeoService.parse_etablissement_address(etablissement))
end
etablissement
end
def perform_later_fetch_jobs(etablissement, procedure_id, user_id, wait: nil)
jobs = [
APIEntreprise::EntrepriseJob, APIEntreprise::ExtraitKbisJob, APIEntreprise::TvaJob,
APIEntreprise::AssociationJob, APIEntreprise::ExercicesJob,
APIEntreprise::EffectifsJob, APIEntreprise::EffectifsAnnuelsJob, APIEntreprise::AttestationSocialeJob,
APIEntreprise::BilansBdfJob
]
if etablissement.as_degraded_mode?
jobs << APIEntreprise::EtablissementJob
end
jobs.each do |job|
job.set(wait:).perform_later(etablissement.id, procedure_id)
end
APIEntreprise::AttestationFiscaleJob.set(wait:).perform_later(etablissement.id, procedure_id, user_id)
end
# See: https://entreprise.api.gouv.fr/developpeurs#surveillance-etat-fournisseurs
def api_insee_up?
api_up?("https://entreprise.api.gouv.fr/ping/insee/sirene")
end
def api_djepva_up?
api_up?("https://entreprise.api.gouv.fr/ping/djepva/api-association")
end
def service_unavailable_error?(error, target:)
return false if !error.try(:network_error?)
return true if target == :insee && !APIEntrepriseService.api_insee_up?
return true if target == :djepva && !APIEntrepriseService.api_djepva_up?
error.is_a?(APIEntreprise::API::Error::ServiceUnavailable)
end
private
def api_up?(url)
response = Typhoeus.get(url, timeout: 1)
if response.success?
JSON.parse(response.body).fetch('status') == 'ok'
else
false
end
rescue => e
Sentry.capture_exception(e)
false
end
end
end