Correção do QRCODE holerite

This commit is contained in:
2026-06-18 20:21:58 -03:00
parent 13d6c243c3
commit 6d246cadb8
3 changed files with 24 additions and 11 deletions

View File

@@ -609,9 +609,15 @@ Aplicar com: `docker-compose exec app bundle exec rails db:migrate`
o volume `.:/app` garantem que estejam disponíveis em runtime). o volume `.:/app` garantem que estejam disponíveis em runtime).
- **Assinaturas do holerite caíam na 2ª página:** após o QR Code o cursor ficava abaixo do - **Assinaturas do holerite caíam na 2ª página:** após o QR Code o cursor ficava abaixo do
limite de quebra (`start_new_page if cursor < 120`), empurrando o bloco de assinaturas para limite de quebra (`start_new_page if cursor < 120`), empurrando o bloco de assinaturas para
uma página nova. ✅ **Corrigido:** espaçamentos do holerite compactados (selo, tabelas, caixa uma página nova. ✅ **Corrigido:** espaçamentos compactados com segurança (padding das
do total, bloco do QR menor) + folga antes das assinaturas reduzida (`BasePdf#assinaturas`, tabelas `[4,8]`, QR Code menor) + folga antes das assinaturas reduzida (`BasePdf#assinaturas`,
60 → 36) — **o holerite agora cabe em uma única página**. 60 → 36, limite de quebra 120 → 100) — **o holerite agora cabe em uma única página**.
- **QR Code sobrepondo / sumindo:** o posicionamento por `move_up`/`move_down` era frágil e,
com a fonte nova, fazia o QR se sobrepor ao texto/assinaturas. ✅ **Corrigido:**
`desenhar_qrcode` agora desenha a imagem com **posição absoluta (`at:`)** — que não move o
cursor — e avança o cursor manualmente pela altura da imagem. Também garantido que cada caixa
(selo de pagamento, total) tenha folga **≥ a própria altura** para não sobrepor o conteúdo
seguinte.
### 📌 Padrão (novo) ### 📌 Padrão (novo)
- **PDFs com Prawn**: usar **sempre** a fonte TTF registrada no `BasePdf` (DejaVu, UTF-8). Nunca - **PDFs com Prawn**: usar **sempre** a fonte TTF registrada no `BasePdf` (DejaVu, UTF-8). Nunca

View File

@@ -89,7 +89,7 @@ module Pdf
# Bloco de assinaturas lado a lado: motorista (esquerda) e administrador # Bloco de assinaturas lado a lado: motorista (esquerda) e administrador
# (direita). Garante espaço criando nova página se o rodapé estiver perto. # (direita). Garante espaço criando nova página se o rodapé estiver perto.
def assinaturas(motorista: nil) def assinaturas(motorista: nil)
@pdf.start_new_page if @pdf.cursor < 120 @pdf.start_new_page if @pdf.cursor < 100
@pdf.move_down 36 @pdf.move_down 36
metade = (@pdf.bounds.width - 40) / 2.0 metade = (@pdf.bounds.width - 40) / 2.0

View File

@@ -75,7 +75,8 @@ module Pdf
at: [16, @pdf.cursor - 10], size: 10, style: :bold at: [16, @pdf.cursor - 10], size: 10, style: :bold
@pdf.text_box moeda(total), @pdf.text_box moeda(total),
at: [16, @pdf.cursor - 24], size: 22, style: :bold at: [16, @pdf.cursor - 24], size: 22, style: :bold
@pdf.move_down 48 # >= altura da caixa (50) para a próxima linha não a sobrepor.
@pdf.move_down 56
# Detalhamento: total de entregas e veículos atendidos no período # Detalhamento: total de entregas e veículos atendidos no período
total_entregas = @entregas.count total_entregas = @entregas.count
@@ -113,7 +114,8 @@ module Pdf
@pdf.fill_color(pago ? 'FFFFFF' : '374151') @pdf.fill_color(pago ? 'FFFFFF' : '374151')
@pdf.text_box texto, at: [12, @pdf.cursor - 8], width: 238, size: 10, style: :bold @pdf.text_box texto, at: [12, @pdf.cursor - 8], width: 238, size: 10, style: :bold
@pdf.fill_color '000000' @pdf.fill_color '000000'
@pdf.move_down 20 # >= altura da caixa (26) para o conteúdo seguinte não a sobrepor.
@pdf.move_down 32
end end
# Monta a URL respeitando o esquema do APP_HOST. Se vier sem http(s):// # Monta a URL respeitando o esquema do APP_HOST. Se vier sem http(s)://
@@ -137,13 +139,18 @@ module Pdf
arquivo.rewind arquivo.rewind
secao "ACESSO RÁPIDO AO SEU PAINEL" secao "ACESSO RÁPIDO AO SEU PAINEL"
@pdf.image arquivo.path, width: 92, position: :left
@pdf.move_up 80 qr_lado = 95
@pdf.text_box "Escaneie este QR Code com a câmera do celular para entrar\n" \ topo = @pdf.cursor
# Posição absoluta (at:) NÃO move o cursor — evita o cálculo frágil de
# move_up/move_down que sobrepunha o QR ao texto/assinaturas. Depois
# avançamos o cursor manualmente pela altura da imagem (quadrada).
@pdf.image arquivo.path, at: [0, topo], width: qr_lado
@pdf.text_box "Escaneie este QR Code com a câmera do celular para entrar " \
"no seu painel e acompanhar seus pagamentos.\n\n" \ "no seu painel e acompanhar seus pagamentos.\n\n" \
"Ou acesse: #{@app_host.to_s.sub(%r{\Ahttps?://}, '').chomp('/')}/motorista\ne use seu PIN de 4 dígitos.", "Ou acesse: #{@app_host.to_s.sub(%r{\Ahttps?://}, '').chomp('/')}/motorista\ne use seu PIN de 4 dígitos.",
at: [120, @pdf.cursor], width: @pdf.bounds.width - 120, size: 9 at: [qr_lado + 20, topo], width: @pdf.bounds.width - qr_lado - 20, size: 9
@pdf.move_down 85 @pdf.move_down qr_lado + 8
ensure ensure
arquivo&.close arquivo&.close
arquivo&.unlink arquivo&.unlink