diff --git a/cmd/cli/main.go b/cmd/cli/main.go index a4ae861..cd8e599 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -144,7 +144,21 @@ func Main() { KindaGroup(group). Nonzero(). Normalize(cpiNormalizer, "9") - FPrintBalances(w, "", balances, nil, config.Query.USDOnly, config.Query.Normalize, time.Now().Format("2006-01-02"), false, maxAccW) + + cumulatives := make(ledger.Balances) + var sum float64 + for key := range balances { + usd, ok := balances[key][ledger.USD] + if ok { + cumulatives[key] = ledger.Balance{ledger.USD: usd} + sum += usd + } + } + for key := range cumulatives { + cumulatives[key][ledger.USD] = 100 * cumulatives[key][ledger.USD] / sum + } + + FPrintBalances(w, "", balances, cumulatives, config.Query.USDOnly, config.Query.Normalize, time.Now().Format("2006-01-02"), false, maxAccW, "%.0f%%%%") case "gra": // graph dateGrouping := "^[0-9]{4}-[0-9]{2}" if period := config.Query.Period; !period.Empty() { @@ -306,7 +320,7 @@ func Main() { if shouldPrint { cumulative.PushAll(balances) cumulative = cumulative.Nonzero() - FPrintBalancesFor(transaction[0].Description, w, "\t\t", balances, cumulative, config.Query.USDOnly, config.Query.Normalize, transaction[0].Date, config.Compact, maxAccW) + FPrintBalancesFor(transaction[0].Description, w, "\t\t", balances, cumulative, config.Query.USDOnly, config.Query.Normalize, transaction[0].Date, config.Compact, maxAccW, "%s%.2f") } } default: @@ -314,16 +328,16 @@ func Main() { } } -func FPrintBalancesFor(description string, w io.Writer, linePrefix string, balances, cumulatives ledger.Balances, usdOnly, normalized bool, date string, compact bool, keyW int) { +func FPrintBalancesFor(description string, w io.Writer, linePrefix string, balances, cumulatives ledger.Balances, usdOnly, normalized bool, date string, compact bool, keyW int, cumulativeFormat string) { if compact { - FPrintBalances(w, date+"\t", balances, cumulatives, usdOnly, normalized, date, compact, keyW) + FPrintBalances(w, date+"\t", balances, cumulatives, usdOnly, normalized, date, compact, keyW, cumulativeFormat) } else { fmt.Fprintf(w, "%s\t%s\n", date, description) - FPrintBalances(w, linePrefix, balances, cumulatives, usdOnly, normalized, date, compact, keyW) + FPrintBalances(w, linePrefix, balances, cumulatives, usdOnly, normalized, date, compact, keyW, cumulativeFormat) } } -func FPrintBalances(w io.Writer, linePrefix string, balances, cumulatives ledger.Balances, usdOnly, normalized bool, date string, fullKey bool, max int) { +func FPrintBalances(w io.Writer, linePrefix string, balances, cumulatives ledger.Balances, usdOnly, normalized bool, date string, fullKey bool, max int, cumulativeFormat string) { maxes := map[ledger.Currency]float64{} keys := []string{} for k, v := range balances { @@ -338,9 +352,9 @@ func FPrintBalances(w io.Writer, linePrefix string, balances, cumulatives ledger normalizer := ana.NewDefaultNormalizer() - format := fmt.Sprintf("%s%%-%ds\t%%s%%.2f (%%s%%.2f)\n", linePrefix, max) + format := fmt.Sprintf("%s%%-%ds\t%%s%%.2f (%"+cumulativeFormat+")\n", linePrefix, max) if normalized { - format = fmt.Sprintf("%s%%-%ds\t%%s%%.2f (%%s%%.2f (%%.2f @%%.2f (%%s%%.0f)))\n", linePrefix, max) + format = fmt.Sprintf("%s%%-%ds\t%%s%%.2f (%%s%%.2f (%%.2f @%%.2f (%"+cumulativeFormat+")))\n", linePrefix, max) } for i, key := range keys { printableKey := key @@ -375,9 +389,12 @@ func FPrintBalances(w io.Writer, linePrefix string, balances, cumulatives ledger for _, currency := range currencies { printableCurrency := currency format := format - if printableCurrency != "$" { - printableCurrency += " " - format = strings.ReplaceAll(format, "%.2f", "%.3f") + printPrintableCurrency := strings.Count(cumulativeFormat, "%s") > 0 + if printPrintableCurrency { + if printableCurrency != "$" { + printableCurrency += " " + format = strings.ReplaceAll(format, "%.2f", "%.3f") + } } if usdOnly && printableCurrency != "$" { continue @@ -390,12 +407,22 @@ func FPrintBalances(w io.Writer, linePrefix string, balances, cumulatives ledger cumulative = value } - if !normalized { - fmt.Fprintf(w, format, printableKey, printableCurrency, balances[key][currency], printableCurrency, cumulative) + if printPrintableCurrency { + if !normalized { + fmt.Fprintf(w, format, printableKey, printableCurrency, balances[key][currency], printableCurrency, cumulative) + } else { + factor := normalizer.NormalizeFactor(key, date) + trailingMax := maxes[currency] - math.Abs(balances[key][currency]) + fmt.Fprintf(w, format, printableKey, printableCurrency, balances[key][currency], printableCurrency, cumulative, cumulative*factor, factor, printableCurrency, factor*trailingMax) + } } else { - factor := normalizer.NormalizeFactor(key, date) - trailingMax := maxes[currency] - math.Abs(balances[key][currency]) - fmt.Fprintf(w, format, printableKey, printableCurrency, balances[key][currency], printableCurrency, cumulative, cumulative*factor, factor, printableCurrency, factor*trailingMax) + if !normalized { + fmt.Fprintf(w, format, printableKey, printableCurrency, balances[key][currency], cumulative) + } else { + factor := normalizer.NormalizeFactor(key, date) + trailingMax := maxes[currency] - math.Abs(balances[key][currency]) + fmt.Fprintf(w, format, printableKey, printableCurrency, balances[key][currency], printableCurrency, cumulative, cumulative*factor, factor, factor*trailingMax) + } } } }