tests: ajoute des tests pour la réduction générale mois par mois
parent
a62f1cda6f
commit
67ac8277c5
|
@ -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()
|
||||
})
|
||||
})
|
||||
)
|
||||
|
|
|
@ -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({
|
|||
</Message>
|
||||
</Condition>
|
||||
|
||||
<Condition expression="salarié . cotisations . exonérations . réduction générale >= 0">
|
||||
<Condition expression={`${réductionGénéraleDottedName} >= 0`}>
|
||||
<SimulationValue
|
||||
dottedName="salarié . cotisations . exonérations . réduction générale"
|
||||
dottedName={réductionGénéraleDottedName}
|
||||
isInfoMode={true}
|
||||
round={false}
|
||||
/>
|
||||
|
|
|
@ -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({
|
|||
</th>
|
||||
<th scope="col">
|
||||
{t('Réduction générale')}
|
||||
<ExplicableRule
|
||||
dottedName="salarié . cotisations . exonérations . réduction générale"
|
||||
light
|
||||
/>
|
||||
<ExplicableRule dottedName={réductionGénéraleDottedName} light />
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
@ -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({
|
|||
}}
|
||||
/>
|
||||
</td>
|
||||
<td>
|
||||
<td
|
||||
id={`${réductionGénéraleDottedName.replace(
|
||||
/\s|\./g,
|
||||
'_'
|
||||
)}-${monthName}`}
|
||||
>
|
||||
{data[monthIndex].réductionGénérale ? (
|
||||
<Tooltip tooltip={tooltip} hasArrow={true}>
|
||||
<StyledDiv>
|
||||
|
|
|
@ -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) {
|
|||
<StyledUl>
|
||||
<StyledLi>
|
||||
<SimulationValue
|
||||
dottedName="salarié . cotisations . exonérations . réduction générale . part retraite"
|
||||
dottedName={`${réductionGénéraleDottedName} . part retraite`}
|
||||
contexte={contexte}
|
||||
round={false}
|
||||
/>
|
||||
</StyledLi>
|
||||
<StyledLi>
|
||||
<SimulationValue
|
||||
dottedName="salarié . cotisations . exonérations . réduction générale . part Urssaf"
|
||||
dottedName={`${réductionGénéraleDottedName} . part Urssaf`}
|
||||
contexte={contexte}
|
||||
round={false}
|
||||
/>
|
||||
<SimulationValue
|
||||
dottedName="salarié . cotisations . exonérations . réduction générale . part Urssaf . part chômage"
|
||||
dottedName={`${réductionGénéraleDottedName} . part Urssaf . part chômage`}
|
||||
label="dont chômage"
|
||||
contexte={contexte}
|
||||
round={false}
|
||||
|
|
|
@ -4,6 +4,8 @@ import Engine from 'publicodes'
|
|||
// TODO: remplacer "salarié . cotisations . assiette" par "salarié . rémunération . brut"
|
||||
// lorsqu'elle n'incluera plus les frais professionnels.
|
||||
export const rémunérationBruteDottedName = 'salarié . cotisations . assiette'
|
||||
export const réductionGénéraleDottedName =
|
||||
'salarié . cotisations . exonérations . réduction générale'
|
||||
|
||||
export type MonthState = {
|
||||
rémunérationBrute: number
|
||||
|
@ -15,7 +17,7 @@ export const getRéductionGénéraleFromRémunération = (
|
|||
rémunérationBrute: number
|
||||
): number => {
|
||||
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,
|
||||
|
|
Loading…
Reference in New Issue