Ré-écriture du mécanisme abattement

pull/1371/head
Maxime Quandalle 2021-01-04 17:46:42 +01:00
parent da7ef0b0c5
commit 6d9fd83ace
23 changed files with 250 additions and 318 deletions

View File

@ -12,13 +12,12 @@ artiste-auteur . revenus . traitements et salaires:
artiste-auteur . revenus . BNC:
unité: €/an
formule:
allègement:
assiette: recettes
abattement:
variations:
- si: micro-bnc
alors: charges forfaitaires
- sinon: frais réels
valeur: recettes
abattement:
variations:
- si: micro-bnc
alors: charges forfaitaires
- sinon: frais réels
artiste-auteur . revenus . BNC . micro-bnc:
non applicable si: contrôle micro-bnc

View File

@ -161,9 +161,8 @@ contrat salarié . convention collective . sport . cotisations . formation profe
contrat salarié . convention collective . sport . cotisations . assiette franchisée:
formule:
allègement:
assiette: cotisations . assiette
abattement: franchise
valeur: cotisations . assiette
abattement: franchise
contrat salarié . convention collective . sport . joueur entraineur:
question: Le joueur est-il aussi entraineur ?

View File

@ -378,9 +378,8 @@ dirigeant . auto-entrepreneur . impôt . revenu imposable:
dirigeant . auto-entrepreneur . impôt . revenu abattu:
titre: revenu abattu auto-entrepreneur
formule:
allègement:
assiette: base des cotisations
abattement: abattement
valeur: base des cotisations
abattement: abattement
dirigeant . auto-entrepreneur . net après impôt:
titre: revenu net après impôt
@ -829,9 +828,8 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac . rev
- invalidité et décès
- conjoint collaborateur
formule:
allègement:
assiette: assiette des cotisations
abattement: déduction tabac
valeur: assiette des cotisations
abattement: déduction tabac
dirigeant . indépendant . contrats madelin:
titre: Contrats Madelin
@ -1108,15 +1106,14 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette
puisque la partie non imposable a déjà été retranchée du revenu net fiscal
fourni
formule:
allègement:
assiette:
somme:
- revenu professionnel
- cotisations
abattement:
somme:
- revenus étrangers . montant
- dirigeant . indépendant . IJSS . imposable
valeur:
somme:
- revenu professionnel
- cotisations
abattement:
somme:
- revenus étrangers . montant
- dirigeant . indépendant . IJSS . imposable
dirigeant . indépendant . cotisations et contributions . formation professionnelle:
produit:

View File

@ -158,6 +158,5 @@ aide déclaration revenu indépendant 2019 . assiette sociale:
titre: assiette sociale
résumé: 'pour information [A - (B + C + D)]'
formule:
allègement:
assiette: revenu net fiscal
abattement: total charges sociales déductible
valeur: revenu net fiscal
abattement: total charges sociales déductible

View File

@ -257,9 +257,8 @@ entreprise . impôt sur les sociétés . contribution sociale:
produit:
taux: 3.3%
assiette:
allègement:
assiette: impôt sur les sociétés
abattement: 763000 €/an * prorata temporis
valeur: impôt sur les sociétés
abattement: 763000 €/an * prorata temporis
références:
Bofip: https://bofip.impots.gouv.fr/bofip/3492-PGP.html/identifiant%3DBOI-IS-AUT-10-20-20130318
@ -469,9 +468,8 @@ entreprise . non assujettie à TVA:
entreprise . taxe sur les salaires . montant avant décote:
formule:
allègement:
assiette: contrat salarié . taxe sur les salaires . barème / 1 employé * effectif
abattement: abattement associations
valeur: contrat salarié . taxe sur les salaires . barème / 1 employé * effectif
abattement: abattement associations
entreprise . taxe sur les salaires . abattement associations:
applicable si: entreprise . association non lucrative

View File

