67a69ab073
- Go backend API with full CRUD for all modules - Rust analytics service with parallel processing - C runtime with POSIX shared memory IPC - PostgreSQL schema with 30+ tables - Redis cache, Kafka event streaming - WebSocket hub, automation engine - PDF generation, Resend email integration - JWT auth, multi-tenant - Docker Compose deployment - Nginx reverse proxy Refs: BOC-001
177 lines
4.4 KiB
Go
177 lines
4.4 KiB
Go
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)
|
|
}
|