@novha/calc-engines 1.7.2 → 2.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.
Files changed (36) hide show
  1. package/dist/corporate/australia/AustraliaCorporateTaxService.js +3 -0
  2. package/dist/corporate/australia/AustraliaCorporateTaxServiceImpl.js +71 -0
  3. package/dist/corporate/australia/domain/types.js +3 -0
  4. package/dist/income-tax/australia/AustraliaIncomeTaxService.js +3 -0
  5. package/dist/income-tax/australia/AustraliaIncomeTaxServiceImpl.js +99 -0
  6. package/dist/income-tax/australia/domain/types.js +3 -0
  7. package/dist/index.js +9 -2
  8. package/dist/mortgage/australia/AustraliaMortgageService.js +3 -0
  9. package/dist/mortgage/australia/AustraliaMortgageServiceImpl.js +115 -0
  10. package/dist/mortgage/australia/domain/types.js +3 -0
  11. package/dist/types/corporate/australia/AustraliaCorporateTaxService.d.ts +4 -0
  12. package/dist/types/corporate/australia/AustraliaCorporateTaxServiceImpl.d.ts +9 -0
  13. package/dist/types/corporate/australia/domain/types.d.ts +34 -0
  14. package/dist/types/income-tax/australia/AustraliaIncomeTaxService.d.ts +4 -0
  15. package/dist/types/income-tax/australia/AustraliaIncomeTaxServiceImpl.d.ts +13 -0
  16. package/dist/types/income-tax/australia/domain/types.d.ts +36 -0
  17. package/dist/types/index.d.ts +6 -0
  18. package/dist/types/mortgage/australia/AustraliaMortgageService.d.ts +4 -0
  19. package/dist/types/mortgage/australia/AustraliaMortgageServiceImpl.d.ts +9 -0
  20. package/dist/types/mortgage/australia/domain/types.d.ts +55 -0
  21. package/jest.config.js +1 -1
  22. package/package.json +1 -1
  23. package/src/corporate/australia/AustraliaCorporateTaxService.ts +5 -0
  24. package/src/corporate/australia/AustraliaCorporateTaxServiceImpl.ts +88 -0
  25. package/src/corporate/australia/domain/types.ts +41 -0
  26. package/src/income-tax/australia/AustraliaIncomeTaxService.ts +9 -0
  27. package/src/income-tax/australia/AustraliaIncomeTaxServiceImpl.ts +136 -0
  28. package/src/income-tax/australia/domain/types.ts +41 -0
  29. package/src/index.ts +21 -0
  30. package/src/mortgage/australia/AustraliaMortgageService.ts +5 -0
  31. package/src/mortgage/australia/AustraliaMortgageServiceImpl.ts +160 -0
  32. package/src/mortgage/australia/domain/types.ts +65 -0
  33. package/test/australia-corporate-tax.test.ts +97 -0
  34. package/test/australia-income-tax.test.ts +133 -0
  35. package/test/australia-mortgage.test.ts +125 -0
  36. package/tsconfig.test.json +9 -0
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhQ29ycG9yYXRlVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3Jwb3JhdGUvYXVzdHJhbGlhL0F1c3RyYWxpYUNvcnBvcmF0ZVRheFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElucHV0LCBSZXN1bHQsIFJ1bGVzIH0gZnJvbSBcIi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVzdHJhbGlhQ29ycG9yYXRlVGF4U2VydmljZSB7XG4gICAgY2FsY3VsYXRlKGlucHV0OiBJbnB1dCwgcnVsZXM6IFJ1bGVzKTogUmVzdWx0O1xufVxuIl19
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AustraliaCorporateTaxServiceImpl = void 0;
4
+ class AustraliaCorporateTaxServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const regime = this._input.isSmallBusiness
11
+ ? this._rules.regimes.smallBusiness
12
+ : this._rules.regimes.general;
13
+ if (!regime) {
14
+ throw new Error('Unknown tax regime');
15
+ }
16
+ if (regime.conditions?.maxTurnover !== undefined) {
17
+ if (this._input.annualTurnover > regime.conditions.maxTurnover) {
18
+ throw new Error('Small business regime not applicable: turnover exceeded');
19
+ }
20
+ }
21
+ let tax = 0;
22
+ let breakdowns = [];
23
+ if (regime.type === 'flat') {
24
+ tax = this._input.taxableIncome * regime.rate;
25
+ breakdowns = [{
26
+ from: '0',
27
+ to: 'Above',
28
+ rate: regime.rate,
29
+ amount: tax,
30
+ }];
31
+ }
32
+ else if (regime.type === 'progressive') {
33
+ const result = this.calculateProgressiveTax(this._input.taxableIncome, regime.brackets);
34
+ tax = result.total;
35
+ breakdowns = result.breakdowns;
36
+ }
37
+ else {
38
+ throw new Error('Unsupported regime type');
39
+ }
40
+ return {
41
+ corporateTax: tax,
42
+ effectiveTaxRate: this._input.taxableIncome > 0
43
+ ? (tax / this._input.taxableIncome) * 100
44
+ : 0,
45
+ breakdowns,
46
+ };
47
+ }
48
+ calculateProgressiveTax(income, brackets) {
49
+ let tax = 0;
50
+ const breakdowns = [];
51
+ for (const bracket of brackets) {
52
+ if (income <= bracket.from)
53
+ break;
54
+ const upper = bracket.to === null ? income : Math.min(income, bracket.to);
55
+ const taxableAmount = upper - bracket.from;
56
+ if (taxableAmount > 0) {
57
+ const bracketTax = taxableAmount * bracket.rate;
58
+ tax += bracketTax;
59
+ breakdowns.push({
60
+ from: `${bracket.from}`,
61
+ to: `${bracket.to ?? 'Above'}`,
62
+ rate: bracket.rate,
63
+ amount: bracketTax,
64
+ });
65
+ }
66
+ }
67
+ return { total: tax, breakdowns };
68
+ }
69
+ }
70
+ exports.AustraliaCorporateTaxServiceImpl = AustraliaCorporateTaxServiceImpl;
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhQ29ycG9yYXRlVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29ycG9yYXRlL2F1c3RyYWxpYS9BdXN0cmFsaWFDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFhLGdDQUFnQztJQUl6QyxZQUFZLEtBQVksRUFBRSxLQUFZO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlO1lBQ3RDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQ25DLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFFbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1lBQy9FLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osSUFBSSxVQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUVqQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDOUMsVUFBVSxHQUFHLENBQUM7b0JBQ1YsSUFBSSxFQUFFLEdBQUc7b0JBQ1QsRUFBRSxFQUFFLE9BQU87b0JBQ1gsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNqQixNQUFNLEVBQUUsR0FBRztpQkFDZCxDQUFDLENBQUM7UUFDUCxDQUFDO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQ3pCLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLENBQUM7WUFDRixHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNuQixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsT0FBTztZQUNILFlBQVksRUFBRSxHQUFHO1lBQ2pCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUc7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDO1lBQ1AsVUFBVTtTQUNiLENBQUM7SUFDTixDQUFDO0lBRU8sdUJBQXVCLENBQzNCLE1BQWMsRUFDZCxRQUFpQztRQUVqQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBRW5DLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxNQUFNLElBQUksT0FBTyxDQUFDLElBQUk7Z0JBQUUsTUFBTTtZQUVsQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUUsTUFBTSxhQUFhLEdBQUcsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFFM0MsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sVUFBVSxHQUFHLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNoRCxHQUFHLElBQUksVUFBVSxDQUFDO2dCQUVsQixVQUFVLENBQUMsSUFBSSxDQUFDO29CQUNaLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQ3ZCLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksT0FBTyxFQUFFO29CQUM5QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7b0JBQ2xCLE1BQU0sRUFBRSxVQUFVO2lCQUNyQixDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDSjtBQW5GRCw0RUFtRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha2Rvd24gfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5pbXBvcnQgeyBBdXN0cmFsaWFDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSBcIi4vQXVzdHJhbGlhQ29ycG9yYXRlVGF4U2VydmljZVwiO1xuaW1wb3J0IHsgSW5wdXQsIFByb2dyZXNzaXZlVGF4QnJhY2tldCwgUmVzdWx0LCBSdWxlcyB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgQXVzdHJhbGlhQ29ycG9yYXRlVGF4U2VydmljZUltcGwgaW1wbGVtZW50cyBBdXN0cmFsaWFDb3Jwb3JhdGVUYXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9pbnB1dDogSW5wdXQ7XG4gICAgcHJpdmF0ZSBfcnVsZXM6IFJ1bGVzO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IElucHV0LCBydWxlczogUnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0IHtcbiAgICAgICAgY29uc3QgcmVnaW1lID0gdGhpcy5faW5wdXQuaXNTbWFsbEJ1c2luZXNzXG4gICAgICAgICAgICA/IHRoaXMuX3J1bGVzLnJlZ2ltZXMuc21hbGxCdXNpbmVzc1xuICAgICAgICAgICAgOiB0aGlzLl9ydWxlcy5yZWdpbWVzLmdlbmVyYWw7XG5cbiAgICAgICAgaWYgKCFyZWdpbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB0YXggcmVnaW1lJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVnaW1lLmNvbmRpdGlvbnM/Lm1heFR1cm5vdmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dC5hbm51YWxUdXJub3ZlciA+IHJlZ2ltZS5jb25kaXRpb25zLm1heFR1cm5vdmVyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTbWFsbCBidXNpbmVzcyByZWdpbWUgbm90IGFwcGxpY2FibGU6IHR1cm5vdmVyIGV4Y2VlZGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGF4ID0gMDtcbiAgICAgICAgbGV0IGJyZWFrZG93bnM6IEJyZWFrZG93bltdID0gW107XG5cbiAgICAgICAgaWYgKHJlZ2ltZS50eXBlID09PSAnZmxhdCcpIHtcbiAgICAgICAgICAgIHRheCA9IHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUgKiByZWdpbWUucmF0ZTtcbiAgICAgICAgICAgIGJyZWFrZG93bnMgPSBbe1xuICAgICAgICAgICAgICAgIGZyb206ICcwJyxcbiAgICAgICAgICAgICAgICB0bzogJ0Fib3ZlJyxcbiAgICAgICAgICAgICAgICByYXRlOiByZWdpbWUucmF0ZSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IHRheCxcbiAgICAgICAgICAgIH1dO1xuICAgICAgICB9IGVsc2UgaWYgKHJlZ2ltZS50eXBlID09PSAncHJvZ3Jlc3NpdmUnKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNhbGN1bGF0ZVByb2dyZXNzaXZlVGF4KFxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUsXG4gICAgICAgICAgICAgICAgcmVnaW1lLmJyYWNrZXRzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRheCA9IHJlc3VsdC50b3RhbDtcbiAgICAgICAgICAgIGJyZWFrZG93bnMgPSByZXN1bHQuYnJlYWtkb3ducztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgcmVnaW1lIHR5cGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb3Jwb3JhdGVUYXg6IHRheCxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVRheFJhdGU6IHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUgPiAwXG4gICAgICAgICAgICAgICAgPyAodGF4IC8gdGhpcy5faW5wdXQudGF4YWJsZUluY29tZSkgKiAxMDBcbiAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICBicmVha2Rvd25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlUHJvZ3Jlc3NpdmVUYXgoXG4gICAgICAgIGluY29tZTogbnVtYmVyLFxuICAgICAgICBicmFja2V0czogUHJvZ3Jlc3NpdmVUYXhCcmFja2V0W10sXG4gICAgKTogeyB0b3RhbDogbnVtYmVyOyBicmVha2Rvd25zOiBCcmVha2Rvd25bXSB9IHtcbiAgICAgICAgbGV0IHRheCA9IDA7XG4gICAgICAgIGNvbnN0IGJyZWFrZG93bnM6IEJyZWFrZG93bltdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBicmFja2V0IG9mIGJyYWNrZXRzKSB7XG4gICAgICAgICAgICBpZiAoaW5jb21lIDw9IGJyYWNrZXQuZnJvbSkgYnJlYWs7XG5cbiAgICAgICAgICAgIGNvbnN0IHVwcGVyID0gYnJhY2tldC50byA9PT0gbnVsbCA/IGluY29tZSA6IE1hdGgubWluKGluY29tZSwgYnJhY2tldC50byk7XG4gICAgICAgICAgICBjb25zdCB0YXhhYmxlQW1vdW50ID0gdXBwZXIgLSBicmFja2V0LmZyb207XG5cbiAgICAgICAgICAgIGlmICh0YXhhYmxlQW1vdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRUYXggPSB0YXhhYmxlQW1vdW50ICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSBicmFja2V0VGF4O1xuXG4gICAgICAgICAgICAgICAgYnJlYWtkb3ducy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogYCR7YnJhY2tldC5mcm9tfWAsXG4gICAgICAgICAgICAgICAgICAgIHRvOiBgJHticmFja2V0LnRvID8/ICdBYm92ZSd9YCxcbiAgICAgICAgICAgICAgICAgICAgcmF0ZTogYnJhY2tldC5yYXRlLFxuICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IGJyYWNrZXRUYXgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB0b3RhbDogdGF4LCBicmVha2Rvd25zIH07XG4gICAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL2F1c3RyYWxpYS9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyZWFrZG93biB9IGZyb20gXCIuLi8uLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGbGF0VGF4UnVsZSB7XG4gICAgdHlwZTogJ2ZsYXQnO1xuICAgIHJhdGU6IG51bWJlcjtcbiAgICBjb25kaXRpb25zPzoge1xuICAgICAgICBtYXhUdXJub3Zlcj86IG51bWJlcjtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzaXZlVGF4QnJhY2tldCB7XG4gICAgZnJvbTogbnVtYmVyO1xuICAgIHRvOiBudW1iZXIgfCBudWxsO1xuICAgIHJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc2l2ZVRheFJ1bGUge1xuICAgIHR5cGU6ICdwcm9ncmVzc2l2ZSc7XG4gICAgYnJhY2tldHM6IFByb2dyZXNzaXZlVGF4QnJhY2tldFtdO1xuICAgIGNvbmRpdGlvbnM/OiB7XG4gICAgICAgIG1heFR1cm5vdmVyPzogbnVtYmVyO1xuICAgIH07XG59XG5cbmV4cG9ydCB0eXBlIFRheFJ1bGUgPSBGbGF0VGF4UnVsZSB8IFByb2dyZXNzaXZlVGF4UnVsZTtcblxuZXhwb3J0IGludGVyZmFjZSBSdWxlcyB7XG4gICAgcmVnaW1lczogUmVjb3JkPHN0cmluZywgVGF4UnVsZT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXQge1xuICAgIHRheGFibGVJbmNvbWU6IG51bWJlcjtcbiAgICBhbm51YWxUdXJub3ZlcjogbnVtYmVyO1xuICAgIGlzU21hbGxCdXNpbmVzczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bHQge1xuICAgIGNvcnBvcmF0ZVRheDogbnVtYmVyO1xuICAgIGVmZmVjdGl2ZVRheFJhdGU6IG51bWJlcjtcbiAgICBicmVha2Rvd25zOiBCcmVha2Rvd25bXTtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbmNvbWUtdGF4L2F1c3RyYWxpYS9BdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wdXRlZEluY29tZVRheFZhbHVlcywgSW5jb21lVGF4UnVsZXMgfSBmcm9tIFwiLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGVOZXRJbmNvbWUoXG4gICAgICAgIGluY29tZTogbnVtYmVyLFxuICAgICAgICBydWxlczogSW5jb21lVGF4UnVsZXMsXG4gICAgICAgIGlzUmVzaWRlbnQ/OiBib29sZWFuLFxuICAgICk6IENvbXB1dGVkSW5jb21lVGF4VmFsdWVzO1xufVxuIl19
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AustraliaIncomeTaxServiceImpl = void 0;
4
+ class AustraliaIncomeTaxServiceImpl {
5
+ constructor(income, rules, isResident = true) {
6
+ this._income = income;
7
+ this._rules = rules;
8
+ this._isResident = isResident;
9
+ }
10
+ calculateNetIncome() {
11
+ const { grossTax, bracketBreakdown } = this.computeTaxBracketBreakdown(this._income, this._rules);
12
+ const lito = this.computeLowIncomeTaxOffset(this._income, this._rules.lowIncomeTaxOffset);
13
+ const incomeTax = Math.max(0, grossTax - lito);
14
+ const medicareLevy = this.computeMedicareLevy(this._income, this._rules.medicareLevy);
15
+ const totalDeductions = incomeTax + medicareLevy;
16
+ const netIncome = this._income - totalDeductions;
17
+ return {
18
+ grossIncome: this._income,
19
+ incomeTax: this.round(incomeTax),
20
+ medicareLevy: this.round(medicareLevy),
21
+ lowIncomeTaxOffset: this.round(lito),
22
+ totalDeductions: this.round(totalDeductions),
23
+ netIncome: this.round(netIncome),
24
+ effectiveTaxRate: this._income > 0 ? this.round(incomeTax / this._income, 4) : 0,
25
+ taxBracketBreakdown: bracketBreakdown,
26
+ };
27
+ }
28
+ computeTaxBracketBreakdown(income, rules) {
29
+ let tax = 0;
30
+ const bracketBreakdown = [];
31
+ const applicableBrackets = this._isResident ? rules.taxBrackets : rules.nonResidentTaxBrackets;
32
+ for (let index = 0; index < applicableBrackets.length; index++) {
33
+ const bracket = applicableBrackets[index];
34
+ if (income <= bracket.from) {
35
+ bracketBreakdown.push({
36
+ bracketIndex: index,
37
+ bracketName: `Bracket ${index + 1}`,
38
+ from: bracket.from,
39
+ to: bracket.to ?? null,
40
+ rate: bracket.rate,
41
+ amountInBracket: 0,
42
+ taxOnAmount: 0,
43
+ });
44
+ break;
45
+ }
46
+ const upper = bracket.to ?? income;
47
+ const taxableAmount = Math.min(upper, income) - bracket.from;
48
+ if (taxableAmount > 0) {
49
+ const taxOnAmount = taxableAmount * bracket.rate;
50
+ tax += taxOnAmount;
51
+ bracketBreakdown.push({
52
+ bracketIndex: index,
53
+ bracketName: `Bracket ${index + 1}`,
54
+ from: bracket.from,
55
+ to: bracket.to ?? null,
56
+ rate: bracket.rate,
57
+ amountInBracket: taxableAmount,
58
+ taxOnAmount,
59
+ });
60
+ }
61
+ else {
62
+ bracketBreakdown.push({
63
+ bracketIndex: index,
64
+ bracketName: `Bracket ${index + 1}`,
65
+ from: bracket.from,
66
+ to: bracket.to ?? null,
67
+ rate: bracket.rate,
68
+ amountInBracket: 0,
69
+ taxOnAmount: 0,
70
+ });
71
+ }
72
+ }
73
+ return { grossTax: tax, bracketBreakdown };
74
+ }
75
+ computeLowIncomeTaxOffset(income, lito) {
76
+ if (income <= lito.phaseOutStart) {
77
+ return lito.maxOffset;
78
+ }
79
+ if (income >= lito.phaseOutEnd) {
80
+ return 0;
81
+ }
82
+ const reduction = (income - lito.phaseOutStart) * lito.phaseOutRate;
83
+ return Math.max(0, lito.maxOffset - reduction);
84
+ }
85
+ computeMedicareLevy(income, medicare) {
86
+ if (income <= medicare.shadingInThreshold) {
87
+ return 0;
88
+ }
89
+ if (income <= medicare.fullLevyThreshold) {
90
+ return (income - medicare.shadingInThreshold) * medicare.reductionRate;
91
+ }
92
+ return income * medicare.rate;
93
+ }
94
+ round(value, decimals = 2) {
95
+ return Number(value.toFixed(decimals));
96
+ }
97
+ }
98
+ exports.AustraliaIncomeTaxServiceImpl = AustraliaIncomeTaxServiceImpl;
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5jb21lLXRheC9hdXN0cmFsaWEvQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0EsTUFBYSw2QkFBNkI7SUFLdEMsWUFBWSxNQUFjLEVBQUUsS0FBcUIsRUFBRSxhQUFzQixJQUFJO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxrQkFBa0I7UUFDckIsTUFBTSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FDbEUsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsTUFBTSxDQUNkLENBQUM7UUFFRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FDakMsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQ3pDLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQzNCLENBQUM7UUFFRixNQUFNLGVBQWUsR0FBRyxTQUFTLEdBQUcsWUFBWSxDQUFDO1FBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDO1FBRWpELE9BQU87WUFDSCxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDekIsU0FBUyxF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QUM7Q0FDSjtBQTlIRCxzRUE4SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmFja2V0QWxsb2NhdGlvbiB9IGZyb20gXCIuLi9kb21haW4vdHlwZXNcIjtcbmltcG9ydCB7IEF1c3RyYWxpYUluY29tZVRheFNlcnZpY2UgfSBmcm9tIFwiLi9BdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIENvbXB1dGVkSW5jb21lVGF4VmFsdWVzLFxuICAgIEluY29tZVRheFJ1bGVzLFxuICAgIExvd0luY29tZVRheE9mZnNldCxcbiAgICBNZWRpY2FyZUxldnlSdWxlcyxcbn0gZnJvbSBcIi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBBdXN0cmFsaWFJbmNvbWVUYXhTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEF1c3RyYWxpYUluY29tZVRheFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2luY29tZTogbnVtYmVyO1xuICAgIHByaXZhdGUgX3J1bGVzOiBJbmNvbWVUYXhSdWxlcztcbiAgICBwcml2YXRlIF9pc1Jlc2lkZW50OiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoaW5jb21lOiBudW1iZXIsIHJ1bGVzOiBJbmNvbWVUYXhSdWxlcywgaXNSZXNpZGVudDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5faW5jb21lID0gaW5jb21lO1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgICAgICB0aGlzLl9pc1Jlc2lkZW50ID0gaXNSZXNpZGVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FsY3VsYXRlTmV0SW5jb21lKCk6IENvbXB1dGVkSW5jb21lVGF4VmFsdWVzIHtcbiAgICAgICAgY29uc3QgeyBncm9zc1RheCwgYnJhY2tldEJyZWFrZG93biB9ID0gdGhpcy5jb21wdXRlVGF4QnJhY2tldEJyZWFrZG93bihcbiAgICAgICAgICAgIHRoaXMuX2luY29tZSxcbiAgICAgICAgICAgIHRoaXMuX3J1bGVzLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGxpdG8gPSB0aGlzLmNvbXB1dGVMb3dJbmNvbWVUYXhPZmZzZXQoXG4gICAgICAgICAgICB0aGlzLl9pbmNvbWUsXG4gICAgICAgICAgICB0aGlzLl9ydWxlcy5sb3dJbmNvbWVUYXhPZmZzZXQsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW5jb21lVGF4ID0gTWF0aC5tYXgoMCwgZ3Jvc3NUYXggLSBsaXRvKTtcbiAgICAgICAgY29uc3QgbWVkaWNhcmVMZXZ5ID0gdGhpcy5jb21wdXRlTWVkaWNhcmVMZXZ5KFxuICAgICAgICAgICAgdGhpcy5faW5jb21lLFxuICAgICAgICAgICAgdGhpcy5fcnVsZXMubWVkaWNhcmVMZXZ5LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRvdGFsRGVkdWN0aW9ucyA9IGluY29tZVRheCArIG1lZGljYXJlTGV2eTtcbiAgICAgICAgY29uc3QgbmV0SW5jb21lID0gdGhpcy5faW5jb21lIC0gdG90YWxEZWR1Y3Rpb25zO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBncm9zc0luY29tZTogdGhpcy5faW5jb21lLFxuICAgICAgICAgICAgaW5jb21lVGF4OiB0aGlzLnJvdW5kKGluY29tZVRheCksXG4gICAgICAgICAgICBtZWRpY2FyZUxldnk6IHRoaXMucm91bmQobWVkaWNhcmVMZXZ5KSxcbiAgICAgICAgICAgIGxvd0luY29tZVRheE9mZnNldDogdGhpcy5yb3VuZChsaXRvKSxcbiAgICAgICAgICAgIHRvdGFsRGVkdWN0aW9uczogdGhpcy5yb3VuZCh0b3RhbERlZHVjdGlvbnMpLFxuICAgICAgICAgICAgbmV0SW5jb21lOiB0aGlzLnJvdW5kKG5ldEluY29tZSksXG4gICAgICAgICAgICBlZmZlY3RpdmVUYXhSYXRlOiB0aGlzLl9pbmNvbWUgPiAwID8gdGhpcy5yb3VuZChpbmNvbWVUYXggLyB0aGlzLl9pbmNvbWUsIDQpIDogMCxcbiAgICAgICAgICAgIHRheEJyYWNrZXRCcmVha2Rvd246IGJyYWNrZXRCcmVha2Rvd24sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlVGF4QnJhY2tldEJyZWFrZG93bihcbiAgICAgICAgaW5jb21lOiBudW1iZXIsXG4gICAgICAgIHJ1bGVzOiBJbmNvbWVUYXhSdWxlcyxcbiAgICApOiB7IGdyb3NzVGF4OiBudW1iZXI7IGJyYWNrZXRCcmVha2Rvd246IEJyYWNrZXRBbGxvY2F0aW9uW10gfSB7XG4gICAgICAgIGxldCB0YXggPSAwO1xuICAgICAgICBjb25zdCBicmFja2V0QnJlYWtkb3duOiBCcmFja2V0QWxsb2NhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgYXBwbGljYWJsZUJyYWNrZXRzID0gdGhpcy5faXNSZXNpZGVudCA/IHJ1bGVzLnRheEJyYWNrZXRzIDogcnVsZXMubm9uUmVzaWRlbnRUYXhCcmFja2V0cztcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFwcGxpY2FibGVCcmFja2V0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJyYWNrZXQgPSBhcHBsaWNhYmxlQnJhY2tldHNbaW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoaW5jb21lIDw9IGJyYWNrZXQuZnJvbSkge1xuICAgICAgICAgICAgICAgIGJyYWNrZXRCcmVha2Rvd24ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXRJbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXROYW1lOiBgQnJhY2tldCAke2luZGV4ICsgMX1gLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBicmFja2V0LmZyb20sXG4gICAgICAgICAgICAgICAgICAgIHRvOiBicmFja2V0LnRvID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50SW5CcmFja2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0YXhPbkFtb3VudDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdXBwZXIgPSBicmFja2V0LnRvID8/IGluY29tZTtcbiAgICAgICAgICAgIGNvbnN0IHRheGFibGVBbW91bnQgPSBNYXRoLm1pbih1cHBlciwgaW5jb21lKSAtIGJyYWNrZXQuZnJvbTtcblxuICAgICAgICAgICAgaWYgKHRheGFibGVBbW91bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGF4T25BbW91bnQgPSB0YXhhYmxlQW1vdW50ICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSB0YXhPbkFtb3VudDtcbiAgICAgICAgICAgICAgICBicmFja2V0QnJlYWtkb3duLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBicmFja2V0SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICBicmFja2V0TmFtZTogYEJyYWNrZXQgJHtpbmRleCArIDF9YCxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogYnJhY2tldC5mcm9tLFxuICAgICAgICAgICAgICAgICAgICB0bzogYnJhY2tldC50byA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICByYXRlOiBicmFja2V0LnJhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFtb3VudEluQnJhY2tldDogdGF4YWJsZUFtb3VudCxcbiAgICAgICAgICAgICAgICAgICAgdGF4T25BbW91bnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyYWNrZXRCcmVha2Rvd24ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXRJbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXROYW1lOiBgQnJhY2tldCAke2luZGV4ICsgMX1gLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBicmFja2V0LmZyb20sXG4gICAgICAgICAgICAgICAgICAgIHRvOiBicmFja2V0LnRvID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50SW5CcmFja2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0YXhPbkFtb3VudDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGdyb3NzVGF4OiB0YXgsIGJyYWNrZXRCcmVha2Rvd24gfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVMb3dJbmNvbWVUYXhPZmZzZXQoaW5jb21lOiBudW1iZXIsIGxpdG86IExvd0luY29tZVRheE9mZnNldCk6IG51bWJlciB7XG4gICAgICAgIGlmIChpbmNvbWUgPD0gbGl0by5waGFzZU91dFN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbGl0by5tYXhPZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5jb21lID49IGxpdG8ucGhhc2VPdXRFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVkdWN0aW9uID0gKGluY29tZSAtIGxpdG8ucGhhc2VPdXRTdGFydCkgKiBsaXRvLnBoYXNlT3V0UmF0ZTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGxpdG8ubWF4T2Zmc2V0IC0gcmVkdWN0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVNZWRpY2FyZUxldnkoaW5jb21lOiBudW1iZXIsIG1lZGljYXJlOiBNZWRpY2FyZUxldnlSdWxlcyk6IG51bWJlciB7XG4gICAgICAgIGlmIChpbmNvbWUgPD0gbWVkaWNhcmUuc2hhZGluZ0luVGhyZXNob2xkKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNvbWUgPD0gbWVkaWNhcmUuZnVsbExldnlUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIHJldHVybiAoaW5jb21lIC0gbWVkaWNhcmUuc2hhZGluZ0luVGhyZXNob2xkKSAqIG1lZGljYXJlLnJlZHVjdGlvblJhdGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5jb21lICogbWVkaWNhcmUucmF0ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJvdW5kKHZhbHVlOiBudW1iZXIsIGRlY2ltYWxzID0gMik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUudG9GaXhlZChkZWNpbWFscykpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW5jb21lLXRheC9hdXN0cmFsaWEvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmFja2V0QWxsb2NhdGlvbiwgVGF4QnJhY2tldCB9IGZyb20gXCIuLi8uLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVUYXhSdWxlcyB7XG4gICAgdGF4QnJhY2tldHM6IFRheEJyYWNrZXRbXTtcbiAgICBub25SZXNpZGVudFRheEJyYWNrZXRzOiBUYXhCcmFja2V0W107XG4gICAgbWVkaWNhcmVMZXZ5OiBNZWRpY2FyZUxldnlSdWxlcztcbiAgICBsb3dJbmNvbWVUYXhPZmZzZXQ6IExvd0luY29tZVRheE9mZnNldDtcbiAgICBsb3dBbmRNaWRkbGVJbmNvbWVUYXhPZmZzZXQ/OiBMb3dBbmRNaWRkbGVJbmNvbWVUYXhPZmZzZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWNhcmVMZXZ5UnVsZXMge1xuICAgIHJhdGU6IG51bWJlcjtcbiAgICBzaGFkaW5nSW5UaHJlc2hvbGQ6IG51bWJlcjtcbiAgICBmdWxsTGV2eVRocmVzaG9sZDogbnVtYmVyO1xuICAgIHJlZHVjdGlvblJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb3dJbmNvbWVUYXhPZmZzZXQge1xuICAgIG1heE9mZnNldDogbnVtYmVyO1xuICAgIHBoYXNlT3V0U3RhcnQ6IG51bWJlcjtcbiAgICBwaGFzZU91dEVuZDogbnVtYmVyO1xuICAgIHBoYXNlT3V0UmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvd0FuZE1pZGRsZUluY29tZVRheE9mZnNldCB7XG4gICAgbWF4T2Zmc2V0OiBudW1iZXI7XG4gICAgcGhhc2VPdXRTdGFydDogbnVtYmVyO1xuICAgIHBoYXNlT3V0RW5kOiBudW1iZXI7XG4gICAgcGhhc2VPdXRSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMge1xuICAgIGdyb3NzSW5jb21lOiBudW1iZXI7XG4gICAgaW5jb21lVGF4OiBudW1iZXI7XG4gICAgbWVkaWNhcmVMZXZ5OiBudW1iZXI7XG4gICAgbG93SW5jb21lVGF4T2Zmc2V0OiBudW1iZXI7XG4gICAgdG90YWxEZWR1Y3Rpb25zOiBudW1iZXI7XG4gICAgbmV0SW5jb21lOiBudW1iZXI7XG4gICAgZWZmZWN0aXZlVGF4UmF0ZTogbnVtYmVyO1xuICAgIHRheEJyYWNrZXRCcmVha2Rvd246IEJyYWNrZXRBbGxvY2F0aW9uW107XG59XG4iXX0=
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.SouthAfricaCorporateTaxService = exports.SouthAfricaMortgageService = exports.SouthAfricaIncomeTaxService = exports.FranceCorporateTaxService = exports.FranceMortgageService = exports.FranceIncomeTaxService = exports.CanadaCorporateTaxService = exports.CanadaMortgageService = exports.CanadaIncomeTaxService = exports.CalculatorType = void 0;
17
+ exports.AustraliaCorporateTaxService = exports.AustraliaMortgageService = exports.AustraliaIncomeTaxService = 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
@@ -38,5 +38,12 @@ var SouthAfricaMortgageServiceImpl_1 = require("./mortgage/south-africa/SouthAfr
38
38
  Object.defineProperty(exports, "SouthAfricaMortgageService", { enumerable: true, get: function () { return SouthAfricaMortgageServiceImpl_1.SouthAfricaMortgageServiceImpl; } });
39
39
  var SouthAfricaCorporateTaxServiceImpl_1 = require("./corporate/south-africa/SouthAfricaCorporateTaxServiceImpl");
40
40
  Object.defineProperty(exports, "SouthAfricaCorporateTaxService", { enumerable: true, get: function () { return SouthAfricaCorporateTaxServiceImpl_1.SouthAfricaCorporateTaxServiceImpl; } });
41
+ // Australia
42
+ var AustraliaIncomeTaxServiceImpl_1 = require("./income-tax/australia/AustraliaIncomeTaxServiceImpl");
43
+ Object.defineProperty(exports, "AustraliaIncomeTaxService", { enumerable: true, get: function () { return AustraliaIncomeTaxServiceImpl_1.AustraliaIncomeTaxServiceImpl; } });
44
+ var AustraliaMortgageServiceImpl_1 = require("./mortgage/australia/AustraliaMortgageServiceImpl");
45
+ Object.defineProperty(exports, "AustraliaMortgageService", { enumerable: true, get: function () { return AustraliaMortgageServiceImpl_1.AustraliaMortgageServiceImpl; } });
46
+ var AustraliaCorporateTaxServiceImpl_1 = require("./corporate/australia/AustraliaCorporateTaxServiceImpl");
47
+ Object.defineProperty(exports, "AustraliaCorporateTaxService", { enumerable: true, get: function () { return AustraliaCorporateTaxServiceImpl_1.AustraliaCorporateTaxServiceImpl; } });
41
48
  __exportStar(require("./income-tax/domain/types"), exports);
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBdUQ7QUFBOUMsdUdBQUEsY0FBYyxPQUFBO0FBRXZCLFNBQVM7QUFDVCw2RkFBc0g7QUFBN0csb0lBQUEsMEJBQTBCLE9BQTBCO0FBQzdELHlGQUFpSDtBQUF4RyxrSUFBQSx5QkFBeUIsT0FBeUI7QUFXM0Qsa0dBQThIO0FBQXJILDBJQUFBLDZCQUE2QixPQUE2QjtBQU9uRSxTQUFTO0FBQ1QsNkZBQXNIO0FBQTdHLG9JQUFBLDBCQUEwQixPQUEwQjtBQUM3RCx5RkFBaUg7QUFBeEcsa0lBQUEseUJBQXlCLE9BQXlCO0FBVzNELGtHQUE4SDtBQUFySCwwSUFBQSw2QkFBNkIsT0FBNkI7QUFPbkUsZUFBZTtBQUNmLDZHQUEySTtBQUFsSSw4SUFBQSwrQkFBK0IsT0FBK0I7QUFDdkUseUdBQXNJO0FBQTdILDRJQUFBLDhCQUE4QixPQUE4QjtBQVdyRSxrSEFBbUo7QUFBMUksb0pBQUEsa0NBQWtDLE9BQWtDO0FBUTdFLDREQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENhbGN1bGF0b3JUeXBlIH0gZnJvbSAnLi9zaGFyZWQvZG9tYWluL3R5cGVzJztcblxuLy8gQ2FuYWRhXG5leHBvcnQgeyBDYW5hZGFJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBDYW5hZGFJbmNvbWVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9pbmNvbWUtdGF4L2NhbmFkYS9DYW5hZGFJbmNvbWVUYXhTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBDYW5hZGFNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIENhbmFkYU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vbW9ydGdhZ2UvY2FuYWRhL0NhbmFkYU1vcnRnYWdlU2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBDb21wdXRlZEluY29tZVRheFZhbHVlcyBhcyBDYW5hZGFDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBJbmNvbWVUYXhSdWxlcyBhcyBDYW5hZGFJbmNvbWVUYXhSdWxlcyxcbn0gZnJvbSAnLi9pbmNvbWUtdGF4L2NhbmFkYS9kb21haW4vdHlwZXMnO1xuZXhwb3J0IHtcbiAgICBNb3J0Z2FnZVJ1bGVzIGFzIENhbmFkYU1vcnRnYWdlUnVsZXMsXG4gICAgTW9ydGdhZ2VDYWxjdWxhdGlvbklucHV0IGFzIENhbmFkYU1vcnRnYWdlQ2FsY3VsYXRpb25JbnB1dCxcbiAgICBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0IGFzIENhbmFkYU1vcnRnYWdlQ2FsY3VsYXRpb25SZXN1bHQsXG59IGZyb20gJy4vbW9ydGdhZ2UvY2FuYWRhL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCB7IENhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsIGFzIENhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2UgfSBmcm9tICcuL2NvcnBvcmF0ZS9jYW5hZGEvQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBJbnB1dCBhcyBDYW5hZGFDb3Jwb3JhdGVUYXhJbnB1dCxcbiAgICBSdWxlcyBhcyBDYW5hZGFDb3Jwb3JhdGVUYXhSdWxlcyxcbiAgICBSZXN1bHQgYXMgQ2FuYWRhQ29ycG9yYXRlVGF4UmVzdWx0LFxufSBmcm9tICcuL2NvcnBvcmF0ZS9jYW5hZGEvZG9tYWluL3R5cGVzJztcblxuLy8gRnJhbmNlXG5leHBvcnQgeyBGcmFuY2VJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBGcmFuY2VJbmNvbWVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9pbmNvbWUtdGF4L2ZyYW5jZS9GcmFuY2VJbmNvbWVUYXhTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBGcmFuY2VNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIEZyYW5jZU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vbW9ydGdhZ2UvZnJhbmNlL0ZyYW5jZU1vcnRnYWdlU2VydmljZUltcGwnO1xuZXhwb3J0IHsgXG4gICAgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMgYXMgRnJhbmNlQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMsXG4gICAgSW5jb21lVGF4UnVsZXMgYXMgRnJhbmNlSW5jb21lVGF4UnVsZXMsXG59IGZyb20gJy4vaW5jb21lLXRheC9mcmFuY2UvZG9tYWluL3R5cGVzJztcbmV4cG9ydCB7XG4gICAgTW9ydGdhZ2VSdWxlcyBhcyBGcmFuY2VNb3J0Z2FnZVJ1bGVzLFxuICAgIE1vcnRnYWdlSW5wdXQgYXMgRnJhbmNlTW9ydGdhZ2VJbnB1dCxcbiAgICBNb3J0Z2FnZU91dHB1dCBhcyBGcmFuY2VNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0LFxufSBmcm9tICcuL21vcnRnYWdlL2ZyYW5jZS9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgeyBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCBhcyBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9jb3Jwb3JhdGUvZnJhbmNlL0ZyYW5jZUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgSW5wdXQgYXMgRnJhbmNlQ29ycG9yYXRlVGF4SW5wdXQsXG4gICAgUnVsZXMgYXMgRnJhbmNlQ29ycG9yYXRlVGF4UnVsZXMsXG4gICAgUmVzdWx0IGFzIEZyYW5jZUNvcnBvcmF0ZVRheFJlc3VsdCxcbn0gZnJvbSAnLi9jb3Jwb3JhdGUvZnJhbmNlL2RvbWFpbi90eXBlcyc7XG5cbi8vIFNvdXRoIEFmcmljYVxuZXhwb3J0IHsgU291dGhBZnJpY2FJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBTb3V0aEFmcmljYUluY29tZVRheFNlcnZpY2UgfSBmcm9tICcuL2luY29tZS10YXgvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhSW5jb21lVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHsgU291dGhBZnJpY2FNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIFNvdXRoQWZyaWNhTW9ydGdhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9tb3J0Z2FnZS9zb3V0aC1hZnJpY2EvU291dGhBZnJpY2FNb3J0Z2FnZVNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMgYXMgU291dGhBZnJpY2FDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBJbmNvbWVUYXhSdWxlcyBhcyBTb3V0aEFmcmljYUluY29tZVRheFJ1bGVzLFxufSBmcm9tICcuL2luY29tZS10YXgvc291dGgtYWZyaWNhL2RvbWFpbi90eXBlcyc7XG5leHBvcnQge1xuICAgIE1vcnRnYWdlUnVsZXMgYXMgU291dGhBZnJpY2FNb3J0Z2FnZVJ1bGVzLFxuICAgIE1vcnRnYWdlSW5wdXQgYXMgU291dGhBZnJpY2FNb3J0Z2FnZUlucHV0LFxuICAgIE1vcnRnYWdlT3V0cHV0IGFzIFNvdXRoQWZyaWNhTW9ydGdhZ2VPdXRwdXQsXG59IGZyb20gJy4vbW9ydGdhZ2Uvc291dGgtYWZyaWNhL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCB7IFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwgYXMgU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9jb3Jwb3JhdGUvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBSdWxlcyBhcyBTb3V0aEFmcmljYUNvcnBvcmF0ZVRheFJ1bGVzLFxuICAgIElucHV0IGFzIFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4SW5wdXQsXG4gICAgUmVzdWx0IGFzIFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4UmVzdWx0LFxufSBmcm9tICcuL2NvcnBvcmF0ZS9zb3V0aC1hZnJpY2EvZG9tYWluL3R5cGVzJztcblxuZXhwb3J0IHsgSW5jb21lVGF4Q2FsY3VsYXRvclNjaGVtYSB9IGZyb20gJy4vaW5jb21lLXRheC9kb21haW4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbmNvbWUtdGF4L2RvbWFpbi90eXBlcyc7Il19
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBdUQ7QUFBOUMsdUdBQUEsY0FBYyxPQUFBO0FBRXZCLFNBQVM7QUFDVCw2RkFBc0g7QUFBN0csb0lBQUEsMEJBQTBCLE9BQTBCO0FBQzdELHlGQUFpSDtBQUF4RyxrSUFBQSx5QkFBeUIsT0FBeUI7QUFXM0Qsa0dBQThIO0FBQXJILDBJQUFBLDZCQUE2QixPQUE2QjtBQU9uRSxTQUFTO0FBQ1QsNkZBQXNIO0FBQTdHLG9JQUFBLDBCQUEwQixPQUEwQjtBQUM3RCx5RkFBaUg7QUFBeEcsa0lBQUEseUJBQXlCLE9BQXlCO0FBVzNELGtHQUE4SDtBQUFySCwwSUFBQSw2QkFBNkIsT0FBNkI7QUFPbkUsZUFBZTtBQUNmLDZHQUEySTtBQUFsSSw4SUFBQSwrQkFBK0IsT0FBK0I7QUFDdkUseUdBQXNJO0FBQTdILDRJQUFBLDhCQUE4QixPQUE4QjtBQVdyRSxrSEFBbUo7QUFBMUksb0pBQUEsa0NBQWtDLE9BQWtDO0FBTzdFLFlBQVk7QUFDWixzR0FBa0k7QUFBekgsMElBQUEsNkJBQTZCLE9BQTZCO0FBTW5FLGtHQUE2SDtBQUFwSCx3SUFBQSw0QkFBNEIsT0FBNEI7QUFPakUsMkdBQTBJO0FBQWpJLGdKQUFBLGdDQUFnQyxPQUFnQztBQVF6RSw0REFBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBDYWxjdWxhdG9yVHlwZSB9IGZyb20gJy4vc2hhcmVkL2RvbWFpbi90eXBlcyc7XG5cbi8vIENhbmFkYVxuZXhwb3J0IHsgQ2FuYWRhSW5jb21lVGF4U2VydmljZUltcGwgYXMgQ2FuYWRhSW5jb21lVGF4U2VydmljZSB9IGZyb20gJy4vaW5jb21lLXRheC9jYW5hZGEvQ2FuYWRhSW5jb21lVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHsgQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbCBhcyBDYW5hZGFNb3J0Z2FnZVNlcnZpY2UgfSBmcm9tICcuL21vcnRnYWdlL2NhbmFkYS9DYW5hZGFNb3J0Z2FnZVNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMgYXMgQ2FuYWRhQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMsXG4gICAgSW5jb21lVGF4UnVsZXMgYXMgQ2FuYWRhSW5jb21lVGF4UnVsZXMsXG59IGZyb20gJy4vaW5jb21lLXRheC9jYW5hZGEvZG9tYWluL3R5cGVzJztcbmV4cG9ydCB7XG4gICAgTW9ydGdhZ2VSdWxlcyBhcyBDYW5hZGFNb3J0Z2FnZVJ1bGVzLFxuICAgIE1vcnRnYWdlQ2FsY3VsYXRpb25JbnB1dCBhcyBDYW5hZGFNb3J0Z2FnZUNhbGN1bGF0aW9uSW5wdXQsXG4gICAgTW9ydGdhZ2VDYWxjdWxhdGlvblJlc3VsdCBhcyBDYW5hZGFNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0LFxufSBmcm9tICcuL21vcnRnYWdlL2NhbmFkYS9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgeyBDYW5hZGFDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCBhcyBDYW5hZGFDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9jb3Jwb3JhdGUvY2FuYWRhL0NhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgSW5wdXQgYXMgQ2FuYWRhQ29ycG9yYXRlVGF4SW5wdXQsXG4gICAgUnVsZXMgYXMgQ2FuYWRhQ29ycG9yYXRlVGF4UnVsZXMsXG4gICAgUmVzdWx0IGFzIENhbmFkYUNvcnBvcmF0ZVRheFJlc3VsdCxcbn0gZnJvbSAnLi9jb3Jwb3JhdGUvY2FuYWRhL2RvbWFpbi90eXBlcyc7XG5cbi8vIEZyYW5jZVxuZXhwb3J0IHsgRnJhbmNlSW5jb21lVGF4U2VydmljZUltcGwgYXMgRnJhbmNlSW5jb21lVGF4U2VydmljZSB9IGZyb20gJy4vaW5jb21lLXRheC9mcmFuY2UvRnJhbmNlSW5jb21lVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHsgRnJhbmNlTW9ydGdhZ2VTZXJ2aWNlSW1wbCBhcyBGcmFuY2VNb3J0Z2FnZVNlcnZpY2UgfSBmcm9tICcuL21vcnRnYWdlL2ZyYW5jZS9GcmFuY2VNb3J0Z2FnZVNlcnZpY2VJbXBsJztcbmV4cG9ydCB7IFxuICAgIENvbXB1dGVkSW5jb21lVGF4VmFsdWVzIGFzIEZyYW5jZUNvbXB1dGVkSW5jb21lVGF4VmFsdWVzLFxuICAgIEluY29tZVRheFJ1bGVzIGFzIEZyYW5jZUluY29tZVRheFJ1bGVzLFxufSBmcm9tICcuL2luY29tZS10YXgvZnJhbmNlL2RvbWFpbi90eXBlcyc7XG5leHBvcnQge1xuICAgIE1vcnRnYWdlUnVsZXMgYXMgRnJhbmNlTW9ydGdhZ2VSdWxlcyxcbiAgICBNb3J0Z2FnZUlucHV0IGFzIEZyYW5jZU1vcnRnYWdlSW5wdXQsXG4gICAgTW9ydGdhZ2VPdXRwdXQgYXMgRnJhbmNlTW9ydGdhZ2VDYWxjdWxhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi9tb3J0Z2FnZS9mcmFuY2UvZG9tYWluL3R5cGVzJztcblxuZXhwb3J0IHsgRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZUltcGwgYXMgRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZSB9IGZyb20gJy4vY29ycG9yYXRlL2ZyYW5jZS9GcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCc7XG5leHBvcnQge1xuICAgIElucHV0IGFzIEZyYW5jZUNvcnBvcmF0ZVRheElucHV0LFxuICAgIFJ1bGVzIGFzIEZyYW5jZUNvcnBvcmF0ZVRheFJ1bGVzLFxuICAgIFJlc3VsdCBhcyBGcmFuY2VDb3Jwb3JhdGVUYXhSZXN1bHQsXG59IGZyb20gJy4vY29ycG9yYXRlL2ZyYW5jZS9kb21haW4vdHlwZXMnO1xuXG4vLyBTb3V0aCBBZnJpY2FcbmV4cG9ydCB7IFNvdXRoQWZyaWNhSW5jb21lVGF4U2VydmljZUltcGwgYXMgU291dGhBZnJpY2FJbmNvbWVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9pbmNvbWUtdGF4L3NvdXRoLWFmcmljYS9Tb3V0aEFmcmljYUluY29tZVRheFNlcnZpY2VJbXBsJztcbmV4cG9ydCB7IFNvdXRoQWZyaWNhTW9ydGdhZ2VTZXJ2aWNlSW1wbCBhcyBTb3V0aEFmcmljYU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vbW9ydGdhZ2Uvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhTW9ydGdhZ2VTZXJ2aWNlSW1wbCc7XG5leHBvcnQge1xuICAgIENvbXB1dGVkSW5jb21lVGF4VmFsdWVzIGFzIFNvdXRoQWZyaWNhQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMsXG4gICAgSW5jb21lVGF4UnVsZXMgYXMgU291dGhBZnJpY2FJbmNvbWVUYXhSdWxlcyxcbn0gZnJvbSAnLi9pbmNvbWUtdGF4L3NvdXRoLWFmcmljYS9kb21haW4vdHlwZXMnO1xuZXhwb3J0IHtcbiAgICBNb3J0Z2FnZVJ1bGVzIGFzIFNvdXRoQWZyaWNhTW9ydGdhZ2VSdWxlcyxcbiAgICBNb3J0Z2FnZUlucHV0IGFzIFNvdXRoQWZyaWNhTW9ydGdhZ2VJbnB1dCxcbiAgICBNb3J0Z2FnZU91dHB1dCBhcyBTb3V0aEFmcmljYU1vcnRnYWdlT3V0cHV0LFxufSBmcm9tICcuL21vcnRnYWdlL3NvdXRoLWFmcmljYS9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgeyBTb3V0aEFmcmljYUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsIGFzIFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZSB9IGZyb20gJy4vY29ycG9yYXRlL3NvdXRoLWFmcmljYS9Tb3V0aEFmcmljYUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgUnVsZXMgYXMgU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhSdWxlcyxcbiAgICBJbnB1dCBhcyBTb3V0aEFmcmljYUNvcnBvcmF0ZVRheElucHV0LFxuICAgIFJlc3VsdCBhcyBTb3V0aEFmcmljYUNvcnBvcmF0ZVRheFJlc3VsdCxcbn0gZnJvbSAnLi9jb3Jwb3JhdGUvc291dGgtYWZyaWNhL2RvbWFpbi90eXBlcyc7XG5cbi8vIEF1c3RyYWxpYVxuZXhwb3J0IHsgQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZUltcGwgYXMgQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZSB9IGZyb20gJy4vaW5jb21lLXRheC9hdXN0cmFsaWEvQXVzdHJhbGlhSW5jb21lVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBDb21wdXRlZEluY29tZVRheFZhbHVlcyBhcyBBdXN0cmFsaWFDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBJbmNvbWVUYXhSdWxlcyBhcyBBdXN0cmFsaWFJbmNvbWVUYXhSdWxlcyxcbn0gZnJvbSAnLi9pbmNvbWUtdGF4L2F1c3RyYWxpYS9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgeyBBdXN0cmFsaWFNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIEF1c3RyYWxpYU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vbW9ydGdhZ2UvYXVzdHJhbGlhL0F1c3RyYWxpYU1vcnRnYWdlU2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBNb3J0Z2FnZVJ1bGVzIGFzIEF1c3RyYWxpYU1vcnRnYWdlUnVsZXMsXG4gICAgTW9ydGdhZ2VJbnB1dCBhcyBBdXN0cmFsaWFNb3J0Z2FnZUlucHV0LFxuICAgIE1vcnRnYWdlT3V0cHV0IGFzIEF1c3RyYWxpYU1vcnRnYWdlT3V0cHV0LFxufSBmcm9tICcuL21vcnRnYWdlL2F1c3RyYWxpYS9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgeyBBdXN0cmFsaWFDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCBhcyBBdXN0cmFsaWFDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9jb3Jwb3JhdGUvYXVzdHJhbGlhL0F1c3RyYWxpYUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgSW5wdXQgYXMgQXVzdHJhbGlhQ29ycG9yYXRlVGF4SW5wdXQsXG4gICAgUnVsZXMgYXMgQXVzdHJhbGlhQ29ycG9yYXRlVGF4UnVsZXMsXG4gICAgUmVzdWx0IGFzIEF1c3RyYWxpYUNvcnBvcmF0ZVRheFJlc3VsdCxcbn0gZnJvbSAnLi9jb3Jwb3JhdGUvYXVzdHJhbGlhL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCB7IEluY29tZVRheENhbGN1bGF0b3JTY2hlbWEgfSBmcm9tICcuL2luY29tZS10YXgvZG9tYWluL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW5jb21lLXRheC9kb21haW4vdHlwZXMnOyJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhTW9ydGdhZ2VTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vcnRnYWdlL2F1c3RyYWxpYS9BdXN0cmFsaWFNb3J0Z2FnZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vcnRnYWdlSW5wdXQsIE1vcnRnYWdlT3V0cHV0LCBNb3J0Z2FnZVJ1bGVzIH0gZnJvbSBcIi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVzdHJhbGlhTW9ydGdhZ2VTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGUoaW5wdXQ6IE1vcnRnYWdlSW5wdXQsIHJ1bGVzOiBNb3J0Z2FnZVJ1bGVzKTogTW9ydGdhZ2VPdXRwdXQ7XG59XG4iXX0=
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AustraliaMortgageServiceImpl = void 0;
4
+ const PAYMENT_FREQUENCY_PAYMENTS_PER_YEAR = {
5
+ MONTHLY: 12,
6
+ FORTNIGHTLY: 26,
7
+ WEEKLY: 52,
8
+ };
9
+ class AustraliaMortgageServiceImpl {
10
+ calculate(input, rules) {
11
+ const loanAmount = input.propertyPrice - input.downPayment;
12
+ if (loanAmount <= 0) {
13
+ throw new Error('Invalid loan amount: down payment must be less than property price');
14
+ }
15
+ const lvr = loanAmount / input.propertyPrice;
16
+ const lmiPremium = this.computeLmi(loanAmount, lvr, rules);
17
+ const totalMortgage = rules.lendersMortgageInsurance.premiumAddedToLoan
18
+ ? loanAmount + lmiPremium
19
+ : loanAmount;
20
+ const paymentsPerYear = PAYMENT_FREQUENCY_PAYMENTS_PER_YEAR[input.paymentFrequency];
21
+ const totalPayments = input.amortizationYears * paymentsPerYear;
22
+ const periodicRate = (input.annualInterestRate / 100) / paymentsPerYear;
23
+ const paymentAmount = this.calculatePayment(totalMortgage, periodicRate, totalPayments);
24
+ const totalPaid = paymentAmount * totalPayments;
25
+ const totalInterestPaid = totalPaid - totalMortgage;
26
+ const stampDuty = this.calculateStampDuty(input.propertyPrice, rules.stampDuty);
27
+ const amortizationSchedule = this.calculateAmortizationSchedule(totalMortgage, periodicRate, paymentAmount, totalPayments, input.amortizationYears, paymentsPerYear);
28
+ return {
29
+ loanAmount,
30
+ lmiPremium,
31
+ totalMortgage,
32
+ monthlyPayment: paymentAmount,
33
+ totalInterestPaid,
34
+ totalPaid,
35
+ stampDuty,
36
+ amortizationSchedule,
37
+ otherFees: {
38
+ notaryFees: {
39
+ value: stampDuty,
40
+ label: 'STAMP_DUTY',
41
+ },
42
+ bankFees: {
43
+ value: 0,
44
+ label: 'BANK_FEES',
45
+ },
46
+ monthlyInsuranceFees: {
47
+ value: lmiPremium,
48
+ label: 'LMI_PREMIUM',
49
+ },
50
+ },
51
+ };
52
+ }
53
+ computeLmi(loanAmount, lvr, rules) {
54
+ if (lvr <= rules.lendersMortgageInsurance.requiredAboveLvr) {
55
+ return 0;
56
+ }
57
+ const premiumRule = rules.lendersMortgageInsurance.premiumRates
58
+ .find(r => lvr <= r.maxLvr);
59
+ if (!premiumRule) {
60
+ throw new Error('LVR exceeds maximum insurable limit');
61
+ }
62
+ return loanAmount * premiumRule.rate;
63
+ }
64
+ calculateStampDuty(propertyPrice, stampDuty) {
65
+ let duty = 0;
66
+ let previousLimit = 0;
67
+ for (const bracket of stampDuty.brackets) {
68
+ if (bracket.upTo !== undefined && propertyPrice > previousLimit) {
69
+ const taxable = Math.min(propertyPrice, bracket.upTo) - previousLimit;
70
+ duty += taxable * bracket.rate;
71
+ previousLimit = bracket.upTo;
72
+ }
73
+ if (bracket.above !== undefined && propertyPrice > bracket.above) {
74
+ duty += (propertyPrice - bracket.above) * bracket.rate;
75
+ break;
76
+ }
77
+ }
78
+ return duty;
79
+ }
80
+ calculateAmortizationSchedule(principal, periodicRate, paymentAmount, totalPayments, amortizationYears, paymentsPerYear) {
81
+ const schedule = [];
82
+ let balance = principal;
83
+ for (let year = 1; year <= amortizationYears; year++) {
84
+ let yearlyPrincipal = 0;
85
+ let yearlyInterest = 0;
86
+ const paymentsInYear = Math.min(paymentsPerYear, totalPayments - (year - 1) * paymentsPerYear);
87
+ for (let payment = 1; payment <= paymentsInYear; payment++) {
88
+ const interestPayment = balance * periodicRate;
89
+ const principalPayment = paymentAmount - interestPayment;
90
+ yearlyInterest += interestPayment;
91
+ yearlyPrincipal += principalPayment;
92
+ balance -= principalPayment;
93
+ }
94
+ schedule.push({
95
+ year,
96
+ principal: yearlyPrincipal,
97
+ interest: yearlyInterest,
98
+ balance: Math.max(0, balance),
99
+ });
100
+ if (balance <= 0)
101
+ break;
102
+ }
103
+ return schedule;
104
+ }
105
+ calculatePayment(principal, rate, periods) {
106
+ if (rate === 0) {
107
+ return principal / periods;
108
+ }
109
+ return principal *
110
+ (rate * Math.pow(1 + rate, periods)) /
111
+ (Math.pow(1 + rate, periods) - 1);
112
+ }
113
+ }
114
+ exports.AustraliaMortgageServiceImpl = AustraliaMortgageServiceImpl;
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVzdHJhbGlhTW9ydGdhZ2VTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb3J0Z2FnZS9hdXN0cmFsaWEvQXVzdHJhbGlhTW9ydGdhZ2VTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFTQSxNQUFNLG1DQUFtQyxHQUEyQjtJQUNoRSxPQUFPLEVBQUUsRUFBRTtJQUNYLFdBQVcsRUFBRSxFQUFFO0lBQ2YsTUFBTSxFQUFFLEVBQUU7Q0FDYixDQUFDO0FBRUYsTUFBYSw0QkFBNEI7SUFFOUIsU0FBUyxDQUFDLEtBQW9CLEVBQUUsS0FBb0I7UUFDdkQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBRTNELElBQUksVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsVUFBVSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFFN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0I7WUFDbkUsQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVO1lBQ3pCLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFFakIsTUFBTSxlQUFlLEdBQUcsbUNBQW1DLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEYsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixHQUFHLGVBQWUsQ0FBQztRQUNoRSxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUM7UUFFeEUsTUFBTSxh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QixDQUFDO1FBRUQsT0FBTyxTQUFTO1lBQ1osQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDSjtBQWhKRCxvRUFnSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXN0cmFsaWFNb3J0Z2FnZVNlcnZpY2UgfSBmcm9tIFwiLi9BdXN0cmFsaWFNb3J0Z2FnZVNlcnZpY2VcIjtcbmltcG9ydCB7XG4gICAgQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtLFxuICAgIE1vcnRnYWdlSW5wdXQsXG4gICAgTW9ydGdhZ2VPdXRwdXQsXG4gICAgTW9ydGdhZ2VSdWxlcyxcbiAgICBTdGFtcER1dHlSdWxlcyxcbn0gZnJvbSBcIi4vZG9tYWluL3R5cGVzXCI7XG5cbmNvbnN0IFBBWU1FTlRfRlJFUVVFTkNZX1BBWU1FTlRTX1BFUl9ZRUFSOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgIE1PTlRITFk6IDEyLFxuICAgIEZPUlROSUdIVExZOiAyNixcbiAgICBXRUVLTFk6IDUyLFxufTtcblxuZXhwb3J0IGNsYXNzIEF1c3RyYWxpYU1vcnRnYWdlU2VydmljZUltcGwgaW1wbGVtZW50cyBBdXN0cmFsaWFNb3J0Z2FnZVNlcnZpY2Uge1xuXG4gICAgcHVibGljIGNhbGN1bGF0ZShpbnB1dDogTW9ydGdhZ2VJbnB1dCwgcnVsZXM6IE1vcnRnYWdlUnVsZXMpOiBNb3J0Z2FnZU91dHB1dCB7XG4gICAgICAgIGNvbnN0IGxvYW5BbW91bnQgPSBpbnB1dC5wcm9wZXJ0eVByaWNlIC0gaW5wdXQuZG93blBheW1lbnQ7XG5cbiAgICAgICAgaWYgKGxvYW5BbW91bnQgPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvYW4gYW1vdW50OiBkb3duIHBheW1lbnQgbXVzdCBiZSBsZXNzIHRoYW4gcHJvcGVydHkgcHJpY2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGx2ciA9IGxvYW5BbW91bnQgLyBpbnB1dC5wcm9wZXJ0eVByaWNlO1xuXG4gICAgICAgIGNvbnN0IGxtaVByZW1pdW0gPSB0aGlzLmNvbXB1dGVMbWkobG9hbkFtb3VudCwgbHZyLCBydWxlcyk7XG4gICAgICAgIGNvbnN0IHRvdGFsTW9ydGdhZ2UgPSBydWxlcy5sZW5kZXJzTW9ydGdhZ2VJbnN1cmFuY2UucHJlbWl1bUFkZGVkVG9Mb2FuXG4gICAgICAgICAgICA/IGxvYW5BbW91bnQgKyBsbWlQcmVtaXVtXG4gICAgICAgICAgICA6IGxvYW5BbW91bnQ7XG5cbiAgICAgICAgY29uc3QgcGF5bWVudHNQZXJZZWFyID0gUEFZTUVOVF9GUkVRVUVOQ1lfUEFZTUVOVFNfUEVSX1lFQVJbaW5wdXQucGF5bWVudEZyZXF1ZW5jeV07XG4gICAgICAgIGNvbnN0IHRvdGFsUGF5bWVudHMgPSBpbnB1dC5hbW9ydGl6YXRpb25ZZWFycyAqIHBheW1lbnRzUGVyWWVhcjtcbiAgICAgICAgY29uc3QgcGVyaW9kaWNSYXRlID0gKGlucHV0LmFubnVhbEludGVyZXN0UmF0ZSAvIDEwMCkgLyBwYXltZW50c1BlclllYXI7XG5cbiAgICAgICAgY29uc3QgcGF5bWVudEFtb3VudCA9IHRoaXMuY2FsY3VsYXRlUGF5bWVudCh0b3RhbE1vcnRnYWdlLCBwZXJpb2RpY1JhdGUsIHRvdGFsUGF5bWVudHMpO1xuICAgICAgICBjb25zdCB0b3RhbFBhaWQgPSBwYXltZW50QW1vdW50ICogdG90YWxQYXltZW50cztcbiAgICAgICAgY29uc3QgdG90YWxJbnRlcmVzdFBhaWQgPSB0b3RhbFBhaWQgLSB0b3RhbE1vcnRnYWdlO1xuXG4gICAgICAgIGNvbnN0IHN0YW1wRHV0eSA9IHRoaXMuY2FsY3VsYXRlU3RhbXBEdXR5KGlucHV0LnByb3BlcnR5UHJpY2UsIHJ1bGVzLnN0YW1wRHV0eSk7XG5cbiAgICAgICAgY29uc3QgYW1vcnRpemF0aW9uU2NoZWR1bGUgPSB0aGlzLmNhbGN1bGF0ZUFtb3J0aXphdGlvblNjaGVkdWxlKFxuICAgICAgICAgICAgdG90YWxNb3J0Z2FnZSxcbiAgICAgICAgICAgIHBlcmlvZGljUmF0ZSxcbiAgICAgICAgICAgIHBheW1lbnRBbW91bnQsXG4gICAgICAgICAgICB0b3RhbFBheW1lbnRzLFxuICAgICAgICAgICAgaW5wdXQuYW1vcnRpemF0aW9uWWVhcnMsXG4gICAgICAgICAgICBwYXltZW50c1BlclllYXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvYW5BbW91bnQsXG4gICAgICAgICAgICBsbWlQcmVtaXVtLFxuICAgICAgICAgICAgdG90YWxNb3J0Z2FnZSxcbiAgICAgICAgICAgIG1vbnRobHlQYXltZW50OiBwYXltZW50QW1vdW50LFxuICAgICAgICAgICAgdG90YWxJbnRlcmVzdFBhaWQsXG4gICAgICAgICAgICB0b3RhbFBhaWQsXG4gICAgICAgICAgICBzdGFtcER1dHksXG4gICAgICAgICAgICBhbW9ydGl6YXRpb25TY2hlZHVsZSxcbiAgICAgICAgICAgIG90aGVyRmVlczoge1xuICAgICAgICAgICAgICAgIG5vdGFyeUZlZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHN0YW1wRHV0eSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdTVEFNUF9EVVRZJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJhbmtGZWVzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0JBTktfRkVFUycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtb250aGx5SW5zdXJhbmNlRmVlczoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbG1pUHJlbWl1bSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdMTUlfUFJFTUlVTScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlTG1pKGxvYW5BbW91bnQ6IG51bWJlciwgbHZyOiBudW1iZXIsIHJ1bGVzOiBNb3J0Z2FnZVJ1bGVzKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKGx2ciA8PSBydWxlcy5sZW5kZXJzTW9ydGdhZ2VJbnN1cmFuY2UucmVxdWlyZWRBYm92ZUx2cikge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVtaXVtUnVsZSA9IHJ1bGVzLmxlbmRlcnNNb3J0Z2FnZUluc3VyYW5jZS5wcmVtaXVtUmF0ZXNcbiAgICAgICAgICAgIC5maW5kKHIgPT4gbHZyIDw9IHIubWF4THZyKTtcblxuICAgICAgICBpZiAoIXByZW1pdW1SdWxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xWUiBleGNlZWRzIG1heGltdW0gaW5zdXJhYmxlIGxpbWl0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9hbkFtb3VudCAqIHByZW1pdW1SdWxlLnJhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVTdGFtcER1dHkocHJvcGVydHlQcmljZTogbnVtYmVyLCBzdGFtcER1dHk6IFN0YW1wRHV0eVJ1bGVzKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGR1dHkgPSAwO1xuICAgICAgICBsZXQgcHJldmlvdXNMaW1pdCA9IDA7XG5cbiAgICAgICAgZm9yIChjb25zdCBicmFja2V0IG9mIHN0YW1wRHV0eS5icmFja2V0cykge1xuICAgICAgICAgICAgaWYgKGJyYWNrZXQudXBUbyAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5UHJpY2UgPiBwcmV2aW91c0xpbWl0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGF4YWJsZSA9IE1hdGgubWluKHByb3BlcnR5UHJpY2UsIGJyYWNrZXQudXBUbykgLSBwcmV2aW91c0xpbWl0O1xuICAgICAgICAgICAgICAgIGR1dHkgKz0gdGF4YWJsZSAqIGJyYWNrZXQucmF0ZTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0xpbWl0ID0gYnJhY2tldC51cFRvO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYnJhY2tldC5hYm92ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5UHJpY2UgPiBicmFja2V0LmFib3ZlKSB7XG4gICAgICAgICAgICAgICAgZHV0eSArPSAocHJvcGVydHlQcmljZSAtIGJyYWNrZXQuYWJvdmUpICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR1dHk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVBbW9ydGl6YXRpb25TY2hlZHVsZShcbiAgICAgICAgcHJpbmNpcGFsOiBudW1iZXIsXG4gICAgICAgIHBlcmlvZGljUmF0ZTogbnVtYmVyLFxuICAgICAgICBwYXltZW50QW1vdW50OiBudW1iZXIsXG4gICAgICAgIHRvdGFsUGF5bWVudHM6IG51bWJlcixcbiAgICAgICAgYW1vcnRpemF0aW9uWWVhcnM6IG51bWJlcixcbiAgICAgICAgcGF5bWVudHNQZXJZZWFyOiBudW1iZXIsXG4gICAgKTogQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtW10ge1xuICAgICAgICBjb25zdCBzY2hlZHVsZTogQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtW10gPSBbXTtcbiAgICAgICAgbGV0IGJhbGFuY2UgPSBwcmluY2lwYWw7XG5cbiAgICAgICAgZm9yIChsZXQgeWVhciA9IDE7IHllYXIgPD0gYW1vcnRpemF0aW9uWWVhcnM7IHllYXIrKykge1xuICAgICAgICAgICAgbGV0IHllYXJseVByaW5jaXBhbCA9IDA7XG4gICAgICAgICAgICBsZXQgeWVhcmx5SW50ZXJlc3QgPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBwYXltZW50c0luWWVhciA9IE1hdGgubWluKHBheW1lbnRzUGVyWWVhciwgdG90YWxQYXltZW50cyAtICh5ZWFyIC0gMSkgKiBwYXltZW50c1BlclllYXIpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBwYXltZW50ID0gMTsgcGF5bWVudCA8PSBwYXltZW50c0luWWVhcjsgcGF5bWVudCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJlc3RQYXltZW50ID0gYmFsYW5jZSAqIHBlcmlvZGljUmF0ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmluY2lwYWxQYXltZW50ID0gcGF5bWVudEFtb3VudCAtIGludGVyZXN0UGF5bWVudDtcblxuICAgICAgICAgICAgICAgIHllYXJseUludGVyZXN0ICs9IGludGVyZXN0UGF5bWVudDtcbiAgICAgICAgICAgICAgICB5ZWFybHlQcmluY2lwYWwgKz0gcHJpbmNpcGFsUGF5bWVudDtcbiAgICAgICAgICAgICAgICBiYWxhbmNlIC09IHByaW5jaXBhbFBheW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjaGVkdWxlLnB1c2goe1xuICAgICAgICAgICAgICAgIHllYXIsXG4gICAgICAgICAgICAgICAgcHJpbmNpcGFsOiB5ZWFybHlQcmluY2lwYWwsXG4gICAgICAgICAgICAgICAgaW50ZXJlc3Q6IHllYXJseUludGVyZXN0LFxuICAgICAgICAgICAgICAgIGJhbGFuY2U6IE1hdGgubWF4KDAsIGJhbGFuY2UpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChiYWxhbmNlIDw9IDApIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlUGF5bWVudChwcmluY2lwYWw6IG51bWJlciwgcmF0ZTogbnVtYmVyLCBwZXJpb2RzOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAocmF0ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHByaW5jaXBhbCAvIHBlcmlvZHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJpbmNpcGFsICpcbiAgICAgICAgICAgIChyYXRlICogTWF0aC5wb3coMSArIHJhdGUsIHBlcmlvZHMpKSAvXG4gICAgICAgICAgICAoTWF0aC5wb3coMSArIHJhdGUsIHBlcmlvZHMpIC0gMSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9ydGdhZ2UvYXVzdHJhbGlhL2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3RoZXJGZWVzIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlUnVsZXMge1xuICAgIGxvYW5Db25zdHJhaW50czogTG9hbkNvbnN0cmFpbnRzO1xuICAgIGxlbmRlcnNNb3J0Z2FnZUluc3VyYW5jZTogTGVuZGVyc01vcnRnYWdlSW5zdXJhbmNlUnVsZXM7XG4gICAgaW50ZXJlc3Q6IEludGVyZXN0UnVsZXM7XG4gICAgc3RhbXBEdXR5OiBTdGFtcER1dHlSdWxlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FuQ29uc3RyYWludHMge1xuICAgIG1heEx2cjogbnVtYmVyO1xuICAgIG1heEFtb3J0aXphdGlvblllYXJzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGVuZGVyc01vcnRnYWdlSW5zdXJhbmNlUmF0ZSB7XG4gICAgbWF4THZyOiBudW1iZXI7XG4gICAgcmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExlbmRlcnNNb3J0Z2FnZUluc3VyYW5jZVJ1bGVzIHtcbiAgICByZXF1aXJlZEFib3ZlTHZyOiBudW1iZXI7XG4gICAgcHJlbWl1bVJhdGVzOiBMZW5kZXJzTW9ydGdhZ2VJbnN1cmFuY2VSYXRlW107XG4gICAgcHJlbWl1bUFkZGVkVG9Mb2FuOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZXN0UnVsZXMge1xuICAgIGNvbXBvdW5kaW5nOiAnTU9OVEhMWSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbXBEdXR5QnJhY2tldCB7XG4gICAgdXBUbz86IG51bWJlcjtcbiAgICBhYm92ZT86IG51bWJlcjtcbiAgICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbXBEdXR5UnVsZXMge1xuICAgIGJyYWNrZXRzOiBTdGFtcER1dHlCcmFja2V0W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtIHtcbiAgICB5ZWFyOiBudW1iZXI7XG4gICAgcHJpbmNpcGFsOiBudW1iZXI7XG4gICAgaW50ZXJlc3Q6IG51bWJlcjtcbiAgICBiYWxhbmNlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnB1dCB7XG4gICAgcHJvcGVydHlQcmljZTogbnVtYmVyO1xuICAgIGRvd25QYXltZW50OiBudW1iZXI7XG4gICAgYW5udWFsSW50ZXJlc3RSYXRlOiBudW1iZXI7XG4gICAgYW1vcnRpemF0aW9uWWVhcnM6IG51bWJlcjtcbiAgICBwYXltZW50RnJlcXVlbmN5OiAnTU9OVEhMWScgfCAnRk9SVE5JR0hUTFknIHwgJ1dFRUtMWSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VPdXRwdXQge1xuICAgIGxvYW5BbW91bnQ6IG51bWJlcjtcbiAgICBsbWlQcmVtaXVtOiBudW1iZXI7XG4gICAgdG90YWxNb3J0Z2FnZTogbnVtYmVyO1xuICAgIG1vbnRobHlQYXltZW50OiBudW1iZXI7XG4gICAgdG90YWxJbnRlcmVzdFBhaWQ6IG51bWJlcjtcbiAgICB0b3RhbFBhaWQ6IG51bWJlcjtcbiAgICBzdGFtcER1dHk6IG51bWJlcjtcbiAgICBhbW9ydGl6YXRpb25TY2hlZHVsZTogQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtW107XG4gICAgb3RoZXJGZWVzOiBPdGhlckZlZXM7XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import { Input, Result, Rules } from "./domain/types";
2
+ export interface AustraliaCorporateTaxService {
3
+ calculate(input: Input, rules: Rules): Result;
4
+ }
@@ -0,0 +1,9 @@
1
+ import { AustraliaCorporateTaxService } from "./AustraliaCorporateTaxService";
2
+ import { Input, Result, Rules } from "./domain/types";
3
+ export declare class AustraliaCorporateTaxServiceImpl implements AustraliaCorporateTaxService {
4
+ private _input;
5
+ private _rules;
6
+ constructor(input: Input, rules: Rules);
7
+ calculate(): Result;
8
+ private calculateProgressiveTax;
9
+ }
@@ -0,0 +1,34 @@
1
+ import { Breakdown } from "../../domain/types";
2
+ export interface FlatTaxRule {
3
+ type: 'flat';
4
+ rate: number;
5
+ conditions?: {
6
+ maxTurnover?: number;
7
+ };
8
+ }
9
+ export interface ProgressiveTaxBracket {
10
+ from: number;
11
+ to: number | null;
12
+ rate: number;
13
+ }
14
+ export interface ProgressiveTaxRule {
15
+ type: 'progressive';
16
+ brackets: ProgressiveTaxBracket[];
17
+ conditions?: {
18
+ maxTurnover?: number;
19
+ };
20
+ }
21
+ export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
22
+ export interface Rules {
23
+ regimes: Record<string, TaxRule>;
24
+ }
25
+ export interface Input {
26
+ taxableIncome: number;
27
+ annualTurnover: number;
28
+ isSmallBusiness: boolean;
29
+ }
30
+ export interface Result {
31
+ corporateTax: number;
32
+ effectiveTaxRate: number;
33
+ breakdowns: Breakdown[];
34
+ }
@@ -0,0 +1,4 @@
1
+ import { ComputedIncomeTaxValues, IncomeTaxRules } from "./domain/types";
2
+ export interface AustraliaIncomeTaxService {
3
+ calculateNetIncome(income: number, rules: IncomeTaxRules, isResident?: boolean): ComputedIncomeTaxValues;
4
+ }
@@ -0,0 +1,13 @@
1
+ import { AustraliaIncomeTaxService } from "./AustraliaIncomeTaxService";
2
+ import { ComputedIncomeTaxValues, IncomeTaxRules } from "./domain/types";
3
+ export declare class AustraliaIncomeTaxServiceImpl implements AustraliaIncomeTaxService {
4
+ private _income;
5
+ private _rules;
6
+ private _isResident;
7
+ constructor(income: number, rules: IncomeTaxRules, isResident?: boolean);
8
+ calculateNetIncome(): ComputedIncomeTaxValues;
9
+ private computeTaxBracketBreakdown;
10
+ private computeLowIncomeTaxOffset;
11
+ private computeMedicareLevy;
12
+ private round;
13
+ }
@@ -0,0 +1,36 @@
1
+ import { BracketAllocation, TaxBracket } from "../../domain/types";
2
+ export interface IncomeTaxRules {
3
+ taxBrackets: TaxBracket[];
4
+ nonResidentTaxBrackets: TaxBracket[];
5
+ medicareLevy: MedicareLevyRules;
6
+ lowIncomeTaxOffset: LowIncomeTaxOffset;
7
+ lowAndMiddleIncomeTaxOffset?: LowAndMiddleIncomeTaxOffset;
8
+ }
9
+ export interface MedicareLevyRules {
10
+ rate: number;
11
+ shadingInThreshold: number;
12
+ fullLevyThreshold: number;
13
+ reductionRate: number;
14
+ }
15
+ export interface LowIncomeTaxOffset {
16
+ maxOffset: number;
17
+ phaseOutStart: number;
18
+ phaseOutEnd: number;
19
+ phaseOutRate: number;
20
+ }
21
+ export interface LowAndMiddleIncomeTaxOffset {
22
+ maxOffset: number;
23
+ phaseOutStart: number;
24
+ phaseOutEnd: number;
25
+ phaseOutRate: number;
26
+ }
27
+ export interface ComputedIncomeTaxValues {
28
+ grossIncome: number;
29
+ incomeTax: number;
30
+ medicareLevy: number;
31
+ lowIncomeTaxOffset: number;
32
+ totalDeductions: number;
33
+ netIncome: number;
34
+ effectiveTaxRate: number;
35
+ taxBracketBreakdown: BracketAllocation[];
36
+ }
@@ -17,5 +17,11 @@ export { ComputedIncomeTaxValues as SouthAfricaComputedIncomeTaxValues, IncomeTa
17
17
  export { MortgageRules as SouthAfricaMortgageRules, MortgageInput as SouthAfricaMortgageInput, MortgageOutput as SouthAfricaMortgageOutput, } from './mortgage/south-africa/domain/types';
18
18
  export { SouthAfricaCorporateTaxServiceImpl as SouthAfricaCorporateTaxService } from './corporate/south-africa/SouthAfricaCorporateTaxServiceImpl';
19
19
  export { Rules as SouthAfricaCorporateTaxRules, Input as SouthAfricaCorporateTaxInput, Result as SouthAfricaCorporateTaxResult, } from './corporate/south-africa/domain/types';
20
+ export { AustraliaIncomeTaxServiceImpl as AustraliaIncomeTaxService } from './income-tax/australia/AustraliaIncomeTaxServiceImpl';
21
+ export { ComputedIncomeTaxValues as AustraliaComputedIncomeTaxValues, IncomeTaxRules as AustraliaIncomeTaxRules, } from './income-tax/australia/domain/types';
22
+ export { AustraliaMortgageServiceImpl as AustraliaMortgageService } from './mortgage/australia/AustraliaMortgageServiceImpl';
23
+ export { MortgageRules as AustraliaMortgageRules, MortgageInput as AustraliaMortgageInput, MortgageOutput as AustraliaMortgageOutput, } from './mortgage/australia/domain/types';
24
+ export { AustraliaCorporateTaxServiceImpl as AustraliaCorporateTaxService } from './corporate/australia/AustraliaCorporateTaxServiceImpl';
25
+ export { Input as AustraliaCorporateTaxInput, Rules as AustraliaCorporateTaxRules, Result as AustraliaCorporateTaxResult, } from './corporate/australia/domain/types';
20
26
  export { IncomeTaxCalculatorSchema } from './income-tax/domain/types';
21
27
  export * from './income-tax/domain/types';
@@ -0,0 +1,4 @@
1
+ import { MortgageInput, MortgageOutput, MortgageRules } from "./domain/types";
2
+ export interface AustraliaMortgageService {
3
+ calculate(input: MortgageInput, rules: MortgageRules): MortgageOutput;
4
+ }
@@ -0,0 +1,9 @@
1
+ import { AustraliaMortgageService } from "./AustraliaMortgageService";
2
+ import { MortgageInput, MortgageOutput, MortgageRules } from "./domain/types";
3
+ export declare class AustraliaMortgageServiceImpl implements AustraliaMortgageService {
4
+ calculate(input: MortgageInput, rules: MortgageRules): MortgageOutput;
5
+ private computeLmi;
6
+ private calculateStampDuty;
7
+ private calculateAmortizationSchedule;
8
+ private calculatePayment;
9
+ }
@@ -0,0 +1,55 @@
1
+ import { OtherFees } from "../../domain/types";
2
+ export interface MortgageRules {
3
+ loanConstraints: LoanConstraints;
4
+ lendersMortgageInsurance: LendersMortgageInsuranceRules;
5
+ interest: InterestRules;
6
+ stampDuty: StampDutyRules;
7
+ }
8
+ export interface LoanConstraints {
9
+ maxLvr: number;
10
+ maxAmortizationYears: number;
11
+ }
12
+ export interface LendersMortgageInsuranceRate {
13
+ maxLvr: number;
14
+ rate: number;
15
+ }
16
+ export interface LendersMortgageInsuranceRules {
17
+ requiredAboveLvr: number;
18
+ premiumRates: LendersMortgageInsuranceRate[];
19
+ premiumAddedToLoan: boolean;
20
+ }
21
+ export interface InterestRules {
22
+ compounding: 'MONTHLY';
23
+ }
24
+ export interface StampDutyBracket {
25
+ upTo?: number;
26
+ above?: number;
27
+ rate: number;
28
+ }
29
+ export interface StampDutyRules {
30
+ brackets: StampDutyBracket[];
31
+ }
32
+ export interface AmortizationScheduleItem {
33
+ year: number;
34
+ principal: number;
35
+ interest: number;
36
+ balance: number;
37
+ }
38
+ export interface MortgageInput {
39
+ propertyPrice: number;
40
+ downPayment: number;
41
+ annualInterestRate: number;
42
+ amortizationYears: number;
43
+ paymentFrequency: 'MONTHLY' | 'FORTNIGHTLY' | 'WEEKLY';
44
+ }
45
+ export interface MortgageOutput {
46
+ loanAmount: number;
47
+ lmiPremium: number;
48
+ totalMortgage: number;
49
+ monthlyPayment: number;
50
+ totalInterestPaid: number;
51
+ totalPaid: number;
52
+ stampDuty: number;
53
+ amortizationSchedule: AmortizationScheduleItem[];
54
+ otherFees: OtherFees;
55
+ }