From f69a392ed16d36daf11849d182ec98ecbbab4765 Mon Sep 17 00:00:00 2001 From: bel Date: Mon, 2 Aug 2021 20:51:21 -0600 Subject: [PATCH] compute balances --- balance.go | 9 +++++++++ ledger.go | 13 +++++++++++++ ledger_test.go | 16 ++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 balance.go diff --git a/balance.go b/balance.go new file mode 100644 index 0000000..8fcf4d7 --- /dev/null +++ b/balance.go @@ -0,0 +1,9 @@ +package main + +type Balances map[string]float32 + +func (balances Balances) Add(key string, v float32) { + was, _ := balances[key] + was += v + balances[key] = was +} diff --git a/ledger.go b/ledger.go index 3b0459d..3b03189 100644 --- a/ledger.go +++ b/ledger.go @@ -52,6 +52,19 @@ func (ledger Ledger) SetTransactions(transactions []Transaction) error { return os.Rename(f.Name(), ledger.path) } +func (ledger Ledger) Balances() (Balances, error) { + transactions, err := ledger.Transactions() + if err != nil { + return nil, err + } + balances := make(Balances) + for _, transaction := range transactions { + balances.Add(transaction.Payee, transaction.Amount) + balances.Add(transaction.Payer, -1*transaction.Amount) + } + return balances, nil +} + func (ledger Ledger) Transactions() ([]Transaction, error) { f, err := ledger.open() if err != nil { diff --git a/ledger_test.go b/ledger_test.go index c4070b5..6618e1f 100644 --- a/ledger_test.go +++ b/ledger_test.go @@ -10,7 +10,7 @@ import ( "github.com/google/uuid" ) -func TestLedgerTransactions(t *testing.T) { +func TestLedgerTransactionsBalances(t *testing.T) { ledger, err := NewLedger("./testdata/ledger.dat") if err != nil { t.Fatal(err) @@ -34,8 +34,8 @@ func TestLedgerTransactions(t *testing.T) { if want := (Transaction{ Date: "2021-07-30", Description: "Testing detecting deposits via email alerts 5421705162", - Payer: "AssetAccount:Cash:Uccu", Payee: "Debts:Credit:ChaseAarpChaseVisa", + Payer: "AssetAccount:Cash:Uccu", Amount: 100.00, }); transactions[1] != want { t.Fatalf("want \n\t%+v, got \n\t%+v", want, transactions[1]) @@ -43,6 +43,18 @@ func TestLedgerTransactions(t *testing.T) { for i := range transactions { t.Logf("%+v => \n%s", transactions[i], transactions[i].Marshal()) } + balances, err := ledger.Balances() + if err != nil { + t.Fatal(err) + } + wantBalances := map[string]float32{ + transactions[0].Payee: 37.86, + transactions[0].Payer: 62.14, + transactions[1].Payer: -100, + } + if fmt.Sprint(balances) != fmt.Sprint(wantBalances) { + t.Fatalf("want \n%+v, got \n%+v", wantBalances, balances) + } } func TestLedgerSetTransaction(t *testing.T) {