2016-03-22 17:36:36 +01:00
|
|
|
|
class PiecesJustificativesService
|
2021-05-04 10:31:13 +02:00
|
|
|
|
def self.liste_documents(dossier)
|
2020-06-24 12:56:58 +02:00
|
|
|
|
pjs_champs = pjs_for_champs(dossier)
|
|
|
|
|
pjs_commentaires = pjs_for_commentaires(dossier)
|
2020-12-08 16:34:38 +01:00
|
|
|
|
pjs_dossier = pjs_for_dossier(dossier)
|
2019-11-20 11:44:04 +01:00
|
|
|
|
|
2021-04-29 16:16:12 +02:00
|
|
|
|
(pjs_champs + pjs_commentaires + pjs_dossier)
|
2020-06-24 12:56:58 +02:00
|
|
|
|
.filter(&:attached?)
|
2019-07-01 15:55:37 +02:00
|
|
|
|
end
|
|
|
|
|
|
2021-05-04 10:31:13 +02:00
|
|
|
|
def self.liste_pieces_justificatives(dossier)
|
|
|
|
|
pjs_champs = pjs_for_champs(dossier)
|
|
|
|
|
pjs_commentaires = pjs_for_commentaires(dossier)
|
|
|
|
|
|
|
|
|
|
(pjs_champs + pjs_commentaires)
|
|
|
|
|
.filter(&:attached?)
|
|
|
|
|
end
|
|
|
|
|
|
2019-07-01 15:55:37 +02:00
|
|
|
|
def self.pieces_justificatives_total_size(dossier)
|
|
|
|
|
liste_pieces_justificatives(dossier)
|
2019-11-20 11:44:04 +01:00
|
|
|
|
.sum(&:byte_size)
|
2019-07-01 15:55:37 +02:00
|
|
|
|
end
|
|
|
|
|
|
2020-08-27 19:55:10 +02:00
|
|
|
|
def self.serialize_types_de_champ_as_type_pj(revision)
|
|
|
|
|
tdcs = revision.types_de_champ.filter { |type_champ| type_champ.old_pj.present? }
|
2019-01-10 15:55:04 +01:00
|
|
|
|
tdcs.map.with_index do |type_champ, order_place|
|
|
|
|
|
description = type_champ.description
|
|
|
|
|
if /^(?<original_description>.*?)(?:[\r\n]+)Récupérer le formulaire vierge pour mon dossier : (?<lien_demarche>http.*)$/m =~ description
|
|
|
|
|
description = original_description
|
|
|
|
|
end
|
|
|
|
|
{
|
|
|
|
|
id: type_champ.old_pj[:stable_id],
|
|
|
|
|
libelle: type_champ.libelle,
|
|
|
|
|
description: description,
|
|
|
|
|
order_place: order_place,
|
|
|
|
|
lien_demarche: lien_demarche
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
end
|
2019-01-10 18:46:19 +01:00
|
|
|
|
|
|
|
|
|
def self.serialize_champs_as_pjs(dossier)
|
2019-09-12 11:26:22 +02:00
|
|
|
|
dossier.champs.filter { |champ| champ.type_de_champ.old_pj }.map do |champ|
|
2019-01-10 18:46:19 +01:00
|
|
|
|
{
|
|
|
|
|
created_at: champ.created_at&.in_time_zone('UTC'),
|
|
|
|
|
type_de_piece_justificative_id: champ.type_de_champ.old_pj[:stable_id],
|
|
|
|
|
content_url: champ.for_api,
|
|
|
|
|
user: champ.dossier.user
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
end
|
2019-09-03 15:17:19 +02:00
|
|
|
|
|
2021-07-01 13:33:22 +02:00
|
|
|
|
def self.clone_attachments(original, kopy)
|
|
|
|
|
if original.is_a?(TypeDeChamp)
|
|
|
|
|
clone_attachment(original.piece_justificative_template, kopy.piece_justificative_template)
|
|
|
|
|
elsif original.is_a?(Procedure)
|
|
|
|
|
clone_attachment(original.logo, kopy.logo)
|
|
|
|
|
clone_attachment(original.notice, kopy.notice)
|
|
|
|
|
clone_attachment(original.deliberation, kopy.deliberation)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def self.clone_attachment(original_attachment, copy_attachment)
|
|
|
|
|
if original_attachment.attached?
|
|
|
|
|
original_attachment.open do |tempfile|
|
|
|
|
|
copy_attachment.attach({
|
|
|
|
|
io: File.open(tempfile.path),
|
|
|
|
|
filename: original_attachment.filename,
|
|
|
|
|
content_type: original_attachment.content_type,
|
|
|
|
|
# we don't want to run virus scanner on cloned file
|
|
|
|
|
metadata: { virus_scan_result: ActiveStorage::VirusScanner::SAFE }
|
|
|
|
|
})
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2021-06-24 21:01:59 +02:00
|
|
|
|
class FakeAttachment < Hashie::Dash
|
|
|
|
|
property :filename
|
|
|
|
|
property :name
|
|
|
|
|
property :file
|
|
|
|
|
property :id
|
|
|
|
|
property :created_at
|
|
|
|
|
|
|
|
|
|
def download
|
2021-06-24 21:00:58 +02:00
|
|
|
|
file.read
|
2021-06-24 21:01:59 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def read(*args)
|
|
|
|
|
file.read(*args)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def close
|
|
|
|
|
file.close
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def attached?
|
|
|
|
|
true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2021-04-29 17:29:47 +02:00
|
|
|
|
def self.generate_dossier_export(dossier)
|
|
|
|
|
pdf = ApplicationController
|
|
|
|
|
.render(template: 'dossiers/show', formats: [:pdf],
|
|
|
|
|
assigns: {
|
|
|
|
|
include_infos_administration: true,
|
|
|
|
|
dossier: dossier
|
|
|
|
|
})
|
2021-06-24 21:01:59 +02:00
|
|
|
|
|
|
|
|
|
FakeAttachment.new(
|
|
|
|
|
file: StringIO.new(pdf),
|
|
|
|
|
filename: "export-#{dossier.id}.pdf",
|
|
|
|
|
name: 'pdf_export_for_instructeur',
|
|
|
|
|
id: dossier.id,
|
|
|
|
|
created_at: dossier.updated_at
|
|
|
|
|
)
|
2021-04-29 17:29:47 +02:00
|
|
|
|
end
|
|
|
|
|
|
2021-04-29 16:16:12 +02:00
|
|
|
|
private
|
|
|
|
|
|
2020-06-24 12:56:58 +02:00
|
|
|
|
def self.pjs_for_champs(dossier)
|
2020-06-24 15:21:51 +02:00
|
|
|
|
allowed_champs = dossier.champs + dossier.champs_private
|
2020-06-24 12:56:58 +02:00
|
|
|
|
|
|
|
|
|
allowed_child_champs = allowed_champs
|
|
|
|
|
.filter { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:repetition) }
|
|
|
|
|
.flat_map(&:champs)
|
|
|
|
|
|
|
|
|
|
(allowed_champs + allowed_child_champs)
|
2019-09-12 11:26:22 +02:00
|
|
|
|
.filter { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:piece_justificative) }
|
2019-11-20 11:44:04 +01:00
|
|
|
|
.map(&:piece_justificative_file)
|
2019-09-03 15:17:19 +02:00
|
|
|
|
end
|
2020-06-24 12:56:58 +02:00
|
|
|
|
|
|
|
|
|
def self.pjs_for_commentaires(dossier)
|
|
|
|
|
dossier
|
|
|
|
|
.commentaires
|
|
|
|
|
.map(&:piece_jointe)
|
|
|
|
|
end
|
2020-12-08 16:34:38 +01:00
|
|
|
|
|
|
|
|
|
def self.pjs_for_dossier(dossier)
|
2021-06-10 15:24:15 +02:00
|
|
|
|
bill_signatures = dossier.dossier_operation_logs.filter_map(&:bill_signature).uniq
|
2020-12-08 16:34:38 +01:00
|
|
|
|
|
|
|
|
|
[
|
|
|
|
|
dossier.justificatif_motivation,
|
|
|
|
|
dossier.attestation&.pdf,
|
|
|
|
|
dossier.etablissement&.entreprise_attestation_sociale,
|
|
|
|
|
dossier.etablissement&.entreprise_attestation_fiscale,
|
|
|
|
|
dossier.dossier_operation_logs.map(&:serialized),
|
|
|
|
|
bill_signatures.map(&:serialized),
|
|
|
|
|
bill_signatures.map(&:signature)
|
|
|
|
|
].flatten.compact
|
|
|
|
|
end
|
2017-04-04 15:27:04 +02:00
|
|
|
|
end
|