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)
|
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) {
|
func (ledger Ledger) Transactions() ([]Transaction, error) {
|
||||||
f, err := ledger.open()
|
f, err := ledger.open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestLedgerTransactions(t *testing.T) {
|
func TestLedgerTransactionsBalances(t *testing.T) {
|
||||||
ledger, err := NewLedger("./testdata/ledger.dat")
|
ledger, err := NewLedger("./testdata/ledger.dat")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|
@ -34,8 +34,8 @@ func TestLedgerTransactions(t *testing.T) {
|
||||||
if want := (Transaction{
|
if want := (Transaction{
|
||||||
Date: "2021-07-30",
|
Date: "2021-07-30",
|
||||||
Description: "Testing detecting deposits via email alerts 5421705162",
|
Description: "Testing detecting deposits via email alerts 5421705162",
|
||||||
Payer: "AssetAccount:Cash:Uccu",
|
|
||||||
Payee: "Debts:Credit:ChaseAarpChaseVisa",
|
Payee: "Debts:Credit:ChaseAarpChaseVisa",
|
||||||
|
Payer: "AssetAccount:Cash:Uccu",
|
||||||
Amount: 100.00,
|
Amount: 100.00,
|
||||||
}); transactions[1] != want {
|
}); transactions[1] != want {
|
||||||
t.Fatalf("want \n\t%+v, got \n\t%+v", want, transactions[1])
|
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 {
|
for i := range transactions {
|
||||||
t.Logf("%+v => \n%s", transactions[i], transactions[i].Marshal())
|
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) {
|
func TestLedgerSetTransaction(t *testing.T) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue