use chrono::NaiveDate;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentAuditor {
pub id: String,
pub firm_name: String,
pub jurisdiction: String,
pub independence_confirmed: bool,
pub competence_assessment: CompetenceLevel,
pub assigned_entities: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum CompetenceLevel {
Satisfactory,
RequiresSupervision,
Unsatisfactory,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GroupAuditPlan {
pub engagement_id: String,
#[serde(with = "crate::serde_decimal")]
pub group_materiality: Decimal,
pub component_allocations: Vec<ComponentMaterialityAllocation>,
pub aggregation_risk: GroupRiskLevel,
pub significant_components: Vec<String>,
pub consolidation_audit_procedures: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum GroupRiskLevel {
Low,
Medium,
High,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentMaterialityAllocation {
pub entity_code: String,
#[serde(with = "crate::serde_decimal")]
pub component_materiality: Decimal,
#[serde(with = "crate::serde_decimal")]
pub clearly_trivial: Decimal,
pub allocation_basis: AllocationBasis,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum AllocationBasis {
RevenueProportional,
AssetProportional,
RiskBased,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "type")]
pub enum ComponentScope {
FullScope,
SpecificScope {
account_areas: Vec<String>,
},
LimitedProcedures,
AnalyticalOnly,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentInstruction {
pub id: String,
pub component_auditor_id: String,
pub entity_code: String,
pub scope: ComponentScope,
#[serde(with = "crate::serde_decimal")]
pub materiality_allocated: Decimal,
pub reporting_deadline: NaiveDate,
pub specific_procedures: Vec<String>,
pub areas_of_focus: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentAuditorReport {
pub id: String,
pub instruction_id: String,
pub component_auditor_id: String,
pub entity_code: String,
pub misstatements_identified: Vec<Misstatement>,
pub scope_limitations: Vec<String>,
pub significant_findings: Vec<String>,
pub conclusion: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Misstatement {
pub description: String,
#[serde(with = "crate::serde_decimal")]
pub amount: Decimal,
pub classification: MisstatementType,
pub account_area: String,
pub corrected: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum MisstatementType {
Factual,
Judgmental,
Projected,
}
#[derive(Debug, Clone, Default)]
pub struct ComponentAuditSnapshot {
pub component_auditors: Vec<ComponentAuditor>,
pub group_audit_plan: Option<GroupAuditPlan>,
pub component_instructions: Vec<ComponentInstruction>,
pub component_reports: Vec<ComponentAuditorReport>,
}