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