use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::core::*;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct TransportationRfq {
pub request_id: String,
pub mode: TransportMode,
pub service_level: Option<String>,
pub equipment: Option<Equipment>,
pub consignor: Address,
pub consignee: Address,
pub stops: Vec<LegStop>,
pub cargo: CargoSummary,
pub requested_pickup: TimeWindow,
pub requested_delivery: TimeWindow,
pub accessorials: Vec<Accessorial>,
pub references: HashMap<String, String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct TransportationRqState {
pub request_id: String,
pub status: TransportStatus,
pub mode: TransportMode,
pub service_level: Option<String>,
pub equipment: Option<Equipment>,
pub consignor: Address,
pub consignee: Address,
pub stops: Vec<LegStop>,
pub cargo: CargoSummary,
pub pickup: StepTiming,
pub delivery: StepTiming,
pub accessorials: Vec<Accessorial>,
pub references: HashMap<String, String>,
pub rate: Option<UnitRate>,
pub events: Vec<TransportEvent>,
}
impl From<TransportationRfq> for TransportationRqState {
fn from(value: TransportationRfq) -> Self {
TransportationRqState {
request_id: value.request_id,
status: TransportStatus::RfqSent,
mode: value.mode,
service_level: value.service_level,
equipment: value.equipment,
consignor: value.consignor,
consignee: value.consignee,
stops: value.stops,
cargo: value.cargo,
pickup: StepTiming::requested(value.requested_pickup),
delivery: StepTiming::requested(value.requested_delivery),
accessorials: value.accessorials,
references: value.references,
rate: None,
events: Vec::new(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub enum TransportStatus {
Draft,
RfqSent,
BidSent,
Awarded,
Booked,
InTransit,
Completed,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Copy)]
pub enum TransportMode {
Road,
Air,
Ocean,
Rail,
Multimodal,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct StepTiming {
pub requested: Option<TimeWindow>,
pub planned: Option<TimeWindow>,
pub estimated: Option<DateTime<Utc>>,
pub actual: Option<DateTime<Utc>>,
}
impl StepTiming {
pub fn requested(tw: TimeWindow) -> Self {
StepTiming {
requested: Some(tw),
planned: None,
estimated: None,
actual: None,
}
}
pub fn set_plan(&mut self, tw: TimeWindow) {
self.planned = Some(tw);
}
pub fn set_estimate(&mut self, date: DateTime<Utc>) {
self.estimated = Some(date);
}
pub fn set_actual(&mut self, date: DateTime<Utc>) {
self.actual = Some(date);
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct TimeWindow {
pub earliest_utc: DateTime<Utc>,
pub latest_utc: DateTime<Utc>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct LegStop {
pub sequence: u32,
pub location: Address,
pub arrival: Option<StepTiming>,
pub departure: Option<StepTiming>,
pub notes: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct CargoSummary {
pub pieces: u32,
pub gross_weight_kg: f32,
pub volume_m3: Option<f32>,
pub dangerous_goods: bool,
pub commodity_description: Option<String>,
pub codes: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Equipment {
pub type_code: String,
pub temperature_c: Option<(f32, f32)>,
pub extrinsic: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub enum Accessorial {
TailLift,
InsidePickup,
InsideDelivery,
Appointment,
Hazardous,
TempControl,
Customs,
Residential,
Detention,
WhiteGlove,
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct TransportEvent {
pub code: TransportEventCode,
pub timestamp: DateTime<Utc>,
pub source: Option<String>,
pub note: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub enum TransportEventCode {
PickupPlanned,
PickupEtaUpdated,
PickupActual,
DepartureActual,
ArrivalEtaUpdated,
ArrivalActual,
DeliveryPlanned,
DeliveryEtaUpdated,
DeliveryActual,
ProofOfDeliveryAvailable,
Exception,
}