Files
FPandA-Engine/internal/handler/variance.go
2026-03-20 14:01:46 +01:00

65 lines
1.4 KiB
Go

package handler
import (
"net/http"
"strconv"
"Engine/internal/model"
"Engine/internal/service"
)
type VarianceHandler struct {
svc *service.VarianceService
}
func NewVarianceHandler(svc *service.VarianceService) *VarianceHandler {
return &VarianceHandler{svc: svc}
}
func (h *VarianceHandler) Report(w http.ResponseWriter, r *http.Request) {
f := filterFromQuery(r)
report, err := h.svc.Report(r.Context(), f)
if err != nil {
writeError(w, http.StatusInternalServerError, err.Error())
return
}
writeJSON(w, http.StatusOK, report)
}
func (h *VarianceHandler) Alerts(w http.ResponseWriter, r *http.Request) {
f := filterFromQuery(r)
threshold := 10.0
if t := r.URL.Query().Get("threshold"); t != "" {
if v, err := strconv.ParseFloat(t, 64); err == nil {
threshold = v
}
}
alerts, err := h.svc.Alerts(r.Context(), f, threshold)
if err != nil {
writeError(w, http.StatusInternalServerError, err.Error())
return
}
writeJSON(w, http.StatusOK, alerts)
}
func filterFromQuery(r *http.Request) service.VarianceFilter {
q := r.URL.Query()
year, _ := strconv.Atoi(q.Get("year"))
period, _ := strconv.Atoi(q.Get("period"))
version := model.BudgetVersion(q.Get("version"))
if version == "" {
version = model.VersionOriginal
}
return service.VarianceFilter{
FiscalYear: year,
FiscalPeriod: period,
DeptCode: q.Get("dept"),
Version: version,
}
}