From e3ee42319764c2d2569f96f4268a2edc6d96c5f1 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Thu, 14 May 2020 14:41:54 +0200 Subject: [PATCH 01/11] call api_entreprise adapters with siret --- app/lib/api_entreprise/adapter.rb | 4 ++++ app/lib/api_entreprise/attestation_fiscale_adapter.rb | 6 +++--- app/lib/api_entreprise/attestation_sociale_adapter.rb | 6 +++--- app/lib/api_entreprise/bilans_bdf_adapter.rb | 6 +++--- app/lib/api_entreprise/effectifs_adapter.rb | 6 +++--- app/lib/api_entreprise/effectifs_annuels_adapter.rb | 6 +++--- app/lib/api_entreprise/entreprise_adapter.rb | 1 - spec/lib/api_entreprise/attestation_fiscale_adapter_spec.rb | 5 +++-- spec/lib/api_entreprise/attestation_sociale_adapter_spec.rb | 5 +++-- spec/lib/api_entreprise/bilans_bdf_adapter_spec.rb | 5 +++-- spec/lib/api_entreprise/effectifs_adapter_spec.rb | 5 +++-- spec/lib/api_entreprise/effectifs_annuels_adapter_spec.rb | 5 +++-- 12 files changed, 34 insertions(+), 26 deletions(-) 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/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/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 From f4ebb5d10750b47f3093b0bba21e5499e3538f7c Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Thu, 14 May 2020 10:56:26 +0200 Subject: [PATCH 02/11] create api_entreprise jobs --- app/jobs/api_entreprise/association_job.rb | 7 +++++ .../api_entreprise/attestation_fiscale_job.rb | 8 ++++++ .../api_entreprise/attestation_sociale_job.rb | 8 ++++++ app/jobs/api_entreprise/bilans_bdf_job.rb | 7 +++++ .../api_entreprise/effectifs_annuels_job.rb | 7 +++++ app/jobs/api_entreprise/effectifs_job.rb | 21 ++++++++++++++ app/jobs/api_entreprise/entreprise_job.rb | 7 +++++ app/jobs/api_entreprise/exercices_job.rb | 7 +++++ .../api_entreprise/association_job_spec.rb | 21 ++++++++++++++ .../attestation_fiscale_job_spec.rb | 25 +++++++++++++++++ .../attestation_sociale_job_spec.rb | 24 ++++++++++++++++ .../api_entreprise/bilans_bdf_job_spec.rb | 24 ++++++++++++++++ .../effectifs_annuels_job_spec.rb | 22 +++++++++++++++ .../jobs/api_entreprise/effectifs_job_spec.rb | 28 +++++++++++++++++++ .../api_entreprise/entreprise_job_spec.rb | 22 +++++++++++++++ .../jobs/api_entreprise/exercices_job_spec.rb | 20 +++++++++++++ 16 files changed, 258 insertions(+) create mode 100644 app/jobs/api_entreprise/association_job.rb create mode 100644 app/jobs/api_entreprise/attestation_fiscale_job.rb create mode 100644 app/jobs/api_entreprise/attestation_sociale_job.rb create mode 100644 app/jobs/api_entreprise/bilans_bdf_job.rb create mode 100644 app/jobs/api_entreprise/effectifs_annuels_job.rb create mode 100644 app/jobs/api_entreprise/effectifs_job.rb create mode 100644 app/jobs/api_entreprise/entreprise_job.rb create mode 100644 app/jobs/api_entreprise/exercices_job.rb create mode 100644 spec/jobs/api_entreprise/association_job_spec.rb create mode 100644 spec/jobs/api_entreprise/attestation_fiscale_job_spec.rb create mode 100644 spec/jobs/api_entreprise/attestation_sociale_job_spec.rb create mode 100644 spec/jobs/api_entreprise/bilans_bdf_job_spec.rb create mode 100644 spec/jobs/api_entreprise/effectifs_annuels_job_spec.rb create mode 100644 spec/jobs/api_entreprise/effectifs_job_spec.rb create mode 100644 spec/jobs/api_entreprise/entreprise_job_spec.rb create mode 100644 spec/jobs/api_entreprise/exercices_job_spec.rb diff --git a/app/jobs/api_entreprise/association_job.rb b/app/jobs/api_entreprise/association_job.rb new file mode 100644 index 000000000..2924cd142 --- /dev/null +++ b/app/jobs/api_entreprise/association_job.rb @@ -0,0 +1,7 @@ +class ApiEntreprise::AssociationJob < ApplicationJob + def perform(etablissement_id, procedure_id) + etablissement = Etablissement.find(etablissement_id) + etablissement_params = ApiEntreprise::RNAAdapter.new(etablissement.siret, procedure_id).to_params + etablissement.update!(etablissement_params) + end +end diff --git a/app/jobs/api_entreprise/attestation_fiscale_job.rb b/app/jobs/api_entreprise/attestation_fiscale_job.rb new file mode 100644 index 000000000..328c8b1cf --- /dev/null +++ b/app/jobs/api_entreprise/attestation_fiscale_job.rb @@ -0,0 +1,8 @@ +class ApiEntreprise::AttestationFiscaleJob < ApplicationJob + def perform(etablissement_id, procedure_id, user_id) + etablissement = Etablissement.find(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? + end +end diff --git a/app/jobs/api_entreprise/attestation_sociale_job.rb b/app/jobs/api_entreprise/attestation_sociale_job.rb new file mode 100644 index 000000000..bc499049e --- /dev/null +++ b/app/jobs/api_entreprise/attestation_sociale_job.rb @@ -0,0 +1,8 @@ +class ApiEntreprise::AttestationSocialeJob < ApplicationJob + def perform(etablissement_id, procedure_id) + etablissement = Etablissement.find(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? + end +end diff --git a/app/jobs/api_entreprise/bilans_bdf_job.rb b/app/jobs/api_entreprise/bilans_bdf_job.rb new file mode 100644 index 000000000..34839a0f7 --- /dev/null +++ b/app/jobs/api_entreprise/bilans_bdf_job.rb @@ -0,0 +1,7 @@ +class ApiEntreprise::BilansBdfJob < ApplicationJob + def perform(etablissement_id, procedure_id) + etablissement = Etablissement.find(etablissement_id) + etablissement_params = ApiEntreprise::BilansBdfAdapter.new(etablissement.siret, procedure_id).to_params + etablissement.update!(etablissement_params) + end +end diff --git a/app/jobs/api_entreprise/effectifs_annuels_job.rb b/app/jobs/api_entreprise/effectifs_annuels_job.rb new file mode 100644 index 000000000..2220d484a --- /dev/null +++ b/app/jobs/api_entreprise/effectifs_annuels_job.rb @@ -0,0 +1,7 @@ +class ApiEntreprise::EffectifsAnnuelsJob < ApplicationJob + def perform(etablissement_id, procedure_id) + etablissement = Etablissement.find(etablissement_id) + etablissement_params = ApiEntreprise::EffectifsAnnuelsAdapter.new(etablissement.siret, procedure_id).to_params + etablissement.update!(etablissement_params) + end +end diff --git a/app/jobs/api_entreprise/effectifs_job.rb b/app/jobs/api_entreprise/effectifs_job.rb new file mode 100644 index 000000000..faf1690e7 --- /dev/null +++ b/app/jobs/api_entreprise/effectifs_job.rb @@ -0,0 +1,21 @@ +class ApiEntreprise::EffectifsJob < ApplicationJob + def perform(etablissement_id, procedure_id) + 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 + + private + + def 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 + 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/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 From ba5fa9aa4b2a474e00b5b4c1155e573303e9962c Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Fri, 15 May 2020 17:15:52 +0200 Subject: [PATCH 03/11] update ApiEntrepriseService There is now the `create_etablissement` method which create etablissement with EtablissementAdapter and enqueue api_entreprise jobs to retrieve all informations we can get based on SIRET --- app/services/api_entreprise_service.rb | 81 +++--------- spec/services/api_entreprise_service_spec.rb | 126 +++---------------- 2 files changed, 34 insertions(+), 173 deletions(-) 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/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 From eebfb5ee5b54ec735e4870ecb3c0c52e3fd64812 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Mon, 18 May 2020 10:30:08 +0200 Subject: [PATCH 04/11] update dossiers_controller when updating siret now, `ApiEntrepriseService` does'nt return a hash anymore but an etablissement which is already persisted. --- app/controllers/users/dossiers_controller.rb | 10 +- .../users/dossiers_controller_spec.rb | 97 +------------------ 2 files changed, 4 insertions(+), 103 deletions(-) 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/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 From 637bde7326c2682b4677abf841e38b7714f29608 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Mon, 18 May 2020 14:26:11 +0200 Subject: [PATCH 05/11] update siret_controller when finding etablissement now, `ApiEntrepriseService` does'nt return a hash anymore but an etablissement which is already persisted. --- app/controllers/champs/siret_controller.rb | 7 +--- .../champs/siret_controller_spec.rb | 40 +++++++++---------- 2 files changed, 21 insertions(+), 26 deletions(-) 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/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 From 013e78ce4ebb6e77563d85c89896554a072ba39c Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Mon, 18 May 2020 15:57:34 +0200 Subject: [PATCH 06/11] fix creating dossier feature sprec --- spec/features/users/dossier_creation_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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)) From 3b46594e606e99604264b7f76da0bc59ff605ea7 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Mon, 18 May 2020 15:59:35 +0200 Subject: [PATCH 07/11] precise http error code for api calls --- app/lib/api_entreprise/api.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/api_entreprise/api.rb b/app/lib/api_entreprise/api.rb index 884cb1a3c..52a9e73a2 100644 --- a/app/lib/api_entreprise/api.rb +++ b/app/lib/api_entreprise/api.rb @@ -73,7 +73,7 @@ class ApiEntreprise::API elsif response.code&.between?(401, 499) raise ResourceNotFound else - raise RequestFailed + raise RequestFailed, "HTTP Error Code: #{response.code}" end end From f40123fee1794a2f0aaee68fce6dd15d8db35a54 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Mon, 18 May 2020 18:02:10 +0200 Subject: [PATCH 08/11] display only etablissement infos all the other infos are not yet available because the jobs which retrieve it are performed later --- .../users/dossiers/etablissement.html.haml | 3 -- .../_infos_association.html.haml | 24 ----------- .../etablissement/_infos_entreprise.html.haml | 41 +++++-------------- .../dossiers/etablissement.html.haml_spec.rb | 15 +------ 4 files changed, 13 insertions(+), 70 deletions(-) delete mode 100644 app/views/users/dossiers/etablissement/_infos_association.html.haml 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/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 From d92a0ba8f34d3c8083fc8fbe01bbcc079e242b3b Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Tue, 19 May 2020 10:43:49 +0200 Subject: [PATCH 09/11] raise BadFormatRequest error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'intention est de distinguer ce type d'erreur avec les erreurs serveur 5xx. Lorsque l'api est appelé par un Job, les erreurs serveur seront retry, car éphémères. Alors que les erreurs de type BadFormatRequest ou ResourceNotFound n'ont pas être retried. --- app/lib/api_entreprise/api.rb | 5 +++++ spec/lib/api_entreprise/api_spec.rb | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/app/lib/api_entreprise/api.rb b/app/lib/api_entreprise/api.rb index 52a9e73a2..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,6 +75,8 @@ 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, "HTTP Error Code: #{response.code}" 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 } From 8c66b2cab1b36a3cd336e19f2f2f4e4d731d55f1 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Tue, 19 May 2020 10:58:07 +0200 Subject: [PATCH 10/11] rescue ResourceNotFound and BadFormatRequest errors we don't have to retry this kind of errors, but just to send it to sentry --- app/jobs/application_job.rb | 8 ++++++++ 1 file changed, 8 insertions(+) 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 From d8ae089e9387a37d453a51bef2b40984c7155d71 Mon Sep 17 00:00:00 2001 From: kara Diaby Date: Fri, 15 May 2020 15:26:49 +0200 Subject: [PATCH 11/11] [Carto] Improve files import UX + import KML files --- app/javascript/components/MapEditor/index.js | 119 +++++++++++++++++-- 1 file changed, 108 insertions(+), 11 deletions(-) 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)} + > + )} +
+ ))}