package handlers import ( "encoding/json" "net/http" "os" ) var ledgerBaseURL = getEnv("LEDGER_URL", "http://localhost:3250") func getEnv(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } // LedgerClient handles communication with aamos-ledger type LedgerClient struct { BaseURL string } func NewLedgerClient() *LedgerClient { return &LedgerClient{BaseURL: ledgerBaseURL} } func (c *LedgerClient) Get(path string) (*http.Response, error) { return http.Get(c.BaseURL + path) } // LedgerFinanceHandler connects to aamos-ledger for financial data type LedgerFinanceHandler struct { Client *LedgerClient } func NewLedgerFinanceHandler() *LedgerFinanceHandler { return &LedgerFinanceHandler{Client: NewLedgerClient()} } func (h *LedgerFinanceHandler) GetBalanceSheet(w http.ResponseWriter, r *http.Request) { resp, err := h.Client.Get("/api/ledger/reports/balance") if err != nil { writeError(w, http.StatusServiceUnavailable, "ledger unavailable") return } defer resp.Body.Close() if resp.StatusCode != 200 { writeError(w, resp.StatusCode, "ledger error") return } var result map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { writeError(w, http.StatusInternalServerError, "decode error") return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(result) } func (h *LedgerFinanceHandler) GetIncomeStatement(w http.ResponseWriter, r *http.Request) { resp, err := h.Client.Get("/api/ledger/reports/income") if err != nil { writeError(w, http.StatusServiceUnavailable, "ledger unavailable") return } defer resp.Body.Close() if resp.StatusCode != 200 { writeError(w, resp.StatusCode, "ledger error") return } var result map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { writeError(w, http.StatusInternalServerError, "decode error") return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(result) } func (h *LedgerFinanceHandler) GetMomsReport(w http.ResponseWriter, r *http.Request) { resp, err := h.Client.Get("/api/ledger/tax/moms") if err != nil { writeError(w, http.StatusServiceUnavailable, "ledger unavailable") return } defer resp.Body.Close() if resp.StatusCode != 200 { writeError(w, resp.StatusCode, "ledger error") return } var result map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { writeError(w, http.StatusInternalServerError, "decode error") return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(result) } func (h *LedgerFinanceHandler) GetAccounts(w http.ResponseWriter, r *http.Request) { resp, err := h.Client.Get("/api/ledger/accounts") if err != nil { writeError(w, http.StatusServiceUnavailable, "ledger unavailable") return } defer resp.Body.Close() if resp.StatusCode != 200 { writeError(w, resp.StatusCode, "ledger error") return } var result map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { writeError(w, http.StatusInternalServerError, "decode error") return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(result) } func (h *LedgerFinanceHandler) GetCustomers(w http.ResponseWriter, r *http.Request) { resp, err := h.Client.Get("/api/ledger/customers") if err != nil { writeError(w, http.StatusServiceUnavailable, "ledger unavailable") return } defer resp.Body.Close() if resp.StatusCode != 200 { writeError(w, resp.StatusCode, "ledger error") return } var result map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { writeError(w, http.StatusInternalServerError, "decode error") return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(result) } func (h *LedgerFinanceHandler) GetInvoices(w http.ResponseWriter, r *http.Request) { resp, err := h.Client.Get("/api/ledger/invoices") if err != nil { writeError(w, http.StatusServiceUnavailable, "ledger unavailable") return } defer resp.Body.Close() if resp.StatusCode != 200 { writeError(w, resp.StatusCode, "ledger error") return } var result map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { writeError(w, http.StatusInternalServerError, "decode error") return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(result) }