From 6c4f67e3dad98c216379e171a19f980fe92c1502 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 4 Aug 2013 19:05:11 -0400 Subject: [PATCH] add Value class; keep track of account balances over time --- lib/gnucash.rb | 1 + lib/gnucash/account.rb | 9 +++++++++ lib/gnucash/transaction.rb | 7 +------ lib/gnucash/value.rb | 30 ++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 lib/gnucash/value.rb diff --git a/lib/gnucash.rb b/lib/gnucash.rb index c14cd88..a1d5287 100644 --- a/lib/gnucash.rb +++ b/lib/gnucash.rb @@ -1,6 +1,7 @@ require "gnucash/account" require "gnucash/book" require "gnucash/transaction" +require "gnucash/value" require "gnucash/version" module Gnucash diff --git a/lib/gnucash/account.rb b/lib/gnucash/account.rb index f8d7bcd..578bf92 100644 --- a/lib/gnucash/account.rb +++ b/lib/gnucash/account.rb @@ -38,6 +38,15 @@ module Gnucash @transactions.sort! do |a, b| a[:txn].date <=> b[:txn].date end + balance = Value.new(0) + @balances = @transactions.map do |txn_hash| + balance += txn_hash[:value] + [txn_hash[:txn].date, balance] + end + end + + def current_balance + @balances.last[1] rescue Value.new(0) end end end diff --git a/lib/gnucash/transaction.rb b/lib/gnucash/transaction.rb index 275ee00..92ca16a 100644 --- a/lib/gnucash/transaction.rb +++ b/lib/gnucash/transaction.rb @@ -10,13 +10,8 @@ module Gnucash @id = node.xpath('trn:id').text @date = node.xpath('trn:date-posted/ts:date').text.split(' ').first @splits = node.xpath('trn:splits/trn:split').map do |split_node| - value_str = split_node.xpath('split:value').text - value_parts = value_str.split('/') - unless value_parts.size == 2 and value_parts[1] == '100' - raise "Unexpected value format: #{value_str.inspect}" - end + value = Value.new(split_node.xpath('split:value').text) account_id = split_node.xpath('split:account').text - value = value_parts.first.to_i account = @book.find_account_by_id(account_id) unless account raise "Could not find account with ID #{account_id} for transaction #{@id}" diff --git a/lib/gnucash/value.rb b/lib/gnucash/value.rb new file mode 100644 index 0000000..9c8e7a6 --- /dev/null +++ b/lib/gnucash/value.rb @@ -0,0 +1,30 @@ +module Gnucash + class Value + attr_accessor :val + def initialize(val) + if val.is_a?(String) + if val =~ /^(-?\d+)\/100$/ + @val = $1.to_i + else + raise "Unexpected value string: #{val.inspect}" + end + elsif val.is_a?(Fixnum) + @val = val + else + raise "Unexpected value type: #{val.class}" + end + end + + def +(other) + Value.new(@val + other.val) + end + + def -(other) + Value.new(@val - other.val) + end + + def to_s + (@val / 100.0).round(2).to_s + end + end +end