mirror of
https://github.com/betagouv/mon-entreprise
synced 2025-02-09 04:05:01 +00:00
* Utilisation de la version stable de TypeScript 3.7 * Début de migration du State Redux. Plutôt que de redéfinir les types en doublon par rapport aux actions et reducers, on utilise les valeurs retournées par ces fonctions comme source pour les types globaux. * Modification de tsconfig pour meilleur typage dans VS Code * Meilleur typage de l'environnement : suppression de @types/node qui était trop large (contient tout l'environnement serveur), et remplacement par @types/webpack-env. Par ailleurs typage des variables d'environnement utilisées. * Début de migration de l'économie collaborative * Migration de nombreux composants UI * Mise à jour de dépendances pour récupérer un meilleur typage * Ajout d'un hook pour configurer les simulateurs * Suppression du higher-order component "withSitePaths", on utilise systématiquement le hook useContext. L'essentiel de l'application est maintenant migré, reste le moteur !
148 lines
3.9 KiB
TypeScript
148 lines
3.9 KiB
TypeScript
import { T } from 'Components'
|
|
import Distribution from 'Components/Distribution'
|
|
import PaySlip from 'Components/PaySlip'
|
|
import StackedBarChart from 'Components/StackedBarChart'
|
|
import { ThemeColoursContext } from 'Components/utils/withColours'
|
|
import { getRuleFromAnalysis } from 'Engine/rules'
|
|
import React, { useContext, useRef } from 'react'
|
|
import emoji from 'react-easy-emoji'
|
|
import { Trans, useTranslation } from 'react-i18next'
|
|
import { useSelector } from 'react-redux'
|
|
import { RootState } from 'Reducers/rootReducer'
|
|
import {
|
|
analysisWithDefaultsSelector,
|
|
usePeriod
|
|
} from 'Selectors/analyseSelectors'
|
|
import * as Animate from 'Ui/animate'
|
|
|
|
class ErrorBoundary extends React.Component {
|
|
state = {} as { error?: string }
|
|
static getDerivedStateFromError() {
|
|
return {
|
|
error:
|
|
'The SalaryExplanation component triggered an error. This often happens in its subcomponents reducers'
|
|
}
|
|
}
|
|
render() {
|
|
if (this.state.error)
|
|
return <div css="background: red; ">Erreur : {this.state.error}</div>
|
|
return this.props.children
|
|
}
|
|
}
|
|
|
|
export default function SalaryExplanation() {
|
|
const showDistributionFirst = useSelector(
|
|
(state: RootState) => !state.conversationSteps.foldedSteps.length
|
|
)
|
|
const distributionRef = useRef<HTMLDivElement>()
|
|
return (
|
|
<ErrorBoundary>
|
|
<Animate.fromTop key={showDistributionFirst.toString()}>
|
|
{showDistributionFirst ? (
|
|
<>
|
|
<RevenueRepatitionSection />
|
|
<DistributionSection />
|
|
<PaySlipSection />
|
|
</>
|
|
) : (
|
|
<>
|
|
<RevenueRepatitionSection />
|
|
<div css="text-align: center">
|
|
<button
|
|
className="ui__ small simple button"
|
|
onClick={() =>
|
|
distributionRef.current.scrollIntoView({
|
|
behavior: 'smooth',
|
|
block: 'start'
|
|
})
|
|
}
|
|
>
|
|
{emoji('📊')} <T>Voir la répartition des cotisations</T>
|
|
</button>
|
|
</div>
|
|
<PaySlipSection />
|
|
<div ref={distributionRef}>
|
|
<DistributionSection />
|
|
</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'informations, rendez vous
|
|
sur
|
|
<a 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
|
|
<a href="https://www.aides-entreprises.fr">aides-entreprises.fr</a>.
|
|
</Trans>
|
|
</p>
|
|
</Animate.fromTop>
|
|
</ErrorBoundary>
|
|
)
|
|
}
|
|
|
|
function RevenueRepatitionSection() {
|
|
const analysis = useSelector(analysisWithDefaultsSelector)
|
|
const getRule = getRuleFromAnalysis(analysis)
|
|
const { t } = useTranslation()
|
|
const { palettes } = useContext(ThemeColoursContext)
|
|
|
|
return (
|
|
<section>
|
|
<h2>Répartition du total chargé</h2>
|
|
<StackedBarChart
|
|
data={[
|
|
{
|
|
...getRule('contrat salarié . rémunération . net après impôt'),
|
|
name: t('Revenu disponible'),
|
|
color: palettes[0][0]
|
|
},
|
|
{ ...getRule('impôt'), name: t('Impôts'), color: palettes[1][0] },
|
|
{
|
|
...getRule('contrat salarié . cotisations'),
|
|
color: palettes[1][1]
|
|
}
|
|
]}
|
|
/>
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function PaySlipSection() {
|
|
const period = usePeriod()
|
|
return (
|
|
<section>
|
|
<h2>
|
|
<Trans>
|
|
{period === 'mois'
|
|
? 'Fiche de paie mensuelle'
|
|
: 'Détail annuel des cotisations'}
|
|
</Trans>
|
|
</h2>
|
|
<PaySlip />
|
|
</section>
|
|
)
|
|
}
|
|
|
|
const DistributionSection = () => (
|
|
<section>
|
|
<h2>
|
|
<Trans>À quoi servent mes cotisations ?</Trans>
|
|
</h2>
|
|
<Distribution />
|
|
</section>
|
|
)
|