use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::super::graph_properties::{GraphPropertyValue, ToNodeProperties};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BidEvaluationEntry {
pub criterion_name: String,
pub raw_score: f64,
pub weight: f64,
pub weighted_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RankedBid {
pub bid_id: String,
pub vendor_id: String,
pub rank: u32,
pub total_score: f64,
pub price_score: f64,
pub quality_score: f64,
#[serde(with = "crate::serde_decimal")]
pub total_amount: Decimal,
pub criterion_scores: Vec<BidEvaluationEntry>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AwardRecommendation {
Award,
Backup,
Reject,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BidEvaluation {
pub evaluation_id: String,
pub rfx_id: String,
pub company_code: String,
pub evaluator_id: String,
pub ranked_bids: Vec<RankedBid>,
pub recommendation: AwardRecommendation,
pub recommended_vendor_id: Option<String>,
pub recommended_bid_id: Option<String>,
pub notes: Option<String>,
pub is_finalized: bool,
}
impl ToNodeProperties for BidEvaluation {
fn node_type_name(&self) -> &'static str {
"bid_evaluation"
}
fn node_type_code(&self) -> u16 {
323
}
fn to_node_properties(&self) -> HashMap<String, GraphPropertyValue> {
let mut p = HashMap::new();
p.insert(
"evaluationId".into(),
GraphPropertyValue::String(self.evaluation_id.clone()),
);
p.insert(
"rfxId".into(),
GraphPropertyValue::String(self.rfx_id.clone()),
);
p.insert(
"entityCode".into(),
GraphPropertyValue::String(self.company_code.clone()),
);
p.insert(
"evaluatorId".into(),
GraphPropertyValue::String(self.evaluator_id.clone()),
);
p.insert(
"recommendation".into(),
GraphPropertyValue::String(format!("{:?}", self.recommendation)),
);
p.insert(
"bidCount".into(),
GraphPropertyValue::Int(self.ranked_bids.len() as i64),
);
if let Some(top) = self.ranked_bids.first() {
p.insert(
"topBidScore".into(),
GraphPropertyValue::Float(top.total_score),
);
p.insert(
"topBidAmount".into(),
GraphPropertyValue::Decimal(top.total_amount),
);
}
if let Some(ref vendor_id) = self.recommended_vendor_id {
p.insert(
"recommendedVendorId".into(),
GraphPropertyValue::String(vendor_id.clone()),
);
}
p.insert(
"isFinalized".into(),
GraphPropertyValue::Bool(self.is_finalized),
);
p
}
}