diff --git a/modele-social/règles/artiste-auteur.yaml b/modele-social/règles/artiste-auteur.yaml index 991d8e029..213d89d9c 100644 --- a/modele-social/règles/artiste-auteur.yaml +++ b/modele-social/règles/artiste-auteur.yaml @@ -22,7 +22,7 @@ artiste-auteur . revenus . BNC: artiste-auteur . revenus . BNC . micro-bnc: non applicable si: contrôle micro-bnc par défaut: oui - titre: Souhaitez-vous opter pour le régime micro-BNC ? + question: Souhaitez-vous opter pour le régime micro-BNC ? résumé: Avec abattement forfaitaire fiscal de 34 % au titre des frais professionnels artiste-auteur . revenus . BNC . contrôle micro-bnc: diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 5b3768b87..a0221ab15 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -225,23 +225,27 @@ dirigeant . auto-entrepreneur . cotisations et contributions . contribution form note: | Les taux implémentés sont ceux prélevés par l'Urssaf. produit: - assiette: entreprise . chiffre d'affaires - taux: - variations: - - si: entreprise . activité = 'artisanale' - alors: 0.3% - - si: entreprise . activité . libérale règlementée - alors: 0.2% - - sinon: 0.1% -# dirigeant . auto-entrepreneur . chiffre d'affaires: -# question: Quel est votre chiffre d'affaires ? -# résumé: Montant total des recettes brutes (hors taxe) -# unité: €/an -# arrondi: oui -# inversion numérique: -# avec: -# - net de cotisations -# - net après impôt + composantes: + - attributs: + nom: revenus BIC + assiette: + somme: + - entreprise . chiffre d'affaires . vente restauration hébergement + - entreprise . chiffre d'affaires . prestations de service . BIC + taux: + variations: + - si: entreprise . activité = 'artisanale' + alors: 0.3% + - sinon: 0.1% + - attributs: + nom: revenus BNC + assiette: entreprise . chiffre d'affaires . prestations de service . BNC + taux: + variations: + - si: entreprise . activité . libérale règlementée + alors: 0.2% + - sinon: 0.1% + dirigeant . auto-entrepreneur . cotisations et contributions . cotisations: description: | Les cotisations sociales donnent à l'auto-entrepreneur accès à une @@ -378,9 +382,9 @@ dirigeant . auto-entrepreneur . impôt . versement libératoire . montant: - assiette: entreprise . chiffre d'affaires . vente restauration hébergement taux: 1% - assiette: entreprise . chiffre d'affaires . prestations de service . BIC - abattement: 1.7% + taux: 1.7% - assiette: entreprise . chiffre d'affaires . prestations de service . BNC - abattement: 2.2% + taux: 2.2% dirigeant . auto-entrepreneur . net après impôt: titre: revenu net après impôt diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index f9bced412..e4a1c21c4 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -56,10 +56,19 @@ entreprise . chiffre d'affaires: question: Quel est votre chiffre d'affaires envisagé ? résumé: Montant total des recettes brutes (hors taxe) unité: €/an - inversion numérique: - avec: - - dirigeant . auto-entrepreneur . net de cotisations - - dirigeant . auto-entrepreneur . net après impôt + variations: + - si: dirigeant . auto-entrepreneur + alors: + inversion numérique: + avec: + - dirigeant . auto-entrepreneur . net de cotisations + - dirigeant . auto-entrepreneur . net après impôt + - sinon: + somme: + - dirigeant . rémunération totale + - charges + + arrondi: oui identifiant court: ca @@ -70,9 +79,15 @@ entreprise . chiffre d'affaires . vente restauration hébergement: résumé: Chiffre d'affaires hors taxe question: Quel est le chiffre d'affaires issus de la vente de bien, restauration ou hébergement ? unité: €/an - produit: - assiette: chiffre d'affaires - taux: activité . proportions . vente restauration hébergement + variations: + - si: activité . mixte + alors: + produit: + assiette: chiffre d'affaires + taux: activité . mixte . proportions . vente restauration hébergement + - sinon: + applicable si: activité . service ou vente = 'vente' + valeur: chiffre d'affaires arrondi: oui plancher: 0€/an description: | @@ -115,9 +130,15 @@ entreprise . chiffre d'affaires . prestations de service . BIC: services qui nécessite plus qu'un ordinateur pour être effectuées. **Exemples** : transports, service à la personne, réparation etc. - produit: - assiette: chiffre d'affaires - taux: activité . proportions . prestations de service BIC + variations: + - si: activité . mixte + alors: + produit: + assiette: chiffre d'affaires + taux: activité . mixte . proportions . prestations de service BIC + - sinon: + applicable si: activité . service ou vente = 'service' + valeur: chiffre d'affaires références: service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32919 @@ -135,11 +156,16 @@ entreprise . chiffre d'affaires . prestations de service . BNC: **Exemples** : conseil, accompagnement, traduction, développement, formation, enseignement, sportif - - produit: - assiette: chiffre d'affaires - taux: activité . proportions . prestations de service BNC - + variations: + - si: activité . mixte + alors: + produit: + assiette: chiffre d'affaires + taux: activité . mixte . proportions . prestations de service BNC + - sinon: + applicable si: activité = 'libérale' + valeur: chiffre d'affaires + références: liste des activités libérales: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/liste-professions-liberales @@ -677,28 +703,29 @@ entreprise . activité . mixte: Si votre entreprise a des activités correspondants à plus d'un type de revenus, répondez oui à cette question. -entreprise . activité . proportions: - titre: Part des différentes activités dans le chiffre d'affaires +entreprise . activité . mixte . proportions: + description: Part des différentes activités dans le chiffre d'affaires + titre: proportion activité unité: '%' somme: - nom: prestations de service BIC - variations: - - si: mixte - alors: 1 / 3 - - si: activité . service ou vente = 'service' - alors: 100% + par défaut: + variations: + - si: activité = 'libérale' + alors: 0 + - sinon: 50% - nom: prestations de service BNC - variations: - - si: mixte - alors: 1 / 3 - - si: activité = 'libérale' - alors: 100% + par défaut: + variations: + - si: activité = 'libérale' + alors: 2 / 3 + - sinon: 0 - nom: vente restauration hébergement - variations: - - si: mixte - alors: 1 / 3 - - si: activité . service ou vente = 'vente' - alors: 100% + par défaut: + variations: + - si: activité = 'libérale' + alors: 1 / 3 + - sinon: 50% entreprise . activité . libérale règlementée: diff --git a/mon-entreprise/source/actions/actions.ts b/mon-entreprise/source/actions/actions.ts index 709b7c1dd..c5fa7736a 100644 --- a/mon-entreprise/source/actions/actions.ts +++ b/mon-entreprise/source/actions/actions.ts @@ -19,7 +19,7 @@ export type Action = | typeof updateSituation | typeof updateSituation | typeof updateUnit - | typeof updateSituationBatch + | typeof batchUpdateSituation > | CompanyCreationAction | CompanyStatusAction @@ -70,11 +70,14 @@ export const updateSituation = (fieldName: DottedName, value: unknown) => fieldName, value, } as const) - -export const batchUpdateSituation = (situation: Parameters['setSituation']>[0]) => ({ - type: 'BATCH_UPDATE_SITUATION', - situation, -} as const) + +export const batchUpdateSituation = ( + situation: Parameters['setSituation']>[0] +) => + ({ + type: 'BATCH_UPDATE_SITUATION', + situation, + } as const) export const updateUnit = (targetUnit: string) => ({ diff --git a/mon-entreprise/source/components/SimulationGoals.tsx b/mon-entreprise/source/components/SimulationGoals.tsx index 2cbc10266..6d0fff9cd 100644 --- a/mon-entreprise/source/components/SimulationGoals.tsx +++ b/mon-entreprise/source/components/SimulationGoals.tsx @@ -62,6 +62,7 @@ type SimulationGoalProps = { small?: boolean appear?: boolean editable?: boolean + boolean?: boolean onUpdateSituation?: ( name: DottedName, ...rest: Parameters @@ -75,6 +76,7 @@ export function SimulationGoal({ onUpdateSituation, appear = true, editable = true, + boolean = false, //TODO : remove when type inference works in publicodes }: SimulationGoalProps) { const dispatch = useDispatch() const engine = useEngine() @@ -83,8 +85,7 @@ export function SimulationGoal({ const isNotApplicable = UNSAFE_isNotApplicable(engine, dottedName) const evaluation = engine.evaluate({ valeur: dottedName, - unité: currentUnit, - arrondi: 'oui', + ...(!boolean ? { unité: currentUnit, arrondi: 'oui' } : {}), }) const rule = engine.getRule(dottedName) const initialRender = useContext(InitialRenderContext) @@ -137,10 +138,14 @@ export function SimulationGoal({ { focused: isFocused } )} isTarget - modifiers={{ - unité: currentUnit, - arrondi: 'oui', - }} + modifiers={ + !boolean + ? { + unité: currentUnit, + arrondi: 'oui', + } + : undefined + } dottedName={dottedName} onFocus={() => setFocused(true)} onBlur={() => setFocused(false)} diff --git a/mon-entreprise/source/components/TargetSelection.css b/mon-entreprise/source/components/TargetSelection.css index 2d7d67f60..82c249f35 100644 --- a/mon-entreprise/source/components/TargetSelection.css +++ b/mon-entreprise/source/components/TargetSelection.css @@ -42,7 +42,7 @@ margin-right: -1rem; } .light #targetSelection .targets > li { - border-top: 1px solid rgba(0, 0, 0, 0.1); + border-top: 1px dashed var(--darkColor); } .light #targetSelection .targets > li.small-target, .light #targetSelection .targets > li:not(.small-target):first-of-type { @@ -65,6 +65,9 @@ display: flex; align-items: center; } +#targetSelection li:not(.small-target) .header { + flex: 1; +} #targetSelection .targets > li.small-target .header p { display: none; } @@ -130,22 +133,23 @@ text-align: right; background: rgba(255, 255, 255, 0.2); padding: 0.2rem 0.6rem; - border-radius: 0.3rem; border: 1px solid; font-size: inherit; } #targetSelection .targetInput.focused { - box-shadow: 0 0 0px 1px white; + box-shadow: 0 0 0px 2px white; } .light #targetSelection .targetInput { color: var(--darkColor); border-color: var(--darkColor); - background: white !important; + background: white; +} +.light #targetSelection .targetInput.focused { + box-shadow: 0 0 0px 2px var(--darkColor); } - .light #targetSelection .optionTitle { color: var(--darkColor); } diff --git a/mon-entreprise/source/components/conversation/Explicable.tsx b/mon-entreprise/source/components/conversation/Explicable.tsx index 2f09ed5bb..e330d1055 100644 --- a/mon-entreprise/source/components/conversation/Explicable.tsx +++ b/mon-entreprise/source/components/conversation/Explicable.tsx @@ -1,13 +1,13 @@ import { explainVariable } from 'Actions/actions' import Overlay from 'Components/Overlay' import { EngineContext } from 'Components/utils/EngineContext' +import { DottedName } from 'modele-social' import React, { useContext, useState } from 'react' import emoji from 'react-easy-emoji' import { useDispatch } from 'react-redux' -import { DottedName } from 'modele-social' +import usePortal from 'react-useportal' import { TrackerContext } from '../utils/withTracker' import './Explicable.css' -import usePortal from 'react-useportal' export function ExplicableRule({ dottedName }: { dottedName: DottedName }) { const engine = useContext(EngineContext) @@ -59,6 +59,10 @@ export function Explicable({ children }: { children: React.ReactNode }) { margin-left: 0.3rem !important; vertical-align: middle; font-size: 110% !important; + > img { + border: 1px solid rgba(255, 255, 255, 0.7) !important; + border-radius: 0.1rem; + } `} > {emoji('ℹ️')} diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx index f91ab1f40..8b929b901 100644 --- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx @@ -22,28 +22,21 @@ export default function ArtisteAuteur() { <> - - + + - + diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index cf865bc75..5ac3692bb 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -1,4 +1,5 @@ -import { batchUpdateSituation, updateSituation } from 'Actions/actions' +import { batchUpdateSituation } from 'Actions/actions' +import { Explicable } from 'Components/conversation/Explicable' import { Condition } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' @@ -7,6 +8,7 @@ import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import StackedBarChart from 'Components/StackedBarChart' import { ThemeColorsContext } from 'Components/utils/colors' import { useEngine } from 'Components/utils/EngineContext' +import { Markdown } from 'Components/utils/markdown' import { serializeEvaluation } from 'publicodes' import { default as React, useCallback, useContext } from 'react' import { Trans, useTranslation } from 'react-i18next' @@ -15,11 +17,11 @@ import { situationSelector } from 'Selectors/simulationSelectors' import AidesCovid from '../../components/simulationExplanation/AidesCovid' const proportions = { - 'entreprise . activité . proportions . prestations de service BIC': + 'entreprise . activité . mixte . proportions . prestations de service BIC': "entreprise . chiffre d'affaires . prestations de service . BIC", - 'entreprise . activité . proportions . prestations de service BNC': + 'entreprise . activité . mixte . proportions . prestations de service BNC': "entreprise . chiffre d'affaires . prestations de service . BNC", - 'entreprise . activité . proportions . vente restauration hébergement': + 'entreprise . activité . mixte . proportions . vente restauration hébergement': "entreprise . chiffre d'affaires . vente restauration hébergement", } as const function useAdjustProportions(): () => void { @@ -110,14 +112,17 @@ export default function AutoEntrepreneur() { function ActivitéMixte({ defaultChecked }: { defaultChecked: boolean }) { const dispatch = useDispatch() - const engine = useEngine() const situation = useSelector(situationSelector) + const rule = useEngine().getRule('entreprise . activité . mixte') + const onMixteChecked = useCallback( (checked: boolean) => { dispatch( - updateSituation( - 'entreprise . activité . mixte', - checked ? 'oui' : 'non' + batchUpdateSituation( + Object.values(proportions).reduce( + (acc, dottedName) => ({ ...acc, [dottedName]: undefined }), + { 'entreprise . activité . mixte': checked ? 'oui' : 'non' } + ) ) ) }, @@ -137,12 +142,15 @@ function ActivitéMixte({ defaultChecked }: { defaultChecked: boolean }) { justify-content: flex-end; `} > - Activité mixte {' '} onMixteChecked(evt.target.checked)} - />{' '} + /> +   Activité mixte + + + )