0ffdbbdc6d
When the procedure libelle overflows on several lines, it should push the next fields down (instead of overlapping them).
231 lines
7.1 KiB
Ruby
231 lines
7.1 KiB
Ruby
require 'prawn/measurement_extensions'
|
|
|
|
# Render text in a box that expands vertically, then move the cursor down to the end of the rendered text
|
|
def render_expanding_text_box(pdf, text, options)
|
|
box = Prawn::Text::Box.new(text, options.merge(document: pdf, overflow: :expand))
|
|
|
|
box.render(dry_run: true)
|
|
vertical_space_used = box.height
|
|
|
|
box.render
|
|
pdf.move_down(vertical_space_used)
|
|
end
|
|
|
|
def render_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]
|
|
render_expanding_text_box(pdf, text, width: 420, height: 100, at: [110, pdf.cursor])
|
|
pdf.text "\n"
|
|
end
|
|
|
|
def format_in_2_lines(pdf, champ, nb_lines = 1)
|
|
add_single_line(pdf, champ.libelle, 9, :bold)
|
|
add_optionnal_description(pdf, champ)
|
|
height = 10 * (nb_lines+1)
|
|
pdf.bounding_box([0, pdf.cursor],:width => 460,:height => height) do
|
|
pdf.stroke_bounds
|
|
end
|
|
pdf.text "\n"
|
|
end
|
|
|
|
def format_in_2_columns(pdf, label)
|
|
pdf.text_box label, width: 200, height: 100, overflow: :expand, at: [0, pdf.cursor]
|
|
pdf.bounding_box([110, pdf.cursor+5],:width => 350,:height => 20) do
|
|
pdf.stroke_bounds
|
|
end
|
|
|
|
pdf.text "\n"
|
|
end
|
|
|
|
def format_with_checkbox(pdf, option, offset = 0)
|
|
# Option is a [text, value] pair, or a string used for both.
|
|
label = option.is_a?(String) ? option : option.first
|
|
value = option.is_a?(String) ? option : option.last
|
|
|
|
if value == Champs::DropDownListChamp::OTHER
|
|
label += " : "
|
|
end
|
|
|
|
pdf.font 'marianne', size: 9 do
|
|
pdf.stroke_rectangle [0 + offset, pdf.cursor], 10, 10
|
|
pdf.text_box label, at: [15 + offset, pdf.cursor - 1]
|
|
|
|
if value == Champs::DropDownListChamp::OTHER
|
|
pdf.bounding_box([110, pdf.cursor + 3],:width => 350,:height => 20) do
|
|
pdf.stroke_bounds
|
|
end
|
|
end
|
|
end
|
|
pdf.text "\n"
|
|
end
|
|
|
|
def add_page_numbering(pdf)
|
|
# This method should be called at the end of the drawing since pages drawn after
|
|
# do not have page numbering
|
|
string = '<page> / <total>'
|
|
options = {
|
|
at: [0, -15],
|
|
align: :right
|
|
}
|
|
pdf.number_pages string, options
|
|
end
|
|
|
|
def add_procedure(pdf, dossier)
|
|
pdf.repeat(lambda {|page| page > 1 }) do
|
|
pdf.draw_text dossier.procedure.libelle, :at => pdf.bounds.top_left
|
|
end
|
|
end
|
|
|
|
def format_date(date)
|
|
I18n.l(date, format: :message_date_with_year)
|
|
end
|
|
|
|
def add_identite_individual(pdf, dossier)
|
|
format_in_2_columns(pdf, "Civilité")
|
|
format_in_2_columns(pdf, "Nom")
|
|
format_in_2_columns(pdf, "Prénom")
|
|
format_in_2_columns(pdf, "Date de naissance")
|
|
end
|
|
|
|
def add_identite_etablissement(pdf, libelle)
|
|
add_single_line(pdf, libelle, 9, :bold)
|
|
|
|
format_in_2_columns(pdf, "SIRET")
|
|
format_in_2_columns(pdf, "Dénomination")
|
|
format_in_2_columns(pdf, "Forme juridique")
|
|
end
|
|
|
|
def add_single_line(pdf, libelle, size, style)
|
|
pdf.font 'marianne', style: style, size: size do
|
|
pdf.text libelle
|
|
end
|
|
end
|
|
|
|
def add_title(pdf, title)
|
|
add_single_line(pdf, title, 20, :bold)
|
|
pdf.text "\n"
|
|
end
|
|
|
|
def add_libelle(pdf, champ)
|
|
add_single_line(pdf, champ.libelle, 9, :bold)
|
|
end
|
|
|
|
def add_explanation(pdf, explanation)
|
|
add_single_line(pdf, explanation, 9, :italic)
|
|
end
|
|
|
|
def add_optionnal_description(pdf, champ)
|
|
add_explanation(pdf, champ.description.strip + "\n\n") if champ.description.present?
|
|
end
|
|
|
|
def render_single_champ(pdf, champ)
|
|
case champ.type
|
|
when 'Champs::RepetitionChamp'
|
|
raise 'There should not be a RepetitionChamp here !'
|
|
when 'Champs::PieceJustificativeChamp'
|
|
add_single_line(pdf, 'Pièce justificative à joindre en complément du dossier', 9, :bold)
|
|
format_with_checkbox(pdf, champ.libelle)
|
|
add_optionnal_description(pdf, champ)
|
|
pdf.text "\n"
|
|
when 'Champs::YesNoChamp', 'Champs::CheckboxChamp'
|
|
add_libelle(pdf, champ)
|
|
add_optionnal_description(pdf, champ)
|
|
add_explanation(pdf, 'Cochez la mention applicable')
|
|
format_with_checkbox(pdf, 'Oui')
|
|
format_with_checkbox(pdf, 'Non')
|
|
pdf.text "\n"
|
|
when 'Champs::CiviliteChamp'
|
|
add_libelle(pdf, champ)
|
|
add_optionnal_description(pdf, champ)
|
|
format_with_checkbox(pdf, Individual::GENDER_FEMALE)
|
|
format_with_checkbox(pdf, Individual::GENDER_MALE)
|
|
pdf.text "\n"
|
|
when 'Champs::HeaderSectionChamp'
|
|
add_single_line(pdf, champ.libelle, 14, :bold)
|
|
add_optionnal_description(pdf, champ)
|
|
pdf.text "\n"
|
|
when 'Champs::ExplicationChamp'
|
|
add_libelle(pdf, champ)
|
|
pdf.text champ.description
|
|
pdf.text "\n"
|
|
when 'Champs::AddressChamp', 'Champs::CarteChamp', 'Champs::TextareaChamp'
|
|
format_in_2_lines(pdf, champ, 5)
|
|
when 'Champs::DropDownListChamp'
|
|
add_libelle(pdf, champ)
|
|
add_optionnal_description(pdf, champ)
|
|
add_explanation(pdf, 'Cochez la mention applicable, une seule valeur possible')
|
|
champ.options.reject(&:blank?).each do |option|
|
|
format_with_checkbox(pdf, option)
|
|
end
|
|
pdf.text "\n"
|
|
when 'Champs::MultipleDropDownListChamp'
|
|
add_libelle(pdf, champ)
|
|
add_optionnal_description(pdf, champ)
|
|
add_explanation(pdf, 'Cochez la mention applicable, plusieurs valeurs possibles')
|
|
champ.options.reject(&:blank?).each do |option|
|
|
format_with_checkbox(pdf, option)
|
|
end
|
|
pdf.text "\n"
|
|
when 'Champs::LinkedDropDownListChamp'
|
|
add_libelle(pdf, champ)
|
|
champ.primary_options.reject(&:blank?).each do |o|
|
|
format_with_checkbox(pdf, o)
|
|
champ.secondary_options[o].reject(&:blank?).each do |secondary_option|
|
|
format_with_checkbox(pdf, secondary_option, 15)
|
|
end
|
|
end
|
|
pdf.text "\n"
|
|
when 'Champs::SiretChamp'
|
|
add_identite_etablissement(pdf, champ.libelle)
|
|
else
|
|
format_in_2_lines(pdf, champ)
|
|
end
|
|
end
|
|
|
|
def add_champs(pdf, champs)
|
|
champs.each do |champ|
|
|
if champ.type == 'Champs::RepetitionChamp'
|
|
add_libelle(pdf, champ)
|
|
(1..3).each do
|
|
champ.rows.each do |row|
|
|
row.each do |inner_champ|
|
|
render_single_champ(pdf, inner_champ)
|
|
end
|
|
end
|
|
end
|
|
else
|
|
render_single_champ(pdf, champ)
|
|
end
|
|
end
|
|
end
|
|
|
|
prawn_document(page_size: "A4") do |pdf|
|
|
pdf.font_families.update( 'marianne' => {
|
|
normal: Rails.root.join('lib/prawn/fonts/marianne/marianne-regular.ttf' ),
|
|
bold: Rails.root.join('lib/prawn/fonts/marianne/marianne-bold.ttf' ),
|
|
italic: Rails.root.join('lib/prawn/fonts/marianne/marianne-thin.ttf' ),
|
|
})
|
|
pdf.font 'marianne'
|
|
pdf.svg IO.read(DOSSIER_PDF_EXPORT_LOGO_SRC), width: 300, position: :center
|
|
pdf.move_down(40)
|
|
|
|
render_in_2_columns(pdf, 'Démarche', @dossier.procedure.libelle)
|
|
render_in_2_columns(pdf, 'Organisme', @dossier.procedure.organisation_name || "En attente de saisi")
|
|
pdf.text "\n"
|
|
|
|
add_title(pdf, "Identité du demandeur")
|
|
|
|
format_in_2_columns(pdf, "Email")
|
|
if @dossier.procedure.for_individual?
|
|
add_identite_individual(pdf, @dossier)
|
|
else
|
|
render_identite_etablissement(pdf, @dossier.etablissement) if @dossier.etablissement.present?
|
|
end
|
|
pdf.text "\n"
|
|
|
|
add_title(pdf, 'Formulaire')
|
|
add_single_line(pdf, @dossier.procedure.description + "\n", 9, :italic) if @dossier.procedure.description.present?
|
|
add_champs(pdf, @dossier.champs)
|
|
add_page_numbering(pdf)
|
|
add_procedure(pdf, @dossier)
|
|
end
|