1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5use std::time::Duration;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct CostManagementConfig {
10 pub enable_cost_optimization: bool,
12 pub optimization_strategies: Vec<CostOptimizationStrategy>,
14 pub pricing_models: HashMap<String, PricingModel>,
16 pub cost_prediction: CostPredictionConfig,
18 pub budget_management: BudgetConfig,
20 pub cost_alerting: CostAlertingConfig,
22 pub reporting: FinancialReportingConfig,
24 pub allocation: CostAllocationConfig,
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
30pub enum CostOptimizationStrategy {
31 SpotInstanceOptimization,
32 ReservedInstanceOptimization,
33 RightSizing,
34 SchedulingOptimization,
35 LoadBalancingOptimization,
36 ResourcePooling,
37 AutoShutdown,
38 PriceComparison,
39 ContractNegotiation,
40 CustomStrategy(String),
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct PricingModel {
46 pub model_type: String,
47 pub base_rate: f64,
48 pub scaling_factors: HashMap<String, f64>,
49 pub discount_tiers: Vec<f64>,
50 pub structure: PricingStructure,
52 pub contract_terms: ContractTerms,
54 pub dynamic_pricing: DynamicPricingConfig,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct PricingStructure {
61 pub billing_model: BillingModel,
63 pub rate_components: Vec<RateComponent>,
65 pub volume_discounts: Vec<VolumeDiscount>,
67 pub time_based: TimeBasedPricingConfig,
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
73pub enum BillingModel {
74 PayPerUse,
75 Subscription,
76 Reserved,
77 Spot,
78 Prepaid,
79 Hybrid,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct RateComponent {
85 pub name: String,
87 pub rate: f64,
89 pub unit: String,
91 pub minimum_charge: Option<f64>,
93 pub maximum_charge: Option<f64>,
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize)]
99pub struct VolumeDiscount {
100 pub min_volume: f64,
102 pub discount_percent: f64,
104 pub discount_type: DiscountType,
106}
107
108#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
110pub enum DiscountType {
111 Percentage,
112 FixedAmount,
113 TieredDiscount,
114 VolumeDiscount,
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize, Default)]
119pub struct TimeBasedPricingConfig {
120 pub peak_hours: PeakHoursPricing,
122 pub off_peak_hours: OffPeakHoursPricing,
124 pub weekend_pricing: WeekendPricing,
126 pub holiday_pricing: HolidayPricing,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
132pub struct PeakHoursPricing {
133 pub start_time: String,
135 pub end_time: String,
137 pub rate_multiplier: f64,
139 pub days_of_week: Vec<String>,
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct OffPeakHoursPricing {
146 pub rate_multiplier: f64,
148 pub min_discount: f64,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize)]
154pub struct WeekendPricing {
155 pub rate_multiplier: f64,
157 pub weekend_days: Vec<String>,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize)]
163pub struct HolidayPricing {
164 pub rate_multiplier: f64,
166 pub holiday_calendar: Vec<String>,
168}
169
170#[derive(Debug, Clone, Serialize, Deserialize)]
172pub struct ContractTerms {
173 pub duration: Duration,
175 pub commitment_level: CommitmentLevel,
177 pub early_termination_fees: EarlyTerminationFees,
179 pub sla: ServiceLevelAgreements,
181}
182
183#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
185pub enum CommitmentLevel {
186 NoCommitment,
187 MonthlyCommitment,
188 YearlyCommitment,
189 MultiYearCommitment,
190 CustomCommitment(Duration),
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct EarlyTerminationFees {
196 pub fee_structure: FeeStructure,
198 pub calculation_method: FeeCalculationMethod,
200 pub waiver_conditions: Vec<WaiverCondition>,
202}
203
204#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
206pub enum FeeStructure {
207 FixedFee(f64),
208 PercentageOfRemaining(f64),
209 ProRatedFee,
210 NoFee,
211}
212
213#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
215pub enum FeeCalculationMethod {
216 RemainingMonths,
217 UnusedCommitment,
218 TotalContractValue,
219 Custom(String),
220}
221
222#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
224pub enum WaiverCondition {
225 ServiceFailure,
226 ForCause,
227 MutualAgreement,
228 Custom(String),
229}
230
231#[derive(Debug, Clone, Serialize, Deserialize)]
233pub struct ServiceLevelAgreements {
234 pub uptime: f64,
236 pub performance: HashMap<String, f64>,
238 pub support: SupportSLA,
240 pub penalties: SLAPenalties,
242}
243
244#[derive(Debug, Clone, Serialize, Deserialize, Default)]
246pub struct SupportSLA {
247 pub response_times: HashMap<String, Duration>,
249 pub resolution_times: HashMap<String, Duration>,
251 pub escalation: EscalationProcedures,
253}
254
255#[derive(Debug, Clone, Serialize, Deserialize, Default)]
257pub struct EscalationProcedures {
258 pub levels: Vec<EscalationLevel>,
260 pub automatic: bool,
262 pub triggers: Vec<EscalationTrigger>,
264}
265
266#[derive(Debug, Clone, Serialize, Deserialize)]
268pub struct EscalationLevel {
269 pub level: u8,
271 pub contacts: Vec<String>,
273 pub escalation_time: Duration,
275}
276
277#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
279pub enum EscalationTrigger {
280 TimeElapsed,
281 NoResponse,
282 CustomerRequest,
283 SeverityIncrease,
284}
285
286#[derive(Debug, Clone, Serialize, Deserialize, Default)]
288pub struct SLAPenalties {
289 pub structure: PenaltyStructure,
291 pub credits: CreditStructure,
293 pub max_penalties: MaxPenalties,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize, Default)]
299pub struct PenaltyStructure {
300 pub uptime_penalties: Vec<UptimePenalty>,
302 pub performance_penalties: Vec<PerformancePenalty>,
304}
305
306#[derive(Debug, Clone, Serialize, Deserialize)]
308pub struct UptimePenalty {
309 pub min_uptime: f64,
311 pub penalty_percent: f64,
313}
314
315#[derive(Debug, Clone, Serialize, Deserialize)]
317pub struct PerformancePenalty {
318 pub metric: String,
320 pub threshold: f64,
322 pub penalty_percent: f64,
324}
325
326#[derive(Debug, Clone, Serialize, Deserialize, Default)]
328pub struct CreditStructure {
329 pub service_credits: Vec<ServiceCredit>,
331 pub application: CreditApplication,
333}
334
335#[derive(Debug, Clone, Serialize, Deserialize)]
337pub struct ServiceCredit {
338 pub condition: String,
340 pub amount: f64,
342 pub credit_type: CreditType,
344}
345
346#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
348pub enum CreditType {
349 Percentage,
350 FixedAmount,
351 FreeUsage,
352}
353
354#[derive(Debug, Clone, Serialize, Deserialize)]
356pub struct CreditApplication {
357 pub method: CreditApplicationMethod,
359 pub processing_time: Duration,
361 pub verification_required: bool,
363}
364
365#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
367pub enum CreditApplicationMethod {
368 Automatic,
369 Manual,
370 OnRequest,
371}
372
373#[derive(Debug, Clone, Serialize, Deserialize)]
375pub struct MaxPenalties {
376 pub monthly_max: Option<f64>,
378 pub annual_max: Option<f64>,
380 pub per_incident_max: Option<f64>,
382}
383
384#[derive(Debug, Clone, Serialize, Deserialize)]
386pub struct DynamicPricingConfig {
387 pub enabled: bool,
389 pub algorithms: Vec<PricingAlgorithm>,
391 pub update_frequency: Duration,
393 pub price_bounds: PriceBounds,
395}
396
397#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
399pub enum PricingAlgorithm {
400 SupplyDemand,
401 Competition,
402 CostPlus,
403 ValueBased,
404 MarketBased,
405 Custom(String),
406}
407
408#[derive(Debug, Clone, Serialize, Deserialize)]
410pub struct PriceBounds {
411 pub min_price: f64,
413 pub max_price: f64,
415 pub change_limits: PriceChangeLimits,
417}
418
419#[derive(Debug, Clone, Serialize, Deserialize)]
421pub struct PriceChangeLimits {
422 pub max_increase_percent: f64,
424 pub max_decrease_percent: f64,
426 pub change_frequency: Duration,
428}
429
430#[derive(Debug, Clone, Serialize, Deserialize)]
432pub struct CostPredictionConfig {
433 pub enable_prediction: bool,
434 pub prediction_algorithms: Vec<String>,
435 pub prediction_horizon: u64,
436 pub models: Vec<CostPredictionModel>,
438 pub forecasting: ForecastingConfig,
440 pub accuracy_monitoring: AccuracyMonitoringConfig,
442}
443
444#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
446pub enum CostPredictionModel {
447 LinearRegression,
448 ARIMA,
449 LSTM,
450 RandomForest,
451 EnsembleModel,
452 Custom(String),
453}
454
455#[derive(Debug, Clone, Serialize, Deserialize)]
457pub struct ForecastingConfig {
458 pub horizons: Vec<ForecastHorizon>,
460 pub confidence_intervals: Vec<f64>,
462 pub scenario_analysis: ScenarioAnalysisConfig,
464}
465
466#[derive(Debug, Clone, Serialize, Deserialize)]
468pub struct ForecastHorizon {
469 pub name: String,
471 pub duration: Duration,
473 pub update_frequency: Duration,
475}
476
477#[derive(Debug, Clone, Serialize, Deserialize, Default)]
479pub struct ScenarioAnalysisConfig {
480 pub enabled: bool,
482 pub scenarios: Vec<CostScenario>,
484 pub probability_weights: HashMap<String, f64>,
486}
487
488#[derive(Debug, Clone, Serialize, Deserialize)]
490pub struct CostScenario {
491 pub name: String,
493 pub description: String,
495 pub parameters: HashMap<String, f64>,
497 pub expected_impact: f64,
499}
500
501#[derive(Debug, Clone, Serialize, Deserialize)]
503pub struct AccuracyMonitoringConfig {
504 pub enabled: bool,
506 pub metrics: Vec<AccuracyMetric>,
508 pub threshold_alerts: Vec<AccuracyAlert>,
510 pub retraining: ModelRetrainingConfig,
512}
513
514#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
516pub enum AccuracyMetric {
517 MAPE, RMSE, MAE, R2, Custom(String),
522}
523
524#[derive(Debug, Clone, Serialize, Deserialize)]
526pub struct AccuracyAlert {
527 pub metric: AccuracyMetric,
529 pub threshold: f64,
531 pub action: AlertAction,
533}
534
535#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
537pub enum AlertAction {
538 Notify,
539 RetainModel,
540 SwitchModel,
541 Custom(String),
542}
543
544#[derive(Debug, Clone, Serialize, Deserialize)]
546pub struct ModelRetrainingConfig {
547 pub auto_retrain: bool,
549 pub triggers: Vec<RetrainingTrigger>,
551 pub frequency: Duration,
553}
554
555#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
557pub enum RetrainingTrigger {
558 AccuracyDrop,
559 DataDrift,
560 ScheduledRetrain,
561 ManualTrigger,
562}
563
564#[derive(Debug, Clone, Serialize, Deserialize)]
566pub struct BudgetConfig {
567 pub daily_budget: Option<f64>,
568 pub monthly_budget: Option<f64>,
569 pub auto_scaling_budget: bool,
570 pub budget_alerts: Vec<String>,
571 pub allocation: BudgetAllocation,
573 pub tracking: BudgetTrackingConfig,
575 pub enforcement: BudgetEnforcementConfig,
577}
578
579#[derive(Debug, Clone, Serialize, Deserialize)]
581pub struct BudgetAllocation {
582 pub departments: HashMap<String, f64>,
584 pub projects: HashMap<String, f64>,
586 pub providers: HashMap<String, f64>,
588 pub reserve_percentage: f64,
590}
591
592#[derive(Debug, Clone, Serialize, Deserialize)]
594pub struct BudgetTrackingConfig {
595 pub frequency: Duration,
597 pub variance_analysis: VarianceAnalysisConfig,
599 pub trend_analysis: TrendAnalysisConfig,
601}
602
603#[derive(Debug, Clone, Serialize, Deserialize)]
605pub struct VarianceAnalysisConfig {
606 pub enabled: bool,
608 pub thresholds: VarianceThresholds,
610 pub root_cause_analysis: bool,
612}
613
614#[derive(Debug, Clone, Serialize, Deserialize)]
616pub struct VarianceThresholds {
617 pub warning_threshold: f64,
619 pub critical_threshold: f64,
621 pub is_percentage: bool,
623}
624
625#[derive(Debug, Clone, Serialize, Deserialize)]
627pub struct TrendAnalysisConfig {
628 pub enabled: bool,
630 pub analysis_window: Duration,
632 pub detection_methods: Vec<TrendDetectionMethod>,
634}
635
636#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
638pub enum TrendDetectionMethod {
639 MovingAverage,
640 LinearRegression,
641 ExponentialSmoothing,
642 SeasonalDecomposition,
643}
644
645#[derive(Debug, Clone, Serialize, Deserialize)]
647pub struct BudgetEnforcementConfig {
648 pub policy: EnforcementPolicy,
650 pub actions: Vec<EnforcementAction>,
652 pub override_permissions: OverridePermissions,
654}
655
656#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
658pub enum EnforcementPolicy {
659 SoftLimit,
660 HardLimit,
661 GracePeriod,
662 Escalation,
663}
664
665#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
667pub enum EnforcementAction {
668 Alert,
669 Throttle,
670 Block,
671 Approve,
672 RequestApproval,
673}
674
675#[derive(Debug, Clone, Serialize, Deserialize, Default)]
677pub struct OverridePermissions {
678 pub authorized_users: Vec<String>,
680 pub approval_workflow: ApprovalWorkflow,
682 pub override_limits: OverrideLimits,
684}
685
686#[derive(Debug, Clone, Serialize, Deserialize)]
688pub struct ApprovalWorkflow {
689 pub required_approvers: usize,
691 pub levels: Vec<ApprovalLevel>,
693 pub timeout: Duration,
695}
696
697#[derive(Debug, Clone, Serialize, Deserialize)]
699pub struct ApprovalLevel {
700 pub name: String,
702 pub approvers: Vec<String>,
704 pub budget_limits: HashMap<String, f64>,
706}
707
708#[derive(Debug, Clone, Serialize, Deserialize)]
710pub struct OverrideLimits {
711 pub max_override_percent: f64,
713 pub frequency_limits: FrequencyLimits,
715 pub justification_required: bool,
717}
718
719#[derive(Debug, Clone, Serialize, Deserialize)]
721pub struct FrequencyLimits {
722 pub per_day: usize,
724 pub per_week: usize,
726 pub per_month: usize,
728}
729
730#[derive(Debug, Clone, Serialize, Deserialize)]
732pub struct CostAlertingConfig {
733 pub enable_alerts: bool,
734 pub alert_thresholds: Vec<f64>,
735 pub notification_channels: Vec<String>,
736 pub rules: Vec<CostAlertRule>,
738 pub escalation_policies: Vec<AlertEscalationPolicy>,
740 pub suppression_rules: Vec<AlertSuppressionRule>,
742}
743
744#[derive(Debug, Clone, Serialize, Deserialize)]
746pub struct CostAlertRule {
747 pub name: String,
749 pub condition: AlertCondition,
751 pub severity: AlertSeverity,
753 pub actions: Vec<AlertAction>,
755}
756
757#[derive(Debug, Clone, Serialize, Deserialize)]
759pub struct AlertCondition {
760 pub metric: CostMetric,
762 pub operator: ComparisonOperator,
764 pub threshold: f64,
766 pub time_window: Duration,
768}
769
770#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
772pub enum CostMetric {
773 TotalCost,
774 HourlyCost,
775 DailyCost,
776 MonthlyCost,
777 CostPerJob,
778 CostPerQubit,
779 BudgetUtilization,
780 Custom(String),
781}
782
783#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
785pub enum ComparisonOperator {
786 GreaterThan,
787 LessThan,
788 Equal,
789 GreaterThanOrEqual,
790 LessThanOrEqual,
791 NotEqual,
792}
793
794#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
796pub enum AlertSeverity {
797 Low,
798 Medium,
799 High,
800 Critical,
801}
802
803#[derive(Debug, Clone, Serialize, Deserialize)]
805pub struct AlertEscalationPolicy {
806 pub name: String,
808 pub levels: Vec<EscalationStep>,
810 pub timeouts: HashMap<String, Duration>,
812}
813
814#[derive(Debug, Clone, Serialize, Deserialize)]
816pub struct EscalationStep {
817 pub name: String,
819 pub contacts: Vec<String>,
821 pub actions: Vec<EscalationAction>,
823 pub delay: Duration,
825}
826
827#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
829pub enum EscalationAction {
830 Notify,
831 AutoRemediate,
832 ManualIntervention,
833 EmergencyShutdown,
834}
835
836#[derive(Debug, Clone, Serialize, Deserialize)]
838pub struct AlertSuppressionRule {
839 pub name: String,
841 pub conditions: Vec<SuppressionCondition>,
843 pub duration: Duration,
845}
846
847#[derive(Debug, Clone, Serialize, Deserialize)]
849pub struct SuppressionCondition {
850 pub field: String,
852 pub operator: ComparisonOperator,
854 pub value: String,
856}
857
858#[derive(Debug, Clone, Serialize, Deserialize)]
860pub struct FinancialReportingConfig {
861 pub enabled: bool,
863 pub report_types: Vec<ReportType>,
865 pub frequency: ReportFrequency,
867 pub delivery: ReportDeliveryConfig,
869}
870
871#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
873pub enum ReportType {
874 CostSummary,
875 DetailedUsage,
876 BudgetVariance,
877 TrendAnalysis,
878 CostOptimization,
879 CustomReport(String),
880}
881
882#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
884pub enum ReportFrequency {
885 Daily,
886 Weekly,
887 Monthly,
888 Quarterly,
889 OnDemand,
890}
891
892#[derive(Debug, Clone, Serialize, Deserialize)]
894pub struct ReportDeliveryConfig {
895 pub methods: Vec<DeliveryMethod>,
897 pub recipients: Vec<String>,
899 pub formats: Vec<ReportFormat>,
901}
902
903#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
905pub enum DeliveryMethod {
906 Email,
907 Dashboard,
908 API,
909 FileSystem,
910 CloudStorage,
911}
912
913#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
915pub enum ReportFormat {
916 PDF,
917 CSV,
918 JSON,
919 Excel,
920 HTML,
921}
922
923#[derive(Debug, Clone, Serialize, Deserialize)]
925pub struct CostAllocationConfig {
926 pub methods: Vec<AllocationMethod>,
928 pub rules: Vec<AllocationRule>,
930 pub chargeback: ChargebackConfig,
932}
933
934#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
936pub enum AllocationMethod {
937 DirectAllocation,
938 ProportionalAllocation,
939 ActivityBasedAllocation,
940 UsageBasedAllocation,
941 CustomAllocation(String),
942}
943
944#[derive(Debug, Clone, Serialize, Deserialize)]
946pub struct AllocationRule {
947 pub name: String,
949 pub source: AllocationSource,
951 pub target: AllocationTarget,
953 pub method: AllocationMethod,
955 pub percentage: Option<f64>,
957}
958
959#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
961pub enum AllocationSource {
962 SharedResources,
963 Infrastructure,
964 Support,
965 Overhead,
966 Custom(String),
967}
968
969#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
971pub enum AllocationTarget {
972 Department,
973 Project,
974 CostCenter,
975 User,
976 Custom(String),
977}
978
979#[derive(Debug, Clone, Serialize, Deserialize)]
981pub struct ChargebackConfig {
982 pub enabled: bool,
984 pub model: ChargebackModel,
986 pub billing_cycle: BillingCycle,
988 pub rate_cards: Vec<RateCard>,
990}
991
992#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
994pub enum ChargebackModel {
995 FullChargeback,
996 Showback,
997 HybridModel,
998 CustomModel(String),
999}
1000
1001#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1003pub enum BillingCycle {
1004 Monthly,
1005 Quarterly,
1006 Annual,
1007 Custom(Duration),
1008}
1009
1010#[derive(Debug, Clone, Serialize, Deserialize)]
1012pub struct RateCard {
1013 pub service: String,
1015 pub rate: f64,
1017 pub unit: String,
1019 pub effective_date: String,
1021 pub expiration_date: Option<String>,
1023}
1024
1025impl Default for CostManagementConfig {
1026 fn default() -> Self {
1027 Self {
1028 enable_cost_optimization: true,
1029 optimization_strategies: vec![
1030 CostOptimizationStrategy::RightSizing,
1031 CostOptimizationStrategy::SchedulingOptimization,
1032 ],
1033 pricing_models: HashMap::new(),
1034 cost_prediction: CostPredictionConfig::default(),
1035 budget_management: BudgetConfig::default(),
1036 cost_alerting: CostAlertingConfig::default(),
1037 reporting: FinancialReportingConfig::default(),
1038 allocation: CostAllocationConfig::default(),
1039 }
1040 }
1041}
1042
1043impl Default for PricingModel {
1044 fn default() -> Self {
1045 Self {
1046 model_type: "pay_per_use".to_string(),
1047 base_rate: 0.1,
1048 scaling_factors: HashMap::new(),
1049 discount_tiers: vec![],
1050 structure: PricingStructure::default(),
1051 contract_terms: ContractTerms::default(),
1052 dynamic_pricing: DynamicPricingConfig::default(),
1053 }
1054 }
1055}
1056
1057impl Default for PricingStructure {
1058 fn default() -> Self {
1059 Self {
1060 billing_model: BillingModel::PayPerUse,
1061 rate_components: vec![],
1062 volume_discounts: vec![],
1063 time_based: TimeBasedPricingConfig::default(),
1064 }
1065 }
1066}
1067
1068impl Default for PeakHoursPricing {
1069 fn default() -> Self {
1070 Self {
1071 start_time: "09:00".to_string(),
1072 end_time: "17:00".to_string(),
1073 rate_multiplier: 1.5,
1074 days_of_week: vec![
1075 "Mon".to_string(),
1076 "Tue".to_string(),
1077 "Wed".to_string(),
1078 "Thu".to_string(),
1079 "Fri".to_string(),
1080 ],
1081 }
1082 }
1083}
1084
1085impl Default for OffPeakHoursPricing {
1086 fn default() -> Self {
1087 Self {
1088 rate_multiplier: 0.8,
1089 min_discount: 0.1,
1090 }
1091 }
1092}
1093
1094impl Default for WeekendPricing {
1095 fn default() -> Self {
1096 Self {
1097 rate_multiplier: 0.7,
1098 weekend_days: vec!["Sat".to_string(), "Sun".to_string()],
1099 }
1100 }
1101}
1102
1103impl Default for HolidayPricing {
1104 fn default() -> Self {
1105 Self {
1106 rate_multiplier: 0.5,
1107 holiday_calendar: vec![],
1108 }
1109 }
1110}
1111
1112impl Default for ContractTerms {
1113 fn default() -> Self {
1114 Self {
1115 duration: Duration::from_secs(86400 * 365), commitment_level: CommitmentLevel::NoCommitment,
1117 early_termination_fees: EarlyTerminationFees::default(),
1118 sla: ServiceLevelAgreements::default(),
1119 }
1120 }
1121}
1122
1123impl Default for EarlyTerminationFees {
1124 fn default() -> Self {
1125 Self {
1126 fee_structure: FeeStructure::NoFee,
1127 calculation_method: FeeCalculationMethod::RemainingMonths,
1128 waiver_conditions: vec![],
1129 }
1130 }
1131}
1132
1133impl Default for ServiceLevelAgreements {
1134 fn default() -> Self {
1135 Self {
1136 uptime: 0.99,
1137 performance: HashMap::new(),
1138 support: SupportSLA::default(),
1139 penalties: SLAPenalties::default(),
1140 }
1141 }
1142}
1143
1144impl Default for CreditApplication {
1145 fn default() -> Self {
1146 Self {
1147 method: CreditApplicationMethod::Manual,
1148 processing_time: Duration::from_secs(86400 * 7), verification_required: true,
1150 }
1151 }
1152}
1153
1154impl Default for MaxPenalties {
1155 fn default() -> Self {
1156 Self {
1157 monthly_max: Some(0.1), annual_max: Some(0.05), per_incident_max: None,
1160 }
1161 }
1162}
1163
1164impl Default for DynamicPricingConfig {
1165 fn default() -> Self {
1166 Self {
1167 enabled: false,
1168 algorithms: vec![],
1169 update_frequency: Duration::from_secs(3600), price_bounds: PriceBounds::default(),
1171 }
1172 }
1173}
1174
1175impl Default for PriceBounds {
1176 fn default() -> Self {
1177 Self {
1178 min_price: 0.01,
1179 max_price: 10.0,
1180 change_limits: PriceChangeLimits::default(),
1181 }
1182 }
1183}
1184
1185impl Default for PriceChangeLimits {
1186 fn default() -> Self {
1187 Self {
1188 max_increase_percent: 0.1, max_decrease_percent: 0.1, change_frequency: Duration::from_secs(3600), }
1192 }
1193}
1194
1195impl Default for CostPredictionConfig {
1196 fn default() -> Self {
1197 Self {
1198 enable_prediction: true,
1199 prediction_algorithms: vec!["linear_regression".to_string()],
1200 prediction_horizon: 86400 * 30, models: vec![CostPredictionModel::LinearRegression],
1202 forecasting: ForecastingConfig::default(),
1203 accuracy_monitoring: AccuracyMonitoringConfig::default(),
1204 }
1205 }
1206}
1207
1208impl Default for ForecastingConfig {
1209 fn default() -> Self {
1210 Self {
1211 horizons: vec![],
1212 confidence_intervals: vec![0.95],
1213 scenario_analysis: ScenarioAnalysisConfig::default(),
1214 }
1215 }
1216}
1217
1218impl Default for AccuracyMonitoringConfig {
1219 fn default() -> Self {
1220 Self {
1221 enabled: true,
1222 metrics: vec![AccuracyMetric::MAPE],
1223 threshold_alerts: vec![],
1224 retraining: ModelRetrainingConfig::default(),
1225 }
1226 }
1227}
1228
1229impl Default for ModelRetrainingConfig {
1230 fn default() -> Self {
1231 Self {
1232 auto_retrain: true,
1233 triggers: vec![RetrainingTrigger::AccuracyDrop],
1234 frequency: Duration::from_secs(86400 * 7), }
1236 }
1237}
1238
1239impl Default for BudgetConfig {
1240 fn default() -> Self {
1241 Self {
1242 daily_budget: None,
1243 monthly_budget: Some(1000.0),
1244 auto_scaling_budget: false,
1245 budget_alerts: vec![],
1246 allocation: BudgetAllocation::default(),
1247 tracking: BudgetTrackingConfig::default(),
1248 enforcement: BudgetEnforcementConfig::default(),
1249 }
1250 }
1251}
1252
1253impl Default for BudgetAllocation {
1254 fn default() -> Self {
1255 Self {
1256 departments: HashMap::new(),
1257 projects: HashMap::new(),
1258 providers: HashMap::new(),
1259 reserve_percentage: 0.1, }
1261 }
1262}
1263
1264impl Default for BudgetTrackingConfig {
1265 fn default() -> Self {
1266 Self {
1267 frequency: Duration::from_secs(3600), variance_analysis: VarianceAnalysisConfig::default(),
1269 trend_analysis: TrendAnalysisConfig::default(),
1270 }
1271 }
1272}
1273
1274impl Default for VarianceAnalysisConfig {
1275 fn default() -> Self {
1276 Self {
1277 enabled: true,
1278 thresholds: VarianceThresholds::default(),
1279 root_cause_analysis: false,
1280 }
1281 }
1282}
1283
1284impl Default for VarianceThresholds {
1285 fn default() -> Self {
1286 Self {
1287 warning_threshold: 0.1, critical_threshold: 0.2, is_percentage: true,
1290 }
1291 }
1292}
1293
1294impl Default for TrendAnalysisConfig {
1295 fn default() -> Self {
1296 Self {
1297 enabled: true,
1298 analysis_window: Duration::from_secs(86400 * 30), detection_methods: vec![TrendDetectionMethod::MovingAverage],
1300 }
1301 }
1302}
1303
1304impl Default for BudgetEnforcementConfig {
1305 fn default() -> Self {
1306 Self {
1307 policy: EnforcementPolicy::SoftLimit,
1308 actions: vec![EnforcementAction::Alert],
1309 override_permissions: OverridePermissions::default(),
1310 }
1311 }
1312}
1313
1314impl Default for ApprovalWorkflow {
1315 fn default() -> Self {
1316 Self {
1317 required_approvers: 1,
1318 levels: vec![],
1319 timeout: Duration::from_secs(86400), }
1321 }
1322}
1323
1324impl Default for OverrideLimits {
1325 fn default() -> Self {
1326 Self {
1327 max_override_percent: 0.2, frequency_limits: FrequencyLimits::default(),
1329 justification_required: true,
1330 }
1331 }
1332}
1333
1334impl Default for FrequencyLimits {
1335 fn default() -> Self {
1336 Self {
1337 per_day: 3,
1338 per_week: 10,
1339 per_month: 20,
1340 }
1341 }
1342}
1343
1344impl Default for CostAlertingConfig {
1345 fn default() -> Self {
1346 Self {
1347 enable_alerts: true,
1348 alert_thresholds: vec![0.8, 0.9, 1.0], notification_channels: vec!["email".to_string()],
1350 rules: vec![],
1351 escalation_policies: vec![],
1352 suppression_rules: vec![],
1353 }
1354 }
1355}
1356
1357impl Default for FinancialReportingConfig {
1358 fn default() -> Self {
1359 Self {
1360 enabled: true,
1361 report_types: vec![ReportType::CostSummary, ReportType::BudgetVariance],
1362 frequency: ReportFrequency::Monthly,
1363 delivery: ReportDeliveryConfig::default(),
1364 }
1365 }
1366}
1367
1368impl Default for ReportDeliveryConfig {
1369 fn default() -> Self {
1370 Self {
1371 methods: vec![DeliveryMethod::Email],
1372 recipients: vec![],
1373 formats: vec![ReportFormat::PDF],
1374 }
1375 }
1376}
1377
1378impl Default for CostAllocationConfig {
1379 fn default() -> Self {
1380 Self {
1381 methods: vec![AllocationMethod::UsageBasedAllocation],
1382 rules: vec![],
1383 chargeback: ChargebackConfig::default(),
1384 }
1385 }
1386}
1387
1388impl Default for ChargebackConfig {
1389 fn default() -> Self {
1390 Self {
1391 enabled: false,
1392 model: ChargebackModel::Showback,
1393 billing_cycle: BillingCycle::Monthly,
1394 rate_cards: vec![],
1395 }
1396 }
1397}