pub mod account_lifecycle;
pub mod aml_detectability;
pub mod cross_layer_coherence;
pub mod device_fingerprint;
pub mod false_positive_quality;
pub mod kyc_completeness;
pub mod network_structure;
pub mod sanctions_screening;
pub mod sophistication_distribution;
pub mod velocity_quality;
pub use account_lifecycle::{
LifecycleAnalysis, LifecycleAnalyzer, LifecycleEndState, LifecycleThresholds, TransitionRecord,
};
pub use aml_detectability::{
AmlDetectabilityAnalysis, AmlDetectabilityAnalyzer, AmlTransactionData, TypologyData,
};
pub use cross_layer_coherence::{
BankTxnLinks, CrossLayerCoherenceAnalysis, CrossLayerCoherenceAnalyzer, CrossLayerThresholds,
PaymentRef,
};
pub use device_fingerprint::{
DeviceFingerprintAnalysis, DeviceFingerprintAnalyzer, DeviceFingerprintThresholds,
DeviceObservation,
};
pub use false_positive_quality::{
FalsePositiveAnalysis, FalsePositiveAnalyzer, FalsePositiveThresholds, LabelData,
};
pub use kyc_completeness::{KycCompletenessAnalysis, KycCompletenessAnalyzer, KycProfileData};
pub use network_structure::{
NetworkNodeObservation, NetworkStructureAnalysis, NetworkStructureAnalyzer,
NetworkStructureThresholds,
};
pub use sanctions_screening::{
SanctionsScreeningAnalysis, SanctionsScreeningAnalyzer, SanctionsScreeningThresholds,
ScreeningObservation,
};
pub use sophistication_distribution::{
SophisticationAnalysis, SophisticationAnalyzer, SophisticationObservation,
SophisticationThresholds,
};
pub use velocity_quality::{
VelocityFeaturesData, VelocityQualityAnalysis, VelocityQualityAnalyzer,
VelocityQualityThresholds,
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BankingEvaluation {
pub kyc: Option<KycCompletenessAnalysis>,
pub aml: Option<AmlDetectabilityAnalysis>,
#[serde(default)]
pub cross_layer: Option<CrossLayerCoherenceAnalysis>,
#[serde(default)]
pub velocity: Option<VelocityQualityAnalysis>,
#[serde(default)]
pub false_positive: Option<FalsePositiveAnalysis>,
pub passes: bool,
pub issues: Vec<String>,
}
impl BankingEvaluation {
pub fn new() -> Self {
Self {
kyc: None,
aml: None,
cross_layer: None,
velocity: None,
false_positive: None,
passes: true,
issues: Vec::new(),
}
}
pub fn check_thresholds(&mut self) {
self.issues.clear();
if let Some(ref kyc) = self.kyc {
if !kyc.passes {
self.issues.extend(kyc.issues.clone());
}
}
if let Some(ref aml) = self.aml {
if !aml.passes {
self.issues.extend(aml.issues.clone());
}
}
if let Some(ref cl) = self.cross_layer {
if !cl.passes {
self.issues.extend(cl.issues.clone());
}
}
if let Some(ref v) = self.velocity {
if !v.passes {
self.issues.extend(v.issues.clone());
}
}
if let Some(ref fp) = self.false_positive {
if !fp.passes {
self.issues.extend(fp.issues.clone());
}
}
self.passes = self.issues.is_empty();
}
}
impl Default for BankingEvaluation {
fn default() -> Self {
Self::new()
}
}