Files
boc/backend/handlers/ledger.go
T
Bernt (LandveX AI) 67a69ab073 feat(boc): v1.0 - Complete Business Operations Center
- 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
2026-07-12 13:21:10 +00:00

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)
}