compute balances
parent
34101fa811
commit
f69a392ed1
|
|
@ -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
|
||||
}
|
||||
13
ledger.go
13
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 {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue