🐛 Répare la page blanche sur artiste auteur et le CA sur indépendant et SASU

pull/1421/head
Johan Girod 2021-02-09 10:00:48 +01:00
parent afc7010441
commit c6a92f3d10
9 changed files with 141 additions and 93 deletions

View File

@ -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:

View File

@ -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

View File

@ -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:

View File

@ -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<Engine<DottedName>['setSituation']>[0]) => ({
type: 'BATCH_UPDATE_SITUATION',
situation,
} as const)
export const batchUpdateSituation = (
situation: Parameters<Engine<DottedName>['setSituation']>[0]
) =>
({
type: 'BATCH_UPDATE_SITUATION',
situation,
} as const)
export const updateUnit = (targetUnit: string) =>
({

View File

@ -62,6 +62,7 @@ type SimulationGoalProps = {
small?: boolean
appear?: boolean
editable?: boolean
boolean?: boolean
onUpdateSituation?: (
name: DottedName,
...rest: Parameters<InputProps['onChange']>
@ -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)}

View File

@ -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);
}

View File

@ -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('')}

View File

@ -22,28 +22,21 @@ export default function ArtisteAuteur() {
<>
<SimulateurWarning simulateur="artiste-auteur" />
<SimulationGoals className="light">
<SimulationGoal
labelWithQuestion
dottedName="artiste-auteur . revenus . traitements et salaires"
/>
<SimulationGoal
labelWithQuestion
dottedName="artiste-auteur . revenus . BNC . recettes"
/>
<SimulationGoal dottedName="artiste-auteur . revenus . traitements et salaires" />
<SimulationGoal dottedName="artiste-auteur . revenus . BNC . recettes" />
<SimulationGoal
labelWithQuestion
dottedName="artiste-auteur . revenus . BNC . micro-bnc"
boolean
/>
<Warning dottedName="artiste-auteur . revenus . BNC . contrôle micro-bnc" />
<Condition expression="artiste-auteur . revenus . BNC . micro-bnc = non">
<SimulationGoal
labelWithQuestion
dottedName="artiste-auteur . revenus . BNC . frais réels"
/>
<SimulationGoal dottedName="artiste-auteur . revenus . BNC . frais réels" />
</Condition>
<SimulationGoal
labelWithQuestion
dottedName="artiste-auteur . cotisations . option surcotisation"
boolean
/>
</SimulationGoals>
<CotisationsResult />

View File

@ -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&nbsp;{' '}
<input
type="checkbox"
defaultChecked={defaultChecked}
onChange={(evt) => onMixteChecked(evt.target.checked)}
/>{' '}
/>
&nbsp; Activité mixte
<Explicable>
<Markdown source={`## ${rule.title}\n ${rule.rawNode.description}`} />
</Explicable>
</label>
</li>
)