@ -69,13 +69,12 @@ impôt . revenu imposable:
description: |
C'est le revenu à prendre en compte pour calculer l'impôt avec un taux moyen d'imposition (neutre ou personnalisé).
formule:
allègement:
assiette:
somme:
- contrat salarié . rémunération . net imposable
- dirigeant . indépendant . résultat fiscal
- dirigeant . auto-entrepreneur . impôt . revenu imposable
abattement: abattement contrat court
valeur:
somme:
- contrat salarié . rémunération . net imposable
- dirigeant . indépendant . résultat fiscal
- dirigeant . auto-entrepreneur . impôt . revenu imposable
abattement: abattement contrat court
impôt . revenu imposable . abattement contrat court:
description: Lorsque la durée d'un contrat de travail est inférieure à 2 mois, il est possible d'appliquer un abattement pour diminuer le montant du prélèvement à la source.
@ -375,21 +374,20 @@ impôt . foyer fiscal . revenu imposable:
impôt . foyer fiscal . revenu imposable . revenu d'activité abattu:
description: Dans le cas général, l'impôt est calculé après l'application d'un abattement forfaitaire fixe. Chacun peut néanmoins opter pour la déclaration de ses *frais réels*, qui viendront remplacer ce forfait par défaut.
formule:
allègement:
assiette [ref]:
somme:
- contrat salarié . rémunération . net imposable
- valeur: dirigeant . indépendant . résultat fiscal
applicable si: entreprise . imposition . IS
abattement:
valeur: 10% * assiette
# A VÉRIFIER: calculé à la main en revalorisant le taux 2020
# HISTORIQUE 2020: 12627€
# 12627€ × (1 + 0,2%)
plafond: 12652 €/an
# HISTORIQUE 2020: 441€
# 441€ × (1 + 0,2%)
plancher: 442 €/an
valeur [ref assiette]:
somme:
- contrat salarié . rémunération . net imposable
- valeur: dirigeant . indépendant . résultat fiscal
applicable si: entreprise . imposition . IS
abattement:
valeur: 10% * assiette
# A VÉRIFIER: calculé à la main en revalorisant le taux 2020
# HISTORIQUE 2020: 12627€
# 12627€ × (1 + 0,2%)
plafond: 12652 €/an
# HISTORIQUE 2020: 441€
# 441€ × (1 + 0,2%)
plancher: 442 €/an
références:
Frais professionnels - forfait ou frais réels: https://www.service-public.fr/particuliers/vosdroits/F1989
@ -418,9 +416,8 @@ impôt . foyer fiscal . impôt à payer:
impôt . foyer fiscal . impôt sur le revenu:
unité: €/an
formule:
allègement:
assiette: impôt brut
abattement: décote
valeur: impôt brut
abattement: décote
exemples:
- nom: Salaire d'un cadre
situation:

View File

@ -540,9 +540,8 @@ dirigeant . indépendant . PL . PAMC . allocations familiales:
règle: cotisations et contributions . allocations familiales
sauf dans: participation CPAM
formule:
allègement:
assiette: cotisations et contributions . allocations familiales
abattement: participation CPAM
valeur: cotisations et contributions . allocations familiales
abattement: participation CPAM
références:
Fiche Urssaf: https://www.urssaf.fr/portail/home/taux-et-baremes/taux-de-cotisations/les-praticiens-et-auxiliaires-me/taux-de-cotisations-medecin-sect.html
@ -728,9 +727,8 @@ dirigeant . indépendant . PL . CARMF . retraite CNAVPL:
Pour compenser la hausse de la CSG, les médecins de secteur 1 bénéficient d'une participation de l'assurance maladie (avenant n°5 de la convention médicale) au financement de leurs cotisations du régime de base.
remplace: cotisations et contributions . retraite de base
formule:
allègement:
assiette: PL . retraite CNAVPL
abattement: participation CPAM
valeur: PL . retraite CNAVPL
abattement: participation CPAM
références:
Avenant 5 à la convention médical: https://www.ameli.fr/sites/default/files/Documents/434342/document/avis_relatif_a_lavenant_ndeg_5_a_la_convention_nationale_organisant_les_rapports_entre_les_medecins_liberaux_et_lassurance_maladie.pdf
@ -821,15 +819,14 @@ dirigeant . indépendant . PL . CARMF . ASV:
par les Caisses maladie.
non applicable si: métier . secteur médecin = 'non conventionné'
formule:
allègement:
assiette [ref]:
somme:
- 5253 €/an
- produit:
assiette: PAMC . revenus activité conventionnée
plafond: 5 * plafond sécurité sociale temps plein
taux: 3.80%
abattement: participation CPAM
valeur [ref assiette]:
somme:
- 5253 €/an
- produit:
assiette: PAMC . revenus activité conventionnée
plafond: 5 * plafond sécurité sociale temps plein
taux: 3.80%
abattement: participation CPAM
arrondi: oui
références:
Taux 2020: http://www.carmf.fr/page.php?page=chiffrescles/stats/2020/taux2020.htm
@ -1031,9 +1028,8 @@ dirigeant . indépendant . PL . CARCDSF . sage-femme . PCV:
(CPAM).
formule:
allègement:
assiette: 780 €/an
abattement [ref participation CPAM]: 520 €/an
valeur: 780 €/an
abattement [ref participation CPAM]: 520 €/an
références:
Site CARCDSF: http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
note: |

