Try to calculate balances locally
This commit is contained in:
@ -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,
|
||||
|
Reference in New Issue
Block a user