compute balances

master
bel 2021-08-02 20:51:21 -06:00
parent 34101fa811
commit f69a392ed1
3 changed files with 36 additions and 2 deletions

9
balance.go Normal file
View File

@ -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
}

View File

@ -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 {

View File

@ -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) {