Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
johangirod committed Mar 10, 2022
1 parent fa035b9 commit 8cc5615
Show file tree
Hide file tree
Showing 10 changed files with 194 additions and 140 deletions.
34 changes: 15 additions & 19 deletions modele-social/règles/dirigeant.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,33 @@ dirigeant:
dirigeant . minoritaire:
titre: Gérant minoritaire ou égalitaire
non applicable si:
- entreprise . catégories juridiques . EI
- entreprise . catégories juridiques . SARL . unipersonnelle
- entreprise . catégories juridiques . SAS . unipersonnelle
une de ces conditions:
- entreprise . catégorie juridique . EI
- entreprise . catégorie juridique . SARL . unipersonnelle
- entreprise . catégorie juridique . SAS . unipersonnelle
par défaut: non

dirigeant . régime social:
par défaut: non
variations:
- si: entreprise . auto-entrepreneur
- si: entreprise . catégorie juridique . EI . auto-entrepreneur
alors: "'auto-entrepreneur'"
- si:
une de ces conditions:
- entreprise . catégories juridiques . EI
- entreprise . catégories juridiques . SARL
- entreprise . catégories juridiques . SELARL
- entreprise . catégorie juridique . EI
- entreprise . catégorie juridique . SARL
- entreprise . catégorie juridique . SELARL
non applicable si: dirigeant . minoritaire
alors: "'indépendant'"
alors: "'indépendant'"
- si:
une de ces conditions:
- entreprise . catégories juridiques . SAS
- entreprise . catégories juridiques . SELAS
- entreprise . catégorie juridique . SAS
- entreprise . catégorie juridique . SELAS
- toutes ces conditions:
- dirigeant . minoritaire
- une de ces conditions:
- entreprise . catégories juridiques . SARL
- entreprise . catégories juridiques . SELARL
- entreprise . catégorie juridique . SARL
- entreprise . catégorie juridique . SELARL
alors: "'assimilé salarié'"

dirigeant . rémunération: oui
Expand Down Expand Up @@ -103,13 +104,12 @@ dirigeant . assimilé salarié:
description: |
Certains dirigeants d'entreprise (c'est notamment le cas pour les SASU) sont considérés par la sécurité sociale comme assimilés aux salariés. Ils sont alors au régime général de la sécurité sociale, avec quelques contraintes cependant. Par exemple, ils ne cotisent pas au chômage, et n'y ont donc pas droit.
applicable si: régime social = 'assimilé salarié'
valeur: oui
remplace:
- règle: contrat salarié
par: "'CDI'"
- règle: contrat salarié . statut cadre
par: oui
- règle: entreprise . imposition
par: "'IS'"
rend non applicable:
- contrat salarié . convention collective
- contrat salarié . activité partielle
Expand Down Expand Up @@ -175,11 +175,6 @@ dirigeant . assimilé salarié . réduction ACRE . notification taux annuel:
dirigeant . auto-entrepreneur:
applicable si: régime social = 'auto-entrepreneur'
rend non applicable: contrat salarié
remplace:
- règle: entreprise . imposition
par: "'IR'"
- règle: entreprise . imposition . IR . micro-fiscal
par: oui
icônes: 🚶
description: |
L'auto-entreprise est une entreprise individuelle simplifiée. À l'origine connu sous l'appellation « auto-entrepreneur », le régime de « micro-entrepreneur » est un régime de travailleur indépendant créé pour simplifier la gestion administrative, notamment en remplaçant toutes les cotisations sociales par un prélèvement unique mensuel.
Expand Down Expand Up @@ -517,6 +512,7 @@ dirigeant . auto-entrepreneur . chiffre d'affaires:

dirigeant . indépendant:
applicable si: régime social = 'indépendant'
valeur: oui
rend non applicable: contrat salarié

dirigeant . indépendant . revenu professionnel:
Expand Down
12 changes: 9 additions & 3 deletions modele-social/règles/entreprise/imposition.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,16 @@ entreprise . imposition:
possibilités:
- IR
- IS
par défaut: "'IR'"
par défaut:
variations:
- si: catégorie juridique . EI
alors: "'IR'"
- sinon: "'IS'"

entreprise . imposition . IR:
valeur: imposition = 'IR'
applicable si: imposition = 'IR'
titre: Impôt sur le revenu
valeur: oui