View File

@ -299,13 +299,12 @@ contrat salarié . activité partielle . indemnités . complémentaire:
# La condition suivante assure que cette règle ne crée pas de boucle avec indemnités . conventionnelle . part soumise à cotisation
non applicable si: rémunération . brut de base > 3.15 * SMIC
formule:
allègement:
assiette: rémunération mensuelle minimale
abattement:
somme:
- rémunération . net de cotisations
- indemnités . base
- indemnités . conventionnelle
valeur: rémunération mensuelle minimale
abattement:
somme:
- rémunération . net de cotisations
- indemnités . base
- indemnités . conventionnelle
contrat salarié . activité partielle . indemnités . conventionnelle:
applicable si: convention syntec
@ -432,9 +431,9 @@ contrat salarié . déduction forfaitaire spécifique:
# pour les journalistes. Nécessite probablement de faire un re-remplacement
# inverse.
formule:
allègement:
assiette: cotisations . assiette
abattement: taux
valeur: cotisations . assiette
abattement:
valeur: taux * cotisations . assiette
plafond: 7600 €/an
plancher: cotisations . assiette minimale
références:
@ -1154,23 +1153,22 @@ contrat salarié . cotisations . assiette:
références:
Fiche Urssaf: https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/la-base-de-calcul.html
formule:
allègement:
assiette: rémunération . brut
abattement:
somme:
- frais professionnels . part déductible
- stage . gratification minimale
# TODO: La prévoyance et la retraite supplémentaire ne sont pour
# l'instant pas exposées sur les simulateurs. Je les désactive ici pour
# résoudre un problème de cycle avec la déduction forfaitaire
# spécifique.
#
# Il faudra soit supprimer complètement ces règles prévoyance /
# retraite supplémentaire (que j'avais ajoutées dans le cadre du POC
# Paie), soit les exposer dans un simulateur.
#
# - prévoyance . part déductible
# - retraite supplémentaire . part déductible
valeur: rémunération . brut
abattement:
somme:
- frais professionnels . part déductible
- stage . gratification minimale
# TODO: La prévoyance et la retraite supplémentaire ne sont pour
# l'instant pas exposées sur les simulateurs. Je les désactive ici pour
# résoudre un problème de cycle avec la déduction forfaitaire
# spécifique.
#
# Il faudra soit supprimer complètement ces règles prévoyance /
# retraite supplémentaire (que j'avais ajoutées dans le cadre du POC
# Paie), soit les exposer dans un simulateur.
#
# - prévoyance . part déductible
# - retraite supplémentaire . part déductible
contrat salarié . cotisations . assiette . salariale:
titre: Assiette des cotisations sociales
@ -1182,9 +1180,8 @@ contrat salarié . cotisations . assiette . salariale:
variations:
- si: apprentissage
alors:
allègement:
assiette: cotisations . assiette
abattement: 79% * SMIC
valeur: cotisations . assiette
abattement: 79% * SMIC
- sinon: cotisations . assiette
contrat salarié . cotisations . assiette minimale:
@ -1383,19 +1380,18 @@ contrat salarié . rémunération . brut:
# et de retraite complémentaire on ne ré-intègre ici que la part employeur
# (car la part salarié est déjà comptabilisé dans `rémunération . brut de
# base` dont elle vient en déduction).
allègement:
assiette:
somme:
- rémunération . brut de base
- avantages en nature . montant
- primes
- CDD . indemnités salarié
- heures supplémentaires
- heures complémentaires
- frais professionnels
- prévoyance . employeur
- retraite supplémentaire . employeur
abattement: activité partielle . retrait absence
valeur:
somme:
- rémunération . brut de base
- avantages en nature . montant
- primes
- CDD . indemnités salarié
- heures supplémentaires
- heures complémentaires
- frais professionnels
- prévoyance . employeur
- retraite supplémentaire . employeur
abattement: activité partielle . retrait absence
contrat salarié . rémunération . heures supplémentaires:
titre: rémunération heures supplémentaires
@ -2494,9 +2490,8 @@ contrat salarié . retraite supplémentaire:
contrat salarié . retraite supplémentaire . part déductible:
formule:
allègement:
assiette: retraite supplémentaire . employeur
abattement: plafond d'exonération sociale employeur
valeur: retraite supplémentaire . employeur
abattement: plafond d'exonération sociale employeur
contrat salarié . retraite supplémentaire . plafond d'exonération sociale employeur:
formule:
@ -3071,9 +3066,8 @@ contrat salarié . prévoyance:
contrat salarié . prévoyance . part déductible:
formule:
allègement:
assiette: prévoyance . employeur
abattement: plafond exonération sociale employeur
valeur: prévoyance . employeur
abattement: plafond exonération sociale employeur
contrat salarié . prévoyance . plafond exonération sociale employeur:
formule:
@ -3141,13 +3135,12 @@ contrat salarié . taxe d'apprentissage . assiette:
variations:
- si: apprentissage
alors:
allègement:
assiette: cotisations . assiette
abattement:
variations:
- si: établissement . localisation . outre-mer
alors: 20% * SMIC
- sinon: 11% * SMIC
valeur: cotisations . assiette
abattement:
variations:
- si: établissement . localisation . outre-mer
alors: 20% * SMIC
- sinon: 11% * SMIC
- sinon: cotisations . assiette
contrat salarié . taxe d'apprentissage . base:
@ -3213,9 +3206,8 @@ contrat salarié . taxe sur les salaires . assiette de base:
contrat salarié . taxe sur les salaires . assiette:
formule:
allègement:
assiette: assiette de base
abattement: prime d'impatriation
valeur: assiette de base
abattement: prime d'impatriation
références:
bofig: http://bofip.impots.gouv.fr/bofip/6691-PGP.html
impots.gouv.fr: https://www.impots.gouv.fr/portail/international-particulier/le-regime-des-impatries
@ -3288,9 +3280,8 @@ contrat salarié . profession spécifique . journaliste . abattement fiscal:
remplace: rémunération . net imposable
titre: net imposable journaliste
formule:
allègement:
assiette: rémunération . net imposable
abattement: 7650€/an
valeur: rémunération . net imposable
abattement: 7650€/an
contrat salarié . profession spécifique . ouvrier du bâtiment:
icônes: 👷‍♂️

