diff --git a/mon-entreprise/source/components/ShareSimulationBanner.tsx b/mon-entreprise/source/components/ShareSimulationBanner.tsx index 86c69c031..0bd6efcd0 100644 --- a/mon-entreprise/source/components/ShareSimulationBanner.tsx +++ b/mon-entreprise/source/components/ShareSimulationBanner.tsx @@ -4,13 +4,16 @@ import { TrackerContext } from 'Components/utils/withTracker' import Animate from 'Components/ui/animate' import Banner from './Banner' import { LinkButton } from 'Components/ui/Button' -import { useGetSearchParams } from './utils/useSearchParamsSimulationSharing' +import { useParamsFromSituation } from './utils/useSearchParamsSimulationSharing' +import { useSelector } from 'react-redux' +import { situationSelector } from 'Selectors/simulationSelectors' export default function ShareSimulationBanner() { const [opened, setOpened] = useState(false) const { t } = useTranslation() const tracker = useContext(TrackerContext) - const getSearchParams = useGetSearchParams() + const situation = useSelector(situationSelector) + const searchParams = useParamsFromSituation(situation) const shareAPIAvailable = !!window?.navigator?.share @@ -19,7 +22,7 @@ export default function ShareSimulationBanner() { window.location.origin, window.location.pathname, '?', - getSearchParams().toString(), + searchParams.toString(), ].join('') const startSharing = () => { diff --git a/mon-entreprise/source/components/Simulation.tsx b/mon-entreprise/source/components/Simulation.tsx index be0607b6e..43e15e65d 100644 --- a/mon-entreprise/source/components/Simulation.tsx +++ b/mon-entreprise/source/components/Simulation.tsx @@ -13,7 +13,6 @@ import React from 'react' import { Trans } from 'react-i18next' import { useSelector } from 'react-redux' import { firstStepCompletedSelector } from 'Selectors/simulationSelectors' -import useSearchParamsSimulationSharing from 'Components/utils/useSearchParamsSimulationSharing' import ShareSimulationBanner from 'Components/ShareSimulationBanner' type SimulationProps = { @@ -30,7 +29,6 @@ export default function Simulation({ showPeriodSwitch, }: SimulationProps) { const firstStepCompleted = useSelector(firstStepCompletedSelector) - const getShareSearchParams = useSearchParamsSimulationSharing() return ( <> @@ -39,7 +37,7 @@ export default function Simulation({ {firstStepCompleted && ( {results} - +
{ +export const useParamsFromSituation = (situation: Situation) => { const engine = useEngine() - const situation = useSelector(situationSelector) const dottedNameParamName = useMemo( () => getRulesParamNames(engine.getParsedRules()), [engine] ) - return () => - getSearchParamsFromSituation(engine, situation, dottedNameParamName) + return getSearchParamsFromSituation(engine, situation, dottedNameParamName) } const objectifsOfConfig = (config: Partial) => diff --git a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx index e4c3ab46b..a4481d776 100644 --- a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx @@ -1,24 +1,19 @@ -import { formatValue } from 'publicodes' -import useSimulationConfig from 'Components/utils/useSimulationConfig' -import Animate from 'Components/ui/animate' import Conversation from 'Components/conversation/Conversation' -import { Questions } from 'Components/Simulation' -import { useEngine } from 'Components/utils/EngineContext' -import RuleLink from 'Components/RuleLink' -import { DottedName } from 'modele-social' -import { ThemeColorsContext } from 'Components/utils/colors' -import { useContext, useMemo } from 'react' -import { SimulationConfig, Situation } from 'Reducers/rootReducer' -import { situationSelector } from 'Selectors/simulationSelectors' -import { partition } from 'ramda' -import { useSimulationProgress } from 'Components/utils/useNextQuestion' import { HiddenOptionContext } from 'Components/conversation/Question' -import useSearchParamsSimulationSharing, { - getRulesParamNames, - getSearchParamsFromSituation, -} from 'Components/utils/useSearchParamsSimulationSharing' +import Animate from 'Components/ui/animate' +import { ThemeColorsContext } from 'Components/utils/colors' +import { useEngine } from 'Components/utils/EngineContext' import { SitePathsContext } from 'Components/utils/SitePathsContext' +import { useSimulationProgress } from 'Components/utils/useNextQuestion' +import { useParamsFromSituation } from 'Components/utils/useSearchParamsSimulationSharing' +import useSimulationConfig from 'Components/utils/useSimulationConfig' +import { DottedName } from 'modele-social' +import Engine, { formatValue } from 'publicodes' +import { partition } from 'ramda' +import { useContext, useMemo } from 'react' import { Link } from 'react-router-dom' +import { SimulationConfig, Situation } from 'Reducers/rootReducer' +import styled from 'styled-components' type AideDescriptor = { title: string @@ -30,36 +25,42 @@ type AideDescriptor = { // This could be moved into publicodes const aides = [ { - title: 'Apprenti', + title: 'Apprenti ou contrat Pro jeune', dottedName: "contrat salarié . aides employeur . aide exceptionnelle à l'embauche d'apprentis", situation: { 'contrat salarié . rémunération . brut de base': '1700 €/mois', - // 'contrat salarié': "'apprentissage'", }, description: "Pour l'embauche d'un apprenti ou d'un jeune en contrat de professionnalisation", }, { - title: 'Jeune en CDI', + title: 'Jeune de -26 ans', dottedName: "contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes", situation: { - 'contrat salarié . rémunération . brut de base': '2300 €/mois', - // 'contrat salarié': "'CDI'", + 'contrat salarié . rémunération . brut de base': '1700 €/mois', "contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans": 'oui', }, }, { - title: 'Jeune en CDD', - dottedName: - "contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes", + title: 'Emploi franc', + dottedName: 'contrat salarié . aides employeur . emploi franc', situation: { - 'contrat salarié . rémunération . brut de base': '2300 €/mois', - // 'contrat salarié': "'CDD'", - 'contrat salarié . CDD . durée contrat': '12 mois', - "contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans": + 'contrat salarié . rémunération . brut de base': '1700 €/mois', + 'contrat salarié . aides employeur . emploi franc . éligible': 'oui', + }, + }, + { + title: "Demandeur d'emploi de 45 ans ou plus", + dottedName: + "contrat salarié . aides employeur . aide à l'embauche senior professionnalisation", + situation: { + // 'contrat salarié . rémunération . brut de base': '1700 €/mois', + 'contrat salarié . professionnalisation . jeune de moins de 30 ans': + 'non', + 'contrat salarié . professionnalisation . salarié de 45 ans et plus': 'oui', }, }, @@ -79,7 +80,9 @@ const config = { 'liste noire': [ 'contrat salarié . activité partielle', 'contrat salarié . prix du travail', + "contrat salarié . ancienneté . date d'embauche", 'contrat salarié . temps de travail . heures supplémentaires', + 'contrat salarié . temps de travail . heures complémentaires', 'contrat salarié . rémunération', 'contrat salarié . aides employeur . emploi franc . éligible', ], @@ -97,7 +100,14 @@ export default function AidesEmbauche() {
- + + Vous pouvez maintenant simuler le coût d'embauche précis en en + sélectionnant une aide éligible. + + } + />
@@ -106,26 +116,37 @@ export default function AidesEmbauche() {
)} +
+

En savoir plus sur les aides

+

Bla bla 1jeune1solution

+
) } function Results() { - const engine = useEngine() + const baseEngine = useEngine() + const aidesEngines = aides.map((aide) => { + const engine = new Engine(baseEngine.parsedRules) + const situation = { ...aide.situation, ...baseEngine.parsedSituation } + engine.setSituation({ ...aide.situation, ...baseEngine.parsedSituation }) + return { ...aide, situation, engine } + }) const [aidesActives, aidesInactives] = partition( - (aide) => typeof engine.evaluate(aide.dottedName).nodeValue === 'number', - aides + ({ dottedName, engine }) => + typeof engine.evaluate(dottedName).nodeValue === 'number', + aidesEngines ) return ( <>

Aides disponibles

-
+
{aidesActives.map((aide, i) => ( ))}

Les autres aides

-
+
{aidesInactives.map((aide, i) => ( ))} @@ -142,22 +163,13 @@ function ResultCard({ }: AideDescriptor) { const engine = useEngine() const rule = engine.getParsedRules()[dottedName] - const valueNode = rule.explanation.valeur.explanation.valeur + const valueNode = (rule.explanation.valeur as any)?.explanation.valeur const evaluation = engine.evaluate(valueNode) - const dottedNameParamName = useMemo( - () => getRulesParamNames(engine.getParsedRules()), - [engine] - ) - const search = getSearchParamsFromSituation( - engine, - situation, - dottedNameParamName - ).toString() + const search = useParamsFromSituation(situation).toString() const sitePaths = useContext(SitePathsContext) - // TODO return ( -
+

{title}

{description}

@@ -170,6 +182,15 @@ function ResultCard({ {formatValue(evaluation, { displayedUnit: '€' })}

-
+ ) } + +const AideCard = styled.div` + max-width: none !important; + align-items: flex-start; + + p { + text-align: left; + } +` diff --git a/mon-entreprise/source/pages/Simulateurs/images/logo-france-relance.svg b/mon-entreprise/source/pages/Simulateurs/images/logo-france-relance.svg new file mode 100644 index 000000000..99972ff98 --- /dev/null +++ b/mon-entreprise/source/pages/Simulateurs/images/logo-france-relance.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index f60427562..4d3b56f13 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -27,6 +27,7 @@ import urlIllustrationNetBrut from './images/illustration-net-brut.png' import RémunérationSASUPreview from './images/RémunérationSASUPreview.png' import salaireBrutNetPreviewEN from './images/SalaireBrutNetPreviewEN.png' import salaireBrutNetPreviewFR from './images/SalaireBrutNetPreviewFR.png' +import logoFranceRelance from './images/logo-france-relance.svg' import PAMCHome from './PAMCHome' import IndépendantSimulation, { IndépendantPLSimulation, @@ -768,11 +769,19 @@ export function getSimulatorsData({ title: "Aides à l'embauche", description: (

+ Logo France Relance Les employeurs peuvent bénéficier d'une aide financière pour l'embauche de certains publics prioritaires. Découvrez les dispositifs existants et estimez le montant de l'aide en répondant aux questions. -
-

), component: AidesEmbauche,