/api/trends prints pie of each of last N months

This commit is contained in:
bel
2024-07-21 17:03:44 -06:00
parent 18a19e52f5
commit b8c78fe55e
4 changed files with 89 additions and 0 deletions

View File

@@ -74,6 +74,8 @@ func (router Router) API(w http.ResponseWriter, r *http.Request) {
router.APITransactions(w, r)
case "/api/amend":
router.APIAmend(w, r)
case "/api/trends":
router.APITrends(w, r)
case "/api/reg", "/api/bal":
router.APIReg(w, r)
default:
@@ -110,6 +112,51 @@ func (router Router) APITransactions(w http.ResponseWriter, r *http.Request) {
})
}
func (router Router) APITrends(w http.ResponseWriter, r *http.Request) {
bpis, err := router.bpis()
if err != nil {
panic(err)
}
deltas, err := router.files.Deltas()
if err != nil {
panic(err)
}
recent := time.Hour * 24 * 365 / 2
recentHouseRelatedDeltas := deltas.
Like(ledger.LikeTransactions(
deltas.Like(ledger.LikeName(`^House`))...,
)).
Like(ledger.LikeAfter(time.Now().Add(-1 * recent).Format("2006-01"))).
Group(ledger.GroupName(`Withdrawal:[0-9]*:[^:]*`)).
Group(ledger.GroupDate(`^[0-9]*-[0-9]*`)).
Like(ledger.LikeNotName(`^$`))
monthsToDeltas := map[string]ledger.Deltas{}
for _, delta := range recentHouseRelatedDeltas {
monthsToDeltas[delta.Date] = append(monthsToDeltas[delta.Date], delta)
}
months := []string{}
for k := range monthsToDeltas {
months = append(months, k)
}
slices.Sort(months)
fmt.Fprintln(w, "<!DOCTYPE html>")
for _, month := range months {
balances := monthsToDeltas[month].Balances().WithBPIs(bpis)
chart := view.NewChart("pie")
for category, balance := range balances {
chart.AddY(category, []int{int(balance[ledger.USD])})
}
fmt.Fprintln(w, "<h2>", month, "</h2>")
if err := chart.Render(w); err != nil {
panic(err)
}
}
}
func (router Router) APIAmend(w http.ResponseWriter, r *http.Request) {
b, _ := io.ReadAll(r.Body)