/* @flow */
import { setSituationBranch, startConversation } from 'Actions/actions'
import {
defineDirectorStatus,
isAutoentrepreneur
} from 'Actions/companyStatusActions'
import classnames from 'classnames'
import { T } from 'Components'
import PeriodSwitch from 'Components/PeriodSwitch'
import Simulation from 'Components/Simulation'
// $FlowFixMe
import ComparaisonConfig from 'Components/simulationConfigs/rémunération-dirigeant.yaml'
import withSimulationConfig from 'Components/simulationConfigs/withSimulationConfig'
import withSitePaths from 'Components/utils/withSitePaths'
import { compose, tryCatch } from 'ramda'
import React, { useState } from 'react'
import emoji from 'react-easy-emoji'
import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
import { branchAnalyseSelector } from 'Selectors/analyseSelectors'
import { règleAvecMontantSelector } from 'Selectors/regleSelectors'
import Animate from 'Ui/animate'
import AnimatedTargetValue from 'Ui/AnimatedTargetValue'
import './SchemeComparaison.css'
import type { RègleAvecMontant } from 'Types/RegleTypes'
type OwnProps = {
hideAutoEntrepreneur?: boolean,
hideAssimiléSalarié?: boolean
}
type Props = OwnProps & {
assimiléSalarié?: SimulationResult,
indépendant?: SimulationResult,
autoEntrepreneur?: SimulationResult,
conversationStarted: boolean,
startConversation: () => void,
setSituationBranch: number => void,
defineDirectorStatus: string => void,
sitePaths: any,
isAutoentrepreneur: boolean => void,
plafondAutoEntrepreneurDépassé: boolean
}
type SimulationResult = {
retraite: RègleAvecMontant,
revenuNetAvantImpôts: RègleAvecMontant,
revenuNetAprèsImpôts: RègleAvecMontant,
plafondDépassé?: boolean
}
const SchemeComparaison = ({
/* Own Props */
hideAutoEntrepreneur = false,
hideAssimiléSalarié = false,
/* Injected Props */
assimiléSalarié,
indépendant,
autoEntrepreneur,
conversationStarted,
defineDirectorStatus,
isAutoentrepreneur,
setSituationBranch,
startConversation
}: Props) => {
const [showMore, setShowMore] = useState(false)
return (
{emoji('☂')}{' '}
Assimilé salarié
Le régime tout compris
{emoji('👩🔧')}{' '}
{hideAssimiléSalarié ? (
Entreprise Individuelle
) : (
Indépendant
)}
La protection à la carte
{emoji('🚶♂️')}{' '}
Auto-entrepreneur
Pour les petites activités
Statuts juridiques possibles
SAS, SASU, SARL minoritaire
EI, EURL, SARL majoritaire
Micro-entreprise
{!hideAssimiléSalarié && (
<>
Sécurité sociale
Régime général
Sécurité sociale des indépendants (SSI)
Couverture accidents du travail
Oui
Non
Assurance maladie
++
+
Indemnités journalières
++
+
>
)}
{!conversationStarted && (
<>
Retraite
+++
++
+
>
)}
{conversationStarted && (
<>
Période
>
)}
{!conversationStarted ? (
Comparez vos revenus et votre retraite en 1 minute
) : (
)}
{conversationStarted && (
<>
Revenu net après impôts
{assimiléSalarié && (
setSituationBranch(0)}
{...assimiléSalarié.revenuNetAprèsImpôts}
/>
)}
{indépendant && (
setSituationBranch(1)}
{...indépendant.revenuNetAprèsImpôts}
/>
)}
{autoEntrepreneur && (
{autoEntrepreneur.plafondDépassé ? (
'Plafond de CA dépassé'
) : (
setSituationBranch(2)}
{...autoEntrepreneur.revenuNetAprèsImpôts}
/>
)}
)}
Revenu net de cotisations (avant impôts)
{assimiléSalarié && (
setSituationBranch(0)}
{...assimiléSalarié.revenuNetAvantImpôts}
/>
)}
{indépendant && (
setSituationBranch(1)}
{...indépendant.revenuNetAvantImpôts}
/>
)}
{autoEntrepreneur && (
{autoEntrepreneur.plafondDépassé ? (
'—'
) : (
setSituationBranch(2)}
{...autoEntrepreneur.revenuNetAvantImpôts}
/>
)}
)}
Retraite (estimation)
{assimiléSalarié && assimiléSalarié.retraite.montant !== 0 ? (
setSituationBranch(1)}
{...assimiléSalarié.retraite}
garder
une
trace
/>
) : (
Pas implémenté
)}
{indépendant && indépendant.retraite.montant !== 0 ? (
setSituationBranch(1)}
{...indépendant.retraite}
/>
) : (
Pas implémenté
)}
{autoEntrepreneur &&
(autoEntrepreneur.plafondDépassé ? (
'—'
) : autoEntrepreneur.retraite.montant !== 0 ? (
setSituationBranch(1)}
{...autoEntrepreneur.retraite}
/>
) : (
Pas implémenté
))}
>
)}
{showMore ? (
<>
{!hideAutoEntrepreneur && (
<>
ACCRE
Une année, plafonné
3 années, progressif, non plafonné
Déduction des charges
Régime réel
Abattement forfaitaire
>
)}
Paiment des cotisations
Mensuel (à la source)
Annuel avec deux ans de décalage
Mensuel ou trimestriel
Complémentaires retraite et santé déductibles
Oui (jusqu'à 50%)
Oui (Loi Madelin)
Non
Cotisations minimales
Non
Oui
Non
Seuil d'activation des droits
Oui
Non
Oui
>
) : (
Comparaison détaillée
)}
{!hideAutoEntrepreneur && (
Plafond de chiffre d'affaires
Non
- 70 000 € en services
- 170 000 € en vente de biens, restauration ou hébergement
)}
Comptabilité
Experte
Complexe
Simple
)
}
const RuleValueLink = withSitePaths(
({
lien,
montant,
sitePaths,
onClick
}: RègleAvecMontant & { sitePaths: any, onClick: () => void }) => (
)
)
export default (compose(
withSimulationConfig(ComparaisonConfig),
connect(
tryCatch(
state => ({
conversationStarted: state.conversationStarted,
autoEntrepreneur: {
retraite: règleAvecMontantSelector(state, {
situationBranchName: 'Auto-entrepreneur'
})('protection sociale . retraite'),
revenuNetAprèsImpôts: règleAvecMontantSelector(state, {
situationBranchName: 'Auto-entrepreneur'
})('revenu net'),
revenuNetAvantImpôts: règleAvecMontantSelector(state, {
situationBranchName: 'Auto-entrepreneur'
})('auto entrepreneur . revenu net de cotisations'),
// $FlowFixMe
plafondDépassé: branchAnalyseSelector(state, {
situationBranchName: 'Auto-entrepreneur'
}).controls?.find(
({ test }) =>
test.includes && test.includes('base des cotisations > plafond')
)
},
indépendant: {
retraite: règleAvecMontantSelector(state, {
situationBranchName: 'Indépendant'
})('protection sociale . retraite'),
revenuNetAprèsImpôts: règleAvecMontantSelector(state, {
situationBranchName: 'Indépendant'
})('revenu net'),
revenuNetAvantImpôts: règleAvecMontantSelector(state, {
situationBranchName: 'Indépendant'
})('indépendant . revenu professionnel')
},
assimiléSalarié: {
retraite: règleAvecMontantSelector(state, {
situationBranchName: 'Assimilé salarié'
})('protection sociale . retraite'),
revenuNetAprèsImpôts: règleAvecMontantSelector(state, {
situationBranchName: 'Assimilé salarié'
})('revenu net'),
revenuNetAvantImpôts: règleAvecMontantSelector(state, {
situationBranchName: 'Assimilé salarié'
})('contrat salarié . salaire . net')
}
}),
(e, state) =>
console.log(e) || { conversationStarted: state.conversationStarted }
),
{
startConversation,
defineDirectorStatus,
isAutoentrepreneur,
setSituationBranch
}
)
)(SchemeComparaison): React$Component)