module Ruport
class Renderer
class Invoice < Ruport::Renderer
include Renderer::Helpers
required_option :customer_info
required_option :company_info
required_option :order_info
required_option :comments
option :title
stage :invoice_headers
stage :invoice_body
stage :invoice_footer
finalize :invoice
module InvoiceHelpers
def build_company_header
@tod = pdf_writer.y
rounded_text_box(options.company_info) { |o|
o.radius = 3
o.width = options.header_width || 200
o.height = options.header_height || 50
o.font_size = options.header_font_size || 10
o.y = pdf_writer.y
o.x = pdf_writer.absolute_left_margin + 10
}
end
def build_customer_header
move_cursor -5
rounded_text_box(options.customer_info) { |o|
o.radius = 3
o.width = options.header_width || 200
o.height = options.header_height || 50
o.font_size = options.header_font_size || 10
o.y = pdf_writer.y
o.x = pdf_writer.absolute_left_margin + 10
}
end
def build_title
add_title(options.title) if options.title
end
def add_title( title )
rounded_text_box("#{title}") do |o|
o.fill_color = Color::RGB::Gray80
o.radius = 5
o.width = options.header_width || 200
o.height = options.header_height || 20
o.font_size = options.header_font_size || 11
o.x = pdf_writer.absolute_right_margin - o.width
o.y = pdf_writer.absolute_top_margin
end
end
def build_order_header
if options.order_info
rounded_text_box("#{options.order_info}") do |o|
o.radius = 5
o.heading = "Billing Information"
o.width = options.header_width || 200
o.height = options.header_height || 80
o.font_size = options.header_font_size || 10
o.x = pdf_writer.absolute_right_margin - o.width
o.y = pdf_writer.absolute_top_margin - 25
end
end
end
def horizontal_line(x1,x2)
pdf_writer.line(x1,pdf_writer.y,x2,pdf_writer.y)
pdf_writer.stroke
end
def text_box(content,opts={})
::PDF::SimpleTable.new do |table|
table.data = content.to_a.inject([]) do |s,line|
s << { "value" => line, }
end
table.column_order = "value"
table.show_headings = false
table.show_lines = :outer
table.shade_rows = :none
table.width = opts[:width] || 200
table.orientation = opts[:orientation] || :right
table.position = opts[:position] || :left
table.font_size = opts[:font_size] || 10
table.render_on(pdf_writer)
end
end
end
class PDF < Ruport::Format::PDF
include InvoiceHelpers
Invoice.add_format self, :pdf
def build_invoice_headers
build_company_header
build_customer_header
build_title
build_order_header
end
def build_invoice_body
pdf_writer.y = 600
Ruport::Renderer::Table.render_pdf { |r|
r.data = data
r.plugin.pdf_writer = pdf_writer
r.options.table_width = options.body_width || 450
}
end
def build_invoice_footer
# footer
pdf_writer.open_object do |footer|
pdf_writer.save_state
pdf_writer.stroke_color! Color::RGB::Black
pdf_writer.stroke_style! ::PDF::Writer::StrokeStyle::DEFAULT
if options.comments
move_cursor_to 60
horizontal_line pdf_writer.absolute_left_margin + 20,
pdf_writer.absolute_right_margin-25
move_cursor -10
add_text(options.comments,:justification => :center,
:left => 0, :right => 0 )
end
pdf_writer.restore_state
pdf_writer.close_object
pdf_writer.add_object(footer, :all_pages)
end
end
def finalize_invoice
output << pdf_writer.render
end
end
end
end
end
module Ruport::Report::Invoice
def render_invoice(*args,&block)
Ruport::Renderer::Invoice.render_pdf(*args,&block)
end
end