@jjlmoya/utils-finance 1.29.0 → 1.30.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 (36) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/salaryEmployerCost/bibliography.astro +6 -0
  8. package/src/tool/salaryEmployerCost/bibliography.ts +16 -0
  9. package/src/tool/salaryEmployerCost/component.astro +130 -0
  10. package/src/tool/salaryEmployerCost/controller.ts +129 -0
  11. package/src/tool/salaryEmployerCost/dom-views.ts +87 -0
  12. package/src/tool/salaryEmployerCost/entry.ts +31 -0
  13. package/src/tool/salaryEmployerCost/evaluator.ts +9 -0
  14. package/src/tool/salaryEmployerCost/i18n/de.ts +159 -0
  15. package/src/tool/salaryEmployerCost/i18n/en.ts +148 -0
  16. package/src/tool/salaryEmployerCost/i18n/es.ts +148 -0
  17. package/src/tool/salaryEmployerCost/i18n/fr.ts +159 -0
  18. package/src/tool/salaryEmployerCost/i18n/id.ts +159 -0
  19. package/src/tool/salaryEmployerCost/i18n/it.ts +159 -0
  20. package/src/tool/salaryEmployerCost/i18n/ja.ts +159 -0
  21. package/src/tool/salaryEmployerCost/i18n/ko.ts +159 -0
  22. package/src/tool/salaryEmployerCost/i18n/nl.ts +159 -0
  23. package/src/tool/salaryEmployerCost/i18n/pl.ts +159 -0
  24. package/src/tool/salaryEmployerCost/i18n/pt.ts +159 -0
  25. package/src/tool/salaryEmployerCost/i18n/ru.ts +159 -0
  26. package/src/tool/salaryEmployerCost/i18n/sv.ts +159 -0
  27. package/src/tool/salaryEmployerCost/i18n/tr.ts +159 -0
  28. package/src/tool/salaryEmployerCost/i18n/zh.ts +159 -0
  29. package/src/tool/salaryEmployerCost/index.ts +11 -0
  30. package/src/tool/salaryEmployerCost/logic.test.ts +88 -0
  31. package/src/tool/salaryEmployerCost/logic.ts +133 -0
  32. package/src/tool/salaryEmployerCost/seo.astro +15 -0
  33. package/src/tool/salaryEmployerCost/spain-gross-net-salary-employer-cost-calculator.css +522 -0
  34. package/src/tool/salaryEmployerCost/storage.ts +35 -0
  35. package/src/tool/salaryEmployerCost/ui.ts +41 -0
  36. package/src/tools.ts +2 -2
