diff --git a/app/models/export.rb b/app/models/export.rb
index 988e78c1a..e6ceb89d7 100644
--- a/app/models/export.rb
+++ b/app/models/export.rb
@@ -18,8 +18,9 @@ class Export < ApplicationRecord
enum format: {
csv: 'csv',
ods: 'ods',
- xlsx: 'xlsx'
- }
+ xlsx: 'xlsx',
+ zip: 'zip'
+ }, _prefix: true
enum time_span_type: {
everything: 'everything',
@@ -52,7 +53,7 @@ class Export < ApplicationRecord
{ format: format, time_span_type: time_span_type }
end
end
- FORMATS = [:xlsx, :ods, :csv].map do |format|
+ FORMATS = [:xlsx, :ods, :csv, :zip].map do |format|
{ format: format }
end
@@ -98,6 +99,10 @@ class Export < ApplicationRecord
format == self.class.formats.fetch(:csv)
end
+ def zip?
+ format == self.class.formats.fetch(:zip)
+ end
+
def self.find_or_create_export(format, groupe_instructeurs, time_span_type: time_span_types.fetch(:everything), statut: statuts.fetch(:tous), procedure_presentation: nil)
create_with(groupe_instructeurs: groupe_instructeurs, procedure_presentation: procedure_presentation, procedure_presentation_snapshot: procedure_presentation&.snapshot)
.includes(:procedure_presentation)
@@ -128,6 +133,10 @@ class Export < ApplicationRecord
csv: {
time_span_type: not_filtered.filter(&:csv?).index_by(&:time_span_type),
statut: filtered.filter(&:csv?).index_by(&:statut)
+ },
+ zip: {
+ time_span_type: {},
+ statut: filtered.filter(&:zip?).index_by(&:statut)
}
}
end
@@ -181,6 +190,8 @@ class Export < ApplicationRecord
service.to_xlsx
when :ods
service.to_ods
+ when :zip
+ service.to_zip
end
end
diff --git a/app/services/procedure_export_service.rb b/app/services/procedure_export_service.rb
index a9b3fc280..907426fd6 100644
--- a/app/services/procedure_export_service.rb
+++ b/app/services/procedure_export_service.rb
@@ -27,6 +27,13 @@ class ProcedureExportService
end.bytes)
create_blob(io, :ods)
end
+
+ def to_zip
+ attachments = ActiveStorage::DownloadableFile.create_list_from_dossiers(dossiers, true)
+
+ DownloadableFileService.download_and_zip(procedure, attachments, base_filename) do |zip_filepath|
+ ArchiveUploader.new(procedure: procedure, filename: filename(:zip), filepath: zip_filepath).blob
+ end
end
private
@@ -62,6 +69,8 @@ class ProcedureExportService
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
when :ods
'application/vnd.oasis.opendocument.spreadsheet'
+ when :zip
+ 'application/zip'
end
end
diff --git a/config/locales/views/instructeurs/procedures/fr.yml b/config/locales/views/instructeurs/procedures/fr.yml
index 9cf758507..b4139e687 100644
--- a/config/locales/views/instructeurs/procedures/fr.yml
+++ b/config/locales/views/instructeurs/procedures/fr.yml
@@ -5,6 +5,7 @@ fr:
everything_csv_html: Demander un export au format .csv
(uniquement les dossiers, sans les champs répétables)
everything_xlsx_html: Demander un export au format .xlsx
everything_ods_html: Demander un export au format .ods
+ everything_zip_html: Demander un export au format .zip
everything_short: Demander un export au format %{export_format}
everything_pending_html: Un export au format %{export_format} est en train d’être généré
(demandé il y a %{export_time})
everything_ready_html: Télécharger l’export au format %{export_format}
(généré il y a %{export_time})
diff --git a/spec/models/export_spec.rb b/spec/models/export_spec.rb
index 2bfdec18a..3511895e5 100644
--- a/spec/models/export_spec.rb
+++ b/spec/models/export_spec.rb
@@ -48,9 +48,9 @@ RSpec.describe Export, type: :model do
context 'when an export is made for one groupe instructeur' do
let!(:export) { create(:export, groupe_instructeurs: [gi_1, gi_2]) }
- it { expect(Export.find_for_groupe_instructeurs([gi_1.id], nil)).to eq({ csv: { statut: {}, time_span_type: {} }, xlsx: { statut: {}, time_span_type: {} }, ods: { statut: {}, time_span_type: {} } }) }
- it { expect(Export.find_for_groupe_instructeurs([gi_2.id, gi_1.id], nil)).to eq({ csv: { statut: {}, time_span_type: { 'everything' => export } }, xlsx: { statut: {}, time_span_type: {} }, ods: { statut: {}, time_span_type: {} } }) }
- it { expect(Export.find_for_groupe_instructeurs([gi_1.id, gi_2.id, gi_3.id], nil)).to eq({ csv: { statut: {}, time_span_type: {} }, xlsx: { statut: {}, time_span_type: {} }, ods: { statut: {}, time_span_type: {} } }) }
+ it { expect(Export.find_for_groupe_instructeurs([gi_1.id], nil)).to eq({ csv: { statut: {}, time_span_type: {} }, xlsx: { statut: {}, time_span_type: {} }, ods: { statut: {}, time_span_type: {} }, zip: { statut: {}, time_span_type: {} } }) }
+ it { expect(Export.find_for_groupe_instructeurs([gi_2.id, gi_1.id], nil)).to eq({ csv: { statut: {}, time_span_type: { 'everything' => export } }, xlsx: { statut: {}, time_span_type: {} }, ods: { statut: {}, time_span_type: {} }, zip: { statut: {}, time_span_type: {} } }) }
+ it { expect(Export.find_for_groupe_instructeurs([gi_1.id, gi_2.id, gi_3.id], nil)).to eq({ csv: { statut: {}, time_span_type: {} }, xlsx: { statut: {}, time_span_type: {} }, ods: { statut: {}, time_span_type: {} }, zip: { statut: {}, time_span_type: {} } }) }
end
end
end