@equisoft/tax-us 0.0.1-snapshot.20250723132536

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 (82) hide show
  1. package/.eslintrc.json +42 -0
  2. package/.tool-versions +1 -0
  3. package/Makefile +28 -0
  4. package/README.md +113 -0
  5. package/RELEASE.md +29 -0
  6. package/babel.config.js +1 -0
  7. package/dist/index.d.ts +5 -0
  8. package/dist/index.js +21 -0
  9. package/dist/investments/index.d.ts +6 -0
  10. package/dist/investments/index.js +22 -0
  11. package/dist/investments/life-income-fund.d.ts +11 -0
  12. package/dist/investments/life-income-fund.js +291 -0
  13. package/dist/investments/non-registered-savings-plan.d.ts +3 -0
  14. package/dist/investments/non-registered-savings-plan.js +30 -0
  15. package/dist/investments/registered-education-savings-plan/beneficiary.d.ts +4 -0
  16. package/dist/investments/registered-education-savings-plan/beneficiary.js +16 -0
  17. package/dist/investments/registered-education-savings-plan/british-columbia-training-and-education-savings-grant.d.ts +10 -0
  18. package/dist/investments/registered-education-savings-plan/british-columbia-training-and-education-savings-grant.js +21 -0
  19. package/dist/investments/registered-education-savings-plan/canada-education-savings-grant.d.ts +2 -0
  20. package/dist/investments/registered-education-savings-plan/canada-education-savings-grant.js +23 -0
  21. package/dist/investments/registered-education-savings-plan/canada-learning-bond.d.ts +12 -0
  22. package/dist/investments/registered-education-savings-plan/canada-learning-bond.js +19 -0
  23. package/dist/investments/registered-education-savings-plan/income-level.d.ts +11 -0
  24. package/dist/investments/registered-education-savings-plan/income-level.js +32 -0
  25. package/dist/investments/registered-education-savings-plan/index.d.ts +7 -0
  26. package/dist/investments/registered-education-savings-plan/index.js +23 -0
  27. package/dist/investments/registered-education-savings-plan/quebec-education-savings-incentive.d.ts +2 -0
  28. package/dist/investments/registered-education-savings-plan/quebec-education-savings-incentive.js +17 -0
  29. package/dist/investments/registered-education-savings-plan/savings-grant.d.ts +25 -0
  30. package/dist/investments/registered-education-savings-plan/savings-grant.js +51 -0
  31. package/dist/investments/registered-education-savings-plan/tuition-fees.d.ts +6 -0
  32. package/dist/investments/registered-education-savings-plan/tuition-fees.js +33 -0
  33. package/dist/investments/registered-retirement-income-fund.d.ts +7 -0
  34. package/dist/investments/registered-retirement-income-fund.js +68 -0
  35. package/dist/investments/registered-retirement-savings-plan.d.ts +9 -0
  36. package/dist/investments/registered-retirement-savings-plan.js +20 -0
  37. package/dist/investments/tax-free-savings-account.d.ts +7 -0
  38. package/dist/investments/tax-free-savings-account.js +21 -0
  39. package/dist/misc/code-types.d.ts +11 -0
  40. package/dist/misc/code-types.js +19 -0
  41. package/dist/misc/consumer-price-index.d.ts +34 -0
  42. package/dist/misc/consumer-price-index.js +240 -0
  43. package/dist/misc/index.d.ts +5 -0
  44. package/dist/misc/index.js +21 -0
  45. package/dist/misc/ipf-stats.d.ts +18 -0
  46. package/dist/misc/ipf-stats.js +25 -0
  47. package/dist/misc/life-expectancy.d.ts +28 -0
  48. package/dist/misc/life-expectancy.js +58 -0
  49. package/dist/misc/ppp-increase-factor.d.ts +10 -0
  50. package/dist/misc/ppp-increase-factor.js +25 -0
  51. package/dist/pension/canada-pension-plan.d.ts +2 -0
  52. package/dist/pension/canada-pension-plan.js +176 -0
  53. package/dist/pension/index.d.ts +5 -0
  54. package/dist/pension/index.js +21 -0
  55. package/dist/pension/old-age-security.d.ts +21 -0
  56. package/dist/pension/old-age-security.js +70 -0
  57. package/dist/pension/public-pension-plan.d.ts +63 -0
  58. package/dist/pension/public-pension-plan.js +2 -0
  59. package/dist/pension/quebec-pension-plan.d.ts +2 -0
  60. package/dist/pension/quebec-pension-plan.js +176 -0
  61. package/dist/pension/supplemental-pension-plan.d.ts +5 -0
  62. package/dist/pension/supplemental-pension-plan.js +14 -0
  63. package/dist/taxes/dividend-credit.d.ts +8 -0
  64. package/dist/taxes/dividend-credit.js +45 -0
  65. package/dist/taxes/employment-insurance.d.ts +9 -0
  66. package/dist/taxes/employment-insurance.js +20 -0
  67. package/dist/taxes/income-tax.d.ts +39 -0
  68. package/dist/taxes/income-tax.js +593 -0
  69. package/dist/taxes/index.d.ts +4 -0
  70. package/dist/taxes/index.js +20 -0
  71. package/dist/taxes/quebec-parental-insurance-plan.d.ts +9 -0
  72. package/dist/taxes/quebec-parental-insurance-plan.js +17 -0
  73. package/dist/utils/collections.d.ts +1 -0
  74. package/dist/utils/collections.js +7 -0
  75. package/dist/utils/date.d.ts +3 -0
  76. package/dist/utils/date.js +18 -0
  77. package/dist/utils/index.d.ts +3 -0
  78. package/dist/utils/index.js +19 -0
  79. package/dist/utils/math.d.ts +2 -0
  80. package/dist/utils/math.js +16 -0
  81. package/package.json +68 -0
  82. package/tsconfig.json +21 -0
