diff --git a/site/cypress/integration/mon-entreprise/reduction-generale.ts b/site/cypress/integration/mon-entreprise/reduction-generale.ts index 56859585a..760947c69 100755 --- a/site/cypress/integration/mon-entreprise/reduction-generale.ts +++ b/site/cypress/integration/mon-entreprise/reduction-generale.ts @@ -1,89 +1,155 @@ import { checkA11Y, fr } from '../../support/utils' -describe('Réduction générale', { testIsolation: false }, function () { - if (!fr) { - return +describe( + 'Simulateur réduction générale', + { testIsolation: false }, + function () { + if (!fr) { + return + } + + const inputSelector = + 'div[id="simulator-legend"] input[inputmode="numeric"]' + + before(function () { + return cy.visit('/simulateurs/réduction-générale') + }) + + it('should not crash', function () { + cy.contains('Salaire brut') + }) + + it('should allow to select a company size', function () { + cy.get(inputSelector).first().type('{selectall}2000') + + cy.contains('Plus de 50 salariés').click() + cy.contains('Modifier mes réponses').click() + cy.get('div[data-cy="modal"]') + .eq(0) + .contains('Effectif') + .next() + .contains('100') + cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click() + + cy.contains('Moins de 50 salariés').click() + cy.contains('Modifier mes réponses').click() + cy.get('div[data-cy="modal"]') + .eq(0) + .contains('Effectif') + .next() + .contains('10') + cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click() + }) + + it('should allow to change time period', function () { + cy.contains('Réduction mensuelle').click() + cy.get(inputSelector).first().type('{selectall}2000') + + cy.contains('Réduction annuelle').click() + cy.get(inputSelector).first().should('have.value', '24 000 €') + }) + + it('should display values for the réduction générale', function () { + cy.contains('Réduction mensuelle').click() + cy.get(inputSelector).first().type('{selectall}1900') + + cy.get( + 'p[id="salarié___cotisations___exonérations___réduction_générale-value"]' + ).should('include.text', '493,43 €') + cy.get( + 'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]' + ).should('include.text', '92,85 €') + cy.get( + 'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]' + ).should('include.text', '400,58 €') + cy.get( + 'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]' + ).should('include.text', '62,57 €') + }) + + it('should display a warning for a remuneration too high', function () { + cy.contains('Réduction mensuelle').click() + cy.get(inputSelector).first().type('{selectall}3000') + + cy.get('div[id="simulator-legend"]').should( + 'include.text', + 'La RGCP concerne uniquement les salaires inférieurs à 1,6 SMIC.' + ) + + cy.get( + 'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]' + ).should('include.text', '0 €') + cy.get( + 'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]' + ).should('include.text', '0 €') + cy.get( + 'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]' + ).should('include.text', '0 €') + }) + + it('should display remuneration and RGCP month by month', function () { + cy.contains('Réduction annuelle').click() + cy.get(inputSelector).first().type('{selectall}30000') + + cy.contains('Réduction mois par mois').click() + cy.contains('Réduction générale mois par mois :') + cy.get(inputSelector) + .should('have.length', 12) + .each(($input) => { + cy.wrap($input).should('have.value', '2 500 €') + }) + cy.get( + 'td[id^="salarié___cotisations___exonérations___réduction_générale-"]' + ) + .should('have.length', 12) + .each(($td) => { + cy.wrap($td).should('include.text', '174 €') + }) + }) + + it('should calculate RGCP month by month independently', function () { + cy.contains('Moins de 50 salariés').click() + cy.contains('Réduction mois par mois').click() + + cy.get(inputSelector).first().type('{selectall}1900') + cy.get(inputSelector).last().type('{selectall}2000') + cy.get( + 'td[id="salarié___cotisations___exonérations___réduction_générale-janvier"]' + ).should('include.text', '493,43 €') + cy.get( + 'td[id="salarié___cotisations___exonérations___réduction_générale-décembre"]' + ).should('include.text', '440,20 €') + }) + + it('should save remuneration between tabs', function () { + cy.contains('Moins de 50 salariés').click() + cy.contains('Réduction mensuelle').click() + cy.get(inputSelector).first().type('{selectall}1900') + cy.contains('Réduction mois par mois').click() + cy.get(inputSelector).first().type('{selectall}2000') + cy.get(inputSelector).last().type('{selectall}2000') + + cy.contains('Réduction mensuelle').click() + cy.get(inputSelector).first().should('have.value', '1 916,67 €') + cy.contains('Réduction annuelle').click() + cy.get(inputSelector).first().should('have.value', '23 000 €') + cy.contains('Réduction mois par mois').click() + cy.get(inputSelector).each(($input, index) => { + let expectedValue = '1 900 €' + if (index === 0 || index === 11) { + expectedValue = '2 000 €' + } + cy.wrap($input).should('have.value', expectedValue) + }) + }) + + it('should be RGAA compliant', function () { + cy.contains('Réduction mensuelle').click() + checkA11Y() + cy.contains('Réduction annuelle').click() + checkA11Y() + cy.contains('Réduction mois par mois').click() + checkA11Y() + }) } - - const inputSelector = 'div[id="simulator-legend"] input[inputmode="numeric"]' - - before(function () { - return cy.visit('/simulateurs/réduction-générale') - }) - - it('should not crash', function () { - cy.contains('Salaire brut') - }) - - it('should allow to select a company size', function () { - cy.get(inputSelector).first().type('{selectall}2000') - - cy.contains('Plus de 50 salariés').click() - cy.contains('Modifier mes réponses').click() - cy.get('div[data-cy="modal"]') - .eq(0) - .contains('Effectif') - .next() - .contains('100') - cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click() - - cy.contains('Moins de 50 salariés').click() - cy.contains('Modifier mes réponses').click() - cy.get('div[data-cy="modal"]') - .eq(0) - .contains('Effectif') - .next() - .contains('10') - cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click() - }) - - it('should allow to change time period', function () { - cy.contains('Réduction mensuelle').click() - cy.get(inputSelector).first().type('{selectall}2000') - - cy.contains('Réduction annuelle').click() - cy.get(inputSelector).first().should('have.value', '24 000 €') - }) - - it('should display values for the réduction générale', function () { - cy.contains('Réduction mensuelle').click() - cy.get(inputSelector).first().type('{selectall}1900') - - cy.get( - 'p[id="salarié___cotisations___exonérations___réduction_générale-value"]' - ).should('include.text', '493,43 €') - cy.get( - 'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]' - ).should('include.text', '92,85 €') - cy.get( - 'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]' - ).should('include.text', '400,58 €') - cy.get( - 'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]' - ).should('include.text', '62,57 €') - }) - - it('should display a warning for a salary too high', function () { - cy.contains('Réduction mensuelle').click() - cy.get(inputSelector).first().type('{selectall}3000') - - cy.get('div[id="simulator-legend"]').should( - 'include.text', - 'La RGCP concerne uniquement les salaires inférieurs à 1,6 SMIC.' - ) - - cy.get( - 'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]' - ).should('include.text', '0 €') - cy.get( - 'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]' - ).should('include.text', '0 €') - cy.get( - 'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]' - ).should('include.text', '0 €') - }) - - it('should be RGAA compliant', function () { - checkA11Y() - }) -}) +) diff --git a/site/source/pages/simulateurs/reduction-generale/RéductionGénérale.tsx b/site/source/pages/simulateurs/reduction-generale/RéductionGénérale.tsx index 3c70b6fa9..4ebc951f5 100644 --- a/site/source/pages/simulateurs/reduction-generale/RéductionGénérale.tsx +++ b/site/source/pages/simulateurs/reduction-generale/RéductionGénérale.tsx @@ -30,6 +30,7 @@ import { getInitialRéductionGénéraleMoisParMois, getRéductionGénéraleFromRémunération, MonthState, + réductionGénéraleDottedName, reevaluateRéductionGénéraleMoisParMois, rémunérationBruteDottedName, } from './utils' @@ -174,9 +175,9 @@ function RéductionGénéraleSimulationGoals({ - + = 0`}> diff --git a/site/source/pages/simulateurs/reduction-generale/RéductionGénéraleMoisParMois.tsx b/site/source/pages/simulateurs/reduction-generale/RéductionGénéraleMoisParMois.tsx index debc1f3d9..82e666061 100644 --- a/site/source/pages/simulateurs/reduction-generale/RéductionGénéraleMoisParMois.tsx +++ b/site/source/pages/simulateurs/reduction-generale/RéductionGénéraleMoisParMois.tsx @@ -13,7 +13,11 @@ import { Tooltip } from '@/design-system/tooltip' import Répartition from './components/Répartition' import Warnings from './components/Warnings' import WarningSalaireTrans from './components/WarningSalaireTrans' -import { MonthState, rémunérationBruteDottedName } from './utils' +import { + MonthState, + réductionGénéraleDottedName, + rémunérationBruteDottedName, +} from './utils' type RémunérationBruteInput = { unité: string @@ -85,10 +89,7 @@ export default function RéductionGénéraleMoisParMois({ {t('Réduction générale')} - + @@ -113,7 +114,7 @@ export default function RéductionGénéraleMoisParMois({ id={`${rémunérationBruteDottedName.replace( /\s|\./g, '_' - )}-${monthIndex}`} + )}-${monthName}`} aria-label={`${engine.getRule(rémunérationBruteDottedName) ?.title} (${monthName})`} onChange={(rémunérationBrute?: PublicodesExpression) => @@ -128,7 +129,12 @@ export default function RéductionGénéraleMoisParMois({ }} /> - + {data[monthIndex].réductionGénérale ? ( diff --git a/site/source/pages/simulateurs/reduction-generale/components/Répartition.tsx b/site/source/pages/simulateurs/reduction-generale/components/Répartition.tsx index 61abd5895..7a9a28136 100644 --- a/site/source/pages/simulateurs/reduction-generale/components/Répartition.tsx +++ b/site/source/pages/simulateurs/reduction-generale/components/Répartition.tsx @@ -7,6 +7,8 @@ import { Li, Ul } from '@/design-system/typography/list' import { Body } from '@/design-system/typography/paragraphs' import { Contexte } from '@/domaine/Contexte' +import { réductionGénéraleDottedName } from '../utils' + type Props = { contexte?: Contexte } @@ -22,19 +24,19 @@ export default function Répartition({ contexte = {} }: Props) { { const réductionGénérale = engine.evaluate({ - valeur: 'salarié . cotisations . exonérations . réduction générale', + valeur: réductionGénéraleDottedName, unité: '€/mois', contexte: { [rémunérationBruteDottedName]: rémunérationBrute,