lib/ofx/handler.rb in ofx_ruby-0.0.13 vs lib/ofx/handler.rb in ofx_ruby-0.0.14

- old
+ new

@@ -1,34 +1,50 @@ # frozen_string_literal: true module OFX class Handler < Ox::Sax TRANSACTION_ATTRS = [:TRNTYPE, :DTPOSTED, :TRNAMT, :FITID, :NAME] - ATTRS_MAP = { TRNTYPE: :as_s, DTPOSTED: :as_time, + BALANCE_ATTRS = [:BALAMT] + ATTRS_MAP = { TRNTYPE: :as_s, DTPOSTED: :as_time, BALAMT: :as_f, TRNAMT: :as_f, FITID: :as_s, NAME: :as_s } def initialize(parser) @parser = parser end def start_element(name) - @transaction = {} if name == :STMTTRN - @current_node = name + case name + when :STMTTRN then @transaction = {} + when :LEDGERBAL || :AVAILBAL then @balance = {} + end + @current = name end def value(value) - return unless TRANSACTION_ATTRS.include?(@current_node) - @transaction[@current_node] = value.send(ATTRS_MAP[@current_node]) + case + when TRANSACTION_ATTRS.include?(@current) + @transaction[@current] = value.send(ATTRS_MAP[@current]) + when BALANCE_ATTRS.include?(@current) + @balance[@current] = value.send(ATTRS_MAP[@current]) + end end def end_element(name) - return unless name == :STMTTRN - @parser.output[:transactions] = [] if @parser.output[:transactions].nil? - @parser.output[:transactions].push( - type: @transaction[:TRNTYPE], - posted: @transaction[:DTPOSTED], - amount: @transaction[:TRNAMT], - fitid: @transaction[:FITID], - name: @transaction[:NAME] - ) + case name + when :STMTTRN + @parser.output[:transactions] = [] unless @parser.output[:transactions] + @parser.output[:transactions].push(transaction(@transaction)) + when :LEDGERBAL + @parser.output[:balance] = @balance[:BALAMT] + when :AVAILBAL + @parser.output[:pending] = @balance[:BALAMT] - @parser.output[:balance] + end + end + + protected + + def transaction(hash) + { type: @transaction[:TRNTYPE], posted: @transaction[:DTPOSTED], + amount: @transaction[:TRNAMT], fitid: @transaction[:FITID], + name: @transaction[:NAME] } end end end \ No newline at end of file