@novha/calc-engines 2.0.3 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/corporate/germany/GermanyCorporateTaxService.js +3 -0
  2. package/dist/corporate/germany/GermanyCorporateTaxServiceImpl.js +56 -0
  3. package/dist/corporate/germany/domain/types.js +3 -0
  4. package/dist/corporate/uk/UKCorporateTaxService.js +3 -0
  5. package/dist/corporate/uk/UKCorporateTaxServiceImpl.js +70 -0
  6. package/dist/corporate/uk/domain/types.js +3 -0
  7. package/dist/corporate/usa/USACorporateTaxService.js +3 -0
  8. package/dist/corporate/usa/USACorporateTaxServiceImpl.js +29 -0
  9. package/dist/corporate/usa/domain/types.js +3 -0
  10. package/dist/income-tax/germany/GermanyIncomeTaxService.js +3 -0
  11. package/dist/income-tax/germany/GermanyIncomeTaxServiceImpl.js +86 -0
  12. package/dist/income-tax/germany/domain/types.js +3 -0
  13. package/dist/income-tax/uk/UKIncomeTaxService.js +3 -0
  14. package/dist/income-tax/uk/UKIncomeTaxServiceImpl.js +96 -0
  15. package/dist/income-tax/uk/domain/types.js +3 -0
  16. package/dist/income-tax/usa/USAIncomeTaxService.js +3 -0
  17. package/dist/income-tax/usa/USAIncomeTaxServiceImpl.js +87 -0
  18. package/dist/income-tax/usa/domain/types.js +3 -0
  19. package/dist/index.js +23 -2
  20. package/dist/mortgage/germany/GermanyMortgageService.js +3 -0
  21. package/dist/mortgage/germany/GermanyMortgageServiceImpl.js +80 -0
  22. package/dist/mortgage/germany/domain/types.js +3 -0
  23. package/dist/mortgage/uk/UKMortgageService.js +3 -0
  24. package/dist/mortgage/uk/UKMortgageServiceImpl.js +99 -0
  25. package/dist/mortgage/uk/domain/types.js +3 -0
  26. package/dist/mortgage/usa/USAMortgageService.js +3 -0
  27. package/dist/mortgage/usa/USAMortgageServiceImpl.js +92 -0
  28. package/dist/mortgage/usa/domain/types.js +3 -0
  29. package/dist/types/corporate/germany/GermanyCorporateTaxService.d.ts +4 -0
  30. package/dist/types/corporate/germany/GermanyCorporateTaxServiceImpl.d.ts +8 -0
  31. package/dist/types/corporate/germany/domain/types.d.ts +24 -0
  32. package/dist/types/corporate/uk/UKCorporateTaxService.d.ts +4 -0
  33. package/dist/types/corporate/uk/UKCorporateTaxServiceImpl.d.ts +10 -0
  34. package/dist/types/corporate/uk/domain/types.d.ts +32 -0
  35. package/dist/types/corporate/usa/USACorporateTaxService.d.ts +4 -0
  36. package/dist/types/corporate/usa/USACorporateTaxServiceImpl.d.ts +8 -0
  37. package/dist/types/corporate/usa/domain/types.d.ts +15 -0
  38. package/dist/types/income-tax/germany/GermanyIncomeTaxService.d.ts +4 -0
  39. package/dist/types/income-tax/germany/GermanyIncomeTaxServiceImpl.d.ts +12 -0
  40. package/dist/types/income-tax/germany/domain/types.d.ts +23 -0
  41. package/dist/types/income-tax/uk/UKIncomeTaxService.d.ts +4 -0
  42. package/dist/types/income-tax/uk/UKIncomeTaxServiceImpl.d.ts +12 -0
  43. package/dist/types/income-tax/uk/domain/types.d.ts +27 -0
  44. package/dist/types/income-tax/usa/USAIncomeTaxService.d.ts +4 -0
  45. package/dist/types/income-tax/usa/USAIncomeTaxServiceImpl.d.ts +11 -0
  46. package/dist/types/income-tax/usa/domain/types.d.ts +30 -0
  47. package/dist/types/index.d.ts +18 -0
  48. package/dist/types/mortgage/germany/GermanyMortgageService.d.ts +4 -0
  49. package/dist/types/mortgage/germany/GermanyMortgageServiceImpl.d.ts +7 -0
  50. package/dist/types/mortgage/germany/domain/types.d.ts +42 -0
  51. package/dist/types/mortgage/uk/UKMortgageService.d.ts +4 -0
  52. package/dist/types/mortgage/uk/UKMortgageServiceImpl.d.ts +9 -0
  53. package/dist/types/mortgage/uk/domain/types.d.ts +49 -0
  54. package/dist/types/mortgage/usa/USAMortgageService.d.ts +4 -0
  55. package/dist/types/mortgage/usa/USAMortgageServiceImpl.d.ts +8 -0
  56. package/dist/types/mortgage/usa/domain/types.d.ts +44 -0
  57. package/package.json +1 -1
  58. package/src/corporate/germany/GermanyCorporateTaxService.ts +5 -0
  59. package/src/corporate/germany/GermanyCorporateTaxServiceImpl.ts +64 -0
  60. package/src/corporate/germany/domain/types.ts +20 -0
  61. package/src/corporate/uk/UKCorporateTaxService.ts +5 -0
  62. package/src/corporate/uk/UKCorporateTaxServiceImpl.ts +82 -0
  63. package/src/corporate/uk/domain/types.ts +38 -0
  64. package/src/corporate/usa/USACorporateTaxService.ts +5 -0
  65. package/src/corporate/usa/USACorporateTaxServiceImpl.ts +35 -0
  66. package/src/corporate/usa/domain/types.ts +15 -0
  67. package/src/income-tax/germany/GermanyIncomeTaxService.ts +5 -0
  68. package/src/income-tax/germany/GermanyIncomeTaxServiceImpl.ts +121 -0
  69. package/src/income-tax/germany/domain/types.ts +27 -0
  70. package/src/income-tax/uk/UKIncomeTaxService.ts +5 -0
  71. package/src/income-tax/uk/UKIncomeTaxServiceImpl.ts +133 -0
  72. package/src/income-tax/uk/domain/types.ts +31 -0
  73. package/src/income-tax/usa/USAIncomeTaxService.ts +5 -0
  74. package/src/income-tax/usa/USAIncomeTaxServiceImpl.ts +113 -0
  75. package/src/income-tax/usa/domain/types.ts +24 -0
  76. package/src/index.ts +63 -0
  77. package/src/mortgage/germany/GermanyMortgageService.ts +5 -0
  78. package/src/mortgage/germany/GermanyMortgageServiceImpl.ts +111 -0
  79. package/src/mortgage/germany/domain/types.ts +49 -0
  80. package/src/mortgage/uk/UKMortgageService.ts +5 -0
  81. package/src/mortgage/uk/UKMortgageServiceImpl.ts +140 -0
  82. package/src/mortgage/uk/domain/types.ts +58 -0
  83. package/src/mortgage/usa/USAMortgageService.ts +5 -0
  84. package/src/mortgage/usa/USAMortgageServiceImpl.ts +134 -0
  85. package/src/mortgage/usa/domain/types.ts +52 -0
  86. package/test/australia-income-tax.test.ts +10 -10
  87. package/test/germany-corporate-tax.test.ts +77 -0
  88. package/test/germany-income-tax.test.ts +114 -0
  89. package/test/germany-mortgage.test.ts +105 -0
  90. package/test/uk-corporate-tax.test.ts +119 -0
  91. package/test/uk-income-tax.test.ts +146 -0
  92. package/test/uk-mortgage.test.ts +154 -0
  93. package/test/usa-corporate-tax.test.ts +59 -0
  94. package/test/usa-income-tax.test.ts +138 -0
  95. package/test/usa-mortgage.test.ts +97 -0
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VybWFueUNvcnBvcmF0ZVRheFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29ycG9yYXRlL2dlcm1hbnkvR2VybWFueUNvcnBvcmF0ZVRheFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc3VsdCB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdlcm1hbnlDb3Jwb3JhdGVUYXhTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0O1xufVxuIl19
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GermanyCorporateTaxServiceImpl = void 0;
4
+ class GermanyCorporateTaxServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const income = this._input.taxableIncome;
11
+ if (income <= 0) {
12
+ return {
13
+ corporateTax: 0,
14
+ solidaritySurcharge: 0,
15
+ tradeTax: 0,
16
+ totalTax: 0,
17
+ effectiveTaxRate: 0,
18
+ breakdowns: [],
19
+ };
20
+ }
21
+ const corporateTax = income * this._rules.corporateIncomeTax.rate;
22
+ const solidaritySurcharge = corporateTax * this._rules.solidaritySurcharge.rate;
23
+ const tradeTax = income * this._rules.tradeTax.multiplier * this._rules.tradeTax.assessmentRate;
24
+ const totalTax = corporateTax + solidaritySurcharge + tradeTax;
25
+ const breakdowns = [
26
+ {
27
+ from: '0',
28
+ to: 'All',
29
+ rate: this._rules.corporateIncomeTax.rate,
30
+ amount: corporateTax,
31
+ },
32
+ {
33
+ from: 'Corp Tax',
34
+ to: 'Solidarity',
35
+ rate: this._rules.solidaritySurcharge.rate,
36
+ amount: solidaritySurcharge,
37
+ },
38
+ {
39
+ from: '0',
40
+ to: 'Trade',
41
+ rate: this._rules.tradeTax.multiplier * this._rules.tradeTax.assessmentRate,
42
+ amount: tradeTax,
43
+ },
44
+ ];
45
+ return {
46
+ corporateTax,
47
+ solidaritySurcharge,
48
+ tradeTax,
49
+ totalTax,
50
+ effectiveTaxRate: (totalTax / income) * 100,
51
+ breakdowns,
52
+ };
53
+ }
54
+ }
55
+ exports.GermanyCorporateTaxServiceImpl = GermanyCorporateTaxServiceImpl;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VybWFueUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcnBvcmF0ZS9nZXJtYW55L0dlcm1hbnlDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFhLDhCQUE4QjtJQUl2QyxZQUFZLEtBQVksRUFBRSxLQUFZO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFFekMsSUFBSSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDZCxPQUFPO2dCQUNILFlBQVksRUFBRSxDQUFDO2dCQUNmLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3RCLFFBQVEsRUFBRSxDQUFDO2dCQUNYLFFBQVEsRUFBRSxDQUFDO2dCQUNYLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25CLFVBQVUsRUFBRSxFQUFFO2FBQ2pCLENBQUM7UUFDTixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1FBQ2xFLE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1FBQ2hGLE1BQU0sUUFBUSxHQUNWLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQ25GLE1BQU0sUUFBUSxHQUFHLFlBQVksR0FBRyxtQkFBbUIsR0FBRyxRQUFRLENBQUM7UUFFL0QsTUFBTSxVQUFVLEdBQWdCO1lBQzVCO2dCQUNJLElBQUksRUFBRSxHQUFHO2dCQUNULEVBQUUsRUFBRSxLQUFLO2dCQUNULElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUk7Z0JBQ3pDLE1BQU0sRUFBRSxZQUFZO2FBQ3ZCO1lBQ0Q7Z0JBQ0ksSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLEVBQUUsRUFBRSxZQUFZO2dCQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO2dCQUMxQyxNQUFNLEVBQUUsbUJBQW1CO2FBQzlCO1lBQ0Q7Z0JBQ0ksSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsRUFBRSxFQUFFLE9BQU87Z0JBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjO2dCQUMzRSxNQUFNLEVBQUUsUUFBUTthQUNuQjtTQUNKLENBQUM7UUFFRixPQUFPO1lBQ0gsWUFBWTtZQUNaLG1CQUFtQjtZQUNuQixRQUFRO1lBQ1IsUUFBUTtZQUNSLGdCQUFnQixFQUFFLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUc7WUFDM0MsVUFBVTtTQUNiLENBQUM7SUFDTixDQUFDO0NBQ0o7QUEzREQsd0VBMkRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJlYWtkb3duIH0gZnJvbSBcIi4uL2RvbWFpbi90eXBlc1wiO1xuaW1wb3J0IHsgR2VybWFueUNvcnBvcmF0ZVRheFNlcnZpY2UgfSBmcm9tIFwiLi9HZXJtYW55Q29ycG9yYXRlVGF4U2VydmljZVwiO1xuaW1wb3J0IHsgSW5wdXQsIFJlc3VsdCwgUnVsZXMgfSBmcm9tIFwiLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIEdlcm1hbnlDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEdlcm1hbnlDb3Jwb3JhdGVUYXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9pbnB1dDogSW5wdXQ7XG4gICAgcHJpdmF0ZSBfcnVsZXM6IFJ1bGVzO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IElucHV0LCBydWxlczogUnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0IHtcbiAgICAgICAgY29uc3QgaW5jb21lID0gdGhpcy5faW5wdXQudGF4YWJsZUluY29tZTtcblxuICAgICAgICBpZiAoaW5jb21lIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29ycG9yYXRlVGF4OiAwLFxuICAgICAgICAgICAgICAgIHNvbGlkYXJpdHlTdXJjaGFyZ2U6IDAsXG4gICAgICAgICAgICAgICAgdHJhZGVUYXg6IDAsXG4gICAgICAgICAgICAgICAgdG90YWxUYXg6IDAsXG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlVGF4UmF0ZTogMCxcbiAgICAgICAgICAgICAgICBicmVha2Rvd25zOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3Jwb3JhdGVUYXggPSBpbmNvbWUgKiB0aGlzLl9ydWxlcy5jb3Jwb3JhdGVJbmNvbWVUYXgucmF0ZTtcbiAgICAgICAgY29uc3Qgc29saWRhcml0eVN1cmNoYXJnZSA9IGNvcnBvcmF0ZVRheCAqIHRoaXMuX3J1bGVzLnNvbGlkYXJpdHlTdXJjaGFyZ2UucmF0ZTtcbiAgICAgICAgY29uc3QgdHJhZGVUYXggPVxuICAgICAgICAgICAgaW5jb21lICogdGhpcy5fcnVsZXMudHJhZGVUYXgubXVsdGlwbGllciAqIHRoaXMuX3J1bGVzLnRyYWRlVGF4LmFzc2Vzc21lbnRSYXRlO1xuICAgICAgICBjb25zdCB0b3RhbFRheCA9IGNvcnBvcmF0ZVRheCArIHNvbGlkYXJpdHlTdXJjaGFyZ2UgKyB0cmFkZVRheDtcblxuICAgICAgICBjb25zdCBicmVha2Rvd25zOiBCcmVha2Rvd25bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmcm9tOiAnMCcsXG4gICAgICAgICAgICAgICAgdG86ICdBbGwnLFxuICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMuX3J1bGVzLmNvcnBvcmF0ZUluY29tZVRheC5yYXRlLFxuICAgICAgICAgICAgICAgIGFtb3VudDogY29ycG9yYXRlVGF4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmcm9tOiAnQ29ycCBUYXgnLFxuICAgICAgICAgICAgICAgIHRvOiAnU29saWRhcml0eScsXG4gICAgICAgICAgICAgICAgcmF0ZTogdGhpcy5fcnVsZXMuc29saWRhcml0eVN1cmNoYXJnZS5yYXRlLFxuICAgICAgICAgICAgICAgIGFtb3VudDogc29saWRhcml0eVN1cmNoYXJnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZnJvbTogJzAnLFxuICAgICAgICAgICAgICAgIHRvOiAnVHJhZGUnLFxuICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMuX3J1bGVzLnRyYWRlVGF4Lm11bHRpcGxpZXIgKiB0aGlzLl9ydWxlcy50cmFkZVRheC5hc3Nlc3NtZW50UmF0ZSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IHRyYWRlVGF4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29ycG9yYXRlVGF4LFxuICAgICAgICAgICAgc29saWRhcml0eVN1cmNoYXJnZSxcbiAgICAgICAgICAgIHRyYWRlVGF4LFxuICAgICAgICAgICAgdG90YWxUYXgsXG4gICAgICAgICAgICBlZmZlY3RpdmVUYXhSYXRlOiAodG90YWxUYXggLyBpbmNvbWUpICogMTAwLFxuICAgICAgICAgICAgYnJlYWtkb3ducyxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL2dlcm1hbnkvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha2Rvd24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICAgIGNvcnBvcmF0ZUluY29tZVRheDogeyByYXRlOiBudW1iZXIgfTtcbiAgICBzb2xpZGFyaXR5U3VyY2hhcmdlOiB7IHJhdGU6IG51bWJlciB9O1xuICAgIHRyYWRlVGF4OiB7IG11bHRpcGxpZXI6IG51bWJlcjsgYXNzZXNzbWVudFJhdGU6IG51bWJlciB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElucHV0IHtcbiAgICB0YXhhYmxlSW5jb21lOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdWx0IHtcbiAgICBjb3Jwb3JhdGVUYXg6IG51bWJlcjtcbiAgICBzb2xpZGFyaXR5U3VyY2hhcmdlOiBudW1iZXI7XG4gICAgdHJhZGVUYXg6IG51bWJlcjtcbiAgICB0b3RhbFRheDogbnVtYmVyO1xuICAgIGVmZmVjdGl2ZVRheFJhdGU6IG51bWJlcjtcbiAgICBicmVha2Rvd25zOiBCcmVha2Rvd25bXTtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVUtDb3Jwb3JhdGVUYXhTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcnBvcmF0ZS91ay9VS0NvcnBvcmF0ZVRheFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc3VsdCB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVLQ29ycG9yYXRlVGF4U2VydmljZSB7XG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UKCorporateTaxServiceImpl = void 0;
4
+ class UKCorporateTaxServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const income = this._input.taxableIncome;
11
+ const { smallProfits, main, marginalRelief } = this._rules.regimes;
12
+ let tax = 0;
13
+ let breakdowns = [];
14
+ if (income <= 0) {
15
+ return { corporateTax: 0, effectiveTaxRate: 0, breakdowns: [] };
16
+ }
17
+ if (income <= marginalRelief.lowerLimit) {
18
+ tax = income * smallProfits.rate;
19
+ breakdowns = [{
20
+ from: '0',
21
+ to: `${marginalRelief.lowerLimit}`,
22
+ rate: smallProfits.rate,
23
+ amount: tax,
24
+ }];
25
+ }
26
+ else if (income >= marginalRelief.upperLimit) {
27
+ tax = income * main.rate;
28
+ breakdowns = [{
29
+ from: '0',
30
+ to: 'Above',
31
+ rate: main.rate,
32
+ amount: tax,
33
+ }];
34
+ }
35
+ else {
36
+ tax = this.applyMarginalRelief(income, marginalRelief);
37
+ breakdowns = this.buildMarginalReliefBreakdowns(income, tax, marginalRelief);
38
+ }
39
+ return {
40
+ corporateTax: tax,
41
+ effectiveTaxRate: income > 0 ? (tax / income) * 100 : 0,
42
+ breakdowns,
43
+ };
44
+ }
45
+ applyMarginalRelief(income, rules) {
46
+ const grossTax = income * rules.mainRate;
47
+ const relief = rules.standardFraction * (rules.upperLimit - income);
48
+ return grossTax - relief;
49
+ }
50
+ buildMarginalReliefBreakdowns(income, tax, rules) {
51
+ const grossTax = income * rules.mainRate;
52
+ const relief = rules.standardFraction * (rules.upperLimit - income);
53
+ return [
54
+ {
55
+ from: '0',
56
+ to: 'Above',
57
+ rate: rules.mainRate,
58
+ amount: grossTax,
59
+ },
60
+ {
61
+ from: `${rules.lowerLimit}`,
62
+ to: `${rules.upperLimit}`,
63
+ rate: -(rules.standardFraction),
64
+ amount: -relief,
65
+ },
66
+ ];
67
+ }
68
+ }
69
+ exports.UKCorporateTaxServiceImpl = UKCorporateTaxServiceImpl;
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVUtDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3Jwb3JhdGUvdWsvVUtDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFhLHlCQUF5QjtJQUlsQyxZQUFZLEtBQVksRUFBRSxLQUFZO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDekMsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFFbkUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osSUFBSSxVQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUVqQyxJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNkLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDcEUsQ0FBQztRQUVELElBQUksTUFBTSxJQUFJLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN0QyxHQUFHLEdBQUcsTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDakMsVUFBVSxHQUFHLENBQUM7b0JBQ1YsSUFBSSxFQUFFLEdBQUc7b0JBQ1QsRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLFVBQVUsRUFBRTtvQkFDbEMsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO29CQUN2QixNQUFNLEVBQUUsR0FBRztpQkFDZCxDQUFDLENBQUM7UUFDUCxDQUFDO2FBQU0sSUFBSSxNQUFNLElBQUksY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdDLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN6QixVQUFVLEdBQUcsQ0FBQztvQkFDVixJQUFJLEVBQUUsR0FBRztvQkFDVCxFQUFFLEVBQUUsT0FBTztvQkFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsTUFBTSxFQUFFLEdBQUc7aUJBQ2QsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztZQUN2RCxVQUFVLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUVELE9BQU87WUFDSCxZQUFZLEVBQUUsR0FBRztZQUNqQixnQkFBZ0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsVUFBVTtTQUNiLENBQUM7SUFDTixDQUFDO0lBRU8sbUJBQW1CLENBQUMsTUFBYyxFQUFFLEtBQXlCO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDcEUsT0FBTyxRQUFRLEdBQUcsTUFBTSxDQUFDO0lBQzdCLENBQUM7SUFFTyw2QkFBNkIsQ0FDakMsTUFBYyxFQUNkLEdBQVcsRUFDWCxLQUF5QjtRQUV6QixNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRXBFLE9BQU87WUFDSDtnQkFDSSxJQUFJLEVBQUUsR0FBRztnQkFDVCxFQUFFLEVBQUUsT0FBTztnQkFDWCxJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3BCLE1BQU0sRUFBRSxRQUFRO2FBQ25CO1lBQ0Q7Z0JBQ0ksSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDM0IsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDekIsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLE1BQU0sRUFBRSxDQUFDLE1BQU07YUFDbEI7U0FDSixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBN0VELDhEQTZFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyZWFrZG93biB9IGZyb20gXCIuLi9kb21haW4vdHlwZXNcIjtcbmltcG9ydCB7IFVLQ29ycG9yYXRlVGF4U2VydmljZSB9IGZyb20gXCIuL1VLQ29ycG9yYXRlVGF4U2VydmljZVwiO1xuaW1wb3J0IHsgSW5wdXQsIE1hcmdpbmFsUmVsaWVmUnVsZSwgUmVzdWx0LCBSdWxlcyB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgVUtDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIFVLQ29ycG9yYXRlVGF4U2VydmljZSB7XG4gICAgcHJpdmF0ZSBfaW5wdXQ6IElucHV0O1xuICAgIHByaXZhdGUgX3J1bGVzOiBSdWxlcztcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0OiBJbnB1dCwgcnVsZXM6IFJ1bGVzKSB7XG4gICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuX3J1bGVzID0gcnVsZXM7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGluY29tZSA9IHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWU7XG4gICAgICAgIGNvbnN0IHsgc21hbGxQcm9maXRzLCBtYWluLCBtYXJnaW5hbFJlbGllZiB9ID0gdGhpcy5fcnVsZXMucmVnaW1lcztcblxuICAgICAgICBsZXQgdGF4ID0gMDtcbiAgICAgICAgbGV0IGJyZWFrZG93bnM6IEJyZWFrZG93bltdID0gW107XG5cbiAgICAgICAgaWYgKGluY29tZSA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBjb3Jwb3JhdGVUYXg6IDAsIGVmZmVjdGl2ZVRheFJhdGU6IDAsIGJyZWFrZG93bnM6IFtdIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5jb21lIDw9IG1hcmdpbmFsUmVsaWVmLmxvd2VyTGltaXQpIHtcbiAgICAgICAgICAgIHRheCA9IGluY29tZSAqIHNtYWxsUHJvZml0cy5yYXRlO1xuICAgICAgICAgICAgYnJlYWtkb3ducyA9IFt7XG4gICAgICAgICAgICAgICAgZnJvbTogJzAnLFxuICAgICAgICAgICAgICAgIHRvOiBgJHttYXJnaW5hbFJlbGllZi5sb3dlckxpbWl0fWAsXG4gICAgICAgICAgICAgICAgcmF0ZTogc21hbGxQcm9maXRzLnJhdGUsXG4gICAgICAgICAgICAgICAgYW1vdW50OiB0YXgsXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfSBlbHNlIGlmIChpbmNvbWUgPj0gbWFyZ2luYWxSZWxpZWYudXBwZXJMaW1pdCkge1xuICAgICAgICAgICAgdGF4ID0gaW5jb21lICogbWFpbi5yYXRlO1xuICAgICAgICAgICAgYnJlYWtkb3ducyA9IFt7XG4gICAgICAgICAgICAgICAgZnJvbTogJzAnLFxuICAgICAgICAgICAgICAgIHRvOiAnQWJvdmUnLFxuICAgICAgICAgICAgICAgIHJhdGU6IG1haW4ucmF0ZSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IHRheCxcbiAgICAgICAgICAgIH1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGF4ID0gdGhpcy5hcHBseU1hcmdpbmFsUmVsaWVmKGluY29tZSwgbWFyZ2luYWxSZWxpZWYpO1xuICAgICAgICAgICAgYnJlYWtkb3ducyA9IHRoaXMuYnVpbGRNYXJnaW5hbFJlbGllZkJyZWFrZG93bnMoaW5jb21lLCB0YXgsIG1hcmdpbmFsUmVsaWVmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb3Jwb3JhdGVUYXg6IHRheCxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVRheFJhdGU6IGluY29tZSA+IDAgPyAodGF4IC8gaW5jb21lKSAqIDEwMCA6IDAsXG4gICAgICAgICAgICBicmVha2Rvd25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlNYXJnaW5hbFJlbGllZihpbmNvbWU6IG51bWJlciwgcnVsZXM6IE1hcmdpbmFsUmVsaWVmUnVsZSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGdyb3NzVGF4ID0gaW5jb21lICogcnVsZXMubWFpblJhdGU7XG4gICAgICAgIGNvbnN0IHJlbGllZiA9IHJ1bGVzLnN0YW5kYXJkRnJhY3Rpb24gKiAocnVsZXMudXBwZXJMaW1pdCAtIGluY29tZSk7XG4gICAgICAgIHJldHVybiBncm9zc1RheCAtIHJlbGllZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkTWFyZ2luYWxSZWxpZWZCcmVha2Rvd25zKFxuICAgICAgICBpbmNvbWU6IG51bWJlcixcbiAgICAgICAgdGF4OiBudW1iZXIsXG4gICAgICAgIHJ1bGVzOiBNYXJnaW5hbFJlbGllZlJ1bGUsXG4gICAgKTogQnJlYWtkb3duW10ge1xuICAgICAgICBjb25zdCBncm9zc1RheCA9IGluY29tZSAqIHJ1bGVzLm1haW5SYXRlO1xuICAgICAgICBjb25zdCByZWxpZWYgPSBydWxlcy5zdGFuZGFyZEZyYWN0aW9uICogKHJ1bGVzLnVwcGVyTGltaXQgLSBpbmNvbWUpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZnJvbTogJzAnLFxuICAgICAgICAgICAgICAgIHRvOiAnQWJvdmUnLFxuICAgICAgICAgICAgICAgIHJhdGU6IHJ1bGVzLm1haW5SYXRlLFxuICAgICAgICAgICAgICAgIGFtb3VudDogZ3Jvc3NUYXgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb206IGAke3J1bGVzLmxvd2VyTGltaXR9YCxcbiAgICAgICAgICAgICAgICB0bzogYCR7cnVsZXMudXBwZXJMaW1pdH1gLFxuICAgICAgICAgICAgICAgIHJhdGU6IC0ocnVsZXMuc3RhbmRhcmRGcmFjdGlvbiksXG4gICAgICAgICAgICAgICAgYW1vdW50OiAtcmVsaWVmLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL3VrL2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJlYWtkb3duIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZsYXRUYXhSdWxlIHtcbiAgICB0eXBlOiAnZmxhdCc7XG4gICAgcmF0ZTogbnVtYmVyO1xuICAgIGNvbmRpdGlvbnM/OiB7XG4gICAgICAgIG1heEluY29tZT86IG51bWJlcjtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcmdpbmFsUmVsaWVmUnVsZSB7XG4gICAgdHlwZTogJ21hcmdpbmFsX3JlbGllZic7XG4gICAgbWFpblJhdGU6IG51bWJlcjtcbiAgICBzbWFsbFByb2ZpdHNSYXRlOiBudW1iZXI7XG4gICAgdXBwZXJMaW1pdDogbnVtYmVyO1xuICAgIGxvd2VyTGltaXQ6IG51bWJlcjtcbiAgICBzdGFuZGFyZEZyYWN0aW9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFRheFJ1bGUgPSBGbGF0VGF4UnVsZSB8IE1hcmdpbmFsUmVsaWVmUnVsZTtcblxuZXhwb3J0IGludGVyZmFjZSBSdWxlcyB7XG4gICAgcmVnaW1lczoge1xuICAgICAgICBzbWFsbFByb2ZpdHM6IEZsYXRUYXhSdWxlO1xuICAgICAgICBtYWluOiBGbGF0VGF4UnVsZTtcbiAgICAgICAgbWFyZ2luYWxSZWxpZWY6IE1hcmdpbmFsUmVsaWVmUnVsZTtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElucHV0IHtcbiAgICB0YXhhYmxlSW5jb21lOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdWx0IHtcbiAgICBjb3Jwb3JhdGVUYXg6IG51bWJlcjtcbiAgICBlZmZlY3RpdmVUYXhSYXRlOiBudW1iZXI7XG4gICAgYnJlYWtkb3duczogQnJlYWtkb3duW107XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVNBQ29ycG9yYXRlVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3Jwb3JhdGUvdXNhL1VTQUNvcnBvcmF0ZVRheFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc3VsdCB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVTQUNvcnBvcmF0ZVRheFNlcnZpY2Uge1xuICAgIGNhbGN1bGF0ZSgpOiBSZXN1bHQ7XG59XG4iXX0=
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.USACorporateTaxServiceImpl = void 0;
4
+ class USACorporateTaxServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const income = this._input.taxableIncome;
11
+ if (income <= 0) {
12
+ return { corporateTax: 0, effectiveTaxRate: 0, breakdowns: [] };
13
+ }
14
+ const tax = income * this._rules.regime.rate;
15
+ const breakdowns = [{
16
+ from: '0',
17
+ to: 'All',
18
+ rate: this._rules.regime.rate,
19
+ amount: tax,
20
+ }];
21
+ return {
22
+ corporateTax: tax,
23
+ effectiveTaxRate: (tax / income) * 100,
24
+ breakdowns,
25
+ };
26
+ }
27
+ }
28
+ exports.USACorporateTaxServiceImpl = USACorporateTaxServiceImpl;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVNBQ29ycG9yYXRlVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29ycG9yYXRlL3VzYS9VU0FDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFhLDBCQUEwQjtJQUluQyxZQUFZLEtBQVksRUFBRSxLQUFZO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFFekMsSUFBSSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDZCxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3BFLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzdDLE1BQU0sVUFBVSxHQUFnQixDQUFDO2dCQUM3QixJQUFJLEVBQUUsR0FBRztnQkFDVCxFQUFFLEVBQUUsS0FBSztnQkFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSTtnQkFDN0IsTUFBTSxFQUFFLEdBQUc7YUFDZCxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0gsWUFBWSxFQUFFLEdBQUc7WUFDakIsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRztZQUN0QyxVQUFVO1NBQ2IsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQTlCRCxnRUE4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha2Rvd24gfSBmcm9tIFwiLi4vZG9tYWluL3R5cGVzXCI7XG5pbXBvcnQgeyBVU0FDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSBcIi4vVVNBQ29ycG9yYXRlVGF4U2VydmljZVwiO1xuaW1wb3J0IHsgSW5wdXQsIFJlc3VsdCwgUnVsZXMgfSBmcm9tIFwiLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFVTQUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsIGltcGxlbWVudHMgVVNBQ29ycG9yYXRlVGF4U2VydmljZSB7XG4gICAgcHJpdmF0ZSBfaW5wdXQ6IElucHV0O1xuICAgIHByaXZhdGUgX3J1bGVzOiBSdWxlcztcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0OiBJbnB1dCwgcnVsZXM6IFJ1bGVzKSB7XG4gICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuX3J1bGVzID0gcnVsZXM7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGluY29tZSA9IHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWU7XG5cbiAgICAgICAgaWYgKGluY29tZSA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBjb3Jwb3JhdGVUYXg6IDAsIGVmZmVjdGl2ZVRheFJhdGU6IDAsIGJyZWFrZG93bnM6IFtdIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXggPSBpbmNvbWUgKiB0aGlzLl9ydWxlcy5yZWdpbWUucmF0ZTtcbiAgICAgICAgY29uc3QgYnJlYWtkb3duczogQnJlYWtkb3duW10gPSBbe1xuICAgICAgICAgICAgZnJvbTogJzAnLFxuICAgICAgICAgICAgdG86ICdBbGwnLFxuICAgICAgICAgICAgcmF0ZTogdGhpcy5fcnVsZXMucmVnaW1lLnJhdGUsXG4gICAgICAgICAgICBhbW91bnQ6IHRheCxcbiAgICAgICAgfV07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvcnBvcmF0ZVRheDogdGF4LFxuICAgICAgICAgICAgZWZmZWN0aXZlVGF4UmF0ZTogKHRheCAvIGluY29tZSkgKiAxMDAsXG4gICAgICAgICAgICBicmVha2Rvd25zLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL3VzYS9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyZWFrZG93biB9IGZyb20gXCIuLi8uLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSdWxlcyB7XG4gICAgcmVnaW1lOiB7IHR5cGU6ICdmbGF0JzsgcmF0ZTogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXQge1xuICAgIHRheGFibGVJbmNvbWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bHQge1xuICAgIGNvcnBvcmF0ZVRheDogbnVtYmVyO1xuICAgIGVmZmVjdGl2ZVRheFJhdGU6IG51bWJlcjtcbiAgICBicmVha2Rvd25zOiBCcmVha2Rvd25bXTtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VybWFueUluY29tZVRheFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5jb21lLXRheC9nZXJtYW55L0dlcm1hbnlJbmNvbWVUYXhTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wdXRlZEluY29tZVRheFZhbHVlcyB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdlcm1hbnlJbmNvbWVUYXhTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGVOZXRJbmNvbWUoKTogQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXM7XG59XG4iXX0=
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GermanyIncomeTaxServiceImpl = void 0;
4
+ class GermanyIncomeTaxServiceImpl {
5
+ constructor(income, rules) {
6
+ this._income = income;
7
+ this._rules = rules;
8
+ }
9
+ calculateNetIncome() {
10
+ const { grossTax, bracketBreakdown } = this.computeTaxBrackets(this._income);
11
+ const solidaritySurcharge = this.computeSolidaritySurcharge(grossTax, this._rules.solidaritySurcharge);
12
+ const socialContributions = this.computeSocialContributions(this._income, this._rules.socialContributions);
13
+ const totalDeductions = grossTax + solidaritySurcharge + socialContributions;
14
+ const netIncome = this._income - totalDeductions;
15
+ return {
16
+ grossIncome: this._income,
17
+ incomeTax: this.round(grossTax),
18
+ solidaritySurcharge: this.round(solidaritySurcharge),
19
+ socialContributions: this.round(socialContributions),
20
+ totalDeductions: this.round(totalDeductions),
21
+ netIncome: this.round(netIncome),
22
+ effectiveTaxRate: this._income > 0 ? this.round(grossTax / this._income, 4) : 0,
23
+ taxBracketBreakdown: bracketBreakdown,
24
+ };
25
+ }
26
+ computeTaxBrackets(income) {
27
+ let tax = 0;
28
+ const bracketBreakdown = [];
29
+ for (let index = 0; index < this._rules.taxBrackets.length; index++) {
30
+ const bracket = this._rules.taxBrackets[index];
31
+ if (income <= bracket.from) {
32
+ bracketBreakdown.push({
33
+ bracketIndex: index,
34
+ bracketName: `Bracket ${index + 1}`,
35
+ from: bracket.from,
36
+ to: bracket.to ?? null,
37
+ rate: bracket.rate,
38
+ amountInBracket: 0,
39
+ taxOnAmount: 0,
40
+ });
41
+ break;
42
+ }
43
+ const upper = bracket.to ?? income;
44
+ const taxableAmount = Math.min(upper, income) - bracket.from;
45
+ if (taxableAmount > 0) {
46
+ const taxOnAmount = taxableAmount * bracket.rate;
47
+ tax += taxOnAmount;
48
+ bracketBreakdown.push({
49
+ bracketIndex: index,
50
+ bracketName: `Bracket ${index + 1}`,
51
+ from: bracket.from,
52
+ to: bracket.to ?? null,
53
+ rate: bracket.rate,
54
+ amountInBracket: taxableAmount,
55
+ taxOnAmount,
56
+ });
57
+ }
58
+ else {
59
+ bracketBreakdown.push({
60
+ bracketIndex: index,
61
+ bracketName: `Bracket ${index + 1}`,
62
+ from: bracket.from,
63
+ to: bracket.to ?? null,
64
+ rate: bracket.rate,
65
+ amountInBracket: 0,
66
+ taxOnAmount: 0,
67
+ });
68
+ }
69
+ }
70
+ return { grossTax: tax, bracketBreakdown };
71
+ }
72
+ computeSolidaritySurcharge(incomeTax, rules) {
73
+ if (incomeTax <= rules.exemptionThreshold) {
74
+ return 0;
75
+ }
76
+ return incomeTax * rules.rate;
77
+ }
78
+ computeSocialContributions(income, rules) {
79
+ return income * rules.rate;
80
+ }
81
+ round(value, decimals = 2) {
82
+ return Number(value.toFixed(decimals));
83
+ }
84
+ }
85
+ exports.GermanyIncomeTaxServiceImpl = GermanyIncomeTaxServiceImpl;
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VybWFueUluY29tZVRheFNlcnZpY2VJbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luY29tZS10YXgvZ2VybWFueS9HZXJtYW55SW5jb21lVGF4U2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0EsTUFBYSwyQkFBMkI7SUFJcEMsWUFBWSxNQUFjLEVBQUUsS0FBcUI7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLGtCQUFrQjtRQUNyQixNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3RSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FDdkQsUUFBUSxFQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQ2xDLENBQUM7UUFFRixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FDdkQsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUNsQyxDQUFDO1FBRUYsTUFBTSxlQUFlLEdBQUcsUUFBUSxHQUFHLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQzdFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDO1FBRWpELE9BQU87WUFDSCxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQy9CLG1CQUFtQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7WUFDcEQsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxlQUFl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Q3hDLE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQztRQUVELE9BQU8sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVPLDBCQUEwQixDQUM5QixNQUFjLEVBQ2QsS0FBOEI7UUFFOUIsT0FBTyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRU8sS0FBSyxDQUFDLEtBQWEsRUFBRSxRQUFRLEdBQUcsQ0FBQztRQUNyQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztDQUNKO0FBL0dELGtFQStHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyYWNrZXRBbGxvY2F0aW9uIH0gZnJvbSBcIi4uL2RvbWFpbi90eXBlc1wiO1xuaW1wb3J0IHsgR2VybWFueUluY29tZVRheFNlcnZpY2UgfSBmcm9tIFwiLi9HZXJtYW55SW5jb21lVGF4U2VydmljZVwiO1xuaW1wb3J0IHtcbiAgICBDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBJbmNvbWVUYXhSdWxlcyxcbiAgICBTb2xpZGFyaXR5U3VyY2hhcmdlUnVsZXMsXG4gICAgU29jaWFsQ29udHJpYnV0aW9uUnVsZXMsXG59IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgR2VybWFueUluY29tZVRheFNlcnZpY2VJbXBsIGltcGxlbWVudHMgR2VybWFueUluY29tZVRheFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2luY29tZTogbnVtYmVyO1xuICAgIHByaXZhdGUgX3J1bGVzOiBJbmNvbWVUYXhSdWxlcztcblxuICAgIGNvbnN0cnVjdG9yKGluY29tZTogbnVtYmVyLCBydWxlczogSW5jb21lVGF4UnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5jb21lID0gaW5jb21lO1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjdWxhdGVOZXRJbmNvbWUoKTogQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMge1xuICAgICAgICBjb25zdCB7IGdyb3NzVGF4LCBicmFja2V0QnJlYWtkb3duIH0gPSB0aGlzLmNvbXB1dGVUYXhCcmFja2V0cyh0aGlzLl9pbmNvbWUpO1xuXG4gICAgICAgIGNvbnN0IHNvbGlkYXJpdHlTdXJjaGFyZ2UgPSB0aGlzLmNvbXB1dGVTb2xpZGFyaXR5U3VyY2hhcmdlKFxuICAgICAgICAgICAgZ3Jvc3NUYXgsXG4gICAgICAgICAgICB0aGlzLl9ydWxlcy5zb2xpZGFyaXR5U3VyY2hhcmdlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHNvY2lhbENvbnRyaWJ1dGlvbnMgPSB0aGlzLmNvbXB1dGVTb2NpYWxDb250cmlidXRpb25zKFxuICAgICAgICAgICAgdGhpcy5faW5jb21lLFxuICAgICAgICAgICAgdGhpcy5fcnVsZXMuc29jaWFsQ29udHJpYnV0aW9ucyxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0b3RhbERlZHVjdGlvbnMgPSBncm9zc1RheCArIHNvbGlkYXJpdHlTdXJjaGFyZ2UgKyBzb2NpYWxDb250cmlidXRpb25zO1xuICAgICAgICBjb25zdCBuZXRJbmNvbWUgPSB0aGlzLl9pbmNvbWUgLSB0b3RhbERlZHVjdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyb3NzSW5jb21lOiB0aGlzLl9pbmNvbWUsXG4gICAgICAgICAgICBpbmNvbWVUYXg6IHRoaXMucm91bmQoZ3Jvc3NUYXgpLFxuICAgICAgICAgICAgc29saWRhcml0eVN1cmNoYXJnZTogdGhpcy5yb3VuZChzb2xpZGFyaXR5U3VyY2hhcmdlKSxcbiAgICAgICAgICAgIHNvY2lhbENvbnRyaWJ1dGlvbnM6IHRoaXMucm91bmQoc29jaWFsQ29udHJpYnV0aW9ucyksXG4gICAgICAgICAgICB0b3RhbERlZHVjdGlvbnM6IHRoaXMucm91bmQodG90YWxEZWR1Y3Rpb25zKSxcbiAgICAgICAgICAgIG5ldEluY29tZTogdGhpcy5yb3VuZChuZXRJbmNvbWUpLFxuICAgICAgICAgICAgZWZmZWN0aXZlVGF4UmF0ZTogdGhpcy5faW5jb21lID4gMCA/IHRoaXMucm91bmQoZ3Jvc3NUYXggLyB0aGlzLl9pbmNvbWUsIDQpIDogMCxcbiAgICAgICAgICAgIHRheEJyYWNrZXRCcmVha2Rvd246IGJyYWNrZXRCcmVha2Rvd24sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlVGF4QnJhY2tldHMoXG4gICAgICAgIGluY29tZTogbnVtYmVyLFxuICAgICk6IHsgZ3Jvc3NUYXg6IG51bWJlcjsgYnJhY2tldEJyZWFrZG93bjogQnJhY2tldEFsbG9jYXRpb25bXSB9IHtcbiAgICAgICAgbGV0IHRheCA9IDA7XG4gICAgICAgIGNvbnN0IGJyYWNrZXRCcmVha2Rvd246IEJyYWNrZXRBbGxvY2F0aW9uW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fcnVsZXMudGF4QnJhY2tldHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBicmFja2V0ID0gdGhpcy5fcnVsZXMudGF4QnJhY2tldHNbaW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoaW5jb21lIDw9IGJyYWNrZXQuZnJvbSkge1xuICAgICAgICAgICAgICAgIGJyYWNrZXRCcmVha2Rvd24ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXRJbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXROYW1lOiBgQnJhY2tldCAke2luZGV4ICsgMX1gLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBicmFja2V0LmZyb20sXG4gICAgICAgICAgICAgICAgICAgIHRvOiBicmFja2V0LnRvID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50SW5CcmFja2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0YXhPbkFtb3VudDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdXBwZXIgPSBicmFja2V0LnRvID8/IGluY29tZTtcbiAgICAgICAgICAgIGNvbnN0IHRheGFibGVBbW91bnQgPSBNYXRoLm1pbih1cHBlciwgaW5jb21lKSAtIGJyYWNrZXQuZnJvbTtcblxuICAgICAgICAgICAgaWYgKHRheGFibGVBbW91bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGF4T25BbW91bnQgPSB0YXhhYmxlQW1vdW50ICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSB0YXhPbkFtb3VudDtcbiAgICAgICAgICAgICAgICBicmFja2V0QnJlYWtkb3duLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBicmFja2V0SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICBicmFja2V0TmFtZTogYEJyYWNrZXQgJHtpbmRleCArIDF9YCxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogYnJhY2tldC5mcm9tLFxuICAgICAgICAgICAgICAgICAgICB0bzogYnJhY2tldC50byA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICByYXRlOiBicmFja2V0LnJhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFtb3VudEluQnJhY2tldDogdGF4YWJsZUFtb3VudCxcbiAgICAgICAgICAgICAgICAgICAgdGF4T25BbW91bnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyYWNrZXRCcmVha2Rvd24ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXRJbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXROYW1lOiBgQnJhY2tldCAke2luZGV4ICsgMX1gLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBicmFja2V0LmZyb20sXG4gICAgICAgICAgICAgICAgICAgIHRvOiBicmFja2V0LnRvID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50SW5CcmFja2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0YXhPbkFtb3VudDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGdyb3NzVGF4OiB0YXgsIGJyYWNrZXRCcmVha2Rvd24gfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVTb2xpZGFyaXR5U3VyY2hhcmdlKFxuICAgICAgICBpbmNvbWVUYXg6IG51bWJlcixcbiAgICAgICAgcnVsZXM6IFNvbGlkYXJpdHlTdXJjaGFyZ2VSdWxlcyxcbiAgICApOiBudW1iZXIge1xuICAgICAgICBpZiAoaW5jb21lVGF4IDw9IHJ1bGVzLmV4ZW1wdGlvblRocmVzaG9sZCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5jb21lVGF4ICogcnVsZXMucmF0ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVTb2NpYWxDb250cmlidXRpb25zKFxuICAgICAgICBpbmNvbWU6IG51bWJlcixcbiAgICAgICAgcnVsZXM6IFNvY2lhbENvbnRyaWJ1dGlvblJ1bGVzLFxuICAgICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBpbmNvbWUgKiBydWxlcy5yYXRlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcm91bmQodmFsdWU6IG51bWJlciwgZGVjaW1hbHMgPSAyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZS50b0ZpeGVkKGRlY2ltYWxzKSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW5jb21lLXRheC9nZXJtYW55L2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJhY2tldEFsbG9jYXRpb24sIFRheEJyYWNrZXQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVGF4UnVsZXMge1xuICAgIHRheEJyYWNrZXRzOiBUYXhCcmFja2V0W107XG4gICAgc29saWRhcml0eVN1cmNoYXJnZTogU29saWRhcml0eVN1cmNoYXJnZVJ1bGVzO1xuICAgIHNvY2lhbENvbnRyaWJ1dGlvbnM6IFNvY2lhbENvbnRyaWJ1dGlvblJ1bGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbGlkYXJpdHlTdXJjaGFyZ2VSdWxlcyB7XG4gICAgcmF0ZTogbnVtYmVyO1xuICAgIGV4ZW1wdGlvblRocmVzaG9sZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2lhbENvbnRyaWJ1dGlvblJ1bGVzIHtcbiAgICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMge1xuICAgIGdyb3NzSW5jb21lOiBudW1iZXI7XG4gICAgaW5jb21lVGF4OiBudW1iZXI7XG4gICAgc29saWRhcml0eVN1cmNoYXJnZTogbnVtYmVyO1xuICAgIHNvY2lhbENvbnRyaWJ1dGlvbnM6IG51bWJlcjtcbiAgICB0b3RhbERlZHVjdGlvbnM6IG51bWJlcjtcbiAgICBuZXRJbmNvbWU6IG51bWJlcjtcbiAgICBlZmZlY3RpdmVUYXhSYXRlOiBudW1iZXI7XG4gICAgdGF4QnJhY2tldEJyZWFrZG93bjogQnJhY2tldEFsbG9jYXRpb25bXTtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVUtJbmNvbWVUYXhTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luY29tZS10YXgvdWsvVUtJbmNvbWVUYXhTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wdXRlZEluY29tZVRheFZhbHVlcyB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVLSW5jb21lVGF4U2VydmljZSB7XG4gICAgY2FsY3VsYXRlTmV0SW5jb21lKCk6IENvbXB1dGVkSW5jb21lVGF4VmFsdWVzO1xufVxuIl19
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UKIncomeTaxServiceImpl = void 0;
4
+ class UKIncomeTaxServiceImpl {
5
+ constructor(income, rules) {
6
+ this._income = income;
7
+ this._rules = rules;
8
+ }
9
+ calculateNetIncome() {
10
+ const effectivePA = this.computePersonalAllowance(this._income, this._rules.personalAllowance);
11
+ const taxableIncome = Math.max(0, this._income - effectivePA);
12
+ const { grossTax, bracketBreakdown } = this.computeTaxBrackets(taxableIncome);
13
+ const ni = this.computeNationalInsurance(this._income, this._rules.nationalInsurance);
14
+ const totalDeductions = grossTax + ni;
15
+ const netIncome = this._income - totalDeductions;
16
+ return {
17
+ grossIncome: this._income,
18
+ incomeTax: this.round(grossTax),
19
+ nationalInsurance: this.round(ni),
20
+ personalAllowance: effectivePA,
21
+ totalDeductions: this.round(totalDeductions),
22
+ netIncome: this.round(netIncome),
23
+ effectiveTaxRate: this._income > 0 ? this.round(grossTax / this._income, 4) : 0,
24
+ taxBracketBreakdown: bracketBreakdown,
25
+ };
26
+ }
27
+ computePersonalAllowance(income, rules) {
28
+ if (income <= rules.taperThreshold) {
29
+ return rules.amount;
30
+ }
31
+ const reduction = Math.floor((income - rules.taperThreshold) * rules.taperRate);
32
+ return Math.max(0, rules.amount - reduction);
33
+ }
34
+ computeTaxBrackets(taxableIncome) {
35
+ let tax = 0;
36
+ const bracketBreakdown = [];
37
+ for (let index = 0; index < this._rules.taxBrackets.length; index++) {
38
+ const bracket = this._rules.taxBrackets[index];
39
+ if (taxableIncome <= bracket.from) {
40
+ bracketBreakdown.push({
41
+ bracketIndex: index,
42
+ bracketName: `Bracket ${index + 1}`,
43
+ from: bracket.from,
44
+ to: bracket.to ?? null,
45
+ rate: bracket.rate,
46
+ amountInBracket: 0,
47
+ taxOnAmount: 0,
48
+ });
49
+ break;
50
+ }
51
+ const upper = bracket.to ?? taxableIncome;
52
+ const taxableAmount = Math.min(upper, taxableIncome) - bracket.from;
53
+ if (taxableAmount > 0) {
54
+ const taxOnAmount = taxableAmount * bracket.rate;
55
+ tax += taxOnAmount;
56
+ bracketBreakdown.push({
57
+ bracketIndex: index,
58
+ bracketName: `Bracket ${index + 1}`,
59
+ from: bracket.from,
60
+ to: bracket.to ?? null,
61
+ rate: bracket.rate,
62
+ amountInBracket: taxableAmount,
63
+ taxOnAmount,
64
+ });
65
+ }
66
+ else {
67
+ bracketBreakdown.push({
68
+ bracketIndex: index,
69
+ bracketName: `Bracket ${index + 1}`,
70
+ from: bracket.from,
71
+ to: bracket.to ?? null,
72
+ rate: bracket.rate,
73
+ amountInBracket: 0,
74
+ taxOnAmount: 0,
75
+ });
76
+ }
77
+ }
78
+ return { grossTax: tax, bracketBreakdown };
79
+ }
80
+ computeNationalInsurance(income, rules) {
81
+ if (income <= rules.primaryThreshold) {
82
+ return 0;
83
+ }
84
+ if (income <= rules.upperEarningsLimit) {
85
+ return (income - rules.primaryThreshold) * rules.mainRate;
86
+ }
87
+ const mainBand = (rules.upperEarningsLimit - rules.primaryThreshold) * rules.mainRate;
88
+ const upperBand = (income - rules.upperEarningsLimit) * rules.upperRate;
89
+ return mainBand + upperBand;
90
+ }
91
+ round(value, decimals = 2) {
92
+ return Number(value.toFixed(decimals));
93
+ }
94
+ }
95
+ exports.UKIncomeTaxServiceImpl = UKIncomeTaxServiceImpl;
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVUtJbmNvbWVUYXhTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbmNvbWUtdGF4L3VrL1VLSW5jb21lVGF4U2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0EsTUFBYSxzQkFBc0I7SUFJL0IsWUFBWSxNQUFjLEVBQUUsS0FBcUI7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLGtCQUFrQjtRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQzdDLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDaEMsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFFOUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU5RSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQ3BDLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDaEMsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUM7UUFFakQsT0FBTztZQUNILFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDL0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakMsaUJB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IFwiLi4vZG9tYWluL3R5cGVzXCI7XG5pbXBvcnQgeyBVS0luY29tZVRheFNlcnZpY2UgfSBmcm9tIFwiLi9VS0luY29tZVRheFNlcnZpY2VcIjtcbmltcG9ydCB7XG4gICAgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMsXG4gICAgSW5jb21lVGF4UnVsZXMsXG4gICAgTmF0aW9uYWxJbnN1cmFuY2VSdWxlcyxcbiAgICBQZXJzb25hbEFsbG93YW5jZVJ1bGVzLFxufSBmcm9tIFwiLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFVLSW5jb21lVGF4U2VydmljZUltcGwgaW1wbGVtZW50cyBVS0luY29tZVRheFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2luY29tZTogbnVtYmVyO1xuICAgIHByaXZhdGUgX3J1bGVzOiBJbmNvbWVUYXhSdWxlcztcblxuICAgIGNvbnN0cnVjdG9yKGluY29tZTogbnVtYmVyLCBydWxlczogSW5jb21lVGF4UnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5jb21lID0gaW5jb21lO1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjdWxhdGVOZXRJbmNvbWUoKTogQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVQQSA9IHRoaXMuY29tcHV0ZVBlcnNvbmFsQWxsb3dhbmNlKFxuICAgICAgICAgICAgdGhpcy5faW5jb21lLFxuICAgICAgICAgICAgdGhpcy5fcnVsZXMucGVyc29uYWxBbGxvd2FuY2UsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRheGFibGVJbmNvbWUgPSBNYXRoLm1heCgwLCB0aGlzLl9pbmNvbWUgLSBlZmZlY3RpdmVQQSk7XG5cbiAgICAgICAgY29uc3QgeyBncm9zc1RheCwgYnJhY2tldEJyZWFrZG93biB9ID0gdGhpcy5jb21wdXRlVGF4QnJhY2tldHModGF4YWJsZUluY29tZSk7XG5cbiAgICAgICAgY29uc3QgbmkgPSB0aGlzLmNvbXB1dGVOYXRpb25hbEluc3VyYW5jZShcbiAgICAgICAgICAgIHRoaXMuX2luY29tZSxcbiAgICAgICAgICAgIHRoaXMuX3J1bGVzLm5hdGlvbmFsSW5zdXJhbmNlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRvdGFsRGVkdWN0aW9ucyA9IGdyb3NzVGF4ICsgbmk7XG4gICAgICAgIGNvbnN0IG5ldEluY29tZSA9IHRoaXMuX2luY29tZSAtIHRvdGFsRGVkdWN0aW9ucztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ3Jvc3NJbmNvbWU6IHRoaXMuX2luY29tZSxcbiAgICAgICAgICAgIGluY29tZVRheDogdGhpcy5yb3VuZChncm9zc1RheCksXG4gICAgICAgICAgICBuYXRpb25hbEluc3VyYW5jZTogdGhpcy5yb3VuZChuaSksXG4gICAgICAgICAgICBwZXJzb25hbEFsbG93YW5jZTogZWZmZWN0aXZlUEEsXG4gICAgICAgICAgICB0b3RhbERlZHVjdGlvbnM6IHRoaXMucm91bmQodG90YWxEZWR1Y3Rpb25zKSxcbiAgICAgICAgICAgIG5ldEluY29tZTogdGhpcy5yb3VuZChuZXRJbmNvbWUpLFxuICAgICAgICAgICAgZWZmZWN0aXZlVGF4UmF0ZTogdGhpcy5faW5jb21lID4gMCA/IHRoaXMucm91bmQoZ3Jvc3NUYXggLyB0aGlzLl9pbmNvbWUsIDQpIDogMCxcbiAgICAgICAgICAgIHRheEJyYWNrZXRCcmVha2Rvd246IGJyYWNrZXRCcmVha2Rvd24sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlUGVyc29uYWxBbGxvd2FuY2UoXG4gICAgICAgIGluY29tZTogbnVtYmVyLFxuICAgICAgICBydWxlczogUGVyc29uYWxBbGxvd2FuY2VSdWxlcyxcbiAgICApOiBudW1iZXIge1xuICAgICAgICBpZiAoaW5jb21lIDw9IHJ1bGVzLnRhcGVyVGhyZXNob2xkKSB7XG4gICAgICAgICAgICByZXR1cm4gcnVsZXMuYW1vdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVkdWN0aW9uID0gTWF0aC5mbG9vcigoaW5jb21lIC0gcnVsZXMudGFwZXJUaHJlc2hvbGQpICogcnVsZXMudGFwZXJSYXRlKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHJ1bGVzLmFtb3VudCAtIHJlZHVjdGlvbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlVGF4QnJhY2tldHMoXG4gICAgICAgIHRheGFibGVJbmNvbWU6IG51bWJlcixcbiAgICApOiB7IGdyb3NzVGF4OiBudW1iZXI7IGJyYWNrZXRCcmVha2Rvd246IEJyYWNrZXRBbGxvY2F0aW9uW10gfSB7XG4gICAgICAgIGxldCB0YXggPSAwO1xuICAgICAgICBjb25zdCBicmFja2V0QnJlYWtkb3duOiBCcmFja2V0QWxsb2NhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX3J1bGVzLnRheEJyYWNrZXRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgYnJhY2tldCA9IHRoaXMuX3J1bGVzLnRheEJyYWNrZXRzW2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKHRheGFibGVJbmNvbWUgPD0gYnJhY2tldC5mcm9tKSB7XG4gICAgICAgICAgICAgICAgYnJhY2tldEJyZWFrZG93bi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgYnJhY2tldEluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgYnJhY2tldE5hbWU6IGBCcmFja2V0ICR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgICAgICAgICAgIGZyb206IGJyYWNrZXQuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgdG86IGJyYWNrZXQudG8gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmF0ZTogYnJhY2tldC5yYXRlLFxuICAgICAgICAgICAgICAgICAgICBhbW91bnRJbkJyYWNrZXQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRheE9uQW1vdW50OiAwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB1cHBlciA9IGJyYWNrZXQudG8gPz8gdGF4YWJsZUluY29tZTtcbiAgICAgICAgICAgIGNvbnN0IHRheGFibGVBbW91bnQgPSBNYXRoLm1pbih1cHBlciwgdGF4YWJsZUluY29tZSkgLSBicmFja2V0LmZyb207XG5cbiAgICAgICAgICAgIGlmICh0YXhhYmxlQW1vdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRheE9uQW1vdW50ID0gdGF4YWJsZUFtb3VudCAqIGJyYWNrZXQucmF0ZTtcbiAgICAgICAgICAgICAgICB0YXggKz0gdGF4T25BbW91bnQ7XG4gICAgICAgICAgICAgICAgYnJhY2tldEJyZWFrZG93bi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgYnJhY2tldEluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgYnJhY2tldE5hbWU6IGBCcmFja2V0ICR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgICAgICAgICAgIGZyb206IGJyYWNrZXQuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgdG86IGJyYWNrZXQudG8gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmF0ZTogYnJhY2tldC5yYXRlLFxuICAgICAgICAgICAgICAgICAgICBhbW91bnRJbkJyYWNrZXQ6IHRheGFibGVBbW91bnQsXG4gICAgICAgICAgICAgICAgICAgIHRheE9uQW1vdW50LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmFja2V0QnJlYWtkb3duLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBicmFja2V0SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICBicmFja2V0TmFtZTogYEJyYWNrZXQgJHtpbmRleCArIDF9YCxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogYnJhY2tldC5mcm9tLFxuICAgICAgICAgICAgICAgICAgICB0bzogYnJhY2tldC50byA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICByYXRlOiBicmFja2V0LnJhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFtb3VudEluQnJhY2tldDogMCxcbiAgICAgICAgICAgICAgICAgICAgdGF4T25BbW91bnQ6IDAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBncm9zc1RheDogdGF4LCBicmFja2V0QnJlYWtkb3duIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlTmF0aW9uYWxJbnN1cmFuY2UoXG4gICAgICAgIGluY29tZTogbnVtYmVyLFxuICAgICAgICBydWxlczogTmF0aW9uYWxJbnN1cmFuY2VSdWxlcyxcbiAgICApOiBudW1iZXIge1xuICAgICAgICBpZiAoaW5jb21lIDw9IHJ1bGVzLnByaW1hcnlUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluY29tZSA8PSBydWxlcy51cHBlckVhcm5pbmdzTGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiAoaW5jb21lIC0gcnVsZXMucHJpbWFyeVRocmVzaG9sZCkgKiBydWxlcy5tYWluUmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1haW5CYW5kID0gKHJ1bGVzLnVwcGVyRWFybmluZ3NMaW1pdCAtIHJ1bGVzLnByaW1hcnlUaHJlc2hvbGQpICogcnVsZXMubWFpblJhdGU7XG4gICAgICAgIGNvbnN0IHVwcGVyQmFuZCA9IChpbmNvbWUgLSBydWxlcy51cHBlckVhcm5pbmdzTGltaXQpICogcnVsZXMudXBwZXJSYXRlO1xuICAgICAgICByZXR1cm4gbWFpbkJhbmQgKyB1cHBlckJhbmQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByb3VuZCh2YWx1ZTogbnVtYmVyLCBkZWNpbWFscyA9IDIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRml4ZWQoZGVjaW1hbHMpKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW5jb21lLXRheC91ay9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyYWNrZXRBbGxvY2F0aW9uLCBUYXhCcmFja2V0IH0gZnJvbSBcIi4uLy4uL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVRheFJ1bGVzIHtcbiAgICB0YXhCcmFja2V0czogVGF4QnJhY2tldFtdO1xuICAgIHBlcnNvbmFsQWxsb3dhbmNlOiBQZXJzb25hbEFsbG93YW5jZVJ1bGVzO1xuICAgIG5hdGlvbmFsSW5zdXJhbmNlOiBOYXRpb25hbEluc3VyYW5jZVJ1bGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbmFsQWxsb3dhbmNlUnVsZXMge1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIHRhcGVyVGhyZXNob2xkOiBudW1iZXI7XG4gICAgdGFwZXJSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmF0aW9uYWxJbnN1cmFuY2VSdWxlcyB7XG4gICAgcHJpbWFyeVRocmVzaG9sZDogbnVtYmVyO1xuICAgIHVwcGVyRWFybmluZ3NMaW1pdDogbnVtYmVyO1xuICAgIG1haW5SYXRlOiBudW1iZXI7XG4gICAgdXBwZXJSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMge1xuICAgIGdyb3NzSW5jb21lOiBudW1iZXI7XG4gICAgaW5jb21lVGF4OiBudW1iZXI7XG4gICAgbmF0aW9uYWxJbnN1cmFuY2U6IG51bWJlcjtcbiAgICBwZXJzb25hbEFsbG93YW5jZTogbnVtYmVyO1xuICAgIHRvdGFsRGVkdWN0aW9uczogbnVtYmVyO1xuICAgIG5ldEluY29tZTogbnVtYmVyO1xuICAgIGVmZmVjdGl2ZVRheFJhdGU6IG51bWJlcjtcbiAgICB0YXhCcmFja2V0QnJlYWtkb3duOiBCcmFja2V0QWxsb2NhdGlvbltdO1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVNBSW5jb21lVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbmNvbWUtdGF4L3VzYS9VU0FJbmNvbWVUYXhTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wdXRlZEluY29tZVRheFZhbHVlcyB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVTQUluY29tZVRheFNlcnZpY2Uge1xuICAgIGNhbGN1bGF0ZU5ldEluY29tZSgpOiBDb21wdXRlZEluY29tZVRheFZhbHVlcztcbn1cbiJdfQ==
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.USAIncomeTaxServiceImpl = void 0;
4
+ class USAIncomeTaxServiceImpl {
5
+ constructor(income, rules) {
6
+ this._income = income;
7
+ this._rules = rules;
8
+ }
9
+ calculateNetIncome() {
10
+ const standardDeduction = this._rules.standardDeduction.amount;
11
+ const taxableIncome = Math.max(0, this._income - standardDeduction);
12
+ const { grossTax, bracketBreakdown } = this.computeTaxBrackets(taxableIncome);
13
+ const { socialSecurity, medicare } = this.computeFICA(this._income, this._rules.fica);
14
+ const totalDeductions = grossTax + socialSecurity + medicare;
15
+ const netIncome = this._income - totalDeductions;
16
+ return {
17
+ grossIncome: this._income,
18
+ incomeTax: this.round(grossTax),
19
+ socialSecurity: this.round(socialSecurity),
20
+ medicare: this.round(medicare),
21
+ standardDeduction,
22
+ totalDeductions: this.round(totalDeductions),
23
+ netIncome: this.round(netIncome),
24
+ effectiveTaxRate: this._income > 0 ? this.round(grossTax / this._income, 4) : 0,
25
+ taxBracketBreakdown: bracketBreakdown,
26
+ };
27
+ }
28
+ computeTaxBrackets(taxableIncome) {
29
+ let tax = 0;
30
+ const bracketBreakdown = [];
31
+ for (let index = 0; index < this._rules.taxBrackets.length; index++) {
32
+ const bracket = this._rules.taxBrackets[index];
33
+ if (taxableIncome <= bracket.from) {
34
+ bracketBreakdown.push({
35
+ bracketIndex: index,
36
+ bracketName: `Bracket ${index + 1}`,
37
+ from: bracket.from,
38
+ to: bracket.to ?? null,
39
+ rate: bracket.rate,
40
+ amountInBracket: 0,
41
+ taxOnAmount: 0,
42
+ });
43
+ break;
44
+ }
45
+ const upper = bracket.to ?? taxableIncome;
46
+ const taxableAmount = Math.min(upper, taxableIncome) - bracket.from;
47
+ if (taxableAmount > 0) {
48
+ const taxOnAmount = taxableAmount * bracket.rate;
49
+ tax += taxOnAmount;
50
+ bracketBreakdown.push({
51
+ bracketIndex: index,
52
+ bracketName: `Bracket ${index + 1}`,
53
+ from: bracket.from,
54
+ to: bracket.to ?? null,
55
+ rate: bracket.rate,
56
+ amountInBracket: taxableAmount,
57
+ taxOnAmount,
58
+ });
59
+ }
60
+ else {
61
+ bracketBreakdown.push({
62
+ bracketIndex: index,
63
+ bracketName: `Bracket ${index + 1}`,
64
+ from: bracket.from,
65
+ to: bracket.to ?? null,
66
+ rate: bracket.rate,
67
+ amountInBracket: 0,
68
+ taxOnAmount: 0,
69
+ });
70
+ }
71
+ }
72
+ return { grossTax: tax, bracketBreakdown };
73
+ }
74
+ computeFICA(income, rules) {
75
+ const socialSecurity = Math.min(income, rules.socialSecurity.wageBase) * rules.socialSecurity.rate;
76
+ const regularMedicare = income * rules.medicare.rate;
77
+ const additionalMedicare = income > rules.medicare.additionalThreshold
78
+ ? (income - rules.medicare.additionalThreshold) * rules.medicare.additionalRate
79
+ : 0;
80
+ return { socialSecurity, medicare: regularMedicare + additionalMedicare };
81
+ }
82
+ round(value, decimals = 2) {
83
+ return Number(value.toFixed(decimals));
84
+ }
85
+ }
86
+ exports.USAIncomeTaxServiceImpl = USAIncomeTaxServiceImpl;
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVNBSW5jb21lVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5jb21lLXRheC91c2EvVVNBSW5jb21lVGF4U2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBYSx1QkFBdUI7SUFJaEMsWUFBWSxNQUFjLEVBQUUsS0FBcUI7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLGtCQUFrQjtRQUNyQixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBQy9ELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztRQUVwRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTlFLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FDakQsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDbkIsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLFFBQVEsR0FBRyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBQzdELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDO1FBRWpELE9BQU87WUFDSCxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQy9CLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUMxQyxRQUFRLEVBQUUs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UUFFNUIsTUFBTSxjQUFjLEdBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFFaEYsTUFBTSxlQUFlLEdBQUcsTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3JELE1BQU0sa0JBQWtCLEdBQ3BCLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLG1CQUFtQjtZQUN2QyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRVosT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsZUFBZSxHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDOUUsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFhLEVBQUUsUUFBUSxHQUFHLENBQUM7UUFDckMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQTVHRCwwREE0R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmFja2V0QWxsb2NhdGlvbiB9IGZyb20gXCIuLi9kb21haW4vdHlwZXNcIjtcbmltcG9ydCB7IFVTQUluY29tZVRheFNlcnZpY2UgfSBmcm9tIFwiLi9VU0FJbmNvbWVUYXhTZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb21wdXRlZEluY29tZVRheFZhbHVlcywgRklDQUNvbnRyaWJ1dGlvblJ1bGVzLCBJbmNvbWVUYXhSdWxlcyB9IGZyb20gXCIuL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgVVNBSW5jb21lVGF4U2VydmljZUltcGwgaW1wbGVtZW50cyBVU0FJbmNvbWVUYXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9pbmNvbWU6IG51bWJlcjtcbiAgICBwcml2YXRlIF9ydWxlczogSW5jb21lVGF4UnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbmNvbWU6IG51bWJlciwgcnVsZXM6IEluY29tZVRheFJ1bGVzKSB7XG4gICAgICAgIHRoaXMuX2luY29tZSA9IGluY29tZTtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FsY3VsYXRlTmV0SW5jb21lKCk6IENvbXB1dGVkSW5jb21lVGF4VmFsdWVzIHtcbiAgICAgICAgY29uc3Qgc3RhbmRhcmREZWR1Y3Rpb24gPSB0aGlzLl9ydWxlcy5zdGFuZGFyZERlZHVjdGlvbi5hbW91bnQ7XG4gICAgICAgIGNvbnN0IHRheGFibGVJbmNvbWUgPSBNYXRoLm1heCgwLCB0aGlzLl9pbmNvbWUgLSBzdGFuZGFyZERlZHVjdGlvbik7XG5cbiAgICAgICAgY29uc3QgeyBncm9zc1RheCwgYnJhY2tldEJyZWFrZG93biB9ID0gdGhpcy5jb21wdXRlVGF4QnJhY2tldHModGF4YWJsZUluY29tZSk7XG5cbiAgICAgICAgY29uc3QgeyBzb2NpYWxTZWN1cml0eSwgbWVkaWNhcmUgfSA9IHRoaXMuY29tcHV0ZUZJQ0EoXG4gICAgICAgICAgICB0aGlzLl9pbmNvbWUsXG4gICAgICAgICAgICB0aGlzLl9ydWxlcy5maWNhLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRvdGFsRGVkdWN0aW9ucyA9IGdyb3NzVGF4ICsgc29jaWFsU2VjdXJpdHkgKyBtZWRpY2FyZTtcbiAgICAgICAgY29uc3QgbmV0SW5jb21lID0gdGhpcy5faW5jb21lIC0gdG90YWxEZWR1Y3Rpb25zO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBncm9zc0luY29tZTogdGhpcy5faW5jb21lLFxuICAgICAgICAgICAgaW5jb21lVGF4OiB0aGlzLnJvdW5kKGdyb3NzVGF4KSxcbiAgICAgICAgICAgIHNvY2lhbFNlY3VyaXR5OiB0aGlzLnJvdW5kKHNvY2lhbFNlY3VyaXR5KSxcbiAgICAgICAgICAgIG1lZGljYXJlOiB0aGlzLnJvdW5kKG1lZGljYXJlKSxcbiAgICAgICAgICAgIHN0YW5kYXJkRGVkdWN0aW9uLFxuICAgICAgICAgICAgdG90YWxEZWR1Y3Rpb25zOiB0aGlzLnJvdW5kKHRvdGFsRGVkdWN0aW9ucyksXG4gICAgICAgICAgICBuZXRJbmNvbWU6IHRoaXMucm91bmQobmV0SW5jb21lKSxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVRheFJhdGU6IHRoaXMuX2luY29tZSA+IDAgPyB0aGlzLnJvdW5kKGdyb3NzVGF4IC8gdGhpcy5faW5jb21lLCA0KSA6IDAsXG4gICAgICAgICAgICB0YXhCcmFja2V0QnJlYWtkb3duOiBicmFja2V0QnJlYWtkb3duLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29tcHV0ZVRheEJyYWNrZXRzKFxuICAgICAgICB0YXhhYmxlSW5jb21lOiBudW1iZXIsXG4gICAgKTogeyBncm9zc1RheDogbnVtYmVyOyBicmFja2V0QnJlYWtkb3duOiBCcmFja2V0QWxsb2NhdGlvbltdIH0ge1xuICAgICAgICBsZXQgdGF4ID0gMDtcbiAgICAgICAgY29uc3QgYnJhY2tldEJyZWFrZG93bjogQnJhY2tldEFsbG9jYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9ydWxlcy50YXhCcmFja2V0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJyYWNrZXQgPSB0aGlzLl9ydWxlcy50YXhCcmFja2V0c1tpbmRleF07XG5cbiAgICAgICAgICAgIGlmICh0YXhhYmxlSW5jb21lIDw9IGJyYWNrZXQuZnJvbSkge1xuICAgICAgICAgICAgICAgIGJyYWNrZXRCcmVha2Rvd24ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXRJbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXROYW1lOiBgQnJhY2tldCAke2luZGV4ICsgMX1gLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBicmFja2V0LmZyb20sXG4gICAgICAgICAgICAgICAgICAgIHRvOiBicmFja2V0LnRvID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50SW5CcmFja2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0YXhPbkFtb3VudDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdXBwZXIgPSBicmFja2V0LnRvID8/IHRheGFibGVJbmNvbWU7XG4gICAgICAgICAgICBjb25zdCB0YXhhYmxlQW1vdW50ID0gTWF0aC5taW4odXBwZXIsIHRheGFibGVJbmNvbWUpIC0gYnJhY2tldC5mcm9tO1xuXG4gICAgICAgICAgICBpZiAodGF4YWJsZUFtb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXhPbkFtb3VudCA9IHRheGFibGVBbW91bnQgKiBicmFja2V0LnJhdGU7XG4gICAgICAgICAgICAgICAgdGF4ICs9IHRheE9uQW1vdW50O1xuICAgICAgICAgICAgICAgIGJyYWNrZXRCcmVha2Rvd24ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXRJbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGJyYWNrZXROYW1lOiBgQnJhY2tldCAke2luZGV4ICsgMX1gLFxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBicmFja2V0LmZyb20sXG4gICAgICAgICAgICAgICAgICAgIHRvOiBicmFja2V0LnRvID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJhdGU6IGJyYWNrZXQucmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50SW5CcmFja2V0OiB0YXhhYmxlQW1vdW50LFxuICAgICAgICAgICAgICAgICAgICB0YXhPbkFtb3VudCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJhY2tldEJyZWFrZG93bi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgYnJhY2tldEluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgYnJhY2tldE5hbWU6IGBCcmFja2V0ICR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgICAgICAgICAgIGZyb206IGJyYWNrZXQuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgdG86IGJyYWNrZXQudG8gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmF0ZTogYnJhY2tldC5yYXRlLFxuICAgICAgICAgICAgICAgICAgICBhbW91bnRJbkJyYWNrZXQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRheE9uQW1vdW50OiAwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZ3Jvc3NUYXg6IHRheCwgYnJhY2tldEJyZWFrZG93biB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29tcHV0ZUZJQ0EoXG4gICAgICAgIGluY29tZTogbnVtYmVyLFxuICAgICAgICBydWxlczogRklDQUNvbnRyaWJ1dGlvblJ1bGVzLFxuICAgICk6IHsgc29jaWFsU2VjdXJpdHk6IG51bWJlcjsgbWVkaWNhcmU6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3Qgc29jaWFsU2VjdXJpdHkgPVxuICAgICAgICAgICAgTWF0aC5taW4oaW5jb21lLCBydWxlcy5zb2NpYWxTZWN1cml0eS53YWdlQmFzZSkgKiBydWxlcy5zb2NpYWxTZWN1cml0eS5yYXRlO1xuXG4gICAgICAgIGNvbnN0IHJlZ3VsYXJNZWRpY2FyZSA9IGluY29tZSAqIHJ1bGVzLm1lZGljYXJlLnJhdGU7XG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxNZWRpY2FyZSA9XG4gICAgICAgICAgICBpbmNvbWUgPiBydWxlcy5tZWRpY2FyZS5hZGRpdGlvbmFsVGhyZXNob2xkXG4gICAgICAgICAgICAgICAgPyAoaW5jb21lIC0gcnVsZXMubWVkaWNhcmUuYWRkaXRpb25hbFRocmVzaG9sZCkgKiBydWxlcy5tZWRpY2FyZS5hZGRpdGlvbmFsUmF0ZVxuICAgICAgICAgICAgICAgIDogMDtcblxuICAgICAgICByZXR1cm4geyBzb2NpYWxTZWN1cml0eSwgbWVkaWNhcmU6IHJlZ3VsYXJNZWRpY2FyZSArIGFkZGl0aW9uYWxNZWRpY2FyZSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgcm91bmQodmFsdWU6IG51bWJlciwgZGVjaW1hbHMgPSAyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZS50b0ZpeGVkKGRlY2ltYWxzKSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW5jb21lLXRheC91c2EvZG9tYWluL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmFja2V0QWxsb2NhdGlvbiwgVGF4QnJhY2tldCB9IGZyb20gXCIuLi8uLi9kb21haW4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVUYXhSdWxlcyB7XG4gICAgdGF4QnJhY2tldHM6IFRheEJyYWNrZXRbXTtcbiAgICBzdGFuZGFyZERlZHVjdGlvbjogeyBhbW91bnQ6IG51bWJlciB9O1xuICAgIGZpY2E6IEZJQ0FDb250cmlidXRpb25SdWxlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGSUNBQ29udHJpYnV0aW9uUnVsZXMge1xuICAgIHNvY2lhbFNlY3VyaXR5OiB7IHJhdGU6IG51bWJlcjsgd2FnZUJhc2U6IG51bWJlciB9O1xuICAgIG1lZGljYXJlOiB7IHJhdGU6IG51bWJlcjsgYWRkaXRpb25hbFJhdGU6IG51bWJlcjsgYWRkaXRpb25hbFRocmVzaG9sZDogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMge1xuICAgIGdyb3NzSW5jb21lOiBudW1iZXI7XG4gICAgaW5jb21lVGF4OiBudW1iZXI7XG4gICAgc29jaWFsU2VjdXJpdHk6IG51bWJlcjtcbiAgICBtZWRpY2FyZTogbnVtYmVyO1xuICAgIHN0YW5kYXJkRGVkdWN0aW9uOiBudW1iZXI7XG4gICAgdG90YWxEZWR1Y3Rpb25zOiBudW1iZXI7XG4gICAgbmV0SW5jb21lOiBudW1iZXI7XG4gICAgZWZmZWN0aXZlVGF4UmF0ZTogbnVtYmVyO1xuICAgIHRheEJyYWNrZXRCcmVha2Rvd246IEJyYWNrZXRBbGxvY2F0aW9uW107XG59XG4iXX0=