@novha/calc-engines 1.0.0 → 1.0.1
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/domain/types.js +1 -1
- package/dist/income-tax/canada/CanadaIncomeTaxServiceImpl.js +5 -5
- package/dist/income-tax/canada/domain/types.js +1 -1
- package/dist/index.js +16 -1
- package/dist/types/domain/types.d.ts +2 -2
- package/dist/types/income-tax/canada/domain/types.d.ts +11 -4
- package/dist/types/index.d.ts +2 -1
- package/package.json +1 -1
- package/src/domain/types.ts +2 -2
- package/src/income-tax/canada/CanadaIncomeTaxServiceImpl.ts +4 -4
- package/src/income-tax/canada/domain/types.ts +13 -4
- package/src/index.ts +2 -1
package/dist/domain/types.js
CHANGED
|
@@ -7,4 +7,4 @@ var CalculatorType;
|
|
|
7
7
|
CalculatorType["MORTGAGE"] = "MORTGAGE";
|
|
8
8
|
CalculatorType["LOAN"] = "LOAN";
|
|
9
9
|
})(CalculatorType || (exports.CalculatorType = CalculatorType = {}));
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN0QiwyQ0FBeUIsQ0FBQTtJQUN6Qix1Q0FBcUIsQ0FBQTtJQUNyQiwrQkFBYSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxjQUFjLDhCQUFkLGNBQWMsUUFJekIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBDYWxjdWxhdG9yVHlwZSB7XG4gICAgSU5DT01FX1RBWCA9ICdJTkNPTUVfVEFYJyxcbiAgICBNT1JUR0FHRSA9ICdNT1JUR0FHRScsXG4gICAgTE9BTiA9ICdMT0FOJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVNZXRhIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvdW50cnk6IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgICBjYWxjdWxhdG9yOiBDYWxjdWxhdG9yVHlwZTtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgZWZmZWN0aXZlZnJvbTogc3RyaW5nO1xuICAgIGVmZmVjdGl2ZXRvOiBzdHJpbmcgfCBudWxsO1xuICAgIHNvdXJjZT86IFJ1bGVTb3VyY2VbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlU291cmNlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUlucHV0IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZTogJ251bWJlcicgfCAnc2VsZWN0JyB8ICd0ZXh0JztcbiAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICB1bml0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVPdXRwdXQge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiAnbnVtYmVyJyB8ICdzdHJpbmcnO1xuICAgIHVuaXQ/OiBzdHJpbmc7XG59Il19
|
|
@@ -7,7 +7,7 @@ class CanadaIncomeTaxServiceImpl {
|
|
|
7
7
|
this._rules = rules;
|
|
8
8
|
}
|
|
9
9
|
calculateNetIncome() {
|
|
10
|
-
const grossTax = this.computeGrossTax(this._income, this._rules.
|
|
10
|
+
const grossTax = this.computeGrossTax(this._income, this._rules.taxBrackets);
|
|
11
11
|
const netTax = this.applyCredits(grossTax, this._rules.credits);
|
|
12
12
|
const cpp = this.computeCPP(this._income, this._rules.contributions?.cpp);
|
|
13
13
|
const ei = this.computeEI(this._income, this._rules.contributions?.ei);
|
|
@@ -38,14 +38,14 @@ class CanadaIncomeTaxServiceImpl {
|
|
|
38
38
|
if (!cpp || income <= cpp.exemption)
|
|
39
39
|
return 0;
|
|
40
40
|
const contributable = income - cpp.exemption;
|
|
41
|
-
return Math.min(contributable * cpp.rate, cpp.
|
|
41
|
+
return Math.min(contributable * cpp.rate, cpp.maxContribution);
|
|
42
42
|
}
|
|
43
43
|
computeEI(income, ei) {
|
|
44
44
|
if (!ei)
|
|
45
45
|
return 0;
|
|
46
|
-
const insurableIncome = Math.min(income, ei.
|
|
47
|
-
return Math.min(insurableIncome * ei.rate, ei.
|
|
46
|
+
const insurableIncome = Math.min(income, ei.maxInsurableEarnings);
|
|
47
|
+
return Math.min(insurableIncome * ei.rate, ei.maxContribution);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
exports.CanadaIncomeTaxServiceImpl = CanadaIncomeTaxServiceImpl;
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhSW5jb21lVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5jb21lLXRheC9jYW5hZGEvQ2FuYWRhSW5jb21lVGF4U2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBV0EsTUFBYSwwQkFBMEI7SUFJbkMsWUFBWSxNQUFjLEVBQUUsS0FBcUI7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLGtCQUFrQjtRQUVyQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFdkUsT0FBTztZQUNILFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUN6QixTQUFTLEVBQUUsTUFBTTtZQUNqQixHQUFHO1lBQ0gsRUFBRTtZQUNGLGVBQWUsRUFBRSxNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUU7WUFDbEMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFO1lBQzNDLGdCQUFnQixFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTztTQUMxQyxDQUFDO0lBQ04sQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFjLEVBQUUsUUFBc0I7UUFDMUQsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBRW5DLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDO1lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFFakQsT0FBTyxLQUFLLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDcEMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVPLFlBQVksQ0FBQyxHQUFXLEVBQUUsVUFBcUMsRUFBRTtRQUNyRSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDOUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUNuQyxDQUFDLENBQ0osQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxVQUFVLENBQUMsTUFBYyxFQUFFLEdBQXFCO1FBQ3BELElBQUksQ0FBQyxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFFOUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUNYLGFBQWEsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUN4QixHQUFHLENBQUMsZUFBZSxDQUN0QixDQUFDO0lBQ04sQ0FBQztJQUVPLFNBQVMsQ0FBQyxNQUFjLEVBQUUsRUFBbUI7UUFDakQsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUVsQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUM1QixNQUFNLEVBQ04sRUFBRSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUNYLGVBQWUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUN6QixFQUFFLENBQUMsZUFBZSxDQUNyQixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBdEVELGdFQXNFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbmFkYUluY29tZVRheFNlcnZpY2UgfSBmcm9tIFwiLi9DYW5hZGFJbmNvbWVUYXhTZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIENQUENvbnRyaWJ1dGlvbixcbiAgICBDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBFSUNvbnRyaWJ1dGlvbixcbiAgICBJbmNvbWVUYXhSdWxlcyxcbiAgICBUYXhCcmFja2V0LFxuICAgIFRheENyZWRpdFxufSBmcm9tIFwiLi9kb21haW4vdHlwZXNcIjtcblxuXG5leHBvcnQgY2xhc3MgQ2FuYWRhSW5jb21lVGF4U2VydmljZUltcGwgaW1wbGVtZW50cyBDYW5hZGFJbmNvbWVUYXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9pbmNvbWU6IG51bWJlcjtcbiAgICBwcml2YXRlIF9ydWxlczogSW5jb21lVGF4UnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbmNvbWU6IG51bWJlciwgcnVsZXM6IEluY29tZVRheFJ1bGVzKSB7XG4gICAgICAgIHRoaXMuX2luY29tZSA9IGluY29tZTtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FsY3VsYXRlTmV0SW5jb21lKCk6IENvbXB1dGVkSW5jb21lVGF4VmFsdWVzIHtcblxuICAgICAgICBjb25zdCBncm9zc1RheCA9IHRoaXMuY29tcHV0ZUdyb3NzVGF4KHRoaXMuX2luY29tZSwgdGhpcy5fcnVsZXMudGF4QnJhY2tldHMpO1xuICAgICAgICBjb25zdCBuZXRUYXggPSB0aGlzLmFwcGx5Q3JlZGl0cyhncm9zc1RheCwgdGhpcy5fcnVsZXMuY3JlZGl0cyk7XG4gICAgICAgIGNvbnN0IGNwcCA9IHRoaXMuY29tcHV0ZUNQUCh0aGlzLl9pbmNvbWUsIHRoaXMuX3J1bGVzLmNvbnRyaWJ1dGlvbnM/LmNwcCk7XG4gICAgICAgIGNvbnN0IGVpID0gdGhpcy5jb21wdXRlRUkodGhpcy5faW5jb21lLCB0aGlzLl9ydWxlcy5jb250cmlidXRpb25zPy5laSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyb3NzSW5jb21lOiB0aGlzLl9pbmNvbWUsXG4gICAgICAgICAgICBpbmNvbWVUYXg6IG5ldFRheCxcbiAgICAgICAgICAgIGNwcCxcbiAgICAgICAgICAgIGVpLFxuICAgICAgICAgICAgdG90YWxEZWR1Y3Rpb25zOiBuZXRUYXggKyBjcHAgKyBlaSxcbiAgICAgICAgICAgIG5ldEluY29tZTogdGhpcy5faW5jb21lIC0gbmV0VGF4IC0gY3BwIC0gZWksXG4gICAgICAgICAgICBlZmZlY3RpdmVUYXhSYXRlOiBuZXRUYXggLyB0aGlzLl9pbmNvbWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlR3Jvc3NUYXgoaW5jb21lOiBudW1iZXIsIGJyYWNrZXRzOiBUYXhCcmFja2V0W10pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gYnJhY2tldHMucmVkdWNlKCh0b3RhbCwgYikgPT4ge1xuICAgICAgICAgICAgaWYgKGluY29tZSA8PSBiLmZyb20pIHJldHVybiB0b3RhbDtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IHVwcGVyID0gYi50byA/PyBpbmNvbWU7XG4gICAgICAgICAgICBjb25zdCB0YXhhYmxlID0gTWF0aC5taW4oaW5jb21lLCB1cHBlcikgLSBiLmZyb207XG4gICAgXG4gICAgICAgICAgICByZXR1cm4gdG90YWwgKyB0YXhhYmxlICogYi5yYXRlO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5Q3JlZGl0cyh0YXg6IG51bWJlciwgY3JlZGl0czogUmVjb3JkPHN0cmluZywgVGF4Q3JlZGl0PiA9IHt9KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdG90YWxDcmVkaXRzID0gT2JqZWN0LnZhbHVlcyhjcmVkaXRzKS5yZWR1Y2UoXG4gICAgICAgICAgICAoc3VtLCBjKSA9PiBzdW0gKyBjLmFtb3VudCAqIGMucmF0ZSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICk7XG4gICAgXG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCB0YXggLSB0b3RhbENyZWRpdHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29tcHV0ZUNQUChpbmNvbWU6IG51bWJlciwgY3BwPzogQ1BQQ29udHJpYnV0aW9uKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFjcHAgfHwgaW5jb21lIDw9IGNwcC5leGVtcHRpb24pIHJldHVybiAwO1xuICAgIFxuICAgICAgICBjb25zdCBjb250cmlidXRhYmxlID0gaW5jb21lIC0gY3BwLmV4ZW1wdGlvbjtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgICAgICAgY29udHJpYnV0YWJsZSAqIGNwcC5yYXRlLFxuICAgICAgICAgICAgY3BwLm1heENvbnRyaWJ1dGlvbixcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVFSShpbmNvbWU6IG51bWJlciwgZWk/OiBFSUNvbnRyaWJ1dGlvbik6IG51bWJlciB7XG4gICAgICAgIGlmICghZWkpIHJldHVybiAwO1xuICAgIFxuICAgICAgICBjb25zdCBpbnN1cmFibGVJbmNvbWUgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIGluY29tZSxcbiAgICAgICAgICAgIGVpLm1heEluc3VyYWJsZUVhcm5pbmdzLFxuICAgICAgICApO1xuICAgIFxuICAgICAgICByZXR1cm4gTWF0aC5taW4oXG4gICAgICAgICAgICBpbnN1cmFibGVJbmNvbWUgKiBlaS5yYXRlLFxuICAgICAgICAgICAgZWkubWF4Q29udHJpYnV0aW9uLFxuICAgICAgICApO1xuICAgIH1cbn0iXX0=
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW5jb21lLXRheC9jYW5hZGEvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSdWxlSW5wdXQsIFJ1bGVNZXRhLCBSdWxlT3V0cHV0IH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVRheFJ1bGVzIHtcbiAgICB0YXhCcmFja2V0czogVGF4QnJhY2tldFtdO1xuICAgIGNyZWRpdHM/OiBSZWNvcmQ8c3RyaW5nLCBUYXhDcmVkaXQ+O1xuICAgIGNvbnRyaWJ1dGlvbnM/OiBDb250cmlidXRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRheEJyYWNrZXQge1xuICAgIGZyb206IG51bWJlcjtcbiAgICB0bzogbnVtYmVyIHwgbnVsbDtcbiAgICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGF4Q3JlZGl0IHtcbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICB0eXBlOiAnbm9uUmVmdW5kYWJsZScgfCAncmVmdW5kYWJsZSc7XG4gICAgcmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyaWJ1dGlvbnMge1xuICAgIGNwcD86IENQUENvbnRyaWJ1dGlvbjtcbiAgICBlaT86IEVJQ29udHJpYnV0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENQUENvbnRyaWJ1dGlvbiB7XG4gICAgcmF0ZTogbnVtYmVyO1xuICAgIG1heENvbnRyaWJ1dGlvbjogbnVtYmVyO1xuICAgIGV4ZW1wdGlvbjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVJQ29udHJpYnV0aW9uIHtcbiAgICByYXRlOiBudW1iZXI7XG4gICAgbWF4SW5zdXJhYmxlRWFybmluZ3M6IG51bWJlcjtcbiAgICBtYXhDb250cmlidXRpb246IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlZEluY29tZVRheFZhbHVlcyB7XG4gICAgZ3Jvc3NJbmNvbWU6IG51bWJlcjtcbiAgICBpbmNvbWVUYXg6IG51bWJlcjtcbiAgICBjcHA6IG51bWJlcjtcbiAgICBlaTogbnVtYmVyO1xuICAgIHRvdGFsRGVkdWN0aW9uczogbnVtYmVyO1xuICAgIG5ldEluY29tZTogbnVtYmVyO1xuICAgIGVmZmVjdGl2ZVRheFJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVUYXhDYWxjdWxhdG9yU2NoZW1hIHtcblx0bWV0YTogUnVsZU1ldGE7XG5cdGlucHV0czogUnVsZUlucHV0W107XG5cdG91dHB1dHM6IFJ1bGVPdXRwdXRbXTtcblx0cnVsZXM6IEluY29tZVRheFJ1bGVzO1xufVxuIl19
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
17
|
exports.CanadaIncomeTaxService = void 0;
|
|
4
18
|
var CanadaIncomeTaxServiceImpl_1 = require("./income-tax/canada/CanadaIncomeTaxServiceImpl");
|
|
5
19
|
Object.defineProperty(exports, "CanadaIncomeTaxService", { enumerable: true, get: function () { return CanadaIncomeTaxServiceImpl_1.CanadaIncomeTaxServiceImpl; } });
|
|
6
|
-
|
|
20
|
+
__exportStar(require("./domain/types"), exports);
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2RkFBc0g7QUFBN0csb0lBQUEsMEJBQTBCLE9BQTBCO0FBRTdELGlEQUErQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENhbmFkYUluY29tZVRheFNlcnZpY2VJbXBsIGFzIENhbmFkYUluY29tZVRheFNlcnZpY2UgfSBmcm9tICcuL2luY29tZS10YXgvY2FuYWRhL0NhbmFkYUluY29tZVRheFNlcnZpY2VJbXBsJztcbmV4cG9ydCB7IENvbXB1dGVkSW5jb21lVGF4VmFsdWVzLCBJbmNvbWVUYXhSdWxlcywgSW5jb21lVGF4Q2FsY3VsYXRvclNjaGVtYSB9IGZyb20gJy4vaW5jb21lLXRheC9jYW5hZGEvZG9tYWluL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vZG9tYWluL3R5cGVzJzsiXX0=
|
|
@@ -9,8 +9,8 @@ export interface RuleMeta {
|
|
|
9
9
|
region: string;
|
|
10
10
|
calculator: CalculatorType;
|
|
11
11
|
version: string;
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
effectivefrom: string;
|
|
13
|
+
effectiveto: string | null;
|
|
14
14
|
source?: RuleSource[];
|
|
15
15
|
}
|
|
16
16
|
export interface RuleSource {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { RuleInput, RuleMeta, RuleOutput } from "../../../domain/types";
|
|
1
2
|
export interface IncomeTaxRules {
|
|
2
|
-
|
|
3
|
+
taxBrackets: TaxBracket[];
|
|
3
4
|
credits?: Record<string, TaxCredit>;
|
|
4
5
|
contributions?: Contributions;
|
|
5
6
|
}
|
|
@@ -19,13 +20,13 @@ export interface Contributions {
|
|
|
19
20
|
}
|
|
20
21
|
export interface CPPContribution {
|
|
21
22
|
rate: number;
|
|
22
|
-
|
|
23
|
+
maxContribution: number;
|
|
23
24
|
exemption: number;
|
|
24
25
|
}
|
|
25
26
|
export interface EIContribution {
|
|
26
27
|
rate: number;
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
maxInsurableEarnings: number;
|
|
29
|
+
maxContribution: number;
|
|
29
30
|
}
|
|
30
31
|
export interface ComputedIncomeTaxValues {
|
|
31
32
|
grossIncome: number;
|
|
@@ -36,3 +37,9 @@ export interface ComputedIncomeTaxValues {
|
|
|
36
37
|
netIncome: number;
|
|
37
38
|
effectiveTaxRate: number;
|
|
38
39
|
}
|
|
40
|
+
export interface IncomeTaxCalculatorSchema {
|
|
41
|
+
meta: RuleMeta;
|
|
42
|
+
inputs: RuleInput[];
|
|
43
|
+
outputs: RuleOutput[];
|
|
44
|
+
rules: IncomeTaxRules;
|
|
45
|
+
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { CanadaIncomeTaxServiceImpl as CanadaIncomeTaxService } from './income-tax/canada/CanadaIncomeTaxServiceImpl';
|
|
2
|
-
export { ComputedIncomeTaxValues, IncomeTaxRules } from './income-tax/canada/domain/types';
|
|
2
|
+
export { ComputedIncomeTaxValues, IncomeTaxRules, IncomeTaxCalculatorSchema } from './income-tax/canada/domain/types';
|
|
3
|
+
export * from './domain/types';
|
package/package.json
CHANGED
package/src/domain/types.ts
CHANGED
|
@@ -20,7 +20,7 @@ export class CanadaIncomeTaxServiceImpl implements CanadaIncomeTaxService {
|
|
|
20
20
|
|
|
21
21
|
public calculateNetIncome(): ComputedIncomeTaxValues {
|
|
22
22
|
|
|
23
|
-
const grossTax = this.computeGrossTax(this._income, this._rules.
|
|
23
|
+
const grossTax = this.computeGrossTax(this._income, this._rules.taxBrackets);
|
|
24
24
|
const netTax = this.applyCredits(grossTax, this._rules.credits);
|
|
25
25
|
const cpp = this.computeCPP(this._income, this._rules.contributions?.cpp);
|
|
26
26
|
const ei = this.computeEI(this._income, this._rules.contributions?.ei);
|
|
@@ -62,7 +62,7 @@ export class CanadaIncomeTaxServiceImpl implements CanadaIncomeTaxService {
|
|
|
62
62
|
const contributable = income - cpp.exemption;
|
|
63
63
|
return Math.min(
|
|
64
64
|
contributable * cpp.rate,
|
|
65
|
-
cpp.
|
|
65
|
+
cpp.maxContribution,
|
|
66
66
|
);
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -71,12 +71,12 @@ export class CanadaIncomeTaxServiceImpl implements CanadaIncomeTaxService {
|
|
|
71
71
|
|
|
72
72
|
const insurableIncome = Math.min(
|
|
73
73
|
income,
|
|
74
|
-
ei.
|
|
74
|
+
ei.maxInsurableEarnings,
|
|
75
75
|
);
|
|
76
76
|
|
|
77
77
|
return Math.min(
|
|
78
78
|
insurableIncome * ei.rate,
|
|
79
|
-
ei.
|
|
79
|
+
ei.maxContribution,
|
|
80
80
|
);
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { RuleInput, RuleMeta, RuleOutput } from "../../../domain/types";
|
|
2
|
+
|
|
1
3
|
export interface IncomeTaxRules {
|
|
2
|
-
|
|
4
|
+
taxBrackets: TaxBracket[];
|
|
3
5
|
credits?: Record<string, TaxCredit>;
|
|
4
6
|
contributions?: Contributions;
|
|
5
7
|
}
|
|
@@ -23,14 +25,14 @@ export interface Contributions {
|
|
|
23
25
|
|
|
24
26
|
export interface CPPContribution {
|
|
25
27
|
rate: number;
|
|
26
|
-
|
|
28
|
+
maxContribution: number;
|
|
27
29
|
exemption: number;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
export interface EIContribution {
|
|
31
33
|
rate: number;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
maxInsurableEarnings: number;
|
|
35
|
+
maxContribution: number;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
export interface ComputedIncomeTaxValues {
|
|
@@ -42,3 +44,10 @@ export interface ComputedIncomeTaxValues {
|
|
|
42
44
|
netIncome: number;
|
|
43
45
|
effectiveTaxRate: number;
|
|
44
46
|
}
|
|
47
|
+
|
|
48
|
+
export interface IncomeTaxCalculatorSchema {
|
|
49
|
+
meta: RuleMeta;
|
|
50
|
+
inputs: RuleInput[];
|
|
51
|
+
outputs: RuleOutput[];
|
|
52
|
+
rules: IncomeTaxRules;
|
|
53
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { CanadaIncomeTaxServiceImpl as CanadaIncomeTaxService } from './income-tax/canada/CanadaIncomeTaxServiceImpl';
|
|
2
|
-
export { ComputedIncomeTaxValues, IncomeTaxRules } from './income-tax/canada/domain/types';
|
|
2
|
+
export { ComputedIncomeTaxValues, IncomeTaxRules, IncomeTaxCalculatorSchema } from './income-tax/canada/domain/types';
|
|
3
|
+
export * from './domain/types';
|