class PiecesJustificativesService def self.liste_documents(dossiers, for_expert) dossiers.flat_map do |dossier| pjs = pjs_for_champs(dossier, for_expert) + pjs_for_commentaires(dossier) + pjs_for_dossier(dossier, for_expert) pjs.map { |piece_justificative| ActiveStorage::DownloadableFile.pj_and_path(dossier, piece_justificative) } end end def self.serialize_types_de_champ_as_type_pj(revision) tdcs = revision.types_de_champ.filter { |type_champ| type_champ.old_pj.present? } tdcs.map.with_index do |type_champ, order_place| description = type_champ.description if /^(?.*?)(?:[\r\n]+)Récupérer le formulaire vierge pour mon dossier : (?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 def self.serialize_champs_as_pjs(dossier) dossier.champs.filter { |champ| champ.type_de_champ.old_pj }.map do |champ| { 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 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 class FakeAttachment < Hashie::Dash property :filename property :name property :file property :id property :created_at def download file.read end def read(*args) file.read(*args) end def close file.close end def attached? true end def record_type 'Fake' end end def self.generate_dossier_export(dossier) pdf = ApplicationController .render(template: 'dossiers/show', formats: [:pdf], assigns: { include_infos_administration: true, dossier: dossier }) FakeAttachment.new( file: StringIO.new(pdf), filename: "export-#{dossier.id}.pdf", name: 'pdf_export_for_instructeur', id: dossier.id, created_at: dossier.updated_at ) end private def self.pjs_for_champs(dossier, for_expert = false) champs = Champ .joins(:piece_justificative_file_attachment) .where(type: "Champs::PieceJustificativeChamp", dossier: dossier) if for_expert champs = champs.where(private: false) end ActiveStorage::Attachment .includes(:blob) .where(record_type: "Champ", record_id: champs.ids) end def self.pjs_for_commentaires(dossier) commentaires = Commentaire .joins(:piece_jointe_attachment) .where(dossier: dossier) ActiveStorage::Attachment .includes(:blob) .where(record_type: "Commentaire", record_id: commentaires.ids) end def self.pjs_for_dossier(dossier, for_expert = false) pjs = motivation(dossier) + attestation(dossier) + etablissement(dossier) if !for_expert pjs += operation_logs_and_signatures(dossier) end pjs end def self.etablissement(dossier) etablissement = Etablissement.where(dossier: dossier) ActiveStorage::Attachment .includes(:blob) .where(record_type: "Etablissement", record_id: etablissement) end def self.motivation(dossier) ActiveStorage::Attachment .includes(:blob) .where(record_type: "Dossier", name: "justificatif_motivation", record_id: dossier) end def self.attestation(dossier) attestation = Attestation .joins(:pdf_attachment) .where(dossier: dossier) ActiveStorage::Attachment .includes(:blob) .where(record_type: "Attestation", record_id: attestation) end def self.operation_logs_and_signatures(dossier) dol_ids_bill_id = DossierOperationLog .where(dossier: dossier) .pluck(:id, :bill_signature_id) dol_ids = dol_ids_bill_id.map(&:first) bill_ids = dol_ids_bill_id.map(&:second).uniq.compact serialized_dols = ActiveStorage::Attachment .includes(:blob) .where(record_type: "DossierOperationLog", record_id: dol_ids) bill_docs = ActiveStorage::Attachment .includes(:blob) .where(record_type: "BillSignature", record_id: bill_ids) serialized_dols + bill_docs end end