mon-entreprise/source/components/PaySlip.js

185 lines
5.5 KiB
JavaScript

/* @flow */
import type { FicheDePaie } from 'Types/ResultViewTypes'
import withColours from 'Components/utils/withColours'
import { compose } from 'ramda'
import React, { Fragment } from 'react'
import { Trans } from 'react-i18next'
import { connect } from 'react-redux'
import FicheDePaieSelectors from 'Selectors/ficheDePaieSelectors'
import Montant from './Montant'
import './PaySlip.css'
import RuleLink from './RuleLink'
type ConnectedPropTypes = ?FicheDePaie & {
colours: { lightestColour: string }
}
const PaySlip = ({
colours: { lightestColour },
...ficheDePaie
}: ConnectedPropTypes) => {
if (!Object.values(ficheDePaie).length) {
return null
}
const {
salaireBrut,
avantagesEnNature,
salaireNetDeCotisations,
salaireDeBase,
salaireChargé,
indemnitésSalarié,
rémunérationNetteImposable,
nombreHeuresTravaillées,
salaireNet,
réductionsDeCotisations,
cotisations,
totalCotisations,
salaireNetAprèsImpôt,
impôt
} = ficheDePaie
return (
<div className="payslip__container">
<div className="payslip__hourSection">
<Trans i18nKey="payslip.heures">Heures travaillées par mois : </Trans>
<span className="montant"> {nombreHeuresTravaillées}</span>
</div>
{/* Section salaire brut */}
<div className="payslip__salarySection">
<h4 className="payslip__salaryTitle">
<Trans>Salaire</Trans>
</h4>
{(avantagesEnNature.montant !== 0 ||
indemnitésSalarié.montant !== 0) && (
<>
<RuleLink {...salaireDeBase} />
<Montant>{salaireDeBase.montant}</Montant>
</>
)}
{avantagesEnNature.montant !== 0 && (
<>
<RuleLink {...avantagesEnNature} />
<Montant>{avantagesEnNature.montant}</Montant>
</>
)}
{indemnitésSalarié.montant !== 0 && (
<>
<RuleLink {...indemnitésSalarié} />
<Montant>{indemnitésSalarié.montant}</Montant>
</>
)}
<RuleLink className="payslip__brut" {...salaireBrut} />
<Montant className="payslip__brut">{salaireBrut.montant}</Montant>
</div>
{/* Section cotisations */}
<div className="payslip__cotisationsSection">
<h4>
<Trans>Cotisations sociales</Trans>
</h4>
<h4>
<Trans>Part employeur</Trans>
</h4>
<h4>
<Trans>Part salariale</Trans>
</h4>
{cotisations.map(([section, cotisationList]) => (
<Fragment key={section}>
<h5 className="payslip__cotisationTitle">
<Trans i18nKey={`branches.${section}.name`}>{section}</Trans>
</h5>
{cotisationList.map(cotisation => (
<Fragment key={cotisation.lien}>
<RuleLink
style={{ backgroundColor: lightestColour }}
{...cotisation}
/>
<Montant style={{ backgroundColor: lightestColour }}>
{cotisation.montant.partPatronale}
</Montant>
<Montant style={{ backgroundColor: lightestColour }}>
{cotisation.montant.partSalariale}
</Montant>
</Fragment>
))}
</Fragment>
))}
<h5 className="payslip__cotisationTitle">
<Trans>Réductions</Trans>
</h5>
<RuleLink {...réductionsDeCotisations} />
<Montant>{-réductionsDeCotisations.montant}</Montant>
<Montant>{0}</Montant>
{/* Total cotisation */}
<div className="payslip__total">
<Trans>Total des retenues</Trans>
</div>
<Montant className="payslip__total">
{totalCotisations.partPatronale}
</Montant>
<Montant className="payslip__total">
{totalCotisations.partSalariale}
</Montant>
{/* Salaire chargé */}
<RuleLink {...salaireChargé} />
<Montant>{salaireChargé.montant}</Montant>
<Montant>{0}</Montant>
</div>
{/* Section salaire net */}
<div className="payslip__salarySection">
<h4 className="payslip__salaryTitle">
<Trans>Salaire net</Trans>
</h4>
{/* Rémunération nette imposable */}
<RuleLink {...rémunérationNetteImposable} />
<Montant>{rémunérationNetteImposable.montant}</Montant>
{/* Salaire net */}
<RuleLink {...salaireNetDeCotisations} />
<Montant>{salaireNetDeCotisations.montant}</Montant>
{avantagesEnNature.montant !== 0 ? (
<>
{/* Avantages en nature */}
<RuleLink {...avantagesEnNature} />
<Montant>{-avantagesEnNature.montant}</Montant>
{/* Salaire net */}
<RuleLink className="payslip__salaireNet" {...salaireNet} />
<Montant className="payslip__salaireNet">
{salaireNet.montant}
</Montant>
</>
) : null}
<RuleLink {...impôt} />
<Montant>{-impôt.montant}</Montant>
<RuleLink {...salaireNetAprèsImpôt} />
<Montant>{salaireNetAprèsImpôt.montant}</Montant>
</div>
<br />
<p className="ui__ notice">
<Trans i18nKey="payslip.notice">
Le simulateur vous aide à comprendre votre bulletin de paie, sans lui
être opposable. Pour plus d&apos;informations, rendez vous sur&nbsp;
<a
alt="service-public.fr"
href="https://www.service-public.fr/particuliers/vosdroits/F559">
service-public.fr
</a>
.
</Trans>
</p>
<p className="ui__ notice">
<Trans i18nKey="payslip.disclaimer">
Il ne prend pour l'instant pas en compte les accords et
conventions collectives, ni la myriade d'aides aux entreprises. Trouvez votre convention collective <a href="https://socialgouv.github.io/conventions-collectives">ici</a>, et explorez les aides sur&nbsp;
<a href="https://www.aides-entreprises.fr">aides-entreprises.fr</a>.
</Trans>
</p>
</div>
)
}
export default compose(
withColours,
connect(
FicheDePaieSelectors,
{}
)
)(PaySlip)