diff --git a/exoneration-covid/CHANGELOG.md b/exoneration-covid/CHANGELOG.md index 981ce8f09..f3cadd5ba 100644 --- a/exoneration-covid/CHANGELOG.md +++ b/exoneration-covid/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.0 + +Ajoute la règle `code` contenant le code de l'exonération covid applicable à transmettre à l'administration fiscale + ## 0.2.0 Change complètement l'organisation des règles publicodes pour être au plus proche de l'implémentation diff --git a/exoneration-covid/README.md b/exoneration-covid/README.md index 5469c868b..756bf040f 100644 --- a/exoneration-covid/README.md +++ b/exoneration-covid/README.md @@ -1,4 +1,4 @@ -# Modèle social français en publicodes +# Covid : exonération de cotisation sociale pour les indépendants Ce paquet contient les règles [publicodes](https://publi.codes) utilisées sur https://mon-entreprise.urssaf.fr pour le calcul de l'exonération covid 2021. @@ -18,15 +18,19 @@ const engine = new Engine(rules) engine.setSituation({ "lieu d'exercice": "'métropole'", "début d'activité": "'mai 2021'", - secteur: "'S1'", + secteur: "'S1bis'", - 'mois . avril 2021': 'LFSS 600', - 'mois . mai 2021': 'non', - 'mois . juin 2021': 'LFSS 600', - 'mois . décembre 2021': 'LFSS 300', + 'mois . mai 2021': "'LFSS 600'", + 'mois . juin 2021': "'LFR1'", + 'mois . juillet 2021': "'LFSS 600'", + 'mois . août 2021': 'non', + 'mois . décembre 2021': "'LFSS 300'", + 'mois . janvier 2022': "'LFSS 600'", + 'mois . février 2022': "'LFSS 300'", }) -console.log(formatValue(engine.evaluate('montant total'))) +console.log(formatValue(engine.evaluate('montant total'))) // "3000 €" +console.log(engine.evaluate('code').nodeValue) // "S1B;O;3;1;O;1" ``` 👉 **[Voir l'exemple complet](https://codesandbox.io/s/covidform-rxweh?file=/src/index.js)** diff --git a/exoneration-covid/package.json b/exoneration-covid/package.json index 06b532612..ad6198cb4 100644 --- a/exoneration-covid/package.json +++ b/exoneration-covid/package.json @@ -1,6 +1,6 @@ { "name": "exoneration-covid", - "version": "0.2.0", + "version": "0.3.0", "description": "Les règles publicodes pour le calcul de l'exonération de cotisations covid (année 2021)", "main": "./dist/index.js", "types": "./index.d.ts", @@ -17,10 +17,10 @@ "type": "module", "devDependencies": { "js-yaml": "^4.1.0", - "publicodes": "^1.0.0-beta.30" + "publicodes": "^1.0.0-beta.31" }, "peerDependencies": { - "publicodes": "^1.0.0-beta.30" + "publicodes": "^1.0.0-beta.31" }, "scripts": { "build": "node ../scripts/build-rules.js", diff --git a/exoneration-covid/règles/exonération-covid.yaml b/exoneration-covid/règles/exonération-covid.yaml index c9dc27c8d..792104d4b 100644 --- a/exoneration-covid/règles/exonération-covid.yaml +++ b/exoneration-covid/règles/exonération-covid.yaml @@ -369,6 +369,7 @@ exonération S2 . mois éligibles: arrondi: oui unité: mois - 1 mois + exonération S2 . mois éligibles . premier mois: variations: - si: début d'activité . date < 01/2021 @@ -390,3 +391,53 @@ montant total: - LFR1 - LFSS 300 - exonération S2 + +code: + texte: '{{ secteur }};{{ LFSS }};{{ LFR1 }}' + + # Applicabilité ajoutée pour éviter un code mal formatté en cas de variable non définie + # Cf https://github.com/betagouv/publicodes/issues/172 + applicable si: + toutes ces conditions: + - secteur + - LFSS + - LFR1 + +code . secteur: + variations: + - si: secteur . S1bis + alors: "'S1B'" + - sinon: secteur + +code . LFSS: + variations: + - si: secteur . S2 + alors: + texte: O;{{ mois S2 }} + - si: LFSS 300 + LFSS 600 = 0€ + alors: "'N'" + - si: LFSS 300 = 0€ + alors: + texte: O;{{ mois 600 }} + - sinon: # LFSS 300 et 600 + texte: O;{{ mois 600 }};{{ mois 300}} + +code . LFSS . mois S2: + valeur: exonération S2 . mois éligibles + unité: '' +code . LFSS . mois 300: + valeur: LFSS 300 . mois éligibles + unité: '' +code . LFSS . mois 600: + valeur: LFSS 600 . mois éligibles + unité: '' + +code . LFR1: + variations: + - si: LFR1 = 0€ + alors: "'N'" + - sinon: + texte: O;{{ mois }} +code . LFR1 . mois: + valeur: LFR1 . mois éligibles + unité: '' diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 73c230d7c..fd2824404 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -91,7 +91,6 @@ dirigeant . assimilé salarié: rend non applicable: - contrat salarié . convention collective - contrat salarié . activité partielle - - contrat salarié . déduction forfaitaire spécifique - contrat salarié . rémunération . primes - contrat salarié . rémunération . primes . fin d'année - contrat salarié . rémunération . primes . activité @@ -1295,17 +1294,17 @@ dirigeant . indépendant . cotisations et contributions . exonérations . pensio acronyme: PI question: Êtes-vous titulaire d’une pension d’invalidité à titre de travailleur indépendant ? description: |- - Si vous êtes titulaire d’une **pension d’invalidité** versée par un régime des travailleurs non-salariés - non agricoles, vous bénécifiez d’une **exonération totale des cotisations de retraite complémentaire et + Si vous êtes titulaire d’une **pension d’invalidité** versée par un régime des travailleurs non-salariés + non agricoles, vous bénécifiez d’une **exonération totale des cotisations de retraite complémentaire et des cotisations maladie**. - Pour que vous puissiez **continuer à accumuler des points de retraite complémentaire** comme les autres travailleurs, + Pour que vous puissiez **continuer à accumuler des points de retraite complémentaire** comme les autres travailleurs, il vous est attribué des **"points gratuits"**. - Dans le cas général, le nombre de points reçu correspond à la **moyenne mensuelle des points cotisés - pendant la période d'activité indépendante** avant versement de la pension. + Dans le cas général, le nombre de points reçu correspond à la **moyenne mensuelle des points cotisés + pendant la période d'activité indépendante** avant versement de la pension. - > Par exemple, si vous avez cotisé pendant 6 ans et 11 mois pour un total de 588 points, le nombre de points gratuits reçu chaque mois sera de : + > Par exemple, si vous avez cotisé pendant 6 ans et 11 mois pour un total de 588 points, le nombre de points gratuits reçu chaque mois sera de : > `588 / (6 * 12 + 11) = 7,08` type: notification diff --git a/site/.env.template b/site/.env.template index 5f7a0649e..1f380c662 100644 --- a/site/.env.template +++ b/site/.env.template @@ -19,7 +19,7 @@ VITE_FR_BASE_URL="http://localhost:3000/mon-entreprise" VITE_EN_BASE_URL="http://localhost:3000/infrance" # Variables optionnelles -VITE_COMPANY_SEARCH_HOST=https://search-recherche-entreprises.fabrique.social.gouv.fr +VITE_COMPANY_SEARCH_HOST=https://api.recherche-entreprises.fabrique.social.gouv.fr # https://github.com/reduxjs/redux-devtools/blob/main/extension/docs/Features/Trace.md VITE_REDUX_TRACE=true diff --git a/site/cypress/integration/mon-entreprise/english/navigation.js b/site/cypress/integration/mon-entreprise/english/navigation.js index fd20c6a49..842cb7dd0 100644 --- a/site/cypress/integration/mon-entreprise/english/navigation.js +++ b/site/cypress/integration/mon-entreprise/english/navigation.js @@ -30,7 +30,7 @@ describe(`Navigation to income simulator using company name (${ let pendingRequests = new Set() let responses = {} const hostnamesToRecord = [ - 'search-recherche-entreprises.fabrique.social.gouv.fr', + 'api.recherche-entreprises.fabrique.social.gouv.fr', 'geo.api.gouv.fr', ] beforeEach(function () { diff --git a/site/cypress/integration/mon-entreprise/landing.js b/site/cypress/integration/mon-entreprise/landing.js index 572eeee24..f9d9b3fad 100644 --- a/site/cypress/integration/mon-entreprise/landing.js +++ b/site/cypress/integration/mon-entreprise/landing.js @@ -19,7 +19,7 @@ describe('Landing page', function () { let pendingRequests = new Set() let responses = {} const hostnamesToRecord = [ - 'search-recherche-entreprises.fabrique.social.gouv.fr', + 'api.recherche-entreprises.fabrique.social.gouv.fr', 'geo.api.gouv.fr', ] cy.clearLocalStorage() // Try to avoid flaky tests diff --git a/site/netlify.toml b/site/netlify.toml index 7c67d25aa..18e582334 100644 --- a/site/netlify.toml +++ b/site/netlify.toml @@ -1,7 +1,7 @@ [[headers]] for = "/*" [headers.values] -Content-Security-Policy = "default-src 'self' mon-entreprise.fr; style-src 'self' 'unsafe-inline' mon-entreprise.zammad.com; connect-src 'self' *.sentry.io raw.githubusercontent.com *.xiti.com mon-entreprise.zammad.com search-recherche-entreprises.fabrique.social.gouv.fr geo.api.gouv.fr *.algolianet.com; form-action 'self' *.sibforms.com *.sentry.io mon-entreprise.zammad.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.xiti.com stonly.com code.jquery.com mon-entreprise.zammad.com polyfill.io; img-src 'self' data: *.xiti.com user-images.githubusercontent.com; frame-src 'self' https://www.youtube-nocookie.com https://codesandbox.io" +Content-Security-Policy = "default-src 'self' mon-entreprise.fr; style-src 'self' 'unsafe-inline' mon-entreprise.zammad.com; connect-src 'self' *.sentry.io raw.githubusercontent.com *.xiti.com mon-entreprise.zammad.com api.recherche-entreprises.fabrique.social.gouv.fr geo.api.gouv.fr *.algolianet.com; form-action 'self' *.sibforms.com *.sentry.io mon-entreprise.zammad.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.xiti.com stonly.com code.jquery.com mon-entreprise.zammad.com polyfill.io; img-src 'self' data: *.xiti.com user-images.githubusercontent.com; frame-src 'self' https://www.youtube-nocookie.com https://codesandbox.io" ## Twemoji proxy for client privacy #1219 [[redirects]] diff --git a/site/package.json b/site/package.json index 7003f9dea..54e3299ef 100644 --- a/site/package.json +++ b/site/package.json @@ -73,8 +73,8 @@ "fuse.js": "^6.4.6", "markdown-to-jsx": "^7.1.5", "modele-social": "^0.6.0", - "publicodes": "^1.0.0-beta.30", - "publicodes-react": "^1.0.0-beta.30", + "publicodes": "^1.0.0-beta.31", + "publicodes-react": "^1.0.0-beta.31", "ramda": "^0.27.0", "react": "^17.0.0", "react-color": "^2.14.0", diff --git a/site/scripts/fetch-stats.js b/site/scripts/fetch-stats.js index fbf7cfab0..4ab27028b 100644 --- a/site/scripts/fetch-stats.js +++ b/site/scripts/fetch-stats.js @@ -4,14 +4,12 @@ import fs from 'fs' import path from 'path' import { filter, flatten, map, partition, pipe } from 'ramda' import { compose } from 'redux' +import { fileURLToPath } from 'url' import { createDataDir, writeInDataDir } from './utils.js' const matomoSiteVisitsHistory = JSON.parse( fs.readFileSync( - path.join( - import.meta.url.replace('file:', ''), - '../matomoVisitHistory.json' - ) + path.join(fileURLToPath(import.meta.url), '..', 'matomoVisitHistory.json') ) ) @@ -278,7 +276,9 @@ async function main() { // have a static ressource accessible without authentification. writeInDataDir('stats.json', { visitesJours: [], - visitesMois: [], + visitesMois: { + pages: [], + }, satisfaction: [], retoursUtilisateurs: { open: [], diff --git a/site/scripts/utils.js b/site/scripts/utils.js index b2c9fc3ae..ac327fcaa 100644 --- a/site/scripts/utils.js +++ b/site/scripts/utils.js @@ -1,7 +1,14 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs' import { join } from 'path' +import { fileURLToPath } from 'url' -const dataDir = new URL('../source/data/', import.meta.url).pathname +const dataDir = join( + fileURLToPath(import.meta.url), + '..', + '..', + 'source', + 'data' +) export function createDataDir() { if (!existsSync(dataDir)) { diff --git a/site/source/api/fabrique-social.ts b/site/source/api/fabrique-social.ts index 3e5bc77d0..87b7a4a20 100644 --- a/site/source/api/fabrique-social.ts +++ b/site/source/api/fabrique-social.ts @@ -47,7 +47,7 @@ type FabriqueSocialSearchPayload = { const COMPANY_SEARCH_HOST = import.meta.env.VITE_COMPANY_SEARCH_HOST || - 'https://search-recherche-entreprises.fabrique.social.gouv.fr' + 'https://api.recherche-entreprises.fabrique.social.gouv.fr' const makeSearchUrl = (query: string, limit: number) => `${COMPANY_SEARCH_HOST}/api/v1/search?query=${query}&open=true&convention=false&employer=false&ranked=false&limit=${limit}` diff --git a/site/source/components/PeriodSwitch.tsx b/site/source/components/PeriodSwitch.tsx index e6ef0458f..a2ab37e16 100644 --- a/site/source/components/PeriodSwitch.tsx +++ b/site/source/components/PeriodSwitch.tsx @@ -9,7 +9,6 @@ export default function PeriodSwitch() { const currentUnit = useSelector(targetUnitSelector) const { t } = useTranslation() - const periods = [ { label: t('Mensuel'), @@ -23,7 +22,7 @@ export default function PeriodSwitch() { return (
dispatch(updateUnit(unit))} > {periods.map(({ label, unit }) => ( diff --git a/site/source/design-system/field/Select/ListBox.tsx b/site/source/design-system/field/Select/ListBox.tsx index 781ec664d..ac066ccfc 100644 --- a/site/source/design-system/field/Select/ListBox.tsx +++ b/site/source/design-system/field/Select/ListBox.tsx @@ -1,13 +1,18 @@ -/* eslint-disable @typescript-eslint/no-use-before-define */ -import type { AriaListBoxOptions } from '@react-aria/listbox' -import { useListBox, useOption } from '@react-aria/listbox' +import { useListBox, useOption, AriaListBoxOptions } from '@react-aria/listbox' import type { ListState } from '@react-stately/list' import type { Node } from '@react-types/shared' -import * as React from 'react' +import { + RefObject, + useRef, + HTMLAttributes, + createContext, + ReactNode, + useContext, +} from 'react' import styled, { css } from 'styled-components' interface ListBoxProps extends AriaListBoxOptions { - listBoxRef?: React.RefObject + listBoxRef?: RefObject state: ListState } @@ -67,7 +72,7 @@ const ItemContent = styled.div` ` export function ListBox(props: ListBoxProps) { - const ref = React.useRef(null) + const ref = useRef(null) const { listBoxRef = ref, state } = props const { listBoxProps } = useListBox(props, state, listBoxRef) @@ -81,17 +86,17 @@ export function ListBox(props: ListBoxProps) { } interface OptionContextValue { - labelProps: React.HTMLAttributes - descriptionProps: React.HTMLAttributes + labelProps: HTMLAttributes + descriptionProps: HTMLAttributes } -const OptionContext = React.createContext({ +const OptionContext = createContext({ labelProps: {}, descriptionProps: {}, }) function Option({ item, state }: OptionProps) { - const ref = React.useRef(null) + const ref = useRef(null) const { optionProps, labelProps, descriptionProps, isSelected, isFocused } = useOption( { @@ -123,8 +128,8 @@ function Option({ item, state }: OptionProps) { // described by the description, which makes for better announcements // for screen reader users. -export function Label({ children }: { children: React.ReactNode }) { - const { labelProps } = React.useContext(OptionContext) +export function Label({ children }: { children: ReactNode }) { + const { labelProps } = useContext(OptionContext) return
{children}
} @@ -133,7 +138,7 @@ const StyledDescription = styled.div` font-size: 12px; ` -export function Description({ children }: { children: React.ReactNode }) { - const { descriptionProps } = React.useContext(OptionContext) +export function Description({ children }: { children: ReactNode }) { + const { descriptionProps } = useContext(OptionContext) return {children} } diff --git a/site/source/design-system/field/Select/PopOver.tsx b/site/source/design-system/field/Select/PopOver.tsx index dfaa2da48..9d2dc430e 100644 --- a/site/source/design-system/field/Select/PopOver.tsx +++ b/site/source/design-system/field/Select/PopOver.tsx @@ -1,11 +1,11 @@ import { FocusScope } from '@react-aria/focus' import { DismissButton, useOverlay } from '@react-aria/overlays' -import * as React from 'react' +import { RefObject, ReactNode, useRef } from 'react' import styled from 'styled-components' interface PopoverProps { - popoverRef?: React.RefObject - children: React.ReactNode + popoverRef?: RefObject + children: ReactNode isOpen?: boolean onClose?: () => void } @@ -23,7 +23,7 @@ const Wrapper = styled.div` ` export function Popover(props: PopoverProps) { - const ref = React.useRef(null) + const ref = useRef(null) const { popoverRef = ref, isOpen, onClose, children } = props // Handle events that should cause the popup to close, diff --git a/site/source/design-system/field/Select/index.tsx b/site/source/design-system/field/Select/index.tsx index 506174a76..b78c8aeeb 100644 --- a/site/source/design-system/field/Select/index.tsx +++ b/site/source/design-system/field/Select/index.tsx @@ -5,7 +5,7 @@ import { mergeProps } from '@react-aria/utils' import { useSelectState } from '@react-stately/select' import type { AriaSelectProps } from '@react-types/select' import { CarretDown } from 'DesignSystem/icons/carret-down' -import * as React from 'react' +import { useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import styled, { css } from 'styled-components' import { ListBox } from './ListBox' @@ -175,16 +175,17 @@ export function Select>( // Create state based on the incoming props const state = useSelectState(props) - React.useEffect(() => { + useEffect(() => { if (props.value && props.value !== state.selectedKey) { state.setSelectedKey(props.value) } // On ne veut pas d'update bidirectionnel, c'est pourquoi state n'est pas dans // les dépendances + // eslint-disable-next-line react-hooks/exhaustive-deps }, [props.value]) // Get props for child elements from useSelect - const ref = React.useRef(null) + const ref = useRef(null) const { labelProps, triggerProps, valueProps, menuProps } = useSelect( props, state, diff --git a/site/source/locales/rules-en.yaml b/site/source/locales/rules-en.yaml index d2c0d0303..4c1e9c295 100644 --- a/site/source/locales/rules-en.yaml +++ b/site/source/locales/rules-en.yaml @@ -5854,47 +5854,47 @@ dirigeant . indépendant . cotisations et contributions . exonérations . pensio description.en: >- [automatic] If you are the holder of a **disability pension** paid by a non-agricultural non-salaried worker scheme, you benefit from a **total - exemption from supplementary pension and + exemption from supplementary pension and - non-agricultural non-salaried workers, you are entitled to a **total exemption from supplementary pension contributions and + non-agricultural non-salaried workers, you are entitled to a **total exemption from supplementary pension contributions and health insurance contributions**. - So that you can **continue to accumulate complementary pension points** like other workers, + So that you can **continue to accumulate complementary pension points** like other workers, you are allocated **"free points "**. - In the general case, the number of points received corresponds to the **average monthly points contributed during the period of + In the general case, the number of points received corresponds to the **average monthly points contributed during the period of - during the period of self-employment** before the pension is paid. + during the period of self-employment** before the pension is paid. - > For example, if you have contributed for 6 years and 11 months for a total of 588 points, the number of free points received each month will be : + > For example, if you have contributed for 6 years and 11 months for a total of 588 points, the number of free points received each month will be : > `588 / (6 * 12 + 11) = 7,08` description.fr: >- Si vous êtes titulaire d’une **pension d’invalidité** versée par un régime - des travailleurs non-salariés + des travailleurs non-salariés - non agricoles, vous bénécifiez d’une **exonération totale des cotisations de retraite complémentaire et + non agricoles, vous bénécifiez d’une **exonération totale des cotisations de retraite complémentaire et des cotisations maladie**. - Pour que vous puissiez **continuer à accumuler des points de retraite complémentaire** comme les autres travailleurs, + Pour que vous puissiez **continuer à accumuler des points de retraite complémentaire** comme les autres travailleurs, il vous est attribué des **"points gratuits"**. - Dans le cas général, le nombre de points reçu correspond à la **moyenne mensuelle des points cotisés + Dans le cas général, le nombre de points reçu correspond à la **moyenne mensuelle des points cotisés - pendant la période d'activité indépendante** avant versement de la pension. + pendant la période d'activité indépendante** avant versement de la pension. - > Par exemple, si vous avez cotisé pendant 6 ans et 11 mois pour un total de 588 points, le nombre de points gratuits reçu chaque mois sera de : + > Par exemple, si vous avez cotisé pendant 6 ans et 11 mois pour un total de 588 points, le nombre de points gratuits reçu chaque mois sera de : > `588 / (6 * 12 + 11) = 7,08` diff --git a/site/source/pages/Documentation.tsx b/site/source/pages/Documentation.tsx index c6c45cfb9..0ccabfd1a 100644 --- a/site/source/pages/Documentation.tsx +++ b/site/source/pages/Documentation.tsx @@ -14,7 +14,7 @@ import { Li, Ul } from 'DesignSystem/typography/list' import { Body } from 'DesignSystem/typography/paragraphs' import rules, { DottedName } from 'modele-social' import { getDocumentationSiteMap, RulePage } from 'publicodes-react' -import { useContext, useMemo } from 'react' +import { ComponentType, useContext, useMemo } from 'react' import { Helmet } from 'react-helmet-async' import { Trans, useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' @@ -69,10 +69,10 @@ export default function MonEntrepriseRulePage() { documentationPath={documentationPath} renderers={{ Head: Helmet, - Link: Link as React.ComponentType<{ + Link: Link as ComponentType<{ to: string }>, - Text: Markdown as any, + Text: Markdown, References, }} /> @@ -147,9 +147,13 @@ const referencesImages = { 'bpifrance-creation.fr': '/références-images/bpi-création.png', } -type ReferencesProps = React.ComponentProps< - NonNullable['renderers']['References']> -> +type ReferencesProps = { + references: React.ComponentProps< + NonNullable< + React.ComponentProps['renderers']['References'] + > + >['references'] +} export function References({ references }: ReferencesProps) { const cleanDomain = (link: string) => @@ -217,10 +221,31 @@ const StyledReferences = styled.ul` } ` +type OverrideComponentType = { + componentStyle: { + rules: Array< + | (( + props: Record + ) => + | string + | false + | null + | undefined + | OverrideComponentType['componentStyle']['rules']) + | string + > + } +} + // HACKKKKY THING. DO NOT DO THIS AT HOME -function componentCSS(rules: any, props: any) { +function componentCSS(Compo: unknown, props: Record): string { + const rules = + 'componentStyle' in (Compo as OverrideComponentType) + ? (Compo as OverrideComponentType).componentStyle.rules + : (Compo as string[]) + return rules - .map((x: any) => { + .map((x) => { if (typeof x !== 'function') { return x } @@ -234,39 +259,40 @@ function componentCSS(rules: any, props: any) { if (Array.isArray(result)) { return componentCSS(result, props) } - console.error('Should not happen', result) + // eslint-disable-next-line no-console + console.error('Should not happen', result, typeof result) }) .join('') } const StyledDocumentation = styled.div` h1 { - ${(props) => componentCSS((H1.componentStyle as any).rules, props)} + ${(props) => componentCSS(H1, props)} margin-top: 1rem; } h2 { - ${(props) => componentCSS((H2.componentStyle as any).rules, props)} + ${(props) => componentCSS(H2, props)} } h3 { - ${(props) => componentCSS((H3.componentStyle as any).rules, props)} + ${(props) => componentCSS(H3, props)} } h4 { - ${(props) => componentCSS((H4.componentStyle as any).rules, props)} + ${(props) => componentCSS(H4, props)} } h5 { - ${(props) => componentCSS((H5.componentStyle as any).rules, props)} + ${(props) => componentCSS(H5, props)} } p { - ${(props) => componentCSS((Body.componentStyle as any).rules, props)} + ${(props) => componentCSS(Body, props)} } Ul { - ${(props) => componentCSS((Ul.componentStyle as any).rules, props)} + ${(props) => componentCSS(Ul, props)} } Li { - ${(props) => componentCSS((Li.componentStyle as any).rules, props)} + ${(props) => componentCSS(Li, props)} } a { - ${(props) => componentCSS((StyledLink.componentStyle as any).rules, props)} + ${(props) => componentCSS(StyledLink, props)} } button { font-size: 1rem; diff --git a/site/source/pages/Simulateurs/Page/index.tsx b/site/source/pages/Simulateurs/Page/index.tsx index a63bfab14..da7415304 100644 --- a/site/source/pages/Simulateurs/Page/index.tsx +++ b/site/source/pages/Simulateurs/Page/index.tsx @@ -32,7 +32,7 @@ export default function PageData(props: SimulatorData[keyof SimulatorData]) { const année = useContext(EngineContext).evaluate('année') .nodeValue as Evaluation - const year = année != null && année != 2022 ? ' - ' + année : '' + const year = typeof année === 'number' && année != 2022 ? ` - ${année}` : '' const inIframe = useIsEmbedded() const fromGérer = !!useLocation<{ fromGérer?: boolean }>().state?.fromGérer @@ -68,7 +68,7 @@ export default function PageData(props: SimulatorData[keyof SimulatorData]) { return ( - {meta && } + {meta && } {title && !inIframe && ( <>

diff --git a/site/source/pages/Simulateurs/configs/dirigeant-sasu.yaml b/site/source/pages/Simulateurs/configs/dirigeant-sasu.yaml index 6c42247e2..3be08a72e 100644 --- a/site/source/pages/Simulateurs/configs/dirigeant-sasu.yaml +++ b/site/source/pages/Simulateurs/configs/dirigeant-sasu.yaml @@ -28,4 +28,7 @@ questions: unité par défaut: €/an situation: dirigeant: "'assimilé salarié'" - contrat salarié . activité partielle: non #TODO : en attendant que la transitivité du remplacement soit implémentée + + #TODO : en attendant que la transitivité du remplacement soit implémentée (https://github.com/betagouv/publicodes/issues/55) + contrat salarié . activité partielle: non + contrat salarié . déduction forfaitaire spécifique: non diff --git a/site/source/pages/integration/Iframe.tsx b/site/source/pages/integration/Iframe.tsx index 9ca92f75d..f1052617c 100644 --- a/site/source/pages/integration/Iframe.tsx +++ b/site/source/pages/integration/Iframe.tsx @@ -43,15 +43,17 @@ function IntegrationCustomizer() { const defaultModuleFromUrl = new URLSearchParams(search ?? '').get('module') ?? '' + const [currentModule, setCurrentModule] = useState( simulators[defaultModuleFromUrl] ? defaultModuleFromUrl : 'salarié' ) useEffect(() => { history.replace({ search: `?module=${currentModule}` }) - }, [currentModule]) - console.log(currentModule, simulators[currentModule]) + }, [currentModule, history]) + const [color, setColor] = useState() + return ( <>

@@ -65,7 +67,7 @@ function IntegrationCustomizer() {