use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetManagementConfig {
pub global_budget: GlobalBudgetConfig,
pub department_budgets: HashMap<String, DepartmentBudgetConfig>,
pub project_budgets: HashMap<String, ProjectBudgetConfig>,
pub monitoring: BudgetMonitoringConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GlobalBudgetConfig {
pub total_budget: f64,
pub period: BudgetPeriod,
pub currency: String,
pub rollover_policy: RolloverPolicy,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum BudgetPeriod {
Monthly,
Quarterly,
Annual,
Custom(Duration),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum RolloverPolicy {
NoRollover,
FullRollover,
PartialRollover(f64),
ConditionalRollover,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DepartmentBudgetConfig {
pub name: String,
pub allocated_budget: f64,
pub spending_limits: SpendingLimits,
pub approval_workflow: BudgetApprovalWorkflow,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpendingLimits {
pub daily_limit: Option<f64>,
pub weekly_limit: Option<f64>,
pub monthly_limit: Option<f64>,
pub per_transaction_limit: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetApprovalWorkflow {
pub levels: Vec<BudgetApprovalLevel>,
pub auto_approval_thresholds: HashMap<String, f64>,
pub escalation_timeouts: HashMap<String, Duration>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetApprovalLevel {
pub name: String,
pub approvers: Vec<String>,
pub thresholds: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProjectBudgetConfig {
pub name: String,
pub budget: f64,
pub cost_tracking: ProjectCostTracking,
pub alerts: ProjectBudgetAlerts,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProjectCostTracking {
pub granularity: CostTrackingGranularity,
pub categories: Vec<CostCategory>,
pub allocation_rules: Vec<CostAllocationRule>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum CostTrackingGranularity {
Hourly,
Daily,
Weekly,
Monthly,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CostCategory {
pub name: String,
pub description: String,
pub budget_allocation: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CostAllocationRule {
pub name: String,
pub source: String,
pub target: String,
pub percentage: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProjectBudgetAlerts {
pub thresholds: Vec<f64>,
pub recipients: Vec<String>,
pub frequency: AlertFrequency,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum AlertFrequency {
Immediate,
Daily,
Weekly,
OnThreshold,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetMonitoringConfig {
pub real_time: bool,
pub reporting_frequency: ReportingFrequency,
pub variance_analysis: BudgetVarianceAnalysis,
pub forecasting: BudgetForecastingConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReportingFrequency {
RealTime,
Hourly,
Daily,
Weekly,
Monthly,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetVarianceAnalysis {
pub enabled: bool,
pub thresholds: BudgetVarianceThresholds,
pub methods: Vec<VarianceAnalysisMethod>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetVarianceThresholds {
pub warning: f64,
pub critical: f64,
pub emergency: f64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum VarianceAnalysisMethod {
AbsoluteVariance,
PercentageVariance,
TrendAnalysis,
SeasonalAnalysis,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetForecastingConfig {
pub enabled: bool,
pub models: Vec<BudgetForecastingModel>,
pub horizon: Duration,
pub update_frequency: Duration,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum BudgetForecastingModel {
LinearTrend,
ExponentialSmoothing,
ARIMA,
MachineLearning,
Custom(String),
}