@@ -0,0 +1,522 @@
1
+ :root {
2
+ --n-space: #f7f0e2;
3
+ --n-panel: #fffaf0;
4
+ --n-panel-soft: #efe5d4;
5
+ --n-ink: #1e2130;
6
+ --n-muted: #6d6672;
7
+ --n-line: #c9bfae;
8
+ --n-line-soft: #ddd3c2;
9
+ --n-net: #178f7f;
10
+ --n-irpf: #d95d43;
11
+ --n-employee: #d49b27;
12
+ --n-employer: #6258d9;
13
+ --n-night: #17152a;
14
+ --n-white: #fff;
15
+ --n-shadow: #2132;
16
+ --n-glow: rgba(98, 88, 217, 0.22);
17
+ --n-grid: rgba(30, 33, 48, 0.07);
18
+ --n-focus: #1268b3;
19
+ }
20
+
21
+ .theme-dark {
22
+ --n-space: #12111e;
23
+ --n-panel: #1a192a;
24
+ --n-panel-soft: #242238;
25
+ --n-ink: #f8f2e8;
26
+ --n-muted: #b9afbe;
27
+ --n-line: #4b475d;
28
+ --n-line-soft: #302e43;
29
+ --n-net: #49c7b2;
30
+ --n-irpf: #ff8269;
31
+ --n-employee: #f1c35f;
32
+ --n-employer: #9087ff;
33
+ --n-night: #0b0a13;
34
+ --n-white: #fff;
35
+ --n-shadow: #0006;
36
+ --n-glow: rgba(144, 135, 255, 0.28);
37
+ --n-grid: rgba(255, 255, 255, 0.05);
38
+ --n-focus: #76b9ff;
39
+ }
40
+
41
+ .salary-orbit {
42
+ --orbit-net: 59%;
43
+ --orbit-irpf: 70%;
44
+ --orbit-employee: 75%;
45
+
46
+ display: grid;
47
+ grid-template-columns: minmax(18rem, 0.88fr) minmax(26rem, 1.12fr);
48
+ min-height: 46rem;
49
+ overflow: hidden;
50
+ border: 1px solid var(--n-line);
51
+ border-radius: 2rem;
52
+ color: var(--n-ink);
53
+ background:
54
+ radial-gradient(circle at 80% 25%, var(--n-glow), transparent 30%),
55
+ linear-gradient(135deg, var(--n-space), var(--n-panel));
56
+ box-shadow: 0 1.5rem 4rem var(--n-shadow);
57
+ }
58
+
59
+ .salary-orbit button,
60
+ .salary-orbit input {
61
+ font: inherit;
62
+ }
63
+
64
+ .salary-orbit button:focus-visible,
65
+ .salary-orbit input:focus-visible {
66
+ outline: 3px solid var(--n-focus);
67
+ outline-offset: 3px;
68
+ }
69
+
70
+ .salary-orbit-console {
71
+ position: relative;
72
+ z-index: 2;
73
+ display: flex;
74
+ flex-direction: column;
75
+ gap: 1.35rem;
76
+ padding: clamp(1.5rem, 4vw, 3.25rem);
77
+ border-right: 1px solid var(--n-line);
78
+ background: linear-gradient(155deg, var(--n-panel), var(--n-panel-soft));
79
+ }
80
+
81
+ .salary-orbit-console::after {
82
+ position: absolute;
83
+ top: 4rem;
84
+ right: -0.45rem;
85
+ width: 0.8rem;
86
+ height: 8rem;
87
+ border-radius: 2rem;
88
+ background: var(--n-employer);
89
+ box-shadow: 0 0 2rem var(--n-glow);
90
+ content: "";
91
+ }
92
+
93
+ .salary-orbit-eyebrow {
94
+ color: var(--n-employer);
95
+ font-size: 0.75rem;
96
+ font-weight: 800;
97
+ letter-spacing: 0.16em;
98
+ text-transform: uppercase;
99
+ }
100
+
101
+ .salary-orbit-amount {
102
+ display: flex;
103
+ align-items: end;
104
+ justify-content: space-between;
105
+ gap: 1rem;
106
+ }
107
+
108
+ .salary-orbit-amount-field {
109
+ display: grid;
110
+ flex: 1 1 12rem;
111
+ gap: 0.35rem;
112
+ min-width: 0;
113
+ }
114
+
115
+ .salary-orbit-amount-field > span:first-child,
116
+ .salary-orbit legend,
117
+ .salary-orbit-dial small {
118
+ color: var(--n-muted);
119
+ font-size: 0.78rem;
120
+ }
121
+
122
+ .salary-orbit-number-wrap {
123
+ display: flex;
124
+ align-items: baseline;
125
+ gap: 0.35rem;
126
+ min-width: 0;
127
+ padding-block: 0.1rem;
128
+ }
129
+
130
+ .salary-orbit-number-wrap input {
131
+ appearance: textfield;
132
+ box-sizing: border-box;
133
+ width: 12rem;
134
+ max-width: 100%;
135
+ min-height: 3.35rem;
136
+ border: 0;
137
+ border-bottom: 2px solid var(--n-line);
138
+ padding: 0.2rem 0.2rem 0.35rem 0;
139
+ color: var(--n-ink);
140
+ background: transparent;
141
+ font-size: clamp(1.7rem, 3vw, 2rem);
142
+ font-weight: 800;
143
+ font-variant-numeric: tabular-nums lining-nums;
144
+ line-height: 1.15;
145
+ }
146
+
147
+ .salary-orbit-number-wrap input::-webkit-inner-spin-button,
148
+ .salary-orbit-number-wrap input::-webkit-outer-spin-button {
149
+ margin: 0;
150
+ appearance: none;
151
+ }
152
+
153
+ .salary-orbit-number-wrap b {
154
+ color: var(--n-net);
155
+ font-size: 1.4rem;
156
+ }
157
+
158
+ .salary-orbit-beam,
159
+ .salary-orbit-dial input {
160
+ width: 100%;
161
+ accent-color: var(--n-employer);
162
+ cursor: grab;
163
+ }
164
+
165
+ .salary-orbit-switch,
166
+ .salary-orbit-presets {
167
+ display: flex;
168
+ flex-wrap: wrap;
169
+ gap: 0.4rem;
170
+ }
171
+
172
+ .salary-orbit-switch button,
173
+ .salary-orbit-presets button,
174
+ .salary-orbit-view-switch button,
175
+ .salary-orbit-console-foot button {
176
+ border: 1px solid var(--n-line);
177
+ border-radius: 999px;
178
+ padding: 0.55rem 0.8rem;
179
+ color: var(--n-ink);
180
+ background: var(--n-panel);
181
+ cursor: pointer;
182
+ }
183
+
184
+ .salary-orbit-switch button.is-active,
185
+ .salary-orbit-presets button.is-active,
186
+ .salary-orbit-view-switch button.is-active {
187
+ border-color: var(--n-employer);
188
+ color: var(--n-white);
189
+ background: var(--n-employer);
190
+ }
191
+
192
+ .salary-orbit-choice-line {
193
+ display: grid;
194
+ grid-template-columns: 1fr 1fr;
195
+ gap: 1rem;
196
+ }
197
+
198
+ .salary-orbit fieldset {
199
+ min-width: 0;
200
+ margin: 0;
201
+ padding: 0;
202
+ border: 0;
203
+ }
204
+
205
+ .salary-orbit legend {
206
+ margin-bottom: 0.55rem;
207
+ }
208
+
209
+ .salary-orbit-dial {
210
+ display: grid;
211
+ grid-template-columns: 1fr auto;
212
+ gap: 0.6rem 1rem;
213
+ align-items: center;
214
+ }
215
+
216
+ .salary-orbit-dial span {
217
+ display: grid;
218
+ gap: 0.2rem;
219
+ }
220
+
221
+ .salary-orbit-dial output {
222
+ color: var(--n-employer);
223
+ font-weight: 800;
224
+ }
225
+
226
+ .salary-orbit-dial input {
227
+ grid-column: 1 / -1;
228
+ }
229
+
230
+ .salary-orbit-console-foot {
231
+ display: flex;
232
+ align-items: center;
233
+ justify-content: space-between;
234
+ gap: 1rem;
235
+ margin-top: auto;
236
+ color: var(--n-muted);
237
+ font-size: 0.75rem;
238
+ }
239
+
240
+ .salary-orbit-console-foot button {
241
+ flex: none;
242
+ color: var(--n-irpf);
243
+ }
244
+
245
+ .salary-orbit-observatory {
246
+ position: relative;
247
+ display: flex;
248
+ flex-direction: column;
249
+ align-items: center;
250
+ padding: 2rem clamp(1rem, 3vw, 2.5rem);
251
+ background-image:
252
+ linear-gradient(var(--n-grid) 1px, transparent 1px),
253
+ linear-gradient(90deg, var(--n-grid) 1px, transparent 1px);
254
+ background-size: 2rem 2rem;
255
+ }
256
+
257
+ .salary-orbit-view-switch {
258
+ align-self: flex-end;
259
+ display: flex;
260
+ gap: 0.35rem;
261
+ }
262
+
263
+ .salary-orbit-view-switch button {
264
+ padding: 0.4rem 0.7rem;
265
+ font-size: 0.75rem;
266
+ }
267
+
268
+ .salary-orbit-status {
269
+ margin-top: 0.7rem;
270
+ border: 1px solid var(--n-net);
271
+ border-radius: 999px;
272
+ padding: 0.35rem 0.75rem;
273
+ color: var(--n-net);
274
+ background: var(--n-panel);
275
+ font-size: 0.72rem;
276
+ font-weight: 800;
277
+ letter-spacing: 0.08em;
278
+ text-transform: uppercase;
279
+ }
280
+
281
+ .salary-orbit-status[data-state="wide"] {
282
+ border-color: var(--n-irpf);
283
+ color: var(--n-irpf);
284
+ }
285
+
286
+ .salary-orbit-art {
287
+ position: relative;
288
+ width: min(100%, 33rem);
289
+ height: 26rem;
290
+ }
291
+
292
+ .salary-orbit-trail,
293
+ .salary-orbit-disc {
294
+ position: absolute;
295
+ top: 50%;
296
+ left: 50%;
297
+ border-radius: 50%;
298
+ transform: translate(-50%, -50%);
299
+ }
300
+
301
+ .salary-orbit-trail-outer {
302
+ width: 22rem;
303
+ height: 22rem;
304
+ background: conic-gradient(var(--n-employer) 0 calc(100% - var(--orbit-employee)), var(--n-line-soft) 0);
305
+ mask: radial-gradient(circle, transparent 67%, var(--n-night) 69%);
306
+ animation: salary-orbit-turn 28s linear infinite;
307
+ }
308
+
309
+ .salary-orbit-trail-inner {
310
+ width: 17rem;
311
+ height: 17rem;
312
+ border: 1px dashed var(--n-line);
313
+ animation: salary-orbit-turn 38s linear infinite reverse;
314
+ }
315
+
316
+ .salary-orbit-disc {
317
+ display: flex;
318
+ width: 14.5rem;
319
+ height: 14.5rem;
320
+ flex-direction: column;
321
+ align-items: center;
322
+ justify-content: center;
323
+ overflow: hidden;
324
+ background: conic-gradient(var(--n-net) 0 var(--orbit-net), var(--n-irpf) 0 var(--orbit-irpf), var(--n-employee) 0 var(--orbit-employee), var(--n-employer) 0);
325
+ box-shadow: 0 0 3rem var(--n-glow);
326
+ }
327
+
328
+ .salary-orbit-disc::before {
329
+ position: absolute;
330
+ inset: 1.15rem;
331
+ border-radius: 50%;
332
+ background: var(--n-panel);
333
+ content: "";
334
+ }
335
+
336
+ .salary-orbit-disc > * {
337
+ position: relative;
338
+ z-index: 1;
339
+ }
340
+
341
+ .salary-orbit-disc span,
342
+ .salary-orbit-disc small {
343
+ color: var(--n-muted);
344
+ font-size: 0.72rem;
345
+ }
346
+
347
+ .salary-orbit-disc small {
348
+ display: grid;
349
+ gap: 0.15rem;
350
+ max-width: 9rem;
351
+ margin-top: 0.2rem;
352
+ line-height: 1.2;
353
+ text-align: center;
354
+ }
355
+
356
+ .salary-orbit-disc small b {
357
+ color: var(--n-net);
358
+ font-size: 0.82rem;
359
+ }
360
+
361
+ .salary-orbit-disc strong {
362
+ margin: 0.2rem 0;
363
+ color: var(--n-net);
364
+ font-size: 1.65rem;
365
+ }
366
+
367
+ .salary-orbit-disc strong,
368
+ .salary-orbit-annotation strong,
369
+ .salary-orbit-total strong,
370
+ .salary-orbit-metrics strong,
371
+ .salary-orbit-dial output {
372
+ display: inline-block;
373
+ max-width: 100%;
374
+ padding-block: 0.08em;
375
+ font-variant-numeric: tabular-nums lining-nums;
376
+ line-height: 1.2;
377
+ white-space: nowrap;
378
+ }
379
+
380
+ .salary-orbit-annotation {
381
+ position: absolute;
382
+ display: grid;
383
+ gap: 0.15rem;
384
+ max-width: 9rem;
385
+ font-size: 0.72rem;
386
+ }
387
+
388
+ .salary-orbit-annotation span {
389
+ color: var(--n-muted);
390
+ }
391
+
392
+ .salary-orbit-annotation strong {
393
+ font-size: 0.88rem;
394
+ }
395
+
396
+ .salary-orbit-annotation-gross {
397
+ top: 3.2rem;
398
+ left: 0;
399
+ color: var(--n-ink);
400
+ }
401
+
402
+ .salary-orbit-annotation-irpf {
403
+ top: 5rem;
404
+ right: 0;
405
+ color: var(--n-irpf);
406
+ text-align: right;
407
+ }
408
+
409
+ .salary-orbit-annotation-employee {
410
+ bottom: 5rem;
411
+ left: 0;
412
+ color: var(--n-employee);
413
+ }
414
+
415
+ .salary-orbit-annotation-employer {
416
+ right: 0;
417
+ bottom: 3rem;
418
+ color: var(--n-employer);
419
+ text-align: right;
420
+ }
421
+
422
+ .salary-orbit-total {
423
+ display: flex;
424
+ align-items: baseline;
425
+ justify-content: center;
426
+ gap: 0.8rem;
427
+ max-width: 100%;
428
+ margin-top: -1rem;
429
+ text-align: center;
430
+ }
431
+
432
+ .salary-orbit-total span {
433
+ color: var(--n-muted);
434
+ font-size: 0.78rem;
435
+ }
436
+
437
+ .salary-orbit-total strong {
438
+ color: var(--n-employer);
439
+ font-size: clamp(1.7rem, 4vw, 2.6rem);
440
+ }
441
+
442
+ .salary-orbit-metrics {
443
+ display: grid;
444
+ grid-template-columns: repeat(3, 1fr);
445
+ width: 100%;
446
+ margin-top: 1.5rem;
447
+ border-top: 1px solid var(--n-line);
448
+ }
449
+
450
+ .salary-orbit-metrics div {
451
+ display: grid;
452
+ gap: 0.3rem;
453
+ padding: 1rem 0.7rem;
454
+ text-align: center;
455
+ }
456
+
457
+ .salary-orbit-metrics div + div { border-left: 1px solid var(--n-line); }
458
+ .salary-orbit-metrics span {
459
+ color: var(--n-muted);
460
+ font-size: 0.68rem;
461
+ }
462
+ .salary-orbit-metrics strong { font-size: 0.82rem; }
463
+
464
+ .salary-orbit-scope {
465
+ max-width: 42rem;
466
+ margin: 0.8rem 0 0;
467
+ color: var(--n-muted);
468
+ font-size: 0.72rem;
469
+ line-height: 1.5;
470
+ text-align: center;
471
+ }
472
+
473
+ .salary-orbit-invalid {
474
+ display: none;
475
+ margin: auto;
476
+ color: var(--n-irpf);
477
+ font-weight: 700;
478
+ text-align: center;
479
+ }
480
+
481
+ .salary-orbit[data-valid="false"] .salary-orbit-art,
482
+ .salary-orbit[data-valid="false"] .salary-orbit-total,
483
+ .salary-orbit[data-valid="false"] .salary-orbit-metrics,
484
+ .salary-orbit[data-valid="false"] .salary-orbit-status { display: none; }
485
+ .salary-orbit[data-valid="false"] .salary-orbit-invalid { display: block; }
486
+
487
+ @keyframes salary-orbit-turn {
488
+ to { transform: translate(-50%, -50%) rotate(360deg); }
489
+ }
490
+
491
+ @media (max-width: 900px) {
492
+ .salary-orbit { grid-template-columns: 1fr; }
493
+ .salary-orbit-console {
494
+ border-right: 0;
495
+ border-bottom: 1px solid var(--n-line);
496
+ }
497
+ .salary-orbit-console::after { display: none; }
498
+ }
499
+
500
+ @media (max-width: 560px) {
501
+ .salary-orbit { border-radius: 1.25rem; }
502
+ .salary-orbit-amount {
503
+ align-items: start;
504
+ flex-direction: column;
505
+ }
506
+ .salary-orbit-choice-line { grid-template-columns: 1fr; }
507
+ .salary-orbit-art { height: 24rem; }
508
+ .salary-orbit-trail-outer {
509
+ width: 18rem;
510
+ height: 18rem;
511
+ }
512
+ .salary-orbit-annotation { max-width: 7rem; }
513
+ .salary-orbit-metrics { grid-template-columns: 1fr; }
514
+ .salary-orbit-metrics div + div {
515
+ border-top: 1px solid var(--n-line);
516
+ border-left: 0;
517
+ }
518
+ }
519
+
520
+ @media (prefers-reduced-motion: reduce) {
521
+ .salary-orbit-trail { animation: none; }
522
+ }
@@ -0,0 +1,35 @@
1
+ import { DEFAULT_SALARY_INPUT, type SalaryCostInput } from './logic';
2
+
3
+ const STORAGE_KEY = 'salary-employer-cost-spain-2026';
4
+
5
+ function isRecord(value: unknown): value is Record<string, unknown> {
6
+ return Boolean(value) && typeof value === 'object';
7
+ }
8
+
9
+ function isStoredInput(value: unknown): value is SalaryCostInput {
10
+ if (!isRecord(value)) return false;
11
+ const input = value as Partial<SalaryCostInput>;
12
+ const numbers = [input.amount, input.irpfRate, input.riskRate];
13
+ const validMode = ['annual', 'monthly'].includes(input.amountMode ?? '');
14
+ const validPayments = [12, 14].includes(input.payPeriods ?? 0);
15
+ const validContract = ['permanent', 'temporary'].includes(input.contractType ?? '');
16
+ return numbers.every((item) => typeof item === 'number')
17
+ && validMode
18
+ && validPayments
19
+ && validContract;
20
+ }
21
+
22
+ export function loadSalaryInput(): SalaryCostInput {
23
+ try {
24
+ const parsed: unknown = JSON.parse(localStorage.getItem(STORAGE_KEY) ?? 'null');
25
+ return isStoredInput(parsed) ? parsed : { ...DEFAULT_SALARY_INPUT };
26
+ } catch {
27
+ return { ...DEFAULT_SALARY_INPUT };
28
+ }
29
+ }
30
+
31
+ export function saveSalaryInput(input: SalaryCostInput): void {
32
+ try {
33
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(input));
34
+ } catch {}
35
+ }
@@ -0,0 +1,41 @@
1
+ export interface SalaryEmployerCostUI extends Record<string, string> {
2
+ labelGrossSalary: string;
3
+ labelGrossSalaryHint: string;
4
+ labelAnnual: string;
5
+ labelMonthly: string;
6
+ labelPaySchedule: string;
7
+ labelTwelvePayments: string;
8
+ labelFourteenPayments: string;
9
+ labelContract: string;
10
+ labelPermanent: string;
11
+ labelTemporary: string;
12
+ labelIrpfRate: string;
13
+ labelIrpfHint: string;
14
+ labelRiskRate: string;
15
+ labelRiskHint: string;
16
+ labelOfficePreset: string;
17
+ labelTradePreset: string;
18
+ labelConstructionPreset: string;
19
+ labelNetCore: string;
20
+ labelEmployeeDeductions: string;
21
+ labelDeductionsFormula: string;
22
+ labelEmployerHalo: string;
23
+ labelEmployerCost: string;
24
+ labelAnnualView: string;
25
+ labelPerPaymentView: string;
26
+ labelGross: string;
27
+ labelIrpf: string;
28
+ labelEmployeeSocialSecurity: string;
29
+ labelContributionBase: string;
30
+ labelCostMultiplier: string;
31
+ labelWorkerKeeps: string;
32
+ labelLeanGap: string;
33
+ labelTypicalGap: string;
34
+ labelWideGap: string;
35
+ labelModelScope: string;
36
+ labelReset: string;
37
+ labelInvalid: string;
38
+ labelMinimumSalary: string;
39
+ labelPrivacy: string;
40
+ currencyLocale: string;
41
+ }
package/src/tools.ts CHANGED
@@ -16,6 +16,6 @@ import { FIRE_CALCULATOR_TOOL } from './tool/fireCalculator';
16
16
  import { DEBT_SNOWBALL_TOOL } from './tool/debtSnowball';
