use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SanctionsScreening {
pub last_screened: NaiveDate,
pub screening_result: ScreeningResult,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub matched_list: Option<String>,
#[serde(default)]
pub match_score: f64,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub name_variations: Vec<String>,
#[serde(default)]
pub is_true_match: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum ScreeningResult {
#[default]
Clear,
PotentialMatch,
ConfirmedMatch,
FalsePositiveCleared,
}
impl ScreeningResult {
pub fn risk_weight(&self) -> f64 {
match self {
Self::Clear => 0.0,
Self::FalsePositiveCleared => 0.1,
Self::PotentialMatch => 0.7,
Self::ConfirmedMatch => 1.0,
}
}
}
pub struct SanctionsLists;
impl SanctionsLists {
pub const LISTS: &[&str] = &[
"OFAC SDN",
"OFAC Consolidated",
"EU Consolidated",
"UN Security Council",
"UK HMT",
"Australia DFAT",
"Canada OSFI",
];
}