use super::{work_order_item::WorkOrderItem, MOD_PATH};
use crate::common::{note::Note, related_party::RelatedParty, tmf_error::TMFError};
use crate::tmf646::appointment::AppointmentRef;
use crate::{vec_insert, HasId, HasNote, HasRelatedParty, Uri};
use serde::{Deserialize, Serialize};
use tmflib_derive::{HasId, HasNote, HasRelatedParty};
const CLASS_PATH: &str = "workorder";
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub enum WorkOrderStateType {
#[default]
Acknowledged,
Rejected,
Pending,
Held,
InProgress,
Cancelled,
Completed,
Failed,
Partial,
AccessingCancellation,
PendingCancellation,
}
#[derive(Clone, Debug, Default, Deserialize, HasId, HasNote, HasRelatedParty, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkOrder {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "@type")]
r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "@baseType")]
base_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "@schemaLocation")]
schema_location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<Uri>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<WorkOrderStateType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub appointment: Option<AppointmentRef>,
pub work_order_item: Option<Vec<WorkOrderItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<Vec<Note>>,
#[serde(skip_serializing_if = "Option::is_none")]
related_party: Option<Vec<RelatedParty>>,
}
impl WorkOrder {
pub fn new() -> WorkOrder {
WorkOrder {
state: Some(WorkOrderStateType::default()),
r#type: Some(WorkOrder::get_class()),
base_type: Some(WorkOrder::get_class()),
..WorkOrder::create()
}
}
pub fn add_item(&mut self, item: WorkOrderItem) {
vec_insert(&mut self.work_order_item, item);
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::tmf697::v4::work::{Work, WorkRefOrValue};
const WORK_NAME: &str = "WorkName";
#[test]
fn test_work_order_new() {
let wo = WorkOrder::new();
assert_eq!(wo.state.is_some(), true);
assert_eq!(wo.state.unwrap(), WorkOrderStateType::default());
}
#[test]
fn test_work_order_add_item() {
let item1 = WorkOrderItem::with(WorkRefOrValue::from(Work::new(WORK_NAME)));
let mut wo = WorkOrder::new();
wo.add_item(item1);
assert_eq!(wo.work_order_item.is_some(), true);
let item2 = WorkOrderItem::with(WorkRefOrValue::from(Work::new(WORK_NAME)));
wo.add_item(item2);
assert_eq!(wo.work_order_item.unwrap().len(), 2);
}
}