class Bai2::BaiFile::Account

Attributes

transactions[R]

Public Class Methods

new() click to toggle source
# File lib/bai2.rb, line 139
def initialize
  @transactions = []
end

Private Class Methods

parse(node) click to toggle source
# File lib/bai2.rb, line 149
def self.parse(node)
  self.new.tap do |g|
    g.send(:parse, node)
  end
end

Private Instance Methods

assert_integrity!(options) click to toggle source
# File lib/bai2/integrity.rb, line 98
def assert_integrity!(options)
  expectation = {
    sum:      @trailer[:account_control_total],
    records:  @trailer[:number_of_records],
  }

  # Check sum vs. summary + transaction sums
  summary_amounts_sum = self.summaries.map {|s| s[:amount] }.reduce(0, &:+)
  transaction_amounts_sum = self.transactions.map(&:amount).reduce(0, &:+)

  # Some banks differ from the spec (*cough* SVB) and do not include
  # the summary amounts in the control amount.
  actual_sum = if options[:account_control_ignores_summary_amounts]
                 transaction_amounts_sum
               else
                 transaction_amounts_sum + summary_amounts_sum
               end

  unless expectation[:sum] == actual_sum
    raise IntegrityError.new(
      "Sums invalid: expected: #{expectation[:sum]}, actual: #{actual_sum}")
  end

  # Run children assertions, which return number of records. May raise.
  records = self.transactions.map do |tx|
    tx.instance_variable_get(:@record).physical_record_count
  end.reduce(0, &:+)

  # Account for the account header and the account trailer records
  # and any additional summary records (Some banks use continuation records
  # for account summaries, others put the summary data on the same row as the header)
  additional_records = 2 + options[:num_account_summary_continuation_records]
  actual_num_records = records + additional_records

  unless expectation[:records] == actual_num_records
    raise IntegrityError.new(
        "Record count invalid: account: #{expectation[:records]}, transactions: #{actual_num_records}")
  end

  # Return record count
  actual_num_records
end
parse(n) click to toggle source
# File lib/bai2.rb, line 155
def parse(n)

  unless n.code == :account_identifier && \
      n.records.map(&:code) == [:account_identifier, :account_trailer]
    raise ParseError.new('Unexpected record.')
  end

  @header, @trailer = *n.records

  @transactions = n.children.map {|child| Transaction.parse(child) }
end