@@ -0,0 +1,593 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TAX_BRACKETS = exports.CA_LOWEST_TAX_RATE_2025 = void 0;
4
+ exports.getTaxAmount = getTaxAmount;
5
+ exports.getRate = getRate;
6
+ exports.getTaxRates = getTaxRates;
7
+ exports.getFederalTaxRates = getFederalTaxRates;
8
+ exports.getFederalBaseTaxAmount = getFederalBaseTaxAmount;
9
+ exports.getFederalTaxCreditRate = getFederalTaxCreditRate;
10
+ exports.getFederalBaseCredit = getFederalBaseCredit;
11
+ exports.getProvincialAbatement = getProvincialAbatement;
12
+ exports.getFederalTaxAmount = getFederalTaxAmount;
13
+ exports.getProvincialSurtaxAmount = getProvincialSurtaxAmount;
14
+ exports.getProvincialBaseTaxAmount = getProvincialBaseTaxAmount;
15
+ exports.getProvincialBaseCredit = getProvincialBaseCredit;
16
+ exports.getProvincialTaxAmount = getProvincialTaxAmount;
17
+ exports.getFederalMarginalRate = getFederalMarginalRate;
18
+ exports.getProvincialMarginalRate = getProvincialMarginalRate;
19
+ exports.getTotalMarginalRate = getTotalMarginalRate;
20
+ exports.getMaxProvincialMarginalRate = getMaxProvincialMarginalRate;
21
+ exports.getMaxFederalMarginalRate = getMaxFederalMarginalRate;
22
+ exports.getTotalMaxMarginalRate = getTotalMaxMarginalRate;
23
+ exports.getTotalTaxAmount = getTotalTaxAmount;
24
+ exports.getEffectiveRate = getEffectiveRate;
25
+ /*
26
+ Sources
27
+ http://www.taxtips.ca/marginaltaxrates.htm
28
+ Abattement QC: http://www.cra-arc.gc.ca/tx/ndvdls/tpcs/ncm-tx/rtrn/cmpltng/ddctns/lns409-485/440-fra.html
29
+
30
+ Revised
31
+ 2024-12-24
32
+ */
33
+ const misc_1 = require("../misc");
34
+ const utils_1 = require("../utils");
35
+ exports.CA_LOWEST_TAX_RATE_2025 = 0.145;
36
+ exports.TAX_BRACKETS = {
37
+ CA: {
38
+ ABATEMENT: 0,
39
+ TAX_CREDIT_RATE: 0.14,
40
+ BASE_TAX_CREDIT: 16129,
41
+ RATES: [{
42
+ FROM: 0,
43
+ TO: 57375,
44
+ RATE: 0.14,
45
+ }, {
46
+ FROM: 57375,
47
+ TO: 114750,
48
+ RATE: 0.205,
49
+ }, {
50
+ FROM: 114750,
51
+ TO: 177882,
52
+ RATE: 0.26,
53
+ }, {
54
+ FROM: 177882,
55
+ TO: 253414,
56
+ RATE: 0.2932,
57
+ }, {
58
+ FROM: 253414,
59
+ TO: 999999999,
60
+ RATE: 0.33,
61
+ }],
62
+ SURTAX_RATES: [{
63
+ FROM: 0,
64
+ TO: 999999999,
65
+ RATE: 0,
66
+ }],
67
+ },
68
+ AB: {
69
+ ABATEMENT: 0,
70
+ TAX_CREDIT_RATE: 0.10,
71
+ BASE_TAX_CREDIT: 22323,
72
+ RATES: [{
73
+ FROM: 0,
74
+ TO: 151234,
75
+ RATE: 0.10,
76
+ }, {
77
+ FROM: 151234,
78
+ TO: 181481,
79
+ RATE: 0.12,
80
+ }, {
81
+ FROM: 181481,
82
+ TO: 241974,
83
+ RATE: 0.13,
84
+ }, {
85
+ FROM: 241974,
86
+ TO: 362961,
87
+ RATE: 0.14,
88
+ }, {
89
+ FROM: 362961,
90
+ TO: 999999999,
91
+ RATE: 0.15,
92
+ }],
93
+ SURTAX_RATES: [{
94
+ FROM: 0,
95
+ TO: 999999999,
96
+ RATE: 0,
97
+ }],
98
+ },
99
+ BC: {
100
+ ABATEMENT: 0,
101
+ TAX_CREDIT_RATE: 0.0506,
102
+ BASE_TAX_CREDIT: 12932,
103
+ RATES: [{
104
+ FROM: 0,
105
+ TO: 49279,
106
+ RATE: 0.0506,
107
+ }, {
108
+ FROM: 49279,
109
+ TO: 98560,
110
+ RATE: 0.077,
111
+ }, {
112
+ FROM: 98560,
113
+ TO: 113158,
114
+ RATE: 0.105,
115
+ }, {
116
+ FROM: 113158,
117
+ TO: 137407,
118
+ RATE: 0.1229,
119
+ }, {
120
+ FROM: 137407,
121
+ TO: 186306,
122
+ RATE: 0.147,
123
+ }, {
124
+ FROM: 186306,
125
+ TO: 259829,
126
+ RATE: 0.168,
127
+ }, {
128
+ FROM: 259829,
129
+ TO: 999999999,
130
+ RATE: 0.205,
131
+ }],
132
+ SURTAX_RATES: [{
133
+ FROM: 0,
134
+ TO: 999999999,
135
+ RATE: 0,
136
+ }],
137
+ },
138
+ MB: {
139
+ ABATEMENT: 0,
140
+ TAX_CREDIT_RATE: 0.108,
141
+ BASE_TAX_CREDIT: 15969,
142
+ RATES: [{
143
+ FROM: 0,
144
+ TO: 47564,
145
+ RATE: 0.108,
146
+ }, {
147
+ FROM: 47564,
148
+ TO: 101200,
149
+ RATE: 0.1275,
150
+ }, {
151
+ FROM: 101200,
152
+ TO: 999999999,
153
+ RATE: 0.174,
154
+ }],
155
+ SURTAX_RATES: [{
156
+ FROM: 0,
157
+ TO: 999999999,
158
+ RATE: 0,
159
+ }],
160
+ },
161
+ NB: {
162
+ ABATEMENT: 0,
163
+ TAX_CREDIT_RATE: 0.094,
164
+ BASE_TAX_CREDIT: 13396,
165
+ RATES: [{
166
+ FROM: 0,
167
+ TO: 51306,
168
+ RATE: 0.0940,
169
+ }, {
170
+ FROM: 51306,
171
+ TO: 102614,
172
+ RATE: 0.14,
173
+ }, {
174
+ FROM: 102614,
175
+ TO: 190060,
176
+ RATE: 0.16,
177
+ }, {
178
+ FROM: 190060,
179
+ TO: 999999999,
180
+ RATE: 0.195,
181
+ }],
182
+ SURTAX_RATES: [{
183
+ FROM: 0,
184
+ TO: 999999999,
185
+ RATE: 0,
186
+ }],
187
+ },
188
+ NL: {
189
+ ABATEMENT: 0,
190
+ TAX_CREDIT_RATE: 0.087,
191
+ BASE_TAX_CREDIT: 11067,
192
+ RATES: [{
193
+ FROM: 0,
194
+ TO: 44192,
195
+ RATE: 0.087,
196
+ }, {
197
+ FROM: 44192,
198
+ TO: 88382,
199
+ RATE: 0.145,
200
+ }, {
201
+ FROM: 88382,
202
+ TO: 157792,
203
+ RATE: 0.158,
204
+ }, {
205
+ FROM: 157792,
206
+ TO: 220910,
207
+ RATE: 0.178,
208
+ }, {
209
+ FROM: 220910,
210
+ TO: 282214,
211
+ RATE: 0.198,
212
+ }, {
213
+ FROM: 282214,
214
+ TO: 564429,
215
+ RATE: 0.208,
216
+ }, {
217
+ FROM: 564429,
218
+ TO: 1128858,
219
+ RATE: 0.213,
220
+ }, {
221
+ FROM: 1128858,
222
+ TO: 999999999,
223
+ RATE: 0.218,
224
+ }],
225
+ SURTAX_RATES: [{
226
+ FROM: 0,
227
+ TO: 999999999,
228
+ RATE: 0,
229
+ }],
230
+ },
231
+ NS: {
232
+ ABATEMENT: 0,
233
+ TAX_CREDIT_RATE: 0.0879,
234
+ BASE_TAX_CREDIT: 8744,
235
+ RATES: [{
236
+ FROM: 0,
237
+ TO: 30507,
238
+ RATE: 0.0879,
239
+ }, {
240
+ FROM: 30507,
241
+ TO: 61015,
242
+ RATE: 0.1495,
243
+ }, {
244
+ FROM: 61015,
245
+ TO: 95883,
246
+ RATE: 0.1667,
247
+ }, {
248
+ FROM: 95883,
249
+ TO: 154650,
250
+ RATE: 0.175,
251
+ }, {
252
+ FROM: 154650,
253
+ TO: 999999999,
254
+ RATE: 0.21,
255
+ }],
256
+ SURTAX_RATES: [{
257
+ FROM: 0,
258
+ TO: 999999999,
259
+ RATE: 0,
260
+ }],
261
+ },
262
+ PE: {
263
+ ABATEMENT: 0,
264
+ TAX_CREDIT_RATE: 0.095,
265
+ BASE_TAX_CREDIT: 14250,
266
+ RATES: [{
267
+ FROM: 0,
268
+ TO: 33328,
269
+ RATE: 0.095,
270
+ }, {
271
+ FROM: 33328,
272
+ TO: 64656,
273
+ RATE: 0.1347,
274
+ }, {
275
+ FROM: 64656,
276
+ TO: 105000,
277
+ RATE: 0.166,
278
+ }, {
279
+ FROM: 105000,
280
+ TO: 140000,
281
+ RATE: 0.1762,
282
+ }, {
283
+ FROM: 140000,
284
+ TO: 999999999,
285
+ RATE: 0.19,
286
+ }],
287
+ SURTAX_RATES: [{
288
+ FROM: 0,
289
+ TO: 999999999,
290
+ RATE: 0,
291
+ }],
292
+ },
293
+ ON: {
294
+ ABATEMENT: 0,
295
+ TAX_CREDIT_RATE: 0.0505,
296
+ BASE_TAX_CREDIT: 12747,
297
+ RATES: [{
298
+ FROM: 0,
299
+ TO: 52886,
300
+ RATE: 0.0505,
301
+ }, {
302
+ FROM: 52886,
303
+ TO: 105775,
304
+ RATE: 0.0915,
305
+ }, {
306
+ FROM: 105775,
307
+ TO: 150000,
308
+ RATE: 0.1116,
309
+ }, {
310
+ FROM: 150000,
311
+ TO: 220000,
312
+ RATE: 0.1216,
313
+ }, {
314
+ FROM: 220000,
315
+ TO: 999999999,
316
+ RATE: 0.1316,
317
+ }],
318
+ SURTAX_RATES: [{
319
+ FROM: 0,
320
+ TO: 5710,
321
+ RATE: 0,
322
+ }, {
323
+ FROM: 5710,
324
+ TO: 7307,
325
+ RATE: 0.20,
326
+ }, {
327
+ FROM: 7307,
328
+ TO: 999999999,
329
+ RATE: 0.56, // 0.20 + 0.36
330
+ }],
331
+ },
332
+ QC: {
333
+ ABATEMENT: 0.165,
334
+ TAX_CREDIT_RATE: 0.14,
335
+ BASE_TAX_CREDIT: 18571,
336
+ RATES: [{
337
+ FROM: 0,
338
+ TO: 53255,
339
+ RATE: 0.14,
340
+ }, {
341
+ FROM: 53255,
342
+ TO: 106495,
343
+ RATE: 0.19,
344
+ }, {
345
+ FROM: 106495,
346
+ TO: 129590,
347
+ RATE: 0.24,
348
+ }, {
349
+ FROM: 129590,
350
+ TO: 999999999,
351
+ RATE: 0.2575,
352
+ }],
353
+ SURTAX_RATES: [{
354
+ FROM: 0,
355
+ TO: 999999999,
356
+ RATE: 0,
357
+ }],
358
+ },
359
+ SK: {
360
+ ABATEMENT: 0,
361
+ TAX_CREDIT_RATE: 0.105,
362
+ BASE_TAX_CREDIT: 18991,
363
+ RATES: [{
364
+ FROM: 0,
365
+ TO: 53463,
366
+ RATE: 0.105,
367
+ }, {
368
+ FROM: 53463,
369
+ TO: 152750,
370
+ RATE: 0.125,
371
+ }, {
372
+ FROM: 152750,
373
+ TO: 999999999,
374
+ RATE: 0.145,
375
+ }],
376
+ SURTAX_RATES: [{
377
+ FROM: 0,
378
+ TO: 999999999,
379
+ RATE: 0,
380
+ }],
381
+ },
382
+ NT: {
383
+ ABATEMENT: 0,
384
+ TAX_CREDIT_RATE: 0.059,
385
+ BASE_TAX_CREDIT: 17842,
386
+ RATES: [{
387
+ FROM: 0,
388
+ TO: 51964,
389
+ RATE: 0.059,
390
+ }, {
391
+ FROM: 51964,
392
+ TO: 103930,
393
+ RATE: 0.086,
394
+ }, {
395
+ FROM: 103930,
396
+ TO: 168967,
397
+ RATE: 0.122,
398
+ }, {
399
+ FROM: 168967,
400
+ TO: 999999999,
401
+ RATE: 0.1405,
402
+ }],
403
+ SURTAX_RATES: [{
404
+ FROM: 0,
405
+ TO: 999999999,
406
+ RATE: 0,
407
+ }],
408
+ },
409
+ NU: {
410
+ ABATEMENT: 0,
411
+ TAX_CREDIT_RATE: 0.04,
412
+ BASE_TAX_CREDIT: 19274,
413
+ RATES: [{
414
+ FROM: 0,
415
+ TO: 54707,
416
+ RATE: 0.04,
417
+ }, {
418
+ FROM: 54707,
419
+ TO: 109413,
420
+ RATE: 0.07,
421
+ }, {
422
+ FROM: 109413,
423
+ TO: 177881,
424
+ RATE: 0.09,
425
+ }, {
426
+ FROM: 177881,
427
+ TO: 999999999,
428
+ RATE: 0.115,
429
+ }],
430
+ SURTAX_RATES: [{
431
+ FROM: 0,
432
+ TO: 999999999,
433
+ RATE: 0,
434
+ }],
435
+ },
436
+ YT: {
437
+ ABATEMENT: 0,
438
+ TAX_CREDIT_RATE: 0.064,
439
+ BASE_TAX_CREDIT: 14538,
440
+ RATES: [{
441
+ FROM: 0,
442
+ TO: 57375,
443
+ RATE: 0.064,
444
+ }, {
445
+ FROM: 57375,
446
+ TO: 114750,
447
+ RATE: 0.09,
448
+ }, {
449
+ FROM: 114750,
450
+ TO: 177882,
451
+ RATE: 0.109,
452
+ }, {
453
+ FROM: 177882,
454
+ TO: 253414,
455
+ RATE: 0.1293,
456
+ }, {
457
+ FROM: 253414,
458
+ TO: 500000,
459
+ RATE: 0.128,
460
+ }, {
461
+ FROM: 500000,
462
+ TO: 999999999,
463
+ RATE: 0.15,
464
+ }],
465
+ SURTAX_RATES: [{
466
+ FROM: 0,
467
+ TO: 999999999,
468
+ RATE: 0,
469
+ }],
470
+ },
471
+ };
472
+ function inflate(amount, inflationRate, yearsToInflate) {
473
+ return amount * (Math.pow((1 + inflationRate), yearsToInflate));
474
+ }
475
+ function getTaxAmount(rates, income, inflationRate, yearsToInflate) {
476
+ const reducer = (previous, current) => {
477
+ const bracketFrom = inflate(current.FROM, inflationRate, yearsToInflate);
478
+ const bracketTo = inflate(current.TO, inflationRate, yearsToInflate);
479
+ const bracketTax = bracketFrom < income ? (Math.min(income, bracketTo) - bracketFrom) * current.RATE : 0;
480
+ return previous + bracketTax;
481
+ };
482
+ return rates.reduce(reducer, 0);
483
+ }
484
+ function getRate(brackets, grossIncome, inflationRate, yearsToInflate) {
485
+ const reducer = (previous, current) => {
486
+ const bracketFrom = inflate(current.FROM, inflationRate, yearsToInflate);
487
+ return bracketFrom < grossIncome ? current.RATE : previous;
488
+ };
489
+ return brackets.reduce(reducer, 0);
490
+ }
491
+ function getTaxRates(code) {
492
+ return structuredClone(exports.TAX_BRACKETS[code].RATES);
493
+ }
494
+ function getAbatement(code) {
495
+ return exports.TAX_BRACKETS[code].ABATEMENT;
496
+ }
497
+ function getSurtaxRates(code) {
498
+ return structuredClone(exports.TAX_BRACKETS[code].SURTAX_RATES);
499
+ }
500
+ function getFederalTaxRates(yearsToInflate) {
501
+ const rates = getTaxRates(misc_1.FEDERAL_CODE);
502
+ const shouldUse2025Rate = yearsToInflate === 0 && (0, utils_1.now)().getFullYear() === 2025;
503
+ if (shouldUse2025Rate) {
504
+ rates[0].RATE = exports.CA_LOWEST_TAX_RATE_2025;
505
+ }
506
+ return rates;
507
+ }
508
+ function getFederalBaseTaxAmount(grossIncome, inflationRate = 0, yearsToInflate = 0) {
509
+ return getTaxAmount(getFederalTaxRates(yearsToInflate), grossIncome, inflationRate, yearsToInflate);
510
+ }
511
+ function getFederalTaxCreditRate(yearsToInflate) {
512
+ const shouldUse2025Rate = yearsToInflate === 0 && (0, utils_1.now)().getFullYear() === 2025;
513
+ return shouldUse2025Rate ? exports.CA_LOWEST_TAX_RATE_2025 : exports.TAX_BRACKETS.CA.TAX_CREDIT_RATE;
514
+ }
515
+ function getFederalBaseCredit(inflationRate, yearsToInflate) {
516
+ const baseTaxCredit = exports.TAX_BRACKETS.CA.BASE_TAX_CREDIT * getFederalTaxCreditRate(yearsToInflate);
517
+ return inflate(baseTaxCredit, inflationRate, yearsToInflate);
518
+ }
519
+ function getProvincialAbatement(province, federalTaxAmount) {
520
+ return getAbatement(province) * federalTaxAmount;
521
+ }
522
+ function getFederalTaxAmount(provincialCode, grossIncome, inflationRate = 0, yearsToInflate = 0, taxCredit = 0) {
523
+ const federalBaseTaxAmount = getFederalBaseTaxAmount(grossIncome, inflationRate, yearsToInflate);
524
+ const baseCredit = getFederalBaseCredit(inflationRate, yearsToInflate);
525
+ const federalTax = Math.max(federalBaseTaxAmount - baseCredit - taxCredit, 0);
526
+ const abatement = getProvincialAbatement(provincialCode, federalTax);
527
+ return Math.max(federalTax - abatement, 0);
528
+ }
529
+ function getProvincialSurtaxAmount(province, baseTaxAmount, inflationRate = 0, yearsToInflate = 0) {
530
+ return getTaxAmount(getSurtaxRates(province), baseTaxAmount, inflationRate, yearsToInflate);
531
+ }
532
+ function getProvincialBaseTaxAmount(province, grossIncome, inflationRate = 0, yearsToInflate = 0) {
533
+ return getTaxAmount(getTaxRates(province), grossIncome, inflationRate, yearsToInflate);
534
+ }
535
+ function getProvincialBaseCredit(province, inflationRate, yearsToInflate) {
536
+ const baseTaxCredit = exports.TAX_BRACKETS[province].BASE_TAX_CREDIT * exports.TAX_BRACKETS[province].RATES[0].RATE;
537
+ return inflate(baseTaxCredit, inflationRate, yearsToInflate);
538
+ }
539
+ function getProvincialTaxAmount(province, grossIncome, inflationRate = 0, yearsToInflate = 0, taxCredit = 0) {
540
+ const baseTaxAmount = getProvincialBaseTaxAmount(province, grossIncome, inflationRate, yearsToInflate);
541
+ const baseCredit = getProvincialBaseCredit(province, inflationRate, yearsToInflate);
542
+ const tax = Math.max(baseTaxAmount - baseCredit, 0);
543
+ const surTax = getProvincialSurtaxAmount(province, tax, inflationRate, yearsToInflate);
544
+ return Math.max(tax + surTax - taxCredit, 0);
545
+ }
546
+ function getFederalMarginalRate(provincialCode, grossIncome, inflationRate = 0, yearsToInflate = 0) {
547
+ const brackets = getTaxRates(misc_1.FEDERAL_CODE);
548
+ const rate = getRate(brackets, grossIncome, inflationRate, yearsToInflate);
549
+ return rate * (1 - getAbatement(provincialCode));
550
+ }
551
+ function getProvincialMarginalRate(provincialCode, grossIncome, inflationRate = 0, yearsToInflate = 0) {
552
+ const taxAmount = getProvincialTaxAmount(provincialCode, grossIncome, inflationRate, yearsToInflate);
553
+ const taxCredit = getProvincialBaseCredit(provincialCode, inflationRate, yearsToInflate);
554
+ const provincialTaxAmount = Math.max(taxAmount - taxCredit, 0);
555
+ const taxBrackets = getTaxRates(provincialCode);
556
+ const surtaxBrackets = getSurtaxRates(provincialCode);
557
+ const taxRate = getRate(taxBrackets, grossIncome, inflationRate, yearsToInflate);
558
+ const surtaxRate = getRate(surtaxBrackets, provincialTaxAmount, inflationRate, yearsToInflate);
559
+ return taxRate + (taxRate * surtaxRate);
560
+ }
561
+ function getTotalMarginalRate(provincialCode, grossIncome, inflationRate = 0, yearsToInflate = 0) {
562
+ const provRate = getProvincialMarginalRate(provincialCode, grossIncome, inflationRate, yearsToInflate);
563
+ const fedRate = getFederalMarginalRate(provincialCode, grossIncome, inflationRate, yearsToInflate);
564
+ return (0, utils_1.roundToPrecision)(provRate + fedRate, 4);
565
+ }
566
+ function getMaxProvincialMarginalRate(provincialCode) {
567
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
568
+ const marginalRate = (0, utils_1.maxBy)(getTaxRates(provincialCode), (bracket) => bracket.TO).RATE;
569
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
570
+ const surtaxRate = (0, utils_1.maxBy)(getSurtaxRates(provincialCode), (bracket) => bracket.TO).RATE;
571
+ return marginalRate + (marginalRate * surtaxRate);
572
+ }
573
+ function getMaxFederalMarginalRate(provincialCode) {
574
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
575
+ const maxRate = (0, utils_1.maxBy)(getTaxRates(misc_1.FEDERAL_CODE), (bracket) => bracket.TO).RATE;
576
+ return maxRate * (1 - getAbatement(provincialCode));
577
+ }
578
+ function getTotalMaxMarginalRate(provincialCode) {
579
+ const provRate = getMaxProvincialMarginalRate(provincialCode);
580
+ const fedRate = getMaxFederalMarginalRate(provincialCode);
581
+ return (0, utils_1.roundToPrecision)(provRate + fedRate, 4);
582
+ }
583
+ function getTotalTaxAmount(provincialCode, grossIncome, inflationRate = 0, yearsToInflate = 0) {
584
+ const provTax = getProvincialTaxAmount(provincialCode, grossIncome, inflationRate, yearsToInflate);
585
+ const fedTax = getFederalTaxAmount(provincialCode, grossIncome, inflationRate, yearsToInflate);
586
+ return Math.max(provTax, 0) + Math.max(fedTax, 0);
587
+ }
588
+ function getEffectiveRate(province, income, inflationRate = 0, yearsToInflate = 0) {
589
+ if (income <= 0) {
590
+ return 0;
591
+ }
592
+ return (getTotalTaxAmount(province, income, inflationRate, yearsToInflate)) / income;
593
+ }
@@ -0,0 +1,4 @@
1
+ export * from './dividend-credit';
2
+ export * from './employment-insurance';
3
+ export * from './income-tax';
4
+ export * from './quebec-parental-insurance-plan';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./dividend-credit"), exports);
18
+ __exportStar(require("./employment-insurance"), exports);
19
+ __exportStar(require("./income-tax"), exports);
20
+ __exportStar(require("./quebec-parental-insurance-plan"), exports);
@@ -0,0 +1,9 @@
1
+ export interface PremiumRates {
2
+ SELF_EMPLOYED: number;
3
+ SALARIED: number;
4
+ }
5
+ export interface QuebecParentalInsurancePlan {
6
+ MAX_INSURABLE_EARNINGS: number;
7
+ PREMIUM_RATES: PremiumRates;
8
+ }
9
+ export declare const QPIP: QuebecParentalInsurancePlan;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ /*
3
+ Sources
4
+ https://www.rqap.gouv.qc.ca/fr/a-propos-du-regime/information-generale/cotisations-et-revenu-maximal-assurable
5
+
6
+ Revised
7
+ 2024-12-24
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.QPIP = void 0;
11
+ exports.QPIP = {
12
+ MAX_INSURABLE_EARNINGS: 98000,
13
+ PREMIUM_RATES: {
14
+ SELF_EMPLOYED: 0.00878,
15
+ SALARIED: 0.00494,
16
+ },
17
+ };
@@ -0,0 +1 @@
1
+ export declare function maxBy<T>(values: T[], mapFn: ((item: T) => number)): T | undefined;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maxBy = maxBy;
4
+ function maxBy(values, mapFn) {
5
+ const max = Math.max(...values.map(mapFn));
6
+ return values.find((item) => mapFn(item) === max);
7
+ }
@@ -0,0 +1,3 @@
1
+ export declare function getMonthsDiff(firstDate: Date, secondDate: Date): number;
2
+ export declare function addYearsToDate(date: Date, years: number): Date;
3
+ export declare function now(): Date;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMonthsDiff = getMonthsDiff;
4
+ exports.addYearsToDate = addYearsToDate;
5
+ exports.now = now;
6
+ function getMonthsDiff(firstDate, secondDate) {
7
+ const monthsDiff = secondDate.getUTCMonth() - firstDate.getUTCMonth();
8
+ const yearsDiff = secondDate.getUTCFullYear() - firstDate.getUTCFullYear();
9
+ return monthsDiff + (12 * yearsDiff) - (secondDate.getUTCDate() < firstDate.getUTCDate() ? 1 : 0);
10
+ }
11
+ function addYearsToDate(date, years) {
12
+ const newDate = new Date(date.valueOf());
13
+ newDate.setUTCFullYear(date.getUTCFullYear() + years);
14
+ return newDate;
15
+ }
16
+ function now() {
17
+ return process.env.NODE_ENV === 'test' ? new Date('2020-01-01T12:00:00Z') : new Date();
18
+ }
@@ -0,0 +1,3 @@
1
+ export * from './collections';
2
+ export * from './date';
3
+ export * from './math';