From 81f78c62b4c5ed87eb275221c5100317fd902a46 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Tue, 17 Oct 2023 13:23:17 +0200 Subject: [PATCH 1/4] use api entreprise v3 for effectifs mensuels --- app/lib/api_entreprise/api.rb | 8 +++---- app/lib/api_entreprise/effectifs_adapter.rb | 24 ++++++++++++------- .../api_entreprise/effectifs_adapter_spec.rb | 4 ++-- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/app/lib/api_entreprise/api.rb b/app/lib/api_entreprise/api.rb index 91c30dea5..c37d24d66 100644 --- a/app/lib/api_entreprise/api.rb +++ b/app/lib/api_entreprise/api.rb @@ -5,8 +5,8 @@ class APIEntreprise::API TVA_NAME = "v3/european_commission/unites_legales/%{id}/numero_tva" EXERCICES_RESOURCE_NAME = "v3/dgfip/etablissements/%{id}/chiffres_affaires" RNA_RESOURCE_NAME = "v4/djepva/api-association/associations/open_data/%{id}" - EFFECTIFS_RESOURCE_NAME = "v2/effectifs_mensuels_acoss_covid" EFFECTIFS_ANNUELS_RESOURCE_NAME = "v2/effectifs_annuels_acoss_covid/%{id}" + EFFECTIFS_RESOURCE_NAME = "v3/gip_mds/etablissements/%{id}/effectifs_mensuels" ATTESTATION_SOCIALE_RESOURCE_NAME = "v4/urssaf/unites_legales/%{id}/attestation_vigilance" ATTESTATION_FISCALE_RESOURCE_NAME = "v4/dgfip/unites_legales/%{id}/attestation_fiscale" BILANS_BDF_RESOURCE_NAME = "v3/banque_de_france/unites_legales/%{id}/bilans" @@ -50,9 +50,9 @@ class APIEntreprise::API call_with_siret(RNA_RESOURCE_NAME, siret) end - def effectifs(siren, annee, mois) - endpoint = [EFFECTIFS_RESOURCE_NAME, annee, mois, "entreprise", "%{id}"].join('/') - call_with_siret(endpoint, siren) + def effectifs(siret, annee, mois) + endpoint = [EFFECTIFS_RESOURCE_NAME, mois, "annee", annee].join('/') + call_with_siret(endpoint, siret) end def effectifs_annuels(siren) diff --git a/app/lib/api_entreprise/effectifs_adapter.rb b/app/lib/api_entreprise/effectifs_adapter.rb index 55011d6ac..a8f660fbe 100644 --- a/app/lib/api_entreprise/effectifs_adapter.rb +++ b/app/lib/api_entreprise/effectifs_adapter.rb @@ -9,18 +9,24 @@ class APIEntreprise::EffectifsAdapter < APIEntreprise::Adapter private def get_resource - api(@procedure_id).effectifs(siren, @annee, @mois) + api(@procedure_id).effectifs(@siret, @annee, @mois) end def process_params - if data_source[:effectifs_mensuels].present? - { - entreprise_effectif_mensuel: data_source[:effectifs_mensuels], - entreprise_effectif_mois: data_source[:mois], - entreprise_effectif_annee: data_source[:annee] - } - else - {} + data = data_source.fetch(:data, nil) + Sentry.with_scope do |scope| + scope.set_tags(siret: @siret) + scope.set_extras(source: data) + effectifs = data&.fetch(:effectifs_mensuels, nil)&.first + if effectifs.present? + { + entreprise_effectif_mensuel: effectifs[:value], + entreprise_effectif_mois: effectifs[:mois], + entreprise_effectif_annee: effectifs[:annee] + } + else + {} + end end end end diff --git a/spec/lib/api_entreprise/effectifs_adapter_spec.rb b/spec/lib/api_entreprise/effectifs_adapter_spec.rb index d9acbd325..ac0eb8ee9 100644 --- a/spec/lib/api_entreprise/effectifs_adapter_spec.rb +++ b/spec/lib/api_entreprise/effectifs_adapter_spec.rb @@ -9,7 +9,7 @@ describe APIEntreprise::EffectifsAdapter do subject { adapter.to_params } before do - stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_mensuels_acoss_covid\/#{annee}\/#{mois}\/entreprise\/#{siren}/) + stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v3\/gip_mds\/etablissements\/#{siret}\/effectifs_mensuels\/#{mois}\/annee\/#{annee}/) .to_return(body: body, status: status) allow_any_instance_of(APIEntrepriseToken).to receive(:expired?).and_return(false) end @@ -23,7 +23,7 @@ describe APIEntreprise::EffectifsAdapter do end it "renvoie les effectifs du mois demandé" do - expect(subject[:entreprise_effectif_mensuel]).to eq(100.5) + expect(subject[:entreprise_effectif_mensuel]).to eq(12.34) end end end From e5d0d7dda2f9b5d26f5a7009160cbfaa0f5a6c31 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Tue, 17 Oct 2023 13:24:41 +0200 Subject: [PATCH 2/4] get most fresh info for effectifs mensuels --- app/jobs/api_entreprise/effectifs_job.rb | 5 ++--- .../files/api_entreprise/effectifs.json | 19 +++++++++++++++---- .../jobs/api_entreprise/effectifs_job_spec.rb | 6 +++--- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/app/jobs/api_entreprise/effectifs_job.rb b/app/jobs/api_entreprise/effectifs_job.rb index feb21e10a..40bdc21a2 100644 --- a/app/jobs/api_entreprise/effectifs_job.rb +++ b/app/jobs/api_entreprise/effectifs_job.rb @@ -1,8 +1,7 @@ class APIEntreprise::EffectifsJob < APIEntreprise::Job def perform(etablissement_id, procedure_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 = Etablissement.find(etablissement_id) + etablissement_params = APIEntreprise::EffectifsAdapter.new(etablissement.siret, procedure_id, *get_current_valid_month_for_effectif).to_params etablissement.update!(etablissement_params) end diff --git a/spec/fixtures/files/api_entreprise/effectifs.json b/spec/fixtures/files/api_entreprise/effectifs.json index 133873115..33008006e 100644 --- a/spec/fixtures/files/api_entreprise/effectifs.json +++ b/spec/fixtures/files/api_entreprise/effectifs.json @@ -1,6 +1,17 @@ { - "siren": "418166096", - "annee": "2020", - "mois": "02", - "effectifs_mensuels": 100.5 + "data": { + "siret": "41816609600069", + "effectifs_mensuels": [ + { + "regime": "regime_general", + "value": 12.34, + "nature": "effectif_moyen_mensuel", + "annee": "2020", + "mois": "02", + "date_derniere_mise_a_jour": "2018-01-01" + } + ] + }, + "links": {}, + "meta": {} } diff --git a/spec/jobs/api_entreprise/effectifs_job_spec.rb b/spec/jobs/api_entreprise/effectifs_job_spec.rb index f0f7e7d23..bcb33a435 100644 --- a/spec/jobs/api_entreprise/effectifs_job_spec.rb +++ b/spec/jobs/api_entreprise/effectifs_job_spec.rb @@ -6,12 +6,12 @@ RSpec.describe APIEntreprise::EffectifsJob, type: :job do let(:procedure_id) { procedure.id } let(:now) { Time.zone.local(2020, 3, 12) } let(:annee) { "2020" } - let(:mois) { "05" } + 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}/) + stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v3\/gip_mds\/etablissements\/#{siret}\/effectifs_mensuels\/#{mois}\/annee\/#{annee}/) .to_return(body: body, status: status) allow_any_instance_of(APIEntrepriseToken).to receive(:expired?).and_return(false) end @@ -23,6 +23,6 @@ RSpec.describe APIEntreprise::EffectifsJob, type: :job do it 'updates etablissement' do subject - expect(Etablissement.find(etablissement.id).entreprise_effectif_mensuel).to eq(100.5) + expect(Etablissement.find(etablissement.id).entreprise_effectif_mensuel).to eq(12.34) end end From 0f1e243b0114d80b21aebc8948a5ef843b17b22d Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Tue, 17 Oct 2023 13:26:21 +0200 Subject: [PATCH 3/4] use api entreprise v3 for effectifs annuels --- app/lib/api_entreprise/api.rb | 7 +++-- .../effectifs_annuels_adapter.rb | 29 +++++++++++++------ .../api_entreprise/effectifs_annuels.json | 17 +++++++++-- .../effectifs_annuels_job_spec.rb | 6 +++- .../effectifs_annuels_adapter_spec.rb | 5 ++-- 5 files changed, 46 insertions(+), 18 deletions(-) diff --git a/app/lib/api_entreprise/api.rb b/app/lib/api_entreprise/api.rb index c37d24d66..c9e66ec3c 100644 --- a/app/lib/api_entreprise/api.rb +++ b/app/lib/api_entreprise/api.rb @@ -5,8 +5,8 @@ class APIEntreprise::API TVA_NAME = "v3/european_commission/unites_legales/%{id}/numero_tva" EXERCICES_RESOURCE_NAME = "v3/dgfip/etablissements/%{id}/chiffres_affaires" RNA_RESOURCE_NAME = "v4/djepva/api-association/associations/open_data/%{id}" - EFFECTIFS_ANNUELS_RESOURCE_NAME = "v2/effectifs_annuels_acoss_covid/%{id}" EFFECTIFS_RESOURCE_NAME = "v3/gip_mds/etablissements/%{id}/effectifs_mensuels" + EFFECTIFS_ANNUELS_RESOURCE_NAME = "v3/gip_mds/unites_legales/%{id}/effectifs_annuels" ATTESTATION_SOCIALE_RESOURCE_NAME = "v4/urssaf/unites_legales/%{id}/attestation_vigilance" ATTESTATION_FISCALE_RESOURCE_NAME = "v4/dgfip/unites_legales/%{id}/attestation_fiscale" BILANS_BDF_RESOURCE_NAME = "v3/banque_de_france/unites_legales/%{id}/bilans" @@ -55,8 +55,9 @@ class APIEntreprise::API call_with_siret(endpoint, siret) end - def effectifs_annuels(siren) - call_with_siret(EFFECTIFS_ANNUELS_RESOURCE_NAME, siren) + def effectifs_annuels(siren, annee) + endpoint = [EFFECTIFS_ANNUELS_RESOURCE_NAME, annee].join('/') + call_with_siret(endpoint, siren) end def attestation_sociale(siren) diff --git a/app/lib/api_entreprise/effectifs_annuels_adapter.rb b/app/lib/api_entreprise/effectifs_annuels_adapter.rb index 62df2607e..0bc0c0116 100644 --- a/app/lib/api_entreprise/effectifs_annuels_adapter.rb +++ b/app/lib/api_entreprise/effectifs_annuels_adapter.rb @@ -1,23 +1,34 @@ class APIEntreprise::EffectifsAnnuelsAdapter < APIEntreprise::Adapter - def initialize(siret, procedure_id) + def initialize(siret, procedure_id, year = default_year) @siret = siret @procedure_id = procedure_id + @year = year end private + def default_year + Date.current.year - 1 + end + def get_resource - api(@procedure_id).effectifs_annuels(siren) + api(@procedure_id).effectifs_annuels(siren, @year) end def process_params - if data_source[:effectifs_annuels].present? - { - entreprise_effectif_annuel: data_source[:effectifs_annuels], - entreprise_effectif_annuel_annee: data_source[:annee] - } - else - {} + data = data_source.fetch(:data, nil) + Sentry.with_scope do |scope| + scope.set_tags(siret: @siret) + scope.set_extras(source: data) + effectifs = data&.fetch(:effectifs_annuel, nil)&.first + if effectifs.present? + { + entreprise_effectif_annuel: effectifs[:value], + entreprise_effectif_annuel_annee: effectifs[:annee] + } + else + {} + end end end end diff --git a/spec/fixtures/files/api_entreprise/effectifs_annuels.json b/spec/fixtures/files/api_entreprise/effectifs_annuels.json index da299e40d..6552a2a17 100644 --- a/spec/fixtures/files/api_entreprise/effectifs_annuels.json +++ b/spec/fixtures/files/api_entreprise/effectifs_annuels.json @@ -1,5 +1,16 @@ { - "siren": "418166096", - "annee": "2019", - "effectifs_annuels": 100.5 + "data": { + "siren": "418166096", + "annee": "2017", + "effectifs_annuel": [ + { + "regime": "regime_general", + "value": 100.5, + "nature": "effectif_moyen_annuel", + "date_derniere_mise_a_jour": "2018-01-01" + } + ] + }, + "links": {}, + "meta": {} } diff --git a/spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb b/spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb index e4be65cb4..1c9021df0 100644 --- a/spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb +++ b/spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb @@ -2,17 +2,21 @@ RSpec.describe APIEntreprise::EffectifsAnnuelsJob, type: :job do let(:etablissement) { create(:etablissement, siret: siret) } let(:siret) { '41816609600069' } let(:siren) { '418166096' } + let(:now) { Date.parse("2021/02/13") } 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}/) + Timecop.freeze(now) + stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v3\/gip_mds\/unites_legales\/#{siren}\/effectifs_annuels\/2020/) .to_return(body: body, status: status) allow_any_instance_of(APIEntrepriseToken).to receive(:expired?).and_return(false) end + after { Timecop.return } + subject { APIEntreprise::EffectifsAnnuelsJob.new.perform(etablissement.id, procedure_id) } it 'updates etablissement' do diff --git a/spec/lib/api_entreprise/effectifs_annuels_adapter_spec.rb b/spec/lib/api_entreprise/effectifs_annuels_adapter_spec.rb index 48bb22e50..7591f3a8a 100644 --- a/spec/lib/api_entreprise/effectifs_annuels_adapter_spec.rb +++ b/spec/lib/api_entreprise/effectifs_annuels_adapter_spec.rb @@ -1,13 +1,14 @@ describe APIEntreprise::EffectifsAnnuelsAdapter do let(:siret) { '41816609600069' } let(:siren) { '418166096' } + let(:annee) { 2017 } let(:procedure) { create(:procedure) } let(:procedure_id) { procedure.id } - let(:adapter) { described_class.new(siret, procedure_id) } + let(:adapter) { described_class.new(siret, procedure_id, annee) } subject { adapter.to_params } before do - stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/effectifs_annuels_acoss_covid\/#{siren}/) + stub_request(:get, /https:\/\/entreprise.api.gouv.fr\/v3\/gip_mds\/unites_legales\/#{siren}\/effectifs_annuels\/#{annee}/) .to_return(body: body, status: status) allow_any_instance_of(APIEntrepriseToken).to receive(:expired?).and_return(false) end From d98c4faf941dfb005ae3528a3800004559f554db Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Tue, 17 Oct 2023 13:26:42 +0200 Subject: [PATCH 4/4] explain more precisely effectifs --- app/views/dossiers/show.pdf.prawn | 4 ++-- app/views/shared/dossiers/_identite_entreprise.html.haml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/dossiers/show.pdf.prawn b/app/views/dossiers/show.pdf.prawn index 952bc4864..ec81d5a4b 100644 --- a/app/views/dossiers/show.pdf.prawn +++ b/app/views/dossiers/show.pdf.prawn @@ -112,10 +112,10 @@ def add_identite_etablissement(pdf, etablissement) if @include_infos_administration if etablissement.entreprise_effectif_mensuel.present? - format_in_2_columns(pdf, "Effectif mensuel #{try_format_mois_effectif(etablissement)} (URSSAF) ", number_with_delimiter(etablissement.entreprise_effectif_mensuel.to_s)) + format_in_2_columns(pdf, "Effectif mensuel #{try_format_mois_effectif(etablissement)} de l'établissement (URSSAF ou MSA) ", number_with_delimiter(etablissement.entreprise_effectif_mensuel.to_s)) end if etablissement.entreprise_effectif_annuel_annee.present? - format_in_2_columns(pdf, "Effectif moyen annuel #{etablissement.entreprise_effectif_annuel_annee} (URSSAF) ", number_with_delimiter(etablissement.entreprise_effectif_annuel.to_s)) + format_in_2_columns(pdf, "Effectif moyen annuel #{etablissement.entreprise_effectif_annuel_annee} de l'unité légale (URSSAF ou MSA) ", number_with_delimiter(etablissement.entreprise_effectif_annuel.to_s)) end end diff --git a/app/views/shared/dossiers/_identite_entreprise.html.haml b/app/views/shared/dossiers/_identite_entreprise.html.haml index c53cfe9d4..a7b88fc7f 100644 --- a/app/views/shared/dossiers/_identite_entreprise.html.haml +++ b/app/views/shared/dossiers/_identite_entreprise.html.haml @@ -57,11 +57,11 @@ = humanized_entreprise_etat_administratif(etablissement) - if profile == 'instructeur' - = render Dossiers::RowShowComponent.new(label: "Effectif mensuel #{try_format_mois_effectif(etablissement)} (URSSAF)") do |c| + = render Dossiers::RowShowComponent.new(label: "Effectif mensuel #{try_format_mois_effectif(etablissement)} de l'établissement (URSSAF ou MSA)") do |c| - c.with_value do %p= etablissement.entreprise_effectif_mensuel - = render Dossiers::RowShowComponent.new(label: "Effectif moyen annuel #{etablissement.entreprise_effectif_annuel_annee} (URSSAF)") do |c| + = render Dossiers::RowShowComponent.new(label: "Effectif moyen annuel #{etablissement.entreprise_effectif_annuel_annee} de l'unité légale (URSSAF ou MSA)") do |c| - c.with_value do %p= etablissement.entreprise_effectif_annuel