/* @flow */ import { setSituationBranch } from 'Actions/actions' import { defineDirectorStatus, isAutoentrepreneur } from 'Actions/companyStatusActions' import classnames from 'classnames' import { T } from 'Components' import Conversation from 'Components/conversation/Conversation' import SeeAnswersButton from 'Components/conversation/SeeAnswersButton' import PeriodSwitch from 'Components/PeriodSwitch' // $FlowFixMe import ComparaisonConfig from 'Components/simulationConfigs/rémunération-dirigeant.yaml' import withSimulationConfig from 'Components/simulationConfigs/withSimulationConfig' import withSitePaths from 'Components/utils/withSitePaths' import Value from 'Components/Value' import { encodeRuleName, getRuleFromAnalysis } from 'Engine/rules.js' import revenusSVG from 'Images/revenus.svg' import { compose } from 'ramda' import React, { useCallback, useState } from 'react' import emoji from 'react-easy-emoji' import { connect } from 'react-redux' import { Link } from 'react-router-dom' import { analysisWithDefaultsSelector, branchAnalyseSelector } from 'Selectors/analyseSelectors' import Animate from 'Ui/animate' import InfoBulle from 'Ui/InfoBulle' import './SchemeComparaison.css' type OwnProps = { hideAutoEntrepreneur?: boolean, hideAssimiléSalarié?: boolean } type Props = OwnProps & { setSituationBranch: number => void, defineDirectorStatus: string => void, sitePaths: any, isAutoentrepreneur: boolean => void, plafondAutoEntrepreneurDépassé: boolean } let getBranchIndex = branch => ({ assimilé: 0, indépendant: 1, 'auto-entrepreneur': 2 }[branch]) let getRuleFrom = analyses => (branch, dottedName) => { let i = getBranchIndex(branch) return getRuleFromAnalysis(analyses[i])(dottedName) } const SchemeComparaison = ({ /* Own Props */ hideAutoEntrepreneur = false, hideAssimiléSalarié = false, /* Injected Props */ plafondAutoEntrepreneurDépassé, defineDirectorStatus, isAutoentrepreneur, analyses }: Props) => { let getRule = getRuleFrom(analyses) const [showMore, setShowMore] = useState(false) const [conversationStarted, setConversationStarted] = useState( !!getRule('assimilé', 'revenu net après impôt')?.nodeValue ) const startConversation = useCallback(() => setConversationStarted(true), [ setConversationStarted ]) return ( <>

{emoji('☂')} Assimilé salarié Le régime tout compris

{emoji('👩‍🔧')}{' '} {hideAssimiléSalarié ? ( Entreprise Individuelle ) : ( Indépendant )} La protection sociale à la carte

{emoji('🚶‍♂️')} Auto-entrepreneur Pour commencer sans risques

Statuts juridiques possibles

SAS, SASU ou SARL avec gérant minoritaire
{hideAssimiléSalarié ? ( EI ou EIRL ) : ( EI, EIRL, EURL ou SARL avec gérant majoritaire )}
Auto-entreprise

Sécurité sociale

Régime général
Sécurité sociale des indépendants

Couverture accidents du travail

Oui
Non

Assurance maladie{' '} (médicaments, soins, hospitalisations)

Identique pour tous

Mutuelle santé

Obligatoire
Fortement conseillée

Indemnités journalières

++
++
+

Retraite

+++
++
+
{showMore ? ( <>

ACRE

1 an (exonération partielle de cotisations)
3 ans (application de taux réduits de cotisations)

Déduction des charges

Oui (régime fiscal du réel)
Non (mais abattement forfaitaire pour le calcul de l'impôt sur le revenu)

Paiement des cotisations

Mensuel
Provision mensuelle ou trimestrielle (avec régularisation après coup en fonction du revenu réel)
Mensuel ou trimestriel

Contrats prévoyance et retraite facultatives déductibles

Oui (sous certaines conditions)
Oui (Loi Madelin)
Non

Paiement de cotisations minimales

Non
Oui
Non

Revenu minimum pour l'ouverture des droits aux prestations

Oui
Non (cotisations minimales obligatoires)
Oui
{!hideAutoEntrepreneur && (

Plafond de chiffre d'affaires

Non
Oui (70 000 € en services / 170 000 € en vente de biens, restauration ou hébergement)
)}

Gestion comptable, sociale, juridique...

Accompagnement fortement conseillé (expert comptable, comptable, centre de gestion agrée...)
Simplifiée{' '} (peut être gérée par l'auto-entrepreneur)
) : (
)} {conversationStarted && ( <>

Période

)}
{!conversationStarted ? ( <>

Comparer mes revenus, pension de retraite et indemnité maladie

) : (
)}
{conversationStarted && !!getRule('assimilé', 'revenu net après impôt')?.nodeValue && ( <>

Revenu net après impôt

{plafondAutoEntrepreneurDépassé ? ( 'Plafond de CA dépassé' ) : ( )}

Revenu net de cotisations (avant impôts)

{plafondAutoEntrepreneurDépassé ? ( '—' ) : ( )}

Pension de retraite (avant impôts)

{' '} Pension calculée pour 172 trimestres cotisés au régime général sans variations de revenus.
{getRule('indépendant', 'protection sociale . retraite') .applicable !== false ? ( {' '} Pension calculée pour 172 trimestres cotisés au régime des indépendants sans variations de revenus. ) : ( Pas implémenté )}
{plafondAutoEntrepreneurDépassé ? ( '—' ) : getRule( 'auto-entrepreneur', 'protection sociale . retraite' ).applicable !== false ? ( {' '} Pension calculée pour 172 trimestres cotisés en auto-entrepreneur sans variations de revenus. ) : ( Pas implémenté )}

Nombre de trimestres validés (pour la retraite)

trimestres} unit={null} />
trimestres} unit={null} />
{plafondAutoEntrepreneurDépassé ? ( '—' ) : ( trimestres} unit={null} /> )}

Indemnités journalières{' '} (en cas d'arrêt maladie)

/ jour } rule="protection sociale . santé . indemnités journalières" /> ( {' '} pour les accidents de trajet/travail et maladie pro)
/ jour } branch="indépendant" rule="protection sociale . santé . indemnités journalières" />
{plafondAutoEntrepreneurDépassé ? ( '—' ) : ( / jour } /> )}
)}

Créer mon entreprise en tant que :

{!hideAssimiléSalarié && ( )} {!hideAutoEntrepreneur && ( )}
) } const RuleValueLink = compose( withSitePaths, connect( state => ({ analyses: analysisWithDefaultsSelector(state) }), { setSituationBranch } ) )( ({ analyses, branch, rule: dottedName, sitePaths, appendText, setSituationBranch, unit }) => { let rule = getRuleFrom(analyses)(branch, dottedName) return !rule ? null : ( setSituationBranch(getBranchIndex(branch))} to={ sitePaths.documentation.index + '/' + encodeRuleName(rule.dottedName) }> {appendText && <> {appendText}} ) } ) export default (compose( withSimulationConfig(ComparaisonConfig), connect( state => ({ analyses: analysisWithDefaultsSelector(state), plafondAutoEntrepreneurDépassé: branchAnalyseSelector(state, { situationBranchName: 'Auto-entrepreneur' }).controls?.find( ({ test }) => test.includes && test.includes('base des cotisations > plafond') ) }), { defineDirectorStatus, isAutoentrepreneur, setSituationBranch } ) )(SchemeComparaison): React$Component)