use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::super::graph_properties::{GraphPropertyValue, ToNodeProperties};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum QualificationStatus {
#[default]
Pending,
InProgress,
Qualified,
ConditionallyQualified,
Disqualified,
Expired,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QualificationCriterion {
pub name: String,
pub weight: f64,
pub min_score: f64,
pub is_mandatory: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QualificationScore {
pub criterion_name: String,
pub score: f64,
pub passed: bool,
pub comments: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SupplierCertification {
pub certification_id: String,
pub vendor_id: String,
pub certification_type: String,
pub issuing_body: String,
pub issue_date: NaiveDate,
pub expiry_date: NaiveDate,
pub is_valid: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SupplierQualification {
pub qualification_id: String,
pub vendor_id: String,
pub sourcing_project_id: Option<String>,
pub company_code: String,
pub status: QualificationStatus,
pub start_date: NaiveDate,
pub completion_date: Option<NaiveDate>,
pub valid_until: Option<NaiveDate>,
pub scores: Vec<QualificationScore>,
pub overall_score: f64,
pub evaluator_id: String,
pub certifications: Vec<String>,
pub conditions: Option<String>,
}
impl ToNodeProperties for SupplierQualification {
fn node_type_name(&self) -> &'static str {
"supplier_qualification"
}
fn node_type_code(&self) -> u16 {
325
}
fn to_node_properties(&self) -> HashMap<String, GraphPropertyValue> {
let mut p = HashMap::new();
p.insert(
"qualificationId".into(),
GraphPropertyValue::String(self.qualification_id.clone()),
);
p.insert(
"vendorId".into(),
GraphPropertyValue::String(self.vendor_id.clone()),
);
p.insert(
"entityCode".into(),
GraphPropertyValue::String(self.company_code.clone()),
);
p.insert(
"status".into(),
GraphPropertyValue::String(format!("{:?}", self.status)),
);
p.insert(
"startDate".into(),
GraphPropertyValue::Date(self.start_date),
);
p.insert(
"overallScore".into(),
GraphPropertyValue::Float(self.overall_score),
);
p.insert(
"criterionCount".into(),
GraphPropertyValue::Int(self.scores.len() as i64),
);
p.insert(
"certificationCount".into(),
GraphPropertyValue::Int(self.certifications.len() as i64),
);
p.insert(
"isQualified".into(),
GraphPropertyValue::Bool(matches!(
self.status,
QualificationStatus::Qualified | QualificationStatus::ConditionallyQualified
)),
);
p
}
}