datasynth_core/models/sourcing/qualification.rs
1//! Supplier qualification models for vendor evaluation and certification.
2
3use chrono::NaiveDate;
4use serde::{Deserialize, Serialize};
5
6/// Status of supplier qualification.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
8#[serde(rename_all = "snake_case")]
9pub enum QualificationStatus {
10 /// Qualification not started
11 #[default]
12 Pending,
13 /// Qualification in progress
14 InProgress,
15 /// Supplier qualified (passed)
16 Qualified,
17 /// Conditionally qualified (with restrictions)
18 ConditionallyQualified,
19 /// Supplier disqualified (failed)
20 Disqualified,
21 /// Qualification expired
22 Expired,
23}
24
25/// A criterion used for qualification scoring.
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct QualificationCriterion {
28 /// Criterion name (e.g., "Financial Stability", "Quality Management")
29 pub name: String,
30 /// Weight in total score (0.0 to 1.0)
31 pub weight: f64,
32 /// Minimum passing score (0.0 to 100.0)
33 pub min_score: f64,
34 /// Whether this criterion is mandatory (failing = disqualified)
35 pub is_mandatory: bool,
36}
37
38/// Score for a single qualification criterion.
39#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct QualificationScore {
41 /// Criterion name
42 pub criterion_name: String,
43 /// Score achieved (0.0 to 100.0)
44 pub score: f64,
45 /// Whether the criterion was passed
46 pub passed: bool,
47 /// Evaluator comments
48 pub comments: Option<String>,
49}
50
51/// A supplier certification record.
52#[derive(Debug, Clone, Serialize, Deserialize)]
53pub struct SupplierCertification {
54 /// Certification ID
55 pub certification_id: String,
56 /// Vendor ID
57 pub vendor_id: String,
58 /// Certification type (e.g., "ISO 9001", "ISO 14001", "SOC 2")
59 pub certification_type: String,
60 /// Issuing body
61 pub issuing_body: String,
62 /// Issue date
63 pub issue_date: NaiveDate,
64 /// Expiry date
65 pub expiry_date: NaiveDate,
66 /// Is the certification currently valid
67 pub is_valid: bool,
68}
69
70/// Supplier qualification record.
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct SupplierQualification {
73 /// Unique qualification ID
74 pub qualification_id: String,
75 /// Vendor ID being qualified
76 pub vendor_id: String,
77 /// Sourcing project ID (if applicable)
78 pub sourcing_project_id: Option<String>,
79 /// Company code
80 pub company_code: String,
81 /// Qualification status
82 pub status: QualificationStatus,
83 /// Qualification start date
84 pub start_date: NaiveDate,
85 /// Qualification completion date
86 pub completion_date: Option<NaiveDate>,
87 /// Validity period end date
88 pub valid_until: Option<NaiveDate>,
89 /// Individual criterion scores
90 pub scores: Vec<QualificationScore>,
91 /// Overall weighted score
92 pub overall_score: f64,
93 /// Evaluator ID
94 pub evaluator_id: String,
95 /// Certifications provided
96 pub certifications: Vec<String>,
97 /// Conditions or restrictions (if conditionally qualified)
98 pub conditions: Option<String>,
99}