use serde::{Deserialize, Serialize};
use super::service_order_item::ServiceOrderItem;
use super::MOD_PATH;
use crate::common::note::Note;
use crate::common::related_party::RelatedParty;
use crate::common::tmf_error::TMFError;
use crate::{DateTime, HasDescription, HasId, HasNote, HasRelatedParty};
use tmflib_derive::{HasDescription, HasId, HasNote, HasRelatedParty};
const CLASS_PATH: &str = "serviceOrder";
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub enum ServiceOrderStateType {
#[default]
Acknowledged,
Rejected,
Pending,
Held,
InProgress,
Cancelled,
Completed,
Failed,
Partial,
AccessingCancellation,
PendingCancellation,
}
#[derive(
Clone, Debug, Default, Deserialize, HasId, HasNote, HasRelatedParty, HasDescription, Serialize,
)]
#[serde(rename_all = "camelCase")]
pub struct ServiceOrder {
pub cancellation_date: Option<DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cancellation_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub category: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_date: Option<DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expected_completion_date: Option<DateTime>,
pub external_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notification_contact: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_date: Option<DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requested_completion_date: Option<DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requested_start_date: Option<DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_date: Option<DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<ServiceOrderStateType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<Vec<Note>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_order_item: Option<Vec<ServiceOrderItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_party: Option<Vec<RelatedParty>>,
}
impl ServiceOrder {
pub fn new() -> ServiceOrder {
let mut so = ServiceOrder::create();
so.note = Some(vec![]);
so.related_party = Some(vec![]);
so
}
pub fn add_item(&mut self, item: ServiceOrderItem) {
match self.service_order_item.as_mut() {
Some(v) => v.push(item),
None => self.service_order_item = Some(vec![item]),
}
}
}
#[cfg(test)]
mod test {
use super::*;
const SERVICEORDERSTATE_JSON: &str = "\"Acknowledged\"";
const SERVICEORDER_JSON: &str = "{
\"description\" : \"Description\"
}";
const NOTE_TEXT: &str = "A Note";
#[test]
fn test_serviceorderstate_deserialize() {
let serviceorderstate: ServiceOrderStateType =
serde_json::from_str(SERVICEORDERSTATE_JSON).unwrap();
assert_eq!(serviceorderstate, ServiceOrderStateType::Acknowledged);
}
#[test]
fn test_serviceorder_deserialize() {
let serviceorder: ServiceOrder = serde_json::from_str(SERVICEORDER_JSON).unwrap();
assert_eq!(serviceorder.description.is_some(), true);
assert_eq!(serviceorder.description.unwrap().as_str(), "Description");
}
#[test]
fn test_serviceorder_hasnote() {
let mut serviceorder = ServiceOrder::new();
let note1 = Note::new(NOTE_TEXT);
let note2 = Note::new(NOTE_TEXT);
serviceorder.add_note(note1);
serviceorder.add_note(note2);
assert_eq!(serviceorder.note.is_some(), true);
assert_eq!(serviceorder.note.unwrap().len(), 2);
}
}