diff --git a/modele-social/règles/salarié/cotisations.publicodes b/modele-social/règles/salarié/cotisations.publicodes index 0d09ff623..33790ba56 100644 --- a/modele-social/règles/salarié/cotisations.publicodes +++ b/modele-social/règles/salarié/cotisations.publicodes @@ -331,10 +331,10 @@ salarié . cotisations . exonérations . réduction générale: produit: - 1.6 * temps de travail . SMIC / cotisations . assiette - 1 - T / 0.6 - plancher: 0% + plancher: 0 plafond: T - unité: '%' - arrondi: 2 décimales + unité: '' + arrondi: 4 décimales références: Code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000048852497 Urssaf.fr: https://www.urssaf.fr/accueil/employeur/beneficier-exonerations/reduction-generale-cotisation.html#ancre-les-trois-etapes-de-calcul @@ -366,9 +366,9 @@ salarié . cotisations . exonérations . réduction générale: - 130% salarié . cotisations . exonérations . T: - privé: oui titre: Coefficient T - unité: '%' + unité: '' + arrondi: 4 décimales somme: - sécurité sociale et chômage - valeur: retraite complémentaire . employeur . taux T1 diff --git a/site/source/pages/simulateurs/reduction-generale/utils.ts b/site/source/pages/simulateurs/reduction-generale/utils.ts index c75b2d426..67e2f3119 100644 --- a/site/source/pages/simulateurs/reduction-generale/utils.ts +++ b/site/source/pages/simulateurs/reduction-generale/utils.ts @@ -84,3 +84,44 @@ const getRégularisationAnnuelle = ( return realRéductionGénéraleAnnuelle - currentRéductionGénéraleAnnuelle } + +export const getRégularisationProgressive = ( + monthIndex: number, + data: MonthState[], + engine: Engine +): number => { + if (monthIndex > data.length - 1) { + return 0 + } + + const nbOfMonths = monthIndex + 1 + const partialData = data.slice(0, nbOfMonths) + const currentRéductionGénéraleTotale = sumAll( + partialData.map((monthData) => monthData.réductionGénérale) + ) + const rémunérationBruteTotale = sumAll( + partialData.map((monthData) => monthData.rémunérationBrute) + ) + const SMICMensuel = engine.evaluate({ + valeur: 'salarié . temps de travail . SMIC', + unité: 'heures/mois', + }).nodeValue as number + + // Si on laisse l'engine calculer T dans le calcul de la réduction générale, + // le résultat ne sera pas bon à cause de l'assiette de cotisations du contexte + const coefT = engine.evaluate({ + valeur: 'salarié . cotisations . exonérations . T' , + }).nodeValue as number + + const realRéductionGénéraleTotale = engine.evaluate({ + valeur: réductionGénéraleDottedName, + arrondi: 'non', + contexte: { + [rémunérationBruteDottedName]: rémunérationBruteTotale, + 'salarié . temps de travail . SMIC': nbOfMonths * SMICMensuel, + 'salarié . cotisations . exonérations . T': coefT, + } + }).nodeValue as number + + return realRéductionGénéraleTotale - currentRéductionGénéraleTotale +}