diff --git a/source/engine/mecanisms.js b/source/engine/mecanisms.js index dfcfe1c75..0f8fd61d2 100644 --- a/source/engine/mecanisms.js +++ b/source/engine/mecanisms.js @@ -537,10 +537,11 @@ export let mecanismReduction = (recurse, k, v) => { let objectShape = { assiette: false, abattement: defaultNode(0), + plafond: defaultNode(Infinity), franchise: defaultNode(0) } - let effect = ({ assiette, abattement, franchise, décote }) => { + let effect = ({ assiette, abattement, plafond, franchise, décote }) => { let v_assiette = val(assiette) if (v_assiette == null) return null @@ -550,12 +551,12 @@ export let mecanismReduction = (recurse, k, v) => { ? 0 : décote ? do { - let plafond = val(décote.plafond), + let plafondDécote = val(décote.plafond), taux = val(décote.taux) - v_assiette > plafond + v_assiette > plafondDécote ? v_assiette - : max(0, (1 + taux) * v_assiette - taux * plafond) + : max(0, (1 + taux) * v_assiette - taux * plafondDécote) } : v_assiette @@ -567,9 +568,9 @@ export let mecanismReduction = (recurse, k, v) => { : abattement.category === 'percentage' ? max( 0, - montantFranchiséDécoté - val(abattement) * montantFranchiséDécoté + montantFranchiséDécoté - min(val(plafond), val(abattement) * montantFranchiséDécoté) ) - : max(0, montantFranchiséDécoté - val(abattement)) + : max(0, montantFranchiséDécoté - min(val(plafond), val(abattement))) : montantFranchiséDécoté } diff --git a/source/règles/base.yaml b/source/règles/base.yaml index a0df0d09a..ce696ca0b 100644 --- a/source/règles/base.yaml +++ b/source/règles/base.yaml @@ -2586,11 +2586,16 @@ - contrat salarié . rémunération . net imposable - indépendant . revenu professionnel abattement: 10% + plafond: 12502 + note: L'abattement a aussi un minimum fixé à 437€ par personne (voir la référence ci-dessous), mais cela n'impacte que les couples, or notre implémentation de l'impôt sur le revenu est pour l'instant limitée aux célibataires. + références: + Frais professionnels - forfait ou frais réels: https://www.service-public.fr/particuliers/vosdroits/F1989 - nom: impôt sur le revenu espace: impôt description: | Voici le fameux barème de l'impôt sur le revenu. C'est un barème marginal à 5 tranches. + Une contribution sur les hauts revenus ajoute deux tranches supplémentaires. Attention : pour un revenu de 100 000€ annuels, le contribuable ne paiera 41 000€ d'impôt (le taux de la 4ème tranche est 41%) ! Ces 41% sont appliqués uniquement à la part de ses revenus supérieure à 72 617€. période: année @@ -2611,7 +2616,6 @@ taux: 41% - au-dessus de: 156244 taux: 45% - exemples: exemples: - nom: Haut salaire de ~ 10 000€ mensuels situation: @@ -2636,12 +2640,34 @@ contrat salarié . rémunération . net imposable: 4000 valeur attendue: 7162 +- espace: impôt + nom: CEHR + période: année + note: Attention, ce barème concerne les foyers célibataires. Pour les couples, le barème est adapté pour ne pas leur appliquer la même imposition alors qu'ils sont individuellement deux fois moins riches. + formule: + barème: + assiette: revenu abattu + tranches: + - en-dessous de: 250000 + taux: 0% + - de: 250000 + à: 500000 + taux: 3% + - au-dessus de: 500000 + taux: 4% + références: + contribution exceptionnelle sur les hauts revenus: https://www.service-public.fr/particuliers/vosdroits/F31130 + Article 223 sexies du Code général des impôts: https://www.legifrance.gouv.fr/affichCode.do?idSectionTA=LEGISCTA000025049019&cidTexte=LEGITEXT000006069577 + + + + - nom: impôt sur le revenu à payer espace: impôt titre: impôt sur le revenu description: période: flexible - formule: impôt sur le revenu après décote + formule: impôt sur le revenu après décote + CEHR - nom: revenu net de cotisations période: flexible diff --git a/test/mécanismes/allègement.yaml b/test/mécanismes/allègement.yaml index a95e1390d..e3de814b7 100644 --- a/test/mécanismes/allègement.yaml +++ b/test/mécanismes/allègement.yaml @@ -84,6 +84,21 @@ montant: 80000 valeur attendue: 68000 +- test: montant abattu avec plafond numérique + format: € + formule: + allègement: + assiette: montant + abattement: 15% + plafond: 12000 + exemples: + - situation: + montant: 10000 + valeur attendue: 8500 + - situation: + montant: 100000 + valeur attendue: 88000 # 85000 s'il n'y avait pas de plafond à la somme abattue + - test: montant franchisé, décote, abattu format: € formule: