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 tmflib_derive::{
HasAttachment, HasDescription, HasId, HasLastUpdate, HasName, HasNote, HasRelatedParty,
};
const CLASS_PATH: &str = "ActualCost";
use super::MOD_PATH;
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub enum ActualCostItemStateType {
Incurred,
Disputed,
Verified,
#[default]
Allocated,
Cancelled,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub enum CostItemType {
OneTime,
#[default]
Recurring,
ConsumptionBased,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ActualCostItem {
#[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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cost_item_type: Option<CostItemType>,
}
impl ActualCostItem {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: Some(name.into()),
..Default::default()
}
}
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct CostRelationship {}
#[derive(
Debug,
Default,
Clone,
HasId,
HasName,
HasAttachment,
HasDescription,
HasLastUpdate,
HasNote,
HasRelatedParty,
Serialize,
Deserialize,
)]
pub struct ActualCost {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
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>,
#[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>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cost_item: Option<Vec<ActualCostItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cost_relationship: Option<Vec<CostRelationship>>,
}
impl ActualCost {
pub fn new(name: impl Into<String>) -> Self {
Self::create_with_time().name(name.into())
}
pub fn item(mut self, item: ActualCostItem) -> Self {
vec_insert(&mut self.cost_item, item);
self
}
}
impl From<ActualCost> for super::CostRef {
fn from(cost: ActualCost) -> 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("ActualCost")),
}
}
}