use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ScoreboardTrend {
Improving,
Stable,
Declining,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ScorecardRecommendation {
Maintain,
Expand,
Probation,
Replace,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContractComplianceMetrics {
pub contract_id: String,
pub utilization_pct: f64,
pub sla_breach_count: u32,
pub price_compliance_pct: f64,
pub amendment_count: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SupplierScorecard {
pub scorecard_id: String,
pub vendor_id: String,
pub company_code: String,
pub period_start: NaiveDate,
pub period_end: NaiveDate,
pub on_time_delivery_rate: f64,
pub quality_rate: f64,
pub price_score: f64,
pub responsiveness_score: f64,
pub overall_score: f64,
pub grade: String,
pub trend: ScoreboardTrend,
pub contract_compliance: Vec<ContractComplianceMetrics>,
pub recommendation: ScorecardRecommendation,
pub reviewer_id: String,
pub comments: Option<String>,
}