@novha/calc-engines 4.0.0 → 6.0.0

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.
Files changed (98) hide show
  1. package/dist/capital-gains/australia/AustraliaCapitalGainsService.js +3 -0
  2. package/dist/capital-gains/australia/AustraliaCapitalGainsServiceImpl.js +67 -0
  3. package/dist/capital-gains/australia/domain/types.js +3 -0
  4. package/dist/capital-gains/canada/CanadaCapitalGainsService.js +3 -0
  5. package/dist/capital-gains/canada/CanadaCapitalGainsServiceImpl.js +66 -0
  6. package/dist/capital-gains/canada/domain/types.js +3 -0
  7. package/dist/capital-gains/domain/types.js +3 -0
  8. package/dist/capital-gains/france/FranceCapitalGainsService.js +3 -0
  9. package/dist/capital-gains/france/FranceCapitalGainsServiceImpl.js +51 -0
  10. package/dist/capital-gains/france/domain/types.js +3 -0
  11. package/dist/capital-gains/germany/GermanyCapitalGainsService.js +3 -0
  12. package/dist/capital-gains/germany/GermanyCapitalGainsServiceImpl.js +68 -0
  13. package/dist/capital-gains/germany/domain/types.js +3 -0
  14. package/dist/capital-gains/index.js +25 -0
  15. package/dist/capital-gains/south-africa/SouthAfricaCapitalGainsService.js +3 -0
  16. package/dist/capital-gains/south-africa/SouthAfricaCapitalGainsServiceImpl.js +83 -0
  17. package/dist/capital-gains/south-africa/domain/types.js +3 -0
  18. package/dist/capital-gains/uk/UKCapitalGainsService.js +3 -0
  19. package/dist/capital-gains/uk/UKCapitalGainsServiceImpl.js +86 -0
  20. package/dist/capital-gains/uk/domain/types.js +3 -0
  21. package/dist/capital-gains/usa/USACapitalGainsService.js +3 -0
  22. package/dist/capital-gains/usa/USACapitalGainsServiceImpl.js +77 -0
  23. package/dist/capital-gains/usa/domain/types.js +3 -0
  24. package/dist/corporate/index.js +18 -0
  25. package/dist/income-tax/index.js +24 -0
  26. package/dist/index.js +18 -51
  27. package/dist/mortgage/france/FranceMortgageService.js +1 -1
  28. package/dist/mortgage/france/FranceMortgageServiceImpl.js +1 -1
  29. package/dist/mortgage/index.js +25 -0
  30. package/dist/shared/domain/types.js +2 -1
  31. package/dist/types/capital-gains/australia/AustraliaCapitalGainsService.d.ts +4 -0
  32. package/dist/types/capital-gains/australia/AustraliaCapitalGainsServiceImpl.d.ts +10 -0
  33. package/dist/types/capital-gains/australia/domain/types.d.ts +15 -0
  34. package/dist/types/capital-gains/canada/CanadaCapitalGainsService.d.ts +4 -0
  35. package/dist/types/capital-gains/canada/CanadaCapitalGainsServiceImpl.d.ts +10 -0
  36. package/dist/types/capital-gains/canada/domain/types.d.ts +13 -0
  37. package/dist/types/capital-gains/domain/types.d.ts +15 -0
  38. package/dist/types/capital-gains/france/FranceCapitalGainsService.d.ts +4 -0
  39. package/dist/types/capital-gains/france/FranceCapitalGainsServiceImpl.d.ts +9 -0
  40. package/dist/types/capital-gains/france/domain/types.d.ts +7 -0
  41. package/dist/types/capital-gains/germany/GermanyCapitalGainsService.d.ts +4 -0
  42. package/dist/types/capital-gains/germany/GermanyCapitalGainsServiceImpl.d.ts +9 -0
  43. package/dist/types/capital-gains/germany/domain/types.d.ts +8 -0
  44. package/dist/types/capital-gains/index.d.ts +15 -0
  45. package/dist/types/capital-gains/south-africa/SouthAfricaCapitalGainsService.d.ts +4 -0
  46. package/dist/types/capital-gains/south-africa/SouthAfricaCapitalGainsServiceImpl.d.ts +10 -0
  47. package/dist/types/capital-gains/south-africa/domain/types.d.ts +14 -0
  48. package/dist/types/capital-gains/uk/UKCapitalGainsService.d.ts +4 -0
  49. package/dist/types/capital-gains/uk/UKCapitalGainsServiceImpl.d.ts +9 -0
  50. package/dist/types/capital-gains/uk/domain/types.d.ts +10 -0
  51. package/dist/types/capital-gains/usa/USACapitalGainsService.d.ts +4 -0
  52. package/dist/types/capital-gains/usa/USACapitalGainsServiceImpl.d.ts +10 -0
  53. package/dist/types/capital-gains/usa/domain/types.d.ts +26 -0
  54. package/dist/types/corporate/index.d.ts +15 -0
  55. package/dist/types/income-tax/index.d.ts +15 -0
  56. package/dist/types/index.d.ts +4 -42
  57. package/dist/types/mortgage/france/FranceMortgageService.d.ts +1 -1
  58. package/dist/types/mortgage/france/FranceMortgageServiceImpl.d.ts +1 -1
  59. package/dist/types/mortgage/index.d.ts +15 -0
  60. package/dist/types/shared/domain/types.d.ts +2 -1
  61. package/package.json +1 -1
  62. package/src/capital-gains/australia/AustraliaCapitalGainsService.ts +5 -0
  63. package/src/capital-gains/australia/AustraliaCapitalGainsServiceImpl.ts +84 -0
  64. package/src/capital-gains/australia/domain/types.ts +17 -0
  65. package/src/capital-gains/canada/CanadaCapitalGainsService.ts +5 -0
  66. package/src/capital-gains/canada/CanadaCapitalGainsServiceImpl.ts +82 -0
  67. package/src/capital-gains/canada/domain/types.ts +15 -0
  68. package/src/capital-gains/domain/types.ts +15 -0
  69. package/src/capital-gains/france/FranceCapitalGainsService.ts +5 -0
  70. package/src/capital-gains/france/FranceCapitalGainsServiceImpl.ts +58 -0
  71. package/src/capital-gains/france/domain/types.ts +8 -0
  72. package/src/capital-gains/germany/GermanyCapitalGainsService.ts +5 -0
  73. package/src/capital-gains/germany/GermanyCapitalGainsServiceImpl.ts +77 -0
  74. package/src/capital-gains/germany/domain/types.ts +10 -0
  75. package/src/capital-gains/index.ts +72 -0
  76. package/src/capital-gains/south-africa/SouthAfricaCapitalGainsService.ts +5 -0
  77. package/src/capital-gains/south-africa/SouthAfricaCapitalGainsServiceImpl.ts +101 -0
  78. package/src/capital-gains/south-africa/domain/types.ts +16 -0
  79. package/src/capital-gains/uk/UKCapitalGainsService.ts +5 -0
  80. package/src/capital-gains/uk/UKCapitalGainsServiceImpl.ts +98 -0
  81. package/src/capital-gains/uk/domain/types.ts +11 -0
  82. package/src/capital-gains/usa/USACapitalGainsService.ts +5 -0
  83. package/src/capital-gains/usa/USACapitalGainsServiceImpl.ts +96 -0
  84. package/src/capital-gains/usa/domain/types.ts +27 -0
  85. package/src/corporate/index.ts +79 -0
  86. package/src/income-tax/index.ts +72 -0
  87. package/src/index.ts +6 -146
  88. package/src/mortgage/france/FranceMortgageService.ts +1 -1
  89. package/src/mortgage/france/FranceMortgageServiceImpl.ts +1 -1
  90. package/src/mortgage/index.ts +87 -0
  91. package/src/shared/domain/types.ts +1 -0
  92. package/test/australia-capital-gains.test.ts +80 -0
  93. package/test/canada-capital-gains.test.ts +71 -0
  94. package/test/france-capital-gains.test.ts +66 -0
  95. package/test/germany-capital-gains.test.ts +85 -0
  96. package/test/south-africa-capital-gains.test.ts +84 -0
  97. package/test/uk-capital-gains.test.ts +79 -0
  98. package/test/usa-capital-gains.test.ts +88 -0
@@ -0,0 +1,9 @@
1
+ import { Result } from "../domain/types";
2
+ import { UKCapitalGainsService } from "./UKCapitalGainsService";
3
+ import { Input, Rules } from "./domain/types";
4
+ export declare class UKCapitalGainsServiceImpl implements UKCapitalGainsService {
5
+ private _input;
6
+ private _rules;
7
+ constructor(input: Input, rules: Rules);
8
+ calculate(): Result;
9
+ }
@@ -0,0 +1,10 @@
1
+ export interface Rules {
2
+ annualExemption: number;
3
+ basicRate: number;
4
+ higherRate: number;
5
+ basicRateLimit: number;
6
+ }
7
+ export interface Input {
8
+ capitalGain: number;
9
+ totalTaxableIncome: number;
10
+ }
@@ -0,0 +1,4 @@
1
+ import { Result } from "../domain/types";
2
+ export interface USACapitalGainsService {
3
+ calculate(): Result;
4
+ }
@@ -0,0 +1,10 @@
1
+ import { Result } from "../domain/types";
2
+ import { USACapitalGainsService } from "./USACapitalGainsService";
3
+ import { Input, Rules } from "./domain/types";
4
+ export declare class USACapitalGainsServiceImpl implements USACapitalGainsService {
5
+ private _input;
6
+ private _rules;
7
+ constructor(input: Input, rules: Rules);
8
+ calculate(): Result;
9
+ private applyBrackets;
10
+ }
@@ -0,0 +1,26 @@
1
+ import { Breakdown } from "../../domain/types";
2
+ export interface LongTermBracket {
3
+ from: number;
4
+ to: number | null;
5
+ rate: number;
6
+ }
7
+ export interface Rules {
8
+ longTermBrackets: LongTermBracket[];
9
+ shortTermBrackets: LongTermBracket[];
10
+ netInvestmentIncomeTax: {
11
+ rate: number;
12
+ threshold: number;
13
+ };
14
+ }
15
+ export interface Input {
16
+ capitalGain: number;
17
+ totalTaxableIncome: number;
18
+ holdingPeriodMonths: number;
19
+ }
20
+ export interface Result {
21
+ capitalGainsTax: number;
22
+ netInvestmentIncomeTax: number;
23
+ totalTax: number;
24
+ effectiveRate: number;
25
+ breakdowns: Breakdown[];
26
+ }
@@ -0,0 +1,15 @@
1
+ import { USACorporateTaxServiceImpl as USACorporateTaxService } from './usa/USACorporateTaxServiceImpl';
2
+ import { Input as USACorporateTaxInput, Rules as USACorporateTaxRules, Result as USACorporateTaxResult } from './usa/domain/types';
3
+ import { GermanyCorporateTaxServiceImpl as GermanyCorporateTaxService } from './germany/GermanyCorporateTaxServiceImpl';
4
+ import { Input as GermanyCorporateTaxInput, Rules as GermanyCorporateTaxRules, Result as GermanyCorporateTaxResult } from './germany/domain/types';
5
+ import { UKCorporateTaxServiceImpl as UKCorporateTaxService } from './uk/UKCorporateTaxServiceImpl';
6
+ import { Input as UKCorporateTaxInput, Rules as UKCorporateTaxRules, Result as UKCorporateTaxResult } from './uk/domain/types';
7
+ import { AustraliaCorporateTaxServiceImpl as AustraliaCorporateTaxService } from './australia/AustraliaCorporateTaxServiceImpl';
8
+ import { Input as AustraliaCorporateTaxInput, Rules as AustraliaCorporateTaxRules, Result as AustraliaCorporateTaxResult } from './australia/domain/types';
9
+ import { SouthAfricaCorporateTaxServiceImpl as SouthAfricaCorporateTaxService } from './south-africa/SouthAfricaCorporateTaxServiceImpl';
10
+ import { Rules as SouthAfricaCorporateTaxRules, Input as SouthAfricaCorporateTaxInput, Result as SouthAfricaCorporateTaxResult } from './south-africa/domain/types';
11
+ import { FranceCorporateTaxServiceImpl as FranceCorporateTaxService } from './france/FranceCorporateTaxServiceImpl';
12
+ import { Input as FranceCorporateTaxInput, Rules as FranceCorporateTaxRules, Result as FranceCorporateTaxResult } from './france/domain/types';
13
+ import { CanadaCorporateTaxServiceImpl as CanadaCorporateTaxService } from './canada/CanadaCorporateTaxServiceImpl';
14
+ import { Input as CanadaCorporateTaxInput, Rules as CanadaCorporateTaxRules, Result as CanadaCorporateTaxResult } from './canada/domain/types';
15
+ export { USACorporateTaxService, USACorporateTaxInput, USACorporateTaxRules, USACorporateTaxResult, GermanyCorporateTaxService, GermanyCorporateTaxInput, GermanyCorporateTaxRules, GermanyCorporateTaxResult, UKCorporateTaxService, UKCorporateTaxInput, UKCorporateTaxRules, UKCorporateTaxResult, AustraliaCorporateTaxService, AustraliaCorporateTaxInput, AustraliaCorporateTaxRules, AustraliaCorporateTaxResult, SouthAfricaCorporateTaxService, SouthAfricaCorporateTaxInput, SouthAfricaCorporateTaxRules, SouthAfricaCorporateTaxResult, FranceCorporateTaxService, FranceCorporateTaxInput, FranceCorporateTaxRules, FranceCorporateTaxResult, CanadaCorporateTaxService, CanadaCorporateTaxInput, CanadaCorporateTaxRules, CanadaCorporateTaxResult };
@@ -0,0 +1,15 @@
1
+ import { CanadaIncomeTaxServiceImpl as CanadaIncomeTaxService } from './canada/CanadaIncomeTaxServiceImpl';
2
+ import { ComputedIncomeTaxValues as CanadaComputedIncomeTaxValues, IncomeTaxRules as CanadaIncomeTaxRules } from './canada/domain/types';
3
+ import { FranceIncomeTaxServiceImpl as FranceIncomeTaxService } from './france/FranceIncomeTaxServiceImpl';
4
+ import { ComputedIncomeTaxValues as FranceComputedIncomeTaxValues, IncomeTaxRules as FranceIncomeTaxRules } from './france/domain/types';
5
+ import { SouthAfricaIncomeTaxServiceImpl as SouthAfricaIncomeTaxService } from './south-africa/SouthAfricaIncomeTaxServiceImpl';
6
+ import { ComputedIncomeTaxValues as SouthAfricaComputedIncomeTaxValues, IncomeTaxRules as SouthAfricaIncomeTaxRules } from './south-africa/domain/types';
7
+ import { AustraliaIncomeTaxServiceImpl as AustraliaIncomeTaxService } from './australia/AustraliaIncomeTaxServiceImpl';
8
+ import { ComputedIncomeTaxValues as AustraliaComputedIncomeTaxValues, IncomeTaxRules as AustraliaIncomeTaxRules } from './australia/domain/types';
9
+ import { UKIncomeTaxServiceImpl as UKIncomeTaxService } from './uk/UKIncomeTaxServiceImpl';
10
+ import { ComputedIncomeTaxValues as UKComputedIncomeTaxValues, IncomeTaxRules as UKIncomeTaxRules } from './uk/domain/types';
11
+ import { USAIncomeTaxServiceImpl as USAIncomeTaxService } from './usa/USAIncomeTaxServiceImpl';
12
+ import { ComputedIncomeTaxValues as USAComputedIncomeTaxValues, IncomeTaxRules as USAIncomeTaxRules } from './usa/domain/types';
13
+ import { GermanyIncomeTaxServiceImpl as GermanyIncomeTaxService } from './germany/GermanyIncomeTaxServiceImpl';
14
+ import { ComputedIncomeTaxValues as GermanyComputedIncomeTaxValues, IncomeTaxRules as GermanyIncomeTaxRules } from './germany/domain/types';
15
+ export { CanadaIncomeTaxService, CanadaComputedIncomeTaxValues, CanadaIncomeTaxRules, FranceIncomeTaxService, FranceComputedIncomeTaxValues, FranceIncomeTaxRules, SouthAfricaIncomeTaxService, SouthAfricaComputedIncomeTaxValues, SouthAfricaIncomeTaxRules, AustraliaIncomeTaxService, AustraliaComputedIncomeTaxValues, AustraliaIncomeTaxRules, UKIncomeTaxService, UKComputedIncomeTaxValues, UKIncomeTaxRules, USAIncomeTaxService, USAComputedIncomeTaxValues, USAIncomeTaxRules, GermanyIncomeTaxService, GermanyComputedIncomeTaxValues, GermanyIncomeTaxRules, };
@@ -1,45 +1,7 @@
1
1
  export { CalculatorType } from './shared/domain/types';
2
- export { CanadaIncomeTaxServiceImpl as CanadaIncomeTaxService } from './income-tax/canada/CanadaIncomeTaxServiceImpl';
3
- export { CanadaMortgageServiceImpl as CanadaMortgageService } from './mortgage/canada/CanadaMortgageServiceImpl';
4
- export { ComputedIncomeTaxValues as CanadaComputedIncomeTaxValues, IncomeTaxRules as CanadaIncomeTaxRules, } from './income-tax/canada/domain/types';
5
- export { MortgageRules as CanadaMortgageRules, MortgageCalculationInput as CanadaMortgageCalculationInput, MortgageCalculationResult as CanadaMortgageCalculationResult, } from './mortgage/canada/domain/types';
6
- export { CanadaCorporateTaxServiceImpl as CanadaCorporateTaxService } from './corporate/canada/CanadaCorporateTaxServiceImpl';
7
- export { Input as CanadaCorporateTaxInput, Rules as CanadaCorporateTaxRules, Result as CanadaCorporateTaxResult, } from './corporate/canada/domain/types';
8
- export { FranceIncomeTaxServiceImpl as FranceIncomeTaxService } from './income-tax/france/FranceIncomeTaxServiceImpl';
9
- export { FranceMortgageServiceImpl as FranceMortgageService } from './mortgage/france/FranceMortgageServiceImpl';
10
- export { ComputedIncomeTaxValues as FranceComputedIncomeTaxValues, IncomeTaxRules as FranceIncomeTaxRules, } from './income-tax/france/domain/types';
11
- export { MortgageRules as FranceMortgageRules, MortgageInput as FranceMortgageInput, MortgageOutput as FranceMortgageCalculationResult, } from './mortgage/france/domain/types';
12
- export { FranceCorporateTaxServiceImpl as FranceCorporateTaxService } from './corporate/france/FranceCorporateTaxServiceImpl';
13
- export { Input as FranceCorporateTaxInput, Rules as FranceCorporateTaxRules, Result as FranceCorporateTaxResult, } from './corporate/france/domain/types';
14
- export { SouthAfricaIncomeTaxServiceImpl as SouthAfricaIncomeTaxService } from './income-tax/south-africa/SouthAfricaIncomeTaxServiceImpl';
15
- export { SouthAfricaMortgageServiceImpl as SouthAfricaMortgageService } from './mortgage/south-africa/SouthAfricaMortgageServiceImpl';
16
- export { ComputedIncomeTaxValues as SouthAfricaComputedIncomeTaxValues, IncomeTaxRules as SouthAfricaIncomeTaxRules, } from './income-tax/south-africa/domain/types';
17
- export { MortgageRules as SouthAfricaMortgageRules, MortgageInput as SouthAfricaMortgageInput, MortgageOutput as SouthAfricaMortgageOutput, } from './mortgage/south-africa/domain/types';
18
- export { SouthAfricaCorporateTaxServiceImpl as SouthAfricaCorporateTaxService } from './corporate/south-africa/SouthAfricaCorporateTaxServiceImpl';
19
- export { Rules as SouthAfricaCorporateTaxRules, Input as SouthAfricaCorporateTaxInput, Result as SouthAfricaCorporateTaxResult, } from './corporate/south-africa/domain/types';
20
- export { AustraliaIncomeTaxServiceImpl as AustraliaIncomeTaxService } from './income-tax/australia/AustraliaIncomeTaxServiceImpl';
21
- export { ComputedIncomeTaxValues as AustraliaComputedIncomeTaxValues, IncomeTaxRules as AustraliaIncomeTaxRules, } from './income-tax/australia/domain/types';
22
- export { AustraliaMortgageServiceImpl as AustraliaMortgageService } from './mortgage/australia/AustraliaMortgageServiceImpl';
23
- export { MortgageRules as AustraliaMortgageRules, MortgageInput as AustraliaMortgageInput, MortgageOutput as AustraliaMortgageOutput, } from './mortgage/australia/domain/types';
24
- export { AustraliaCorporateTaxServiceImpl as AustraliaCorporateTaxService } from './corporate/australia/AustraliaCorporateTaxServiceImpl';
25
- export { Input as AustraliaCorporateTaxInput, Rules as AustraliaCorporateTaxRules, Result as AustraliaCorporateTaxResult, } from './corporate/australia/domain/types';
26
- export { UKIncomeTaxServiceImpl as UKIncomeTaxService } from './income-tax/uk/UKIncomeTaxServiceImpl';
27
- export { ComputedIncomeTaxValues as UKComputedIncomeTaxValues, IncomeTaxRules as UKIncomeTaxRules, } from './income-tax/uk/domain/types';
28
- export { UKCorporateTaxServiceImpl as UKCorporateTaxService } from './corporate/uk/UKCorporateTaxServiceImpl';
29
- export { Input as UKCorporateTaxInput, Rules as UKCorporateTaxRules, Result as UKCorporateTaxResult, } from './corporate/uk/domain/types';
30
- export { UKMortgageServiceImpl as UKMortgageService } from './mortgage/uk/UKMortgageServiceImpl';
31
- export { MortgageRules as UKMortgageRules, MortgageInput as UKMortgageInput, MortgageOutput as UKMortgageOutput, } from './mortgage/uk/domain/types';
32
- export { USAIncomeTaxServiceImpl as USAIncomeTaxService } from './income-tax/usa/USAIncomeTaxServiceImpl';
33
- export { ComputedIncomeTaxValues as USAComputedIncomeTaxValues, IncomeTaxRules as USAIncomeTaxRules, } from './income-tax/usa/domain/types';
34
- export { USAMortgageServiceImpl as USAMortgageService } from './mortgage/usa/USAMortgageServiceImpl';
35
- export { MortgageRules as USAMortgageRules, MortgageInput as USAMortgageInput, MortgageOutput as USAMortgageOutput, } from './mortgage/usa/domain/types';
36
- export { USACorporateTaxServiceImpl as USACorporateTaxService } from './corporate/usa/USACorporateTaxServiceImpl';
37
- export { Input as USACorporateTaxInput, Rules as USACorporateTaxRules, Result as USACorporateTaxResult, } from './corporate/usa/domain/types';
38
- export { GermanyIncomeTaxServiceImpl as GermanyIncomeTaxService } from './income-tax/germany/GermanyIncomeTaxServiceImpl';
39
- export { ComputedIncomeTaxValues as GermanyComputedIncomeTaxValues, IncomeTaxRules as GermanyIncomeTaxRules, } from './income-tax/germany/domain/types';
40
- export { GermanyMortgageServiceImpl as GermanyMortgageService } from './mortgage/germany/GermanyMortgageServiceImpl';
41
- export { MortgageRules as GermanyMortgageRules, MortgageInput as GermanyMortgageInput, MortgageOutput as GermanyMortgageOutput, } from './mortgage/germany/domain/types';
42
- export { GermanyCorporateTaxServiceImpl as GermanyCorporateTaxService } from './corporate/germany/GermanyCorporateTaxServiceImpl';
43
- export { Input as GermanyCorporateTaxInput, Rules as GermanyCorporateTaxRules, Result as GermanyCorporateTaxResult, } from './corporate/germany/domain/types';
44
2
  export { IncomeTaxCalculatorSchema } from './income-tax/domain/types';
45
3
  export * from './income-tax/domain/types';
4
+ export * as IncomeTax from './income-tax';
5
+ export * as CorporateTax from './corporate';
6
+ export * as CapitalGain from './capital-gains';
7
+ export * as Mortgage from './mortgage';
@@ -1,4 +1,4 @@
1
1
  import { MortgageRules, MortgageInput, MortgageOutput } from './domain/types';
2
- export interface SouthAfricaMortgageService {
2
+ export interface FranceMortgageService {
3
3
  calculate(input: MortgageInput, rules: MortgageRules): MortgageOutput;
4
4
  }
@@ -1,4 +1,4 @@
1
- import { FranceMortgageService } from '../..';
1
+ import { FranceMortgageService } from './FranceMortgageService';
2
2
  import { MortgageRules, MortgageInput, MortgageOutput } from './domain/types';
3
3
  export declare class FranceMortgageServiceImpl implements FranceMortgageService {
4
4
  private _input;
@@ -0,0 +1,15 @@
1
+ import { CanadaMortgageServiceImpl as CanadaMortgageService } from './canada/CanadaMortgageServiceImpl';
2
+ import { MortgageRules as CanadaMortgageRules, MortgageCalculationInput as CanadaMortgageCalculationInput, MortgageCalculationResult as CanadaMortgageCalculationResult } from './canada/domain/types';
3
+ import { FranceMortgageServiceImpl as FranceMortgageService } from './france/FranceMortgageServiceImpl';
4
+ import { MortgageRules as FranceMortgageRules, MortgageInput as FranceMortgageInput, MortgageOutput as FranceMortgageCalculationResult } from './france/domain/types';
5
+ import { SouthAfricaMortgageServiceImpl as SouthAfricaMortgageService } from './south-africa/SouthAfricaMortgageServiceImpl';
6
+ import { MortgageRules as SouthAfricaMortgageRules, MortgageInput as SouthAfricaMortgageInput, MortgageOutput as SouthAfricaMortgageOutput } from './south-africa/domain/types';
7
+ import { AustraliaMortgageServiceImpl as AustraliaMortgageService } from './australia/AustraliaMortgageServiceImpl';
8
+ import { MortgageRules as AustraliaMortgageRules, MortgageInput as AustraliaMortgageInput, MortgageOutput as AustraliaMortgageOutput } from './australia/domain/types';
9
+ import { UKMortgageServiceImpl as UKMortgageService } from './uk/UKMortgageServiceImpl';
10
+ import { MortgageRules as UKMortgageRules, MortgageInput as UKMortgageInput, MortgageOutput as UKMortgageOutput } from './uk/domain/types';
11
+ import { USAMortgageServiceImpl as USAMortgageService } from './usa/USAMortgageServiceImpl';
12
+ import { MortgageRules as USAMortgageRules, MortgageInput as USAMortgageInput, MortgageOutput as USAMortgageOutput } from './usa/domain/types';
13
+ import { GermanyMortgageServiceImpl as GermanyMortgageService } from './germany/GermanyMortgageServiceImpl';
14
+ import { MortgageRules as GermanyMortgageRules, MortgageInput as GermanyMortgageInput, MortgageOutput as GermanyMortgageOutput } from './germany/domain/types';
15
+ export { CanadaMortgageService, CanadaMortgageRules, CanadaMortgageCalculationInput, CanadaMortgageCalculationResult, FranceMortgageService, FranceMortgageRules, FranceMortgageInput, FranceMortgageCalculationResult, SouthAfricaMortgageService, SouthAfricaMortgageRules, SouthAfricaMortgageInput, SouthAfricaMortgageOutput, AustraliaMortgageService, AustraliaMortgageRules, AustraliaMortgageInput, AustraliaMortgageOutput, UKMortgageService, UKMortgageRules, UKMortgageInput, UKMortgageOutput, USAMortgageService, USAMortgageRules, USAMortgageInput, USAMortgageOutput, GermanyMortgageService, GermanyMortgageRules, GermanyMortgageInput, GermanyMortgageOutput };
@@ -2,7 +2,8 @@ export declare enum CalculatorType {
2
2
  INCOME_TAX = "INCOME_TAX",
3
3
  MORTGAGE = "MORTGAGE",
4
4
  LOAN = "LOAN",
5
- CORPORATE_TAX = "CORPORATE_TAX"
5
+ CORPORATE_TAX = "CORPORATE_TAX",
6
+ CAPITAL_GAINS = "CAPITAL_GAINS"
6
7
  }
7
8
  export interface RuleMeta {
8
9
  id: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@novha/calc-engines",
3
- "version": "4.0.0",
3
+ "version": "6.0.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "scripts": {
@@ -0,0 +1,5 @@
1
+ import { Result } from "../domain/types";
2
+
3
+ export interface AustraliaCapitalGainsService {
4
+ calculate(): Result;
5
+ }
@@ -0,0 +1,84 @@
1
+ import { Breakdown, Result } from "../domain/types";
2
+ import { AustraliaCapitalGainsService } from "./AustraliaCapitalGainsService";
3
+ import { Input, Rules, TaxBracket } from "./domain/types";
4
+
5
+ export class AustraliaCapitalGainsServiceImpl implements AustraliaCapitalGainsService {
6
+ private _input: Input;
7
+ private _rules: Rules;
8
+
9
+ constructor(input: Input, rules: Rules) {
10
+ this._input = input;
11
+ this._rules = rules;
12
+ }
13
+
14
+ calculate(): Result {
15
+ const gain = this._input.capitalGain;
16
+
17
+ if (gain <= 0) {
18
+ return {
19
+ taxableGain: 0,
20
+ capitalGainTax: 0,
21
+ socialContributions: 0,
22
+ totalTax: 0,
23
+ effectiveRate: 0,
24
+ netInvestmentIncomeTax: 0,
25
+ breakdowns: []
26
+ };
27
+ }
28
+
29
+ const eligible = this._input.holdingPeriodMonths >= this._rules.cgtDiscountMinMonths;
30
+ const taxableGain = eligible ? gain * (1 - this._rules.cgtDiscount) : gain;
31
+
32
+ const otherIncome = this._input.totalTaxableIncome - gain;
33
+ const { tax, breakdowns } = this.applyBrackets(taxableGain, otherIncome, this._rules.taxBrackets);
34
+
35
+ return {
36
+ taxableGain,
37
+ capitalGainTax: tax,
38
+ socialContributions: 0,
39
+ netInvestmentIncomeTax: 0,
40
+ totalTax: tax,
41
+ effectiveRate: gain > 0 ? (tax / gain) * 100 : 0,
42
+ breakdowns,
43
+ };
44
+ }
45
+
46
+ private applyBrackets(
47
+ taxableGain: number,
48
+ otherIncome: number,
49
+ brackets: TaxBracket[],
50
+ ): { tax: number; breakdowns: Breakdown[] } {
51
+ let tax = 0;
52
+ const breakdowns: Breakdown[] = [];
53
+ let remaining = taxableGain;
54
+ let incomeUsed = otherIncome;
55
+
56
+ for (const bracket of brackets) {
57
+ if (remaining <= 0) break;
58
+
59
+ const upper = bracket.to ?? Infinity;
60
+
61
+ if (incomeUsed >= upper) continue;
62
+
63
+ const bracketStart = Math.max(bracket.from, incomeUsed);
64
+ const bracketSpace = upper - bracketStart;
65
+ const taxable = Math.min(bracketSpace, remaining);
66
+
67
+ if (taxable > 0) {
68
+ const bracketTax = taxable * bracket.rate;
69
+ tax += bracketTax;
70
+ remaining -= taxable;
71
+ incomeUsed += taxable;
72
+
73
+ breakdowns.push({
74
+ from: `${bracket.from}`,
75
+ to: `${bracket.to ?? 'Above'}`,
76
+ rate: bracket.rate,
77
+ amount: bracketTax,
78
+ });
79
+ }
80
+ }
81
+
82
+ return { tax, breakdowns };
83
+ }
84
+ }
@@ -0,0 +1,17 @@
1
+ export interface TaxBracket {
2
+ from: number;
3
+ to: number | null;
4
+ rate: number;
5
+ }
6
+
7
+ export interface Rules {
8
+ cgtDiscount: number;
9
+ cgtDiscountMinMonths: number;
10
+ taxBrackets: TaxBracket[];
11
+ }
12
+
13
+ export interface Input {
14
+ capitalGain: number;
15
+ totalTaxableIncome: number;
16
+ holdingPeriodMonths: number;
17
+ }
@@ -0,0 +1,5 @@
1
+ import { Result } from "../domain/types";
2
+
3
+ export interface CanadaCapitalGainsService {
4
+ calculate(): Result;
5
+ }
@@ -0,0 +1,82 @@
1
+ import { Breakdown, Result } from "../domain/types";
2
+ import { CanadaCapitalGainsService } from "./CanadaCapitalGainsService";
3
+ import { Input, Rules, TaxBracket } from "./domain/types";
4
+
5
+ export class CanadaCapitalGainsServiceImpl implements CanadaCapitalGainsService {
6
+ private _input: Input;
7
+ private _rules: Rules;
8
+
9
+ constructor(input: Input, rules: Rules) {
10
+ this._input = input;
11
+ this._rules = rules;
12
+ }
13
+
14
+ calculate(): Result {
15
+ const gain = this._input.capitalGain;
16
+
17
+ if (gain <= 0) {
18
+ return {
19
+ taxableGain: 0,
20
+ capitalGainTax: 0,
21
+ socialContributions: 0,
22
+ netInvestmentIncomeTax: 0,
23
+ totalTax: 0,
24
+ effectiveRate: 0,
25
+ breakdowns: []
26
+ };
27
+ }
28
+
29
+ const taxableGain = gain * this._rules.inclusionRate;
30
+ const otherIncome = this._input.totalTaxableIncome - gain;
31
+ const { tax, breakdowns } = this.applyBrackets(taxableGain, otherIncome, this._rules.taxBrackets);
32
+
33
+ return {
34
+ taxableGain,
35
+ capitalGainTax: tax,
36
+ socialContributions: 0,
37
+ netInvestmentIncomeTax: 0,
38
+ totalTax: tax,
39
+ effectiveRate: gain > 0 ? (tax / gain) * 100 : 0,
40
+ breakdowns,
41
+ };
42
+ }
43
+
44
+ private applyBrackets(
45
+ taxableGain: number,
46
+ otherIncome: number,
47
+ brackets: TaxBracket[],
48
+ ): { tax: number; breakdowns: Breakdown[] } {
49
+ let tax = 0;
50
+ const breakdowns: Breakdown[] = [];
51
+ let remaining = taxableGain;
52
+ let incomeUsed = otherIncome;
53
+
54
+ for (const bracket of brackets) {
55
+ if (remaining <= 0) break;
56
+
57
+ const upper = bracket.to ?? Infinity;
58
+
59
+ if (incomeUsed >= upper) continue;
60
+
61
+ const bracketStart = Math.max(bracket.from, incomeUsed);
62
+ const bracketSpace = upper - bracketStart;
63
+ const taxable = Math.min(bracketSpace, remaining);
64
+
65
+ if (taxable > 0) {
66
+ const bracketTax = taxable * bracket.rate;
67
+ tax += bracketTax;
68
+ remaining -= taxable;
69
+ incomeUsed += taxable;
70
+
71
+ breakdowns.push({
72
+ from: `${bracket.from}`,
73
+ to: `${bracket.to ?? 'Above'}`,
74
+ rate: bracket.rate,
75
+ amount: bracketTax,
76
+ });
77
+ }
78
+ }
79
+
80
+ return { tax, breakdowns };
81
+ }
82
+ }
@@ -0,0 +1,15 @@
1
+ export interface Rules {
2
+ inclusionRate: number;
3
+ taxBrackets: TaxBracket[];
4
+ }
5
+
6
+ export interface TaxBracket {
7
+ from: number;
8
+ to: number | null;
9
+ rate: number;
10
+ }
11
+
12
+ export interface Input {
13
+ capitalGain: number;
14
+ totalTaxableIncome: number;
15
+ }
@@ -0,0 +1,15 @@
1
+ export interface Breakdown {
2
+ from: string;
3
+ to: string;
4
+ rate: number;
5
+ amount: number;
6
+ }
7
+ export interface Result {
8
+ taxableGain: number;
9
+ capitalGainTax: number;
10
+ socialContributions: number;
11
+ totalTax: number;
12
+ netInvestmentIncomeTax: number;
13
+ effectiveRate: number;
14
+ breakdowns: Breakdown[];
15
+ }
@@ -0,0 +1,5 @@
1
+ import { Result } from "../domain/types";
2
+
3
+ export interface FranceCapitalGainsService {
4
+ calculate(): Result;
5
+ }
@@ -0,0 +1,58 @@
1
+ import { Breakdown, Result } from "../domain/types";
2
+ import { FranceCapitalGainsService } from "./FranceCapitalGainsService";
3
+ import { Input, Rules } from "./domain/types";
4
+
5
+ export class FranceCapitalGainsServiceImpl implements FranceCapitalGainsService {
6
+ private _input: Input;
7
+ private _rules: Rules;
8
+
9
+ constructor(input: Input, rules: Rules) {
10
+ this._input = input;
11
+ this._rules = rules;
12
+ }
13
+
14
+ calculate(): Result {
15
+ const gain = this._input.capitalGain;
16
+
17
+ if (gain <= 0) {
18
+ return {
19
+ taxableGain: gain,
20
+ capitalGainTax: 0,
21
+ socialContributions: 0,
22
+ netInvestmentIncomeTax: 0,
23
+ totalTax: 0,
24
+ effectiveRate: 0,
25
+ breakdowns: []
26
+ };
27
+ }
28
+
29
+ const capitalGainTax = gain * this._rules.flatTaxRate;
30
+ const socialContributions = gain * this._rules.socialContributionsRate;
31
+ const totalTax = capitalGainTax + socialContributions;
32
+
33
+ const breakdowns: Breakdown[] = [
34
+ {
35
+ from: '0',
36
+ to: 'All',
37
+ rate: this._rules.flatTaxRate,
38
+ amount: capitalGainTax,
39
+ },
40
+ {
41
+ from: '0',
42
+ to: 'Social',
43
+ rate: this._rules.socialContributionsRate,
44
+ amount: socialContributions,
45
+ },
46
+ ];
47
+
48
+ return {
49
+ taxableGain: gain,
50
+ capitalGainTax,
51
+ socialContributions,
52
+ netInvestmentIncomeTax: 0,
53
+ totalTax,
54
+ effectiveRate: (totalTax / gain) * 100,
55
+ breakdowns,
56
+ };
57
+ }
58
+ }
@@ -0,0 +1,8 @@
1
+ export interface Rules {
2
+ flatTaxRate: number;
3
+ socialContributionsRate: number;
4
+ }
5
+
6
+ export interface Input {
7
+ capitalGain: number;
8
+ }
@@ -0,0 +1,5 @@
1
+ import { Result } from "../domain/types";
2
+
3
+ export interface GermanyCapitalGainsService {
4
+ calculate(): Result;
5
+ }
@@ -0,0 +1,77 @@
1
+ import { Breakdown, Result } from "../domain/types";
2
+ import { GermanyCapitalGainsService } from "./GermanyCapitalGainsService";
3
+ import { Input, Rules } from "./domain/types";
4
+
5
+ export class GermanyCapitalGainsServiceImpl implements GermanyCapitalGainsService {
6
+ private _input: Input;
7
+ private _rules: Rules;
8
+
9
+ constructor(input: Input, rules: Rules) {
10
+ this._input = input;
11
+ this._rules = rules;
12
+ }
13
+
14
+ calculate(): Result {
15
+ const gain = this._input.capitalGain;
16
+
17
+ if (gain <= 0) {
18
+ return {
19
+ taxableGain: 0,
20
+ capitalGainTax: 0,
21
+ socialContributions: 0,
22
+ netInvestmentIncomeTax: 0,
23
+ totalTax: 0,
24
+ effectiveRate: 0,
25
+ breakdowns: [],
26
+ };
27
+ }
28
+
29
+ const taxableGain = Math.max(0, gain - this._rules.annualExemption);
30
+
31
+ if (taxableGain <= 0) {
32
+ return {
33
+ taxableGain: 0,
34
+ capitalGainTax: 0,
35
+ socialContributions: 0,
36
+ netInvestmentIncomeTax: 0,
37
+ totalTax: 0,
38
+ effectiveRate: 0,
39
+ breakdowns: [{
40
+ from: '0',
41
+ to: `${this._rules.annualExemption}`,
42
+ rate: 0,
43
+ amount: 0,
44
+ }],
45
+ };
46
+ }
47
+
48
+ const capitalGainTax = taxableGain * this._rules.flatTaxRate;
49
+ const socialContributions = capitalGainTax * this._rules.solidaritySurchargeRate;
50
+ const totalTax = capitalGainTax + socialContributions;
51
+
52
+ const breakdowns: Breakdown[] = [
53
+ {
54
+ from: '0',
55
+ to: 'All',
56
+ rate: this._rules.flatTaxRate,
57
+ amount: capitalGainTax,
58
+ },
59
+ {
60
+ from: 'CGT',
61
+ to: 'Solidarity',
62
+ rate: this._rules.solidaritySurchargeRate,
63
+ amount: socialContributions,
64
+ },
65
+ ];
66
+
67
+ return {
68
+ taxableGain,
69
+ capitalGainTax,
70
+ socialContributions,
71
+ netInvestmentIncomeTax: 0,
72
+ totalTax,
73
+ effectiveRate: gain > 0 ? (totalTax / gain) * 100 : 0,
74
+ breakdowns,
75
+ };
76
+ }
77
+ }
@@ -0,0 +1,10 @@
1
+
2
+ export interface Rules {
3
+ flatTaxRate: number;
4
+ solidaritySurchargeRate: number;
5
+ annualExemption: number;
6
+ }
7
+
8
+ export interface Input {
9
+ capitalGain: number;
10
+ }