j-law-ruby 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +9 -0
- data/README.md +109 -0
- data/Rakefile +87 -0
- data/ext/j_law_ruby/extconf.rb +34 -0
- data/lib/j_law_ruby/build_support.rb +129 -0
- data/lib/j_law_ruby/c_ffi.rb +662 -0
- data/lib/j_law_ruby.rb +532 -0
- data/rake_support/vendor_rust.rb +51 -0
- data/test/test_c_ffi_adapter.rb +46 -0
- data/test/test_consumption_tax.rb +66 -0
- data/test/test_gemspec.rb +82 -0
- data/test/test_income_tax.rb +77 -0
- data/test/test_income_tax_deductions.rb +82 -0
- data/test/test_real_estate.rb +98 -0
- data/test/test_stamp_tax.rb +68 -0
- data/test/test_withholding_tax.rb +65 -0
- data/vendor/rust/Cargo.lock +235 -0
- data/vendor/rust/Cargo.toml +12 -0
- data/vendor/rust/crates/j-law-c-ffi/Cargo.toml +20 -0
- data/vendor/rust/crates/j-law-c-ffi/j_law_c_ffi.h +493 -0
- data/vendor/rust/crates/j-law-c-ffi/src/lib.rs +1553 -0
- data/vendor/rust/crates/j-law-core/Cargo.toml +18 -0
- data/vendor/rust/crates/j-law-core/src/domains/consumption_tax/calculator.rs +216 -0
- data/vendor/rust/crates/j-law-core/src/domains/consumption_tax/context.rs +29 -0
- data/vendor/rust/crates/j-law-core/src/domains/consumption_tax/mod.rs +9 -0
- data/vendor/rust/crates/j-law-core/src/domains/consumption_tax/params.rs +24 -0
- data/vendor/rust/crates/j-law-core/src/domains/consumption_tax/policy.rs +34 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/assessment.rs +76 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/calculator.rs +222 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/context.rs +79 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/deduction/calculator.rs +167 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/deduction/context.rs +172 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/deduction/expense.rs +465 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/deduction/mod.rs +20 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/deduction/params.rs +205 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/deduction/personal.rs +324 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/deduction/types.rs +61 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/mod.rs +24 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/params.rs +109 -0
- data/vendor/rust/crates/j-law-core/src/domains/income_tax/policy.rs +103 -0
- data/vendor/rust/crates/j-law-core/src/domains/mod.rs +5 -0
- data/vendor/rust/crates/j-law-core/src/domains/real_estate/calculator.rs +197 -0
- data/vendor/rust/crates/j-law-core/src/domains/real_estate/context.rs +48 -0
- data/vendor/rust/crates/j-law-core/src/domains/real_estate/mod.rs +9 -0
- data/vendor/rust/crates/j-law-core/src/domains/real_estate/params.rs +43 -0
- data/vendor/rust/crates/j-law-core/src/domains/real_estate/policy.rs +40 -0
- data/vendor/rust/crates/j-law-core/src/domains/stamp_tax/calculator.rs +321 -0
- data/vendor/rust/crates/j-law-core/src/domains/stamp_tax/context.rs +408 -0
- data/vendor/rust/crates/j-law-core/src/domains/stamp_tax/mod.rs +12 -0
- data/vendor/rust/crates/j-law-core/src/domains/stamp_tax/params.rs +190 -0
- data/vendor/rust/crates/j-law-core/src/domains/stamp_tax/policy.rs +105 -0
- data/vendor/rust/crates/j-law-core/src/domains/withholding_tax/calculator.rs +247 -0
- data/vendor/rust/crates/j-law-core/src/domains/withholding_tax/context.rs +167 -0
- data/vendor/rust/crates/j-law-core/src/domains/withholding_tax/mod.rs +9 -0
- data/vendor/rust/crates/j-law-core/src/domains/withholding_tax/params.rs +80 -0
- data/vendor/rust/crates/j-law-core/src/domains/withholding_tax/policy.rs +49 -0
- data/vendor/rust/crates/j-law-core/src/error.rs +171 -0
- data/vendor/rust/crates/j-law-core/src/lib.rs +9 -0
- data/vendor/rust/crates/j-law-core/src/types/amount.rs +232 -0
- data/vendor/rust/crates/j-law-core/src/types/citation.rs +82 -0
- data/vendor/rust/crates/j-law-core/src/types/date.rs +280 -0
- data/vendor/rust/crates/j-law-core/src/types/mod.rs +11 -0
- data/vendor/rust/crates/j-law-core/src/types/rate.rs +219 -0
- data/vendor/rust/crates/j-law-core/src/types/rounding.rs +81 -0
- data/vendor/rust/crates/j-law-registry/Cargo.toml +15 -0
- data/vendor/rust/crates/j-law-registry/data/consumption_tax/consumption_tax.json +70 -0
- data/vendor/rust/crates/j-law-registry/data/income_tax/deductions.json +327 -0
- data/vendor/rust/crates/j-law-registry/data/income_tax/income_tax.json +352 -0
- data/vendor/rust/crates/j-law-registry/data/real_estate/brokerage_fee.json +125 -0
- data/vendor/rust/crates/j-law-registry/data/stamp_tax/stamp_tax.json +674 -0
- data/vendor/rust/crates/j-law-registry/data/withholding_tax/withholding_tax.json +70 -0
- data/vendor/rust/crates/j-law-registry/src/consumption_tax_loader.rs +325 -0
- data/vendor/rust/crates/j-law-registry/src/consumption_tax_schema.rs +49 -0
- data/vendor/rust/crates/j-law-registry/src/income_tax_deduction_loader.rs +636 -0
- data/vendor/rust/crates/j-law-registry/src/income_tax_deduction_schema.rs +111 -0
- data/vendor/rust/crates/j-law-registry/src/income_tax_loader.rs +445 -0
- data/vendor/rust/crates/j-law-registry/src/income_tax_schema.rs +44 -0
- data/vendor/rust/crates/j-law-registry/src/lib.rs +20 -0
- data/vendor/rust/crates/j-law-registry/src/loader.rs +221 -0
- data/vendor/rust/crates/j-law-registry/src/schema.rs +73 -0
- data/vendor/rust/crates/j-law-registry/src/stamp_tax_loader.rs +374 -0
- data/vendor/rust/crates/j-law-registry/src/stamp_tax_schema.rs +72 -0
- data/vendor/rust/crates/j-law-registry/src/validator.rs +204 -0
- data/vendor/rust/crates/j-law-registry/src/withholding_tax_loader.rs +310 -0
- data/vendor/rust/crates/j-law-registry/src/withholding_tax_schema.rs +61 -0
- metadata +148 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
use crate::domains::income_tax::policy::IncomeTaxPolicy;
|
|
2
|
+
use crate::types::date::LegalDate;
|
|
3
|
+
use std::collections::HashSet;
|
|
4
|
+
use std::fmt;
|
|
5
|
+
|
|
6
|
+
/// 所得税計算に関わる法的フラグ。
|
|
7
|
+
///
|
|
8
|
+
/// WARNING: 各フラグの事実認定はライブラリの責任範囲外です。
|
|
9
|
+
/// 呼び出し元が正しく判断した上で指定してください。
|
|
10
|
+
///
|
|
11
|
+
/// # 法的根拠
|
|
12
|
+
/// 所得税法 各条項
|
|
13
|
+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
|
14
|
+
pub enum IncomeTaxFlag {
|
|
15
|
+
/// 復興特別所得税を適用する。
|
|
16
|
+
///
|
|
17
|
+
/// 適用要件: 2013年〜2037年の各年分の所得税。
|
|
18
|
+
/// 法的根拠: 復興財源確保法 第13条
|
|
19
|
+
ApplyReconstructionTax,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// 所得税計算の入力コンテキスト。
|
|
23
|
+
///
|
|
24
|
+
/// # 法的根拠
|
|
25
|
+
/// 所得税法 第89条第1項
|
|
26
|
+
pub struct IncomeTaxContext {
|
|
27
|
+
/// 課税所得金額(円)。
|
|
28
|
+
///
|
|
29
|
+
/// 各種所得控除を適用した後の金額。
|
|
30
|
+
/// 1,000円未満の端数は切り捨て済みであること。
|
|
31
|
+
/// 法的根拠: 所得税法 第89条第1項
|
|
32
|
+
pub taxable_income: u64,
|
|
33
|
+
/// 確定申告の対象となる年の基準日。
|
|
34
|
+
pub target_date: LegalDate,
|
|
35
|
+
/// 適用する法的フラグの集合。
|
|
36
|
+
pub flags: HashSet<IncomeTaxFlag>,
|
|
37
|
+
/// 計算ポリシー(テスト・カスタム計算での差し替えを可能にする)。
|
|
38
|
+
pub policy: Box<dyn IncomeTaxPolicy>,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
impl fmt::Debug for IncomeTaxContext {
|
|
42
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
43
|
+
f.debug_struct("IncomeTaxContext")
|
|
44
|
+
.field("taxable_income", &self.taxable_income)
|
|
45
|
+
.field("target_date", &self.target_date)
|
|
46
|
+
.field("flags", &self.flags)
|
|
47
|
+
.field("policy", &"<policy>")
|
|
48
|
+
.finish()
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#[cfg(test)]
|
|
53
|
+
mod tests {
|
|
54
|
+
use super::*;
|
|
55
|
+
use crate::domains::income_tax::policy::StandardIncomeTaxPolicy;
|
|
56
|
+
|
|
57
|
+
#[test]
|
|
58
|
+
fn context_construction() {
|
|
59
|
+
let mut flags = HashSet::new();
|
|
60
|
+
flags.insert(IncomeTaxFlag::ApplyReconstructionTax);
|
|
61
|
+
|
|
62
|
+
let ctx = IncomeTaxContext {
|
|
63
|
+
taxable_income: 5_000_000,
|
|
64
|
+
target_date: LegalDate::new(2024, 1, 1),
|
|
65
|
+
flags,
|
|
66
|
+
policy: Box::new(StandardIncomeTaxPolicy),
|
|
67
|
+
};
|
|
68
|
+
assert_eq!(ctx.taxable_income, 5_000_000);
|
|
69
|
+
assert!(ctx.flags.contains(&IncomeTaxFlag::ApplyReconstructionTax));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
#[test]
|
|
73
|
+
fn flag_equality() {
|
|
74
|
+
assert_eq!(
|
|
75
|
+
IncomeTaxFlag::ApplyReconstructionTax,
|
|
76
|
+
IncomeTaxFlag::ApplyReconstructionTax,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
use crate::domains::income_tax::deduction::context::IncomeDeductionContext;
|
|
2
|
+
use crate::domains::income_tax::deduction::expense::calculate_expense_deductions;
|
|
3
|
+
use crate::domains::income_tax::deduction::params::IncomeDeductionParams;
|
|
4
|
+
use crate::domains::income_tax::deduction::personal::calculate_personal_deductions;
|
|
5
|
+
use crate::domains::income_tax::deduction::types::{IncomeDeductionLine, IncomeDeductionResult};
|
|
6
|
+
use crate::error::{CalculationError, JLawError};
|
|
7
|
+
use crate::types::amount::FinalAmount;
|
|
8
|
+
|
|
9
|
+
/// 総所得金額等から所得控除額を差し引き、課税所得金額を計算する。
|
|
10
|
+
///
|
|
11
|
+
/// # 法的根拠
|
|
12
|
+
/// 所得税法 第73条(医療費控除)
|
|
13
|
+
/// 所得税法 第74条(社会保険料控除)
|
|
14
|
+
/// 所得税法 第76条(生命保険料控除)
|
|
15
|
+
/// 所得税法 第78条(寄附金控除)
|
|
16
|
+
/// 所得税法 第83条(配偶者控除)
|
|
17
|
+
/// 所得税法 第84条(扶養控除)
|
|
18
|
+
/// 所得税法 第86条(基礎控除)
|
|
19
|
+
pub fn calculate_income_deductions(
|
|
20
|
+
ctx: &IncomeDeductionContext,
|
|
21
|
+
params: &IncomeDeductionParams,
|
|
22
|
+
) -> Result<IncomeDeductionResult, JLawError> {
|
|
23
|
+
ctx.target_date.validate()?;
|
|
24
|
+
|
|
25
|
+
let mut breakdown = calculate_personal_deductions(ctx, ¶ms.personal)?;
|
|
26
|
+
breakdown.extend(calculate_expense_deductions(ctx, ¶ms.expense)?);
|
|
27
|
+
|
|
28
|
+
let total_deductions_yen = sum_deductions(&breakdown)?;
|
|
29
|
+
let taxable_income_before_truncation =
|
|
30
|
+
ctx.total_income_amount.saturating_sub(total_deductions_yen);
|
|
31
|
+
let taxable_income = truncate_below_1000(taxable_income_before_truncation);
|
|
32
|
+
|
|
33
|
+
Ok(IncomeDeductionResult {
|
|
34
|
+
total_income_amount: FinalAmount::new(ctx.total_income_amount),
|
|
35
|
+
total_deductions: FinalAmount::new(total_deductions_yen),
|
|
36
|
+
taxable_income_before_truncation: FinalAmount::new(taxable_income_before_truncation),
|
|
37
|
+
taxable_income: FinalAmount::new(taxable_income),
|
|
38
|
+
breakdown,
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
fn sum_deductions(lines: &[IncomeDeductionLine]) -> Result<u64, JLawError> {
|
|
43
|
+
lines.iter().try_fold(0_u64, |acc, line| {
|
|
44
|
+
acc.checked_add(line.amount.as_yen())
|
|
45
|
+
.ok_or_else(|| CalculationError::Overflow {
|
|
46
|
+
step: "income_deduction_total".into(),
|
|
47
|
+
})
|
|
48
|
+
.map_err(JLawError::from)
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
fn truncate_below_1000(amount: u64) -> u64 {
|
|
53
|
+
amount / 1_000 * 1_000
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#[cfg(test)]
|
|
57
|
+
#[allow(clippy::disallowed_methods)]
|
|
58
|
+
mod tests {
|
|
59
|
+
use super::*;
|
|
60
|
+
use crate::domains::income_tax::deduction::context::{
|
|
61
|
+
DependentDeductionInput, ExpenseDeductionInput, IncomeDeductionInput,
|
|
62
|
+
PersonalDeductionInput,
|
|
63
|
+
};
|
|
64
|
+
use crate::domains::income_tax::deduction::params::{
|
|
65
|
+
BasicDeductionBracket, BasicDeductionParams, DependentDeductionParams,
|
|
66
|
+
DonationDeductionParams, ExpenseDeductionParams, LifeInsuranceDeductionBracket,
|
|
67
|
+
LifeInsuranceDeductionParams, MedicalDeductionParams, PersonalDeductionParams,
|
|
68
|
+
SocialInsuranceDeductionParams, SpouseDeductionParams,
|
|
69
|
+
};
|
|
70
|
+
use crate::types::date::LegalDate;
|
|
71
|
+
|
|
72
|
+
fn params() -> IncomeDeductionParams {
|
|
73
|
+
IncomeDeductionParams {
|
|
74
|
+
personal: PersonalDeductionParams {
|
|
75
|
+
basic: BasicDeductionParams {
|
|
76
|
+
brackets: vec![BasicDeductionBracket {
|
|
77
|
+
label: "2,400万円以下".into(),
|
|
78
|
+
income_from: 0,
|
|
79
|
+
income_to_inclusive: None,
|
|
80
|
+
deduction_amount: 480_000,
|
|
81
|
+
}],
|
|
82
|
+
},
|
|
83
|
+
spouse: SpouseDeductionParams {
|
|
84
|
+
qualifying_spouse_income_max: 480_000,
|
|
85
|
+
taxpayer_income_brackets: vec![],
|
|
86
|
+
},
|
|
87
|
+
dependent: DependentDeductionParams {
|
|
88
|
+
general_deduction_amount: 380_000,
|
|
89
|
+
specific_deduction_amount: 630_000,
|
|
90
|
+
elderly_cohabiting_deduction_amount: 580_000,
|
|
91
|
+
elderly_other_deduction_amount: 480_000,
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
expense: ExpenseDeductionParams {
|
|
95
|
+
social_insurance: SocialInsuranceDeductionParams,
|
|
96
|
+
medical: MedicalDeductionParams {
|
|
97
|
+
income_threshold_rate_numer: 5,
|
|
98
|
+
income_threshold_rate_denom: 100,
|
|
99
|
+
threshold_cap_amount: 100_000,
|
|
100
|
+
deduction_cap_amount: 2_000_000,
|
|
101
|
+
},
|
|
102
|
+
life_insurance: LifeInsuranceDeductionParams {
|
|
103
|
+
new_contract_brackets: vec![LifeInsuranceDeductionBracket {
|
|
104
|
+
label: "8万円超".into(),
|
|
105
|
+
paid_from: 0,
|
|
106
|
+
paid_to_inclusive: None,
|
|
107
|
+
rate_numer: 0,
|
|
108
|
+
rate_denom: 1,
|
|
109
|
+
addition_amount: 40_000,
|
|
110
|
+
deduction_cap_amount: 40_000,
|
|
111
|
+
}],
|
|
112
|
+
old_contract_brackets: vec![LifeInsuranceDeductionBracket {
|
|
113
|
+
label: "10万円超".into(),
|
|
114
|
+
paid_from: 0,
|
|
115
|
+
paid_to_inclusive: None,
|
|
116
|
+
rate_numer: 0,
|
|
117
|
+
rate_denom: 1,
|
|
118
|
+
addition_amount: 50_000,
|
|
119
|
+
deduction_cap_amount: 50_000,
|
|
120
|
+
}],
|
|
121
|
+
mixed_contract_cap_amount: 40_000,
|
|
122
|
+
new_contract_cap_amount: 40_000,
|
|
123
|
+
old_contract_cap_amount: 50_000,
|
|
124
|
+
combined_cap_amount: 120_000,
|
|
125
|
+
},
|
|
126
|
+
donation: DonationDeductionParams {
|
|
127
|
+
income_cap_rate_numer: 40,
|
|
128
|
+
income_cap_rate_denom: 100,
|
|
129
|
+
non_deductible_amount: 2_000,
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
fn ctx(total_income_amount: u64, social_insurance_premium_paid: u64) -> IncomeDeductionContext {
|
|
136
|
+
IncomeDeductionContext {
|
|
137
|
+
total_income_amount,
|
|
138
|
+
target_date: LegalDate::new(2024, 1, 1),
|
|
139
|
+
deductions: IncomeDeductionInput {
|
|
140
|
+
personal: PersonalDeductionInput {
|
|
141
|
+
spouse: None,
|
|
142
|
+
dependent: DependentDeductionInput::default(),
|
|
143
|
+
},
|
|
144
|
+
expense: ExpenseDeductionInput {
|
|
145
|
+
social_insurance_premium_paid,
|
|
146
|
+
medical: None,
|
|
147
|
+
life_insurance: None,
|
|
148
|
+
donation: None,
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
#[test]
|
|
155
|
+
fn truncates_taxable_income_below_1000() {
|
|
156
|
+
let result = calculate_income_deductions(&ctx(481_999, 0), ¶ms()).unwrap();
|
|
157
|
+
assert_eq!(result.taxable_income_before_truncation.as_yen(), 1_999);
|
|
158
|
+
assert_eq!(result.taxable_income.as_yen(), 1_000);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
#[test]
|
|
162
|
+
fn taxable_income_does_not_go_below_zero() {
|
|
163
|
+
let result = calculate_income_deductions(&ctx(100_000, 30_000), ¶ms()).unwrap();
|
|
164
|
+
assert_eq!(result.taxable_income_before_truncation.as_yen(), 0);
|
|
165
|
+
assert_eq!(result.taxable_income.as_yen(), 0);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
use crate::types::date::LegalDate;
|
|
2
|
+
use std::fmt;
|
|
3
|
+
|
|
4
|
+
/// 所得控除計算の入力コンテキスト。
|
|
5
|
+
///
|
|
6
|
+
/// 総所得金額等から所得控除額を差し引き、課税所得金額を組み立てる。
|
|
7
|
+
///
|
|
8
|
+
/// # 法的根拠
|
|
9
|
+
/// 所得税法 第73条(医療費控除)
|
|
10
|
+
/// 所得税法 第74条(社会保険料控除)
|
|
11
|
+
/// 所得税法 第76条(生命保険料控除)
|
|
12
|
+
/// 所得税法 第78条(寄附金控除)
|
|
13
|
+
/// 所得税法 第83条(配偶者控除)
|
|
14
|
+
/// 所得税法 第84条(扶養控除)
|
|
15
|
+
/// 所得税法 第86条(基礎控除)
|
|
16
|
+
pub struct IncomeDeductionContext {
|
|
17
|
+
/// 総所得金額等(円)。
|
|
18
|
+
pub total_income_amount: u64,
|
|
19
|
+
/// 計算対象年の基準日。
|
|
20
|
+
pub target_date: LegalDate,
|
|
21
|
+
/// 各所得控除の入力値。
|
|
22
|
+
pub deductions: IncomeDeductionInput,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
impl fmt::Debug for IncomeDeductionContext {
|
|
26
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
27
|
+
f.debug_struct("IncomeDeductionContext")
|
|
28
|
+
.field("total_income_amount", &self.total_income_amount)
|
|
29
|
+
.field("target_date", &self.target_date)
|
|
30
|
+
.field("deductions", &self.deductions)
|
|
31
|
+
.finish()
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// 所得控除全体の入力集合。
|
|
36
|
+
///
|
|
37
|
+
/// # 法的根拠
|
|
38
|
+
/// 所得税法 第73条(医療費控除)
|
|
39
|
+
/// 所得税法 第74条(社会保険料控除)
|
|
40
|
+
/// 所得税法 第76条(生命保険料控除)
|
|
41
|
+
/// 所得税法 第78条(寄附金控除)
|
|
42
|
+
/// 所得税法 第83条(配偶者控除)
|
|
43
|
+
/// 所得税法 第84条(扶養控除)
|
|
44
|
+
/// 所得税法 第86条(基礎控除)
|
|
45
|
+
#[derive(Debug, Clone, Default)]
|
|
46
|
+
pub struct IncomeDeductionInput {
|
|
47
|
+
/// 人的控除の入力。
|
|
48
|
+
pub personal: PersonalDeductionInput,
|
|
49
|
+
/// 支出系控除の入力。
|
|
50
|
+
pub expense: ExpenseDeductionInput,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// 人的控除の入力。
|
|
54
|
+
///
|
|
55
|
+
/// # 法的根拠
|
|
56
|
+
/// 所得税法 第83条(配偶者控除)
|
|
57
|
+
/// 所得税法 第84条(扶養控除)
|
|
58
|
+
/// 所得税法 第86条(基礎控除)
|
|
59
|
+
#[derive(Debug, Clone, Default)]
|
|
60
|
+
pub struct PersonalDeductionInput {
|
|
61
|
+
/// 配偶者控除の入力。該当しない場合は `None`。
|
|
62
|
+
pub spouse: Option<SpouseDeductionInput>,
|
|
63
|
+
/// 扶養控除の入力。
|
|
64
|
+
pub dependent: DependentDeductionInput,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/// 配偶者控除の入力。
|
|
68
|
+
///
|
|
69
|
+
/// # 法的根拠
|
|
70
|
+
/// 所得税法 第83条(配偶者控除)
|
|
71
|
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
72
|
+
pub struct SpouseDeductionInput {
|
|
73
|
+
/// 配偶者の合計所得金額(円)。
|
|
74
|
+
pub spouse_total_income_amount: u64,
|
|
75
|
+
/// WARNING: このフラグの事実認定はライブラリの責任範囲外です。
|
|
76
|
+
/// 呼び出し元が正しく判断した上で指定してください。
|
|
77
|
+
///
|
|
78
|
+
/// 納税者と配偶者が生計を一にすると呼び出し元が判定した場合に `true`。
|
|
79
|
+
pub is_same_household: bool,
|
|
80
|
+
/// WARNING: このフラグの事実認定はライブラリの責任範囲外です。
|
|
81
|
+
/// 呼び出し元が正しく判断した上で指定してください。
|
|
82
|
+
///
|
|
83
|
+
/// 老人控除対象配偶者に該当すると呼び出し元が判定した場合に `true`。
|
|
84
|
+
pub is_elderly: bool,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/// 扶養控除の入力。
|
|
88
|
+
///
|
|
89
|
+
/// # 法的根拠
|
|
90
|
+
/// 所得税法 第84条(扶養控除)
|
|
91
|
+
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
|
|
92
|
+
pub struct DependentDeductionInput {
|
|
93
|
+
/// WARNING: この人数の事実認定はライブラリの責任範囲外です。
|
|
94
|
+
/// 呼び出し元が正しく判断した上で指定してください。
|
|
95
|
+
///
|
|
96
|
+
/// 一般の控除対象扶養親族の人数。
|
|
97
|
+
pub general_count: u16,
|
|
98
|
+
/// WARNING: この人数の事実認定はライブラリの責任範囲外です。
|
|
99
|
+
/// 呼び出し元が正しく判断した上で指定してください。
|
|
100
|
+
///
|
|
101
|
+
/// 特定扶養親族の人数。
|
|
102
|
+
pub specific_count: u16,
|
|
103
|
+
/// WARNING: この人数の事実認定はライブラリの責任範囲外です。
|
|
104
|
+
/// 呼び出し元が正しく判断した上で指定してください。
|
|
105
|
+
///
|
|
106
|
+
/// 同居老親等に該当する老人扶養親族の人数。
|
|
107
|
+
pub elderly_cohabiting_count: u16,
|
|
108
|
+
/// WARNING: この人数の事実認定はライブラリの責任範囲外です。
|
|
109
|
+
/// 呼び出し元が正しく判断した上で指定してください。
|
|
110
|
+
///
|
|
111
|
+
/// 同居老親等以外の老人扶養親族の人数。
|
|
112
|
+
pub elderly_other_count: u16,
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/// 支出系控除の入力。
|
|
116
|
+
///
|
|
117
|
+
/// # 法的根拠
|
|
118
|
+
/// 所得税法 第73条(医療費控除)
|
|
119
|
+
/// 所得税法 第74条(社会保険料控除)
|
|
120
|
+
/// 所得税法 第76条(生命保険料控除)
|
|
121
|
+
/// 所得税法 第78条(寄附金控除)
|
|
122
|
+
#[derive(Debug, Clone, Default)]
|
|
123
|
+
pub struct ExpenseDeductionInput {
|
|
124
|
+
/// 社会保険料控除の対象として呼び出し元が判定した支払額(円)。
|
|
125
|
+
pub social_insurance_premium_paid: u64,
|
|
126
|
+
/// 医療費控除の入力。該当しない場合は `None`。
|
|
127
|
+
pub medical: Option<MedicalDeductionInput>,
|
|
128
|
+
/// 生命保険料控除の入力。該当しない場合は `None`。
|
|
129
|
+
pub life_insurance: Option<LifeInsuranceDeductionInput>,
|
|
130
|
+
/// 寄附金控除の入力。該当しない場合は `None`。
|
|
131
|
+
pub donation: Option<DonationDeductionInput>,
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// 医療費控除の入力。
|
|
135
|
+
///
|
|
136
|
+
/// # 法的根拠
|
|
137
|
+
/// 所得税法 第73条(医療費控除)
|
|
138
|
+
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
|
|
139
|
+
pub struct MedicalDeductionInput {
|
|
140
|
+
/// その年中に支払った医療費の総額(円)。
|
|
141
|
+
pub medical_expense_paid: u64,
|
|
142
|
+
/// 保険金などで補填された金額(円)。
|
|
143
|
+
pub reimbursed_amount: u64,
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/// 生命保険料控除の入力。
|
|
147
|
+
///
|
|
148
|
+
/// # 法的根拠
|
|
149
|
+
/// 所得税法 第76条(生命保険料控除)
|
|
150
|
+
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
|
|
151
|
+
pub struct LifeInsuranceDeductionInput {
|
|
152
|
+
/// 新契約の一般生命保険料の支払額(円)。
|
|
153
|
+
pub new_general_paid_amount: u64,
|
|
154
|
+
/// 新契約の個人年金保険料の支払額(円)。
|
|
155
|
+
pub new_individual_pension_paid_amount: u64,
|
|
156
|
+
/// 新契約の介護医療保険料の支払額(円)。
|
|
157
|
+
pub new_care_medical_paid_amount: u64,
|
|
158
|
+
/// 旧契約の一般生命保険料の支払額(円)。
|
|
159
|
+
pub old_general_paid_amount: u64,
|
|
160
|
+
/// 旧契約の個人年金保険料の支払額(円)。
|
|
161
|
+
pub old_individual_pension_paid_amount: u64,
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/// 寄附金控除の入力。
|
|
165
|
+
///
|
|
166
|
+
/// # 法的根拠
|
|
167
|
+
/// 所得税法 第78条(寄附金控除)
|
|
168
|
+
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
|
|
169
|
+
pub struct DonationDeductionInput {
|
|
170
|
+
/// 寄附金控除の対象として呼び出し元が判定した寄附金支出額(円)。
|
|
171
|
+
pub qualified_donation_amount: u64,
|
|
172
|
+
}
|