@jjlmoya/utils-finance 1.1.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.
- package/package.json +64 -0
- package/src/category/i18n/en.ts +159 -0
- package/src/category/i18n/es.ts +159 -0
- package/src/category/i18n/fr.ts +159 -0
- package/src/category/index.ts +24 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +32 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +39 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +23 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/compoundInterest/bibliography.astro +14 -0
- package/src/tool/compoundInterest/component.astro +697 -0
- package/src/tool/compoundInterest/i18n/en.ts +212 -0
- package/src/tool/compoundInterest/i18n/es.ts +212 -0
- package/src/tool/compoundInterest/i18n/fr.ts +212 -0
- package/src/tool/compoundInterest/index.ts +34 -0
- package/src/tool/compoundInterest/logic.ts +40 -0
- package/src/tool/compoundInterest/seo.astro +14 -0
- package/src/tool/compoundInterest/ui.ts +19 -0
- package/src/tool/courtFeeCalculator/bibliography.astro +14 -0
- package/src/tool/courtFeeCalculator/component.astro +427 -0
- package/src/tool/courtFeeCalculator/i18n/en.ts +268 -0
- package/src/tool/courtFeeCalculator/i18n/es.ts +268 -0
- package/src/tool/courtFeeCalculator/i18n/fr.ts +268 -0
- package/src/tool/courtFeeCalculator/index.ts +33 -0
- package/src/tool/courtFeeCalculator/logic.ts +86 -0
- package/src/tool/courtFeeCalculator/seo.astro +14 -0
- package/src/tool/courtFeeCalculator/ui.ts +31 -0
- package/src/tool/debtSnowball/bibliography.astro +14 -0
- package/src/tool/debtSnowball/component.astro +1052 -0
- package/src/tool/debtSnowball/i18n/en.ts +288 -0
- package/src/tool/debtSnowball/i18n/es.ts +288 -0
- package/src/tool/debtSnowball/i18n/fr.ts +288 -0
- package/src/tool/debtSnowball/index.ts +37 -0
- package/src/tool/debtSnowball/logic.ts +156 -0
- package/src/tool/debtSnowball/seo.astro +14 -0
- package/src/tool/debtSnowball/ui.ts +49 -0
- package/src/tool/fireCalculator/bibliography.astro +14 -0
- package/src/tool/fireCalculator/component.astro +689 -0
- package/src/tool/fireCalculator/i18n/en.ts +261 -0
- package/src/tool/fireCalculator/i18n/es.ts +261 -0
- package/src/tool/fireCalculator/i18n/fr.ts +261 -0
- package/src/tool/fireCalculator/index.ts +33 -0
- package/src/tool/fireCalculator/logic.ts +108 -0
- package/src/tool/fireCalculator/seo.astro +14 -0
- package/src/tool/fireCalculator/ui.ts +33 -0
- package/src/tool/ibanBicSwiftConverter/bibliography.astro +14 -0
- package/src/tool/ibanBicSwiftConverter/component.astro +581 -0
- package/src/tool/ibanBicSwiftConverter/i18n/en.ts +167 -0
- package/src/tool/ibanBicSwiftConverter/i18n/es.ts +216 -0
- package/src/tool/ibanBicSwiftConverter/i18n/fr.ts +167 -0
- package/src/tool/ibanBicSwiftConverter/index.ts +33 -0
- package/src/tool/ibanBicSwiftConverter/logic.ts +101 -0
- package/src/tool/ibanBicSwiftConverter/seo.astro +14 -0
- package/src/tool/ibanBicSwiftConverter/ui.ts +17 -0
- package/src/tool/inflation/bibliography.astro +14 -0
- package/src/tool/inflation/component.astro +400 -0
- package/src/tool/inflation/i18n/en.ts +301 -0
- package/src/tool/inflation/i18n/es.ts +301 -0
- package/src/tool/inflation/i18n/fr.ts +301 -0
- package/src/tool/inflation/index.ts +34 -0
- package/src/tool/inflation/logic.ts +92 -0
- package/src/tool/inflation/seo.astro +14 -0
- package/src/tool/inflation/ui.ts +17 -0
- package/src/tool/lateInterest/bibliography.astro +14 -0
- package/src/tool/lateInterest/component.astro +655 -0
- package/src/tool/lateInterest/i18n/en.ts +255 -0
- package/src/tool/lateInterest/i18n/es.ts +224 -0
- package/src/tool/lateInterest/i18n/fr.ts +224 -0
- package/src/tool/lateInterest/index.ts +34 -0
- package/src/tool/lateInterest/logic.ts +89 -0
- package/src/tool/lateInterest/seo.astro +14 -0
- package/src/tool/lateInterest/ui.ts +33 -0
- package/src/tool/legalInterestRate/bibliography.astro +14 -0
- package/src/tool/legalInterestRate/component.astro +650 -0
- package/src/tool/legalInterestRate/i18n/en.ts +159 -0
- package/src/tool/legalInterestRate/i18n/es.ts +159 -0
- package/src/tool/legalInterestRate/i18n/fr.ts +159 -0
- package/src/tool/legalInterestRate/index.ts +33 -0
- package/src/tool/legalInterestRate/logic.ts +29 -0
- package/src/tool/legalInterestRate/seo.astro +14 -0
- package/src/tool/legalInterestRate/ui.ts +23 -0
- package/src/tool/lotteryOptimizer/bibliography.astro +14 -0
- package/src/tool/lotteryOptimizer/component.astro +863 -0
- package/src/tool/lotteryOptimizer/i18n/en.ts +188 -0
- package/src/tool/lotteryOptimizer/i18n/es.ts +281 -0
- package/src/tool/lotteryOptimizer/i18n/fr.ts +188 -0
- package/src/tool/lotteryOptimizer/index.ts +33 -0
- package/src/tool/lotteryOptimizer/logic.ts +133 -0
- package/src/tool/lotteryOptimizer/seo.astro +14 -0
- package/src/tool/lotteryOptimizer/ui.ts +33 -0
- package/src/tool/mortgage/bibliography.astro +14 -0
- package/src/tool/mortgage/component.astro +1030 -0
- package/src/tool/mortgage/i18n/en.ts +227 -0
- package/src/tool/mortgage/i18n/es.ts +227 -0
- package/src/tool/mortgage/i18n/fr.ts +227 -0
- package/src/tool/mortgage/index.ts +34 -0
- package/src/tool/mortgage/logic.ts +118 -0
- package/src/tool/mortgage/seo.astro +14 -0
- package/src/tool/mortgage/ui.ts +35 -0
- package/src/tool/percentageCalculator/bibliography.astro +14 -0
- package/src/tool/percentageCalculator/component.astro +640 -0
- package/src/tool/percentageCalculator/i18n/en.ts +233 -0
- package/src/tool/percentageCalculator/i18n/es.ts +233 -0
- package/src/tool/percentageCalculator/i18n/fr.ts +233 -0
- package/src/tool/percentageCalculator/index.ts +34 -0
- package/src/tool/percentageCalculator/logic.ts +48 -0
- package/src/tool/percentageCalculator/seo.astro +14 -0
- package/src/tool/percentageCalculator/ui.ts +30 -0
- package/src/tool/rentIncreaseCalculator/bibliography.astro +14 -0
- package/src/tool/rentIncreaseCalculator/component.astro +587 -0
- package/src/tool/rentIncreaseCalculator/i18n/en.ts +159 -0
- package/src/tool/rentIncreaseCalculator/i18n/es.ts +220 -0
- package/src/tool/rentIncreaseCalculator/i18n/fr.ts +159 -0
- package/src/tool/rentIncreaseCalculator/index.ts +33 -0
- package/src/tool/rentIncreaseCalculator/logic.ts +43 -0
- package/src/tool/rentIncreaseCalculator/seo.astro +14 -0
- package/src/tool/rentIncreaseCalculator/ui.ts +19 -0
- package/src/tools.ts +16 -0
- package/src/types.ts +74 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { PercentageCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'calculatrice-pourcentages';
|
|
6
|
+
const title = 'Calculatrice de Pourcentages: 4 en 1 pour Réductions, TVA et Majorations';
|
|
7
|
+
const description =
|
|
8
|
+
'Calculez facilement les pourcentages en ligne gratuitement. 4 outils en 1 pour trouver X% de Y, différence en pourcentage, ajouter ou soustraire la TVA, réductions et calculs de pourboires automatiquement.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Comment fonctionne la calculatrice?',
|
|
13
|
+
answer:
|
|
14
|
+
'Il suffit de saisir les valeurs dans les champs du cas d\'utilisation qui correspond à votre problème et notre calculatrice traite la formule sans avoir besoin d\'appuyer sur un bouton de calcul.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Est-elle valable pour calculer la TVA ou les impôts?',
|
|
18
|
+
answer:
|
|
19
|
+
'Oui, le cas 4 (Ajouter ou soustraire un pourcentage) est conçu précisément pour les cas comme appliquer une TVA de 21% à un prix de base ou calculer un impôt sur le revenu négatif.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Gère-t-elle les décimales et les nombres négatifs?',
|
|
23
|
+
answer:
|
|
24
|
+
'Bien sûr. Vous pouvez entrer des nombres décimaux (en utilisant un point) et cela fonctionnera également avec des valeurs négatives si vous avez besoin d\'analyser les soldes comptables en pertes.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Puis-je copier les résultats?',
|
|
28
|
+
answer:
|
|
29
|
+
'Oui, chaque cas a un bouton dans la zone de résultat qui copie instantanément le nombre dans le presse-papiers de votre appareil pour que vous puissiez le coller dans une autre application ou document.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Identifiez votre problème mathématique',
|
|
36
|
+
text: 'Lisez les titres des 4 cas et choisissez celui qui correspond à ce que vous voulez savoir (Ex. Quel est 20% de 50? → Cas 1).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Entrez les nombres',
|
|
40
|
+
text: 'Remplissez les champs X et Y. Ne vous inquiétez pas de l\'ordre, le texte de chaque cas vous guide visuellement.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Copiez le résultat instantané',
|
|
44
|
+
text: 'Le nombre apparaîtra en temps réel ci-dessous à mesure que vous tapez. Cliquez sur l\'icône de copie si vous souhaitez l\'utiliser ailleurs.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowTo> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, i) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: i + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'FinanceApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'fr',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const content: ToolLocaleContent<PercentageCalculatorUI> = {
|
|
83
|
+
slug,
|
|
84
|
+
title,
|
|
85
|
+
description,
|
|
86
|
+
faqTitle: 'Questions Fréquemment Posées',
|
|
87
|
+
faq: faqData,
|
|
88
|
+
bibliographyTitle: 'Sources et Références',
|
|
89
|
+
bibliography: [
|
|
90
|
+
{
|
|
91
|
+
name: 'Calcul des Pourcentages: Wikipédia',
|
|
92
|
+
url: 'https://fr.wikipedia.org/wiki/Pourcentage',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'Concepts Mathématiques de Base: Khan Academy',
|
|
96
|
+
url: 'https://fr.khanacademy.org/math/pre-algebra',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Direction Générale des Finances Publiques: Guides de TVA',
|
|
100
|
+
url: 'https://www.impots.gouv.fr/',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
howTo: howToData,
|
|
104
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
105
|
+
seo: [
|
|
106
|
+
{
|
|
107
|
+
type: 'title',
|
|
108
|
+
text: 'Calculatrice de Pourcentages 4-en-1 : Maîtrisez les Calculs Rapides',
|
|
109
|
+
level: 2,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
type: 'title',
|
|
113
|
+
text: 'Pourquoi Vous Avez Besoin d\'une Calculatrice de Pourcentages Polyvalente',
|
|
114
|
+
level: 3,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
type: 'paragraph',
|
|
118
|
+
html: 'Calculer des pourcentages est l\'une des opérations mathématiques les plus courantes de notre vie quotidienne. Qu\'il s\'agisse de calculer la réduction lors des soldes, de déterminer le pourboire approprié au restaurant, de déterminer les marges bénéficiaires en affaires ou de comprendre les intérêts des prêts. Malgré le fait que ce sont des opérations de tous les jours, ce n\'est pas toujours facile de les faire mentalement ou de mémoriser la formule exacte.',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: 'paragraph',
|
|
122
|
+
html: 'Notre calculatrice de pourcentages 4-en-1 regroupe les scénarios les plus courants que vous rencontrerez. Plus besoin de chercher sur Google "comment calculer 20 pour cent" ou "formule de pourcentage". Vous avez les quatre opérations essentielles au même endroit, interactif et avec des résultats instantanés.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'title',
|
|
126
|
+
text: 'Exploration des 4 Cas d\'Utilisation Les Plus Courants',
|
|
127
|
+
level: 3,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
html: 'Pour vous faciliter la vie, nous avons séparé l\'outil en quatre blocs visuels clairs qui résolvent les problèmes du monde réel que vous rencontrez quotidiennement:',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'card',
|
|
135
|
+
icon: 'mdi:percent',
|
|
136
|
+
title: '1. Combien Font X% de Y?',
|
|
137
|
+
html: '<p><strong>Le cas classique.</strong> Parfait pour calculer les réductions ou les pourboires. Si vous voulez savoir ce que représente 15% de 100€, c\'est l\'outil qu\'il vous faut. La formule sous-jacente divise simplement le pourcentage par 100 et le multiplie par la valeur totale.</p>',
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
type: 'card',
|
|
141
|
+
icon: 'mdi:division',
|
|
142
|
+
title: '2. Quel Pourcentage Représente X de Y?',
|
|
143
|
+
html: '<p><strong>Idéal pour les proportions.</strong> Si vous avez obtenu 45 points sur 60 à un examen, quel est votre pourcentage? Cette fonction divise la partie par le total et multiplie par 100, vous donnant le poids relatif exact.</p>',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'card',
|
|
147
|
+
icon: 'mdi:chart-line-variant',
|
|
148
|
+
title: '3. Augmentation ou Diminution Percentuelle',
|
|
149
|
+
html: '<p><strong>Parfait pour la finance et l\'analytique.</strong> De combien votre loyer a-t-il augmenté depuis l\'année dernière? Si vous payiez 800€ avant et 840€ maintenant, cette fonction vous indique une augmentation de 5%. Elle mesure la croissance ou le déclin entre deux chiffres.</p>',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'card',
|
|
153
|
+
icon: 'mdi:calculator',
|
|
154
|
+
title: '4. Ajouter ou Soustraire un Pourcentage d\'une Valeur',
|
|
155
|
+
html: '<p><strong>Très utile pour la TVA.</strong> Si vous avez un prix de base (par ex. 100€) et devez ajouter 20% de TVA, cette calculatrice vous donne directement les 120€ finaux sans étapes intermédiaires. De la même manière, cela fonctionne pour appliquer des réductions directement (par ex. soustraire 20%).</p>',
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
type: 'title',
|
|
159
|
+
text: 'Mythes Courants sur les Calculs de Pourcentages',
|
|
160
|
+
level: 3,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'paragraph',
|
|
164
|
+
html: 'Nous nous bloquons souvent en voyant de grands pourcentages ou des décimales, mais il y a des "astuces" mathématiques qui peuvent vous faciliter la vie. La plus célèbre est la <strong>réversibilité des pourcentages</strong>.',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'tip',
|
|
168
|
+
title: 'L\'Astuce de Réversibilité',
|
|
169
|
+
html: '<p>Saviez-vous que X% de Y est exactement égal à Y% de X? Par exemple, si on vous demande de calculer 18% de 50 de tête, cela semble compliqué. Mais inversez-le—50% de 18 est facile: c\'est 9! Cela fonctionne pour absolument tous les nombres et c\'est une astuce incroyable au quotidien.</p>',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
type: 'title',
|
|
173
|
+
text: 'Pourquoi Nous Échouons aux Calculs de Croissance',
|
|
174
|
+
level: 3,
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
type: 'paragraph',
|
|
178
|
+
html: 'L\'une des erreurs les plus courantes se produit au Cas 3: augmentation ou diminution percentuelle. Imaginez qu\'une action coûte 100€, baisse de 50%, puis augmente de 50% le lendemain. Votre intuition dit qu\'elle revient à 100€, mais c\'est faux.',
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
type: 'paragraph',
|
|
182
|
+
html: 'Si elle baisse de 50% depuis 100€, la nouvelle valeur est 50€. Si elle augmente alors de 50% à partir de ces 50€, le gain est la moitié de 50€ (ce qui est 25€). Donc le prix final est 75€. Cet exemple classique montre pourquoi les augmentations et diminutions de pourcentage ne sont pas symétriques, et pourquoi les calculatrices dynamiques comme celle-ci préviennent les erreurs financières graves.',
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: 'title',
|
|
186
|
+
text: 'Utilisation Professionnelle et Académique',
|
|
187
|
+
level: 3,
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
type: 'paragraph',
|
|
191
|
+
html: 'Notre interface est sans distraction et conçue pour <strong>travailler rapidement</strong>. Épinglez-la en tant qu\'onglet de navigateur, basculez rapidement entre les champs, et utilisez le bouton de copie à côté des résultats pour transférer les chiffres exacts vers Excel ou Google Sheets sans risque d\'erreur de frappe.',
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
type: 'list',
|
|
195
|
+
items: [
|
|
196
|
+
'Commerce électronique et magasins de détail: Calcul rapide des prix de vente au détail en appliquant les marges bénéficiaires et la TVA.',
|
|
197
|
+
'Ressources humaines: Détermination des écarts salariaux, retenues fiscales et augmentations de salaire indexées sur l\'inflation.',
|
|
198
|
+
'Enseignement supérieur: Enseignants courbes de notation ou étudiants STIM analysant la déviation expérimentale.',
|
|
199
|
+
'Marketing numérique: Mesure du CTR (Taux de Clic), ROAS (Retour sur Dépenses Publicitaires), ou taux de conversion d\'e-commerce.',
|
|
200
|
+
],
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
ui: {
|
|
204
|
+
labelTitle: 'Calculatrice de Pourcentages',
|
|
205
|
+
labelCase1Title: 'Cas 1',
|
|
206
|
+
labelCase1Question: 'Quel est X% de Y?',
|
|
207
|
+
labelCase1Placeholder1: 'X',
|
|
208
|
+
labelCase1Placeholder2: 'Y',
|
|
209
|
+
labelCase1Formula: 'Formule: (X / 100) × Y',
|
|
210
|
+
labelCase2Title: 'Cas 2',
|
|
211
|
+
labelCase2Question: 'Quel pourcentage est X de Y?',
|
|
212
|
+
labelCase2Placeholder1: 'X',
|
|
213
|
+
labelCase2Placeholder2: 'Y',
|
|
214
|
+
labelCase2Formula: 'Formule: (X / Y) × 100',
|
|
215
|
+
labelCase3Title: 'Cas 3',
|
|
216
|
+
labelCase3Question: 'Différence en pourcentage entre deux valeurs',
|
|
217
|
+
labelCase3Placeholder1: 'Valeur 1',
|
|
218
|
+
labelCase3Placeholder2: 'Valeur 2',
|
|
219
|
+
labelCase3Formula: 'Formule: ((Valeur 2 - Valeur 1) / |Valeur 1|) × 100',
|
|
220
|
+
labelCase4Title: 'Cas 4',
|
|
221
|
+
labelCase4Question: 'Ajouter ou soustraire un pourcentage à une valeur',
|
|
222
|
+
labelCase4Placeholder1: 'Valeur',
|
|
223
|
+
labelCase4Placeholder2: '%',
|
|
224
|
+
labelCase4Formula: 'Formule: Valeur ± (Valeur × (% / 100))',
|
|
225
|
+
labelCase4AddLabel: 'Ajouter (Valeur + %)',
|
|
226
|
+
labelCase4SubtractLabel: 'Soustraire (Valeur - %)',
|
|
227
|
+
labelResult: 'Résultat',
|
|
228
|
+
labelDifference: 'Différence',
|
|
229
|
+
labelCopyTooltip: 'Copier le résultat',
|
|
230
|
+
labelFormula: 'Formule',
|
|
231
|
+
percentSymbol: '%',
|
|
232
|
+
},
|
|
233
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { FinanceToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
import PercentageCalculatorComponent from './component.astro';
|
|
3
|
+
import PercentageCalculatorSEO from './seo.astro';
|
|
4
|
+
import PercentageCalculatorBibliography from './bibliography.astro';
|
|
5
|
+
|
|
6
|
+
import type { PercentageCalculatorUI } from './ui';
|
|
7
|
+
|
|
8
|
+
export type PercentageCalculatorLocaleContent = ToolLocaleContent<PercentageCalculatorUI>;
|
|
9
|
+
|
|
10
|
+
import { content as es } from './i18n/es';
|
|
11
|
+
import { content as en } from './i18n/en';
|
|
12
|
+
import { content as fr } from './i18n/fr';
|
|
13
|
+
|
|
14
|
+
export const percentageCalculator: FinanceToolEntry<PercentageCalculatorUI> = {
|
|
15
|
+
id: 'calculadora-porcentajes',
|
|
16
|
+
icons: {
|
|
17
|
+
bg: 'mdi:percent',
|
|
18
|
+
fg: 'mdi:calculator',
|
|
19
|
+
},
|
|
20
|
+
i18n: {
|
|
21
|
+
es: async () => es,
|
|
22
|
+
en: async () => en,
|
|
23
|
+
fr: async () => fr,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { PercentageCalculatorComponent, PercentageCalculatorSEO, PercentageCalculatorBibliography };
|
|
28
|
+
|
|
29
|
+
export const PERCENTAGE_CALCULATOR_TOOL: ToolDefinition = {
|
|
30
|
+
entry: percentageCalculator,
|
|
31
|
+
Component: PercentageCalculatorComponent,
|
|
32
|
+
SEOComponent: PercentageCalculatorSEO,
|
|
33
|
+
BibliographyComponent: PercentageCalculatorBibliography,
|
|
34
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface PercentageResults {
|
|
2
|
+
percentOfNumber: number;
|
|
3
|
+
percentageOf: number;
|
|
4
|
+
percentageDifference: number;
|
|
5
|
+
addPercentage: number;
|
|
6
|
+
subtractPercentage: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class PercentageCalculator {
|
|
10
|
+
static formatNumber(num: number): string {
|
|
11
|
+
if (isNaN(num) || !isFinite(num)) return '0';
|
|
12
|
+
if (Number.isInteger(num)) return num.toString();
|
|
13
|
+
|
|
14
|
+
let formatted = num.toFixed(4);
|
|
15
|
+
formatted = formatted.replace(/0+$/, '');
|
|
16
|
+
if (formatted.endsWith('.')) {
|
|
17
|
+
formatted = formatted.slice(0, -1);
|
|
18
|
+
}
|
|
19
|
+
return formatted;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static calculatePercentOfNumber(percentage: number, number: number): number {
|
|
23
|
+
if (isNaN(percentage) || isNaN(number)) return 0;
|
|
24
|
+
return (percentage / 100) * number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static calculateWhatPercentageIs(x: number, y: number): number {
|
|
28
|
+
if (isNaN(x) || isNaN(y) || y === 0) return 0;
|
|
29
|
+
return (x / y) * 100;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static calculatePercentageDifference(value1: number, value2: number): number {
|
|
33
|
+
if (isNaN(value1) || isNaN(value2) || value1 === 0) return 0;
|
|
34
|
+
return ((value2 - value1) / Math.abs(value1)) * 100;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
static calculateAddPercentage(value: number, percentage: number): number {
|
|
38
|
+
if (isNaN(value) || isNaN(percentage)) return 0;
|
|
39
|
+
const amount = value * (percentage / 100);
|
|
40
|
+
return value + amount;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static calculateSubtractPercentage(value: number, percentage: number): number {
|
|
44
|
+
if (isNaN(value) || isNaN(percentage)) return 0;
|
|
45
|
+
const amount = value * (percentage / 100);
|
|
46
|
+
return value - amount;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { percentageCalculator } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await percentageCalculator.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
<SEORenderer content={{ locale: locale as string, sections: content.seo }} />
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface PercentageCalculatorUI {
|
|
2
|
+
labelTitle: string;
|
|
3
|
+
labelCase1Title: string;
|
|
4
|
+
labelCase1Question: string;
|
|
5
|
+
labelCase1Placeholder1: string;
|
|
6
|
+
labelCase1Placeholder2: string;
|
|
7
|
+
labelCase1Formula: string;
|
|
8
|
+
labelCase2Title: string;
|
|
9
|
+
labelCase2Question: string;
|
|
10
|
+
labelCase2Placeholder1: string;
|
|
11
|
+
labelCase2Placeholder2: string;
|
|
12
|
+
labelCase2Formula: string;
|
|
13
|
+
labelCase3Title: string;
|
|
14
|
+
labelCase3Question: string;
|
|
15
|
+
labelCase3Placeholder1: string;
|
|
16
|
+
labelCase3Placeholder2: string;
|
|
17
|
+
labelCase3Formula: string;
|
|
18
|
+
labelCase4Title: string;
|
|
19
|
+
labelCase4Question: string;
|
|
20
|
+
labelCase4Placeholder1: string;
|
|
21
|
+
labelCase4Placeholder2: string;
|
|
22
|
+
labelCase4Formula: string;
|
|
23
|
+
labelCase4AddLabel: string;
|
|
24
|
+
labelCase4SubtractLabel: string;
|
|
25
|
+
labelResult: string;
|
|
26
|
+
labelDifference: string;
|
|
27
|
+
labelCopyTooltip: string;
|
|
28
|
+
labelFormula: string;
|
|
29
|
+
percentSymbol: string;
|
|
30
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { rentIncrease } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await rentIncrease.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SharedBibliography links={content.bibliography} />}
|