113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
|
|
package handlers
|
||
|
|
|
||
|
|
import (
|
||
|
|
"database/sql"
|
||
|
|
"net/http"
|
||
|
|
)
|
||
|
|
|
||
|
|
type AnalyticsHandler struct {
|
||
|
|
DB *sql.DB
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewAnalyticsHandler(db *sql.DB) *AnalyticsHandler {
|
||
|
|
return &AnalyticsHandler{DB: db}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *AnalyticsHandler) GetActiveUsers(w http.ResponseWriter, r *http.Request) {
|
||
|
|
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||
|
|
"dau": 42,
|
||
|
|
"mau": 380,
|
||
|
|
"trend": 0.05,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *AnalyticsHandler) GetRevenue(w http.ResponseWriter, r *http.Request) {
|
||
|
|
period := r.URL.Query().Get("period")
|
||
|
|
if period == "" {
|
||
|
|
period = "month"
|
||
|
|
}
|
||
|
|
|
||
|
|
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||
|
|
"period": period,
|
||
|
|
"revenue": 125000.00,
|
||
|
|
"currency": "USD",
|
||
|
|
"trend": 0.08,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *AnalyticsHandler) GetRetention(w http.ResponseWriter, r *http.Request) {
|
||
|
|
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||
|
|
"retention_30d": 0.85,
|
||
|
|
"retention_90d": 0.72,
|
||
|
|
"retention_1y": 0.58,
|
||
|
|
"churn_rate": 0.02,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *AnalyticsHandler) GetDashboard(w http.ResponseWriter, r *http.Request) {
|
||
|
|
// Aggregate all key metrics for dashboard
|
||
|
|
writeJSON(w, http.StatusOK, map[string]interface{}{
|
||
|
|
"kpis": map[string]interface{}{
|
||
|
|
"mrr": map[string]interface{}{
|
||
|
|
"value": 53333.00,
|
||
|
|
"currency": "USD",
|
||
|
|
"trend": 0.05,
|
||
|
|
},
|
||
|
|
"arr": map[string]interface{}{
|
||
|
|
"value": 640000.00,
|
||
|
|
"currency": "USD",
|
||
|
|
"trend": 0.12,
|
||
|
|
},
|
||
|
|
"customers": map[string]interface{}{
|
||
|
|
"total": 42,
|
||
|
|
"active": 38,
|
||
|
|
"new": 5,
|
||
|
|
"churned": 1,
|
||
|
|
},
|
||
|
|
"pipeline": map[string]interface{}{
|
||
|
|
"total_value": 850000.00,
|
||
|
|
"weighted_value": 425000.00,
|
||
|
|
"deals": 24,
|
||
|
|
},
|
||
|
|
"tickets": map[string]interface{}{
|
||
|
|
"open": 12,
|
||
|
|
"resolved": 45,
|
||
|
|
"avg_resolution_hours": 24,
|
||
|
|
},
|
||
|
|
"cash": map[string]interface{}{
|
||
|
|
"on_hand": 180000.00,
|
||
|
|
"burn_rate": 45000.00,
|
||
|
|
"runway_months": 4,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
"charts": map[string]interface{}{
|
||
|
|
"revenue_trend": []map[string]interface{}{
|
||
|
|
{"month": "Jan", "revenue": 95000},
|
||
|
|
{"month": "Feb", "revenue": 102000},
|
||
|
|
{"month": "Mar", "revenue": 110000},
|
||
|
|
{"month": "Apr", "revenue": 115000},
|
||
|
|
{"month": "May", "revenue": 120000},
|
||
|
|
{"month": "Jun", "revenue": 125000},
|
||
|
|
},
|
||
|
|
"pipeline_by_stage": []map[string]interface{}{
|
||
|
|
{"stage": "Prospect", "value": 200000, "count": 8},
|
||
|
|
{"stage": "Qualified", "value": 300000, "count": 6},
|
||
|
|
{"stage": "Proposal", "value": 250000, "count": 5},
|
||
|
|
{"stage": "Negotiation", "value": 100000, "count": 3},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
"alerts": []map[string]interface{}{
|
||
|
|
{
|
||
|
|
"type": "warning",
|
||
|
|
"message": "Momsdeklaration deadline approaching",
|
||
|
|
"due_date": "2026-07-26",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"type": "info",
|
||
|
|
"message": "3 contracts up for renewal",
|
||
|
|
"count": 3,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
})
|
||
|
|
}
|