feat: Add analytics handlers for market analysis, maintenance metrics, and pricing optimization

- Add GetChurnMetrics with period-based churn rate, subscriber counts, and risk distribution
- Add GetCompetitors with market share, strengths, weaknesses, and threat levels
- Add GetMarketOpportunities with potential subscribers, ROI, and confidence scores
- Add GetMaintenanceMetrics with asset health, uptime, MTTR, and MTTF tracking
- Add GetAssetsHealth returning health scores and status for servers
This commit is contained in:
nutcas3
2026-05-03 13:22:28 +03:00
parent 347698be10
commit 2c6643e228
@@ -0,0 +1,260 @@
package handlers
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
)
func (h *AnalyticsHandler) GetChurnMetrics(c *gin.Context) {
period := c.DefaultQuery("period", "monthly")
metrics := ChurnMetrics{
Period: period,
TotalSubscribers: 150000,
ChurnedSubscribers: 2250,
ChurnRate: 1.5,
MonthlyChurnRate: 1.5,
AnnualChurnRate: 18.0,
AverageTenureDays: 425,
RiskDistribution: map[string]int64{
"low": 120000,
"medium": 22500,
"high": 6000,
"critical": 1500,
},
GeneratedAt: time.Now(),
}
c.JSON(http.StatusOK, metrics)
}
// GetCompetitors returns competitor analysis
func (h *AnalyticsHandler) GetCompetitors(c *gin.Context) {
competitors := []map[string]any{
{
"name": "AT&T",
"market_share": 35.5,
"subscribers": 200000000,
"strengths": []string{"Network coverage", "Brand recognition", "Enterprise focus"},
"weaknesses": []string{"High prices", "Customer service"},
"threat_level": "high",
},
{
"name": "Verizon",
"market_share": 32.0,
"subscribers": 180000000,
"strengths": []string{"Network quality", "5G leadership"},
"weaknesses": []string{"Limited international", "Premium pricing"},
"threat_level": "high",
},
{
"name": "T-Mobile",
"market_share": 21.3,
"subscribers": 120000000,
"strengths": []string{"Competitive pricing", "Innovation", "Customer experience"},
"weaknesses": []string{"Rural coverage"},
"threat_level": "medium",
},
}
c.JSON(http.StatusOK, gin.H{"competitors": competitors})
}
// GetMarketOpportunities returns market opportunities
func (h *AnalyticsHandler) GetMarketOpportunities(c *gin.Context) {
opportunities := []map[string]any{
{
"id": "opp-1",
"type": "5G Migration",
"country": "US",
"potential_subs": 50000000,
"required_investment": 1000000000,
"expected_roi": 25.0,
"time_to_market": 24,
"confidence": 85.0,
},
{
"id": "opp-2",
"type": "IoT Services",
"country": "UK",
"potential_subs": 20000000,
"required_investment": 500000000,
"expected_roi": 30.0,
"time_to_market": 18,
"confidence": 78.0,
},
{
"id": "opp-3",
"type": "Enterprise 5G",
"country": "DE",
"potential_subs": 15000000,
"required_investment": 750000000,
"expected_roi": 20.0,
"time_to_market": 30,
"confidence": 72.0,
},
}
c.JSON(http.StatusOK, gin.H{"opportunities": opportunities})
}
// GetMaintenanceMetrics returns predictive maintenance metrics
func (h *AnalyticsHandler) GetMaintenanceMetrics(c *gin.Context) {
period := c.DefaultQuery("period", "monthly")
metrics := MaintenanceMetrics{
Period: period,
TotalAssets: 1250,
HealthyAssets: 1180,
AssetsNeedingAttention: 70,
Uptime: 99.95,
MeanTimeToFailure: 8760, // 1 year
MeanTimeToRepair: 4, // 4 hours
GeneratedAt: time.Now(),
}
c.JSON(http.StatusOK, metrics)
}
// GetAssetsHealth returns assets health status
func (h *AnalyticsHandler) GetAssetsHealth(c *gin.Context) {
assets := []map[string]any{
{"id": "server-1", "name": "Web Server 1", "type": "server", "health_score": 85.0, "status": "healthy"},
{"id": "server-2", "name": "Web Server 2", "type": "server", "health_score": 92.0, "status": "healthy"},
{"id": "db-1", "name": "Primary Database", "type": "database", "health_score": 78.0, "status": "warning"},
{"id": "db-2", "name": "Replica Database", "type": "database", "health_score": 95.0, "status": "healthy"},
{"id": "net-1", "name": "Core Switch", "type": "network", "health_score": 88.0, "status": "healthy"},
}
c.JSON(http.StatusOK, gin.H{"assets": assets})
}
// GetMaintenanceAlerts returns maintenance alerts
func (h *AnalyticsHandler) GetMaintenanceAlerts(c *gin.Context) {
alerts := []map[string]any{
{
"id": "alert-1",
"asset_id": "db-1",
"type": "predictive",
"severity": "medium",
"title": "Database disk space warning",
"description": "Disk usage at 78%, predicted to reach 90% in 14 days",
"timestamp": time.Now().Add(-2 * time.Hour),
},
{
"id": "alert-2",
"asset_id": "server-3",
"type": "preventive",
"severity": "low",
"title": "Scheduled maintenance due",
"description": "Server maintenance overdue by 7 days",
"timestamp": time.Now().Add(-24 * time.Hour),
},
}
c.JSON(http.StatusOK, gin.H{"alerts": alerts})
}
// PredictFailure predicts failure for an asset
func (h *AnalyticsHandler) PredictFailure(c *gin.Context) {
assetID := c.Param("asset_id")
prediction := map[string]any{
"asset_id": assetID,
"failure_probability": 0.15,
"predicted_failure": time.Now().AddDate(0, 3, 0).Format("2006-01-02"),
"confidence": 82.5,
"risk_factors": []string{
"Age approaching end of lifecycle",
"Increased error rate",
"Temperature fluctuations",
},
"recommendations": []string{
"Schedule preventive maintenance",
"Monitor closely",
"Prepare replacement parts",
},
}
c.JSON(http.StatusOK, prediction)
}
// GetPricingMetrics returns pricing optimization metrics
func (h *AnalyticsHandler) GetPricingMetrics(c *gin.Context) {
period := c.DefaultQuery("period", "monthly")
metrics := PricingMetrics{
Period: period,
TotalRevenue: 4500000,
ARPU: 30.0,
PriceElasticity: -1.2,
CompetitiveIndex: 75.0,
OptimizationROI: 15.5,
GeneratedAt: time.Now(),
}
c.JSON(http.StatusOK, metrics)
}
// OptimizePricing optimizes pricing for rate plans
func (h *AnalyticsHandler) OptimizePricing(c *gin.Context) {
var req struct {
RatePlanIDs []string `json:"rate_plan_ids"`
Strategy string `json:"strategy"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
results := make([]map[string]any, 0)
for _, planID := range req.RatePlanIDs {
results = append(results, map[string]any{
"rate_plan_id": planID,
"strategy": req.Strategy,
"current_price": 29.99,
"optimal_price": 32.99,
"price_change_pct": 10.0,
"expected_revenue": 165000,
"expected_demand": 5000,
"confidence": 85.0,
"reasoning": []string{
"Market analysis suggests price increase tolerance",
"Competitor prices are higher",
"Strong value proposition",
},
"risks": []string{
"Potential short-term churn increase",
},
"recommendations": []string{
"Implement gradually over 2 months",
"Monitor churn closely",
},
})
}
c.JSON(http.StatusOK, gin.H{"results": results})
}
// GetPriceElasticity returns price elasticity data
func (h *AnalyticsHandler) GetPriceElasticity(c *gin.Context) {
elasticity := map[string]any{
"overall_elasticity": -1.2,
"by_segment": map[string]float64{
"enterprise": -0.8,
"smb": -1.1,
"consumer": -1.5,
},
"by_price_range": map[string]float64{
"0-20": -1.8,
"20-50": -1.2,
"50-100": -0.9,
"100+": -0.6,
},
"generated_at": time.Now(),
}
c.JSON(http.StatusOK, elasticity)
}