@novha/calc-engines 2.0.0 → 2.0.2

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.
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbmNvbWUtdGF4L2F1c3RyYWxpYS9BdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wdXRlZEluY29tZVRheFZhbHVlcywgSW5jb21lVGF4UnVsZXMgfSBmcm9tIFwiLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGVOZXRJbmNvbWUoXG4gICAgICAgIGluY29tZTogbnVtYmVyLFxuICAgICAgICBydWxlczogSW5jb21lVGF4UnVsZXMsXG4gICAgKTogQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXM7XG59XG4iXX0=
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbmNvbWUtdGF4L2F1c3RyYWxpYS9BdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wdXRlZEluY29tZVRheFZhbHVlcywgSW5jb21lVGF4UnVsZXMgfSBmcm9tIFwiLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGVOZXRJbmNvbWUoXG4gICAgICAgIGluY29tZTogbnVtYmVyLFxuICAgICAgICBydWxlczogSW5jb21lVGF4UnVsZXMsXG4gICAgICAgIGlzUmVzaWRlbnQ6IGJvb2xlYW4sXG4gICAgICAgIGluY2x1ZGVNZWRpY2FyZUxldnk6IGJvb2xlYW4sXG4gICAgKTogQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXM7XG59XG4iXX0=
@@ -2,15 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AustraliaIncomeTaxServiceImpl = void 0;
4
4
  class AustraliaIncomeTaxServiceImpl {
5
- constructor(income, rules) {
5
+ constructor(income, rules, isResident, includeMedicareLevy) {
6
6
  this._income = income;
7
7
  this._rules = rules;
8
+ this._isResident = isResident;
9
+ this._includeMedicareLevy = includeMedicareLevy;
8
10
  }
9
11
  calculateNetIncome() {
10
12
  const { grossTax, bracketBreakdown } = this.computeTaxBracketBreakdown(this._income, this._rules);
11
13
  const lito = this.computeLowIncomeTaxOffset(this._income, this._rules.lowIncomeTaxOffset);
12
14
  const incomeTax = Math.max(0, grossTax - lito);
13
- const medicareLevy = this.computeMedicareLevy(this._income, this._rules.medicareLevy);
15
+ const medicareLevy = this._includeMedicareLevy
16
+ ? this.computeMedicareLevy(this._income, this._rules.medicareLevy)
17
+ : 0;
14
18
  const totalDeductions = incomeTax + medicareLevy;
15
19
  const netIncome = this._income - totalDeductions;
16
20
  return {
@@ -27,8 +31,9 @@ class AustraliaIncomeTaxServiceImpl {
27
31
  computeTaxBracketBreakdown(income, rules) {
28
32
  let tax = 0;
29
33
  const bracketBreakdown = [];
30
- for (let index = 0; index < rules.taxBrackets.length; index++) {
31
- const bracket = rules.taxBrackets[index];
34
+ const applicableBrackets = this._isResident ? rules.taxBrackets : rules.nonResidentTaxBrackets;
35
+ for (let index = 0; index < applicableBrackets.length; index++) {
36
+ const bracket = applicableBrackets[index];
32
37
  if (income <= bracket.from) {
33
38
  bracketBreakdown.push({
34
39
  bracketIndex: index,
@@ -94,4 +99,4 @@ class AustraliaIncomeTaxServiceImpl {
94
99
  }
95
100
  }
96
101
  exports.AustraliaIncomeTaxServiceImpl = AustraliaIncomeTaxServiceImpl;
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5jb21lLXRheC9hdXN0cmFsaWEvQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0EsTUFBYSw2QkFBNkI7SUFJdEMsWUFBWSxNQUFjLEVBQUUsS0FBcUI7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLGtCQUFrQjtRQUNyQixNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUNsRSxJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxNQUFNLENBQ2QsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDdkMsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUNqQyxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDekMsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FDM0IsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLFNBQVMsR0FBRyxZQUFZLENBQUM7UUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUM7UUFFakQsT0FBTztZQUNILFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDaEMsWUFBWSxFQUFFLElB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QXlCLENBQUMsTUFBYyxFQUFFLElBQXdCO1FBQ3RFLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3QixPQUFPLENBQUMsQ0FBQztRQUNiLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNwRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxRQUEyQjtRQUNuRSxJQUFJLE1BQU0sSUFBSSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsQ0FBQztRQUNiLENBQUM7UUFFRCxJQUFJLE1BQU0sSUFBSSxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QyxPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDM0UsQ0FBQztRQUVELE9BQU8sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFhLEVBQUUsUUFBUSxHQUFHLENBQUM7UUFDckMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQTNIRCxzRUEySEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmFja2V0QWxsb2NhdGlvbiB9IGZyb20gXCIuLi9kb21haW4vdHlwZXNcIjtcbmltcG9ydCB7IEF1c3RyYWxpYUluY29tZVRheFNlcnZpY2UgfSBmcm9tIFwiLi9BdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIENvbXB1dGVkSW5jb21lVGF4VmFsdWVzLFxuICAgIEluY29tZVRheFJ1bGVzLFxuICAgIExvd0luY29tZVRheE9mZnNldCxcbiAgICBNZWRpY2FyZUxldnlSdWxlcyxcbn0gZnJvbSBcIi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBBdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEF1c3RyYWxpYUluY29tZVRheFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2luY29tZTogbnVtYmVyO1xuICAgIHByaXZhdGUgX3J1bGVzOiBJbmNvbWVUYXhSdWxlcztcblxuICAgIGNvbnN0cnVjdG9yKGluY29tZTogbnVtYmVyLCBydWxlczogSW5jb21lVGF4UnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5jb21lID0gaW5jb21lO1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjdWxhdGVOZXRJbmNvbWUoKTogQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMge1xuICAgICAgICBjb25zdCB7IGdyb3NzVGF4LCBicmFja2V0QnJlYWtkb3duIH0gPSB0aGlzLmNvbXB1dGVUYXhCcmFja2V0QnJlYWtkb3duKFxuICAgICAgICAgICAgdGhpcy5faW5jb21lLFxuICAgICAgICAgICAgdGhpcy5fcnVsZXMsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbGl0byA9IHRoaXMuY29tcHV0ZUxvd0luY29tZVRheE9mZnNldChcbiAgICAgICAgICAgIHRoaXMuX2luY29tZSxcbiAgICAgICAgICAgIHRoaXMuX3J1bGVzLmxvd0luY29tZVRheE9mZnNldCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpbmNvbWVUYXggPSBNYXRoLm1heCgwLCBncm9zc1RheCAtIGxpdG8pO1xuICAgICAgICBjb25zdCBtZWRpY2FyZUxldnkgPSB0aGlzLmNvbXB1dGVNZWRpY2FyZUxldnkoXG4gICAgICAgICAgICB0aGlzLl9pbmNvbWUsXG4gICAgICAgICAgICB0aGlzLl9ydWxlcy5tZWRpY2FyZUxldnksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdG90YWxEZWR1Y3Rpb25zID0gaW5jb21lVGF4ICsgbWVkaWNhcmVMZXZ5O1xuICAgICAgICBjb25zdCBuZXRJbmNvbWUgPSB0aGlzLl9pbmNvbWUgLSB0b3RhbERlZHVjdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyb3NzSW5jb21lOiB0aGlzLl9pbmNvbWUsXG4gICAgICAgICAgICBpbmNvbWVUYXg6IHRoaXMucm91bmQoaW5jb21lVGF4KSxcbiAgICAgICAgICAgIG1lZGljYXJlTGV2eTogdGhpcy5yb3VuZChtZWRpY2FyZUxldnkpLFxuICAgICAgICAgICAgbG93SW5jb21lVGF4T2Zmc2V0OiB0aGlzLnJvdW5kKGxpdG8pLFxuICAgICAgICAgICAgdG90YWxEZWR1Y3Rpb25zOiB0aGlzLnJvdW5kKHRvdGFsRGVkdWN0aW9ucyksXG4gICAgICAgICAgICBuZXRJbmNvbWU6IHRoaXMucm91bmQobmV0SW5jb21lKSxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVRheFJhdGU6IHRoaXMuX2luY29tZSA+IDAgPyB0aGlzLnJvdW5kKGluY29tZVRheCAvIHRoaXMuX2luY29tZSwgNCkgOiAwLFxuICAgICAgICAgICAgdGF4QnJhY2tldEJyZWFrZG93bjogYnJhY2tldEJyZWFrZG93bixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVUYXhCcmFja2V0QnJlYWtkb3duKFxuICAgICAgICBpbmNvbWU6IG51bWJlcixcbiAgICAgICAgcnVsZXM6IEluY29tZVRheFJ1bGVzLFxuICAgICk6IHsgZ3Jvc3NUYXg6IG51bWJlcjsgYnJhY2tldEJyZWFrZG93bjogQnJhY2tldEFsbG9jYXRpb25bXSB9IHtcbiAgICAgICAgbGV0IHRheCA9IDA7XG4gICAgICAgIGNvbnN0IGJyYWNrZXRCcmVha2Rvd246IEJyYWNrZXRBbGxvY2F0aW9uW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcnVsZXMudGF4QnJhY2tldHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBicmFja2V0ID0gcnVsZXMudGF4QnJhY2tldHNbaW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoaW5jb21lIDw9IGJyYWNrZXQuZnJvbSkge1xuICAgICAgICAgICAgICAgIGJyYWNrZXRCcmVha2Rvd24ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXRJbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXROYW1lOiBgQnJhY2tldCAke2luZGV4ICsgMX1gLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBicmFja2V0LmZyb20sXG4gICAgICAgICAgICAgICAgICAgIHRvOiBicmFja2V0LnRvID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50SW5CcmFja2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0YXhPbkFtb3VudDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdXBwZXIgPSBicmFja2V0LnRvID8/IGluY29tZTtcbiAgICAgICAgICAgIGNvbnN0IHRheGFibGVBbW91bnQgPSBNYXRoLm1pbih1cHBlciwgaW5jb21lKSAtIGJyYWNrZXQuZnJvbTtcblxuICAgICAgICAgICAgaWYgKHRheGFibGVBbW91bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGF4T25BbW91bnQgPSB0YXhhYmxlQW1vdW50ICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSB0YXhPbkFtb3VudDtcbiAgICAgICAgICAgICAgICBicmFja2V0QnJlYWtkb3duLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBicmFja2V0SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICBicmFja2V0TmFtZTogYEJyYWNrZXQgJHtpbmRleCArIDF9YCxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogYnJhY2tldC5mcm9tLFxuICAgICAgICAgICAgICAgICAgICB0bzogYnJhY2tldC50byA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICByYXRlOiBicmFja2V0LnJhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFtb3VudEluQnJhY2tldDogdGF4YWJsZUFtb3VudCxcbiAgICAgICAgICAgICAgICAgICAgdGF4T25BbW91bnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyYWNrZXRCcmVha2Rvd24ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXRJbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXROYW1lOiBgQnJhY2tldCAke2luZGV4ICsgMX1gLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBicmFja2V0LmZyb20sXG4gICAgICAgICAgICAgICAgICAgIHRvOiBicmFja2V0LnRvID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50SW5CcmFja2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0YXhPbkFtb3VudDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGdyb3NzVGF4OiB0YXgsIGJyYWNrZXRCcmVha2Rvd24gfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVMb3dJbmNvbWVUYXhPZmZzZXQoaW5jb21lOiBudW1iZXIsIGxpdG86IExvd0luY29tZVRheE9mZnNldCk6IG51bWJlciB7XG4gICAgICAgIGlmIChpbmNvbWUgPD0gbGl0by5waGFzZU91dFN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbGl0by5tYXhPZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5jb21lID49IGxpdG8ucGhhc2VPdXRFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVkdWN0aW9uID0gKGluY29tZSAtIGxpdG8ucGhhc2VPdXRTdGFydCkgKiBsaXRvLnBoYXNlT3V0UmF0ZTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGxpdG8ubWF4T2Zmc2V0IC0gcmVkdWN0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVNZWRpY2FyZUxldnkoaW5jb21lOiBudW1iZXIsIG1lZGljYXJlOiBNZWRpY2FyZUxldnlSdWxlcyk6IG51bWJlciB7XG4gICAgICAgIGlmIChpbmNvbWUgPD0gbWVkaWNhcmUuc2hhZGluZ0luVGhyZXNob2xkKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNvbWUgPD0gbWVkaWNhcmUuZnVsbExldnlUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIHJldHVybiAoaW5jb21lIC0gbWVkaWNhcmUuc2hhZGluZ0luVGhyZXNob2xkKSAqIG1lZGljYXJlLnJlZHVjdGlvblJhdGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5jb21lICogbWVkaWNhcmUucmF0ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJvdW5kKHZhbHVlOiBudW1iZXIsIGRlY2ltYWxzID0gMik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUudG9GaXhlZChkZWNpbWFscykpO1xuICAgIH1cbn1cbiJdfQ==
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5jb21lLXRheC9hdXN0cmFsaWEvQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0EsTUFBYSw2QkFBNkI7SUFNdEMsWUFBWSxNQUFjLEVBQUUsS0FBcUIsRUFBRSxVQUFtQixFQUFFLG1CQUE0QjtRQUNoRyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUM7SUFDcEQsQ0FBQztJQUVNLGtCQUFrQjtRQUNyQixNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUNsRSxJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxNQUFNLENBQ2QsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDdkMsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUNqQyxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0I7WUFDMUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFUixNQUFNLGVBQWUsR0FBRyxTQUFTLEdBQUcsWUFBWSxDQUFDO1FBQ2pE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Q0FBQyxLQUFhLEVBQUUsUUFBUSxHQUFHLENBQUM7UUFDckMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQS9IRCxzRUErSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmFja2V0QWxsb2NhdGlvbiB9IGZyb20gXCIuLi9kb21haW4vdHlwZXNcIjtcbmltcG9ydCB7IEF1c3RyYWxpYUluY29tZVRheFNlcnZpY2UgfSBmcm9tIFwiLi9BdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIENvbXB1dGVkSW5jb21lVGF4VmFsdWVzLFxuICAgIEluY29tZVRheFJ1bGVzLFxuICAgIExvd0luY29tZVRheE9mZnNldCxcbiAgICBNZWRpY2FyZUxldnlSdWxlcyxcbn0gZnJvbSBcIi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBBdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEF1c3RyYWxpYUluY29tZVRheFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2luY29tZTogbnVtYmVyO1xuICAgIHByaXZhdGUgX3J1bGVzOiBJbmNvbWVUYXhSdWxlcztcbiAgICBwcml2YXRlIF9pc1Jlc2lkZW50OiBib29sZWFuO1xuICAgIHByaXZhdGUgX2luY2x1ZGVNZWRpY2FyZUxldnk6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihpbmNvbWU6IG51bWJlciwgcnVsZXM6IEluY29tZVRheFJ1bGVzLCBpc1Jlc2lkZW50OiBib29sZWFuLCBpbmNsdWRlTWVkaWNhcmVMZXZ5OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2luY29tZSA9IGluY29tZTtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICAgICAgdGhpcy5faXNSZXNpZGVudCA9IGlzUmVzaWRlbnQ7XG4gICAgICAgIHRoaXMuX2luY2x1ZGVNZWRpY2FyZUxldnkgPSBpbmNsdWRlTWVkaWNhcmVMZXZ5O1xuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjdWxhdGVOZXRJbmNvbWUoKTogQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMge1xuICAgICAgICBjb25zdCB7IGdyb3NzVGF4LCBicmFja2V0QnJlYWtkb3duIH0gPSB0aGlzLmNvbXB1dGVUYXhCcmFja2V0QnJlYWtkb3duKFxuICAgICAgICAgICAgdGhpcy5faW5jb21lLFxuICAgICAgICAgICAgdGhpcy5fcnVsZXMsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbGl0byA9IHRoaXMuY29tcHV0ZUxvd0luY29tZVRheE9mZnNldChcbiAgICAgICAgICAgIHRoaXMuX2luY29tZSxcbiAgICAgICAgICAgIHRoaXMuX3J1bGVzLmxvd0luY29tZVRheE9mZnNldCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpbmNvbWVUYXggPSBNYXRoLm1heCgwLCBncm9zc1RheCAtIGxpdG8pO1xuICAgICAgICBjb25zdCBtZWRpY2FyZUxldnkgPSB0aGlzLl9pbmNsdWRlTWVkaWNhcmVMZXZ5XG4gICAgICAgICAgICA/IHRoaXMuY29tcHV0ZU1lZGljYXJlTGV2eSh0aGlzLl9pbmNvbWUsIHRoaXMuX3J1bGVzLm1lZGljYXJlTGV2eSlcbiAgICAgICAgICAgIDogMDtcblxuICAgICAgICBjb25zdCB0b3RhbERlZHVjdGlvbnMgPSBpbmNvbWVUYXggKyBtZWRpY2FyZUxldnk7XG4gICAgICAgIGNvbnN0IG5ldEluY29tZSA9IHRoaXMuX2luY29tZSAtIHRvdGFsRGVkdWN0aW9ucztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ3Jvc3NJbmNvbWU6IHRoaXMuX2luY29tZSxcbiAgICAgICAgICAgIGluY29tZVRheDogdGhpcy5yb3VuZChpbmNvbWVUYXgpLFxuICAgICAgICAgICAgbWVkaWNhcmVMZXZ5OiB0aGlzLnJvdW5kKG1lZGljYXJlTGV2eSksXG4gICAgICAgICAgICBsb3dJbmNvbWVUYXhPZmZzZXQ6IHRoaXMucm91bmQobGl0byksXG4gICAgICAgICAgICB0b3RhbERlZHVjdGlvbnM6IHRoaXMucm91bmQodG90YWxEZWR1Y3Rpb25zKSxcbiAgICAgICAgICAgIG5ldEluY29tZTogdGhpcy5yb3VuZChuZXRJbmNvbWUpLFxuICAgICAgICAgICAgZWZmZWN0aXZlVGF4UmF0ZTogdGhpcy5faW5jb21lID4gMCA/IHRoaXMucm91bmQoaW5jb21lVGF4IC8gdGhpcy5faW5jb21lLCA0KSA6IDAsXG4gICAgICAgICAgICB0YXhCcmFja2V0QnJlYWtkb3duOiBicmFja2V0QnJlYWtkb3duLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29tcHV0ZVRheEJyYWNrZXRCcmVha2Rvd24oXG4gICAgICAgIGluY29tZTogbnVtYmVyLFxuICAgICAgICBydWxlczogSW5jb21lVGF4UnVsZXMsXG4gICAgKTogeyBncm9zc1RheDogbnVtYmVyOyBicmFja2V0QnJlYWtkb3duOiBCcmFja2V0QWxsb2NhdGlvbltdIH0ge1xuICAgICAgICBsZXQgdGF4ID0gMDtcbiAgICAgICAgY29uc3QgYnJhY2tldEJyZWFrZG93bjogQnJhY2tldEFsbG9jYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGFwcGxpY2FibGVCcmFja2V0cyA9IHRoaXMuX2lzUmVzaWRlbnQgPyBydWxlcy50YXhCcmFja2V0cyA6IHJ1bGVzLm5vblJlc2lkZW50VGF4QnJhY2tldHM7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcHBsaWNhYmxlQnJhY2tldHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBicmFja2V0ID0gYXBwbGljYWJsZUJyYWNrZXRzW2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKGluY29tZSA8PSBicmFja2V0LmZyb20pIHtcbiAgICAgICAgICAgICAgICBicmFja2V0QnJlYWtkb3duLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBicmFja2V0SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICBicmFja2V0TmFtZTogYEJyYWNrZXQgJHtpbmRleCArIDF9YCxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogYnJhY2tldC5mcm9tLFxuICAgICAgICAgICAgICAgICAgICB0bzogYnJhY2tldC50byA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICByYXRlOiBicmFja2V0LnJhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFtb3VudEluQnJhY2tldDogMCxcbiAgICAgICAgICAgICAgICAgICAgdGF4T25BbW91bnQ6IDAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHVwcGVyID0gYnJhY2tldC50byA/PyBpbmNvbWU7XG4gICAgICAgICAgICBjb25zdCB0YXhhYmxlQW1vdW50ID0gTWF0aC5taW4odXBwZXIsIGluY29tZSkgLSBicmFja2V0LmZyb207XG5cbiAgICAgICAgICAgIGlmICh0YXhhYmxlQW1vdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRheE9uQW1vdW50ID0gdGF4YWJsZUFtb3VudCAqIGJyYWNrZXQucmF0ZTtcbiAgICAgICAgICAgICAgICB0YXggKz0gdGF4T25BbW91bnQ7XG4gICAgICAgICAgICAgICAgYnJhY2tldEJyZWFrZG93bi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgYnJhY2tldEluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgYnJhY2tldE5hbWU6IGBCcmFja2V0ICR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgICAgICAgICAgIGZyb206IGJyYWNrZXQuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgdG86IGJyYWNrZXQudG8gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmF0ZTogYnJhY2tldC5yYXRlLFxuICAgICAgICAgICAgICAgICAgICBhbW91bnRJbkJyYWNrZXQ6IHRheGFibGVBbW91bnQsXG4gICAgICAgICAgICAgICAgICAgIHRheE9uQW1vdW50LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmFja2V0QnJlYWtkb3duLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBicmFja2V0SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICBicmFja2V0TmFtZTogYEJyYWNrZXQgJHtpbmRleCArIDF9YCxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogYnJhY2tldC5mcm9tLFxuICAgICAgICAgICAgICAgICAgICB0bzogYnJhY2tldC50byA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICByYXRlOiBicmFja2V0LnJhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFtb3VudEluQnJhY2tldDogMCxcbiAgICAgICAgICAgICAgICAgICAgdGF4T25BbW91bnQ6IDAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBncm9zc1RheDogdGF4LCBicmFja2V0QnJlYWtkb3duIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlTG93SW5jb21lVGF4T2Zmc2V0KGluY29tZTogbnVtYmVyLCBsaXRvOiBMb3dJbmNvbWVUYXhPZmZzZXQpOiBudW1iZXIge1xuICAgICAgICBpZiAoaW5jb21lIDw9IGxpdG8ucGhhc2VPdXRTdGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIGxpdG8ubWF4T2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluY29tZSA+PSBsaXRvLnBoYXNlT3V0RW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZHVjdGlvbiA9IChpbmNvbWUgLSBsaXRvLnBoYXNlT3V0U3RhcnQpICogbGl0by5waGFzZU91dFJhdGU7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBsaXRvLm1heE9mZnNldCAtIHJlZHVjdGlvbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlTWVkaWNhcmVMZXZ5KGluY29tZTogbnVtYmVyLCBtZWRpY2FyZTogTWVkaWNhcmVMZXZ5UnVsZXMpOiBudW1iZXIge1xuICAgICAgICBpZiAoaW5jb21lIDw9IG1lZGljYXJlLnNoYWRpbmdJblRocmVzaG9sZCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5jb21lIDw9IG1lZGljYXJlLmZ1bGxMZXZ5VGhyZXNob2xkKSB7XG4gICAgICAgICAgICByZXR1cm4gKGluY29tZSAtIG1lZGljYXJlLnNoYWRpbmdJblRocmVzaG9sZCkgKiBtZWRpY2FyZS5yZWR1Y3Rpb25SYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluY29tZSAqIG1lZGljYXJlLnJhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByb3VuZCh2YWx1ZTogbnVtYmVyLCBkZWNpbWFscyA9IDIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRml4ZWQoZGVjaW1hbHMpKTtcbiAgICB9XG59XG4iXX0=
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW5jb21lLXRheC9hdXN0cmFsaWEvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmFja2V0QWxsb2NhdGlvbiwgVGF4QnJhY2tldCB9IGZyb20gXCIuLi8uLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVUYXhSdWxlcyB7XG4gICAgdGF4QnJhY2tldHM6IFRheEJyYWNrZXRbXTtcbiAgICBtZWRpY2FyZUxldnk6IE1lZGljYXJlTGV2eVJ1bGVzO1xuICAgIGxvd0luY29tZVRheE9mZnNldDogTG93SW5jb21lVGF4T2Zmc2V0O1xuICAgIGxvd0FuZE1pZGRsZUluY29tZVRheE9mZnNldD86IExvd0FuZE1pZGRsZUluY29tZVRheE9mZnNldDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZWRpY2FyZUxldnlSdWxlcyB7XG4gICAgcmF0ZTogbnVtYmVyO1xuICAgIHNoYWRpbmdJblRocmVzaG9sZDogbnVtYmVyO1xuICAgIGZ1bGxMZXZ5VGhyZXNob2xkOiBudW1iZXI7XG4gICAgcmVkdWN0aW9uUmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvd0luY29tZVRheE9mZnNldCB7XG4gICAgbWF4T2Zmc2V0OiBudW1iZXI7XG4gICAgcGhhc2VPdXRTdGFydDogbnVtYmVyO1xuICAgIHBoYXNlT3V0RW5kOiBudW1iZXI7XG4gICAgcGhhc2VPdXRSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG93QW5kTWlkZGxlSW5jb21lVGF4T2Zmc2V0IHtcbiAgICBtYXhPZmZzZXQ6IG51bWJlcjtcbiAgICBwaGFzZU91dFN0YXJ0OiBudW1iZXI7XG4gICAgcGhhc2VPdXRFbmQ6IG51bWJlcjtcbiAgICBwaGFzZU91dFJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlZEluY29tZVRheFZhbHVlcyB7XG4gICAgZ3Jvc3NJbmNvbWU6IG51bWJlcjtcbiAgICBpbmNvbWVUYXg6IG51bWJlcjtcbiAgICBtZWRpY2FyZUxldnk6IG51bWJlcjtcbiAgICBsb3dJbmNvbWVUYXhPZmZzZXQ6IG51bWJlcjtcbiAgICB0b3RhbERlZHVjdGlvbnM6IG51bWJlcjtcbiAgICBuZXRJbmNvbWU6IG51bWJlcjtcbiAgICBlZmZlY3RpdmVUYXhSYXRlOiBudW1iZXI7XG4gICAgdGF4QnJhY2tldEJyZWFrZG93bjogQnJhY2tldEFsbG9jYXRpb25bXTtcbn1cbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW5jb21lLXRheC9hdXN0cmFsaWEvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmFja2V0QWxsb2NhdGlvbiwgVGF4QnJhY2tldCB9IGZyb20gXCIuLi8uLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVUYXhSdWxlcyB7XG4gICAgdGF4QnJhY2tldHM6IFRheEJyYWNrZXRbXTtcbiAgICBub25SZXNpZGVudFRheEJyYWNrZXRzOiBUYXhCcmFja2V0W107XG4gICAgbWVkaWNhcmVMZXZ5OiBNZWRpY2FyZUxldnlSdWxlcztcbiAgICBsb3dJbmNvbWVUYXhPZmZzZXQ6IExvd0luY29tZVRheE9mZnNldDtcbiAgICBsb3dBbmRNaWRkbGVJbmNvbWVUYXhPZmZzZXQ/OiBMb3dBbmRNaWRkbGVJbmNvbWVUYXhPZmZzZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWNhcmVMZXZ5UnVsZXMge1xuICAgIHJhdGU6IG51bWJlcjtcbiAgICBzaGFkaW5nSW5UaHJlc2hvbGQ6IG51bWJlcjtcbiAgICBmdWxsTGV2eVRocmVzaG9sZDogbnVtYmVyO1xuICAgIHJlZHVjdGlvblJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb3dJbmNvbWVUYXhPZmZzZXQge1xuICAgIG1heE9mZnNldDogbnVtYmVyO1xuICAgIHBoYXNlT3V0U3RhcnQ6IG51bWJlcjtcbiAgICBwaGFzZU91dEVuZDogbnVtYmVyO1xuICAgIHBoYXNlT3V0UmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvd0FuZE1pZGRsZUluY29tZVRheE9mZnNldCB7XG4gICAgbWF4T2Zmc2V0OiBudW1iZXI7XG4gICAgcGhhc2VPdXRTdGFydDogbnVtYmVyO1xuICAgIHBoYXNlT3V0RW5kOiBudW1iZXI7XG4gICAgcGhhc2VPdXRSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMge1xuICAgIGdyb3NzSW5jb21lOiBudW1iZXI7XG4gICAgaW5jb21lVGF4OiBudW1iZXI7XG4gICAgbWVkaWNhcmVMZXZ5OiBudW1iZXI7XG4gICAgbG93SW5jb21lVGF4T2Zmc2V0OiBudW1iZXI7XG4gICAgdG90YWxEZWR1Y3Rpb25zOiBudW1iZXI7XG4gICAgbmV0SW5jb21lOiBudW1iZXI7XG4gICAgZWZmZWN0aXZlVGF4UmF0ZTogbnVtYmVyO1xuICAgIHRheEJyYWNrZXRCcmVha2Rvd246IEJyYWNrZXRBbGxvY2F0aW9uW107XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
1
  import { ComputedIncomeTaxValues, IncomeTaxRules } from "./domain/types";
2
2
  export interface AustraliaIncomeTaxService {
3
- calculateNetIncome(income: number, rules: IncomeTaxRules): ComputedIncomeTaxValues;
3
+ calculateNetIncome(income: number, rules: IncomeTaxRules, isResident: boolean, includeMedicareLevy: boolean): ComputedIncomeTaxValues;
4
4
  }
@@ -3,7 +3,9 @@ import { ComputedIncomeTaxValues, IncomeTaxRules } from "./domain/types";
3
3
  export declare class AustraliaIncomeTaxServiceImpl implements AustraliaIncomeTaxService {
4
4
  private _income;
5
5
  private _rules;
6
- constructor(income: number, rules: IncomeTaxRules);
6
+ private _isResident;
7
+ private _includeMedicareLevy;
8
+ constructor(income: number, rules: IncomeTaxRules, isResident: boolean, includeMedicareLevy: boolean);
7
9
  calculateNetIncome(): ComputedIncomeTaxValues;
8
10
  private computeTaxBracketBreakdown;
9
11
  private computeLowIncomeTaxOffset;
@@ -1,6 +1,7 @@
1
1
  import { BracketAllocation, TaxBracket } from "../../domain/types";
2
2
  export interface IncomeTaxRules {
3
3
  taxBrackets: TaxBracket[];
4
+ nonResidentTaxBrackets: TaxBracket[];
4
5
  medicareLevy: MedicareLevyRules;
5
6
  lowIncomeTaxOffset: LowIncomeTaxOffset;
6
7
  lowAndMiddleIncomeTaxOffset?: LowAndMiddleIncomeTaxOffset;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@novha/calc-engines",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "scripts": {
@@ -4,5 +4,7 @@ export interface AustraliaIncomeTaxService {
4
4
  calculateNetIncome(
5
5
  income: number,
6
6
  rules: IncomeTaxRules,
7
+ isResident: boolean,
8
+ includeMedicareLevy: boolean,
7
9
  ): ComputedIncomeTaxValues;
8
10
  }
@@ -10,10 +10,14 @@ import {
10
10
  export class AustraliaIncomeTaxServiceImpl implements AustraliaIncomeTaxService {
11
11
  private _income: number;
12
12
  private _rules: IncomeTaxRules;
13
+ private _isResident: boolean;
14
+ private _includeMedicareLevy: boolean;
13
15
 
14
- constructor(income: number, rules: IncomeTaxRules) {
16
+ constructor(income: number, rules: IncomeTaxRules, isResident: boolean, includeMedicareLevy: boolean) {
15
17
  this._income = income;
16
18
  this._rules = rules;
19
+ this._isResident = isResident;
20
+ this._includeMedicareLevy = includeMedicareLevy;
17
21
  }
18
22
 
19
23
  public calculateNetIncome(): ComputedIncomeTaxValues {
@@ -28,10 +32,9 @@ export class AustraliaIncomeTaxServiceImpl implements AustraliaIncomeTaxService
28
32
  );
29
33
 
30
34
  const incomeTax = Math.max(0, grossTax - lito);
31
- const medicareLevy = this.computeMedicareLevy(
32
- this._income,
33
- this._rules.medicareLevy,
34
- );
35
+ const medicareLevy = this._includeMedicareLevy
36
+ ? this.computeMedicareLevy(this._income, this._rules.medicareLevy)
37
+ : 0;
35
38
 
36
39
  const totalDeductions = incomeTax + medicareLevy;
37
40
  const netIncome = this._income - totalDeductions;
@@ -55,8 +58,9 @@ export class AustraliaIncomeTaxServiceImpl implements AustraliaIncomeTaxService
55
58
  let tax = 0;
56
59
  const bracketBreakdown: BracketAllocation[] = [];
57
60
 
58
- for (let index = 0; index < rules.taxBrackets.length; index++) {
59
- const bracket = rules.taxBrackets[index];
61
+ const applicableBrackets = this._isResident ? rules.taxBrackets : rules.nonResidentTaxBrackets;
62
+ for (let index = 0; index < applicableBrackets.length; index++) {
63
+ const bracket = applicableBrackets[index];
60
64
 
61
65
  if (income <= bracket.from) {
62
66
  bracketBreakdown.push({
@@ -2,6 +2,7 @@ import { BracketAllocation, TaxBracket } from "../../domain/types";
2
2
 
3
3
  export interface IncomeTaxRules {
4
4
  taxBrackets: TaxBracket[];
5
+ nonResidentTaxBrackets: TaxBracket[];
5
6
  medicareLevy: MedicareLevyRules;
6
7
  lowIncomeTaxOffset: LowIncomeTaxOffset;
7
8
  lowAndMiddleIncomeTaxOffset?: LowAndMiddleIncomeTaxOffset;
@@ -10,6 +10,11 @@ const australiaRules: IncomeTaxRules = {
10
10
  { from: 120000, to: 180000, rate: 0.37 },
11
11
  { from: 180000, to: null, rate: 0.45 },
12
12
  ],
13
+ nonResidentTaxBrackets: [
14
+ { from: 0, to: 120000, rate: 0.325 },
15
+ { from: 120000, to: 180000, rate: 0.37 },
16
+ { from: 180000, to: null, rate: 0.45 },
17
+ ],
13
18
  medicareLevy: {
14
19
  rate: 0.02,
15
20
  shadingInThreshold: 26000,