From ff8a5b165c6d58074d6c1aacb3a45f2f32f71695 Mon Sep 17 00:00:00 2001 From: Mael Date: Fri, 26 Apr 2019 16:09:22 +0200 Subject: [PATCH] =?UTF-8?q?Possibilit=C3=A9=20de=20d=C3=A9finir=20des=20gr?= =?UTF-8?q?oupes=20d'objectifs=20nomm=C3=A9s=20dans=20sim.yaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pour par exemple séparer l'entreprise du dirigeant Attention, le composant TargetSelection est beaucoup trop complexe, il mérite d'être séparé en plein de plus petits composants --- source/components/TargetSelection.css | 20 +-- source/components/TargetSelection.js | 134 +++++++++++------- .../simulationConfigs/assimilé.yaml | 20 +-- source/règles/base.yaml | 4 +- source/selectors/analyseSelectors.js | 19 ++- .../pages/SocialSecurity/AssimiléSalarié.js | 2 +- 6 files changed, 122 insertions(+), 77 deletions(-) diff --git a/source/components/TargetSelection.css b/source/components/TargetSelection.css index 5d3d2c7ff..4aea71766 100644 --- a/source/components/TargetSelection.css +++ b/source/components/TargetSelection.css @@ -5,45 +5,45 @@ font-size: 180%; } -#targetSelection #targets { +#targetSelection .targets { list-style: none; padding: 0; margin: 0; } -#targetSelection #targets > li:last-child { +#targetSelection .targets > li:last-child { margin-bottom: -1rem; } -#targetSelection #targets > li:first-child { +#targetSelection .targets > li:first-child { border-top: none; margin-top: -1rem; } -#targetSelection #targets > li.small-target * { +#targetSelection .targets > li.small-target * { font-size: 1rem; font-weight: normal; } -#targetSelection #targets > li.small-target { +#targetSelection .targets > li.small-target { border-top: none; } -#targetSelection #targets > li.small-target .targetInput { +#targetSelection .targets > li.small-target .targetInput { border-width: 1px; padding-top: 0; padding-bottom: 0; } -#targetSelection #targets > li { +#targetSelection .targets > li { border-top: 1px solid rgba(255, 255, 255, 0.5); padding: 0.6rem 1rem; margin-left: -1rem; margin-right: -1rem; } -#targetSelection #targets > li .main { +#targetSelection .targets > li .main { display: flex; align-items: center; justify-content: space-between; } -#targetSelection #targets > li p { +#targetSelection .targets > li p { margin: 0.2em 0 0; font-style: italic; opacity: 0.8; @@ -54,7 +54,7 @@ display: flex; align-items: center; } -#targetSelection #targets > li.small-target .header p { +#targetSelection .targets > li.small-target .header p { display: none; } diff --git a/source/components/TargetSelection.js b/source/components/TargetSelection.js index 796cf2e98..f2a39b466 100644 --- a/source/components/TargetSelection.js +++ b/source/components/TargetSelection.js @@ -7,8 +7,9 @@ import withColours from 'Components/utils/withColours' import withLanguage from 'Components/utils/withLanguage' import withSitePaths from 'Components/utils/withSitePaths' import { encodeRuleName } from 'Engine/rules' -import { compose, isEmpty, isNil, propEq } from 'ramda' +import { compose, isEmpty, isNil, propEq, toPairs } from 'ramda' import React, { Component, PureComponent } from 'react' +import emoji from 'react-easy-emoji' import { withTranslation } from 'react-i18next' import { connect } from 'react-redux' import { Link } from 'react-router-dom' @@ -86,9 +87,14 @@ export default compose( firstStepCompleted, conversationStarted, analysis, - explanation + explanation, + activeInput, + setActiveInput, + setFormValue, + objectifs } = this.props, - inversionFail = analysis.cache.inversionFail + inversionFail = analysis.cache.inversionFail, + targets = analysis?.targets || [] return (
@@ -99,64 +105,86 @@ export default compose( /> )} -
- {this.renderOutputList()} -
+ + {(Array.isArray(objectifs) + ? [[null, objectifs]] + : toPairs(objectifs) + ).map(([groupName, groupTargets]) => ( + <> + {groupName &&

{emoji(groupName)}

} +
+ + groupTargets.includes(dottedName) + ), + initialRender: this.state.initialRender + }} + /> +
+ + ))} {firstStepCompleted && explanation}
) } - - renderOutputList() { - let { - conversationStarted, - activeInput, - setActiveInput, - setFormValue, - analysis - } = this.props, - targets = analysis ? analysis.targets : [], - inversionFail = analysis.cache.inversionFail - - return ( -
- -
- ) - } } ) +let Targets = ({ + conversationStarted, + activeInput, + setActiveInput, + setFormValue, + inversionFail, + targets, + initialRender +}) => ( +
+ +
+) + const Target = ({ target, activeInput, diff --git a/source/components/simulationConfigs/assimilé.yaml b/source/components/simulationConfigs/assimilé.yaml index d0d2ac7f7..3551a1cd9 100644 --- a/source/components/simulationConfigs/assimilé.yaml +++ b/source/components/simulationConfigs/assimilé.yaml @@ -1,13 +1,15 @@ objectifs: - - entreprise . chiffre d'affaires - - entreprise . charges - - entreprise . bénéfice - - entreprise . part du dirigeant - - entreprise . rémunération totale du dirigeant - - contrat salarié . cotisations - - contrat salarié . réduction ACRE - - impôt . neutre - - contrat salarié . salaire . net après impôt + 🏢 Votre entreprise: + - entreprise . chiffre d'affaires + - entreprise . charges + - entreprise . rémunération du dirigeant + - entreprise . bénéfice + - entreprise . résultat net + 👩‍💼 Votre revenu: + - entreprise . rémunération totale du dirigeant + - contrat salarié . cotisations + - impôt . neutre + - contrat salarié . salaire . net après impôt questions à l'affiche: Année d'activité: entreprise . année d'activité diff --git a/source/règles/base.yaml b/source/règles/base.yaml index decc59739..2549851b2 100644 --- a/source/règles/base.yaml +++ b/source/règles/base.yaml @@ -2728,11 +2728,11 @@ période: flexible formule: somme: - - rémunération totale du dirigeant / part du dirigeant + - rémunération totale du dirigeant / rémunération du dirigeant - charges - espace: entreprise - nom: part du dirigeant + nom: rémunération du dirigeant description: | C'est la part du chiffre d'affaires après charges qui est allouée à la rémunération du dirigeant. Plus cette part est élevée, plus la rémunération du dirigeant augmente, et plus le bénéfice de l'entreprise diminue ! question: Quelle part du chiffre d'affaires après charge est allouée à la rémunération du dirigeant ? diff --git a/source/selectors/analyseSelectors.js b/source/selectors/analyseSelectors.js index c29a84dea..2be214700 100644 --- a/source/selectors/analyseSelectors.js +++ b/source/selectors/analyseSelectors.js @@ -22,8 +22,12 @@ import { intersection, isEmpty, isNil, + map, mergeDeepWith, - pick + pick, + pipe, + toPairs, + unnest } from 'ramda' import { getFormValues } from 'redux-form' import { createSelector, createSelectorCreator, defaultMemoize } from 'reselect' @@ -54,7 +58,18 @@ export let ruleDefaultsSelector = createSelector( rules => collectDefaults(rules) ) -export let targetNamesSelector = state => state.simulation?.config.objectifs +export let targetNamesSelector = state => { + let objectifs = state.simulation?.config.objectifs + if (!objectifs) return null + if (Array.isArray(objectifs)) return objectifs + // the objectives are organized in groups + else + return pipe( + toPairs, + map(([, groupObjectives]) => groupObjectives), + unnest + )(objectifs) +} export let situationSelector = createDeepEqualSelector( getFormValues('conversation'), diff --git a/source/sites/mon-entreprise.fr/pages/SocialSecurity/AssimiléSalarié.js b/source/sites/mon-entreprise.fr/pages/SocialSecurity/AssimiléSalarié.js index ff167f1d8..5c8e81c47 100644 --- a/source/sites/mon-entreprise.fr/pages/SocialSecurity/AssimiléSalarié.js +++ b/source/sites/mon-entreprise.fr/pages/SocialSecurity/AssimiléSalarié.js @@ -30,7 +30,7 @@ const AssimiléSalarié = ({ t }) => (

- Simulateur de revenus pour assimilé salarié + Simulateur de revenus assimilé salarié