@@ -13,6 +13,9 @@ import (
|
||||
|
||||
"gogs.inhome.blapointe.com/ana-ledger/src/ana"
|
||||
"gogs.inhome.blapointe.com/ana-ledger/src/ledger"
|
||||
|
||||
"github.com/guptarohit/asciigraph"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
)
|
||||
|
||||
func Main() {
|
||||
@@ -135,6 +138,86 @@ func Main() {
|
||||
Nonzero().
|
||||
Normalize(cpiNormalizer, "9")
|
||||
FPrintBalances(w, "", balances, nil, config.Query.USDOnly, config.Query.Normalize, time.Now().Format("2006-01-02"), false, maxAccW)
|
||||
case "gra":
|
||||
deltas = deltas.Group(ledger.GroupDate("^[0-9]{4}-[0-9]{2}"))
|
||||
transactions := deltas.Transactions()
|
||||
cumulative := make(ledger.Balances)
|
||||
data := map[string][]float64{}
|
||||
pushData := func() {
|
||||
soFar := 0
|
||||
for _, v := range data {
|
||||
soFar = len(v)
|
||||
}
|
||||
for k, balance := range cumulative {
|
||||
for curr, v := range balance {
|
||||
if curr != ledger.USD {
|
||||
continue
|
||||
}
|
||||
if _, ok := data[k]; !ok {
|
||||
data[k] = make([]float64, soFar)
|
||||
}
|
||||
data[k] = append(data[k], v)
|
||||
}
|
||||
}
|
||||
}
|
||||
for i, transaction := range transactions {
|
||||
if i > 0 && transactions[i-1][0].Date != transaction[0].Date {
|
||||
pushData()
|
||||
}
|
||||
balances := ledger.Deltas(transaction).
|
||||
Like(q).
|
||||
Group(group).
|
||||
Balances().
|
||||
WithBPIsAt(bpis, transaction[0].Date).
|
||||
Nonzero().
|
||||
Normalize(cpiNormalizer, transaction[0].Date)
|
||||
cumulative.PushAll(balances)
|
||||
}
|
||||
pushData()
|
||||
|
||||
labels := []string{}
|
||||
for k := range data {
|
||||
labels = append(labels, k)
|
||||
}
|
||||
slices.Sort(labels)
|
||||
|
||||
points := [][]float64{}
|
||||
for _, k := range labels {
|
||||
points = append(points, data[k])
|
||||
}
|
||||
|
||||
pointsMax := func() float64 {
|
||||
var max float64
|
||||
for _, vs := range points {
|
||||
for _, v := range vs {
|
||||
if max < v {
|
||||
max = v
|
||||
}
|
||||
}
|
||||
}
|
||||
return max
|
||||
}
|
||||
for pointsMax() > 100 {
|
||||
for i := range points {
|
||||
for j := range points[i] {
|
||||
points[i][j] /= 10.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
options := []asciigraph.Option{asciigraph.Precision(0)}
|
||||
if _, h, err := terminal.GetSize(0); err == nil && h > 4 {
|
||||
options = append(options, asciigraph.Height(h-4))
|
||||
}
|
||||
if len(labels) < 256 {
|
||||
seriesColors := make([]asciigraph.AnsiColor, len(labels))
|
||||
for i := range seriesColors {
|
||||
seriesColors[i] = asciigraph.AnsiColor(i)
|
||||
}
|
||||
options = append(options, asciigraph.SeriesLegends(labels...))
|
||||
options = append(options, asciigraph.SeriesColors(seriesColors...))
|
||||
}
|
||||
fmt.Println(asciigraph.PlotMany(points, options...))
|
||||
case "reg":
|
||||
transactions := deltas.Transactions()
|
||||
cumulative := make(ledger.Balances)
|
||||
|
||||
Reference in New Issue
Block a user