use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum UnusualDimension {
Size,
Timing,
Relationship,
Frequency,
Nature,
}
impl std::fmt::Display for UnusualDimension {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::Size => "Size",
Self::Timing => "Timing",
Self::Relationship => "Relationship",
Self::Frequency => "Frequency",
Self::Nature => "Nature",
};
write!(f, "{s}")
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum UnusualSeverity {
Minor,
Moderate,
Significant,
}
impl UnusualSeverity {
pub fn from_dimension_count(n: usize) -> Self {
match n {
0 | 1 => Self::Minor,
2 => Self::Moderate,
_ => Self::Significant,
}
}
}
impl std::fmt::Display for UnusualSeverity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::Minor => "Minor",
Self::Moderate => "Moderate",
Self::Significant => "Significant",
};
write!(f, "{s}")
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UnusualItemFlag {
pub id: String,
pub entity_code: String,
pub journal_entry_id: String,
pub gl_accounts: Vec<String>,
pub dimensions: Vec<UnusualDimension>,
pub severity: UnusualSeverity,
pub description: String,
pub expected_value: Option<String>,
pub actual_value: String,
pub investigation_required: bool,
pub is_labeled_anomaly: bool,
}