1use chrono::NaiveDate;
7use rust_decimal::Decimal;
8use serde::{Deserialize, Serialize};
9use smallvec::SmallVec;
10use std::collections::HashMap;
11
12use super::graph_properties::{GraphPropertyValue, ToNodeProperties};
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
16#[serde(rename_all = "snake_case")]
17pub enum InspectionResult {
18 #[default]
20 Accepted,
21 Rejected,
23 Conditionally,
25 Pending,
27}
28
29#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
31#[serde(rename_all = "snake_case")]
32pub enum InspectionType {
33 #[default]
35 Incoming,
36 InProcess,
38 Final,
40 Random,
42 Periodic,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct QualityInspection {
49 pub inspection_id: String,
51 pub company_code: String,
53 pub reference_type: String,
55 pub reference_id: String,
57 pub material_id: String,
59 pub material_description: String,
61 pub inspection_type: InspectionType,
63 pub inspection_date: NaiveDate,
65 pub inspector_id: Option<String>,
67 #[serde(with = "rust_decimal::serde::str")]
69 pub lot_size: Decimal,
70 #[serde(with = "rust_decimal::serde::str")]
72 pub sample_size: Decimal,
73 pub defect_count: u32,
75 pub defect_rate: f64,
77 pub result: InspectionResult,
79 pub characteristics: SmallVec<[InspectionCharacteristic; 4]>,
81 pub disposition: Option<String>,
83 pub notes: Option<String>,
85}
86
87impl ToNodeProperties for QualityInspection {
88 fn node_type_name(&self) -> &'static str {
89 "quality_inspection"
90 }
91 fn node_type_code(&self) -> u16 {
92 341
93 }
94 fn to_node_properties(&self) -> HashMap<String, GraphPropertyValue> {
95 let mut p = HashMap::new();
96 p.insert(
97 "inspectionId".into(),
98 GraphPropertyValue::String(self.inspection_id.clone()),
99 );
100 p.insert(
101 "entityCode".into(),
102 GraphPropertyValue::String(self.company_code.clone()),
103 );
104 p.insert(
105 "referenceType".into(),
106 GraphPropertyValue::String(self.reference_type.clone()),
107 );
108 p.insert(
109 "referenceId".into(),
110 GraphPropertyValue::String(self.reference_id.clone()),
111 );
112 p.insert(
113 "materialId".into(),
114 GraphPropertyValue::String(self.material_id.clone()),
115 );
116 p.insert(
117 "materialDescription".into(),
118 GraphPropertyValue::String(self.material_description.clone()),
119 );
120 p.insert(
121 "inspectionType".into(),
122 GraphPropertyValue::String(format!("{:?}", self.inspection_type)),
123 );
124 p.insert(
125 "inspectionDate".into(),
126 GraphPropertyValue::Date(self.inspection_date),
127 );
128 p.insert("lotSize".into(), GraphPropertyValue::Decimal(self.lot_size));
129 p.insert(
130 "inspectedQuantity".into(),
131 GraphPropertyValue::Decimal(self.sample_size),
132 );
133 p.insert(
134 "defectQuantity".into(),
135 GraphPropertyValue::Int(self.defect_count as i64),
136 );
137 p.insert(
138 "defectRate".into(),
139 GraphPropertyValue::Float(self.defect_rate),
140 );
141 p.insert(
142 "result".into(),
143 GraphPropertyValue::String(format!("{:?}", self.result)),
144 );
145 p.insert(
146 "isPassed".into(),
147 GraphPropertyValue::Bool(matches!(
148 self.result,
149 InspectionResult::Accepted | InspectionResult::Conditionally
150 )),
151 );
152 p
153 }
154}
155
156#[derive(Debug, Clone, Serialize, Deserialize)]
158pub struct InspectionCharacteristic {
159 pub name: String,
161 pub target_value: f64,
163 pub actual_value: f64,
165 pub lower_limit: f64,
167 pub upper_limit: f64,
169 pub passed: bool,
171}