1use chrono::{DateTime, NaiveDate, Utc};
2use currency_4217::Money;
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
9pub struct OrderRequest {
10 pub header: OrderRequestHeader,
15 pub items: Vec<ItemOut>,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
23pub struct OrderRequestHeader {
24 pub order_id: String,
26 pub order_date: DateTime<Utc>,
28 pub order_type: OrderType,
30 pub total: Money,
32 pub ship_to: Address,
34 pub bill_to: Address,
36 pub shipping: Option<Money>,
38 pub tax: Option<Money>,
40 pub comments: Option<String>,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
46pub struct ItemOut {
47 pub line_number: u32,
49 pub quantity: u32,
51 pub requested_delivery_date: Option<NaiveDate>,
53 pub item: Item,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
59pub struct Item {
60 pub item_id: ItemID,
62 pub detail: ItemDetail,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
68pub struct ItemID {
69 pub buyer_part_id: Option<String>,
73 pub supplier_part_id: String,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
79pub struct ItemDetail {
80 pub unit_price: Option<Money>,
82
83 pub description: String,
85
86 pub unit_of_measure: Option<UnitOfMeasure>,
88
89 pub classification: Option<Classification>,
90 pub manufacturer: Option<ManufacturerInfo>,
91 pub extrinsic: Option<HashMap<String, String>>,
92
93 pub unit_rate: Option<UnitRate>,
95
96 pub spend_detail: Option<SpendDetail>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
102pub struct Address {
103 pub name: String,
105 pub street: Vec<String>,
107 pub city: String,
109 pub postal_code: String,
111 pub country_iso: String,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
117pub struct ManufacturerInfo {
118 pub part_id: String,
119 pub name: String,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
124pub struct Classification {
125 pub domain: ClassificationDomain,
126 pub code: String,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
130pub enum ClassificationDomain {
131 UNSPSC,
132 ECLASS,
133 Custom(String),
134}
135
136#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
138pub enum OrderType {
139 New,
140 Update,
141 Delete,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
146pub struct UnitRate {
147 pub rate: Money,
149 pub unit_of_measure: UnitOfMeasure,
151 pub price_basis_quantity: Option<PriceBasisQuantity>,
153 pub term_reference: Option<TermReference>,
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
159pub struct PriceBasisQuantity {
160 pub quantity: u32,
161 pub unit_of_measure: UnitOfMeasure,
162}
163
164#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
166pub struct TermReference {
167 pub term_name: String,
168 pub term: String,
169}
170
171#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
173pub struct Period {
174 pub start_date: DateTime<Utc>,
175 pub end_date: DateTime<Utc>,
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
180pub struct SpendDetail {
181 pub travel_detail: Option<TravelDetail>,
182 pub fee_detail: Option<FeeDetail>,
183 pub labor_detail: Option<LaborDetail>,
184 pub extrinsic: Option<HashMap<String, String>>,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
189pub struct LaborDetail {
190 pub supplier_reference_code: Option<String>,
192 pub unit_rate: Option<UnitRate>,
194 pub period: Option<Period>,
196 pub contractor: Option<Contractor>,
198 pub job_description: Option<String>,
200 pub supervisor: Option<ContactInfo>,
202 pub work_location: Option<Address>,
204 pub extrinsic: Option<HashMap<String, String>>,
206}
207
208#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
210pub struct FeeDetail {
211 pub amount: Money,
212 pub description: Option<String>,
213 pub extrinsic: Option<HashMap<String, String>>,
214}
215
216#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
218pub struct TravelDetail {
219 pub amount: Option<Money>,
220 pub description: Option<String>,
221 pub period: Option<Period>,
222 pub extrinsic: Option<HashMap<String, String>>,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
227pub struct Contractor {
228 pub identifier: Option<ContractorIdentifier>,
229 pub contact: Option<ContactInfo>,
230}
231
232#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
234pub struct ContractorIdentifier {
235 pub domain: ContractorIdentifierDomain,
236 pub value: String,
237}
238
239#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
240pub enum ContractorIdentifierDomain {
241 BuyerReferenceID,
243 SupplierReferenceID,
245 Custom(String),
247}
248
249#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
251pub struct ContactInfo {
252 pub name: String,
253 pub email: Option<String>,
254 pub phone: Option<String>,
255 pub address: Option<Address>,
256}
257
258#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
260pub enum UnitOfMeasure {
261 EA,
263 KG,
265 LTR,
267 MTR,
269 HUR,
271 DAY,
273 MON,
275 Custom(String),
277}
278
279#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
281pub struct TransportationRequest {
282 pub request_id: String,
284
285 pub status: TransportStatus,
287
288 pub mode: TransportMode,
290 pub service_level: Option<String>,
291
292 pub equipment: Option<Equipment>,
294
295 pub consignor: Address,
297 pub consignee: Address,
299
300 pub stops: Vec<LegStop>,
302
303 pub cargo: CargoSummary,
305
306 pub pickup: StepTiming,
308 pub delivery: StepTiming,
309
310 pub accessorials: Vec<Accessorial>,
312
313 pub references: HashMap<String, String>,
315
316 pub rate: Option<UnitRate>,
318
319 pub events: Vec<TransportEvent>,
321}
322
323#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
325pub enum TransportStatus {
326 Draft, RfqSent, Awarded, Booked, InTransit, Completed, Cancelled,
333}
334
335#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
337pub enum TransportMode {
338 Road,
339 Air,
340 Ocean,
341 Rail,
342 Multimodal,
343}
344
345#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
347pub struct StepTiming {
348 pub requested: Option<TimeWindow>,
350 pub planned: Option<TimeWindow>,
352 pub estimated: Option<DateTime<Utc>>,
354 pub actual: Option<DateTime<Utc>>,
356}
357
358#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
360pub struct TimeWindow {
361 pub earliest_utc: DateTime<Utc>,
362 pub latest_utc: DateTime<Utc>,
363}
364
365#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
367pub struct LegStop {
368 pub sequence: u32,
369 pub location: Address,
370 pub arrival: Option<StepTiming>,
372 pub departure: Option<StepTiming>,
374 pub notes: Option<String>,
376}
377
378#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
380pub struct CargoSummary {
381 pub pieces: u32,
383 pub gross_weight_kg: f32,
385 pub volume_m3: Option<f32>,
387 pub dangerous_goods: bool,
389 pub commodity_description: Option<String>,
391 pub codes: Option<HashMap<String, String>>,
393}
394
395#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
397pub struct Equipment {
398 pub type_code: String,
400 pub temperature_c: Option<(f32, f32)>,
402 pub extrinsic: Option<HashMap<String, String>>,
404}
405
406#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
408pub enum Accessorial {
409 TailLift,
411 InsidePickup,
412 InsideDelivery,
413 Appointment,
415 Hazardous,
417 TempControl,
419 Customs,
421 Residential,
423 Detention,
425 WhiteGlove,
427 Other(String),
429}
430
431#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
433pub struct TransportEvent {
434 pub code: TransportEventCode,
435 pub timestamp: DateTime<Utc>,
436 pub source: Option<String>,
438 pub note: Option<String>,
439}
440
441#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
443pub enum TransportEventCode {
444 PickupPlanned,
445 PickupEtaUpdated,
446 PickupActual,
447 DepartureActual,
448 ArrivalEtaUpdated,
449 ArrivalActual,
450 DeliveryPlanned,
451 DeliveryEtaUpdated,
452 DeliveryActual,
453 ProofOfDeliveryAvailable,
454 Exception,
455}