use serde::{Deserialize, Serialize};
use crate::{
common::{attachment::AttachmentRefOrValue, note::Note, related_party::RelatedParty},
vec_insert, HasAttachment, HasDescription, HasId, HasLastUpdate, HasName, HasNote,
HasRelatedParty, TMFError, Uri,
};
use super::MOD_PATH;
use tmflib_derive::{
HasAttachment, HasDescription, HasId, HasLastUpdate, HasName, HasNote, HasRelatedParty,
};
const CLASS_PATH: &str = "ProjectedCost";
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ProjectedCostItem {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(
Debug,
Default,
Clone,
HasId,
HasName,
HasAttachment,
HasDescription,
HasLastUpdate,
HasNote,
HasRelatedParty,
Serialize,
Deserialize,
)]
#[serde(rename_all = "camelCase")]
pub struct ProjectedCost {
pub id: Option<String>,
pub href: Option<Uri>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub cost_item: Option<Vec<ProjectedCostItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<Vec<Note>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_party: Option<Vec<RelatedParty>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_update: Option<crate::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachment: Option<Vec<AttachmentRefOrValue>>,
}
impl ProjectedCost {
pub fn new(name: impl Into<String>) -> Self {
Self::create_with_time().name(name.into())
}
pub fn item(mut self, item: ProjectedCostItem) -> Self {
vec_insert(&mut self.cost_item, item);
self
}
}
impl From<ProjectedCost> for super::CostRef {
fn from(cost: ProjectedCost) -> Self {
crate::tmf764::CostRef {
id: cost.get_id(),
href: cost.get_href(),
name: cost.name.clone(),
base_type: None,
referred_type: None,
schema_location: None,
r#type: Some(String::from("ProjectedCost")),
}
}
}