From 657c0e3b64d4773731a8afe33e1634a8ff9564e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A8caiovelp=C2=A8?= <¨cparanhos@id.uff.br¨> Date: Wed, 8 Jan 2025 00:38:35 -0300 Subject: [PATCH] issue-218: use erb formatter instead of regex --- app/helpers/assertions_pdf_helper.rb | 65 +++++-------------- ..._and_assertion_for_external_participant.rb | 2 +- ...query_and_assertion_for_examining_board.rb | 2 +- ..._query_and_assertion_for_avulso_student.rb | 1 - 4 files changed, 20 insertions(+), 50 deletions(-) diff --git a/app/helpers/assertions_pdf_helper.rb b/app/helpers/assertions_pdf_helper.rb index 36ee4cdc..ef3ee9dc 100644 --- a/app/helpers/assertions_pdf_helper.rb +++ b/app/helpers/assertions_pdf_helper.rb @@ -4,38 +4,21 @@ module AssertionsPdfHelper include AssertionHelperConcern - def mask_cpf(cpf) - cpf.gsub(/(\d{3})(\d{3})(\d{3})(\d{2})/, '\1.\2.\3-\4') + def format_text(bindings, template) + formatter = ErbFormatter.new(bindings) + formatter.format(template) end - def format_date(date) - I18n.l(date, format: :long, locale: :'pt-BR') - end - - def replace_placeholders(template, values, records = []) - template = template.dup - values.each do |key, value| - template.gsub!("<%= var('#{key}') %>", value.to_s) - end - - record_template = template.scan(/<% records.each do \|record\| %>(.*?)<% end %>/m).flatten.first - unless record_template.nil? - record_text = records.map do |record| - record_content = record_template.dup - record.each do |key, value| - record_content.gsub!("<%= record['#{key}'] %>", value.to_s) - end - record_content - end.join("") - template.gsub!(/<% records.each do \|record\| %>.*?<% end %>/m, record_text) + def find_unique_columns(columns, rows) + columns.select do |column| + rows.all? { |row| row[columns.index(column)] == rows.first[columns.index(column)] } end - - template end - def assertion_box_text_print(pdf, template, values, records = [], box_width, box_height) + def assertion_box_text_print(pdf, template, bindings, box_width, box_height) pdf.move_down 30 - text = replace_placeholders(template, values, records) + + text = format_text(bindings, template) lines = pdf.text_box text, at: [(pdf.bounds.width - box_width) / 2, pdf.cursor], width: box_width, height: box_height, align: :justify, inline_format: true, dry_run: true @@ -57,31 +40,19 @@ def assertion_table(pdf, options = {}) rows = results[:rows] columns = results[:columns] - # Identifica registros com colunas com valores idênticos para cada linha - unique_columns = columns.select do |column| - rows.all? { |row| row[columns.index(column)] == rows.first[columns.index(column)] } - end - - # Recupera os valores únicos para as colunas identificadas - values = unique_columns.index_with do |column| - rows.first[columns.index(column)] - end - values['cpf_aluno'] = mask_cpf(values['cpf_aluno']) if values.key?('cpf_aluno') - values['data'] = format_date(Date.parse(values['data'])) if values.key?('data') - - # Prepara os registros para impressão excluindo as colunas identificadas como únicas - records = rows.each_with_index.map do |row, index| - record = { 'counter' => (index + 1).to_s } - columns.each do |column| - next if unique_columns.include?(column) - record[column] = row[columns.index(column)] - end - record + if results[:rows].size == 1 + bindings = {}.merge(Hash[columns.zip(rows.first)]) + else + unique_columns = find_unique_columns(columns, rows) + bindings = { + rows: rows, + columns: columns + }.merge(Hash[unique_columns.zip(rows.first.values_at(*unique_columns.map { |col| columns.index(col) }))]) end box_width = 500 box_height = 560 - assertion_box_text_print(pdf, template, values, records, box_width, box_height) + assertion_box_text_print(pdf, template, bindings, box_width, box_height) end end \ No newline at end of file diff --git a/db/migrate/20241220124937_add_query_and_assertion_for_external_participant.rb b/db/migrate/20241220124937_add_query_and_assertion_for_external_participant.rb index 8c969c4f..9a4eb303 100644 --- a/db/migrate/20241220124937_add_query_and_assertion_for_external_participant.rb +++ b/db/migrate/20241220124937_add_query_and_assertion_for_external_participant.rb @@ -38,7 +38,7 @@ def up VALUES ( 'Declaração de participante externo em defesa de tese', #{query_id}, - 'A quem possa interessar, Declaramos que o professor <%= var(''nome_professor'') %> participou da banca de defesa da dissertação de <%= var(''nivel_aluno'') %> de <%= var(''nome_aluno'') %>, no dia <%= var(''data'') %>.', + 'A quem possa interessar, declaramos que o professor(a) <%= var('nome_professor') %> participou da banca de defesa da dissertação de <%= var('nivel_aluno') %> de <%= var('nome_aluno') %>, no dia <%= localize(var('data'),:longdate) %>.', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP ); diff --git a/db/migrate/20241220144358_add_query_and_assertion_for_examining_board.rb b/db/migrate/20241220144358_add_query_and_assertion_for_examining_board.rb index 0a363c18..93543bf3 100644 --- a/db/migrate/20241220144358_add_query_and_assertion_for_examining_board.rb +++ b/db/migrate/20241220144358_add_query_and_assertion_for_examining_board.rb @@ -39,7 +39,7 @@ def up VALUES ( 'Declaração da ata de defesa', #{query_id}, - 'Declaro, para os devidos fins, que a Banca Examinadora da Defesa de Dissertação de Mestrado intitulada “<%= var(''titulo_tese'') %>”, apresentada pelo aluno <%= var(''nome_aluno'') %>, no dia <%= var(''data'') %>, no no Instituto de Computação da Universidade Federal Fluminense, foi composta pelos seguintes membros: + 'Declaro, para os devidos fins, que a Banca Examinadora da Defesa de Dissertação de Mestrado intitulada “<%= var('titulo_tese') %>”, apresentada pelo aluno <%= var('nome_aluno') %>, no dia <%= localize(var('data'), :longdate) %>, no $REPLACE_UNIVERSITY, foi composta pelos seguintes membros: <% records.each do |record| %> - Prof. <%= record[''nome_professor''] %>, <%= record[''codigo_instituicao''] %> diff --git a/db/migrate/20241220150416_add_query_and_assertion_for_avulso_student.rb b/db/migrate/20241220150416_add_query_and_assertion_for_avulso_student.rb index 38f37431..18761765 100644 --- a/db/migrate/20241220150416_add_query_and_assertion_for_avulso_student.rb +++ b/db/migrate/20241220150416_add_query_and_assertion_for_avulso_student.rb @@ -6,7 +6,6 @@ def up 'DECLARAÇÃO - Disciplinas de aluno avulso', 'SELECT s.name as nome_aluno, - s.cpf as cpf_aluno, c.name as nome_disciplina, c.workload as carga_horaria, cs.year as ano_disciplina,