diff --git a/app/jobs/api_entreprise/association_job.rb b/app/jobs/api_entreprise/association_job.rb index fe2716c31..26307854c 100644 --- a/app/jobs/api_entreprise/association_job.rb +++ b/app/jobs/api_entreprise/association_job.rb @@ -1,6 +1,6 @@ class ApiEntreprise::AssociationJob < ApiEntreprise::Job def perform(etablissement_id, procedure_id) - etablissement = Etablissement.find(etablissement_id) + find_etablissement(etablissement_id) etablissement_params = ApiEntreprise::RNAAdapter.new(etablissement.siret, procedure_id).to_params etablissement.update!(etablissement_params) end diff --git a/app/jobs/api_entreprise/attestation_fiscale_job.rb b/app/jobs/api_entreprise/attestation_fiscale_job.rb index aaa3c8cd3..ab6168f00 100644 --- a/app/jobs/api_entreprise/attestation_fiscale_job.rb +++ b/app/jobs/api_entreprise/attestation_fiscale_job.rb @@ -1,6 +1,6 @@ class ApiEntreprise::AttestationFiscaleJob < ApiEntreprise::Job def perform(etablissement_id, procedure_id, user_id) - etablissement = Etablissement.find(etablissement_id) + find_etablissement(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? diff --git a/app/jobs/api_entreprise/attestation_sociale_job.rb b/app/jobs/api_entreprise/attestation_sociale_job.rb index 581ed8037..789afa650 100644 --- a/app/jobs/api_entreprise/attestation_sociale_job.rb +++ b/app/jobs/api_entreprise/attestation_sociale_job.rb @@ -1,6 +1,6 @@ class ApiEntreprise::AttestationSocialeJob < ApiEntreprise::Job def perform(etablissement_id, procedure_id) - etablissement = Etablissement.find(etablissement_id) + find_etablissement(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? diff --git a/app/jobs/api_entreprise/bilans_bdf_job.rb b/app/jobs/api_entreprise/bilans_bdf_job.rb index 61c198ab7..7501d3f37 100644 --- a/app/jobs/api_entreprise/bilans_bdf_job.rb +++ b/app/jobs/api_entreprise/bilans_bdf_job.rb @@ -1,6 +1,6 @@ class ApiEntreprise::BilansBdfJob < ApiEntreprise::Job def perform(etablissement_id, procedure_id) - etablissement = Etablissement.find(etablissement_id) + find_etablissement(etablissement_id) etablissement_params = ApiEntreprise::BilansBdfAdapter.new(etablissement.siret, procedure_id).to_params etablissement.update!(etablissement_params) end diff --git a/app/jobs/api_entreprise/effectifs_annuels_job.rb b/app/jobs/api_entreprise/effectifs_annuels_job.rb index d0c1c497e..9bc5e9c62 100644 --- a/app/jobs/api_entreprise/effectifs_annuels_job.rb +++ b/app/jobs/api_entreprise/effectifs_annuels_job.rb @@ -1,6 +1,6 @@ class ApiEntreprise::EffectifsAnnuelsJob < ApiEntreprise::Job def perform(etablissement_id, procedure_id) - etablissement = Etablissement.find(etablissement_id) + find_etablissement(etablissement_id) etablissement_params = ApiEntreprise::EffectifsAnnuelsAdapter.new(etablissement.siret, procedure_id).to_params etablissement.update!(etablissement_params) end diff --git a/app/jobs/api_entreprise/effectifs_job.rb b/app/jobs/api_entreprise/effectifs_job.rb index 321309e0b..5acf8c55f 100644 --- a/app/jobs/api_entreprise/effectifs_job.rb +++ b/app/jobs/api_entreprise/effectifs_job.rb @@ -1,6 +1,6 @@ class ApiEntreprise::EffectifsJob < ApiEntreprise::Job def perform(etablissement_id, procedure_id) - etablissement = Etablissement.find(etablissement_id) + find_etablissement(etablissement_id) # may 2020 is at the moment the most actual info for effectifs endpoint etablissement_params = ApiEntreprise::EffectifsAdapter.new(etablissement.siret, procedure_id, "2020", "05").to_params etablissement.update!(etablissement_params) diff --git a/app/jobs/api_entreprise/entreprise_job.rb b/app/jobs/api_entreprise/entreprise_job.rb index 02cf5caaf..b6317fd32 100644 --- a/app/jobs/api_entreprise/entreprise_job.rb +++ b/app/jobs/api_entreprise/entreprise_job.rb @@ -1,6 +1,6 @@ class ApiEntreprise::EntrepriseJob < ApiEntreprise::Job def perform(etablissement_id, procedure_id) - etablissement = Etablissement.find(etablissement_id) + find_etablissement(etablissement_id) etablissement_params = ApiEntreprise::EntrepriseAdapter.new(etablissement.siret, procedure_id).to_params etablissement.update!(etablissement_params) end diff --git a/app/jobs/api_entreprise/exercices_job.rb b/app/jobs/api_entreprise/exercices_job.rb index 343dd93da..ba5b27e29 100644 --- a/app/jobs/api_entreprise/exercices_job.rb +++ b/app/jobs/api_entreprise/exercices_job.rb @@ -3,7 +3,7 @@ class ApiEntreprise::ExercicesJob < ApiEntreprise::Job end def perform(etablissement_id, procedure_id) - etablissement = Etablissement.find(etablissement_id) + find_etablissement(etablissement_id) etablissement_params = ApiEntreprise::ExercicesAdapter.new(etablissement.siret, procedure_id).to_params etablissement.update!(etablissement_params) end diff --git a/app/jobs/api_entreprise/job.rb b/app/jobs/api_entreprise/job.rb index c7d749307..e7db45d29 100644 --- a/app/jobs/api_entreprise/job.rb +++ b/app/jobs/api_entreprise/job.rb @@ -8,9 +8,12 @@ class ApiEntreprise::Job < ApplicationJob # - bdf: erreur interne # so we retry every day for 5 days # same logic for ServiceUnavailable - retry_on ApiEntreprise::API::Error::ServiceUnavailable, - ApiEntreprise::API::Error::BadGateway, - wait: 1.day + rescue_from(ApiEntreprise::API::Error::ServiceUnavailable) do |exception| + retry_or_discard(exception) + end + rescue_from(ApiEntreprise::API::Error::BadGateway) do |exception| + retry_or_discard(exception) + end # We guess the backend is slow but not broken # and the information we are looking for is available @@ -33,7 +36,31 @@ class ApiEntreprise::Job < ApplicationJob # override ApplicationJob#error to avoid reporting to sentry end + def log_job_exception(exception) + if etablissement.present? + if etablissement.dossier.present? + etablissement.dossier.log_api_entreprise_job_exception(exception) + elsif etablissement.champ.present? + etablissement.champ.log_fetch_external_data_exception(exception) + end + end + end + + def retry_or_discard(exception) + if executions < max_attempts + retry_job wait: 1.day + else + log_job_exception(exception) + end + end + def max_attempts ENV.fetch("MAX_ATTEMPTS_API_ENTREPRISE_JOBS", DEFAULT_MAX_ATTEMPTS_API_ENTREPRISE_JOBS).to_i end + + attr_reader :etablissement + + def find_etablissement(etablissement_id) + @etablissement = Etablissement.find(etablissement_id) + end end diff --git a/app/models/champ.rb b/app/models/champ.rb index e41120460..fb8dd3221 100644 --- a/app/models/champ.rb +++ b/app/models/champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champ < ApplicationRecord belongs_to :dossier, -> { with_discarded }, inverse_of: :champs, touch: true, optional: false @@ -136,6 +137,12 @@ class Champ < ApplicationRecord type_de_champ.stable_id end + def log_fetch_external_data_exception(exception) + exceptions = self.fetch_external_data_exceptions ||= [] + exceptions << exception.inspect + update_column(:fetch_external_data_exceptions, exceptions) + end + private def needs_dossier_id? diff --git a/app/models/champs/address_champ.rb b/app/models/champs/address_champ.rb index 2bb2c83cc..22bc171e8 100644 --- a/app/models/champs/address_champ.rb +++ b/app/models/champs/address_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::AddressChamp < Champs::TextChamp end diff --git a/app/models/champs/annuaire_education_champ.rb b/app/models/champs/annuaire_education_champ.rb index 4463cc622..79293920a 100644 --- a/app/models/champs/annuaire_education_champ.rb +++ b/app/models/champs/annuaire_education_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::AnnuaireEducationChamp < Champs::TextChamp before_save :cleanup_if_empty diff --git a/app/models/champs/carte_champ.rb b/app/models/champs/carte_champ.rb index 4833ef8f5..0c97eed26 100644 --- a/app/models/champs/carte_champ.rb +++ b/app/models/champs/carte_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::CarteChamp < Champ # Default map location. Center of the World, ahm, France... diff --git a/app/models/champs/checkbox_champ.rb b/app/models/champs/checkbox_champ.rb index 048480a38..40b38af23 100644 --- a/app/models/champs/checkbox_champ.rb +++ b/app/models/champs/checkbox_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::CheckboxChamp < Champs::YesNoChamp def true? diff --git a/app/models/champs/civilite_champ.rb b/app/models/champs/civilite_champ.rb index b971e46c9..8f04758cb 100644 --- a/app/models/champs/civilite_champ.rb +++ b/app/models/champs/civilite_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::CiviliteChamp < Champ def html_label? diff --git a/app/models/champs/commune_champ.rb b/app/models/champs/commune_champ.rb index 02b3595e5..2ebab8e41 100644 --- a/app/models/champs/commune_champ.rb +++ b/app/models/champs/commune_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::CommuneChamp < Champs::TextChamp end diff --git a/app/models/champs/date_champ.rb b/app/models/champs/date_champ.rb index 3eac8eee8..1eca35bf8 100644 --- a/app/models/champs/date_champ.rb +++ b/app/models/champs/date_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::DateChamp < Champ before_save :format_before_save diff --git a/app/models/champs/datetime_champ.rb b/app/models/champs/datetime_champ.rb index 21a905f77..cf2d6c7e1 100644 --- a/app/models/champs/datetime_champ.rb +++ b/app/models/champs/datetime_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::DatetimeChamp < Champ before_save :format_before_save diff --git a/app/models/champs/decimal_number_champ.rb b/app/models/champs/decimal_number_champ.rb index 3a11cb9ec..b907c1c50 100644 --- a/app/models/champs/decimal_number_champ.rb +++ b/app/models/champs/decimal_number_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::DecimalNumberChamp < Champ validates :value, numericality: { diff --git a/app/models/champs/departement_champ.rb b/app/models/champs/departement_champ.rb index ae242484e..d4eaa8501 100644 --- a/app/models/champs/departement_champ.rb +++ b/app/models/champs/departement_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::DepartementChamp < Champs::TextChamp end diff --git a/app/models/champs/dossier_link_champ.rb b/app/models/champs/dossier_link_champ.rb index 4812e90cb..39ba322f8 100644 --- a/app/models/champs/dossier_link_champ.rb +++ b/app/models/champs/dossier_link_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::DossierLinkChamp < Champ end diff --git a/app/models/champs/drop_down_list_champ.rb b/app/models/champs/drop_down_list_champ.rb index 181696853..29b9be33a 100644 --- a/app/models/champs/drop_down_list_champ.rb +++ b/app/models/champs/drop_down_list_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::DropDownListChamp < Champ THRESHOLD_NB_OPTIONS_AS_RADIO = 5 diff --git a/app/models/champs/email_champ.rb b/app/models/champs/email_champ.rb index 147a1a10c..67bdd1ca4 100644 --- a/app/models/champs/email_champ.rb +++ b/app/models/champs/email_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::EmailChamp < Champs::TextChamp end diff --git a/app/models/champs/engagement_champ.rb b/app/models/champs/engagement_champ.rb index 5dd52d37d..b6992749e 100644 --- a/app/models/champs/engagement_champ.rb +++ b/app/models/champs/engagement_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::EngagementChamp < Champs::CheckboxChamp end diff --git a/app/models/champs/explication_champ.rb b/app/models/champs/explication_champ.rb index 92db6836a..022149978 100644 --- a/app/models/champs/explication_champ.rb +++ b/app/models/champs/explication_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::ExplicationChamp < Champs::TextChamp def search_terms diff --git a/app/models/champs/header_section_champ.rb b/app/models/champs/header_section_champ.rb index 995326224..59fd78da0 100644 --- a/app/models/champs/header_section_champ.rb +++ b/app/models/champs/header_section_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::HeaderSectionChamp < Champ def search_terms diff --git a/app/models/champs/iban_champ.rb b/app/models/champs/iban_champ.rb index 2862642df..feb3429dd 100644 --- a/app/models/champs/iban_champ.rb +++ b/app/models/champs/iban_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::IbanChamp < Champ validates_with IbanValidator diff --git a/app/models/champs/integer_number_champ.rb b/app/models/champs/integer_number_champ.rb index 4e356f7e8..68bf2e173 100644 --- a/app/models/champs/integer_number_champ.rb +++ b/app/models/champs/integer_number_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::IntegerNumberChamp < Champ validates :value, numericality: { diff --git a/app/models/champs/linked_drop_down_list_champ.rb b/app/models/champs/linked_drop_down_list_champ.rb index 4d802bb49..355f44442 100644 --- a/app/models/champs/linked_drop_down_list_champ.rb +++ b/app/models/champs/linked_drop_down_list_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::LinkedDropDownListChamp < Champ delegate :primary_options, :secondary_options, to: 'type_de_champ.dynamic_type' diff --git a/app/models/champs/multiple_drop_down_list_champ.rb b/app/models/champs/multiple_drop_down_list_champ.rb index 2186897bb..c6aa132a7 100644 --- a/app/models/champs/multiple_drop_down_list_champ.rb +++ b/app/models/champs/multiple_drop_down_list_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::MultipleDropDownListChamp < Champ before_save :format_before_save diff --git a/app/models/champs/number_champ.rb b/app/models/champs/number_champ.rb index e08c5f2bf..e0186615c 100644 --- a/app/models/champs/number_champ.rb +++ b/app/models/champs/number_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::NumberChamp < Champ end diff --git a/app/models/champs/pays_champ.rb b/app/models/champs/pays_champ.rb index 42bea3386..ba56eb3ee 100644 --- a/app/models/champs/pays_champ.rb +++ b/app/models/champs/pays_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::PaysChamp < Champs::TextChamp end diff --git a/app/models/champs/phone_champ.rb b/app/models/champs/phone_champ.rb index e395f7a21..74e345f53 100644 --- a/app/models/champs/phone_champ.rb +++ b/app/models/champs/phone_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::PhoneChamp < Champs::TextChamp validates :value, diff --git a/app/models/champs/piece_justificative_champ.rb b/app/models/champs/piece_justificative_champ.rb index 53e97854d..405274d4e 100644 --- a/app/models/champs/piece_justificative_champ.rb +++ b/app/models/champs/piece_justificative_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::PieceJustificativeChamp < Champ MAX_SIZE = 200.megabytes diff --git a/app/models/champs/region_champ.rb b/app/models/champs/region_champ.rb index 3d15aefc4..cf5e89075 100644 --- a/app/models/champs/region_champ.rb +++ b/app/models/champs/region_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::RegionChamp < Champs::TextChamp end diff --git a/app/models/champs/repetition_champ.rb b/app/models/champs/repetition_champ.rb index 8ab6469d9..60064d04c 100644 --- a/app/models/champs/repetition_champ.rb +++ b/app/models/champs/repetition_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::RepetitionChamp < Champ accepts_nested_attributes_for :champs, allow_destroy: true diff --git a/app/models/champs/siret_champ.rb b/app/models/champs/siret_champ.rb index e7dabf5a1..2e21f1ff3 100644 --- a/app/models/champs/siret_champ.rb +++ b/app/models/champs/siret_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::SiretChamp < Champ def search_terms diff --git a/app/models/champs/text_champ.rb b/app/models/champs/text_champ.rb index 4456e4a1d..11fcb3939 100644 --- a/app/models/champs/text_champ.rb +++ b/app/models/champs/text_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::TextChamp < Champ end diff --git a/app/models/champs/textarea_champ.rb b/app/models/champs/textarea_champ.rb index 20d64225d..89177feb2 100644 --- a/app/models/champs/textarea_champ.rb +++ b/app/models/champs/textarea_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::TextareaChamp < Champs::TextChamp def for_export diff --git a/app/models/champs/titre_identite_champ.rb b/app/models/champs/titre_identite_champ.rb index 127711565..b4e32e141 100644 --- a/app/models/champs/titre_identite_champ.rb +++ b/app/models/champs/titre_identite_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::TitreIdentiteChamp < Champ MAX_SIZE = 20.megabytes diff --git a/app/models/champs/yes_no_champ.rb b/app/models/champs/yes_no_champ.rb index 7a1e7bc5f..ccbd46186 100644 --- a/app/models/champs/yes_no_champ.rb +++ b/app/models/champs/yes_no_champ.rb @@ -2,19 +2,20 @@ # # Table name: champs # -# id :integer not null, primary key -# data :jsonb -# private :boolean default(FALSE), not null -# row :integer -# type :string -# value :string -# created_at :datetime -# updated_at :datetime -# dossier_id :integer -# etablissement_id :integer -# external_id :string -# parent_id :bigint -# type_de_champ_id :integer +# id :integer not null, primary key +# data :jsonb +# fetch_external_data_exceptions :string is an Array +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# external_id :string +# parent_id :bigint +# type_de_champ_id :integer # class Champs::YesNoChamp < Champ def search_terms diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 165209d1d..a763570c1 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -3,6 +3,7 @@ # Table name: dossiers # # id :integer not null, primary key +# api_entreprise_job_exceptions :string is an Array # archived :boolean default(FALSE) # autorisation_donnees :boolean # brouillon_close_to_expiration_notice_sent_at :datetime @@ -819,6 +820,12 @@ class Dossier < ApplicationRecord } end + def log_api_entreprise_job_exception(exception) + exceptions = self.api_entreprise_job_exceptions ||= [] + exceptions << exception.inspect + update_column(:api_entreprise_job_exceptions, exceptions) + end + private def geo_areas diff --git a/db/migrate/20210204180955_add_job_exception_logs.rb b/db/migrate/20210204180955_add_job_exception_logs.rb new file mode 100644 index 000000000..153747111 --- /dev/null +++ b/db/migrate/20210204180955_add_job_exception_logs.rb @@ -0,0 +1,6 @@ +class AddJobExceptionLogs < ActiveRecord::Migration[6.0] + def change + add_column :dossiers, :api_entreprise_job_exceptions, :string, array: true + add_column :champs, :fetch_external_data_exceptions, :string, array: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 46a02c5a3..12e8fcf65 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_01_21_134435) do +ActiveRecord::Schema.define(version: 2021_02_04_180955) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -147,6 +147,7 @@ ActiveRecord::Schema.define(version: 2021_01_21_134435) do t.integer "row" t.jsonb "data" t.string "external_id" + t.string "fetch_external_data_exceptions", array: true t.index ["dossier_id"], name: "index_champs_on_dossier_id" t.index ["parent_id"], name: "index_champs_on_parent_id" t.index ["private"], name: "index_champs_on_private" @@ -250,6 +251,7 @@ ActiveRecord::Schema.define(version: 2021_01_21_134435) do t.datetime "last_commentaire_updated_at" t.index "to_tsvector('french'::regconfig, (search_terms || private_search_terms))", name: "index_dossiers_on_search_terms_private_search_terms", using: :gin t.index "to_tsvector('french'::regconfig, search_terms)", name: "index_dossiers_on_search_terms", using: :gin + t.string "api_entreprise_job_exceptions", array: true t.index ["archived"], name: "index_dossiers_on_archived" t.index ["groupe_instructeur_id"], name: "index_dossiers_on_groupe_instructeur_id" t.index ["hidden_at"], name: "index_dossiers_on_hidden_at" diff --git a/spec/jobs/api_entreprise/job_spec.rb b/spec/jobs/api_entreprise/job_spec.rb index 3b09d3874..d71d7f126 100644 --- a/spec/jobs/api_entreprise/job_spec.rb +++ b/spec/jobs/api_entreprise/job_spec.rb @@ -4,6 +4,8 @@ RSpec.describe ApiEntreprise::Job, type: :job do # https://api.rubyonrails.org/classes/ActiveJob/Exceptions/ClassMethods.html # #method-i-retry_on describe '#perform' do + let(:dossier) { create(:dossier, :with_entreprise) } + context 'when a un retryable error is raised' do let(:errors) { [:standard_error] } @@ -17,20 +19,25 @@ RSpec.describe ApiEntreprise::Job, type: :job do it 'retries 5 times' do ensure_errors_force_n_retry(errors, 5) + expect(dossier.reload.api_entreprise_job_exceptions.first).to match('ApiEntreprise::API::Error::ServiceUnavailable') end end def ensure_errors_force_n_retry(errors, retry_nb) + etablissement = dossier.etablissement + errors.each do |error| assert_performed_jobs(retry_nb) do - ErrorJob.perform_later(error) rescue StandardError + ErrorJob.perform_later(error, etablissement) rescue StandardError end end end end class ErrorJob < ApiEntreprise::Job - def perform(error) + def perform(error, etablissement) + @etablissement = etablissement + response = OpenStruct.new( effective_url: 'http://host.com/path', code: '666', diff --git a/spec/models/champ_spec.rb b/spec/models/champ_spec.rb index 6222fc81f..8d5ab3492 100644 --- a/spec/models/champ_spec.rb +++ b/spec/models/champ_spec.rb @@ -510,4 +510,16 @@ describe Champ do end end end + + describe '#log_fetch_external_data_exception' do + let(:champ) { create(:champ_siret) } + + context "add execption to the log" do + before do + champ.log_fetch_external_data_exception(StandardError.new('My special exception!')) + end + + it { expect(champ.fetch_external_data_exceptions).to eq(['#']) } + end + end end diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 43d171d5e..6d958587c 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -1424,4 +1424,16 @@ describe Dossier do end end end + + describe '#log_api_entreprise_job_exception' do + let(:dossier) { create(:dossier) } + + context "add execption to the log" do + before do + dossier.log_api_entreprise_job_exception(StandardError.new('My special exception!')) + end + + it { expect(dossier.api_entreprise_job_exceptions).to eq(['#']) } + end + end end