105 lines
2.6 KiB
Go
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,
|
||
|
|
})
|
||
|
|
}
|