NAC_Blockchain/nac-ai-valuation/src/jurisdiction.rs

196 lines
6.2 KiB
Rust

//! 司法辖区定义和会计准则
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);
}
}