//! 司法辖区定义和会计准则 use serde::{Deserialize, Serialize}; use std::collections::HashMap; /// 司法辖区枚举 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum Jurisdiction { /// 美国辖区 US, /// 欧盟辖区 EU, /// 中国辖区 CN, /// 香港辖区 HK, /// 新加坡辖区 SG, /// 英国辖区 UK, /// 日本辖区 JP, /// 中东辖区 (伊斯兰金融体系) ME, } /// 会计准则 #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum AccountingStandard { /// 美国公认会计原则 USGAAP, /// 国际财务报告准则 IFRS, /// 中国企业会计准则 CAS, /// 日本公认会计原则 JGAAP, /// 伊斯兰金融机构会计与审计组织准则 AAOIFI, } /// 法系类型 #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum LegalSystem { /// 普通法系 CommonLaw, /// 大陆法系 CivilLaw, /// 社会主义法系 SocialistLaw, /// 混合法系 MixedLaw, /// 伊斯兰法系 ShariaLaw, } /// 辖区详细信息 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct JurisdictionInfo { /// 辖区代码 pub code: Jurisdiction, /// 法系类型 pub legal_system: LegalSystem, /// 会计准则 pub accounting_standard: AccountingStandard, /// 企业所得税率 (0-1) pub corporate_tax_rate: f64, /// 资本利得税率 (0-1) pub capital_gains_tax_rate: f64, /// 增值税率 (0-1) pub vat_rate: f64, /// 监管成本率 (0-1) pub regulatory_cost_rate: f64, /// 基础流动性折扣 (0-1) pub base_liquidity_discount: f64, } impl Jurisdiction { /// 获取辖区详细信息 pub fn info(self) -> JurisdictionInfo { match self { Jurisdiction::US => JurisdictionInfo { code: Jurisdiction::US, legal_system: LegalSystem::CommonLaw, accounting_standard: AccountingStandard::USGAAP, corporate_tax_rate: 0.21, capital_gains_tax_rate: 0.20, vat_rate: 0.0, regulatory_cost_rate: 0.02, base_liquidity_discount: 0.075, }, Jurisdiction::EU => JurisdictionInfo { code: Jurisdiction::EU, legal_system: LegalSystem::CivilLaw, accounting_standard: AccountingStandard::IFRS, corporate_tax_rate: 0.21, capital_gains_tax_rate: 0.25, vat_rate: 0.20, regulatory_cost_rate: 0.03, base_liquidity_discount: 0.125, }, Jurisdiction::CN => JurisdictionInfo { code: Jurisdiction::CN, legal_system: LegalSystem::SocialistLaw, accounting_standard: AccountingStandard::CAS, corporate_tax_rate: 0.25, capital_gains_tax_rate: 0.20, vat_rate: 0.13, regulatory_cost_rate: 0.04, base_liquidity_discount: 0.20, }, Jurisdiction::HK => JurisdictionInfo { code: Jurisdiction::HK, legal_system: LegalSystem::CommonLaw, accounting_standard: AccountingStandard::IFRS, corporate_tax_rate: 0.165, capital_gains_tax_rate: 0.0, vat_rate: 0.0, regulatory_cost_rate: 0.01, base_liquidity_discount: 0.075, }, Jurisdiction::SG => JurisdictionInfo { code: Jurisdiction::SG, legal_system: LegalSystem::CommonLaw, accounting_standard: AccountingStandard::IFRS, corporate_tax_rate: 0.17, capital_gains_tax_rate: 0.0, vat_rate: 0.07, regulatory_cost_rate: 0.01, base_liquidity_discount: 0.075, }, Jurisdiction::UK => JurisdictionInfo { code: Jurisdiction::UK, legal_system: LegalSystem::CommonLaw, accounting_standard: AccountingStandard::IFRS, corporate_tax_rate: 0.25, capital_gains_tax_rate: 0.20, vat_rate: 0.20, regulatory_cost_rate: 0.02, base_liquidity_discount: 0.125, }, Jurisdiction::JP => JurisdictionInfo { code: Jurisdiction::JP, legal_system: LegalSystem::MixedLaw, accounting_standard: AccountingStandard::JGAAP, corporate_tax_rate: 0.232, capital_gains_tax_rate: 0.20, vat_rate: 0.10, regulatory_cost_rate: 0.03, base_liquidity_discount: 0.175, }, Jurisdiction::ME => JurisdictionInfo { code: Jurisdiction::ME, legal_system: LegalSystem::ShariaLaw, accounting_standard: AccountingStandard::AAOIFI, corporate_tax_rate: 0.025, // Zakat capital_gains_tax_rate: 0.0, vat_rate: 0.05, regulatory_cost_rate: 0.02, base_liquidity_discount: 0.25, }, } } /// 计算辖区调整系数 pub fn adjustment_factor(self) -> f64 { let info = self.info(); (1.0 - info.corporate_tax_rate) * (1.0 - info.regulatory_cost_rate) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_jurisdiction_info() { let us_info = Jurisdiction::US.info(); assert_eq!(us_info.accounting_standard, AccountingStandard::USGAAP); assert_eq!(us_info.legal_system, LegalSystem::CommonLaw); let me_info = Jurisdiction::ME.info(); assert_eq!(me_info.accounting_standard, AccountingStandard::AAOIFI); assert_eq!(me_info.legal_system, LegalSystem::ShariaLaw); } #[test] fn test_adjustment_factor() { let us_factor = Jurisdiction::US.adjustment_factor(); assert!(us_factor > 0.7 && us_factor < 0.8); let hk_factor = Jurisdiction::HK.adjustment_factor(); assert!(hk_factor > 0.8 && hk_factor < 0.9); } }