class Receipt::Pdf

Attributes

errors[R]
params[R]

Public Class Methods

new(params) click to toggle source
# File lib/receipt/pdf.rb, line 27
def initialize(params)
  @params = OpenStruct.new(params)
  setup_i18n

  @errors = {}
end

Public Instance Methods

after_receipt_box(&block) click to toggle source
# File lib/receipt/pdf.rb, line 55
def after_receipt_box(&block)
  @after ||= block
end
before_receipt_box(&block) click to toggle source
# File lib/receipt/pdf.rb, line 51
def before_receipt_box(&block)
  @before ||= block
end
currency() click to toggle source
# File lib/receipt/pdf.rb, line 83
def currency
  params.currency || t('receipt.currency')
end
data() click to toggle source
# File lib/receipt/pdf.rb, line 34
def data
  return unless valid?

  generate
  render
end
file() click to toggle source
# File lib/receipt/pdf.rb, line 41
def file
  return unless valid?

  @file ||= lambda do
    generate
    save_as(path)
    path
  end.call
end
filename() click to toggle source
# File lib/receipt/pdf.rb, line 75
def filename
  File.basename(path)
end
mimetype() click to toggle source
# File lib/receipt/pdf.rb, line 79
def mimetype
  'application/pdf'
end
valid?() click to toggle source
# File lib/receipt/pdf.rb, line 59
def valid?
  [
    :id,
    :amount,
    :payer,
    :receiver,
    :description
  ].each do |p|
    if params.send(p).to_s.empty?
      @errors[p] = t('receipt.errors.required_param_not_found')
    end
  end

  @errors.size == 0
end

Private Instance Methods

body() click to toggle source
# File lib/receipt/pdf.rb, line 114
def body
  text(
    [
      "#{t('receipt.received_from')} <b>#{payer}</b>",
      "#{t('receipt.the_amount_of')} <b>#{formated_amount}</b>",
      "#{t('receipt.relating_to')} <b>#{description}</b>."
    ].join(' '),
    inline_format: true
  )
end
centered_text(s) click to toggle source
# File lib/receipt/pdf.rb, line 172
def centered_text(s)
  text(s, align: :center)
end
date_box(x, y, width) click to toggle source
# File lib/receipt/pdf.rb, line 145
def date_box(x, y, width)
  bounding_box [x, y], width: width do
    text(
      [
        location,
        l(date, format: :long)
      ].compact.join(', ')
    )
  end
end
formated_amount() click to toggle source
# File lib/receipt/pdf.rb, line 138
def formated_amount
  [
    currency,
    amount
  ].compact.join(' ')
end
generate() click to toggle source
# File lib/receipt/pdf.rb, line 88
def generate
  valid?

  before_receipt_box.call if before_receipt_box

  move_down 20
  receipt_box

  move_down 20
  after_receipt_box.call if after_receipt_box
end
header() click to toggle source
# File lib/receipt/pdf.rb, line 100
def header
  pad(10) do
    text(t('receipt.title').upcase, align: :center, style: :bold, size: 20)

    move_up 20
    text("#{t('receipt.number')}: <b>#{id}</b>", inline_format: true)

    move_up 15
    text("#{t('receipt.amount')}: <b>#{formated_amount}</b>",
         inline_format: true, align: :right)
    pad(10) { stroke_horizontal_rule }
  end
end
load_translations() click to toggle source
# File lib/receipt/pdf.rb, line 195
def load_translations
  locales = Dir[File.expand_path('../../../config/locale/*.yml', __FILE__)]
  I18n.load_path += locales
  I18n.backend.load_translations
end
padded_bounding_box(padding, *args) { || ... } click to toggle source
# File lib/receipt/pdf.rb, line 176
def padded_bounding_box(padding, *args)
  bounding_box(*args) do
    stroke_bounds

    bounding_box(
      [padding, bounds.height - padding],
      width: bounds.width - (2 * padding),
      height: bounds.height - (2 * padding)
    ) do
      yield
    end
  end
end
path() click to toggle source
# File lib/receipt/pdf.rb, line 205
def path
  @path ||= (params.filepath || tempfilepath)
end
receipt_box() click to toggle source
# File lib/receipt/pdf.rb, line 156
def receipt_box
  padded_bounding_box(10, [30, cursor], width: 500, height: 250) do
    header
    body
    footer
  end
end
set_locale() click to toggle source
# File lib/receipt/pdf.rb, line 201
def set_locale
  I18n.locale = (locale || I18n.default_locale)
end
setup_i18n() click to toggle source
# File lib/receipt/pdf.rb, line 190
def setup_i18n
  load_translations
  set_locale
end
signature_box(x, y, width) click to toggle source
# File lib/receipt/pdf.rb, line 164
def signature_box(x, y, width)
  bounding_box [x, y], width: width do
    stroke_horizontal_rule
    move_down 10
    centered_text(receiver)
  end
end
tempfilepath() click to toggle source
# File lib/receipt/pdf.rb, line 209
def tempfilepath
  @tempfilepath ||= File.join(
    Dir.tmpdir,
    Dir::Tmpname.make_tmpname("#{t('receipt.title')}", "#{id}.pdf")
  )
end