View File

@ -351,7 +351,7 @@ exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): av
exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 2`] = `"[917,0,0,10757,4,20]"`;
exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = `"[0,0,0,0,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = `"[-22,0,0,0,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 2`] = `"[14,0,0,140,0,1]"`;

View File

@ -128,8 +128,8 @@ const traverseASTNode: TraverseFunction<NodeKind> = (fn, node) => {
return traverseProductNode(fn, node)
case 'recalcul':
return traverseRecalculNode(fn, node)
case 'allègement':
return traverseReductionNode(fn, node)
case 'abattement':
return traverseAbattementNode(fn, node)
case 'nom dans la situation':
return traverseSituationNode(fn, node)
case 'synchronisation':
@ -290,12 +290,11 @@ const traverseRecalculNode: TraverseFunction<'recalcul'> = (fn, node) => ({
},
})
const traverseReductionNode: TraverseFunction<'allègement'> = (fn, node) => ({
const traverseAbattementNode: TraverseFunction<'abattement'> = (fn, node) => ({
...node,
explanation: {
assiette: fn(node.explanation.assiette),
abattement: fn(node.explanation.abattement),
plafond: fn(node.explanation.plafond),
},
})

View File

@ -1,3 +1,4 @@
import { AbattementNode } from '../mecanisms/abattement'
import { ApplicableSiNode } from '../mecanisms/applicable'
import { ArrondiNode } from '../mecanisms/arrondi'
import { OperationNode } from '../mecanisms/operation'
@ -17,7 +18,6 @@ import { ParDéfautNode } from '../mecanisms/parDéfaut'
import { PlancherNode } from '../mecanisms/plancher'
import { ProductNode } from '../mecanisms/product'
import { RecalculNode } from '../mecanisms/recalcul'
import { ReductionNode } from '../mecanisms/reduction'
import { PossibilityNode } from '../mecanisms/one-possibility'
import { SituationNode } from '../mecanisms/situation'
import { SommeNode } from '../mecanisms/sum'
@ -38,6 +38,7 @@ export type ConstantNode = {
export type ASTNode = (
| RuleNode
| ReferenceNode
| AbattementNode
| ApplicableSiNode
| ArrondiNode
| BarèmeNode
@ -56,7 +57,6 @@ export type ASTNode = (
| PlancherNode
| ProductNode
| RecalculNode
| ReductionNode
| SituationNode
| SommeNode
| SynchronisationNode

View File

@ -0,0 +1,72 @@
import { EvaluationFunction, serializeUnit } from '..'
import { ASTNode } from '../AST/types'
import { warning } from '../error'
import { mergeAllMissing } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import { convertNodeToUnit } from '../nodeUnits'
import parse from '../parse'
import { Context } from '../parsePublicodes'
export type AbattementNode = {
explanation: {
assiette: ASTNode
abattement: ASTNode
}
nodeKind: 'abattement'
}
const evaluateAbattement: EvaluationFunction<'abattement'> = function (node) {
const assiette = this.evaluate(node.explanation.assiette)
let abattement = this.evaluate(node.explanation.abattement)
const percentageAbattement = serializeUnit(abattement.unit) === '%'
if (assiette.unit && !percentageAbattement) {
try {
abattement = convertNodeToUnit(assiette.unit, abattement)
} catch (e) {
warning(
this.options.logger,
this.cache._meta.ruleStack[0],
"Impossible de convertir les unités de l'allègement entre elles",
e
)
}
}
const assietteValue = assiette.nodeValue as number
const abattementValue = abattement.nodeValue as number | null
const nodeValue = abattement
? abattementValue == null
? assietteValue === 0
? 0
: null
: serializeUnit(abattement.unit) === '%'
? Math.max(0, assietteValue - (abattementValue / 100) * assietteValue)
: Math.max(0, assietteValue - abattementValue)
: assietteValue
return {
...node,
nodeValue,
unit: assiette.unit,
missingVariables: mergeAllMissing([assiette, abattement]),
explanation: {
assiette,
abattement,
},
}
}
export default function parseAbattement(v, context: Context) {
const explanation = {
assiette: parse(v.valeur, context),
abattement: parse(v.abattement, context),
}
return {
explanation,
nodeKind: parseAbattement.nom,
}
}
parseAbattement.nom = 'abattement' as const
registerEvaluationFunction(parseAbattement.nom, evaluateAbattement)

View File

@ -1,83 +0,0 @@
import { ASTNode } from '../AST/types'
import { warning } from '../error'
import { defaultNode, evaluateObject, parseObject } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import { convertNodeToUnit } from '../nodeUnits'
import { serializeUnit } from '../units'
export type ReductionNode = {
explanation: {
assiette: ASTNode
abattement: ASTNode
plafond: ASTNode
}
nodeKind: 'allègement'
}
const objectShape = {
assiette: false,
abattement: defaultNode(0),
plafond: defaultNode(Infinity),
}
const evaluate = evaluateObject<'allègement'>(function ({
assiette,
abattement,
plafond,
}) {
const assietteValue = assiette.nodeValue
if (assietteValue == null) return { nodeValue: null }
if (assiette.unit) {
try {
plafond = convertNodeToUnit(assiette.unit, plafond)
if (serializeUnit(abattement.unit) !== '%') {
abattement = convertNodeToUnit(assiette.unit, abattement)
}
} catch (e) {
warning(
this.options.logger,
this.cache._meta.ruleStack[0],
"Impossible de convertir les unités de l'allègement entre elles",
e
)
}
}
const nodeValue = abattement
? abattement.nodeValue == null
? assietteValue === 0
? 0
: null
: serializeUnit(abattement.unit) === '%'
? Math.max(
0,
assietteValue -
Math.min(
plafond.nodeValue,
(abattement.nodeValue / 100) * assietteValue
)
)
: Math.max(
0,
assietteValue - Math.min(plafond.nodeValue, abattement.nodeValue)
)
: assietteValue
return {
nodeValue,
...('unit' in assiette && { unit: assiette.unit }),
explanation: {
plafond,
abattement,
},
}
})
export const mecanismReduction = (v, context) => {
const explanation = parseObject(objectShape, v, context)
return {
explanation,
nodeKind: 'allègement',
} as ReductionNode
}
registerEvaluationFunction('allègement', evaluate)

View File

@ -2,6 +2,7 @@ import { Grammar, Parser } from 'nearley'
import { ASTNode } from './AST/types'
import { EngineError, syntaxError } from './error'
import grammar from './grammar.ne'
import abattement from './mecanisms/abattement'
import applicable from './mecanisms/applicable'
import arrondi from './mecanisms/arrondi'
import barème from './mecanisms/barème'
@ -21,7 +22,6 @@ import plafond from './mecanisms/plafond'
import plancher from './mecanisms/plancher'
import { mecanismProduct } from './mecanisms/product'
import { mecanismRecalcul } from './mecanisms/recalcul'
import { mecanismReduction } from './mecanisms/reduction'
import situation from './mecanisms/situation'
import { mecanismSum } from './mecanisms/sum'
import { mecanismSynchronisation } from './mecanisms/synchronisation'
@ -155,6 +155,7 @@ const chainableMecanisms = [
unité,
plancher,
plafond,
abattement,
situation,
]
function parseChainedMecanisms(rawNode, context: Context): ASTNode {
@ -193,7 +194,6 @@ const parseFunctions = {
durée,
'le maximum de': mecanismMax,
'le minimum de': mecanismMin,
allègement: mecanismReduction,
variations,
synchronisation: mecanismSynchronisation,
valeur: parse,

View File

@ -26,9 +26,8 @@ revenu imposable:
revenu abattu:
formule:
allègement:
assiette: revenu imposable
abattement: 10%
valeur: revenu imposable
abattement: 10%
impôt sur le revenu:
formule:
@ -47,11 +46,10 @@ impôt sur le revenu:
impôt sur le revenu à payer:
formule:
allègement:
assiette: impôt sur le revenu
abattement:
valeur: 1177 - (75% * impôt sur le revenu)
plancher: 0
valeur: impôt sur le revenu
abattement:
valeur: 1177 - (75% * impôt sur le revenu)
plancher: 0
`
let engine = new Engine(rules)

View File

@ -0,0 +1,28 @@
montant:
unité:
montant abattu:
unité:
formule:
valeur: montant
abattement: 20507
exemples:
- situation:
montant: 10000
valeur attendue: 0
- situation:
montant: 80000
valeur attendue: 59493
montant abattu en pourcentage:
unité:
formule:
valeur: montant
abattement: 15%
exemples:
- situation:
montant: 10000
valeur attendue: 8500
- situation:
montant: 80000
valeur attendue: 68000

View File

@ -1,45 +0,0 @@
montant:
unité:
montant abattu:
unité:
formule:
allègement:
assiette: montant
abattement: 20507
exemples:
- situation:
montant: 10000
valeur attendue: 0
- situation:
montant: 80000
valeur attendue: 59493
montant abattu en pourcentage:
unité:
formule:
allègement:
assiette: montant
abattement: 15%
exemples:
- situation:
montant: 10000
valeur attendue: 8500
- situation:
montant: 80000
valeur attendue: 68000
montant abattu avec plafond numérique:
unité:
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

View File

@ -152,11 +152,10 @@ Conversion avec composantes:
assiette annuelle: 20000
valeur attendue: 180
Conversion dans un allègement:
Conversion dans un abattement:
formule:
allègement:
assiette: 1000€/an
abattement: 10€/mois
valeur: 1000€/an
abattement: 10€/mois
unité: €/an
exemples:
valeur attendue: 880
@ -164,17 +163,15 @@ Conversion dans un allègement:
Conversion dans avec un abattement en %:
unité: €/an
formule:
allègement:
assiette: 1000€/an
abattement: 10%
valeur: 1000€/an
abattement: 10%
exemples:
- valeur attendue: 900
assiette cotisations:
formule:
allègement:
assiette: assiette mensuelle
abattement: 1200 €/an
valeur: assiette mensuelle
abattement: 1200 €/an
prévoyance cadre:
formule:

View File

@ -32,10 +32,9 @@ paramètre nommés imbriqués:
paramètre nommé utilisé dans la règle:
formule:
allègement:
assiette [ref] : 500
abattement:
valeur: assiette * 10%
plancher: 100
valeur [ref assiette] : 500
abattement:
valeur: assiette * 10%
plancher: 100
exemples:
- valeur attendue: 400
- valeur attendue: 400

View File

@ -399,7 +399,7 @@ composantes:
vérification:
prix = prix . HT + prix . TVA
allègement:
abattement:
description: >-
Permet de réduire le montant d'une variable.
@ -407,9 +407,8 @@ allègement:
exemples:
base: >-
impôt . revenu abattu:
allègement:
assiette: base des cotisations
abattement: abattement
valeur: base des cotisations
abattement: abattement
plancher:

View File

@ -1,5 +1,5 @@
import { ConstantNode, Leaf } from './mecanisms/common'
import Allègement from './mecanisms/Allègement'
import Abattement from './mecanisms/Abattement'
import ApplicableSi from './mecanisms/Applicable'
import Arrondi from './mecanisms/Arrondi'
import Barème from './mecanisms/Barème'
@ -33,7 +33,7 @@ import { EngineContext } from './contexts'
const UIComponents = {
constant: ConstantNode,
allègement: Allègement,
abattement: Abattement,
'applicable si': ApplicableSi,
arrondi: Arrondi,
barème: Barème,

View File

@ -1,10 +1,10 @@
import Explanation from '../Explanation'
import { Mecanism } from './common'
export default function Allègement({ nodeValue, explanation }) {
export default function Abattement({ nodeValue, unit, explanation }) {
return (
<div>
<Mecanism name="allègement" value={nodeValue} unit={explanation.unit}>
<Mecanism name="Abattement" value={nodeValue} unit={unit}>
<ul className="properties">
<li key="assiette">
<span className="key">Assiette : </span>
@ -12,7 +12,7 @@ export default function Allègement({ nodeValue, explanation }) {
<Explanation node={explanation.assiette} />
</span>
</li>
{!explanation.abattement?.isDefault && (
{!explanation.abattement?.nodeValue && (
<li key="abattement">
<span className="key">Abattement : </span>
<span className="value">
@ -20,14 +20,6 @@ export default function Allègement({ nodeValue, explanation }) {
</span>
</li>
)}
{!explanation.plafond?.isDefault && (
<li key="plafond">
<span className="key">Plafond : </span>
<span className="value">
<Explanation node={explanation.plafond} />
</span>
</li>
)}
</ul>
</Mecanism>
</div>

View File

@ -2,7 +2,7 @@ const colors = {
'applicable si': '#9b59b6',
'non applicable si': '#9b59b6',
somme: '#18457B',
allègement: '#B73731',
abattement: '#B73731',
produit: '#2ecc71',
'une de ces conditions': '#3498db',
'toutes ces conditions': '#3498db',