186 lines
6.4 KiB
Ruby
186 lines
6.4 KiB
Ruby
require 'prawn/measurement_extensions'
|
||
|
||
def format_in_2_lines(pdf, label, text)
|
||
pdf.font 'liberation serif', style: :bold, size: 12 do
|
||
pdf.text label
|
||
end
|
||
pdf.text text
|
||
pdf.text "\n"
|
||
end
|
||
|
||
def format_in_2_columns(pdf, label, text)
|
||
pdf.text_box label, width: 200, height: 100, overflow: :expand, at: [0, pdf.cursor]
|
||
pdf.text_box ":", width: 10, height: 100, overflow: :expand, at: [100, pdf.cursor]
|
||
pdf.text_box text, width: 420, height: 100, overflow: :expand, at: [110, pdf.cursor]
|
||
pdf.text "\n"
|
||
end
|
||
|
||
def add_title(pdf, title)
|
||
title_style = {style: :bold, size: 24}
|
||
pdf.font 'liberation serif', title_style do
|
||
pdf.text title
|
||
end
|
||
end
|
||
|
||
def format_date(date)
|
||
is_current_year = (date.year == Time.zone.today.year)
|
||
template = is_current_year ? :message_date : :message_date_with_year
|
||
I18n.l(date, format: template)
|
||
end
|
||
|
||
def add_identite_individual(pdf, dossier)
|
||
format_in_2_columns(pdf, "Civilité", dossier.individual.gender)
|
||
format_in_2_columns(pdf, "Nom", dossier.individual.nom)
|
||
format_in_2_columns(pdf, "Prénom", dossier.individual.prenom)
|
||
|
||
if dossier.individual.birthdate.present?
|
||
format_in_2_columns(pdf, "Date de naissance", try_format_date(dossier.individual.birthdate))
|
||
end
|
||
end
|
||
|
||
def render_siret_info(pdf, etablissement)
|
||
pdf.text " - Dénomination : #{raison_sociale_or_name(etablissement)}"
|
||
pdf.text " - Forme juridique : #{etablissement.entreprise_forme_juridique}"
|
||
if etablissement.entreprise_capital_social.present?
|
||
pdf.text " - Capital social : #{pretty_currency(etablissement.entreprise_capital_social)}"
|
||
end
|
||
pdf.text "\n"
|
||
end
|
||
|
||
def render_identite_etablissement(pdf, etablissement)
|
||
pdf.text " - SIRET : #{etablissement.siret}"
|
||
pdf.text " - SIRET du siège social: #{etablissement.entreprise.siret_siege_social}"
|
||
pdf.text " - Dénomination : #{raison_sociale_or_name(etablissement)}"
|
||
pdf.text " - Forme juridique : #{etablissement.entreprise_forme_juridique}"
|
||
if etablissement.entreprise_capital_social.present?
|
||
pdf.text " - Capital social : #{pretty_currency(etablissement.entreprise_capital_social)}"
|
||
end
|
||
pdf.text " - Libellé NAF : #{etablissement.libelle_naf}"
|
||
pdf.text " - Code NAF : #{etablissement.naf}"
|
||
pdf.text " - Date de création : #{try_format_date(etablissement.entreprise.date_creation)}"
|
||
pdf.text " - Effectif de l'organisation : #{effectif(etablissement)}"
|
||
pdf.text " - Code effectif : #{etablissement.entreprise.code_effectif_entreprise}"
|
||
pdf.text " - Numéro de TVA intracommunautaire : #{etablissement.entreprise.numero_tva_intracommunautaire}"
|
||
pdf.text " - Adresse : #{etablissement.adresse}"
|
||
if etablissement.association?
|
||
pdf.text " - Numéro RNA : #{etablissement.association_rna}"
|
||
pdf.text " - Titre : #{etablissement.association_titre}"
|
||
pdf.text " - Objet : #{etablissement.association_objet}"
|
||
pdf.text " - Date de création : #{try_format_date(etablissement.association_date_creation)}"
|
||
pdf.text " - Date de publication : #{try_format_date(etablissement.association_date_publication)}"
|
||
pdf.text " - Date de déclaration : #{try_format_date(etablissement.association_date_declaration)}"
|
||
end
|
||
pdf.text "\n"
|
||
end
|
||
|
||
def render_single_champ(pdf, champ)
|
||
case champ.type
|
||
when 'Champs::RepetitionChamp'
|
||
raise 'There should not be a RepetitionChamp here !'
|
||
when 'Champs::PieceJustificativeChamp'
|
||
return
|
||
when 'Champs::HeaderSectionChamp'
|
||
pdf.font 'liberation serif', style: :bold, size: 18 do
|
||
pdf.text champ.libelle
|
||
end
|
||
pdf.text "\n"
|
||
when 'Champs::CarteChamp'
|
||
format_in_2_lines(pdf, champ.libelle, champ.geo_json.to_s)
|
||
when 'Champs::SiretChamp'
|
||
pdf.font 'liberation serif', style: :bold, size: 12 do
|
||
pdf.text champ.libelle
|
||
end
|
||
pdf.text " - SIRET: #{champ.to_s}"
|
||
render_identite_etablissement(pdf, champ.etablissement) if champ.etablissement.present?
|
||
pdf.text "\n"
|
||
else
|
||
value = champ.to_s.empty? ? 'Non communiqué' : champ.to_s
|
||
format_in_2_lines(pdf, champ.libelle, value)
|
||
end
|
||
end
|
||
|
||
def add_champs(pdf, champs)
|
||
champs.each do |champ|
|
||
if champ.type == 'Champs::RepetitionChamp'
|
||
champ.rows.each do |row|
|
||
row.each do |inner_champ|
|
||
render_single_champ(pdf, inner_champ)
|
||
end
|
||
end
|
||
else
|
||
render_single_champ(pdf, champ)
|
||
end
|
||
end
|
||
end
|
||
|
||
def add_message(pdf, message)
|
||
sender = message.redacted_email
|
||
if message.sent_by_system?
|
||
sender = 'Email automatique'
|
||
elsif message.sent_by?(@dossier.user)
|
||
sender = @dossier.user.email
|
||
end
|
||
|
||
pdf.text "#{sender}, #{format_date(message.created_at)}", style: :bold
|
||
pdf.text ActionView::Base.full_sanitizer.sanitize(message.body)
|
||
pdf.text "\n"
|
||
end
|
||
|
||
def add_avis(pdf, avis)
|
||
pdf.text "Avis de #{avis.email_to_display}", style: :bold
|
||
if avis.confidentiel?
|
||
pdf.text "(confidentiel)", style: :bold
|
||
end
|
||
text = avis.answer || 'En attente de réponse'
|
||
pdf.text text
|
||
pdf.text "\n"
|
||
end
|
||
|
||
prawn_document(page_size: "A4") do |pdf|
|
||
pdf.font_families.update( 'liberation serif' => {
|
||
normal: Rails.root.join('lib/prawn/fonts/liberation_serif/LiberationSerif-Regular.ttf' ),
|
||
bold: Rails.root.join('lib/prawn/fonts/liberation_serif/LiberationSerif-Bold.ttf' ),
|
||
})
|
||
pdf.font 'liberation serif'
|
||
|
||
pdf.svg IO.read("app/assets/images/header/logo-ds-wide.svg"), width: 300, position: :center
|
||
pdf.move_down(40)
|
||
|
||
pdf.text "Dossier Nº #{@dossier.id} déposé sur la démarche #{@dossier.procedure.libelle}"
|
||
pdf.text "\n"
|
||
|
||
entete = "Ce dossier est <b>#{dossier_display_state(@dossier, lower: true)}</b>"
|
||
if @dossier.motivation.present?
|
||
entete += " avec la motivation suivante : #{@dossier.motivation}"
|
||
end
|
||
|
||
pdf.text entete, inline_format: true
|
||
pdf.text "\n"
|
||
|
||
add_title(pdf, "Identité du demandeur")
|
||
|
||
format_in_2_columns(pdf, "Email", @dossier.user.email)
|
||
add_identite_individual(pdf, @dossier) if @dossier.individual.present?
|
||
render_identite_etablissement(pdf, @dossier.etablissement) if @dossier.etablissement.present?
|
||
pdf.text "\n"
|
||
|
||
add_title(pdf, 'Formulaire')
|
||
add_champs(pdf, @dossier.champs)
|
||
|
||
if @include_infos_administration && @dossier.champs_private&.size > 0
|
||
add_title(pdf, "Annotations privées")
|
||
add_champs(pdf, @dossier.champs_private)
|
||
end
|
||
|
||
if @include_infos_administration && @dossier.avis.present?
|
||
add_title(pdf, "Avis")
|
||
@dossier.avis.each do |avis|
|
||
add_avis(pdf, avis)
|
||
end
|
||
end
|
||
|
||
add_title(pdf, 'Messagerie')
|
||
@dossier.commentaires.with_attached_piece_jointe.each do |commentaire|
|
||
add_message(pdf, commentaire)
|
||
end
|
||
end
|