🔨 Ajoute la reduction de cotisations pour les heures supplémentaires

TODO: uniformiser la façon de gérer les réductions sur la fiche de paie, entre employeur et salarié
pull/629/head
Johan Girod 2019-08-26 17:37:05 +02:00
parent 18318008ac
commit a247e5d57c
No known key found for this signature in database
GPG Key ID: 9E27B57DA2E8AE12
9 changed files with 82 additions and 44 deletions

View File

@ -37,14 +37,14 @@ export default compose(
parsedRules
}: ConnectedPropTypes) => {
let getRule = getRuleFromAnalysis(analysis)
console.log(
getRule(
'contrat salarié . temps de travail . heures supplémentaires . nombre effectuées'
),
analysis.cache[
'contrat salarié . temps de travail . heures supplémentaires . nombre effectuées'
]
const heuresSupplémentaires = getRule(
'contrat salarié . temps de travail . heures supplémentaires'
)
const réductionHeuresSupplémentaires = getRule(
'contrat salarié . cotisations . salariales . réduction heures supplémentaires'
)
console.log(réductionHeuresSupplémentaires)
return (
<div
@ -60,13 +60,13 @@ export default compose(
<div className="payslip__salarySection">
<Line
rule={getRule('contrat salarié . temps de travail')}
maximumFractionDigits={0}
maximumFractionDigits={1}
/>
<Line
rule={getRule(
'contrat salarié . temps de travail . heures supplémentaires . nombre effectuées'
)}
maximumFractionDigits={0}
maximumFractionDigits={1}
/>
</div>
@ -117,18 +117,26 @@ export default compose(
</h5>
<Line
negative
rule={getRule('contrat salarié . réductions de cotisations')}
rule={getRule(
'contrat salarié . cotisations . patronales . réductions de cotisations'
)}
/>
<Value unit="€" nilValueSymbol="—">
{0}
</Value>
<span />
{heuresSupplémentaires.nodeValue && (
<>
<RuleLink {...réductionHeuresSupplémentaires} />
<span />
<Value {...réductionHeuresSupplémentaires} />
</>
)}
{/* Total cotisation */}
<div className="payslip__total">
<Trans>Total des retenues</Trans>
</div>
<Value
nilValueSymbol="—"
{...getRule('contrat salarié . cotisations . patronales à payer')}
{...getRule('contrat salarié . cotisations . patronales . à payer')}
unit="€"
className="payslip__total"
/>
@ -140,9 +148,7 @@ export default compose(
/>
{/* Salaire chargé */}
<Line rule={getRule('contrat salarié . rémunération . total')} />
<Value nilValueSymbol="—" unit="€">
{0}
</Value>
<span />
</div>
{/* Section salaire net */}
<SalaireNetSection getRule={getRule} />

View File

@ -15,7 +15,7 @@ objectifs:
objectifs secondaires:
- contrat salarié . temps de travail
- contrat salarié . cotisations . patronales à payer
- contrat salarié . cotisations . patronales . à payer
questions:
à l'affiche:

View File

@ -7,7 +7,7 @@ objectifs:
objectifs secondaires:
- contrat salarié . temps de travail
- contrat salarié . cotisations . patronales à payer
- contrat salarié . cotisations . patronales . à payer
questions:
à l'affiche:

View File

@ -1,7 +1,7 @@
import { map, mapObjIndexed, values } from 'ramda'
import React from 'react'
import { Node } from './common'
import { makeJsx } from '../evaluation'
import { mapObjIndexed, map, values } from 'ramda'
import { Node } from './common'
export default function Allègement(nodeValue, rawExplanation) {
// properties with a nodeValue of 0 are not interesting to display

View File

@ -1,4 +1,6 @@
import { decompose } from 'Engine/mecanisms/utils'
import variations from 'Engine/mecanisms/variations'
import { inferUnit } from 'Engine/units'
import {
add,
any,
@ -47,8 +49,6 @@ import Somme from './mecanismViews/Somme'
import { disambiguateRuleReference, findRuleByDottedName } from './rules'
import { anyNull, val } from './traverse-common-functions'
import uniroot from './uniroot'
import { inferUnit } from 'Engine/units'
import variations from 'Engine/mecanisms/variations'
export let mecanismOneOf = (recurse, k, v) => {
if (!is(Array, v)) throw new Error('should be array')

View File

@ -1076,6 +1076,37 @@
- CRDS
- APEC [salarié]
- complémentaire santé [salarié]
- réduction heures supplémentaires
- espace: contrat salarié . cotisations . salariales
nom: réduction heures supplémentaires
aide:
type: réduction de cotisations
unité:
période: flexible
formule: 0 - rémunération . heures supplémentaires * taux des cotisations réduites
# multiplication:
# assiette: rémunération . heures supplémentaires
# taux: taux des cotisations réduites
références:
Code de la sécurité sociale - Article D241-21: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000038056813&cidTexte=LEGITEXT000006073189
urssaf: https://www.urssaf.fr/portail/home/employeur/beneficier-dune-exoneration/exonerations-generales/la-reduction-de-cotisations-sala/modalites-de-calcul-et-de-declar.html
- espace: contrat salarié . cotisations . salariales . réduction heures supplémentaires
nom: taux des cotisations réduites
période: aucune
unité: '%'
description: le taux effectif des cotisations d'assurance vieillesse à la charge du salarié
formule:
le minimum de:
- 11.31%
- multiplication:
assiette:
somme:
- vieillesse [salarié]
- retraite complémentaire [salarié]
- contribution d'équilibre général [salarié]
facteur: 1 / assiette
- espace: contrat salarié . cotisations
nom: patronales
@ -1516,9 +1547,9 @@
Des [aides différées](/documentation/aides-employeur) peuvent venir diminuer ce montant.
formule: rémunération . total sans réduction - réductions de cotisations
formule: rémunération . total sans réduction - cotisations . patronales . réductions de cotisations
- espace: contrat salarié
- espace: contrat salarié . cotisations . patronales
nom: réductions de cotisations
période: flexible
unité:
@ -1528,8 +1559,8 @@
- exonération JEI
- réduction ACRE
- espace: contrat salarié . cotisations
nom: patronales à payer
- espace: contrat salarié . cotisations . patronales
nom: à payer
période: flexible
unité:
formule: patronales - réductions de cotisations
@ -1577,7 +1608,7 @@
- espace: contrat salarié
nom: cotisations
période: flexible
descitption: Total des cotisation patronales et salariales
description: Total des cotisation patronales et salariales
formule:
somme:
- patronales

View File

@ -15,10 +15,7 @@ import {
values
} from 'ramda'
import { createSelector } from 'reselect'
import {
getRuleFromAnalysis,
analysisWithDefaultsSelector
} from 'Selectors/analyseSelectors'
import { analysisWithDefaultsSelector } from 'Selectors/analyseSelectors'
import type { Analysis } from 'Types/Analysis'
import type {
@ -28,7 +25,6 @@ import type {
Branche,
FicheDePaie
} from 'Types/ResultViewTypes'
import { findRuleByDottedName } from 'Engine/rules'
import type { Règle } from 'Types/RegleTypes'
@ -123,6 +119,11 @@ export let analysisToCotisations = analysis => {
.map(name => analysis.cache[name])
.map(pathOr([], ['explanation', 'formule', 'explanation', 'explanation']))
.reduce(concat, [])
.filter(
({ dottedName }) =>
dottedName !==
'contrat salarié . cotisations . salariales . réduction heures supplémentaires'
)
const cotisations = pipe(
groupBy(prop('dottedName')),

View File

@ -1,5 +1,6 @@
/* @flow */
import { getRuleFromAnalysis } from 'Engine/rules'
import {
add,
compose,
@ -12,19 +13,18 @@ import {
mergeWith,
pick,
pipe,
propEq,
reduce,
sort,
propEq,
without
} from 'ramda'
import { createSelector } from 'reselect'
import {
BLANK_COTISATION,
mergeCotisations,
analysisToCotisations
} from './ficheDePaieSelectors'
import { analysisWithDefaultsSelector } from 'Selectors/analyseSelectors'
import { getRuleFromAnalysis } from 'Engine/rules'
import {
analysisToCotisations,
BLANK_COTISATION,
mergeCotisations
} from './ficheDePaieSelectors'
import type {
Cotisation,
@ -113,7 +113,7 @@ const répartition = (analysis): ?Répartition => {
salaireNet = getRule('contrat salarié . salaire . net'),
salaireChargé = getRule('contrat salarié . rémunération . total'),
réductionsDeCotisations = getRule(
'contrat salarié . réductions de cotisations'
'contrat salarié . cotisations . patronales . réductions de cotisations'
)
let CSG
const autresCotisations = cotisations['protection sociale . autres']

View File

@ -3,12 +3,12 @@
import { expect } from 'chai'
// $FlowFixMe
import salariéConfig from 'Components/simulationConfigs/salarié.yaml'
import { getRuleFromAnalysis } from 'Engine/rules'
import { analysisWithDefaultsSelector } from 'Selectors/analyseSelectors'
import {
analysisToCotisationsSelector,
COTISATION_BRANCHE_ORDER
} from 'Selectors/ficheDePaieSelectors'
import { analysisWithDefaultsSelector } from 'Selectors/analyseSelectors'
import { getRuleFromAnalysis } from 'Engine/rules'
let state = {
form: {
@ -57,7 +57,7 @@ describe('pay slip selector', function() {
it('should sum all cotisations', function() {
let pat = getRuleFromAnalysis(analysis)(
'contrat salarié . cotisations . patronales à payer'
'contrat salarié . cotisations . patronales . à payer'
),
sal = getRuleFromAnalysis(analysis)(
'contrat salarié . cotisations . salariales'