entreprise . imposition . IR . micro-fiscal:
rend non applicable: dirigeant . indépendant . cotisations facultatives
Expand Down Expand Up @@ -112,7 +117,8 @@ entreprise . imposition . IR . information sur le report de déficit:
bofip: https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301

entreprise . imposition . IS:
valeur: imposition = 'IS'
applicable si: imposition = 'IS'
valeur: oui
titre: Impôt sur les sociétés

entreprise . imposition . IS . résultat imposable:
Expand Down
55 changes: 34 additions & 21 deletions modele-social/règles/entreprise/statut-juridique.yaml
Original file line number Diff line number Diff line change
@@ -1,12 +1,4 @@
entreprise . auto-entrepreneur:
par défaut: non
question: Êtes-vous auto-entrepreneur ?
remplace:
règle: entreprise . catégories juridiques
par: "'EI'"
applicable si: catégories juridiques = 'EI'

entreprise . catégories juridiques:
entreprise . catégorie juridique:
description: |
Les catégories juridiques accessibles via l'API SIRENE
une possibilité:
Expand All @@ -20,42 +12,63 @@ entreprise . catégories juridiques:
liste des catégories juridique de l'INSEE: https://www.insee.fr/fr/information/2028129
note: On se base ici sur les catégories juridiques définies par l'INSEE

entreprise . catégories juridiques . EI:
entreprise . catégorie juridique . EI:
titre: 'EI ou EIRL'
valeur: catégories juridiques = 'EI'
valeur: catégorie juridique = 'EI'

entreprise . catégorie juridique . EI . auto-entrepreneur:
question: Êtes-vous auto-entrepreneur ?
remplace:
règle: imposition . IR . micro-fiscal
par: oui
par défaut: oui

entreprise . catégorie juridique . EI . responsabilité limité:
non applicable si: auto-entrepreneur # pour simplifier
titre: 'EIRL'
question: Votre entreprise est-elle une EIRL ?
par défaut: non

entreprise . catégorie juridique . EI . imposition entreprise:
non applicable si: responsabilité limité
remplace: entreprise . imposition
valeur: "'IR'"

entreprise . catégories juridiques . SARL:
entreprise . catégorie juridique . SARL:
titre: 'EURL ou SARL'
valeur: catégories juridiques = 'SARL'
valeur: catégorie juridique = 'SARL'

entreprise . catégories juridiques . SARL . unipersonnelle:
entreprise . catégorie juridique . SARL . unipersonnelle:
titre: EURL
question: Votre entreprise est-elle une EURL ?
par défaut: oui

entreprise . catégories juridiques . SELARL:
entreprise . catégorie juridique . SELARL:
titre: 'SELARL'
valeur: catégories juridiques = 'SELARL'
valeur: catégorie juridique = 'SELARL'
remplace:
- règle: entreprise . activité
par: "'libérale'"
- règle: entreprise . activité . libérale réglementée
par: oui

entreprise . catégories juridiques . SELAS:
entreprise . catégorie juridique . SELAS:
titre: 'SELARL'
valeur: catégories juridiques = 'SELAS'
valeur: catégorie juridique = 'SELAS'
remplace:
- règle: entreprise . activité
par: "'libérale'"
- règle: entreprise . activité . libérale réglementée
par: oui

entreprise . catégories juridiques . SAS:
entreprise . catégorie juridique . SAS:
titre: 'SASU ou SAS'
valeur: catégories juridiques = 'SAS'
valeur: catégorie juridique = 'SAS'

entreprise . catégories juridiques . SAS . unipersonnelle:
entreprise . catégorie juridique . SAS . unipersonnelle:
titre: 'SASU'
question: Votre entreprise est-elle une SASU ?
par défaut: oui

