mirror of
https://github.com/andwati/telecom-platform.git
synced 2026-10-26 14:42:15 +00:00
* refactor: Rename handler package to handlers in carrier-connector
- Rename internal/handler directory to internal/handlers
- Update handler import path in main.go and routes.go
* feat: Add SM-DP+ handler with multi-carrier management and profile operations
- Add SMDPHandler struct with manager field and NewSMDPHandler constructor
- Add AddCarrier endpoint with JSON binding and carrier configuration support
- Add RemoveCarrier endpoint with carrier ID parameter validation
- Add DownloadProfile endpoint with 30-second timeout and context cancellation
- Add GetCarrierStatus endpoint returning all carriers with timestamp
- Add GetProfileStatus endpoint with EID/ICCID validation
* feat: Add SM-DP+ integration layer with multi-carrier system initialization and route registration
- Add SMDPIntegration struct with service, handler, repository, and logger fields
- Add NewSMDPIntegration constructor with default carrier initialization
- Add InitializeSystem method with carrier health logging and status tracking
- Add RegisterRoutes method with profile, carrier, health, and metrics endpoints
- Add healthHandler with carrier health status aggregation and degraded state detection
- Add metricsHandler
* feat: Add SM-DP+ service layer with multi-carrier management and profile download operations
- Add SMDPService struct with manager, repository, and logger fields
- Add NewSMDPService constructor with default config and background health checking
- Add InitializeDefaultCarriers with AT&T, Verizon, and T-Mobile DE configurations
- Add DownloadProfile method with context support and request logging
- Add GetOptimalCarrier wrapping SelectCarrier for best carrier selection
- Add GetCarrierHealth returning
* feat: Add SM-DP+ manager with multi-carrier load balancing, health checking, and profile operations
- Add DefaultManagerConfig with 30s health checks, 3 retries, and circuit breaker configuration
- Add CarrierConfig struct with ES2 settings, MCC/MNC, priority, and feature support
- Add ToCarrier method converting CarrierConfig to Carrier with metrics and capabilities
- Add HealthChecker with periodic carrier health monitoring and status evaluation
- Add LoadBalancer with weighted round-robin, least
* feat: Add intelligent carrier selection service with scoring, recommendations, and analytics
- Add SelectionService struct with manager, handler, and logger fields
- Add NewSelectionService constructor with info-level logging
- Add IntelligentCarrierSelection method with comprehensive criteria evaluation
- Add IntelligentSelectionRequest with region, profile type, urgency, and cost sensitivity
- Add UserPreferences and BusinessContext structs for selection customization
- Add IntelligentSelectionResponse with selected
* feat: Add carrier selection handler with optimal selection, analytics, and performance monitoring endpoints
- Add SelectionHandler struct with manager and logger fields
- Add NewSelectionHandler constructor with info-level logging
- Add SelectOptimalCarrier endpoint with criteria validation and scoring
- Add SelectCarrier endpoint using default selection criteria
- Add GetSelectionHistory endpoint with carrier ID path parameter
- Add UpdateLearning endpoint with performance feedback validation
- Add GetSelectionAnalytics endpoint with carrier stats
* feat: Add carrier selection integration layer with multi-carrier setup, HTTP server, and demo capabilities
- Add SelectionIntegration struct with manager, selection service, handler, and SMDP service fields
- Add NewSelectionIntegration constructor with default manager config and 30s health checks
- Add SetupCarriers with AT&T, Verizon, T-Mobile DE, and Orange FR configurations
- Add StartServer method with health endpoint and 30s read/write timeouts
- Add StartHealthChecking wrapper for background
* feat: Refactor profile handlers into modular core components with simplified operations
- Split profile_handlers.go into profile_handlers_core.go, profile_handlers_management_core.go, and profile_handlers_management_delete.go
- Simplify OrderProfileHandlerWithRepo with ICCID/IMSI-only validation and "downloaded" state
- Remove webhook and message queue notifications from order handler
- Add UpdateProfileHandler with state validation for downloaded/activated/deactivated/expired
- Add DeleteProfileHandler with existence
* refactor: Extract carrier setup logic into separate file and remove unnecessary comments
- Move SetupCarriers method from selection_integration.go to new setup_carriers.go file
- Remove redundant comments from SelectionIntegration struct and methods
- Clean up inline comments in RunDemo method while preserving functionality
* feat: Add intelligent carrier selection algorithm with machine learning optimization and performance tracking
- Add SelectionAlgorithm with scoring, weighting, and ML-based carrier selection
- Add SelectionCriteria struct with region, profile type, urgency, and cost/performance weights
- Add CarrierScore with performance, reliability, cost, region, and capability scores
- Add calculateWeightedScore combining all scores with ML-optimized weights
- Add getWeights with urgency-based adjustments
* feat: Integrate SelectionAlgorithm into SMDPManager with optimal carrier selection and learning capabilities
- Add selector field to SMDPManager struct with SelectionAlgorithm type
- Initialize selector in NewSMDPManager constructor
- Add SelectOptimalCarrier method filtering healthy carriers and delegating to selection algorithm
- Add SelectCarrier wrapper with default criteria (operational profile, medium urgency, balanced weights)
- Add GetSelectionHistory method returning carrier selection history
- Add UpdateLearning
* refactor: Simplify profile handler function names by removing WithRepo suffix
- Rename ListProfilesHandlerWithRepo to ListProfilesHandler
- Rename GetProfileHandlerWithRepo to GetProfileHandler
- Rename DeleteProfileHandlerWithRepo to DeleteProfileHandler
* feat: Add pricing engine with rate plan validation, cost calculation, and price optimization
- Add PricingEngine struct with repository and logger fields
- Add ValidateRatePlan with comprehensive validation for fields, dates, allowances, overage rates, discounts, and early termination
- Add CalculateOptimalPrice with market analysis and recommended pricing based on competitor data
- Add ValidateSubscription with plan availability, validity dates, and discount validation
- Add CalculateSubscriptionCost with base
* feat: Add rate plan analytics handlers with usage, revenue, popularity, and dashboard endpoints
- Add AnalyticsResponse struct with success, message, and data fields
- Add GetUsageAnalytics with date range parsing, default last month period, and group by support
- Add GetRevenueAnalytics with RFC3339 date parsing and configurable filters
- Add GetPopularPlans with configurable limit defaulting to 10
- Add GetDashboardData aggregating top 5 popular plans, 30-day usage analytics, and revenue analytics
* feat: Add rate plan handler layer with CRUD operations, management endpoints, and analytics support
- Add RatePlanHandler struct with service and logger fields
- Add CreateRatePlan with JSON binding, draft status initialization, and comprehensive field mapping
- Add GetRatePlan with ID path parameter extraction and not found handling
- Add UpdateRatePlan with selective field updates and existing plan retrieval
- Add DeleteRatePlan with active subscription conflict detection
- Add ListRatePlans with carrier
* feat: Add rate plan type system with comprehensive domain models, allowances, subscriptions, and analytics support
- Add RatePlan struct with carrier, region, pricing, allowances, features, discounts, and validity fields
- Add PlanType enum with prepaid, postpaid, hybrid, pay-as-you-go, and unlimited options
- Add PlanStatus enum with draft, active, inactive, archived, and suspended states
- Add BillingCycle enum with daily, weekly, monthly, quarterly, and yearly options
- Add DataAllowance, VoiceAllowance, and
* feat: Add rate plan service layer with CRUD operations, subscription management, usage tracking, and analytics support
- Add Service struct with repository and logger fields
- Add CreateRatePlan with ID generation, validation, and comprehensive field checks
- Add GetRatePlan, UpdateRatePlan, and DeleteRatePlan with active subscription conflict detection
- Add ListRatePlans and SearchRatePlans with filtering and sorting support
- Add SubscribeToPlan with plan availability validation, duplicate subscription
* feat: Add carrier integration layer with optimal carrier selection, rate plan recommendations, and analytics support
- Add CarrierSelectionIntegrator struct with rate plan repository, SMDP manager, and logger fields
- Add GetOptimalCarrierWithRatePlan with region filtering, carrier grouping, performance scoring, and combined evaluation
- Add RecommendRatePlansForCarrier with carrier validation, active plan filtering, and recommendation creation
- Add UpdateCarrierSelectionCriteria with 30-day usage analytics
* feat: Add rate plan repository interface with GORM models and extended types for carrier integration
- Add Repository interface with rate plan CRUD, subscription management, usage tracking, and analytics operations
- Add GORM table name methods for RatePlan, RatePlanSubscription, and RatePlanUsage models
- Add GORM hooks with automatic timestamp handling for BeforeCreate and BeforeUpdate operations
- Add SearchCriteria with carrier, region, plan type, price range, pagination, and sorting fields
* feat: Refactor pricing engine by extracting calculation methods into separate file
- Move calculateDataOverage, calculateVoiceOverage, calculateSMSOverage, calculateDiscounts, and calculateRecommendedPrice to price_calculation.go
- Remove validation helper methods from pricing_engine.go
- Remove PriceOptimization and CostBreakdown type definitions
- Update Logger interface to use `any` instead of `interface{}`
- Remove inline comments throughout pricing_engine.go
- Add switch statement for discount type handling in calculateDiscounts
* refactor: Extract core rate plan types into separate file
- Move RatePlan struct from types.go to types_core.go
- Move PlanType enum with prepaid, postpaid, hybrid, pay-as-you-go, and unlimited options to types_core.go
- Move PlanStatus enum with draft, active, inactive, and archived states to types_core.go
- Move BillingCycle enum with daily, weekly, monthly, quarterly, and yearly options to types_core.go
- Add documentation comments for PlanType, PlanStatus, and BillingCycle enums
- Remove PlanStatusSuspended from PlanStatus enum
* feat: Add GORM repository implementation with CRUD operations, subscription management, usage tracking, and analytics support
- Add GormRepository struct with database and logger fields
- Add CreateRatePlan, GetRatePlan, UpdateRatePlan, and DeleteRatePlan with automatic timestamp handling
- Add ListRatePlans with carrier, region, plan type, status, price range, and validity filtering
- Add CountRatePlans with comprehensive filter support
- Add CreateSubscription, GetSubscription, UpdateSubscription, and DeleteSubscription with timestamp
* feat: Add carrier configuration layer with GORM repository, file loading, and model conversion support
- Add GormCarrierRepository struct with database and logger fields
- Add CarrierModel with ID, name, MCC, MNC, country code, active status, priority, ES2 config, capabilities, and timestamp fields
- Add GetCarriers with active carrier filtering and model-to-carrier conversion
- Add GetCarrier with ID lookup and not found handling
- Add SaveCarrier with upsert logic for create or update operations
* feat: Add carrier configuration file loading with JSON-based carrier setup and validation
- Add carriers.json with AT&T US, Verizon US, T-Mobile Germany, Orange France, and Vodafone UK configurations
- Add LoadCarriersFromFile with JSON parsing and config file reading
- Add ConvertConfigToCarriers with model-to-carrier conversion logic
- Add validateCarrier with ID, name, MCC, MNC, country code, and ES2 config validation
- Replace hardcoded carrier setup with file-based configuration loading
- Add success
* refactor: Extract service methods into separate files for better organization
- Move GetUsage, GetUsageHistory, GetUsageAnalytics, GetRevenueAnalytics, and GetPopularPlans to service_analytics.go
- Move validateRatePlan, validateSubscribeRequest, calculateNextBillingDate, and calculateCycleEnd to service_methods.go
- Move SubscribeToPlan, GetSubscription, UpdateSubscription, CancelSubscription, GetActiveSubscription, and ListSubscriptions to service_subscriptions.go
- Move RecordUsage to service_usage.go
* feat: Add currency configuration file with 20 major currencies and regional support
- Add currencies.json with USD, EUR, GBP, JPY, CAD, AUD, CHF, CNY, INR, BRL, MXN, SEK, NOK, DKK, SGD, HKD, NZD, ZAR, KRW, and TRY configurations
- Add currency metadata with code, name, symbol, decimal places, active status, and supported regions
- Add regional mappings for currency support across multiple countries and territories
* feat: Add currency analytics service with revenue tracking, transaction analysis, and usage statistics
- Add AnalyticsServiceImpl struct with repository and logger fields
- Add GetRevenueByCurrency with completed transaction filtering and revenue aggregation by currency
- Add GetTransactionVolumeByCurrency with transaction count grouping
- Add GetExchangeRateTrends with historical rate retrieval and date-based filtering
- Add GetCurrencyUsageStats with total/active currency counts, transaction volume
* feat: Add multi-currency billing service with transaction processing, currency conversion, and history tracking
- Add BillingServiceImpl struct with repository, exchange service, logger, and base currency fields
- Add NewBillingService constructor with dependency injection
- Add ProcessBilling with request validation, currency conversion, transaction creation, and payment processing
- Add ConvertAmount wrapper delegating to exchange service
- Add GetBillingHistory with profile ID filtering and transaction retries
* feat: Add exchange rate service with multi-provider support, currency conversion, and historical rate tracking
- Add ExchangeRateService struct with repository, logger, providers, and base currency fields
- Add NewExchangeRateService constructor and AddProvider for provider registration
- Add GetExchangeRate with repository caching, provider fallback, and same-currency handling
- Add ConvertAmount wrapper with exchange rate retrieval and amount calculation
- Add RefreshRates with multi-provider rate
* refactor: Extract currency interfaces and GORM models into separate files
- Move Repository, ExchangeRateProvider, BillingService, and AnalyticsService interfaces from types.go to new interface.go
- Move BillingSummary and CurrencyUsageStats structs to interface.go
- Move CurrencyModel, ExchangeRateModel, and TransactionModel to new models.go
- Move GORM hooks (BeforeCreate, BeforeUpdate) and TableName methods to models.go
- Remove redundant comments from exchange_rate_service.go
* feat: Add rate plan currency integrator with subscription creation, cost calculation, and multi-currency billing support
- Add RatePlanCurrencyIntegrator struct with billing service, exchange service, rate plan service, logger, and base currency fields
- Add NewRatePlanCurrencyIntegrator constructor with dependency injection
- Add SubscribeToPlanWithCurrency with price conversion, subscription creation, and initial billing processing
- Add CalculatePlanCostInCurrency with base cost calculation
* feat: Add currency repository with GORM implementation, rate plan integration, and transaction management
- Add GormRepository with CRUD operations for currencies, exchange rates, and transactions
- Add repository helper methods for model-to-domain conversions with JSON metadata handling
- Add GetHistoricalRates with date range filtering and chronological ordering
- Add ListExchangeRates with currency pair, active status, and date range filtering
- Add CreateTransaction, GetTransaction, UpdateTransaction, and List
* feat: Add currency handler layer with conversion, billing, exchange rates, and analytics endpoints
- Add CurrencyHandler struct with billing service, exchange service, and logger fields
- Add ConvertCurrency endpoint with JSON binding and amount conversion support
- Add GetExchangeRate endpoint with currency pair path parameters
- Add ProcessBilling endpoint with billing request validation and transaction processing
- Add GetBillingHistory with profile ID filtering, date range, limit, and offset support
* refactor: Rename service package to services and move repository implementations to repository package
- Rename internal/service to internal/services in carrier-connector
- Update service imports in selection_integration.go and smdp_integration.go
- Move currency repository files from internal/currency to internal/repository
- Move rate plan repository files from internal/rateplan to internal/repository
- Update package declarations and imports for currency domain types
- Add currency package imports
* refactor: Add ExchangeRateService interface and format currency types with consistent alignment
- Add ExchangeRateService interface with GetExchangeRate, ConvertAmount, GetRateHistory, UpdateExchangeRate, GetSupportedCurrencies, ValidateCurrencyPair, and RefreshRates methods
- Add CurrencyRevenue struct with currency and revenue fields
- Add TransactionTypeStats struct with type, count, amount, and currency fields
- Align struct field tags consistently across Currency, ExchangeRate, Transaction, and request/response types
* refactor: Update service layer to use repository package types and align imports
- Update Service struct to use repository.Repository interface
- Update all method signatures to use repository package types (RatePlan, RatePlanSubscription, RatePlanUsage, etc.)
- Update filter and request types to use repository package (RatePlanFilter, SubscriptionFilter, CalculateCostRequest, etc.)
- Update status constants to use repository package (SubscriptionStatusActive, PlanStatusActive, DiscountTypePercentage, DiscountTypeFixed)
* refactor: Update handler constructors to use interface types instead of concrete implementations
- Update CurrencyHandler.exchangeService field from *currency.ExchangeRateService to currency.ExchangeRateService interface
- Update NewCurrencyHandler parameter from *currency.ExchangeRateService to currency.ExchangeRateService interface
- Update RatePlanHandler.service field from *rateplan.Service to rateplan.Service interface
- Update NewRatePlanHandler parameter from *rateplan.Service to rateplan.Service interface
* refactor: Rename currency parameter from 'currency' to 'curr' in currencyToModel helper method and add Service interface to rate plan package
- Rename currency parameter to curr in GormRepository.currencyToModel to avoid shadowing currency package name
- Add Service interface with rate plan, subscription, usage, and analytics operations
- Add CreateRatePlan, GetRatePlan, UpdateRatePlan, DeleteRatePlan, ListRatePlans, and SearchRatePlans methods
- Add SubscribeToPlan, GetSubscription, UpdateSubscription, CancelSubscription, GetActiveSubscription, and ListSubscriptions methods
- Add Rec
* feat: Add repository types package with rate plan, subscription, usage, and analytics domain models
- Add Repository interface with rate plan CRUD, subscription management, usage tracking, and analytics operations
- Add RatePlan struct with pricing, allowances, overage rates, discounts, and metadata fields
- Add RatePlanSubscription struct with billing cycle, auto-renewal, and applied discounts support
- Add RatePlanUsage struct with cycle tracking and data/voice/SMS usage metrics
- Add filter types for rate plans, subscriptions, usage analytics, and revenue analytics
219 lines
7.9 KiB
Go
219 lines
7.9 KiB
Go
package services
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// GetCarrierAnalytics returns comprehensive carrier analytics
|
|
func (s *SelectionService) GetCarrierAnalytics(ctx context.Context) (*CarrierAnalyticsResponse, error) {
|
|
s.logger.Info("Generating carrier analytics")
|
|
|
|
// Get carrier status
|
|
carriers := s.manager.GetCarrierStatus()
|
|
|
|
analytics := &CarrierAnalyticsResponse{
|
|
GeneratedAt: time.Now(),
|
|
TotalCarriers: len(carriers),
|
|
HealthyCarriers: 0,
|
|
Analytics: make(map[string]*CarrierAnalytics),
|
|
Summary: &AnalyticsSummary{},
|
|
}
|
|
|
|
var totalScore float64
|
|
var totalRequests uint64
|
|
var totalSuccess uint64
|
|
|
|
for carrierID, carrier := range carriers {
|
|
carrierAnalytics := &CarrierAnalytics{
|
|
CarrierID: carrierID,
|
|
CarrierName: carrier.Name,
|
|
Region: carrier.CountryCode,
|
|
Status: string(carrier.HealthStatus),
|
|
LastCheck: carrier.LastHealthCheck,
|
|
}
|
|
|
|
// Get selection history
|
|
history := s.manager.GetSelectionHistory(carrierID)
|
|
carrierAnalytics.SelectionCount = len(history)
|
|
|
|
if len(history) > 0 {
|
|
var scoreSum float64
|
|
for _, score := range history {
|
|
scoreSum += score.TotalScore
|
|
}
|
|
carrierAnalytics.AverageScore = scoreSum / float64(len(history))
|
|
carrierAnalytics.LastSelected = history[len(history)-1].SelectedAt
|
|
}
|
|
|
|
// Calculate performance metrics
|
|
if carrier.Metrics.TotalRequests > 0 {
|
|
carrierAnalytics.SuccessRate = float64(carrier.Metrics.SuccessfulRequests) / float64(carrier.Metrics.TotalRequests) * 100
|
|
carrierAnalytics.AverageResponseTime = carrier.Metrics.AverageResponseTime.Milliseconds()
|
|
carrierAnalytics.RequestRate = carrier.Metrics.RequestRate
|
|
}
|
|
|
|
// Update totals
|
|
totalScore += carrierAnalytics.AverageScore
|
|
totalRequests += carrier.Metrics.TotalRequests
|
|
totalSuccess += carrier.Metrics.SuccessfulRequests
|
|
|
|
// Count healthy carriers
|
|
if carrier.HealthStatus == "healthy" {
|
|
analytics.HealthyCarriers++
|
|
}
|
|
|
|
// Generate carrier-specific recommendations
|
|
carrierAnalytics.Recommendations = s.generateCarrierRecommendations(carrierAnalytics)
|
|
|
|
analytics.Analytics[carrierID] = carrierAnalytics
|
|
}
|
|
|
|
// Calculate summary metrics
|
|
if len(carriers) > 0 {
|
|
analytics.Summary.AverageScore = totalScore / float64(len(carriers))
|
|
}
|
|
if totalRequests > 0 {
|
|
analytics.Summary.OverallSuccessRate = float64(totalSuccess) / float64(totalRequests) * 100
|
|
}
|
|
|
|
analytics.Summary.TotalRequests = totalRequests
|
|
analytics.Summary.OverallHealth = float64(analytics.HealthyCarriers) / float64(len(carriers)) * 100
|
|
|
|
return analytics, nil
|
|
}
|
|
|
|
// CarrierAnalyticsResponse represents the response for carrier analytics
|
|
type CarrierAnalyticsResponse struct {
|
|
GeneratedAt time.Time `json:"generated_at"`
|
|
TotalCarriers int `json:"total_carriers"`
|
|
HealthyCarriers int `json:"healthy_carriers"`
|
|
Analytics map[string]*CarrierAnalytics `json:"analytics"`
|
|
Summary *AnalyticsSummary `json:"summary"`
|
|
}
|
|
|
|
// CarrierAnalytics represents analytics for a single carrier
|
|
type CarrierAnalytics struct {
|
|
CarrierID string `json:"carrier_id"`
|
|
CarrierName string `json:"carrier_name"`
|
|
Region string `json:"region"`
|
|
Status string `json:"status"`
|
|
SelectionCount int `json:"selection_count"`
|
|
AverageScore float64 `json:"average_score"`
|
|
SuccessRate float64 `json:"success_rate"`
|
|
AverageResponseTime int64 `json:"average_response_time_ms"`
|
|
RequestRate float64 `json:"request_rate"`
|
|
LastSelected time.Time `json:"last_selected"`
|
|
LastCheck time.Time `json:"last_check"`
|
|
Recommendations []string `json:"recommendations"`
|
|
}
|
|
|
|
// AnalyticsSummary represents overall analytics summary
|
|
type AnalyticsSummary struct {
|
|
AverageScore float64 `json:"average_score"`
|
|
OverallSuccessRate float64 `json:"overall_success_rate"`
|
|
TotalRequests uint64 `json:"total_requests"`
|
|
OverallHealth float64 `json:"overall_health"`
|
|
}
|
|
|
|
// generateCarrierRecommendations generates recommendations for a specific carrier
|
|
func (s *SelectionService) generateCarrierRecommendations(analytics *CarrierAnalytics) []string {
|
|
recommendations := []string{}
|
|
|
|
// Performance recommendations
|
|
if analytics.SuccessRate < 95 {
|
|
recommendations = append(recommendations, "Monitor success rate - below optimal threshold")
|
|
}
|
|
if analytics.AverageResponseTime > 500 {
|
|
recommendations = append(recommendations, "Consider optimizing response time")
|
|
}
|
|
if analytics.RequestRate > 100 {
|
|
recommendations = append(recommendations, "High request rate - monitor for overload")
|
|
}
|
|
|
|
// Selection recommendations
|
|
if analytics.SelectionCount == 0 {
|
|
recommendations = append(recommendations, "Carrier never selected - investigate configuration")
|
|
} else if analytics.AverageScore < 70 {
|
|
recommendations = append(recommendations, "Low selection scores - review carrier performance")
|
|
}
|
|
|
|
// Health recommendations
|
|
if analytics.Status != "healthy" {
|
|
recommendations = append(recommendations, "Carrier health issues - immediate attention required")
|
|
}
|
|
|
|
if len(recommendations) == 0 {
|
|
recommendations = append(recommendations, "Carrier performing well")
|
|
}
|
|
|
|
return recommendations
|
|
}
|
|
|
|
// OptimizeCarrierSelection provides optimization recommendations
|
|
func (s *SelectionService) OptimizeCarrierSelection(ctx context.Context) (*OptimizationResponse, error) {
|
|
s.logger.Info("Analyzing carrier selection optimization opportunities")
|
|
|
|
analytics, err := s.GetCarrierAnalytics(ctx)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get analytics: %w", err)
|
|
}
|
|
|
|
optimization := &OptimizationResponse{
|
|
GeneratedAt: time.Now(),
|
|
OverallHealth: analytics.Summary.OverallHealth,
|
|
Recommendations: []string{},
|
|
PriorityActions: []string{},
|
|
LongTermActions: []string{},
|
|
}
|
|
|
|
// Generate recommendations based on analytics
|
|
if analytics.Summary.OverallHealth < 80 {
|
|
optimization.Recommendations = append(optimization.Recommendations, "System health below optimal - investigate carrier issues")
|
|
optimization.PriorityActions = append(optimization.PriorityActions, "Review unhealthy carriers and implement failover")
|
|
}
|
|
|
|
if analytics.Summary.OverallSuccessRate < 95 {
|
|
optimization.Recommendations = append(optimization.Recommendations, "Success rate below target - optimize carrier selection criteria")
|
|
optimization.PriorityActions = append(optimization.PriorityActions, "Adjust performance weights in selection algorithm")
|
|
}
|
|
|
|
// Analyze individual carriers
|
|
for _, carrier := range analytics.Analytics {
|
|
if carrier.SuccessRate < 90 {
|
|
optimization.PriorityActions = append(optimization.PriorityActions,
|
|
fmt.Sprintf("Investigate %s (%s) - success rate %.1f%%",
|
|
carrier.CarrierName, carrier.CarrierID, carrier.SuccessRate))
|
|
}
|
|
if carrier.AverageResponseTime > 1000 {
|
|
optimization.PriorityActions = append(optimization.PriorityActions,
|
|
fmt.Sprintf("Optimize %s (%s) - response time %dms",
|
|
carrier.CarrierName, carrier.CarrierID, carrier.AverageResponseTime))
|
|
}
|
|
}
|
|
|
|
// Long-term recommendations
|
|
optimization.LongTermActions = append(optimization.LongTermActions,
|
|
"Implement machine learning for carrier selection")
|
|
optimization.LongTermActions = append(optimization.LongTermActions,
|
|
"Add predictive analytics for carrier performance")
|
|
optimization.LongTermActions = append(optimization.LongTermActions,
|
|
"Expand carrier portfolio for better redundancy")
|
|
|
|
if len(optimization.Recommendations) == 0 {
|
|
optimization.Recommendations = append(optimization.Recommendations, "System operating optimally")
|
|
}
|
|
|
|
return optimization, nil
|
|
}
|
|
|
|
// OptimizationResponse represents optimization recommendations
|
|
type OptimizationResponse struct {
|
|
GeneratedAt time.Time `json:"generated_at"`
|
|
OverallHealth float64 `json:"overall_health"`
|
|
Recommendations []string `json:"recommendations"`
|
|
PriorityActions []string `json:"priority_actions"`
|
|
LongTermActions []string `json:"long_term_actions"`
|
|
}
|