Try to calculate balances locally

This commit is contained in:
2021-12-10 18:56:56 +00:00
parent 625e0635fd
commit 13993b6b5a
3 changed files with 135 additions and 8 deletions

View File

@ -1,6 +1,7 @@
package http
import (
"fmt"
"net/http"
"strconv"
"time"
@ -71,24 +72,82 @@ func (h *Handler) budgeting(c *gin.Context) {
}
categories, err := h.Service.DB.GetCategoriesWithBalance(c.Request.Context(), params)
if err != nil {
c.AbortWithError(http.StatusInternalServerError, err)
c.AbortWithError(http.StatusInternalServerError, fmt.Errorf("load categories: %w", err))
return
}
availableParams := postgres.GetAvailableBalanceParams{
BudgetID: budgetUUID,
FromDate: firstOfNextMonth,
}
availableBalance, err := h.Service.DB.GetAvailableBalance(c.Request.Context(), availableParams)
cumultativeBalances, err := h.Service.DB.GetCumultativeBalances(c.Request.Context(), budgetUUID)
if err != nil {
c.AbortWithError(http.StatusInternalServerError, err)
c.AbortWithError(http.StatusInternalServerError, fmt.Errorf("load balances: %w", err))
return
}
var available float64 = 0
var added float64 = 0
var assigned float64 = 0
for i := range categories {
cat := &categories[i]
var balance float64 = 0
for _, bal := range cumultativeBalances {
if bal.CategoryID != cat.ID {
continue
}
// skip everything in the future
if !bal.Date.Before(firstOfNextMonth) {
continue
}
assigned += bal.Assignments.GetFloat64()
balance += bal.Assignments.GetFloat64()
balance += bal.Transactions.GetFloat64()
if balance < 0 && bal.Date.Before(firstOfMonth) {
added -= balance
balance = 0
}
if bal.Date.Before(firstOfMonth) {
available = balance
}
}
num := postgres.Numeric{}
num.Set(balance)
cat.Available = num
num2 := postgres.Numeric{}
num2.Set(available)
cat.AvailableLastMonth = num2
}
data := c.MustGet("data").(AlwaysNeededData)
var availableBalance float64 = 0
for _, cat := range categories {
if cat.ID != data.Budget.IncomeCategoryID {
continue
}
availableBalance = -assigned - added
for _, bal := range cumultativeBalances {
if bal.CategoryID != cat.ID {
continue
}
if !bal.Date.Before(firstOfNextMonth) {
continue
}
availableBalance += bal.Transactions.GetFloat64()
}
}
var availableBalanceNum postgres.Numeric
availableBalanceNum.Set(availableBalance)
d := BudgetingData{
c.MustGet("data").(AlwaysNeededData),
categories,
availableBalance,
availableBalanceNum,
firstOfMonth,
firstOfNextMonth,
firstOfPreviousMonth,