entreprise . catégorie juridique . autre:
valeur: catégorie juridique = 'autre'
9 changes: 6 additions & 3 deletions site/source/components/EngineValue.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import Engine, {
isNotApplicable,
isNotYetDefined,
PublicodesExpression,
UNSAFE_isNotApplicable,
} from 'publicodes'
import React from 'react'
import { useTranslation } from 'react-i18next'
Expand Down Expand Up @@ -94,7 +93,9 @@ export function WhenApplicable({
children: React.ReactNode
}) {
const engine = useEngine()
if (UNSAFE_isNotApplicable(engine, dottedName)) return null
if (engine.evaluate(dottedName).nodeValue == null) {
return null
}
return <>{children}</>
}
export function WhenNotApplicable({
Expand All @@ -105,7 +106,9 @@ export function WhenNotApplicable({
children: React.ReactNode
}) {
const engine = useEngine()
if (!UNSAFE_isNotApplicable(engine, dottedName)) return null
if (engine.evaluate(dottedName).nodeValue !== null) {
return null
}
return <>{children}</>
}

Expand Down
8 changes: 6 additions & 2 deletions site/source/components/conversation/Conversation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,14 @@ import { ExplicableRule } from './Explicable'
import SeeAnswersButton from './SeeAnswersButton'

export type ConversationProps = {
displayNotification: boolean
customEndMessages?: React.ReactNode
}

export default function Conversation({ customEndMessages }: ConversationProps) {
export default function Conversation({
customEndMessages,
displayNotification = true,
}: ConversationProps) {
const dispatch = useDispatch()
const engine = useContext(EngineContext)
const currentQuestion = useNextQuestions()[0]
Expand Down Expand Up @@ -107,7 +111,7 @@ export default function Conversation({ customEndMessages }: ConversationProps) {
<SeeAnswersButton />
</Grid>
</Grid>
<Notifications />
{displayNotification && <Notifications />}
</form>
<QuickLinks />
</>
Expand Down
31 changes: 30 additions & 1 deletion site/source/components/utils/useSimulationConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ export function getCompanySituation(company: Company | null): Situation {
),
}),
...(company?.categorieJuridiqueUniteLegale && {
'entreprise . statut juridique': `'${getCatégorieFromCode(
'entreprise . catégorie juridique': `'${getCatégorieFromCode(
company.categorieJuridiqueUniteLegale
)}'`,
}),
Expand Down Expand Up @@ -85,3 +85,32 @@ const getCatégorieFromCode = (code: string): CatégorieJuridique => {
}
return 'AUTRE'
}

// // Profession Libérale
// const inferPLSimulateurFromCompanyDetails = (
// company: Company | null
// ): DirigeantOrNull => {
// if (!company) {
// return null
// }
// const activiteToSimulator = {
// 'Activités comptables': 'expert-comptable',
// 'Activité des médecins généralistes': 'médecin',
// 'Activités de radiodiagnostic et de radiothérapie': 'médecin',
// 'Activités chirurgicales': 'médecin',
// 'Activité des médecins spécialistes': 'médecin',
// 'Activités hospitalières': 'pamc',
// 'Pratique dentaire': 'chirurgien-dentiste',
// 'Commerce de détail de produits pharmaceutiques en magasin spécialisé':
// 'pharmacien',
// 'Activités des infirmiers et des sages-femmes': 'pamc',
// "Activités des professionnels de la rééducation, de l'appareillage et des pédicures-podologues":
// 'auxiliaire-médical',
// "Laboratoires d'analyses médicales": 'pharmacien',
// 'Arts du spectacle vivant': 'artiste-auteur',
// 'Création artistique relevant des arts plastiques': 'artiste-auteur',
// 'Autre création artistique': 'artiste-auteur',
// 'Activités photographiques': 'artiste-auteur',
// } as Record<string, keyof SimulatorData>
// return activiteToSimulator[company.activitePrincipale] || null
// }
36 changes: 36 additions & 0 deletions site/source/hooks/useObjectifsDependencies.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { useEngine } from '@/components/utils/EngineContext'
import { getNextSteps } from '@/components/utils/useNextQuestion'
import {
configSelector,
objectifsSelector,
} from '@/selectors/simulationSelectors'
import { DottedName } from 'modele-social'
import { useMemo } from 'react'
import { useSelector } from 'react-redux'

function useObjectifs(): Array<DottedName> {
const objectifs = useSelector(objectifsSelector)
const config = useSelector(configSelector)
return useMemo(() => objectifs, [config])
}
export function useObjectifsDeepDependencies(): Array<DottedName> {
const objectifs = useObjectifs()
const engine = useEngine()
const allMissings = useMemo(() => {
const dependencies = getNextSteps(
objectifs.map(
(obj) => (
console.log(engine.evaluate(obj).missingVariables),
engine.evaluate(obj).missingVariables
)
)
)

return [...dependencies].filter(
(dottedName) => engine.getRule(dottedName).rawNode.question
)
}, [objectifs])
return allMissings.filter(
(dottedName) => engine.evaluate(dottedName).nodeValue !== null
)
}
Loading

0 comments on commit 8cc5615

Please sign in to comment.