@novha/calc-engines 1.6.4 → 1.7.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/corporate/canada/CanadaCorporateTaxService.js +3 -0
- package/dist/corporate/canada/CanadaCorporateTaxServiceImpl.js +54 -0
- package/dist/corporate/canada/domain/types.js +3 -0
- package/dist/corporate/domain/types.js +2 -0
- package/dist/corporate/france/FranceCorporateTaxService.js +3 -0
- package/dist/corporate/france/FranceCorporateTaxServiceImpl.js +59 -0
- package/dist/corporate/france/domain/types.js +3 -0
- package/dist/corporate/south-africa/SouthAfricaCorporateTaxService.js +3 -0
- package/dist/corporate/south-africa/SouthAfricaCorporateTaxServiceImpl.js +56 -0
- package/dist/corporate/south-africa/domain/types.js +3 -0
- package/dist/index.js +8 -2
- package/dist/mortgage/canada/CanadaMortgageServiceImpl.js +2 -2
- package/dist/mortgage/canada/domain/types.js +1 -1
- package/dist/types/corporate/canada/CanadaCorporateTaxService.d.ts +4 -0
- package/dist/types/corporate/canada/CanadaCorporateTaxServiceImpl.d.ts +9 -0
- package/dist/types/corporate/canada/domain/types.d.ts +42 -0
- package/dist/types/corporate/domain/types.d.ts +0 -0
- package/dist/types/corporate/france/FranceCorporateTaxService.d.ts +4 -0
- package/dist/types/corporate/france/FranceCorporateTaxServiceImpl.d.ts +9 -0
- package/dist/types/corporate/france/domain/types.d.ts +48 -0
- package/dist/types/corporate/south-africa/SouthAfricaCorporateTaxService.d.ts +4 -0
- package/dist/types/corporate/south-africa/SouthAfricaCorporateTaxServiceImpl.d.ts +9 -0
- package/dist/types/corporate/south-africa/domain/types.d.ts +32 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/mortgage/canada/domain/types.d.ts +1 -1
- package/package.json +1 -1
- package/src/corporate/canada/CanadaCorporateTaxService.ts +5 -0
- package/src/corporate/canada/CanadaCorporateTaxServiceImpl.ts +67 -0
- package/src/corporate/canada/domain/types.ts +54 -0
- package/src/corporate/domain/types.ts +0 -0
- package/src/corporate/france/FranceCorporateTaxService.ts +5 -0
- package/src/corporate/france/FranceCorporateTaxServiceImpl.ts +73 -0
- package/src/corporate/france/domain/types.ts +60 -0
- package/src/corporate/south-africa/SouthAfricaCorporateTaxService.ts +5 -0
- package/src/corporate/south-africa/SouthAfricaCorporateTaxServiceImpl.ts +74 -0
- package/src/corporate/south-africa/domain/types.ts +40 -0
- package/src/index.ts +20 -0
- package/src/mortgage/canada/CanadaMortgageServiceImpl.ts +1 -1
- package/src/mortgage/canada/domain/types.ts +1 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3Jwb3JhdGUvY2FuYWRhL0NhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElucHV0LCBSdWxlcywgUmVzdWx0IH0gZnJvbSAnLi4vY2FuYWRhL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZSB7XG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdDtcbn0iXX0=
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CanadaCorporateTaxServiceImpl = void 0;
|
|
4
|
+
class CanadaCorporateTaxServiceImpl {
|
|
5
|
+
constructor(input, rules) {
|
|
6
|
+
this._input = input;
|
|
7
|
+
this._rules = rules;
|
|
8
|
+
}
|
|
9
|
+
calculate() {
|
|
10
|
+
const result = this.applyRules(this._rules, this._input);
|
|
11
|
+
const totalTax = result.tax;
|
|
12
|
+
return {
|
|
13
|
+
corporateTax: totalTax,
|
|
14
|
+
effectiveTaxRate: this._input.taxableIncome > 0
|
|
15
|
+
? (totalTax / this._input.taxableIncome) * 100
|
|
16
|
+
: 0,
|
|
17
|
+
breakdown: result.breakdown,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
applyRules(rules, input) {
|
|
21
|
+
const regime = input.isSmallBusiness
|
|
22
|
+
? rules.regimes.smallBusiness
|
|
23
|
+
: rules.regimes.general;
|
|
24
|
+
if (regime.type === 'flat') {
|
|
25
|
+
const tax = input.taxableIncome * regime.rate;
|
|
26
|
+
return {
|
|
27
|
+
tax,
|
|
28
|
+
breakdown: { flatTax: tax },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (regime.type === 'progressive') {
|
|
32
|
+
let remaining = input.taxableIncome;
|
|
33
|
+
let tax = 0;
|
|
34
|
+
const breakdown = {};
|
|
35
|
+
for (const bracket of regime.brackets) {
|
|
36
|
+
if (remaining <= 0)
|
|
37
|
+
break;
|
|
38
|
+
const upper = bracket.to ?? Infinity;
|
|
39
|
+
const taxable = Math.min(upper - bracket.from, remaining);
|
|
40
|
+
const bracketTax = taxable * bracket.rate;
|
|
41
|
+
tax += bracketTax;
|
|
42
|
+
remaining -= taxable;
|
|
43
|
+
const bracketKey = bracket.to === null
|
|
44
|
+
? `bracket_${bracket.from}_and_above`
|
|
45
|
+
: `bracket_${bracket.from}_to_${bracket.to}`;
|
|
46
|
+
breakdown[bracketKey] = bracketTax;
|
|
47
|
+
}
|
|
48
|
+
return { tax, breakdown };
|
|
49
|
+
}
|
|
50
|
+
throw new Error('Unsupported regime type');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.CanadaCorporateTaxServiceImpl = CanadaCorporateTaxServiceImpl;
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29ycG9yYXRlL2NhbmFkYS9DYW5hZGFDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxNQUFhLDZCQUE2QjtJQUl0QyxZQUFZLEtBQVksRUFBRSxLQUFZO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRTVCLE9BQU87WUFDSCxZQUFZLEVBQUUsUUFBUTtZQUN0QixnQkFBZ0IsRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDO2dCQUN6QixDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHO2dCQUM5QyxDQUFDLENBQUMsQ0FBQztZQUNYLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM5QixDQUFDO0lBQ04sQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFZLEVBQUUsS0FBWTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsZUFBZTtZQUNoQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQzdCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUU1QixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzlDLE9BQU87Z0JBQ0gsR0FBRztnQkFDSCxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO2FBQzlCLENBQUM7UUFDTixDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDcEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ1osTUFBTSxTQUFTLEdBQTJCLEVBQUUsQ0FBQztZQUU3QyxLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxTQUFTLElBQUksQ0FBQztvQkFBRSxNQUFNO2dCQUUxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQztnQkFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFMUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQzFDLEdBQUcsSUFBSSxVQUFVLENBQUM7Z0JBQ2xCLFNBQVMsSUFBSSxPQUFPLENBQUM7Z0JBRXJCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSTtvQkFDbEMsQ0FBQyxDQUFDLFdBQVcsT0FBTyxDQUFDLElBQUksWUFBWTtvQkFDckMsQ0FBQyxDQUFDLFdBQVcsT0FBTyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pELFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDdkMsQ0FBQztZQUVELE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0o7QUEvREQsc0VBK0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUnVsZXMsIElucHV0LCBSZXN1bHQsIFByb2dyZXNzaXZlVGF4QnJhY2tldCB9IGZyb20gJy4vZG9tYWluL3R5cGVzJztcbmltcG9ydCB7IENhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2UgfSBmcm9tICcuL0NhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZUltcGwgaW1wbGVtZW50cyBDYW5hZGFDb3Jwb3JhdGVUYXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9pbnB1dDogSW5wdXQ7XG4gICAgcHJpdmF0ZSBfcnVsZXM6IFJ1bGVzO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IElucHV0LCBydWxlczogUnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVJ1bGVzKHRoaXMuX3J1bGVzLCB0aGlzLl9pbnB1dCk7XG5cbiAgICAgICAgY29uc3QgdG90YWxUYXggPSByZXN1bHQudGF4O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb3Jwb3JhdGVUYXg6IHRvdGFsVGF4LFxuICAgICAgICAgICAgZWZmZWN0aXZlVGF4UmF0ZTpcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dC50YXhhYmxlSW5jb21lID4gMFxuICAgICAgICAgICAgICAgICAgICA/ICh0b3RhbFRheCAvIHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUpICogMTAwXG4gICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGJyZWFrZG93bjogcmVzdWx0LmJyZWFrZG93bixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5UnVsZXMocnVsZXM6IFJ1bGVzLCBpbnB1dDogSW5wdXQpOiB7IHRheDogbnVtYmVyOyBicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfSB7XG4gICAgICAgIGNvbnN0IHJlZ2ltZSA9IGlucHV0LmlzU21hbGxCdXNpbmVzc1xuICAgICAgICAgICAgPyBydWxlcy5yZWdpbWVzLnNtYWxsQnVzaW5lc3NcbiAgICAgICAgICAgIDogcnVsZXMucmVnaW1lcy5nZW5lcmFsO1xuXG4gICAgICAgIGlmIChyZWdpbWUudHlwZSA9PT0gJ2ZsYXQnKSB7XG4gICAgICAgICAgICBjb25zdCB0YXggPSBpbnB1dC50YXhhYmxlSW5jb21lICogcmVnaW1lLnJhdGU7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRheCxcbiAgICAgICAgICAgICAgICBicmVha2Rvd246IHsgZmxhdFRheDogdGF4IH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZ2ltZS50eXBlID09PSAncHJvZ3Jlc3NpdmUnKSB7XG4gICAgICAgICAgICBsZXQgcmVtYWluaW5nID0gaW5wdXQudGF4YWJsZUluY29tZTtcbiAgICAgICAgICAgIGxldCB0YXggPSAwO1xuICAgICAgICAgICAgY29uc3QgYnJlYWtkb3duOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYnJhY2tldCBvZiByZWdpbWUuYnJhY2tldHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdXBwZXIgPSBicmFja2V0LnRvID8/IEluZmluaXR5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHRheGFibGUgPSBNYXRoLm1pbih1cHBlciAtIGJyYWNrZXQuZnJvbSwgcmVtYWluaW5nKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRUYXggPSB0YXhhYmxlICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSBicmFja2V0VGF4O1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSB0YXhhYmxlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYnJhY2tldEtleSA9IGJyYWNrZXQudG8gPT09IG51bGwgXG4gICAgICAgICAgICAgICAgICAgID8gYGJyYWNrZXRfJHticmFja2V0LmZyb219X2FuZF9hYm92ZWBcbiAgICAgICAgICAgICAgICAgICAgOiBgYnJhY2tldF8ke2JyYWNrZXQuZnJvbX1fdG9fJHticmFja2V0LnRvfWA7XG4gICAgICAgICAgICAgICAgYnJlYWtkb3duW2JyYWNrZXRLZXldID0gYnJhY2tldFRheDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgdGF4LCBicmVha2Rvd24gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgcmVnaW1lIHR5cGUnKTtcbiAgICB9XG59Il19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL2NhbmFkYS9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2ltZUl0ZW0ge1xuICAgIHR5cGU6ICdmbGF0JyB8ICdwcm9ncmVzc2l2ZSc7XG4gICAgcmF0ZTogbnVtYmVyO1xuICAgIG1heEluY29tZT86IG51bWJlcjtcbiAgICBicmFja2V0cz86IFByb2dyZXNzaXZlVGF4QnJhY2tldFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2ltZSB7XG4gICAgZ2VuZXJhbDogUmVnaW1lSXRlbVtdO1xuICAgIHNtYWxsQnVzaW5lc3M6IFJlZ2ltZUl0ZW1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnB1dCB7XG5cdHRheGFibGVJbmNvbWU6IG51bWJlcjtcbiAgICBpc1NtYWxsQnVzaW5lc3M6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0IHtcblx0bmFtZTogc3RyaW5nO1xuXHR0eXBlOiAnbnVtYmVyJyB8ICdzdHJpbmcnO1xuXHR1bml0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsYXRUYXhSdWxlIHtcblx0dHlwZTogJ2ZsYXQnO1xuXHRyYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NpdmVUYXhCcmFja2V0IHtcblx0ZnJvbTogbnVtYmVyO1xuXHR0bzogbnVtYmVyIHwgbnVsbDtcblx0cmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzaXZlVGF4UnVsZSB7XG5cdHR5cGU6ICdwcm9ncmVzc2l2ZSc7XG5cdGJyYWNrZXRzOiBQcm9ncmVzc2l2ZVRheEJyYWNrZXRbXTtcblx0ZWxpZ2liaWxpdHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBUYXhSdWxlID0gRmxhdFRheFJ1bGUgfCBQcm9ncmVzc2l2ZVRheFJ1bGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICBcdHJlZ2ltZXM6IFJlY29yZDxzdHJpbmcsIFRheFJ1bGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdCB7XG5cdGNvcnBvcmF0ZVRheDogbnVtYmVyO1xuXHRlZmZlY3RpdmVUYXhSYXRlOiBudW1iZXI7XG5cdGJyZWFrZG93bjogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbn1cblxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3Jwb3JhdGUvZnJhbmNlL0ZyYW5jZUNvcnBvcmF0ZVRheFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc3VsdCB9IGZyb20gJy4vZG9tYWluL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0O1xufSJdfQ==
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FranceCorporateTaxServiceImpl = void 0;
|
|
4
|
+
class FranceCorporateTaxServiceImpl {
|
|
5
|
+
constructor(input, rules) {
|
|
6
|
+
this._input = input;
|
|
7
|
+
this._rules = rules;
|
|
8
|
+
}
|
|
9
|
+
calculate() {
|
|
10
|
+
const result = this.applyRules(this._rules, this._input);
|
|
11
|
+
const totalTax = result.tax;
|
|
12
|
+
return {
|
|
13
|
+
corporateTax: totalTax,
|
|
14
|
+
effectiveTaxRate: this._input.taxableIncome > 0
|
|
15
|
+
? (totalTax / this._input.taxableIncome) * 100
|
|
16
|
+
: 0,
|
|
17
|
+
breakdown: result.breakdown,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
applyRules(rules, input) {
|
|
21
|
+
const regime = input.isSmallBusiness
|
|
22
|
+
? rules.regimes.smallBusiness
|
|
23
|
+
: rules.regimes.general;
|
|
24
|
+
if (regime.conditions?.maxTurnover) {
|
|
25
|
+
if (input.annualTurnover > regime.conditions.maxTurnover) {
|
|
26
|
+
throw new Error('SME regime not applicable: turnover exceeded');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (regime.type === 'flat') {
|
|
30
|
+
const tax = input.taxableIncome * regime.rate;
|
|
31
|
+
return {
|
|
32
|
+
tax,
|
|
33
|
+
breakdown: { flatTax: tax },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (regime.type === 'progressive') {
|
|
37
|
+
let remaining = input.taxableIncome;
|
|
38
|
+
let tax = 0;
|
|
39
|
+
const breakdown = {};
|
|
40
|
+
for (const bracket of regime.brackets) {
|
|
41
|
+
if (remaining <= 0)
|
|
42
|
+
break;
|
|
43
|
+
const upper = bracket.to ?? Infinity;
|
|
44
|
+
const taxable = Math.min(upper - bracket.from, remaining);
|
|
45
|
+
const bracketTax = taxable * bracket.rate;
|
|
46
|
+
tax += bracketTax;
|
|
47
|
+
remaining -= taxable;
|
|
48
|
+
const bracketKey = bracket.to === null
|
|
49
|
+
? `bracket_${bracket.from}_and_above`
|
|
50
|
+
: `bracket_${bracket.from}_to_${bracket.to}`;
|
|
51
|
+
breakdown[bracketKey] = bracketTax;
|
|
52
|
+
}
|
|
53
|
+
return { tax, breakdown };
|
|
54
|
+
}
|
|
55
|
+
throw new Error('Unsupported regime type');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.FranceCorporateTaxServiceImpl = FranceCorporateTaxServiceImpl;
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29ycG9yYXRlL2ZyYW5jZS9GcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxNQUFhLDZCQUE2QjtJQUl0QyxZQUFZLEtBQVksRUFBRSxLQUFZO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRTVCLE9BQU87WUFDSCxZQUFZLEVBQUUsUUFBUTtZQUN0QixnQkFBZ0IsRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDO2dCQUN6QixDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHO2dCQUM5QyxDQUFDLENBQUMsQ0FBQztZQUNYLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM5QixDQUFDO0lBQ04sQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFZLEVBQUUsS0FBWTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsZUFBZTtZQUNoQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQzdCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUU1QixJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDakMsSUFBSSxLQUFLLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUNwRSxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDOUMsT0FBTztnQkFDSCxHQUFHO2dCQUNILFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7YUFDOUIsQ0FBQztRQUNOLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDaEMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztZQUNwQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixNQUFNLFNBQVMsR0FBMkIsRUFBRSxDQUFDO1lBRTdDLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLFNBQVMsSUFBSSxDQUFDO29CQUFFLE1BQU07Z0JBRTFCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDO2dCQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUUxRCxNQUFNLFVBQVUsR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDMUMsR0FBRyxJQUFJLFVBQVUsQ0FBQztnQkFDbEIsU0FBUyxJQUFJLE9BQU8sQ0FBQztnQkFFckIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEVBQUUsS0FBSyxJQUFJO29CQUNsQyxDQUFDLENBQUMsV0FBVyxPQUFPLENBQUMsSUFBSSxZQUFZO29CQUNyQyxDQUFDLENBQUMsV0FBVyxPQUFPLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakQsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUN2QyxDQUFDO1lBRUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDSjtBQXJFRCxzRUFxRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSdWxlcywgSW5wdXQsIFJlc3VsdCwgUHJvZ3Jlc3NpdmVUYXhCcmFja2V0IH0gZnJvbSAnLi9kb21haW4vdHlwZXMnO1xuaW1wb3J0IHsgRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZSB9IGZyb20gJy4vRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEZyYW5jZUNvcnBvcmF0ZVRheFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2lucHV0OiBJbnB1dDtcbiAgICBwcml2YXRlIF9ydWxlczogUnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogSW5wdXQsIHJ1bGVzOiBSdWxlcykge1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZSgpOiBSZXN1bHQge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5UnVsZXModGhpcy5fcnVsZXMsIHRoaXMuX2lucHV0KTtcblxuICAgICAgICBjb25zdCB0b3RhbFRheCA9IHJlc3VsdC50YXg7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvcnBvcmF0ZVRheDogdG90YWxUYXgsXG4gICAgICAgICAgICBlZmZlY3RpdmVUYXhSYXRlOlxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUgPiAwXG4gICAgICAgICAgICAgICAgICAgID8gKHRvdGFsVGF4IC8gdGhpcy5faW5wdXQudGF4YWJsZUluY29tZSkgKiAxMDBcbiAgICAgICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgICAgYnJlYWtkb3duOiByZXN1bHQuYnJlYWtkb3duLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlSdWxlcyhydWxlczogUnVsZXMsIGlucHV0OiBJbnB1dCk6IHsgdGF4OiBudW1iZXI7IGJyZWFrZG93bjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB9IHtcbiAgICAgICAgY29uc3QgcmVnaW1lID0gaW5wdXQuaXNTbWFsbEJ1c2luZXNzXG4gICAgICAgICAgICA/IHJ1bGVzLnJlZ2ltZXMuc21hbGxCdXNpbmVzc1xuICAgICAgICAgICAgOiBydWxlcy5yZWdpbWVzLmdlbmVyYWw7XG5cbiAgICAgICAgaWYgKHJlZ2ltZS5jb25kaXRpb25zPy5tYXhUdXJub3Zlcikge1xuICAgICAgICAgICAgaWYgKGlucHV0LmFubnVhbFR1cm5vdmVyID4gcmVnaW1lLmNvbmRpdGlvbnMubWF4VHVybm92ZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NNRSByZWdpbWUgbm90IGFwcGxpY2FibGU6IHR1cm5vdmVyIGV4Y2VlZGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVnaW1lLnR5cGUgPT09ICdmbGF0Jykge1xuICAgICAgICAgICAgY29uc3QgdGF4ID0gaW5wdXQudGF4YWJsZUluY29tZSAqIHJlZ2ltZS5yYXRlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0YXgsXG4gICAgICAgICAgICAgICAgYnJlYWtkb3duOiB7IGZsYXRUYXg6IHRheCB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWdpbWUudHlwZSA9PT0gJ3Byb2dyZXNzaXZlJykge1xuICAgICAgICAgICAgbGV0IHJlbWFpbmluZyA9IGlucHV0LnRheGFibGVJbmNvbWU7XG4gICAgICAgICAgICBsZXQgdGF4ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGJyZWFrZG93bjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJyYWNrZXQgb2YgcmVnaW1lLmJyYWNrZXRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSBicmVhaztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHVwcGVyID0gYnJhY2tldC50byA/PyBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXhhYmxlID0gTWF0aC5taW4odXBwZXIgLSBicmFja2V0LmZyb20sIHJlbWFpbmluZyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBicmFja2V0VGF4ID0gdGF4YWJsZSAqIGJyYWNrZXQucmF0ZTtcbiAgICAgICAgICAgICAgICB0YXggKz0gYnJhY2tldFRheDtcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gdGF4YWJsZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRLZXkgPSBicmFja2V0LnRvID09PSBudWxsIFxuICAgICAgICAgICAgICAgICAgICA/IGBicmFja2V0XyR7YnJhY2tldC5mcm9tfV9hbmRfYWJvdmVgXG4gICAgICAgICAgICAgICAgICAgIDogYGJyYWNrZXRfJHticmFja2V0LmZyb219X3RvXyR7YnJhY2tldC50b31gO1xuICAgICAgICAgICAgICAgIGJyZWFrZG93blticmFja2V0S2V5XSA9IGJyYWNrZXRUYXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IHRheCwgYnJlYWtkb3duIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHJlZ2ltZSB0eXBlJyk7XG4gICAgfVxufSJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL2ZyYW5jZS9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGludGVyZmFjZSBSZWdpbWVDb25kaXRpb24ge1xuXHRtYXhUdXJub3ZlcjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2ltZUl0ZW0ge1xuICAgIHR5cGU6ICdmbGF0JyB8ICdwcm9ncmVzc2l2ZSc7XG4gICAgcmF0ZT86IG51bWJlcjtcbiAgICBtYXhJbmNvbWU/OiBudW1iZXI7XG4gICAgYnJhY2tldHM/OiBQcm9ncmVzc2l2ZVRheEJyYWNrZXRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpbWUge1xuICAgIGdlbmVyYWw6IFJlZ2ltZUl0ZW1bXTtcbiAgICBzbWFsbEJ1c2luZXNzOiBSZWdpbWVJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXQge1xuXHR0YXhhYmxlSW5jb21lOiBudW1iZXI7XG5cdGFubnVhbFR1cm5vdmVyOiBudW1iZXI7XG4gICAgaXNTbWFsbEJ1c2luZXNzOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE91dHB1dCB7XG5cdG5hbWU6IHN0cmluZztcblx0dHlwZTogJ251bWJlcicgfCAnc3RyaW5nJztcblx0dW5pdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbGF0VGF4UnVsZSB7XG5cdHR5cGU6ICdmbGF0Jztcblx0cmF0ZTogbnVtYmVyO1xuXHRjb25kaXRpb25zPzogUmVnaW1lQ29uZGl0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzaXZlVGF4QnJhY2tldCB7XG5cdGZyb206IG51bWJlcjtcblx0dG86IG51bWJlciB8IG51bGw7XG5cdHJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc2l2ZVRheFJ1bGUge1xuXHR0eXBlOiAncHJvZ3Jlc3NpdmUnO1xuXHRicmFja2V0czogUHJvZ3Jlc3NpdmVUYXhCcmFja2V0W107XG5cdGVsaWdpYmlsaXR5PzogUmVjb3JkPHN0cmluZywgYW55Pjtcblx0Y29uZGl0aW9ucz86IFJlZ2ltZUNvbmRpdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgVGF4UnVsZSA9IEZsYXRUYXhSdWxlIHwgUHJvZ3Jlc3NpdmVUYXhSdWxlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVzIHtcbiAgXHRyZWdpbWVzOiBSZWNvcmQ8c3RyaW5nLCBUYXhSdWxlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bHQge1xuXHRjb3Jwb3JhdGVUYXg6IG51bWJlcjtcblx0ZWZmZWN0aXZlVGF4UmF0ZTogbnVtYmVyO1xuXHRicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcnBvcmF0ZS9zb3V0aC1hZnJpY2EvU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQgfSBmcm9tICcuL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0O1xufSAiXX0=
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SouthAfricaCorporateTaxServiceImpl = void 0;
|
|
4
|
+
class SouthAfricaCorporateTaxServiceImpl {
|
|
5
|
+
constructor(input, rules) {
|
|
6
|
+
this._input = input;
|
|
7
|
+
this._rules = rules;
|
|
8
|
+
}
|
|
9
|
+
calculate() {
|
|
10
|
+
const rule = this._rules.regimes[this._input.regime];
|
|
11
|
+
if (!rule) {
|
|
12
|
+
throw new Error(`Unknown tax regime: ${this._input.regime}`);
|
|
13
|
+
}
|
|
14
|
+
let tax = 0;
|
|
15
|
+
let breakdown = {};
|
|
16
|
+
if (rule.type === 'flat') {
|
|
17
|
+
tax = this._input.taxableIncome * rule.rate;
|
|
18
|
+
breakdown = {
|
|
19
|
+
flatTax: tax
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (rule.type === 'progressive') {
|
|
23
|
+
const result = this.calculateProgressiveTax(this._input.taxableIncome, rule.brackets);
|
|
24
|
+
tax = result.total;
|
|
25
|
+
breakdown = result.breakdown;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
corporateTax: tax,
|
|
29
|
+
effectiveTaxRate: this._input.taxableIncome > 0
|
|
30
|
+
? (tax / this._input.taxableIncome) * 100
|
|
31
|
+
: 0,
|
|
32
|
+
breakdown,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
calculateProgressiveTax(income, brackets) {
|
|
36
|
+
let tax = 0;
|
|
37
|
+
const breakdown = {};
|
|
38
|
+
for (const bracket of brackets) {
|
|
39
|
+
if (income <= bracket.from)
|
|
40
|
+
continue;
|
|
41
|
+
const upperLimit = bracket.to === null ? income : Math.min(income, bracket.to);
|
|
42
|
+
const taxableAmount = upperLimit - bracket.from;
|
|
43
|
+
if (taxableAmount > 0) {
|
|
44
|
+
const bracketTax = taxableAmount * bracket.rate;
|
|
45
|
+
tax += bracketTax;
|
|
46
|
+
const bracketKey = bracket.to === null
|
|
47
|
+
? `bracket_${bracket.from}_and_above`
|
|
48
|
+
: `bracket_${bracket.from}_to_${bracket.to}`;
|
|
49
|
+
breakdown[bracketKey] = bracketTax;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { total: tax, breakdown };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.SouthAfricaCorporateTaxServiceImpl = SouthAfricaCorporateTaxServiceImpl;
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3Jwb3JhdGUvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsTUFBYSxrQ0FBa0M7SUFJM0MsWUFBWSxLQUFZLEVBQUUsS0FBWTtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixJQUFJLFNBQVMsR0FBMkIsRUFBRSxDQUFDO1FBRTNDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN2QixHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM1QyxTQUFTLEdBQUc7Z0JBQ1IsT0FBTyxFQUFFLEdBQUc7YUFDZixDQUFDO1FBQ04sQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUN6QixJQUFJLENBQUMsUUFBUSxDQUNoQixDQUFDO1lBQ0YsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbkIsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDakMsQ0FBQztRQUVELE9BQU87WUFDSCxZQUFZLEVBQUUsR0FBRztZQUNqQixnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsQ0FBQztnQkFDekIsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRztnQkFDekMsQ0FBQyxDQUFDLENBQUM7WUFDUCxTQUFTO1NBQ1osQ0FBQztJQUNOLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsUUFBaUM7UUFDN0UsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osTUFBTSxTQUFTLEdBQTJCLEVBQUUsQ0FBQztRQUU3QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJO2dCQUFFLFNBQVM7WUFFckMsTUFBTSxVQUFVLEdBQ2hCLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUU1RCxNQUFNLGFBQWEsR0FBRyxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztZQUVoRCxJQUFJLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxVQUFVLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELEdBQUcsSUFBSSxVQUFVLENBQUM7Z0JBRWxCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSTtvQkFDbEMsQ0FBQyxDQUFDLFdBQVcsT0FBTyxDQUFDLElBQUksWUFBWTtvQkFDckMsQ0FBQyxDQUFDLFdBQVcsT0FBTyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pELFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDdkMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0o7QUF0RUQsZ0ZBc0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUnVsZXMsIElucHV0LCBSZXN1bHQsIFByb2dyZXNzaXZlVGF4QnJhY2tldCB9IGZyb20gJy4vZG9tYWluL3R5cGVzJztcbmltcG9ydCB7IFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZSB9IGZyb20gJy4vU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwgaW1wbGVtZW50cyBTb3V0aEFmcmljYUNvcnBvcmF0ZVRheFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2lucHV0OiBJbnB1dDtcbiAgICBwcml2YXRlIF9ydWxlczogUnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogSW5wdXQsIHJ1bGVzOiBSdWxlcykge1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZSgpOiBSZXN1bHQge1xuICAgICAgICBjb25zdCBydWxlID0gdGhpcy5fcnVsZXMucmVnaW1lc1t0aGlzLl9pbnB1dC5yZWdpbWVdO1xuXG4gICAgICAgIGlmICghcnVsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRheCByZWdpbWU6ICR7dGhpcy5faW5wdXQucmVnaW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRheCA9IDA7XG4gICAgICAgIGxldCBicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBpZiAocnVsZS50eXBlID09PSAnZmxhdCcpIHtcbiAgICAgICAgICAgIHRheCA9IHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUgKiBydWxlLnJhdGU7XG4gICAgICAgICAgICBicmVha2Rvd24gPSB7XG4gICAgICAgICAgICAgICAgZmxhdFRheDogdGF4XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGUudHlwZSA9PT0gJ3Byb2dyZXNzaXZlJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jYWxjdWxhdGVQcm9ncmVzc2l2ZVRheChcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dC50YXhhYmxlSW5jb21lLFxuICAgICAgICAgICAgICAgIHJ1bGUuYnJhY2tldHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0YXggPSByZXN1bHQudG90YWw7XG4gICAgICAgICAgICBicmVha2Rvd24gPSByZXN1bHQuYnJlYWtkb3duO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvcnBvcmF0ZVRheDogdGF4LFxuICAgICAgICAgICAgZWZmZWN0aXZlVGF4UmF0ZTpcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUgPiAwXG4gICAgICAgICAgICAgICAgPyAodGF4IC8gdGhpcy5faW5wdXQudGF4YWJsZUluY29tZSkgKiAxMDBcbiAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICBicmVha2Rvd24sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVQcm9ncmVzc2l2ZVRheChpbmNvbWU6IG51bWJlciwgYnJhY2tldHM6IFByb2dyZXNzaXZlVGF4QnJhY2tldFtdKTogeyB0b3RhbDogbnVtYmVyOyBicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfSB7XG4gICAgICAgIGxldCB0YXggPSAwO1xuICAgICAgICBjb25zdCBicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGJyYWNrZXQgb2YgYnJhY2tldHMpIHtcbiAgICAgICAgICAgIGlmIChpbmNvbWUgPD0gYnJhY2tldC5mcm9tKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgdXBwZXJMaW1pdCA9XG4gICAgICAgICAgICBicmFja2V0LnRvID09PSBudWxsID8gaW5jb21lIDogTWF0aC5taW4oaW5jb21lLCBicmFja2V0LnRvKTtcblxuICAgICAgICAgICAgY29uc3QgdGF4YWJsZUFtb3VudCA9IHVwcGVyTGltaXQgLSBicmFja2V0LmZyb207XG5cbiAgICAgICAgICAgIGlmICh0YXhhYmxlQW1vdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRUYXggPSB0YXhhYmxlQW1vdW50ICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSBicmFja2V0VGF4O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRLZXkgPSBicmFja2V0LnRvID09PSBudWxsIFxuICAgICAgICAgICAgICAgICAgICA/IGBicmFja2V0XyR7YnJhY2tldC5mcm9tfV9hbmRfYWJvdmVgXG4gICAgICAgICAgICAgICAgICAgIDogYGJyYWNrZXRfJHticmFja2V0LmZyb219X3RvXyR7YnJhY2tldC50b31gO1xuICAgICAgICAgICAgICAgIGJyZWFrZG93blticmFja2V0S2V5XSA9IGJyYWNrZXRUYXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB0b3RhbDogdGF4LCBicmVha2Rvd24gfTtcbiAgICB9XG59ICJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL3NvdXRoLWFmcmljYS9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSW5wdXQge1xuXHR0YXhhYmxlSW5jb21lOiBudW1iZXI7XG4gICAgcmVnaW1lOiAnTEFSR0UnIHwgJ1NCQyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0IHtcblx0bmFtZTogc3RyaW5nO1xuXHR0eXBlOiAnbnVtYmVyJyB8ICdzdHJpbmcnO1xuXHR1bml0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsYXRUYXhSdWxlIHtcblx0dHlwZTogJ2ZsYXQnO1xuXHRyYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NpdmVUYXhCcmFja2V0IHtcblx0ZnJvbTogbnVtYmVyO1xuXHR0bzogbnVtYmVyIHwgbnVsbDtcblx0cmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzaXZlVGF4UnVsZSB7XG5cdHR5cGU6ICdwcm9ncmVzc2l2ZSc7XG5cdGJyYWNrZXRzOiBQcm9ncmVzc2l2ZVRheEJyYWNrZXRbXTtcblx0ZWxpZ2liaWxpdHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBUYXhSdWxlID0gRmxhdFRheFJ1bGUgfCBQcm9ncmVzc2l2ZVRheFJ1bGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICBcdHJlZ2ltZXM6IFJlY29yZDxzdHJpbmcsIFRheFJ1bGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdCB7XG5cdGNvcnBvcmF0ZVRheDogbnVtYmVyO1xuXHRlZmZlY3RpdmVUYXhSYXRlOiBudW1iZXI7XG5cdGJyZWFrZG93bjogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbn1cblxuIl19
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.SouthAfricaMortgageService = exports.SouthAfricaIncomeTaxService = exports.FranceMortgageService = exports.FranceIncomeTaxService = exports.CanadaMortgageService = exports.CanadaIncomeTaxService = exports.CalculatorType = void 0;
|
|
17
|
+
exports.SouthAfricaCorporateTaxService = exports.SouthAfricaMortgageService = exports.SouthAfricaIncomeTaxService = exports.FranceCorporateTaxService = exports.FranceMortgageService = exports.FranceIncomeTaxService = exports.CanadaCorporateTaxService = exports.CanadaMortgageService = exports.CanadaIncomeTaxService = exports.CalculatorType = void 0;
|
|
18
18
|
var types_1 = require("./shared/domain/types");
|
|
19
19
|
Object.defineProperty(exports, "CalculatorType", { enumerable: true, get: function () { return types_1.CalculatorType; } });
|
|
20
20
|
// Canada
|
|
@@ -22,15 +22,21 @@ var CanadaIncomeTaxServiceImpl_1 = require("./income-tax/canada/CanadaIncomeTaxS
|
|
|
22
22
|
Object.defineProperty(exports, "CanadaIncomeTaxService", { enumerable: true, get: function () { return CanadaIncomeTaxServiceImpl_1.CanadaIncomeTaxServiceImpl; } });
|
|
23
23
|
var CanadaMortgageServiceImpl_1 = require("./mortgage/canada/CanadaMortgageServiceImpl");
|
|
24
24
|
Object.defineProperty(exports, "CanadaMortgageService", { enumerable: true, get: function () { return CanadaMortgageServiceImpl_1.CanadaMortgageServiceImpl; } });
|
|
25
|
+
var CanadaCorporateTaxServiceImpl_1 = require("./corporate/canada/CanadaCorporateTaxServiceImpl");
|
|
26
|
+
Object.defineProperty(exports, "CanadaCorporateTaxService", { enumerable: true, get: function () { return CanadaCorporateTaxServiceImpl_1.CanadaCorporateTaxServiceImpl; } });
|
|
25
27
|
// France
|
|
26
28
|
var FranceIncomeTaxServiceImpl_1 = require("./income-tax/france/FranceIncomeTaxServiceImpl");
|
|
27
29
|
Object.defineProperty(exports, "FranceIncomeTaxService", { enumerable: true, get: function () { return FranceIncomeTaxServiceImpl_1.FranceIncomeTaxServiceImpl; } });
|
|
28
30
|
var FranceMortgageServiceImpl_1 = require("./mortgage/france/FranceMortgageServiceImpl");
|
|
29
31
|
Object.defineProperty(exports, "FranceMortgageService", { enumerable: true, get: function () { return FranceMortgageServiceImpl_1.FranceMortgageServiceImpl; } });
|
|
32
|
+
var FranceCorporateTaxServiceImpl_1 = require("./corporate/france/FranceCorporateTaxServiceImpl");
|
|
33
|
+
Object.defineProperty(exports, "FranceCorporateTaxService", { enumerable: true, get: function () { return FranceCorporateTaxServiceImpl_1.FranceCorporateTaxServiceImpl; } });
|
|
30
34
|
// South Africa
|
|
31
35
|
var SouthAfricaIncomeTaxServiceImpl_1 = require("./income-tax/south-africa/SouthAfricaIncomeTaxServiceImpl");
|
|
32
36
|
Object.defineProperty(exports, "SouthAfricaIncomeTaxService", { enumerable: true, get: function () { return SouthAfricaIncomeTaxServiceImpl_1.SouthAfricaIncomeTaxServiceImpl; } });
|
|
33
37
|
var SouthAfricaMortgageServiceImpl_1 = require("./mortgage/south-africa/SouthAfricaMortgageServiceImpl");
|
|
34
38
|
Object.defineProperty(exports, "SouthAfricaMortgageService", { enumerable: true, get: function () { return SouthAfricaMortgageServiceImpl_1.SouthAfricaMortgageServiceImpl; } });
|
|
39
|
+
var SouthAfricaCorporateTaxServiceImpl_1 = require("./corporate/south-africa/SouthAfricaCorporateTaxServiceImpl");
|
|
40
|
+
Object.defineProperty(exports, "SouthAfricaCorporateTaxService", { enumerable: true, get: function () { return SouthAfricaCorporateTaxServiceImpl_1.SouthAfricaCorporateTaxServiceImpl; } });
|
|
35
41
|
__exportStar(require("./income-tax/domain/types"), exports);
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBdUQ7QUFBOUMsdUdBQUEsY0FBYyxPQUFBO0FBRXZCLFNBQVM7QUFDVCw2RkFBc0g7QUFBN0csb0lBQUEsMEJBQTBCLE9BQTBCO0FBQzdELHlGQUFpSDtBQUF4RyxrSUFBQSx5QkFBeUIsT0FBeUI7QUFXM0Qsa0dBQThIO0FBQXJILDBJQUFBLDZCQUE2QixPQUE2QjtBQU9uRSxTQUFTO0FBQ1QsNkZBQXNIO0FBQTdHLG9JQUFBLDBCQUEwQixPQUEwQjtBQUM3RCx5RkFBaUg7QUFBeEcsa0lBQUEseUJBQXlCLE9BQXlCO0FBVzNELGtHQUE4SDtBQUFySCwwSUFBQSw2QkFBNkIsT0FBNkI7QUFPbkUsZUFBZTtBQUNmLDZHQUEySTtBQUFsSSw4SUFBQSwrQkFBK0IsT0FBK0I7QUFDdkUseUdBQXNJO0FBQTdILDRJQUFBLDhCQUE4QixPQUE4QjtBQVdyRSxrSEFBbUo7QUFBMUksb0pBQUEsa0NBQWtDLE9BQWtDO0FBUTdFLDREQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENhbGN1bGF0b3JUeXBlIH0gZnJvbSAnLi9zaGFyZWQvZG9tYWluL3R5cGVzJztcblxuLy8gQ2FuYWRhXG5leHBvcnQgeyBDYW5hZGFJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBDYW5hZGFJbmNvbWVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9pbmNvbWUtdGF4L2NhbmFkYS9DYW5hZGFJbmNvbWVUYXhTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBDYW5hZGFNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIENhbmFkYU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vbW9ydGdhZ2UvY2FuYWRhL0NhbmFkYU1vcnRnYWdlU2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBDb21wdXRlZEluY29tZVRheFZhbHVlcyBhcyBDYW5hZGFDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBJbmNvbWVUYXhSdWxlcyBhcyBDYW5hZGFJbmNvbWVUYXhSdWxlcyxcbn0gZnJvbSAnLi9pbmNvbWUtdGF4L2NhbmFkYS9kb21haW4vdHlwZXMnO1xuZXhwb3J0IHtcbiAgICBNb3J0Z2FnZVJ1bGVzIGFzIENhbmFkYU1vcnRnYWdlUnVsZXMsXG4gICAgTW9ydGdhZ2VDYWxjdWxhdGlvbklucHV0IGFzIENhbmFkYU1vcnRnYWdlQ2FsY3VsYXRpb25JbnB1dCxcbiAgICBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0IGFzIENhbmFkYU1vcnRnYWdlQ2FsY3VsYXRpb25SZXN1bHQsXG59IGZyb20gJy4vbW9ydGdhZ2UvY2FuYWRhL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCB7IENhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsIGFzIENhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2UgfSBmcm9tICcuL2NvcnBvcmF0ZS9jYW5hZGEvQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBJbnB1dCBhcyBDYW5hZGFDb3Jwb3JhdGVUYXhJbnB1dCxcbiAgICBSdWxlcyBhcyBDYW5hZGFDb3Jwb3JhdGVUYXhSdWxlcyxcbiAgICBSZXN1bHQgYXMgQ2FuYWRhQ29ycG9yYXRlVGF4UmVzdWx0LFxufSBmcm9tICcuL2NvcnBvcmF0ZS9jYW5hZGEvZG9tYWluL3R5cGVzJztcblxuLy8gRnJhbmNlXG5leHBvcnQgeyBGcmFuY2VJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBGcmFuY2VJbmNvbWVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9pbmNvbWUtdGF4L2ZyYW5jZS9GcmFuY2VJbmNvbWVUYXhTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBGcmFuY2VNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIEZyYW5jZU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vbW9ydGdhZ2UvZnJhbmNlL0ZyYW5jZU1vcnRnYWdlU2VydmljZUltcGwnO1xuZXhwb3J0IHsgXG4gICAgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMgYXMgRnJhbmNlQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMsXG4gICAgSW5jb21lVGF4UnVsZXMgYXMgRnJhbmNlSW5jb21lVGF4UnVsZXMsXG59IGZyb20gJy4vaW5jb21lLXRheC9mcmFuY2UvZG9tYWluL3R5cGVzJztcbmV4cG9ydCB7XG4gICAgTW9ydGdhZ2VSdWxlcyBhcyBGcmFuY2VNb3J0Z2FnZVJ1bGVzLFxuICAgIE1vcnRnYWdlSW5wdXQgYXMgRnJhbmNlTW9ydGdhZ2VJbnB1dCxcbiAgICBNb3J0Z2FnZU91dHB1dCBhcyBGcmFuY2VNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0LFxufSBmcm9tICcuL21vcnRnYWdlL2ZyYW5jZS9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgeyBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCBhcyBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9jb3Jwb3JhdGUvZnJhbmNlL0ZyYW5jZUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgSW5wdXQgYXMgRnJhbmNlQ29ycG9yYXRlVGF4SW5wdXQsXG4gICAgUnVsZXMgYXMgRnJhbmNlQ29ycG9yYXRlVGF4UnVsZXMsXG4gICAgUmVzdWx0IGFzIEZyYW5jZUNvcnBvcmF0ZVRheFJlc3VsdCxcbn0gZnJvbSAnLi9jb3Jwb3JhdGUvZnJhbmNlL2RvbWFpbi90eXBlcyc7XG5cbi8vIFNvdXRoIEFmcmljYVxuZXhwb3J0IHsgU291dGhBZnJpY2FJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBTb3V0aEFmcmljYUluY29tZVRheFNlcnZpY2UgfSBmcm9tICcuL2luY29tZS10YXgvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhSW5jb21lVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHsgU291dGhBZnJpY2FNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIFNvdXRoQWZyaWNhTW9ydGdhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9tb3J0Z2FnZS9zb3V0aC1hZnJpY2EvU291dGhBZnJpY2FNb3J0Z2FnZVNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMgYXMgU291dGhBZnJpY2FDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBJbmNvbWVUYXhSdWxlcyBhcyBTb3V0aEFmcmljYUluY29tZVRheFJ1bGVzLFxufSBmcm9tICcuL2luY29tZS10YXgvc291dGgtYWZyaWNhL2RvbWFpbi90eXBlcyc7XG5leHBvcnQge1xuICAgIE1vcnRnYWdlUnVsZXMgYXMgU291dGhBZnJpY2FNb3J0Z2FnZVJ1bGVzLFxuICAgIE1vcnRnYWdlSW5wdXQgYXMgU291dGhBZnJpY2FNb3J0Z2FnZUlucHV0LFxuICAgIE1vcnRnYWdlT3V0cHV0IGFzIFNvdXRoQWZyaWNhTW9ydGdhZ2VPdXRwdXQsXG59IGZyb20gJy4vbW9ydGdhZ2Uvc291dGgtYWZyaWNhL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCB7IFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwgYXMgU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9jb3Jwb3JhdGUvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBSdWxlcyBhcyBTb3V0aEFmcmljYUNvcnBvcmF0ZVRheFJ1bGVzLFxuICAgIElucHV0IGFzIFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4SW5wdXQsXG4gICAgUmVzdWx0IGFzIFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4UmVzdWx0LFxufSBmcm9tICcuL2NvcnBvcmF0ZS9zb3V0aC1hZnJpY2EvZG9tYWluL3R5cGVzJztcblxuZXhwb3J0IHsgSW5jb21lVGF4Q2FsY3VsYXRvclNjaGVtYSB9IGZyb20gJy4vaW5jb21lLXRheC9kb21haW4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbmNvbWUtdGF4L2RvbWFpbi90eXBlcyc7Il19
|
|
@@ -54,7 +54,7 @@ class CanadaMortgageServiceImpl {
|
|
|
54
54
|
loanAmount: loanAmount,
|
|
55
55
|
insurancePremium: insurancePremium,
|
|
56
56
|
totalMortgage: totalMortgage,
|
|
57
|
-
|
|
57
|
+
monthlyPayment: paymentAmount,
|
|
58
58
|
totalInterestPaid: totalInterestPaid,
|
|
59
59
|
totalPaid: totalPaid,
|
|
60
60
|
amortizationSchedule: amortizationSchedule,
|
|
@@ -121,4 +121,4 @@ class CanadaMortgageServiceImpl {
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
exports.CanadaMortgageServiceImpl = CanadaMortgageServiceImpl;
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb3J0Z2FnZS9jYW5hZGEvQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxNQUFhLHlCQUF5QjtJQUU3QixTQUFTLENBQUMsS0FBK0IsRUFBRSxLQUFvQjtRQUVwRSxNQUFNLEVBQ0osYUFBYSxFQUNiLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2pCLEdBQUcsS0FBSyxDQUFDO1FBRVYsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7UUFFOUM7O3lDQUVpQztRQUVqQyxNQUFNLFVBQVUsR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDO1FBQy9DLElBQUksVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUV2Qzs7eUNBRWlDO1FBRWpDLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25ELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZO2lCQUNyRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTlCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFFRCxnQkFBZ0IsR0FBRyxVQUFVLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUNuRCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQjtZQUM5RCxDQUFDLENBQUMsVUFBVSxHQUFHLGdCQUFnQjtZQUMvQixDQUFDLENBQUMsVUFBVSxDQUFDO1FBRWY7Ozt5Q0FHaUM7UUFFakMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUMzQyxZQUFZLEVBQ1osS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQzFCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGVBQWUsQ0FDOUQsQ0FBQztRQUVGOzt5Q0FFaUM7UUFFakMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEUsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLGVBQWUsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsR0FBRyxlQUFlLENBQUM7UUFFMUQ7Ozt5Q0FHaUM7UUFFakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUN6QyxhQUFhLEVBQ2IsWUFBWSxFQUNaLGFBQWEsQ0FDZCxDQUFDO1FBRUY7O3lDQUVpQztRQUVqQyxNQUFNLFNBQVMsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ2hELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxHQUFHLGFBQWEsQ0FBQztRQUVwRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FDN0QsYUFBYSxFQUNiLFlBQVksRUFDWixhQUFhLEVBQ2IsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixlQUFlLENBQ2hCLENBQUM7UUFFRixPQUFPO1lBQ0wsVUFBVSxFQUFFLFVBQVU7WUFDdEIsZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLGFBQWEsRUFBRSxhQUFhO1lBQzVCLG9CQUFvQixFQUFFLGFBQWE7WUFDbkMsaUJBQWlCLEVBQUUsaUJBQWlCO1lBQ3BDLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLG9CQUFvQixFQUFFLG9CQUFvQjtZQUMxQyxTQUFTLEVBQUU7Z0JBQ1QsVUFBVSxFQUFFO29CQUNSLEtBQUssRUFBRSxDQUFDO29CQUNSLEtBQUssRUFBRSxhQUFhO2lCQUN2QjtnQkFDRCxRQUFRLEVBQUU7b0JBQ04sS0FBSyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxFQUFFLFdBQVc7aUJBQ3JCO2dCQUNELG9CQUFvQixFQUFFO29CQUNsQixLQUFLLEVBQUUsZ0JBQWdCO29CQUN2QixLQUFLLEVBQUUsbUJBQW1CO2lCQUM3QjthQUNKO1NBQ0EsQ0FBQztJQUNKLENBQUM7SUFFRDs7NkRBRXlEO0lBRWpELDZCQUE2QixDQUNuQyxTQUFpQixFQUNqQixZQUFvQixFQUNwQixhQUFxQixFQUNyQixhQUFxQixFQUNyQixpQkFBeUIsRUFDekIsZUFBdUI7UUFFdkIsTUFBTSxRQUFRLEdBQStCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFFeEIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLGlCQUFpQixFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDckQsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUV2QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxhQUFhLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7WUFFL0YsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLGNBQWMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUMzRCxNQUFNLGVBQWUsR0FBRyxPQUFPLEdBQUcsWUFBWSxDQUFDO2dCQUMvQyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsR0FBRyxlQUFlLENBQUM7Z0JBRXpELGNBQWMsSUFBSSxlQUFlLENBQUM7Z0JBQ2xDLGVBQWUsSUFBSSxnQkFBZ0IsQ0FBQztnQkFDcEMsT0FBTyxJQUFJLGdCQUFnQixDQUFDO1lBQzlCLENBQUM7WUFFRCxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNaLElBQUk7Z0JBQ0osU0FBUyxFQUFFLGVBQWU7Z0JBQzFCLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO2FBQzlCLENBQUMsQ0FBQztZQUVILElBQUksT0FBTyxJQUFJLENBQUM7Z0JBQUUsTUFBTTtRQUMxQixDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVPLG1CQUFtQixDQUN6QixVQUFrQixFQUNsQixXQUFpRCxFQUNqRCxlQUF1QjtRQUd2QixJQUFJLFdBQVcsS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELCtCQUErQjtRQUMvQixNQUFNLGNBQWMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVoRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFNBQWlCLEVBQUUsSUFBWSxFQUFFLE9BQWU7UUFDdkUsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDZixPQUFPLFNBQVMsR0FBRyxPQUFPLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sU0FBUztZQUNkLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0Y7QUF6TEQsOERBeUxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9DYW5hZGFNb3J0Z2FnZVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTW9ydGdhZ2VSdWxlcyxcbiAgTW9ydGdhZ2VDYWxjdWxhdGlvbklucHV0LFxuICBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0LFxuICBBbW9ydGl6YXRpb25TY2hlZHVsZUl0ZW1cbn0gZnJvbSAnLi9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIENhbmFkYU1vcnRnYWdlU2VydmljZSB7XG5cbiAgcHVibGljIGNhbGN1bGF0ZShpbnB1dDogTW9ydGdhZ2VDYWxjdWxhdGlvbklucHV0LCBydWxlczogTW9ydGdhZ2VSdWxlcyk6IE1vcnRnYWdlQ2FsY3VsYXRpb25SZXN1bHQge1xuXG4gICAgY29uc3Qge1xuICAgICAgcHJvcGVydHlQcmljZSxcbiAgICAgIGRvd25QYXltZW50LFxuICAgICAgYW1vcnRpemF0aW9uWWVhcnMsXG4gICAgICBwYXltZW50RnJlcXVlbmN5XG4gICAgfSA9IGlucHV0O1xuXG4gICAgY29uc3QgaW50ZXJlc3RSYXRlID0gaW5wdXQuaW50ZXJlc3RSYXRlIC8gMTAwO1xuXG4gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAxLiBMb2FuIEFtb3VudCAmIExUVlxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgbG9hbkFtb3VudCA9IHByb3BlcnR5UHJpY2UgLSBkb3duUGF5bWVudDtcbiAgICBpZiAobG9hbkFtb3VudCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbG9hbiBhbW91bnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBsdHYgPSBsb2FuQW1vdW50IC8gcHJvcGVydHlQcmljZTtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgMi4gQ01IQyBJbnN1cmFuY2VcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGxldCBpbnN1cmFuY2VQcmVtaXVtID0gMDtcblxuICAgIGlmIChsdHYgPiBydWxlcy5tb3J0Z2FnZUluc3VyYW5jZS5yZXF1aXJlZEJlbG93THR2KSB7XG4gICAgICBjb25zdCBwcmVtaXVtUnVsZSA9IHJ1bGVzLm1vcnRnYWdlSW5zdXJhbmNlLnByZW1pdW1SYXRlc1xuICAgICAgICAuZmluZChyID0+IGx0diA8PSByLm1heEx0dik7XG5cbiAgICAgIGlmICghcHJlbWl1bVJ1bGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMVFYgZXhjZWVkcyBtYXhpbXVtIGluc3VyYWJsZSBsaW1pdCcpO1xuICAgICAgfVxuXG4gICAgICBpbnN1cmFuY2VQcmVtaXVtID0gbG9hbkFtb3VudCAqIHByZW1pdW1SdWxlLnJhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWxNb3J0Z2FnZSA9IHJ1bGVzLm1vcnRnYWdlSW5zdXJhbmNlLnByZW1pdW1BZGRlZFRvTG9hblxuICAgICAgPyBsb2FuQW1vdW50ICsgaW5zdXJhbmNlUHJlbWl1bVxuICAgICAgOiBsb2FuQW1vdW50O1xuXG4gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAzLiBJbnRlcmVzdCBSYXRlIENvbnZlcnNpb25cbiAgICAgICAoQ2FuYWRhIHNlbWktYW5udWFsIGNvbXBvdW5kaW5nKVxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgcGVyaW9kaWNSYXRlID0gdGhpcy5jb252ZXJ0Q2FuYWRpYW5SYXRlKFxuICAgICAgaW50ZXJlc3RSYXRlLFxuICAgICAgcnVsZXMuaW50ZXJlc3QuY29tcG91bmRpbmcsXG4gICAgICBydWxlcy5wYXltZW50RnJlcXVlbmN5UnVsZXNbcGF5bWVudEZyZXF1ZW5jeV0ucGF5bWVudHNQZXJZZWFyXG4gICAgKTtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgNC4gUGF5bWVudCBGcmVxdWVuY3lcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGNvbnN0IGZyZXF1ZW5jeVJ1bGUgPSBydWxlcy5wYXltZW50RnJlcXVlbmN5UnVsZXNbcGF5bWVudEZyZXF1ZW5jeV07XG4gICAgY29uc3QgcGF5bWVudHNQZXJZZWFyID0gZnJlcXVlbmN5UnVsZS5wYXltZW50c1BlclllYXI7XG4gICAgY29uc3QgdG90YWxQYXltZW50cyA9IGFtb3J0aXphdGlvblllYXJzICogcGF5bWVudHNQZXJZZWFyO1xuXG4gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICA1LiBNb3J0Z2FnZSBQYXltZW50IEZvcm11bGFcbiAgICAgICBQID0gTCDDlyBbIHIoMStyKV5uIF0gLyBbICgxK3IpXm4g4oiSIDEgXVxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgcGF5bWVudEFtb3VudCA9IHRoaXMuY2FsY3VsYXRlUGF5bWVudChcbiAgICAgIHRvdGFsTW9ydGdhZ2UsXG4gICAgICBwZXJpb2RpY1JhdGUsXG4gICAgICB0b3RhbFBheW1lbnRzXG4gICAgKTtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgNi4gVG90YWxzXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBjb25zdCB0b3RhbFBhaWQgPSBwYXltZW50QW1vdW50ICogdG90YWxQYXltZW50cztcbiAgICBjb25zdCB0b3RhbEludGVyZXN0UGFpZCA9IHRvdGFsUGFpZCAtIHRvdGFsTW9ydGdhZ2U7XG5cbiAgICBjb25zdCBhbW9ydGl6YXRpb25TY2hlZHVsZSA9IHRoaXMuY2FsY3VsYXRlQW1vcnRpemF0aW9uU2NoZWR1bGUoXG4gICAgICB0b3RhbE1vcnRnYWdlLFxuICAgICAgcGVyaW9kaWNSYXRlLFxuICAgICAgcGF5bWVudEFtb3VudCxcbiAgICAgIHRvdGFsUGF5bWVudHMsXG4gICAgICBhbW9ydGl6YXRpb25ZZWFycyxcbiAgICAgIHBheW1lbnRzUGVyWWVhclxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9hbkFtb3VudDogbG9hbkFtb3VudCxcbiAgICAgIGluc3VyYW5jZVByZW1pdW06IGluc3VyYW5jZVByZW1pdW0sXG4gICAgICB0b3RhbE1vcnRnYWdlOiB0b3RhbE1vcnRnYWdlLFxuICAgICAgbW9udGhseVBheW1lbnRBbW91bnQ6IHBheW1lbnRBbW91bnQsXG4gICAgICB0b3RhbEludGVyZXN0UGFpZDogdG90YWxJbnRlcmVzdFBhaWQsXG4gICAgICB0b3RhbFBhaWQ6IHRvdGFsUGFpZCxcbiAgICAgIGFtb3J0aXphdGlvblNjaGVkdWxlOiBhbW9ydGl6YXRpb25TY2hlZHVsZSxcbiAgICAgIG90aGVyRmVlczoge1xuICAgICAgICBub3RhcnlGZWVzOiB7XG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGxhYmVsOiAnTk9UQVJZX0ZFRVMnXG4gICAgICAgIH0sXG4gICAgICAgIGJhbmtGZWVzOiB7XG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGxhYmVsOiAnQkFOS19GRUVTJ1xuICAgICAgICB9LFxuICAgICAgICBtb250aGx5SW5zdXJhbmNlRmVlczoge1xuICAgICAgICAgICAgdmFsdWU6IGluc3VyYW5jZVByZW1pdW0sXG4gICAgICAgICAgICBsYWJlbDogJ0lOU1VSQU5DRV9QUkVNSVVNJ1xuICAgICAgICB9XG4gICAgfVxuICAgIH07XG4gIH1cblxuICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgSGVscGVyIE1ldGhvZHNcbiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBbW9ydGl6YXRpb25TY2hlZHVsZShcbiAgICBwcmluY2lwYWw6IG51bWJlcixcbiAgICBwZXJpb2RpY1JhdGU6IG51bWJlcixcbiAgICBwYXltZW50QW1vdW50OiBudW1iZXIsXG4gICAgdG90YWxQYXltZW50czogbnVtYmVyLFxuICAgIGFtb3J0aXphdGlvblllYXJzOiBudW1iZXIsXG4gICAgcGF5bWVudHNQZXJZZWFyOiBudW1iZXJcbiAgKTogQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtW10ge1xuICAgIGNvbnN0IHNjaGVkdWxlOiBBbW9ydGl6YXRpb25TY2hlZHVsZUl0ZW1bXSA9IFtdO1xuICAgIGxldCBiYWxhbmNlID0gcHJpbmNpcGFsO1xuXG4gICAgZm9yIChsZXQgeWVhciA9IDE7IHllYXIgPD0gYW1vcnRpemF0aW9uWWVhcnM7IHllYXIrKykge1xuICAgICAgbGV0IHllYXJseVByaW5jaXBhbCA9IDA7XG4gICAgICBsZXQgeWVhcmx5SW50ZXJlc3QgPSAwO1xuXG4gICAgICBjb25zdCBwYXltZW50c0luWWVhciA9IE1hdGgubWluKHBheW1lbnRzUGVyWWVhciwgdG90YWxQYXltZW50cyAtICh5ZWFyIC0gMSkgKiBwYXltZW50c1BlclllYXIpO1xuXG4gICAgICBmb3IgKGxldCBwYXltZW50ID0gMTsgcGF5bWVudCA8PSBwYXltZW50c0luWWVhcjsgcGF5bWVudCsrKSB7XG4gICAgICAgIGNvbnN0IGludGVyZXN0UGF5bWVudCA9IGJhbGFuY2UgKiBwZXJpb2RpY1JhdGU7XG4gICAgICAgIGNvbnN0IHByaW5jaXBhbFBheW1lbnQgPSBwYXltZW50QW1vdW50IC0gaW50ZXJlc3RQYXltZW50O1xuXG4gICAgICAgIHllYXJseUludGVyZXN0ICs9IGludGVyZXN0UGF5bWVudDtcbiAgICAgICAgeWVhcmx5UHJpbmNpcGFsICs9IHByaW5jaXBhbFBheW1lbnQ7XG4gICAgICAgIGJhbGFuY2UgLT0gcHJpbmNpcGFsUGF5bWVudDtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUucHVzaCh7XG4gICAgICAgIHllYXIsXG4gICAgICAgIHByaW5jaXBhbDogeWVhcmx5UHJpbmNpcGFsLFxuICAgICAgICBpbnRlcmVzdDogeWVhcmx5SW50ZXJlc3QsXG4gICAgICAgIGJhbGFuY2U6IE1hdGgubWF4KDAsIGJhbGFuY2UpXG4gICAgICB9KTtcblxuICAgICAgaWYgKGJhbGFuY2UgPD0gMCkgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjaGVkdWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2FuYWRpYW5SYXRlKFxuICAgIGFubnVhbFJhdGU6IG51bWJlcixcbiAgICBjb21wb3VuZGluZzogJ1NFTUlfQU5OVUFMJyB8ICdBTk5VQUwnIHwgJ01PTlRITFknLFxuICAgIHBheW1lbnRzUGVyWWVhcjogbnVtYmVyXG4gICk6IG51bWJlciB7XG5cbiAgICBpZiAoY29tcG91bmRpbmcgIT09ICdTRU1JX0FOTlVBTCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBDYW5hZGlhbiBzZW1pLWFubnVhbCBjb21wb3VuZGluZyBzdXBwb3J0ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBDYW5hZGlhbiBzdGFuZGFyZCBjb252ZXJzaW9uXG4gICAgY29uc3Qgc2VtaUFubnVhbFJhdGUgPSBhbm51YWxSYXRlIC8gMjtcbiAgICBjb25zdCBlZmZlY3RpdmVBbm51YWxSYXRlID0gTWF0aC5wb3coMSArIHNlbWlBbm51YWxSYXRlLCAyKSAtIDE7XG5cbiAgICByZXR1cm4gTWF0aC5wb3coMSArIGVmZmVjdGl2ZUFubnVhbFJhdGUsIDEgLyBwYXltZW50c1BlclllYXIpIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlUGF5bWVudChwcmluY2lwYWw6IG51bWJlciwgcmF0ZTogbnVtYmVyLCBwZXJpb2RzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChyYXRlID09PSAwKSB7XG4gICAgICByZXR1cm4gcHJpbmNpcGFsIC8gcGVyaW9kcztcbiAgICB9XG5cbiAgICByZXR1cm4gcHJpbmNpcGFsICpcbiAgICAgIChyYXRlICogTWF0aC5wb3coMSArIHJhdGUsIHBlcmlvZHMpKSAvXG4gICAgICAoTWF0aC5wb3coMSArIHJhdGUsIHBlcmlvZHMpIC0gMSk7XG4gIH1cbn1cbiJdfQ==
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb3J0Z2FnZS9jYW5hZGEvQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxNQUFhLHlCQUF5QjtJQUU3QixTQUFTLENBQUMsS0FBK0IsRUFBRSxLQUFvQjtRQUVwRSxNQUFNLEVBQ0osYUFBYSxFQUNiLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2pCLEdBQUcsS0FBSyxDQUFDO1FBRVYsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7UUFFOUM7O3lDQUVpQztRQUVqQyxNQUFNLFVBQVUsR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDO1FBQy9DLElBQUksVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUV2Qzs7eUNBRWlDO1FBRWpDLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25ELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZO2lCQUNyRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTlCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFFRCxnQkFBZ0IsR0FBRyxVQUFVLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUNuRCxDQUFDO1FB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SUFDdEMsQ0FBQztDQUNGO0FBekxELDhEQXlMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbmFkYU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlJztcbmltcG9ydCB7XG4gIE1vcnRnYWdlUnVsZXMsXG4gIE1vcnRnYWdlQ2FsY3VsYXRpb25JbnB1dCxcbiAgTW9ydGdhZ2VDYWxjdWxhdGlvblJlc3VsdCxcbiAgQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtXG59IGZyb20gJy4vZG9tYWluL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENhbmFkYU1vcnRnYWdlU2VydmljZUltcGwgaW1wbGVtZW50cyBDYW5hZGFNb3J0Z2FnZVNlcnZpY2Uge1xuXG4gIHB1YmxpYyBjYWxjdWxhdGUoaW5wdXQ6IE1vcnRnYWdlQ2FsY3VsYXRpb25JbnB1dCwgcnVsZXM6IE1vcnRnYWdlUnVsZXMpOiBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0IHtcblxuICAgIGNvbnN0IHtcbiAgICAgIHByb3BlcnR5UHJpY2UsXG4gICAgICBkb3duUGF5bWVudCxcbiAgICAgIGFtb3J0aXphdGlvblllYXJzLFxuICAgICAgcGF5bWVudEZyZXF1ZW5jeVxuICAgIH0gPSBpbnB1dDtcblxuICAgIGNvbnN0IGludGVyZXN0UmF0ZSA9IGlucHV0LmludGVyZXN0UmF0ZSAvIDEwMDtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgMS4gTG9hbiBBbW91bnQgJiBMVFZcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGNvbnN0IGxvYW5BbW91bnQgPSBwcm9wZXJ0eVByaWNlIC0gZG93blBheW1lbnQ7XG4gICAgaWYgKGxvYW5BbW91bnQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvYW4gYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgbHR2ID0gbG9hbkFtb3VudCAvIHByb3BlcnR5UHJpY2U7XG5cbiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIDIuIENNSEMgSW5zdXJhbmNlXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBsZXQgaW5zdXJhbmNlUHJlbWl1bSA9IDA7XG5cbiAgICBpZiAobHR2ID4gcnVsZXMubW9ydGdhZ2VJbnN1cmFuY2UucmVxdWlyZWRCZWxvd0x0dikge1xuICAgICAgY29uc3QgcHJlbWl1bVJ1bGUgPSBydWxlcy5tb3J0Z2FnZUluc3VyYW5jZS5wcmVtaXVtUmF0ZXNcbiAgICAgICAgLmZpbmQociA9PiBsdHYgPD0gci5tYXhMdHYpO1xuXG4gICAgICBpZiAoIXByZW1pdW1SdWxlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTFRWIGV4Y2VlZHMgbWF4aW11bSBpbnN1cmFibGUgbGltaXQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdXJhbmNlUHJlbWl1bSA9IGxvYW5BbW91bnQgKiBwcmVtaXVtUnVsZS5yYXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHRvdGFsTW9ydGdhZ2UgPSBydWxlcy5tb3J0Z2FnZUluc3VyYW5jZS5wcmVtaXVtQWRkZWRUb0xvYW5cbiAgICAgID8gbG9hbkFtb3VudCArIGluc3VyYW5jZVByZW1pdW1cbiAgICAgIDogbG9hbkFtb3VudDtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgMy4gSW50ZXJlc3QgUmF0ZSBDb252ZXJzaW9uXG4gICAgICAgKENhbmFkYSBzZW1pLWFubnVhbCBjb21wb3VuZGluZylcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGNvbnN0IHBlcmlvZGljUmF0ZSA9IHRoaXMuY29udmVydENhbmFkaWFuUmF0ZShcbiAgICAgIGludGVyZXN0UmF0ZSxcbiAgICAgIHJ1bGVzLmludGVyZXN0LmNvbXBvdW5kaW5nLFxuICAgICAgcnVsZXMucGF5bWVudEZyZXF1ZW5jeVJ1bGVzW3BheW1lbnRGcmVxdWVuY3ldLnBheW1lbnRzUGVyWWVhclxuICAgICk7XG5cbiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIDQuIFBheW1lbnQgRnJlcXVlbmN5XG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBjb25zdCBmcmVxdWVuY3lSdWxlID0gcnVsZXMucGF5bWVudEZyZXF1ZW5jeVJ1bGVzW3BheW1lbnRGcmVxdWVuY3ldO1xuICAgIGNvbnN0IHBheW1lbnRzUGVyWWVhciA9IGZyZXF1ZW5jeVJ1bGUucGF5bWVudHNQZXJZZWFyO1xuICAgIGNvbnN0IHRvdGFsUGF5bWVudHMgPSBhbW9ydGl6YXRpb25ZZWFycyAqIHBheW1lbnRzUGVyWWVhcjtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgNS4gTW9ydGdhZ2UgUGF5bWVudCBGb3JtdWxhXG4gICAgICAgUCA9IEwgw5cgWyByKDErcilebiBdIC8gWyAoMStyKV5uIOKIkiAxIF1cbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGNvbnN0IHBheW1lbnRBbW91bnQgPSB0aGlzLmNhbGN1bGF0ZVBheW1lbnQoXG4gICAgICB0b3RhbE1vcnRnYWdlLFxuICAgICAgcGVyaW9kaWNSYXRlLFxuICAgICAgdG90YWxQYXltZW50c1xuICAgICk7XG5cbiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIDYuIFRvdGFsc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgdG90YWxQYWlkID0gcGF5bWVudEFtb3VudCAqIHRvdGFsUGF5bWVudHM7XG4gICAgY29uc3QgdG90YWxJbnRlcmVzdFBhaWQgPSB0b3RhbFBhaWQgLSB0b3RhbE1vcnRnYWdlO1xuXG4gICAgY29uc3QgYW1vcnRpemF0aW9uU2NoZWR1bGUgPSB0aGlzLmNhbGN1bGF0ZUFtb3J0aXphdGlvblNjaGVkdWxlKFxuICAgICAgdG90YWxNb3J0Z2FnZSxcbiAgICAgIHBlcmlvZGljUmF0ZSxcbiAgICAgIHBheW1lbnRBbW91bnQsXG4gICAgICB0b3RhbFBheW1lbnRzLFxuICAgICAgYW1vcnRpemF0aW9uWWVhcnMsXG4gICAgICBwYXltZW50c1BlclllYXJcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvYW5BbW91bnQ6IGxvYW5BbW91bnQsXG4gICAgICBpbnN1cmFuY2VQcmVtaXVtOiBpbnN1cmFuY2VQcmVtaXVtLFxuICAgICAgdG90YWxNb3J0Z2FnZTogdG90YWxNb3J0Z2FnZSxcbiAgICAgIG1vbnRobHlQYXltZW50OiBwYXltZW50QW1vdW50LFxuICAgICAgdG90YWxJbnRlcmVzdFBhaWQ6IHRvdGFsSW50ZXJlc3RQYWlkLFxuICAgICAgdG90YWxQYWlkOiB0b3RhbFBhaWQsXG4gICAgICBhbW9ydGl6YXRpb25TY2hlZHVsZTogYW1vcnRpemF0aW9uU2NoZWR1bGUsXG4gICAgICBvdGhlckZlZXM6IHtcbiAgICAgICAgbm90YXJ5RmVlczoge1xuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBsYWJlbDogJ05PVEFSWV9GRUVTJ1xuICAgICAgICB9LFxuICAgICAgICBiYW5rRmVlczoge1xuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBsYWJlbDogJ0JBTktfRkVFUydcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhseUluc3VyYW5jZUZlZXM6IHtcbiAgICAgICAgICAgIHZhbHVlOiBpbnN1cmFuY2VQcmVtaXVtLFxuICAgICAgICAgICAgbGFiZWw6ICdJTlNVUkFOQ0VfUFJFTUlVTSdcbiAgICAgICAgfVxuICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgIEhlbHBlciBNZXRob2RzXG4gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gIHByaXZhdGUgY2FsY3VsYXRlQW1vcnRpemF0aW9uU2NoZWR1bGUoXG4gICAgcHJpbmNpcGFsOiBudW1iZXIsXG4gICAgcGVyaW9kaWNSYXRlOiBudW1iZXIsXG4gICAgcGF5bWVudEFtb3VudDogbnVtYmVyLFxuICAgIHRvdGFsUGF5bWVudHM6IG51bWJlcixcbiAgICBhbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyLFxuICAgIHBheW1lbnRzUGVyWWVhcjogbnVtYmVyXG4gICk6IEFtb3J0aXphdGlvblNjaGVkdWxlSXRlbVtdIHtcbiAgICBjb25zdCBzY2hlZHVsZTogQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtW10gPSBbXTtcbiAgICBsZXQgYmFsYW5jZSA9IHByaW5jaXBhbDtcblxuICAgIGZvciAobGV0IHllYXIgPSAxOyB5ZWFyIDw9IGFtb3J0aXphdGlvblllYXJzOyB5ZWFyKyspIHtcbiAgICAgIGxldCB5ZWFybHlQcmluY2lwYWwgPSAwO1xuICAgICAgbGV0IHllYXJseUludGVyZXN0ID0gMDtcblxuICAgICAgY29uc3QgcGF5bWVudHNJblllYXIgPSBNYXRoLm1pbihwYXltZW50c1BlclllYXIsIHRvdGFsUGF5bWVudHMgLSAoeWVhciAtIDEpICogcGF5bWVudHNQZXJZZWFyKTtcblxuICAgICAgZm9yIChsZXQgcGF5bWVudCA9IDE7IHBheW1lbnQgPD0gcGF5bWVudHNJblllYXI7IHBheW1lbnQrKykge1xuICAgICAgICBjb25zdCBpbnRlcmVzdFBheW1lbnQgPSBiYWxhbmNlICogcGVyaW9kaWNSYXRlO1xuICAgICAgICBjb25zdCBwcmluY2lwYWxQYXltZW50ID0gcGF5bWVudEFtb3VudCAtIGludGVyZXN0UGF5bWVudDtcblxuICAgICAgICB5ZWFybHlJbnRlcmVzdCArPSBpbnRlcmVzdFBheW1lbnQ7XG4gICAgICAgIHllYXJseVByaW5jaXBhbCArPSBwcmluY2lwYWxQYXltZW50O1xuICAgICAgICBiYWxhbmNlIC09IHByaW5jaXBhbFBheW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlLnB1c2goe1xuICAgICAgICB5ZWFyLFxuICAgICAgICBwcmluY2lwYWw6IHllYXJseVByaW5jaXBhbCxcbiAgICAgICAgaW50ZXJlc3Q6IHllYXJseUludGVyZXN0LFxuICAgICAgICBiYWxhbmNlOiBNYXRoLm1heCgwLCBiYWxhbmNlKVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChiYWxhbmNlIDw9IDApIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBzY2hlZHVsZTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhbmFkaWFuUmF0ZShcbiAgICBhbm51YWxSYXRlOiBudW1iZXIsXG4gICAgY29tcG91bmRpbmc6ICdTRU1JX0FOTlVBTCcgfCAnQU5OVUFMJyB8ICdNT05USExZJyxcbiAgICBwYXltZW50c1BlclllYXI6IG51bWJlclxuICApOiBudW1iZXIge1xuXG4gICAgaWYgKGNvbXBvdW5kaW5nICE9PSAnU0VNSV9BTk5VQUwnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgQ2FuYWRpYW4gc2VtaS1hbm51YWwgY29tcG91bmRpbmcgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgLy8gQ2FuYWRpYW4gc3RhbmRhcmQgY29udmVyc2lvblxuICAgIGNvbnN0IHNlbWlBbm51YWxSYXRlID0gYW5udWFsUmF0ZSAvIDI7XG4gICAgY29uc3QgZWZmZWN0aXZlQW5udWFsUmF0ZSA9IE1hdGgucG93KDEgKyBzZW1pQW5udWFsUmF0ZSwgMikgLSAxO1xuXG4gICAgcmV0dXJuIE1hdGgucG93KDEgKyBlZmZlY3RpdmVBbm51YWxSYXRlLCAxIC8gcGF5bWVudHNQZXJZZWFyKSAtIDE7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVBheW1lbnQocHJpbmNpcGFsOiBudW1iZXIsIHJhdGU6IG51bWJlciwgcGVyaW9kczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmF0ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHByaW5jaXBhbCAvIHBlcmlvZHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByaW5jaXBhbCAqXG4gICAgICAocmF0ZSAqIE1hdGgucG93KDEgKyByYXRlLCBwZXJpb2RzKSkgL1xuICAgICAgKE1hdGgucG93KDEgKyByYXRlLCBwZXJpb2RzKSAtIDEpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9ydGdhZ2UvY2FuYWRhL2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUnVsZU1ldGEgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL2RvbWFpbi90eXBlc1wiO1xuaW1wb3J0IHsgT3RoZXJGZWVzIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVJbnB1dERlZmluaXRpb24ge1xuICAgIHR5cGU6ICdudW1iZXInIHwgJ3N0cmluZyc7XG4gICAgbWluPzogbnVtYmVyO1xuICAgIG1heD86IG51bWJlcjtcbiAgICBlbnVtPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUlucHV0cyB7XG4gICAgcHJvcGVydHlQcmljZTogUnVsZUlucHV0RGVmaW5pdGlvbjtcbiAgICBkb3duUGF5bWVudDogUnVsZUlucHV0RGVmaW5pdGlvbjtcbiAgICBpbnRlcmVzdFJhdGU6IFJ1bGVJbnB1dERlZmluaXRpb247XG4gICAgYW1vcnRpemF0aW9uWWVhcnM6IFJ1bGVJbnB1dERlZmluaXRpb247XG4gICAgcGF5bWVudEZyZXF1ZW5jeTogUnVsZUlucHV0RGVmaW5pdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlT3V0cHV0cyB7XG4gICAgbG9hbkFtb3VudDogJ251bWJlcic7XG4gICAgaW5zdXJhbmNlUHJlbWl1bTogJ251bWJlcic7XG4gICAgdG90YWxNb3J0Z2FnZTogJ251bWJlcic7XG4gICAgcGF5bWVudEFtb3VudDogJ251bWJlcic7XG4gICAgdG90YWxJbnRlcmVzdFBhaWQ6ICdudW1iZXInO1xuICAgIHRvdGFsUGFpZDogJ251bWJlcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkNvbnN0cmFpbnRzIHtcbiAgICBtYXhBbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICAgIGluc3VyZWRNYXhBbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICAgIG1pbkRvd25QYXltZW50OiB7XG4gICAgICAgIHVwVG81MDBrOiBudW1iZXI7XG4gICAgICAgIGFib3ZlNTAwazogbnVtYmVyO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnN1cmFuY2VSYXRlIHtcbiAgICBtYXhMdHY6IG51bWJlcjtcbiAgICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnN1cmFuY2VSdWxlcyB7XG4gICAgcmVxdWlyZWRCZWxvd0x0djogbnVtYmVyO1xuICAgIHByZW1pdW1SYXRlczogTW9ydGdhZ2VJbnN1cmFuY2VSYXRlW107XG4gICAgcHJlbWl1bUFkZGVkVG9Mb2FuOiBib29sZWFuO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VSdWxlcyB7XG4gICAgbG9hbkNvbnN0cmFpbnRzOiBMb2FuQ29uc3RyYWludHM7XG4gICAgbW9ydGdhZ2VJbnN1cmFuY2U6IE1vcnRnYWdlSW5zdXJhbmNlUnVsZXM7XG4gICAgaW50ZXJlc3Q6IEludGVyZXN0UnVsZXM7XG4gICAgcGF5bWVudEZyZXF1ZW5jeVJ1bGVzOiBQYXltZW50RnJlcXVlbmN5UnVsZXM7XG4gICAgc3RyZXNzVGVzdDogU3RyZXNzVGVzdFJ1bGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZXN0UnVsZXMge1xuICAgIGNvbXBvdW5kaW5nOiAnU0VNSV9BTk5VQUwnIHwgJ0FOTlVBTCcgfCAnTU9OVEhMWSc7XG4gICAgY29udmVyc2lvbkZvcm11bGE6ICdDQU5BREFfU1RBTkRBUkQnIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRGcmVxdWVuY3lSdWxlIHtcbiAgICBwYXltZW50c1BlclllYXI6IG51bWJlcjtcbiAgICBhY2NlbGVyYXRpb24/
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9ydGdhZ2UvY2FuYWRhL2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUnVsZU1ldGEgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL2RvbWFpbi90eXBlc1wiO1xuaW1wb3J0IHsgT3RoZXJGZWVzIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVJbnB1dERlZmluaXRpb24ge1xuICAgIHR5cGU6ICdudW1iZXInIHwgJ3N0cmluZyc7XG4gICAgbWluPzogbnVtYmVyO1xuICAgIG1heD86IG51bWJlcjtcbiAgICBlbnVtPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUlucHV0cyB7XG4gICAgcHJvcGVydHlQcmljZTogUnVsZUlucHV0RGVmaW5pdGlvbjtcbiAgICBkb3duUGF5bWVudDogUnVsZUlucHV0RGVmaW5pdGlvbjtcbiAgICBpbnRlcmVzdFJhdGU6IFJ1bGVJbnB1dERlZmluaXRpb247XG4gICAgYW1vcnRpemF0aW9uWWVhcnM6IFJ1bGVJbnB1dERlZmluaXRpb247XG4gICAgcGF5bWVudEZyZXF1ZW5jeTogUnVsZUlucHV0RGVmaW5pdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlT3V0cHV0cyB7XG4gICAgbG9hbkFtb3VudDogJ251bWJlcic7XG4gICAgaW5zdXJhbmNlUHJlbWl1bTogJ251bWJlcic7XG4gICAgdG90YWxNb3J0Z2FnZTogJ251bWJlcic7XG4gICAgcGF5bWVudEFtb3VudDogJ251bWJlcic7XG4gICAgdG90YWxJbnRlcmVzdFBhaWQ6ICdudW1iZXInO1xuICAgIHRvdGFsUGFpZDogJ251bWJlcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkNvbnN0cmFpbnRzIHtcbiAgICBtYXhBbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICAgIGluc3VyZWRNYXhBbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICAgIG1pbkRvd25QYXltZW50OiB7XG4gICAgICAgIHVwVG81MDBrOiBudW1iZXI7XG4gICAgICAgIGFib3ZlNTAwazogbnVtYmVyO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnN1cmFuY2VSYXRlIHtcbiAgICBtYXhMdHY6IG51bWJlcjtcbiAgICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnN1cmFuY2VSdWxlcyB7XG4gICAgcmVxdWlyZWRCZWxvd0x0djogbnVtYmVyO1xuICAgIHByZW1pdW1SYXRlczogTW9ydGdhZ2VJbnN1cmFuY2VSYXRlW107XG4gICAgcHJlbWl1bUFkZGVkVG9Mb2FuOiBib29sZWFuO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VSdWxlcyB7XG4gICAgbG9hbkNvbnN0cmFpbnRzOiBMb2FuQ29uc3RyYWludHM7XG4gICAgbW9ydGdhZ2VJbnN1cmFuY2U6IE1vcnRnYWdlSW5zdXJhbmNlUnVsZXM7XG4gICAgaW50ZXJlc3Q6IEludGVyZXN0UnVsZXM7XG4gICAgcGF5bWVudEZyZXF1ZW5jeVJ1bGVzOiBQYXltZW50RnJlcXVlbmN5UnVsZXM7XG4gICAgc3RyZXNzVGVzdDogU3RyZXNzVGVzdFJ1bGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZXN0UnVsZXMge1xuICAgIGNvbXBvdW5kaW5nOiAnU0VNSV9BTk5VQUwnIHwgJ0FOTlVBTCcgfCAnTU9OVEhMWSc7XG4gICAgY29udmVyc2lvbkZvcm11bGE6ICdDQU5BREFfU1RBTkRBUkQnIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRGcmVxdWVuY3lSdWxlIHtcbiAgICBwYXltZW50c1BlclllYXI6IG51bWJlcjtcbiAgICBhY2NlbGVyYXRpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRGcmVxdWVuY3lSdWxlcyB7XG4gICAgTU9OVEhMWTogUGF5bWVudEZyZXF1ZW5jeVJ1bGU7XG4gICAgQklfV0VFS0xZOiBQYXltZW50RnJlcXVlbmN5UnVsZTtcbiAgICBBQ0NFTEVSQVRFRF9CSV9XRUVLTFk6IFBheW1lbnRGcmVxdWVuY3lSdWxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVzc1Rlc3RSdWxlcyB7XG4gICAgYXBwbHk6IGJvb2xlYW47XG4gICAgbWluaW11bVJhdGVCdWZmZXI6IG51bWJlcjtcbiAgICBtaW5pbXVtUXVhbGlmeWluZ1JhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZVJ1bGVTZXQge1xuICAgIG1ldGE6IFJ1bGVNZXRhO1xuICAgIGlucHV0czogUnVsZUlucHV0cztcbiAgICBydWxlczogTW9ydGdhZ2VSdWxlcztcbiAgICBvdXRwdXRzOiBSdWxlT3V0cHV0cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUNhbGN1bGF0aW9uSW5wdXQge1xuICBwcm9wZXJ0eVByaWNlOiBudW1iZXI7XG4gIGRvd25QYXltZW50OiBudW1iZXI7XG4gIGludGVyZXN0UmF0ZTogbnVtYmVyOyAvLyBBbm51YWwgbm9taW5hbCByYXRlIChlLmcuIDAuMDUyKVxuICBhbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICBwYXltZW50RnJlcXVlbmN5OiAnTU9OVEhMWScgfCAnQklfV0VFS0xZJyB8ICdBQ0NFTEVSQVRFRF9CSV9XRUVLTFknO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFtb3J0aXphdGlvblNjaGVkdWxlSXRlbSB7XG4gIHllYXI6IG51bWJlcjtcbiAgcHJpbmNpcGFsOiBudW1iZXI7XG4gIGludGVyZXN0OiBudW1iZXI7XG4gIGJhbGFuY2U6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0IHtcbiAgbG9hbkFtb3VudDogbnVtYmVyO1xuICBpbnN1cmFuY2VQcmVtaXVtOiBudW1iZXI7XG4gIHRvdGFsTW9ydGdhZ2U6IG51bWJlcjtcbiAgbW9udGhseVBheW1lbnQ6IG51bWJlcjtcbiAgdG90YWxJbnRlcmVzdFBhaWQ6IG51bWJlcjtcbiAgdG90YWxQYWlkOiBudW1iZXI7XG4gIGFtb3J0aXphdGlvblNjaGVkdWxlOiBBbW9ydGl6YXRpb25TY2hlZHVsZUl0ZW1bXTtcbiAgb3RoZXJGZWVzOiBPdGhlckZlZXM7XG59XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Rules, Input, Result } from './domain/types';
|
|
2
|
+
import { CanadaCorporateTaxService } from './CanadaCorporateTaxService';
|
|
3
|
+
export declare class CanadaCorporateTaxServiceImpl implements CanadaCorporateTaxService {
|
|
4
|
+
private _input;
|
|
5
|
+
private _rules;
|
|
6
|
+
constructor(input: Input, rules: Rules);
|
|
7
|
+
calculate(): Result;
|
|
8
|
+
private applyRules;
|
|
9
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface RegimeItem {
|
|
2
|
+
type: 'flat' | 'progressive';
|
|
3
|
+
rate: number;
|
|
4
|
+
maxIncome?: number;
|
|
5
|
+
brackets?: ProgressiveTaxBracket[];
|
|
6
|
+
}
|
|
7
|
+
export interface Regime {
|
|
8
|
+
general: RegimeItem[];
|
|
9
|
+
smallBusiness: RegimeItem[];
|
|
10
|
+
}
|
|
11
|
+
export interface Input {
|
|
12
|
+
taxableIncome: number;
|
|
13
|
+
isSmallBusiness: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface Output {
|
|
16
|
+
name: string;
|
|
17
|
+
type: 'number' | 'string';
|
|
18
|
+
unit?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface FlatTaxRule {
|
|
21
|
+
type: 'flat';
|
|
22
|
+
rate: number;
|
|
23
|
+
}
|
|
24
|
+
export interface ProgressiveTaxBracket {
|
|
25
|
+
from: number;
|
|
26
|
+
to: number | null;
|
|
27
|
+
rate: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ProgressiveTaxRule {
|
|
30
|
+
type: 'progressive';
|
|
31
|
+
brackets: ProgressiveTaxBracket[];
|
|
32
|
+
eligibility?: Record<string, any>;
|
|
33
|
+
}
|
|
34
|
+
export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
|
|
35
|
+
export interface Rules {
|
|
36
|
+
regimes: Record<string, TaxRule>;
|
|
37
|
+
}
|
|
38
|
+
export interface Result {
|
|
39
|
+
corporateTax: number;
|
|
40
|
+
effectiveTaxRate: number;
|
|
41
|
+
breakdown: Record<string, number>;
|
|
42
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Rules, Input, Result } from './domain/types';
|
|
2
|
+
import { FranceCorporateTaxService } from './FranceCorporateTaxService';
|
|
3
|
+
export declare class FranceCorporateTaxServiceImpl implements FranceCorporateTaxService {
|
|
4
|
+
private _input;
|
|
5
|
+
private _rules;
|
|
6
|
+
constructor(input: Input, rules: Rules);
|
|
7
|
+
calculate(): Result;
|
|
8
|
+
private applyRules;
|
|
9
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface RegimeCondition {
|
|
2
|
+
maxTurnover: number;
|
|
3
|
+
}
|
|
4
|
+
export interface RegimeItem {
|
|
5
|
+
type: 'flat' | 'progressive';
|
|
6
|
+
rate?: number;
|
|
7
|
+
maxIncome?: number;
|
|
8
|
+
brackets?: ProgressiveTaxBracket[];
|
|
9
|
+
}
|
|
10
|
+
export interface Regime {
|
|
11
|
+
general: RegimeItem[];
|
|
12
|
+
smallBusiness: RegimeItem[];
|
|
13
|
+
}
|
|
14
|
+
export interface Input {
|
|
15
|
+
taxableIncome: number;
|
|
16
|
+
annualTurnover: number;
|
|
17
|
+
isSmallBusiness: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface Output {
|
|
20
|
+
name: string;
|
|
21
|
+
type: 'number' | 'string';
|
|
22
|
+
unit?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface FlatTaxRule {
|
|
25
|
+
type: 'flat';
|
|
26
|
+
rate: number;
|
|
27
|
+
conditions?: RegimeCondition;
|
|
28
|
+
}
|
|
29
|
+
export interface ProgressiveTaxBracket {
|
|
30
|
+
from: number;
|
|
31
|
+
to: number | null;
|
|
32
|
+
rate: number;
|
|
33
|
+
}
|
|
34
|
+
export interface ProgressiveTaxRule {
|
|
35
|
+
type: 'progressive';
|
|
36
|
+
brackets: ProgressiveTaxBracket[];
|
|
37
|
+
eligibility?: Record<string, any>;
|
|
38
|
+
conditions?: RegimeCondition;
|
|
39
|
+
}
|
|
40
|
+
export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
|
|
41
|
+
export interface Rules {
|
|
42
|
+
regimes: Record<string, TaxRule>;
|
|
43
|
+
}
|
|
44
|
+
export interface Result {
|
|
45
|
+
corporateTax: number;
|
|
46
|
+
effectiveTaxRate: number;
|
|
47
|
+
breakdown: Record<string, number>;
|
|
48
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Rules, Input, Result } from './domain/types';
|
|
2
|
+
import { SouthAfricaCorporateTaxService } from './SouthAfricaCorporateTaxService';
|
|
3
|
+
export declare class SouthAfricaCorporateTaxServiceImpl implements SouthAfricaCorporateTaxService {
|
|
4
|
+
private _input;
|
|
5
|
+
private _rules;
|
|
6
|
+
constructor(input: Input, rules: Rules);
|
|
7
|
+
calculate(): Result;
|
|
8
|
+
private calculateProgressiveTax;
|
|
9
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface Input {
|
|
2
|
+
taxableIncome: number;
|
|
3
|
+
regime: 'LARGE' | 'SBC';
|
|
4
|
+
}
|
|
5
|
+
export interface Output {
|
|
6
|
+
name: string;
|
|
7
|
+
type: 'number' | 'string';
|
|
8
|
+
unit?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface FlatTaxRule {
|
|
11
|
+
type: 'flat';
|
|
12
|
+
rate: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ProgressiveTaxBracket {
|
|
15
|
+
from: number;
|
|
16
|
+
to: number | null;
|
|
17
|
+
rate: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ProgressiveTaxRule {
|
|
20
|
+
type: 'progressive';
|
|
21
|
+
brackets: ProgressiveTaxBracket[];
|
|
22
|
+
eligibility?: Record<string, any>;
|
|
23
|
+
}
|
|
24
|
+
export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
|
|
25
|
+
export interface Rules {
|
|
26
|
+
regimes: Record<string, TaxRule>;
|
|
27
|
+
}
|
|
28
|
+
export interface Result {
|
|
29
|
+
corporateTax: number;
|
|
30
|
+
effectiveTaxRate: number;
|
|
31
|
+
breakdown: Record<string, number>;
|
|
32
|
+
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -3,13 +3,19 @@ export { CanadaIncomeTaxServiceImpl as CanadaIncomeTaxService } from './income-t
|
|
|
3
3
|
export { CanadaMortgageServiceImpl as CanadaMortgageService } from './mortgage/canada/CanadaMortgageServiceImpl';
|
|
4
4
|
export { ComputedIncomeTaxValues as CanadaComputedIncomeTaxValues, IncomeTaxRules as CanadaIncomeTaxRules, } from './income-tax/canada/domain/types';
|
|
5
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';
|
|
6
8
|
export { FranceIncomeTaxServiceImpl as FranceIncomeTaxService } from './income-tax/france/FranceIncomeTaxServiceImpl';
|
|
7
9
|
export { FranceMortgageServiceImpl as FranceMortgageService } from './mortgage/france/FranceMortgageServiceImpl';
|
|
8
10
|
export { ComputedIncomeTaxValues as FranceComputedIncomeTaxValues, IncomeTaxRules as FranceIncomeTaxRules, } from './income-tax/france/domain/types';
|
|
9
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';
|
|
10
14
|
export { SouthAfricaIncomeTaxServiceImpl as SouthAfricaIncomeTaxService } from './income-tax/south-africa/SouthAfricaIncomeTaxServiceImpl';
|
|
11
15
|
export { SouthAfricaMortgageServiceImpl as SouthAfricaMortgageService } from './mortgage/south-africa/SouthAfricaMortgageServiceImpl';
|
|
12
16
|
export { ComputedIncomeTaxValues as SouthAfricaComputedIncomeTaxValues, IncomeTaxRules as SouthAfricaIncomeTaxRules, } from './income-tax/south-africa/domain/types';
|
|
13
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';
|
|
14
20
|
export { IncomeTaxCalculatorSchema } from './income-tax/domain/types';
|
|
15
21
|
export * from './income-tax/domain/types';
|
|
@@ -86,7 +86,7 @@ export interface MortgageCalculationResult {
|
|
|
86
86
|
loanAmount: number;
|
|
87
87
|
insurancePremium: number;
|
|
88
88
|
totalMortgage: number;
|
|
89
|
-
|
|
89
|
+
monthlyPayment: number;
|
|
90
90
|
totalInterestPaid: number;
|
|
91
91
|
totalPaid: number;
|
|
92
92
|
amortizationSchedule: AmortizationScheduleItem[];
|
package/package.json
CHANGED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Rules, Input, Result, ProgressiveTaxBracket } from './domain/types';
|
|
2
|
+
import { CanadaCorporateTaxService } from './CanadaCorporateTaxService';
|
|
3
|
+
|
|
4
|
+
export class CanadaCorporateTaxServiceImpl implements CanadaCorporateTaxService {
|
|
5
|
+
private _input: Input;
|
|
6
|
+
private _rules: Rules;
|
|
7
|
+
|
|
8
|
+
constructor(input: Input, rules: Rules) {
|
|
9
|
+
this._input = input;
|
|
10
|
+
this._rules = rules;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
calculate(): Result {
|
|
14
|
+
const result = this.applyRules(this._rules, this._input);
|
|
15
|
+
|
|
16
|
+
const totalTax = result.tax;
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
corporateTax: totalTax,
|
|
20
|
+
effectiveTaxRate:
|
|
21
|
+
this._input.taxableIncome > 0
|
|
22
|
+
? (totalTax / this._input.taxableIncome) * 100
|
|
23
|
+
: 0,
|
|
24
|
+
breakdown: result.breakdown,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private applyRules(rules: Rules, input: Input): { tax: number; breakdown: Record<string, number> } {
|
|
29
|
+
const regime = input.isSmallBusiness
|
|
30
|
+
? rules.regimes.smallBusiness
|
|
31
|
+
: rules.regimes.general;
|
|
32
|
+
|
|
33
|
+
if (regime.type === 'flat') {
|
|
34
|
+
const tax = input.taxableIncome * regime.rate;
|
|
35
|
+
return {
|
|
36
|
+
tax,
|
|
37
|
+
breakdown: { flatTax: tax },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (regime.type === 'progressive') {
|
|
42
|
+
let remaining = input.taxableIncome;
|
|
43
|
+
let tax = 0;
|
|
44
|
+
const breakdown: Record<string, number> = {};
|
|
45
|
+
|
|
46
|
+
for (const bracket of regime.brackets) {
|
|
47
|
+
if (remaining <= 0) break;
|
|
48
|
+
|
|
49
|
+
const upper = bracket.to ?? Infinity;
|
|
50
|
+
const taxable = Math.min(upper - bracket.from, remaining);
|
|
51
|
+
|
|
52
|
+
const bracketTax = taxable * bracket.rate;
|
|
53
|
+
tax += bracketTax;
|
|
54
|
+
remaining -= taxable;
|
|
55
|
+
|
|
56
|
+
const bracketKey = bracket.to === null
|
|
57
|
+
? `bracket_${bracket.from}_and_above`
|
|
58
|
+
: `bracket_${bracket.from}_to_${bracket.to}`;
|
|
59
|
+
breakdown[bracketKey] = bracketTax;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return { tax, breakdown };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
throw new Error('Unsupported regime type');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
export interface RegimeItem {
|
|
4
|
+
type: 'flat' | 'progressive';
|
|
5
|
+
rate: number;
|
|
6
|
+
maxIncome?: number;
|
|
7
|
+
brackets?: ProgressiveTaxBracket[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface Regime {
|
|
11
|
+
general: RegimeItem[];
|
|
12
|
+
smallBusiness: RegimeItem[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface Input {
|
|
16
|
+
taxableIncome: number;
|
|
17
|
+
isSmallBusiness: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface Output {
|
|
21
|
+
name: string;
|
|
22
|
+
type: 'number' | 'string';
|
|
23
|
+
unit?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface FlatTaxRule {
|
|
27
|
+
type: 'flat';
|
|
28
|
+
rate: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ProgressiveTaxBracket {
|
|
32
|
+
from: number;
|
|
33
|
+
to: number | null;
|
|
34
|
+
rate: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface ProgressiveTaxRule {
|
|
38
|
+
type: 'progressive';
|
|
39
|
+
brackets: ProgressiveTaxBracket[];
|
|
40
|
+
eligibility?: Record<string, any>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
|
|
44
|
+
|
|
45
|
+
export interface Rules {
|
|
46
|
+
regimes: Record<string, TaxRule>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface Result {
|
|
50
|
+
corporateTax: number;
|
|
51
|
+
effectiveTaxRate: number;
|
|
52
|
+
breakdown: Record<string, number>;
|
|
53
|
+
}
|
|
54
|
+
|
|
File without changes
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Rules, Input, Result, ProgressiveTaxBracket } from './domain/types';
|
|
2
|
+
import { FranceCorporateTaxService } from './FranceCorporateTaxService';
|
|
3
|
+
|
|
4
|
+
export class FranceCorporateTaxServiceImpl implements FranceCorporateTaxService {
|
|
5
|
+
private _input: Input;
|
|
6
|
+
private _rules: Rules;
|
|
7
|
+
|
|
8
|
+
constructor(input: Input, rules: Rules) {
|
|
9
|
+
this._input = input;
|
|
10
|
+
this._rules = rules;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
calculate(): Result {
|
|
14
|
+
const result = this.applyRules(this._rules, this._input);
|
|
15
|
+
|
|
16
|
+
const totalTax = result.tax;
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
corporateTax: totalTax,
|
|
20
|
+
effectiveTaxRate:
|
|
21
|
+
this._input.taxableIncome > 0
|
|
22
|
+
? (totalTax / this._input.taxableIncome) * 100
|
|
23
|
+
: 0,
|
|
24
|
+
breakdown: result.breakdown,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private applyRules(rules: Rules, input: Input): { tax: number; breakdown: Record<string, number> } {
|
|
29
|
+
const regime = input.isSmallBusiness
|
|
30
|
+
? rules.regimes.smallBusiness
|
|
31
|
+
: rules.regimes.general;
|
|
32
|
+
|
|
33
|
+
if (regime.conditions?.maxTurnover) {
|
|
34
|
+
if (input.annualTurnover > regime.conditions.maxTurnover) {
|
|
35
|
+
throw new Error('SME regime not applicable: turnover exceeded');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (regime.type === 'flat') {
|
|
40
|
+
const tax = input.taxableIncome * regime.rate;
|
|
41
|
+
return {
|
|
42
|
+
tax,
|
|
43
|
+
breakdown: { flatTax: tax },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (regime.type === 'progressive') {
|
|
48
|
+
let remaining = input.taxableIncome;
|
|
49
|
+
let tax = 0;
|
|
50
|
+
const breakdown: Record<string, number> = {};
|
|
51
|
+
|
|
52
|
+
for (const bracket of regime.brackets) {
|
|
53
|
+
if (remaining <= 0) break;
|
|
54
|
+
|
|
55
|
+
const upper = bracket.to ?? Infinity;
|
|
56
|
+
const taxable = Math.min(upper - bracket.from, remaining);
|
|
57
|
+
|
|
58
|
+
const bracketTax = taxable * bracket.rate;
|
|
59
|
+
tax += bracketTax;
|
|
60
|
+
remaining -= taxable;
|
|
61
|
+
|
|
62
|
+
const bracketKey = bracket.to === null
|
|
63
|
+
? `bracket_${bracket.from}_and_above`
|
|
64
|
+
: `bracket_${bracket.from}_to_${bracket.to}`;
|
|
65
|
+
breakdown[bracketKey] = bracketTax;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return { tax, breakdown };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
throw new Error('Unsupported regime type');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
|
|
2
|
+
export interface RegimeCondition {
|
|
3
|
+
maxTurnover: number;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface RegimeItem {
|
|
7
|
+
type: 'flat' | 'progressive';
|
|
8
|
+
rate?: number;
|
|
9
|
+
maxIncome?: number;
|
|
10
|
+
brackets?: ProgressiveTaxBracket[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface Regime {
|
|
14
|
+
general: RegimeItem[];
|
|
15
|
+
smallBusiness: RegimeItem[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface Input {
|
|
19
|
+
taxableIncome: number;
|
|
20
|
+
annualTurnover: number;
|
|
21
|
+
isSmallBusiness: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface Output {
|
|
25
|
+
name: string;
|
|
26
|
+
type: 'number' | 'string';
|
|
27
|
+
unit?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface FlatTaxRule {
|
|
31
|
+
type: 'flat';
|
|
32
|
+
rate: number;
|
|
33
|
+
conditions?: RegimeCondition;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ProgressiveTaxBracket {
|
|
37
|
+
from: number;
|
|
38
|
+
to: number | null;
|
|
39
|
+
rate: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface ProgressiveTaxRule {
|
|
43
|
+
type: 'progressive';
|
|
44
|
+
brackets: ProgressiveTaxBracket[];
|
|
45
|
+
eligibility?: Record<string, any>;
|
|
46
|
+
conditions?: RegimeCondition;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
|
|
50
|
+
|
|
51
|
+
export interface Rules {
|
|
52
|
+
regimes: Record<string, TaxRule>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface Result {
|
|
56
|
+
corporateTax: number;
|
|
57
|
+
effectiveTaxRate: number;
|
|
58
|
+
breakdown: Record<string, number>;
|
|
59
|
+
}
|
|
60
|
+
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Rules, Input, Result, ProgressiveTaxBracket } from './domain/types';
|
|
2
|
+
import { SouthAfricaCorporateTaxService } from './SouthAfricaCorporateTaxService';
|
|
3
|
+
|
|
4
|
+
export class SouthAfricaCorporateTaxServiceImpl implements SouthAfricaCorporateTaxService {
|
|
5
|
+
private _input: Input;
|
|
6
|
+
private _rules: Rules;
|
|
7
|
+
|
|
8
|
+
constructor(input: Input, rules: Rules) {
|
|
9
|
+
this._input = input;
|
|
10
|
+
this._rules = rules;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
calculate(): Result {
|
|
14
|
+
const rule = this._rules.regimes[this._input.regime];
|
|
15
|
+
|
|
16
|
+
if (!rule) {
|
|
17
|
+
throw new Error(`Unknown tax regime: ${this._input.regime}`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let tax = 0;
|
|
21
|
+
let breakdown: Record<string, number> = {};
|
|
22
|
+
|
|
23
|
+
if (rule.type === 'flat') {
|
|
24
|
+
tax = this._input.taxableIncome * rule.rate;
|
|
25
|
+
breakdown = {
|
|
26
|
+
flatTax: tax
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (rule.type === 'progressive') {
|
|
31
|
+
const result = this.calculateProgressiveTax(
|
|
32
|
+
this._input.taxableIncome,
|
|
33
|
+
rule.brackets
|
|
34
|
+
);
|
|
35
|
+
tax = result.total;
|
|
36
|
+
breakdown = result.breakdown;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
corporateTax: tax,
|
|
41
|
+
effectiveTaxRate:
|
|
42
|
+
this._input.taxableIncome > 0
|
|
43
|
+
? (tax / this._input.taxableIncome) * 100
|
|
44
|
+
: 0,
|
|
45
|
+
breakdown,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private calculateProgressiveTax(income: number, brackets: ProgressiveTaxBracket[]): { total: number; breakdown: Record<string, number> } {
|
|
50
|
+
let tax = 0;
|
|
51
|
+
const breakdown: Record<string, number> = {};
|
|
52
|
+
|
|
53
|
+
for (const bracket of brackets) {
|
|
54
|
+
if (income <= bracket.from) continue;
|
|
55
|
+
|
|
56
|
+
const upperLimit =
|
|
57
|
+
bracket.to === null ? income : Math.min(income, bracket.to);
|
|
58
|
+
|
|
59
|
+
const taxableAmount = upperLimit - bracket.from;
|
|
60
|
+
|
|
61
|
+
if (taxableAmount > 0) {
|
|
62
|
+
const bracketTax = taxableAmount * bracket.rate;
|
|
63
|
+
tax += bracketTax;
|
|
64
|
+
|
|
65
|
+
const bracketKey = bracket.to === null
|
|
66
|
+
? `bracket_${bracket.from}_and_above`
|
|
67
|
+
: `bracket_${bracket.from}_to_${bracket.to}`;
|
|
68
|
+
breakdown[bracketKey] = bracketTax;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return { total: tax, breakdown };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface Input {
|
|
2
|
+
taxableIncome: number;
|
|
3
|
+
regime: 'LARGE' | 'SBC';
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface Output {
|
|
7
|
+
name: string;
|
|
8
|
+
type: 'number' | 'string';
|
|
9
|
+
unit?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface FlatTaxRule {
|
|
13
|
+
type: 'flat';
|
|
14
|
+
rate: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface ProgressiveTaxBracket {
|
|
18
|
+
from: number;
|
|
19
|
+
to: number | null;
|
|
20
|
+
rate: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ProgressiveTaxRule {
|
|
24
|
+
type: 'progressive';
|
|
25
|
+
brackets: ProgressiveTaxBracket[];
|
|
26
|
+
eligibility?: Record<string, any>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
|
|
30
|
+
|
|
31
|
+
export interface Rules {
|
|
32
|
+
regimes: Record<string, TaxRule>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface Result {
|
|
36
|
+
corporateTax: number;
|
|
37
|
+
effectiveTaxRate: number;
|
|
38
|
+
breakdown: Record<string, number>;
|
|
39
|
+
}
|
|
40
|
+
|
package/src/index.ts
CHANGED
|
@@ -13,6 +13,13 @@ export {
|
|
|
13
13
|
MortgageCalculationResult as CanadaMortgageCalculationResult,
|
|
14
14
|
} from './mortgage/canada/domain/types';
|
|
15
15
|
|
|
16
|
+
export { CanadaCorporateTaxServiceImpl as CanadaCorporateTaxService } from './corporate/canada/CanadaCorporateTaxServiceImpl';
|
|
17
|
+
export {
|
|
18
|
+
Input as CanadaCorporateTaxInput,
|
|
19
|
+
Rules as CanadaCorporateTaxRules,
|
|
20
|
+
Result as CanadaCorporateTaxResult,
|
|
21
|
+
} from './corporate/canada/domain/types';
|
|
22
|
+
|
|
16
23
|
// France
|
|
17
24
|
export { FranceIncomeTaxServiceImpl as FranceIncomeTaxService } from './income-tax/france/FranceIncomeTaxServiceImpl';
|
|
18
25
|
export { FranceMortgageServiceImpl as FranceMortgageService } from './mortgage/france/FranceMortgageServiceImpl';
|
|
@@ -26,6 +33,13 @@ export {
|
|
|
26
33
|
MortgageOutput as FranceMortgageCalculationResult,
|
|
27
34
|
} from './mortgage/france/domain/types';
|
|
28
35
|
|
|
36
|
+
export { FranceCorporateTaxServiceImpl as FranceCorporateTaxService } from './corporate/france/FranceCorporateTaxServiceImpl';
|
|
37
|
+
export {
|
|
38
|
+
Input as FranceCorporateTaxInput,
|
|
39
|
+
Rules as FranceCorporateTaxRules,
|
|
40
|
+
Result as FranceCorporateTaxResult,
|
|
41
|
+
} from './corporate/france/domain/types';
|
|
42
|
+
|
|
29
43
|
// South Africa
|
|
30
44
|
export { SouthAfricaIncomeTaxServiceImpl as SouthAfricaIncomeTaxService } from './income-tax/south-africa/SouthAfricaIncomeTaxServiceImpl';
|
|
31
45
|
export { SouthAfricaMortgageServiceImpl as SouthAfricaMortgageService } from './mortgage/south-africa/SouthAfricaMortgageServiceImpl';
|
|
@@ -39,6 +53,12 @@ export {
|
|
|
39
53
|
MortgageOutput as SouthAfricaMortgageOutput,
|
|
40
54
|
} from './mortgage/south-africa/domain/types';
|
|
41
55
|
|
|
56
|
+
export { SouthAfricaCorporateTaxServiceImpl as SouthAfricaCorporateTaxService } from './corporate/south-africa/SouthAfricaCorporateTaxServiceImpl';
|
|
57
|
+
export {
|
|
58
|
+
Rules as SouthAfricaCorporateTaxRules,
|
|
59
|
+
Input as SouthAfricaCorporateTaxInput,
|
|
60
|
+
Result as SouthAfricaCorporateTaxResult,
|
|
61
|
+
} from './corporate/south-africa/domain/types';
|
|
42
62
|
|
|
43
63
|
export { IncomeTaxCalculatorSchema } from './income-tax/domain/types';
|
|
44
64
|
export * from './income-tax/domain/types';
|
|
@@ -101,7 +101,7 @@ export class CanadaMortgageServiceImpl implements CanadaMortgageService {
|
|
|
101
101
|
loanAmount: loanAmount,
|
|
102
102
|
insurancePremium: insurancePremium,
|
|
103
103
|
totalMortgage: totalMortgage,
|
|
104
|
-
|
|
104
|
+
monthlyPayment: paymentAmount,
|
|
105
105
|
totalInterestPaid: totalInterestPaid,
|
|
106
106
|
totalPaid: totalPaid,
|
|
107
107
|
amortizationSchedule: amortizationSchedule,
|
|
@@ -102,7 +102,7 @@ export interface MortgageCalculationResult {
|
|
|
102
102
|
loanAmount: number;
|
|
103
103
|
insurancePremium: number;
|
|
104
104
|
totalMortgage: number;
|
|
105
|
-
|
|
105
|
+
monthlyPayment: number;
|
|
106
106
|
totalInterestPaid: number;
|
|
107
107
|
totalPaid: number;
|
|
108
108
|
amortizationSchedule: AmortizationScheduleItem[];
|