17
17
  import { REVOLVING_CARD_CALCULATOR_TOOL } from './tool/revolvingCardCalculator';
18
18
  import { PESETA_VALUE_TOOL } from './tool/pesetaValue';
19
+ import { SALARY_EMPLOYER_COST_TOOL } from './tool/salaryEmployerCost';
19
20
 
20
- export const ALL_TOOLS: ToolDefinition[] = [COMPOUND_INTEREST_TOOL, FINANCIAL_FREEDOM_TOOL, PROFITABILITY_TOOL, MORTGAGE_TOOL, INFLATION_TOOL, PERCENTAGE_CALCULATOR_TOOL, LATE_INTEREST_TOOL, IBAN_BIC_SWIFT_TOOL, RENT_INCREASE_TOOL, LOTTERY_OPTIMIZER_TOOL, COURT_FEE_CALCULATOR_TOOL, LEGAL_INTEREST_RATE_TOOL, FIRE_CALCULATOR_TOOL, DEBT_SNOWBALL_TOOL, REVOLVING_CARD_CALCULATOR_TOOL, PESETA_VALUE_TOOL];
21
-
21
+ export const ALL_TOOLS: ToolDefinition[] = [COMPOUND_INTEREST_TOOL, FINANCIAL_FREEDOM_TOOL, PROFITABILITY_TOOL, MORTGAGE_TOOL, INFLATION_TOOL, PERCENTAGE_CALCULATOR_TOOL, LATE_INTEREST_TOOL, IBAN_BIC_SWIFT_TOOL, RENT_INCREASE_TOOL, LOTTERY_OPTIMIZER_TOOL, COURT_FEE_CALCULATOR_TOOL, LEGAL_INTEREST_RATE_TOOL, FIRE_CALCULATOR_TOOL, DEBT_SNOWBALL_TOOL, REVOLVING_CARD_CALCULATOR_TOOL, PESETA_VALUE_TOOL, SALARY_EMPLOYER_COST_TOOL];