Files
boc/backend/handlers/finance_v2.go
T
Bernt e5623d2f84 feat: integrate Grafana dashboards into BOC DashboardPage
- Add Infrastructure Health section with CPU/Memory/Disk panels
- Add Service Status section with PM2/Docker panels
- Create GrafanaPanel component for iframe embedding
- Build passes successfully
2026-07-29 19:03:06 +00:00

105 lines
2.6 KiB
Go

package handlers
import (
"net/http"
"os"
"boc/ledger"
)
// FinanceHandlerV2 uses RobustClient for ledger integration
type FinanceHandlerV2 struct {
ledgerClient *ledger.RobustClient
}
// NewFinanceHandlerV2 creates a new finance handler with ledger integration
func NewFinanceHandlerV2() *FinanceHandlerV2 {
ledgerDBURL := os.Getenv("LEDGER_DB_URL")
if ledgerDBURL == "" {
ledgerDBURL = "postgres://postgres:postgres@localhost:5432/aamos_ledger?sslmode=disable"
}
client, err := ledger.NewRobustClient(ledgerDBURL)
if err != nil {
// Fallback: create handler without ledger
return &FinanceHandlerV2{}
}
return &FinanceHandlerV2{ledgerClient: client}
}
func (h *FinanceHandlerV2) GetBalanceSheet(w http.ResponseWriter, r *http.Request) {
if h.ledgerClient == nil {
writeError(w, http.StatusServiceUnavailable, "ledger not available")
return
}
period := r.URL.Query().Get("period")
bs, err := h.ledgerClient.GetBalanceSheet(r.Context(), period)
if err != nil {
writeError(w, http.StatusInternalServerError, "failed to get balance sheet")
return
}
writeJSON(w, http.StatusOK, map[string]interface{}{
"ok": true,
"report": bs,
})
}
func (h *FinanceHandlerV2) GetIncomeStatement(w http.ResponseWriter, r *http.Request) {
if h.ledgerClient == nil {
writeError(w, http.StatusServiceUnavailable, "ledger not available")
return
}
period := r.URL.Query().Get("period")
is, err := h.ledgerClient.GetIncomeStatement(r.Context(), period)
if err != nil {
writeError(w, http.StatusInternalServerError, "failed to get income statement")
return
}
writeJSON(w, http.StatusOK, map[string]interface{}{
"ok": true,
"report": is,
})
}
func (h *FinanceHandlerV2) GetMomsReport(w http.ResponseWriter, r *http.Request) {
if h.ledgerClient == nil {
writeError(w, http.StatusServiceUnavailable, "ledger not available")
return
}
period := r.URL.Query().Get("period")
report, err := h.ledgerClient.GetMomsReport(r.Context(), period)
if err != nil {
writeError(w, http.StatusInternalServerError, "failed to get moms report")
return
}
writeJSON(w, http.StatusOK, map[string]interface{}{
"ok": true,
"report": report,
})
}
func (h *FinanceHandlerV2) GetAccounts(w http.ResponseWriter, r *http.Request) {
if h.ledgerClient == nil {
writeError(w, http.StatusServiceUnavailable, "ledger not available")
return
}
accounts, err := h.ledgerClient.GetAccounts(r.Context())
if err != nil {
writeError(w, http.StatusInternalServerError, "failed to get accounts")
return
}
writeJSON(w, http.StatusOK, map[string]interface{}{
"ok": true,
"accounts": accounts,
})
}