class Bai2::BaiFile::Group

Entities

Attributes

accounts[R]

Public Class Methods

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

Private Class Methods

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

Public Instance Methods

as_of_datetime() click to toggle source
# File lib/bai2.rb, line 110
def as_of_datetime
  @header[:as_of_date] + @header[:as_of_time]
end

Private Instance Methods

assert_integrity!(options) click to toggle source

Asserts integrity of a fully-parsed BaiFile by calculating checksums.

# File lib/bai2/integrity.rb, line 58
def assert_integrity!(options)
  expectation = {
    sum:      @trailer[:group_control_total],
    children: @trailer[:number_of_accounts],
    records:  @trailer[:number_of_records],
  }

  # Check children count
  unless expectation[:children] == (actual = self.accounts.count)
    raise IntegrityError.new("Number of accounts invalid: " \
      + "expected #{expectation[:children]}, actually: #{actual}")
  end

  # Check sum vs. account sums
  actual_sum = self.accounts.map do |acct|
    acct.instance_variable_get(:@trailer)[:account_control_total]
  end.reduce(0, &:+)

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

  # Run children assertions, which return number of records. May raise.
  records = self.accounts.map {|a| a.send(:assert_integrity!, options) }.reduce(0, &:+)

  unless expectation[:records] == (actual_num_records = records + 2)
    raise IntegrityError.new(
      "Record count invalid: group: #{expectation[:records]}, accounts: #{actual_num_records}")
  end

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

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

  @header, @trailer = *n.records

  @accounts = n.children.map {|child| Account.send(:parse, child) }
end