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() {