- Enhanced events index page with improved visual design and better information display - Completely redesigned event show page with modern layout, ticket selection, and checkout functionality - Implemented Stripe payment processing for ticket purchases - Created ticket generation system with PDF tickets and QR codes - Added email confirmation system with ticket attachments - Updated database configuration to use SQLite for easier development setup - Fixed gem dependencies and resolved conflicts - Improved error handling throughout the checkout process - Enhanced Stimulus controller for ticket cart management - Added proper redirect handling for successful and cancelled payments
97 lines
2.6 KiB
Ruby
Executable File
97 lines
2.6 KiB
Ruby
Executable File
require 'prawn'
|
|
require 'prawn/qrcode'
|
|
require 'rqrcode'
|
|
|
|
class TicketPdfGenerator
|
|
attr_reader :ticket
|
|
|
|
def initialize(ticket)
|
|
@ticket = ticket
|
|
end
|
|
|
|
def generate
|
|
Prawn::Document.new(page_size: [350, 600], margin: 20) do |pdf|
|
|
# Header
|
|
pdf.fill_color "2D1B69"
|
|
pdf.font "Helvetica", style: :bold, size: 24
|
|
pdf.text "ApéroNight", align: :center
|
|
pdf.move_down 10
|
|
|
|
# Event name
|
|
pdf.fill_color "000000"
|
|
pdf.font "Helvetica", style: :bold, size: 18
|
|
pdf.text ticket.event.name, align: :center
|
|
pdf.move_down 20
|
|
|
|
# Ticket info box
|
|
pdf.stroke_color "E5E7EB"
|
|
pdf.fill_color "F9FAFB"
|
|
pdf.rounded_rectangle [0, pdf.cursor], 310, 120, 10
|
|
pdf.fill_and_stroke
|
|
|
|
pdf.move_down 10
|
|
pdf.fill_color "000000"
|
|
pdf.font "Helvetica", size: 12
|
|
|
|
# Ticket details
|
|
pdf.text "Ticket Type:", style: :bold
|
|
pdf.text ticket.ticket_type.name
|
|
pdf.move_down 8
|
|
|
|
pdf.text "Price:", style: :bold
|
|
pdf.text "€#{ticket.price_euros}"
|
|
pdf.move_down 8
|
|
|
|
pdf.text "Date & Time:", style: :bold
|
|
pdf.text ticket.event.start_time.strftime("%B %d, %Y at %I:%M %p")
|
|
pdf.move_down 20
|
|
|
|
# Venue information
|
|
pdf.fill_color "374151"
|
|
pdf.font "Helvetica", style: :bold, size: 14
|
|
pdf.text "Venue Information"
|
|
pdf.move_down 8
|
|
|
|
pdf.font "Helvetica", size: 11
|
|
pdf.text ticket.event.venue_name, style: :bold
|
|
pdf.text ticket.event.venue_address
|
|
pdf.move_down 20
|
|
|
|
# QR Code
|
|
pdf.fill_color "000000"
|
|
pdf.font "Helvetica", style: :bold, size: 14
|
|
pdf.text "Ticket QR Code", align: :center
|
|
pdf.move_down 10
|
|
|
|
qr_code_data = {
|
|
ticket_id: ticket.id,
|
|
qr_code: ticket.qr_code,
|
|
event_id: ticket.event.id,
|
|
user_id: ticket.user.id
|
|
}.to_json
|
|
|
|
qrcode = RQRCode::QRCode.new(qr_code_data)
|
|
pdf.print_qr_code(qrcode, extent: 120, align: :center)
|
|
|
|
pdf.move_down 15
|
|
|
|
# QR code text
|
|
pdf.font "Helvetica", size: 8
|
|
pdf.fill_color "6B7280"
|
|
pdf.text "QR Code: #{ticket.qr_code[0..7]}...", align: :center
|
|
|
|
# Footer
|
|
pdf.move_down 30
|
|
pdf.stroke_color "E5E7EB"
|
|
pdf.horizontal_line 0, 310
|
|
pdf.move_down 10
|
|
|
|
pdf.font "Helvetica", size: 8
|
|
pdf.fill_color "6B7280"
|
|
pdf.text "This ticket is valid for one entry only.", align: :center
|
|
pdf.text "Present this ticket at the venue entrance.", align: :center
|
|
pdf.move_down 5
|
|
pdf.text "Generated on #{Time.current.strftime('%B %d, %Y at %I:%M %p')}", align: :center
|
|
end.render
|
|
end
|
|
end |