deltas now accept currency, description, and break payee from all recipients
parent
79effffc47
commit
cafb40514c
|
|
@ -11,18 +11,20 @@ const (
|
|||
)
|
||||
|
||||
type Delta struct {
|
||||
Date time.Time
|
||||
Account string
|
||||
Value float64
|
||||
Currency Currency
|
||||
Date time.Time
|
||||
Account string
|
||||
Value float64
|
||||
Currency Currency
|
||||
Description string
|
||||
}
|
||||
|
||||
func newDelta(d time.Time, a string, v float64) Delta {
|
||||
func newDelta(d time.Time, desc, acc string, v float64, c string) Delta {
|
||||
return Delta{
|
||||
Date: d,
|
||||
Account: a,
|
||||
Value: v,
|
||||
Currency: USD, // TODO
|
||||
Date: d,
|
||||
Account: acc,
|
||||
Value: v,
|
||||
Currency: Currency(c),
|
||||
Description: desc,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ func TestDelta(t *testing.T) {
|
|||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
delta := newDelta(d, "name", 34.56)
|
||||
delta := newDelta(d, "", "name", 34.56, "$")
|
||||
|
||||
if delta.Date != d {
|
||||
t.Error(delta.Date)
|
||||
|
|
@ -27,7 +27,7 @@ func TestDelta(t *testing.T) {
|
|||
t.Log(delta)
|
||||
|
||||
d2, _ := time.Parse("2006-01-02", "2099-09-08")
|
||||
delta2 := newDelta(d2, "name", 11.11)
|
||||
delta2 := newDelta(d2, "", "name", 11.11, "$")
|
||||
|
||||
combined := delta.Plus(delta2)
|
||||
if combined.Date != d2 {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
package ledger
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"github.com/howeyc/ledger"
|
||||
"time"
|
||||
)
|
||||
|
||||
type File string
|
||||
|
|
@ -21,23 +21,54 @@ func (file File) Deltas(like ...Like) ([]Delta, error) {
|
|||
}
|
||||
result := make([]Delta, 0, len(transactions)*2)
|
||||
for _, transaction := range transactions {
|
||||
for _, acc := range transaction.AccountChanges {
|
||||
value, _ := acc.Balance.Float64()
|
||||
delta := newDelta(transaction.Date, acc.Name, value)
|
||||
if !likes(like).all(delta) {
|
||||
continue
|
||||
sums := map[string]float64{}
|
||||
for _, acc := range transaction.recipients {
|
||||
sums[acc.currency] += acc.value
|
||||
delta := newDelta(
|
||||
transaction.date,
|
||||
transaction.description,
|
||||
acc.name,
|
||||
acc.value,
|
||||
acc.currency,
|
||||
)
|
||||
if likes(like).all(delta) {
|
||||
result = append(result, delta)
|
||||
}
|
||||
}
|
||||
for currency, value := range sums {
|
||||
delta := newDelta(
|
||||
transaction.date,
|
||||
transaction.description,
|
||||
transaction.payee,
|
||||
value,
|
||||
currency,
|
||||
)
|
||||
if likes(like).all(delta) {
|
||||
result = append(result, delta)
|
||||
}
|
||||
result = append(result, delta)
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (file File) transactions() ([]*ledger.Transaction, error) {
|
||||
type transaction struct {
|
||||
date time.Time
|
||||
description string
|
||||
payee string
|
||||
recipients []transactionRecipient
|
||||
}
|
||||
|
||||
type transactionRecipient struct {
|
||||
name string
|
||||
value float64
|
||||
currency string
|
||||
}
|
||||
|
||||
func (file File) transactions() ([]transaction, error) {
|
||||
f, err := os.Open(string(file))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
return ledger.ParseLedger(f)
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue