@novha/calc-engines 5.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.
- package/dist/capital-gains/australia/AustraliaCapitalGainsService.js +1 -1
- package/dist/capital-gains/australia/AustraliaCapitalGainsServiceImpl.js +14 -3
- package/dist/capital-gains/australia/domain/types.js +1 -1
- package/dist/capital-gains/canada/CanadaCapitalGainsService.js +1 -1
- package/dist/capital-gains/canada/CanadaCapitalGainsServiceImpl.js +14 -3
- package/dist/capital-gains/canada/domain/types.js +1 -1
- package/dist/capital-gains/domain/types.js +1 -1
- package/dist/capital-gains/france/FranceCapitalGainsService.js +1 -1
- package/dist/capital-gains/france/FranceCapitalGainsServiceImpl.js +16 -6
- package/dist/capital-gains/france/domain/types.js +1 -1
- package/dist/capital-gains/germany/GermanyCapitalGainsService.js +1 -1
- package/dist/capital-gains/germany/GermanyCapitalGainsServiceImpl.js +15 -12
- package/dist/capital-gains/germany/domain/types.js +1 -1
- package/dist/capital-gains/index.js +25 -0
- package/dist/capital-gains/south-africa/SouthAfricaCapitalGainsService.js +1 -1
- package/dist/capital-gains/south-africa/SouthAfricaCapitalGainsServiceImpl.js +18 -4
- package/dist/capital-gains/south-africa/domain/types.js +1 -1
- package/dist/capital-gains/uk/UKCapitalGainsService.js +1 -1
- package/dist/capital-gains/uk/UKCapitalGainsServiceImpl.js +18 -4
- package/dist/capital-gains/uk/domain/types.js +1 -1
- package/dist/capital-gains/usa/USACapitalGainsService.js +1 -1
- package/dist/capital-gains/usa/USACapitalGainsServiceImpl.js +13 -3
- package/dist/corporate/index.js +18 -0
- package/dist/income-tax/index.js +24 -0
- package/dist/index.js +18 -72
- package/dist/mortgage/france/FranceMortgageService.js +1 -1
- package/dist/mortgage/france/FranceMortgageServiceImpl.js +1 -1
- package/dist/mortgage/index.js +25 -0
- package/dist/types/capital-gains/australia/AustraliaCapitalGainsService.d.ts +1 -1
- package/dist/types/capital-gains/australia/AustraliaCapitalGainsServiceImpl.d.ts +2 -1
- package/dist/types/capital-gains/australia/domain/types.d.ts +0 -7
- package/dist/types/capital-gains/canada/CanadaCapitalGainsService.d.ts +1 -1
- package/dist/types/capital-gains/canada/CanadaCapitalGainsServiceImpl.d.ts +2 -1
- package/dist/types/capital-gains/canada/domain/types.d.ts +0 -7
- package/dist/types/capital-gains/domain/types.d.ts +9 -0
- package/dist/types/capital-gains/france/FranceCapitalGainsService.d.ts +1 -1
- package/dist/types/capital-gains/france/FranceCapitalGainsServiceImpl.d.ts +2 -1
- package/dist/types/capital-gains/france/domain/types.d.ts +0 -8
- package/dist/types/capital-gains/germany/GermanyCapitalGainsService.d.ts +1 -1
- package/dist/types/capital-gains/germany/GermanyCapitalGainsServiceImpl.d.ts +2 -1
- package/dist/types/capital-gains/germany/domain/types.d.ts +0 -9
- package/dist/types/capital-gains/index.d.ts +15 -0
- package/dist/types/capital-gains/south-africa/SouthAfricaCapitalGainsService.d.ts +1 -1
- package/dist/types/capital-gains/south-africa/SouthAfricaCapitalGainsServiceImpl.d.ts +2 -1
- package/dist/types/capital-gains/south-africa/domain/types.d.ts +0 -7
- package/dist/types/capital-gains/uk/UKCapitalGainsService.d.ts +1 -1
- package/dist/types/capital-gains/uk/UKCapitalGainsServiceImpl.d.ts +2 -1
- package/dist/types/capital-gains/uk/domain/types.d.ts +0 -7
- package/dist/types/capital-gains/usa/USACapitalGainsService.d.ts +1 -1
- package/dist/types/capital-gains/usa/USACapitalGainsServiceImpl.d.ts +2 -1
- package/dist/types/corporate/index.d.ts +15 -0
- package/dist/types/income-tax/index.d.ts +15 -0
- package/dist/types/index.d.ts +4 -56
- package/dist/types/mortgage/france/FranceMortgageService.d.ts +1 -1
- package/dist/types/mortgage/france/FranceMortgageServiceImpl.d.ts +1 -1
- package/dist/types/mortgage/index.d.ts +15 -0
- package/package.json +1 -1
- package/src/capital-gains/australia/AustraliaCapitalGainsService.ts +1 -1
- package/src/capital-gains/australia/AustraliaCapitalGainsServiceImpl.ts +15 -4
- package/src/capital-gains/australia/domain/types.ts +0 -9
- package/src/capital-gains/canada/CanadaCapitalGainsService.ts +1 -1
- package/src/capital-gains/canada/CanadaCapitalGainsServiceImpl.ts +15 -4
- package/src/capital-gains/canada/domain/types.ts +0 -9
- package/src/capital-gains/domain/types.ts +9 -0
- package/src/capital-gains/france/FranceCapitalGainsService.ts +1 -1
- package/src/capital-gains/france/FranceCapitalGainsServiceImpl.ts +17 -7
- package/src/capital-gains/france/domain/types.ts +1 -11
- package/src/capital-gains/germany/GermanyCapitalGainsService.ts +1 -1
- package/src/capital-gains/germany/GermanyCapitalGainsServiceImpl.ts +16 -13
- package/src/capital-gains/germany/domain/types.ts +0 -10
- package/src/capital-gains/index.ts +72 -0
- package/src/capital-gains/south-africa/SouthAfricaCapitalGainsService.ts +1 -1
- package/src/capital-gains/south-africa/SouthAfricaCapitalGainsServiceImpl.ts +19 -5
- package/src/capital-gains/south-africa/domain/types.ts +0 -9
- package/src/capital-gains/uk/UKCapitalGainsService.ts +1 -1
- package/src/capital-gains/uk/UKCapitalGainsServiceImpl.ts +19 -5
- package/src/capital-gains/uk/domain/types.ts +0 -9
- package/src/capital-gains/usa/USACapitalGainsService.ts +1 -1
- package/src/capital-gains/usa/USACapitalGainsServiceImpl.ts +14 -4
- package/src/corporate/index.ts +79 -0
- package/src/income-tax/index.ts +72 -0
- package/src/index.ts +6 -202
- package/src/mortgage/france/FranceMortgageService.ts +1 -1
- package/src/mortgage/france/FranceMortgageServiceImpl.ts +1 -1
- package/src/mortgage/index.ts +87 -0
- package/test/australia-capital-gains.test.ts +5 -5
- package/test/canada-capital-gains.test.ts +5 -5
- package/test/france-capital-gains.test.ts +1 -1
- package/test/germany-capital-gains.test.ts +4 -4
- package/test/south-africa-capital-gains.test.ts +6 -6
- package/test/uk-capital-gains.test.ts +7 -7
- package/test/usa-capital-gains.test.ts +4 -4
|
@@ -29,7 +29,7 @@ describe('CanadaCapitalGainsServiceImpl', () => {
|
|
|
29
29
|
|
|
30
30
|
// Taxable gain = 20000, all in first bracket (15%)
|
|
31
31
|
expect(result.taxableGain).toBe(20000);
|
|
32
|
-
expect(result.
|
|
32
|
+
expect(result.capitalGainTax).toBe(20000 * 0.15);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
it('returns zero for zero gain', () => {
|
|
@@ -37,7 +37,7 @@ describe('CanadaCapitalGainsServiceImpl', () => {
|
|
|
37
37
|
const service = new CanadaCapitalGainsServiceImpl(input, canadaCapitalGainsRules);
|
|
38
38
|
const result = service.calculate();
|
|
39
39
|
|
|
40
|
-
expect(result.
|
|
40
|
+
expect(result.capitalGainTax).toBe(0);
|
|
41
41
|
expect(result.taxableGain).toBe(0);
|
|
42
42
|
expect(result.breakdowns).toHaveLength(0);
|
|
43
43
|
});
|
|
@@ -47,7 +47,7 @@ describe('CanadaCapitalGainsServiceImpl', () => {
|
|
|
47
47
|
const service = new CanadaCapitalGainsServiceImpl(input, canadaCapitalGainsRules);
|
|
48
48
|
const result = service.calculate();
|
|
49
49
|
|
|
50
|
-
expect(result.
|
|
50
|
+
expect(result.capitalGainTax).toBe(0);
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
it('calculates effective rate based on full gain', () => {
|
|
@@ -55,7 +55,7 @@ describe('CanadaCapitalGainsServiceImpl', () => {
|
|
|
55
55
|
const service = new CanadaCapitalGainsServiceImpl(input, canadaCapitalGainsRules);
|
|
56
56
|
const result = service.calculate();
|
|
57
57
|
|
|
58
|
-
expect(result.effectiveRate).toBe((result.
|
|
58
|
+
expect(result.effectiveRate).toBe((result.capitalGainTax / 100000) * 100);
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
it('stacks gain on top of other income', () => {
|
|
@@ -66,6 +66,6 @@ describe('CanadaCapitalGainsServiceImpl', () => {
|
|
|
66
66
|
// Other income = 50000, taxable gain = 10000
|
|
67
67
|
// 10000 falls in first bracket (50000-55867 = 5867 at 15%, rest at 20.5%)
|
|
68
68
|
expect(result.taxableGain).toBe(10000);
|
|
69
|
-
expect(result.
|
|
69
|
+
expect(result.capitalGainTax).toBeGreaterThan(0);
|
|
70
70
|
});
|
|
71
71
|
});
|
|
@@ -13,7 +13,7 @@ describe('FranceCapitalGainsServiceImpl', () => {
|
|
|
13
13
|
const service = new FranceCapitalGainsServiceImpl(input, franceCapitalGainsRules);
|
|
14
14
|
const result = service.calculate();
|
|
15
15
|
|
|
16
|
-
expect(result.
|
|
16
|
+
expect(result.capitalGainTax).toBe(12800);
|
|
17
17
|
expect(result.socialContributions).toBe(17200);
|
|
18
18
|
expect(result.totalTax).toBe(30000);
|
|
19
19
|
});
|
|
@@ -28,8 +28,8 @@ describe('GermanyCapitalGainsServiceImpl', () => {
|
|
|
28
28
|
// Solidarity = 2500 * 5.5% = 137.5
|
|
29
29
|
// Total = 2637.5
|
|
30
30
|
expect(result.taxableGain).toBe(10000);
|
|
31
|
-
expect(result.
|
|
32
|
-
expect(result.
|
|
31
|
+
expect(result.capitalGainTax).toBe(2500);
|
|
32
|
+
expect(result.socialContributions).toBe(137.5);
|
|
33
33
|
expect(result.totalTax).toBe(2637.5);
|
|
34
34
|
});
|
|
35
35
|
|
|
@@ -78,8 +78,8 @@ describe('GermanyCapitalGainsServiceImpl', () => {
|
|
|
78
78
|
const cgt = taxable * 0.25;
|
|
79
79
|
const soli = cgt * 0.055;
|
|
80
80
|
expect(result.taxableGain).toBe(taxable);
|
|
81
|
-
expect(result.
|
|
82
|
-
expect(result.
|
|
81
|
+
expect(result.capitalGainTax).toBe(cgt);
|
|
82
|
+
expect(result.socialContributions).toBeCloseTo(soli, 2);
|
|
83
83
|
expect(result.totalTax).toBeCloseTo(cgt + soli, 2);
|
|
84
84
|
});
|
|
85
85
|
});
|
|
@@ -23,7 +23,7 @@ describe('SouthAfricaCapitalGainsServiceImpl', () => {
|
|
|
23
23
|
const result = service.calculate();
|
|
24
24
|
|
|
25
25
|
expect(result.taxableGain).toBe(0);
|
|
26
|
-
expect(result.
|
|
26
|
+
expect(result.capitalGainTax).toBe(0);
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
it('applies 40% inclusion rate after exclusion', () => {
|
|
@@ -42,7 +42,7 @@ describe('SouthAfricaCapitalGainsServiceImpl', () => {
|
|
|
42
42
|
const result = service.calculate();
|
|
43
43
|
|
|
44
44
|
// Taxable gain = 40000, first bracket rate 18%
|
|
45
|
-
expect(result.
|
|
45
|
+
expect(result.capitalGainTax).toBe(40000 * 0.18);
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
it('returns zero for zero gain', () => {
|
|
@@ -50,7 +50,7 @@ describe('SouthAfricaCapitalGainsServiceImpl', () => {
|
|
|
50
50
|
const service = new SouthAfricaCapitalGainsServiceImpl(input, southAfricaCapitalGainsRules);
|
|
51
51
|
const result = service.calculate();
|
|
52
52
|
|
|
53
|
-
expect(result.
|
|
53
|
+
expect(result.capitalGainTax).toBe(0);
|
|
54
54
|
expect(result.breakdowns).toHaveLength(0);
|
|
55
55
|
});
|
|
56
56
|
|
|
@@ -59,7 +59,7 @@ describe('SouthAfricaCapitalGainsServiceImpl', () => {
|
|
|
59
59
|
const service = new SouthAfricaCapitalGainsServiceImpl(input, southAfricaCapitalGainsRules);
|
|
60
60
|
const result = service.calculate();
|
|
61
61
|
|
|
62
|
-
expect(result.
|
|
62
|
+
expect(result.capitalGainTax).toBe(0);
|
|
63
63
|
});
|
|
64
64
|
|
|
65
65
|
it('calculates effective rate based on full gain', () => {
|
|
@@ -67,7 +67,7 @@ describe('SouthAfricaCapitalGainsServiceImpl', () => {
|
|
|
67
67
|
const service = new SouthAfricaCapitalGainsServiceImpl(input, southAfricaCapitalGainsRules);
|
|
68
68
|
const result = service.calculate();
|
|
69
69
|
|
|
70
|
-
expect(result.effectiveRate).toBe((result.
|
|
70
|
+
expect(result.effectiveRate).toBe((result.capitalGainTax / 140000) * 100);
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
it('stacks included gain on other income', () => {
|
|
@@ -79,6 +79,6 @@ describe('SouthAfricaCapitalGainsServiceImpl', () => {
|
|
|
79
79
|
// Taxable gain = 500000 * 0.40 = 200000
|
|
80
80
|
// Other income = 300000
|
|
81
81
|
expect(result.taxableGain).toBe(200000);
|
|
82
|
-
expect(result.
|
|
82
|
+
expect(result.capitalGainTax).toBeGreaterThan(0);
|
|
83
83
|
});
|
|
84
84
|
});
|
|
@@ -16,7 +16,7 @@ describe('UKCapitalGainsServiceImpl', () => {
|
|
|
16
16
|
const result = service.calculate();
|
|
17
17
|
|
|
18
18
|
expect(result.taxableGain).toBe(0);
|
|
19
|
-
expect(result.
|
|
19
|
+
expect(result.capitalGainTax).toBe(0);
|
|
20
20
|
});
|
|
21
21
|
|
|
22
22
|
it('applies basic rate for basic-rate taxpayer', () => {
|
|
@@ -27,7 +27,7 @@ describe('UKCapitalGainsServiceImpl', () => {
|
|
|
27
27
|
// Taxable gain = 13000 - 3000 = 10000
|
|
28
28
|
// Basic rate remaining = 37700 - 20000 = 17700 (enough for all)
|
|
29
29
|
expect(result.taxableGain).toBe(10000);
|
|
30
|
-
expect(result.
|
|
30
|
+
expect(result.capitalGainTax).toBe(10000 * 0.10);
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
it('applies higher rate for higher-rate taxpayer', () => {
|
|
@@ -37,7 +37,7 @@ describe('UKCapitalGainsServiceImpl', () => {
|
|
|
37
37
|
|
|
38
38
|
// Taxable gain = 53000 - 3000 = 50000, all at higher rate (income > basic rate limit)
|
|
39
39
|
expect(result.taxableGain).toBe(50000);
|
|
40
|
-
expect(result.
|
|
40
|
+
expect(result.capitalGainTax).toBe(50000 * 0.20);
|
|
41
41
|
});
|
|
42
42
|
|
|
43
43
|
it('splits between basic and higher rate', () => {
|
|
@@ -49,7 +49,7 @@ describe('UKCapitalGainsServiceImpl', () => {
|
|
|
49
49
|
// Basic rate remaining = 37700 - 30000 = 7700
|
|
50
50
|
// 7700 at 10% = 770, 12300 at 20% = 2460
|
|
51
51
|
expect(result.taxableGain).toBe(20000);
|
|
52
|
-
expect(result.
|
|
52
|
+
expect(result.capitalGainTax).toBe(7700 * 0.10 + 12300 * 0.20);
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
it('returns zero for zero gain', () => {
|
|
@@ -57,7 +57,7 @@ describe('UKCapitalGainsServiceImpl', () => {
|
|
|
57
57
|
const service = new UKCapitalGainsServiceImpl(input, ukCapitalGainsRules);
|
|
58
58
|
const result = service.calculate();
|
|
59
59
|
|
|
60
|
-
expect(result.
|
|
60
|
+
expect(result.capitalGainTax).toBe(0);
|
|
61
61
|
expect(result.breakdowns).toHaveLength(0);
|
|
62
62
|
});
|
|
63
63
|
|
|
@@ -66,7 +66,7 @@ describe('UKCapitalGainsServiceImpl', () => {
|
|
|
66
66
|
const service = new UKCapitalGainsServiceImpl(input, ukCapitalGainsRules);
|
|
67
67
|
const result = service.calculate();
|
|
68
68
|
|
|
69
|
-
expect(result.
|
|
69
|
+
expect(result.capitalGainTax).toBe(0);
|
|
70
70
|
});
|
|
71
71
|
|
|
72
72
|
it('calculates effective rate based on full gain', () => {
|
|
@@ -74,6 +74,6 @@ describe('UKCapitalGainsServiceImpl', () => {
|
|
|
74
74
|
const service = new UKCapitalGainsServiceImpl(input, ukCapitalGainsRules);
|
|
75
75
|
const result = service.calculate();
|
|
76
76
|
|
|
77
|
-
expect(result.effectiveRate).toBe((result.
|
|
77
|
+
expect(result.effectiveRate).toBe((result.capitalGainTax / 53000) * 100);
|
|
78
78
|
});
|
|
79
79
|
});
|
|
@@ -26,7 +26,7 @@ describe('USACapitalGainsServiceImpl', () => {
|
|
|
26
26
|
const service = new USACapitalGainsServiceImpl(input, usaCapitalGainsRules);
|
|
27
27
|
const result = service.calculate();
|
|
28
28
|
|
|
29
|
-
expect(result.
|
|
29
|
+
expect(result.capitalGainTax).toBe(0);
|
|
30
30
|
expect(result.netInvestmentIncomeTax).toBe(0);
|
|
31
31
|
expect(result.totalTax).toBe(0);
|
|
32
32
|
});
|
|
@@ -37,7 +37,7 @@ describe('USACapitalGainsServiceImpl', () => {
|
|
|
37
37
|
const result = service.calculate();
|
|
38
38
|
|
|
39
39
|
// Other income = 50000, gain falls in 50000-100000 range, all at 15%
|
|
40
|
-
expect(result.
|
|
40
|
+
expect(result.capitalGainTax).toBe(50000 * 0.15);
|
|
41
41
|
expect(result.netInvestmentIncomeTax).toBe(0);
|
|
42
42
|
});
|
|
43
43
|
|
|
@@ -47,7 +47,7 @@ describe('USACapitalGainsServiceImpl', () => {
|
|
|
47
47
|
const result = service.calculate();
|
|
48
48
|
|
|
49
49
|
expect(result.netInvestmentIncomeTax).toBe(100000 * 0.038);
|
|
50
|
-
expect(result.totalTax).toBe(result.
|
|
50
|
+
expect(result.totalTax).toBe(result.capitalGainTax + result.netInvestmentIncomeTax);
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
it('applies short-term rates for gains held <= 12 months', () => {
|
|
@@ -56,7 +56,7 @@ describe('USACapitalGainsServiceImpl', () => {
|
|
|
56
56
|
const result = service.calculate();
|
|
57
57
|
|
|
58
58
|
// Short-term gain taxed as ordinary income from 0-50000
|
|
59
|
-
expect(result.
|
|
59
|
+
expect(result.capitalGainTax).toBeGreaterThan(0);
|
|
60
60
|
expect(result.breakdowns.length).toBeGreaterThan(0);
|
|
61
61
|
});
|
|
62
62
|
|