class Girocode::Code

Constants

AMOUNT_RANGE
ATTRIBUTES
MAX_PAYLOAD_BYTES

Public Class Methods

new(**attrs) click to toggle source
# File lib/girocode/code.rb, line 11
def initialize(**attrs)
  if keys = attrs.keys - ATTRIBUTES and not keys.empty?
    raise ArgumentError, "Illegal attributes #{keys.inspect}"
  end
  attrs.each { |attr, value| send("#{attr}=", value) }
  raise ArgumentError, "iban is required" unless iban?
  raise ArgumentError, "name is required" unless name?
  raise ArgumentError, 'currency is required for amount' if amount && !currency?
  raise ArgumentError, "either creditor reference or reference may be set" if creditor_reference? && reference?
  raise ArgumentError, "payload too long" if payload.bytesize > MAX_PAYLOAD_BYTES
end

Public Instance Methods

amount=(value) click to toggle source
# File lib/girocode/code.rb, line 53
def amount=(value)
  raise ArgumentError, 'amount is required' unless value
  value = BigDecimal(value, Float::DIG + 1)
  raise ArgumentError, "invalid amount #{value.inspect}" unless AMOUNT_RANGE.cover?(value)
  @amount = value
end
bic=(value) click to toggle source
# File lib/girocode/code.rb, line 23
def bic=(value)
  if value.nil?
    @bic = nil
  else
    bic = Bank::BIC.new(value)
    raise ArgumentError, "Invalid BIC #{value.inspect}" unless bic.valid?
    @bic = bic.to_s
  end
end
bto_info=(value) click to toggle source
# File lib/girocode/code.rb, line 81
def bto_info=(value)
  unless value.nil?
    raise ArgumentError, "invalid bto_info #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 70
  end
  @bto_info = value
end
creditor_reference=(value) click to toggle source
# File lib/girocode/code.rb, line 67
def creditor_reference=(value)
  unless value.nil?
    raise ArgumentError, "invalid creditor reference #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 35
  end
  @creditor_reference = value
end
currency=(value) click to toggle source
# File lib/girocode/code.rb, line 47
def currency=(value)
  value = value.to_s.upcase
  raise ArgumentError, "Invalid currency" unless value.match?(/\A[A-Z]{3}\z/)
  @currency = value
end
iban=(value) click to toggle source
# File lib/girocode/code.rb, line 41
def iban=(value)
  iban = Bank::IBAN.new(value)
  raise ArgumentError, "Invalid IBAN #{value.inspect}" unless iban.valid?
  @iban = iban.to_s
end
name=(value) click to toggle source
# File lib/girocode/code.rb, line 33
def name=(value)
  value = value.strip
  raise ArgumentError, 'name is required' unless value
  raise ArgumentError, 'name too long' if value.size > 70
  raise ArgumentError, 'Illegal name' if value.include?("\n") || value.include?("\r")
  @name = value
end
payload() click to toggle source
# File lib/girocode/code.rb, line 95
def payload
  ['BCD', '002', '1', 'SCT',
   bic, name, iban,formatted_amount, purpose,
   creditor_reference || reference, bto_info].map(&:to_s).join("\n")
end
purpose=(value) click to toggle source
# File lib/girocode/code.rb, line 60
def purpose=(value)
  unless value.nil?
    raise ArgumentError, "invalid purpose #{value.inspect}" unless value.match?(/\A[A-z0-9]{0,4}\z/)
  end
  @purpose = value
end
reference=(value) click to toggle source
# File lib/girocode/code.rb, line 74
def reference=(value)
  unless value.nil?
    raise ArgumentError, "invalid reference #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 140
  end
  @reference = value
end
to_ascii() click to toggle source
# File lib/girocode/code.rb, line 105
def to_ascii
  to_qrcode.to_s
end
to_qrcode() click to toggle source
# File lib/girocode/code.rb, line 101
def to_qrcode
  RQRCode::QRCode.new(payload, level: :m, mode: :byte_8bit)
end

Private Instance Methods

formatted_amount() click to toggle source
# File lib/girocode/code.rb, line 115
def formatted_amount
  "#{currency}#{amount.round(2).to_s('F')}" if currency? && amount
end