develop #3
@@ -2,10 +2,10 @@ require "prawn"
|
|||||||
require "prawn/qrcode"
|
require "prawn/qrcode"
|
||||||
require "rqrcode"
|
require "rqrcode"
|
||||||
|
|
||||||
# PDF ticket generator service using Prawn
|
# Service de génération de billets PDF utilisant Prawn
|
||||||
#
|
#
|
||||||
# Generates simple, compact PDF tickets with QR codes for event entry validation
|
# Génère des billets PDF simples et compacts avec codes QR pour la validation d'entrée
|
||||||
# Clean, minimalist design that fits on a single page
|
# Design propre et minimaliste qui tient sur une seule page
|
||||||
class TicketPdfGenerator
|
class TicketPdfGenerator
|
||||||
# Suppress Prawn's internationalization warning for built-in fonts
|
# Suppress Prawn's internationalization warning for built-in fonts
|
||||||
Prawn::Fonts::AFM.hide_m17n_warning = true
|
Prawn::Fonts::AFM.hide_m17n_warning = true
|
||||||
@@ -41,34 +41,34 @@ class TicketPdfGenerator
|
|||||||
|
|
||||||
# Customer name
|
# Customer name
|
||||||
pdf.indent 10 do
|
pdf.indent 10 do
|
||||||
pdf.text "Ticket Holder:", style: :bold
|
pdf.text "Titulaire du billet :", style: :bold
|
||||||
pdf.text "#{ticket.first_name} #{ticket.last_name}"
|
pdf.text "#{ticket.first_name} #{ticket.last_name}"
|
||||||
end
|
end
|
||||||
pdf.move_down 8
|
pdf.move_down 8
|
||||||
|
|
||||||
# Ticket details
|
# Ticket details
|
||||||
pdf.indent 10 do
|
pdf.indent 10 do
|
||||||
pdf.text "Ticket Type:", style: :bold
|
pdf.text "Type de billet :", style: :bold
|
||||||
pdf.text ticket.ticket_type.name
|
pdf.text ticket.ticket_type.name
|
||||||
end
|
end
|
||||||
pdf.move_down 8
|
pdf.move_down 8
|
||||||
|
|
||||||
pdf.indent 10 do
|
pdf.indent 10 do
|
||||||
pdf.text "Price:", style: :bold
|
pdf.text "Prix :", style: :bold
|
||||||
pdf.text "€#{ticket.price_euros}"
|
pdf.text "#{ticket.price_euros} €"
|
||||||
end
|
end
|
||||||
pdf.move_down 8
|
pdf.move_down 8
|
||||||
|
|
||||||
pdf.indent 10 do
|
pdf.indent 10 do
|
||||||
pdf.text "Date & Time:", style: :bold
|
pdf.text "Date et heure :", style: :bold
|
||||||
pdf.text ticket.event.start_time.strftime("%B %d, %Y at %I:%M %p")
|
pdf.text ticket.event.start_time.strftime("%d %B %Y à %H:%M")
|
||||||
end
|
end
|
||||||
pdf.move_down 20
|
pdf.move_down 20
|
||||||
|
|
||||||
# Venue information
|
# Informations sur le lieu
|
||||||
pdf.fill_color "374151"
|
pdf.fill_color "374151"
|
||||||
pdf.font "Helvetica", style: :bold, size: 14
|
pdf.font "Helvetica", style: :bold, size: 14
|
||||||
pdf.text "Venue Information"
|
pdf.text "Informations sur le lieu"
|
||||||
pdf.move_down 8
|
pdf.move_down 8
|
||||||
|
|
||||||
pdf.font "Helvetica", size: 11
|
pdf.font "Helvetica", size: 11
|
||||||
@@ -76,10 +76,10 @@ class TicketPdfGenerator
|
|||||||
pdf.text ticket.event.venue_address
|
pdf.text ticket.event.venue_address
|
||||||
pdf.move_down 20
|
pdf.move_down 20
|
||||||
|
|
||||||
# QR Code
|
# Code QR
|
||||||
pdf.fill_color "000000"
|
pdf.fill_color "000000"
|
||||||
pdf.font "Helvetica", style: :bold, size: 14
|
pdf.font "Helvetica", style: :bold, size: 14
|
||||||
pdf.text "QR Code", align: :center
|
pdf.text "Code QR", align: :center
|
||||||
pdf.move_down 10
|
pdf.move_down 10
|
||||||
|
|
||||||
# Ensure all required data is present before generating QR code
|
# Ensure all required data is present before generating QR code
|
||||||
@@ -116,7 +116,7 @@ class TicketPdfGenerator
|
|||||||
# Ticket ID
|
# Ticket ID
|
||||||
pdf.font "Helvetica", size: 8
|
pdf.font "Helvetica", size: 8
|
||||||
pdf.fill_color "6B7280"
|
pdf.fill_color "6B7280"
|
||||||
pdf.text "Ticket ID: #{ticket.id}", align: :center
|
pdf.text "ID du billet : #{ticket.id}", align: :center
|
||||||
|
|
||||||
# Footer
|
# Footer
|
||||||
pdf.move_down 30
|
pdf.move_down 30
|
||||||
@@ -126,17 +126,17 @@ class TicketPdfGenerator
|
|||||||
|
|
||||||
pdf.font "Helvetica", size: 8
|
pdf.font "Helvetica", size: 8
|
||||||
pdf.fill_color "6B7280"
|
pdf.fill_color "6B7280"
|
||||||
pdf.text "This ticket is valid for one entry only.", align: :center
|
pdf.text "Ce billet est valable pour une seule entrée.", align: :center
|
||||||
pdf.text "Present this ticket at the venue entrance.", align: :center
|
pdf.text "Présentez ce billet à l'entrée du lieu.", align: :center
|
||||||
pdf.move_down 5
|
pdf.move_down 5
|
||||||
pdf.text "Generated on #{Time.current.strftime('%B %d, %Y at %I:%M %p')}", align: :center
|
pdf.text "Généré le #{Time.current.strftime('%d %B %Y à %H:%M')}", align: :center
|
||||||
end.render
|
end.render
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def create_simple_header(pdf)
|
def create_simple_header(pdf)
|
||||||
# Brand name
|
# Nom de la marque
|
||||||
pdf.fill_color "6366F1"
|
pdf.fill_color "6366F1"
|
||||||
pdf.font "Helvetica", style: :bold, size: 24
|
pdf.font "Helvetica", style: :bold, size: 24
|
||||||
pdf.text "AperoNight", align: :center
|
pdf.text "AperoNight", align: :center
|
||||||
@@ -155,7 +155,7 @@ class TicketPdfGenerator
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create_ticket_info(pdf)
|
def create_ticket_info(pdf)
|
||||||
# Event name - prominent
|
# Nom de l'événement - proéminent
|
||||||
pdf.fill_color "1F2937"
|
pdf.fill_color "1F2937"
|
||||||
pdf.font "Helvetica", style: :bold, size: 18
|
pdf.font "Helvetica", style: :bold, size: 18
|
||||||
pdf.text ticket.event.name, align: :center
|
pdf.text ticket.event.name, align: :center
|
||||||
@@ -173,7 +173,7 @@ class TicketPdfGenerator
|
|||||||
# Right column
|
# Right column
|
||||||
pdf.bounding_box([pdf.bounds.width / 2 + 20, pdf.cursor], width: pdf.bounds.width / 2 - 20, height: 120) do
|
pdf.bounding_box([pdf.bounds.width / 2 + 20, pdf.cursor], width: pdf.bounds.width / 2 - 20, height: 120) do
|
||||||
create_info_item(pdf, "Type", ticket.ticket_type.name)
|
create_info_item(pdf, "Type", ticket.ticket_type.name)
|
||||||
create_info_item(pdf, "Prix", "#{sprintf('%.2f', ticket.price_euros)} EUR")
|
create_info_item(pdf, "Prix", "#{sprintf('%.2f', ticket.price_euros)} €")
|
||||||
create_info_item(pdf, "Titulaire", "#{ticket.first_name} #{ticket.last_name}")
|
create_info_item(pdf, "Titulaire", "#{ticket.first_name} #{ticket.last_name}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user