2017-06-08 14:16:48 +02:00
|
|
|
|
class AttestationTemplate < ApplicationRecord
|
|
|
|
|
include ActionView::Helpers::NumberHelper
|
|
|
|
|
|
|
|
|
|
belongs_to :procedure
|
|
|
|
|
|
2017-10-19 15:07:18 +02:00
|
|
|
|
mount_uploader :logo, AttestationTemplateLogoUploader
|
|
|
|
|
mount_uploader :signature, AttestationTemplateSignatureUploader
|
2017-06-08 14:16:48 +02:00
|
|
|
|
|
|
|
|
|
validate :logo_signature_file_size
|
2017-06-27 13:07:06 +02:00
|
|
|
|
validates :footer, length: { maximum: 190 }
|
2017-06-08 14:16:48 +02:00
|
|
|
|
|
|
|
|
|
FILE_MAX_SIZE_IN_MB = 0.5
|
|
|
|
|
|
2017-06-09 13:28:47 +02:00
|
|
|
|
def tags
|
|
|
|
|
if procedure.for_individual?
|
|
|
|
|
identity_tags = individual_tags
|
|
|
|
|
else
|
|
|
|
|
identity_tags = entreprise_tags + etablissement_tags
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
identity_tags + dossier_tags + procedure_type_de_champ_public_private_tags
|
|
|
|
|
end
|
|
|
|
|
|
2017-06-08 14:04:47 +02:00
|
|
|
|
def attestation_for(dossier)
|
|
|
|
|
Attestation.new(title: replace_tags(title, dossier), pdf: build_pdf(dossier))
|
|
|
|
|
end
|
|
|
|
|
|
2017-06-08 14:16:48 +02:00
|
|
|
|
def dup
|
|
|
|
|
result = AttestationTemplate.new(title: title, body: body, footer: footer, activated: activated)
|
|
|
|
|
|
|
|
|
|
if logo.present?
|
|
|
|
|
CopyCarrierwaveFile::CopyFileService.new(self, result, :logo).set_file
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if signature.present?
|
|
|
|
|
CopyCarrierwaveFile::CopyFileService.new(self, result, :signature).set_file
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
result
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def logo_signature_file_size
|
|
|
|
|
%i[logo signature]
|
|
|
|
|
.select { |file_name| send(file_name).present? }
|
|
|
|
|
.each { |file_name| file_size_check(file_name) }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def file_size_check(file_name)
|
|
|
|
|
if send(file_name).file.size.to_f > FILE_MAX_SIZE_IN_MB.megabyte.to_f
|
|
|
|
|
errors.add(file_name, " : vous ne pouvez pas charger une image de plus de #{number_with_delimiter(FILE_MAX_SIZE_IN_MB, locale: :fr)} Mo")
|
|
|
|
|
end
|
|
|
|
|
end
|
2017-06-09 13:28:47 +02:00
|
|
|
|
|
|
|
|
|
def procedure_type_de_champ_public_private_tags
|
|
|
|
|
(procedure.types_de_champ + procedure.types_de_champ_private)
|
|
|
|
|
.map { |tdc| { libelle: tdc.libelle, description: tdc.description } }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def dossier_tags
|
2017-06-28 10:51:46 +02:00
|
|
|
|
[{ libelle: 'motivation', description: '', target: 'motivation' },
|
|
|
|
|
{ libelle: 'numéro du dossier', description: '', target: 'id' }]
|
2017-06-09 13:28:47 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def individual_tags
|
2017-06-08 14:04:47 +02:00
|
|
|
|
[{ libelle: 'civilité', description: 'M., Mme', target: 'gender' },
|
|
|
|
|
{ libelle: 'nom', description: "nom de l'usager", target: 'nom' },
|
|
|
|
|
{ libelle: 'prénom', description: "prénom de l'usager", target: 'prenom' }]
|
2017-06-09 13:28:47 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def entreprise_tags
|
2017-06-08 14:04:47 +02:00
|
|
|
|
[{ libelle: 'SIREN', description: '', target: 'siren' },
|
|
|
|
|
{ libelle: 'numéro de TVA intracommunautaire', description: '', target: 'numero_tva_intracommunautaire' },
|
|
|
|
|
{ libelle: 'SIRET du siège social', description: '', target: 'siret_siege_social' },
|
|
|
|
|
{ libelle: 'raison sociale', description: '', target: 'raison_sociale' }]
|
2017-06-09 13:28:47 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def etablissement_tags
|
2017-06-22 15:00:25 +02:00
|
|
|
|
[{ libelle: 'adresse', description: '', target: 'inline_adresse' }]
|
2017-06-08 14:04:47 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def build_pdf(dossier)
|
|
|
|
|
action_view = ActionView::Base.new(ActionController::Base.view_paths,
|
|
|
|
|
logo: logo,
|
|
|
|
|
title: replace_tags(title, dossier),
|
|
|
|
|
body: replace_tags(body, dossier),
|
|
|
|
|
signature: signature,
|
|
|
|
|
footer: footer,
|
|
|
|
|
created_at: Time.now)
|
|
|
|
|
|
|
|
|
|
attestation_view = action_view.render(file: 'admin/attestation_templates/show',
|
|
|
|
|
formats: [:pdf])
|
|
|
|
|
|
|
|
|
|
view_to_memory_file(attestation_view)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def view_to_memory_file(view)
|
|
|
|
|
pdf = StringIO.new(view)
|
|
|
|
|
|
|
|
|
|
def pdf.original_filename
|
|
|
|
|
'attestation'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
pdf
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def replace_tags(text, dossier)
|
|
|
|
|
if text.nil?
|
|
|
|
|
return ''
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
text = replace_type_de_champ_tags(text, procedure.types_de_champ, dossier.champs)
|
|
|
|
|
text = replace_type_de_champ_tags(text, procedure.types_de_champ_private, dossier.champs_private)
|
|
|
|
|
|
|
|
|
|
tags_and_datas = [
|
|
|
|
|
[dossier_tags, dossier],
|
|
|
|
|
[individual_tags, dossier.individual],
|
|
|
|
|
[entreprise_tags, dossier.entreprise],
|
|
|
|
|
[etablissement_tags, dossier.entreprise&.etablissement]]
|
|
|
|
|
|
|
|
|
|
tags_and_datas.inject(text) { |acc, (tags, data)| replace_tags_with_values_from_data(acc, tags, data) }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def replace_type_de_champ_tags(text, types_de_champ, dossier_champs)
|
|
|
|
|
types_de_champ.inject(text) do |acc, tag|
|
2017-10-16 17:39:34 +02:00
|
|
|
|
champ = dossier_champs
|
|
|
|
|
.select { |dossier_champ| dossier_champ.libelle == tag[:libelle] }
|
2017-06-08 14:04:47 +02:00
|
|
|
|
.first
|
|
|
|
|
|
2017-12-14 14:30:18 +01:00
|
|
|
|
replace_tag(acc, tag, champ)
|
2017-06-08 14:04:47 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def replace_tags_with_values_from_data(text, tags, data)
|
|
|
|
|
if data.present?
|
|
|
|
|
tags.inject(text) do |acc, tag|
|
2017-12-14 14:30:18 +01:00
|
|
|
|
replace_tag(acc, tag, data.send(tag[:target].to_sym))
|
2017-06-08 14:04:47 +02:00
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
text
|
|
|
|
|
end
|
2017-06-09 13:28:47 +02:00
|
|
|
|
end
|
2017-12-14 14:30:18 +01:00
|
|
|
|
|
|
|
|
|
def replace_tag(text, tag, value)
|
|
|
|
|
libelle = Regexp.quote(tag[:libelle])
|
|
|
|
|
|
|
|
|
|
# allow any kind of space (non-breaking or other) in the tag’s libellé to match any kind of space in the template
|
|
|
|
|
# (the '\\ |' is there because plain ASCII spaces were escaped by preceding Regexp.quote)
|
|
|
|
|
libelle.gsub!(/\\ |[[:blank:]]/, "[[:blank:]]")
|
|
|
|
|
|
|
|
|
|
text.gsub(/--#{libelle}--/, value.to_s)
|
|
|
|
|
end
|
2017-06-08 14:16:48 +02:00
|
|
|
|
end
|