From 6b666c7220cc3b761199317bc33a5878c327c529 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 25 Oct 2023 14:02:44 -0600 Subject: [PATCH] register and balances accept bpi --- ledger/balances.go | 17 +++++++++++++++++ ledger/delta.go | 9 --------- ledger/delta_test.go | 17 ----------------- ledger/file_test.go | 36 ++++++++++++++++++++++++++++++++++++ ledger/testdata/bpi.bpi | 1 + 5 files changed, 54 insertions(+), 26 deletions(-) create mode 120000 ledger/testdata/bpi.bpi diff --git a/ledger/balances.go b/ledger/balances.go index d004304..dd24e8d 100644 --- a/ledger/balances.go +++ b/ledger/balances.go @@ -9,6 +9,23 @@ type Balances map[string]Balance type Balance map[Currency]float64 +func (balances Balances) WithBPIs(bpis BPIs) Balances { + result := make(Balances) + for k, v := range balances { + if _, ok := result[k]; !ok { + result[k] = make(Balance) + } + for k2, v2 := range v { + scalar := 1.0 + if k2 != USD { + scalar = bpis[k2].Lookup("9") + } + result[k][USD] += v2 * scalar + } + } + return result +} + func (balances Balances) PushAll(other Balances) { for k, v := range other { if _, ok := balances[k]; !ok { diff --git a/ledger/delta.go b/ledger/delta.go index 2049d54..7be4a5d 100644 --- a/ledger/delta.go +++ b/ledger/delta.go @@ -28,15 +28,6 @@ func newDelta(d, desc, name string, v float64, c string, isSet bool) Delta { } } -func (delta Delta) Plus(other Delta) Delta { - return Delta{ - Date: other.Date, - Name: delta.Name, - Value: delta.Value + other.Value, - Currency: other.Currency, - } -} - func (delta Delta) Debug() string { return fmt.Sprintf("{@%s %s:\"%s\" %s%.2f %s}", delta.Date, delta.Name, delta.Description, func() string { if !delta.isSet { diff --git a/ledger/delta_test.go b/ledger/delta_test.go index 8b5f0b6..ec91730 100644 --- a/ledger/delta_test.go +++ b/ledger/delta_test.go @@ -21,21 +21,4 @@ func TestDelta(t *testing.T) { t.Error(delta.Currency) } t.Log(delta) - - d2 := "2099-09-08" - delta2 := newDelta(d2, "", "name", 11.11, "$", false) - - combined := delta.Plus(delta2) - if combined.Date != d2 { - t.Error(combined.Date) - } - if combined.Name != "name" { - t.Error(combined.Name) - } - if combined.Value != 45.67 { - t.Error(combined.Value) - } - if combined.Currency != USD { - t.Error(combined.Currency) - } } diff --git a/ledger/file_test.go b/ledger/file_test.go index 251910e..bed9a27 100644 --- a/ledger/file_test.go +++ b/ledger/file_test.go @@ -92,6 +92,42 @@ func TestFileAdd(t *testing.T) { } } +func TestFileTestdataMacroWithBPI(t *testing.T) { + paths, err := filepath.Glob("./testdata/macro.d/*") + if err != nil { + t.Fatal(err) + } + + f, err := NewFiles(paths[0], paths[1:]...) + if err != nil { + t.Fatal(err) + } + + deltas, err := f.Deltas() + if err != nil { + t.Fatal(err) + } + + bpis, err := NewBPIs("./testdata/bpi.bpi") + if err != nil { + t.Fatal(err) + } + + t.Run("bal like", func(t *testing.T) { + bal := deltas.Like(LikeName(`^AssetAccount:Bond`)).Balances().WithBPIs(bpis) + for k, v := range bal { + t.Logf("%s: %+v", k, v) + } + }) + + t.Run("reg like", func(t *testing.T) { + reg := deltas.Like(LikeName(`^AssetAccount:Bond`)).Register() + for k, v := range reg { + t.Logf("%s: %+v", k, v.WithBPIs(bpis)) + } + }) +} + func TestFileTestdata(t *testing.T) { t.Run("macro.d", func(t *testing.T) { paths, err := filepath.Glob("./testdata/macro.d/*") diff --git a/ledger/testdata/bpi.bpi b/ledger/testdata/bpi.bpi new file mode 120000 index 0000000..f5da145 --- /dev/null +++ b/ledger/testdata/bpi.bpi @@ -0,0 +1 @@ +../../../../../../Sync/Core/ledger/bpi.dat \ No newline at end of file