diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a957ac86c9..1573d3e35d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,12 +26,20 @@ Nous utilisons : - [Prettier](https://prettier.io/) pour formater le code source, l'idéal est de configurer votre éditeur de texte pour que les fichiers soit formatés automatiquement quand vous sauvegardez un fichier. Si vous utilisez [VS Code](https://code.visualstudio.com/) cette configuration est automatique. - [Publicodes](https://publi.codes) pour la gestion des règles métiers - [React](https://reactjs.org) pour la gestion de l'interface utilisateur -- [Redux](https://redux.js.org) pour gérer le “state” de l'application côté client +- [Redux](https://redux.js.org) pour gérer le "state" de l'application côté client - [TypeScript](https://www.typescriptlang.org) pour ajouter un système de typage à notre code JavaScript. Le typage n'est pas utilisé partout et il n'est pas obligatoire de le prendre en compte pour contribuer. -- [ViteJS](https://vitejs.dev) pour le “bundling” et le serveur de développement +- [ViteJS](https://vitejs.dev) pour le "bundling" et le serveur de développement - [Vitest](https://vitest.dev) et [Cypress](https://www.cypress.io) pour l'execution des tests. Plus d'informations dans la section consacrée aux tests. - [Yarn](https://yarnpkg.com) pour la gestion des dépendances (à la place de NPM qui est souvent utilisé dans les applications JavaScript) +### Patterns et bonnes pratiques + +#### Compound Components + +Pour créer des composants React réutilisables et composables, nous privilégions le **pattern Compound Components**. Ce pattern permet de créer des APIs de composants flexibles où les sous-composants sont exposés comme propriétés du composant principal, offrant une composition déclarative tout en gardant le contrôle sur le rendu final. + +Pour plus de détails sur ce pattern, consultez l'[ADR sur les Compound Components](./adr/ADR-2025-10-02-compound-components.md). + ### Tests #### Vérification syntaxique : diff --git a/adr/ADR-2025-10-02-compound-components.md b/adr/ADR-2025-10-02-compound-components.md new file mode 100644 index 0000000000..818676b041 --- /dev/null +++ b/adr/ADR-2025-10-02-compound-components.md @@ -0,0 +1,181 @@ +# ADR : Pattern Compound Components pour les composants React + +## Date +2025-10-02 + +## Contexte + +On refactorise le simulateur location-de-meublé pour passer d'une interface séquentielle à une interface de comparaison en colonnes. On veut créer des composants réutilisables qui soient flexibles tout en gardant le contrôle sur le rendu. + +## Problématique + +Actuellement, nos composants de comparaison ressemblent à ça : + +```tsx +// Dans DetailsRowCards.tsx - lourd et couplé + name)} + footerContent={footer?.(statusObject.engine)} + isBestOption={bestOptionValue === statusObject.name} +> + + + + + {label && ' '} + {label && label} + + + + + {warning?.(statusObject.engine)} + + + + {evolutionLabel} + + + +``` + +**Problèmes** : +- Plein de `StyledXXX` partout qui polluent le code +- Logique de layout mélangée avec le contenu +- Difficile de réutiliser dans un autre contexte +- Props `footerContent`, `isBestOption` spécifiques à un cas d'usage +- Impossible de composer librement le contenu + +Comment créer des composants qui permettent de faire ça de manière plus propre et flexible ? + +## Solution : Compound Components + +On expose des sous-composants comme propriétés du composant principal : + +```tsx + + + + + + 1 800€ + + +``` + +Le composant parent peut alors organiser les enfants comme il veut : + +```tsx +const CarteComparaison = ({ children, meilleureOption }) => { + // On récupère les sous-composants + const étiquettes = React.Children.toArray(children).find( + child => child.type === CarteComparaison.Étiquettes + ) + const contenu = React.Children.toArray(children).find( + child => child.type === CarteComparaison.Contenu + ) + + // On contrôle complètement le layout + return ( + +
{étiquettes}
+ + {contenu} + +
+ ) +} +``` + +## Avantages + +✅ **API intuitive** : Ça ressemble à du HTML, facile à comprendre +✅ **Flexibilité** : L'utilisateur met ce qu'il veut dans chaque section +✅ **Contrôle du layout** : On garde la main sur l'organisation finale +✅ **Pas de StyledBody partout** : Les styles restent dans le composant +✅ **Facile à étendre** : Ajouter un nouveau sous-composant ne casse rien + +## Inconvénients + +❌ **Plus de code initial** : Un peu plus long à mettre en place +❌ **React.Children** : Peut être moins performant avec beaucoup d'enfants + +## Alternatives qu'on a écartées + +### Option 1 : StyledBody partout (ce qu'on fait actuellement) + +```tsx + + + 1 800€ + par mois + + +``` + +**Problème** : On se retrouve avec des `StyledXXX` partout, les styles sont éparpillés, et c'est dur de maintenir une cohérence visuelle. + +### Option 2 : Props monolithiques + +```tsx +} + contenu="1 800€" + sousTitre="par mois" +/> +``` + +**Problème** : Moins flexible, on doit prévoir toutes les props possibles à l'avance, et l'API devient vite énorme. + +### Option 3 : Configuration par objet + +```tsx + +``` + +**Problème** : Trop rigide, on perd la composabilité React, et on ne peut pas mettre de composants custom. + +## Quand utiliser ce pattern ? + +👍 **À utiliser pour** : +- Composants complexes (cartes de comparaison, formulaires multi-sections) +- Quand on veut offrir de la flexibilité tout en gardant le contrôle +- Pour éviter la multiplication des `StyledXXX` + +👎 **À éviter pour** : +- Composants simples (un bouton, un input basique) +- Quand une simple prop suffit + +## Exemple concret avec layout contrôlé + +```tsx +const CarteComparaison = ({ children, variant = 'vertical' }) => { + const étiquettes = // ... extraction + const contenu = // ... extraction + + // Layout horizontal avec Grid + if (variant === 'horizontal') { + return ( + + {étiquettes} + {contenu} + + ) + } + + // Layout vertical avec Flexbox + return ( + + {étiquettes} + {contenu} + + ) +} +``` + +On garde le contrôle total sur le layout tout en laissant l'utilisateur composer le contenu librement. C'est le meilleur des deux mondes. diff --git a/modele-social/CHANGELOG.md b/modele-social/CHANGELOG.md index 3942d86abf..57b8b38d06 100644 --- a/modele-social/CHANGELOG.md +++ b/modele-social/CHANGELOG.md @@ -2,6 +2,25 @@ ## next +## 9.0.0 + +### Breaking changes +- Renomme la règle `entreprise . imposition . IS . capital détenu au moins à 75 pourcents par des personnes physiques` en `entreprise . capital social . détenu au moins à 75 pourcents par des personnes physiques` + +### Nouveautés +- Ajoute la règle `entreprise . imposition . IS . total` qui inclue la contribution +sociale sur l'IS +- Ajoute les règles `salarié . contrat . apprentissage . assiette réduite apprentissage . taxe sur les salaires` et `salarié . contrat . apprentissage . exonération taxe sur les salaires` + +### Mises à jour +- Change `entreprise . exercice . date trop ancienne` de 2018 à 2022 +- Reformulation de la question de `entreprise . date de cessation` + +### Corrections +- Corrige le calcul de `entreprise . exercice . durée` +- Corrige le taux de cotisation maladie sur les revenus non conventionnés pour les médecins conventionnés secteur 2 +- Corrige la règle `salarié . contrat . apprentissage . assiette réduite apprentissage . CSG-CRDS` qui ne s'appliquait pas correctement + ## 8.0.0 ### Breaking changes diff --git a/modele-social/package.json b/modele-social/package.json index 6f237ad7fc..bd034cfaec 100644 --- a/modele-social/package.json +++ b/modele-social/package.json @@ -1,6 +1,6 @@ { "name": "modele-social", - "version": "8.0.0", + "version": "9.0.0", "description": "Les règles publicodes du système social français", "type": "module", "main": "./dist/index.js", diff --git "a/modele-social/r\303\250gles/artiste-auteur.publicodes" "b/modele-social/r\303\250gles/artiste-auteur.publicodes" index 2b4d3b61ce..7a2181bfa4 100644 --- "a/modele-social/r\303\250gles/artiste-auteur.publicodes" +++ "b/modele-social/r\303\250gles/artiste-auteur.publicodes" @@ -248,12 +248,9 @@ artiste-auteur . cotisations . IRCEC . profession: l’IRCEC : dans tous les cas et si vous atteignez le seuil d’affiliation, au RAAP, puis selon votre activité artistique au RACD et/ou au RACL. - formule: - une possibilité: - choix obligatoire: non - possibilités: - - RACD - - RACL + une possibilité: + - RACD + - RACL par défaut: "''" artiste-auteur . cotisations . IRCEC . profession . RACD: diff --git "a/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-formulaire.publicodes" "b/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-formulaire.publicodes" index 2854aa95f3..d91c073c81 100644 --- "a/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-formulaire.publicodes" +++ "b/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-formulaire.publicodes" @@ -5,18 +5,16 @@ déclaration revenus PAMC: déclaration revenus PAMC . profession: question: Quelle est votre profession ? une possibilité: - choix obligatoire: oui - possibilités: - - dentiste - - infirmier - - kinésithérapeute - - médecin secteur 1 généraliste - - médecin secteur 1 spécialiste - - médecin secteur 2 - - orthophoniste - - orthoptiste - - pédicure podologue - - sage-femme + - dentiste + - infirmier + - kinésithérapeute + - médecin secteur 1 généraliste + - médecin secteur 1 spécialiste + - médecin secteur 2 + - orthophoniste + - orthoptiste + - pédicure podologue + - sage-femme meta: requis: oui avec: @@ -70,10 +68,8 @@ déclaration revenus PAMC . statut: remplaçant/remplaçante et que vous vous êtes installé/installée au 1er juillet, sélectionnez « Remplaçant / remplaçante ». une possibilité: - choix obligatoire: oui - possibilités: - - titulaire - - remplaçant + - titulaire + - remplaçant meta: requis: oui avec: @@ -86,11 +82,9 @@ déclaration revenus PAMC . statut: déclaration revenus PAMC . régime fiscal: question: Quel est votre régime fiscal ? une possibilité: - choix obligatoire: oui - possibilités: - - IR micro-fiscal - - IR non micro-fiscal - - IS + - IR micro-fiscal + - IR non micro-fiscal + - IS meta: requis: oui diff --git "a/modele-social/r\303\250gles/declarations-ind\303\251pendant/charges-sociales-formulaire.publicodes" "b/modele-social/r\303\250gles/declarations-ind\303\251pendant/charges-sociales-formulaire.publicodes" index cd1034d922..05f006c7d1 100644 --- "a/modele-social/r\303\250gles/declarations-ind\303\251pendant/charges-sociales-formulaire.publicodes" +++ "b/modele-social/r\303\250gles/declarations-ind\303\251pendant/charges-sociales-formulaire.publicodes" @@ -18,10 +18,8 @@ déclaration charge sociales . comptabilité: non applicable si: entreprise . imposition . IS question: Quelle méthode de gestion de la comptabilité est utilisée pour l'entreprise ? une possibilité: - choix obligatoire: oui - possibilités: - - engagement - - trésorerie + - engagement + - trésorerie déclaration charge sociales . comptabilité . trésorerie: # rend non applicable: entreprise . imposition . régime . micro-entreprise @@ -68,13 +66,10 @@ déclaration charge sociales . nature de l'activité: - entreprise . activité . nature question: Quelle est la nature de votre activité ? par défaut: "'artisanale'" - valeur: - une possibilité: - choix obligatoire: oui - possibilités: - - artisanale - - commerciale - - libérale + une possibilité: + - artisanale + - commerciale + - libérale références: Vérifier la nature de son activité: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/verifier-nature-son-activite Comment déterminer la nature de l'activité d'une entreprise ?: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32887 diff --git "a/modele-social/r\303\250gles/dirigeant/conjoint-collaborateur.publicodes" "b/modele-social/r\303\250gles/dirigeant/conjoint-collaborateur.publicodes" index d360ce7ca6..da6fa0a555 100644 --- "a/modele-social/r\303\250gles/dirigeant/conjoint-collaborateur.publicodes" +++ "b/modele-social/r\303\250gles/dirigeant/conjoint-collaborateur.publicodes" @@ -33,11 +33,9 @@ dirigeant . indépendant . conjoint collaborateur . assiette: par défaut: "'forfaitaire'" une possibilité: - choix obligatoire: oui - possibilités: - - forfaitaire - - revenu sans partage - - revenu avec partage + - forfaitaire + - revenu sans partage + - revenu avec partage avec: forfaitaire: @@ -52,12 +50,9 @@ dirigeant . indépendant . conjoint collaborateur . assiette: titre: Proportion revenu question: À quelle proportion du revenu le conjoint cotise-t-il ? par défaut: "'tiers'" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - tiers - - moitié + une possibilité: + - tiers + - moitié avec: moitié: diff --git "a/modele-social/r\303\250gles/dirigeant/ind\303\251pendant/cotisations-et-contributions.publicodes" "b/modele-social/r\303\250gles/dirigeant/ind\303\251pendant/cotisations-et-contributions.publicodes" index cacf8a02ba..e742179784 100644 --- "a/modele-social/r\303\250gles/dirigeant/ind\303\251pendant/cotisations-et-contributions.publicodes" +++ "b/modele-social/r\303\250gles/dirigeant/ind\303\251pendant/cotisations-et-contributions.publicodes" @@ -97,9 +97,9 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac . rev dirigeant . indépendant . cotisations et contributions . début activité: titre: Cotisations forfaitaires de début d’activité description: | - Lorsque vous commencez votre activité, vos **revenus professionnels** - n’étant pas connus, **les cotisations et contributions des deux premières - années sont calculées sur une **base forfaitaire**. + Lorsque vous commencez votre activité, vos revenus professionnels n’étant pas + connus, les **cotisations et contributions** des deux premières années sont + calculées sur une **base forfaitaire**. Ces cotisations seront ajustées et régularisées en fonction de vos revenus réels diff --git "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CARCDSF.publicodes" "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CARCDSF.publicodes" index aab2b05dd0..330b8d2498 100644 --- "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CARCDSF.publicodes" +++ "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CARCDSF.publicodes" @@ -198,13 +198,10 @@ dirigeant . indépendant . PL . CARCDSF . sage-femme . RID: Il existe classes de cotisations aux choix, correspondant à des cotisations et des degrés d'indemnisations différents. par défaut: "'A'" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - A - - B - - C + une possibilité: + - A + - B + - C avec: A: diff --git "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CIPAV.publicodes" "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CIPAV.publicodes" index d490d6e995..cf03883698 100644 --- "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CIPAV.publicodes" +++ "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CIPAV.publicodes" @@ -194,13 +194,10 @@ dirigeant . indépendant . PL . CIPAV . invalidité et décès: les affiliés cotisent en « classe A » mais il est possible de cotiser en classe B ou C afin de bénéficier d'une meilleure couverture invalidité-décès. - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - A - - B - - C + une possibilité: + - A + - B + - C par défaut: "'A'" avec: @@ -262,10 +259,8 @@ dirigeant . indépendant . PL . CIPAV . conjoint collaborateur: complémentaire et le régime d’invalidité-décès Cipav ? par défaut: "'quart'" une possibilité: - choix obligatoire: oui - possibilités: - - quart - - moitié + - quart + - moitié avec: moitié: diff --git "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CNAVPL.publicodes" "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CNAVPL.publicodes" index 5b3430c985..0b0377a8c6 100644 --- "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CNAVPL.publicodes" +++ "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CNAVPL.publicodes" @@ -140,12 +140,9 @@ dirigeant . indépendant . PL . CNAVPL . conjoint collaborateur . proportion: À quelle proportion du revenu le conjoint cotise-t-il pour le régime de base ? par défaut: "'quart'" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - quart - - moitié + une possibilité: + - quart + - moitié avec: moitié: diff --git "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CNBF.publicodes" "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CNBF.publicodes" index a1df557bab..ca3897d841 100644 --- "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CNBF.publicodes" +++ "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/CNBF.publicodes" @@ -278,13 +278,10 @@ dirigeant . indépendant . PL . CNBF . retraite complémentaire: Il existe classes de cotisations aux choix, correspondant à des cotisations et des degrés d'indemnisations différents. par défaut: "'C1'" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - C1 - - C2 - - C2P + une possibilité: + - C1 + - C2 + - C2P avec: C1: titre: classe 1 diff --git "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/PAMC.publicodes" "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/PAMC.publicodes" index a237c54a33..a2c6d9e895 100644 --- "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/PAMC.publicodes" +++ "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/PAMC.publicodes" @@ -196,21 +196,26 @@ dirigeant . indépendant . PL . PAMC . maladie . participation CPAM: Article 51 de la convention nationale organisant les rapports entre les chirurgiens-dentistes libéraux et l’assurance maladie: https://www.ameli.fr/sites/default/files/Documents/CONVENTION-NATIONALE-DENTAIRE-CONSOLIDEE-AVENANT2.pdf#page=63 dirigeant . indépendant . PL . PAMC . maladie . contribution additionnelle: - formule: - produit: - - (assiette des cotisations - revenus activité conventionnée) - - taux - arrondi: oui - avec: - taux: - taux progressif: - assiette: assiette des cotisations - multiplicateur: plafond sécurité sociale - tranches: - - plafond: 40% - taux: 3.25% - - plafond: 110% - taux: 9.75% + produit: + - (assiette des cotisations - revenus activité conventionnée) + - taux + arrondi: oui + avec: + taux: + variations: + - si: métier . santé . médecin . secteur = 'S2' + alors: 3.25% + - sinon: + taux progressif: + assiette: assiette des cotisations + multiplicateur: plafond sécurité sociale + tranches: + - plafond: 40% + taux: 3.25% + - plafond: 110% + taux: 9.75% + références: + Taux de cotisations - Praticien ou auxiliaire médical: https://www.urssaf.fr/accueil/outils-documentation/taux-baremes/taux-cotisations-pam.html dirigeant . indépendant . PL . PAMC . allocations familiales: applicable si: métier . santé . médecin . secteur = 'S1' diff --git "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/profession-lib\303\251rale.publicodes" "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/profession-lib\303\251rale.publicodes" index 40ceb3b709..8500330b26 100644 --- "a/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/profession-lib\303\251rale.publicodes" +++ "b/modele-social/r\303\250gles/dirigeant/professions-lib\303\251rales/profession-lib\303\251rale.publicodes" @@ -9,12 +9,10 @@ dirigeant . indépendant . PL . métier: par défaut: "'rattaché CIPAV'" question: A quelle catégorie appartient votre profession ? une possibilité: - choix obligatoire: oui - possibilités: - - santé - - juridique - - expert-comptable - - rattaché CIPAV + - santé + - juridique + - expert-comptable + - rattaché CIPAV dirigeant . indépendant . PL . métier . rattaché CIPAV: titre: Autre métier rattaché à la Cipav @@ -45,14 +43,12 @@ dirigeant . indépendant . PL . métier . santé: diététicien et chiropracteur dépendent de la Cipav pour leur retraite et invalidité. une possibilité: - choix obligatoire: oui - possibilités: - - médecin - - chirurgien-dentiste - - sage-femme - - auxiliaire médical - - pharmacien - - vétérinaire + - médecin + - chirurgien-dentiste + - sage-femme + - auxiliaire médical + - pharmacien + - vétérinaire avec: auxiliaire médical: @@ -68,13 +64,10 @@ dirigeant . indépendant . PL . métier . santé: Les taux de cotisations et remboursement de la CPAM ne sont pas les même en fonction du régime de tarification choisie par le praticien. par défaut: "'S1'" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - 'S1' - - 'S2' - - 'non conventionné' + une possibilité: + - 'S1' + - 'S2' + - 'non conventionné' avec: non conventionné: @@ -99,11 +92,9 @@ dirigeant . indépendant . PL . métier . santé: dirigeant . indépendant . PL . métier . juridique: titre: Professions juridiques et judicaires une possibilité: - choix obligatoire: oui - possibilités: - - avocat - - notaire - - officier + - avocat + - notaire + - officier avec: avocat: diff --git "a/modele-social/r\303\250gles/entreprise/activit\303\251.publicodes" "b/modele-social/r\303\250gles/entreprise/activit\303\251.publicodes" index 1e6cc6611f..36722bc07c 100644 --- "a/modele-social/r\303\250gles/entreprise/activit\303\251.publicodes" +++ "b/modele-social/r\303\250gles/entreprise/activit\303\251.publicodes" @@ -18,13 +18,10 @@ entreprise . activité . nature: Toutefois, à partir de la troisième année civile suivant celle au cours de laquelle la situation de pluriactivité a débuté, les personnes intéressées peuvent demander que l’activité qui a procuré le montant de chiffre d’affaires ou de recettes hors taxes le plus élevé sur les trois dernières années soit considérée comme leur activité principale. par défaut: "'commerciale'" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - artisanale - - commerciale - - libérale + une possibilité: + - artisanale + - commerciale + - libérale références: Vérifier la nature de son activité: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/verifier-nature-son-activite Comment déterminer la nature de l’activité d’une entreprise ?: https://entreprendre.service-public.fr/vosdroits/F32887/personnalisation/resultat @@ -219,12 +216,9 @@ entreprise . activités . service ou vente: - activité . nature . artisanale - activité . nature . commerciale question: Quel est le type d’activité principale de l’entreprise ? - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - vente - - service + une possibilité: + - vente + - service par défaut: variations: - si: activité . nature . artisanale diff --git "a/modele-social/r\303\250gles/entreprise/cat\303\251gorie-juridique.publicodes" "b/modele-social/r\303\250gles/entreprise/cat\303\251gorie-juridique.publicodes" index a101607ff5..d87bc9f7e8 100644 --- "a/modele-social/r\303\250gles/entreprise/cat\303\251gorie-juridique.publicodes" +++ "b/modele-social/r\303\250gles/entreprise/cat\303\251gorie-juridique.publicodes" @@ -1,9 +1,7 @@ entreprise . associés: une possibilité: - choix obligatoire: oui - possibilités: - - unique - - multiples + - unique + - multiples description: | Si vous êtes le seul associé de votre société, alors vous êtes dans le cas d'une « société unipersonnelle ». @@ -32,15 +30,13 @@ entreprise . catégorie juridique: références: Liste des catégories juridique de l'INSEE: https://www.insee.fr/fr/information/2028129 une possibilité: - choix obligatoire: oui - possibilités: - - EI - - SARL - - SAS - - SELARL - - SELAS - - association - - autre + - EI + - SARL + - SAS + - SELARL + - SELAS + - association + - autre meta: affichage: radio diff --git "a/modele-social/r\303\250gles/entreprise/cessation-activit\303\251.publicodes" "b/modele-social/r\303\250gles/entreprise/cessation-activit\303\251.publicodes" index e44a8c3772..202718f907 100644 --- "a/modele-social/r\303\250gles/entreprise/cessation-activit\303\251.publicodes" +++ "b/modele-social/r\303\250gles/entreprise/cessation-activit\303\251.publicodes" @@ -2,7 +2,7 @@ entreprise . en cessation d'activité: valeur: non entreprise . date de cessation: - question: À quelle date comptez-vous déclarer la cessation d’activité ? + question: À quelle date avez-vous ou comptez-vous déclarer la cessation d’activité ? applicable si: en cessation d'activité par défaut: période . fin d'année description: La date de cessation est la date à laquelle l’entreprise cessera son activité. diff --git "a/modele-social/r\303\250gles/entreprise/entreprise.publicodes" "b/modele-social/r\303\250gles/entreprise/entreprise.publicodes" index f5b620dc4e..b3c31ce15b 100644 --- "a/modele-social/r\303\250gles/entreprise/entreprise.publicodes" +++ "b/modele-social/r\303\250gles/entreprise/entreprise.publicodes" @@ -148,6 +148,70 @@ entreprise . chiffre d'affaires . BIC: - service BIC - vente restauration hébergement +entreprise . chiffre d'affaires . seuil micro: + experimental: oui + +entreprise . chiffre d'affaires . seuil micro . libérale: + unité: €/an + variations: + - si: date >= 01/2023 + alors: 77700 €/an + - sinon: 72600 €/an + +entreprise . chiffre d'affaires . seuil micro . total: + unité: €/an + variations: + - si: date >= 01/2023 + alors: 188700 €/an + - sinon: 176200 €/an + +entreprise . chiffre d'affaires . seuil micro . dépassé: + experimental: oui + applicable si: imposition . IR + unité: €/an + une de ces conditions: + - entreprise . chiffre d'affaires > total + - entreprise . chiffre d'affaires . service > libérale + description: | + Le statut de micro-entreprise s’applique tant que le chiffre d’affaires annuel + (effectivement encaissé au cours de l’année civile) ne dépasse pas les seuils du + régime fiscal de la micro-entreprise. + + En cas de dépassement **sur deux années consécutives**, l’entreprise bascule + automatiquement dans le régime de [l’entreprise + individuelle](/simulateurs/indépendant). + + À la fin de la première année d’activité, le CA est proratisé par rapport à la + durée d’activité. + + > ##### Exemple : + > Un contribuable crée une entreprise le 1er août et encaisse des recettes HT de + > `50 000 €` au cours des cinq mois d’activité de sa première année civile + > d’exploitation. + > Les recettes de cette première année civile sont ajustées *prorata temporis* + > pour les comparer au plafond : + > + > `50 000€ x (365/153) = 119 280 €` + + + Les charges ne sont pas déductibles pour le calcul du plafond (comme pour le + calcul des cotisations) + + + ### Multi-activité + + Lorsqu’un entrepreneur exerce 2 activités au sein de sa micro-entreprise, le + seuil de chiffre d’affaires à respecter n’est pas pour autant doublé. En effet + l’exercice de plusieurs activités avec la même micro-entreprise n’augmente pas + les seuils. + + références: + Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32353 + Article 50-0 du Code général des impôts: https://www.legifrance.gouv.fr/affichCode.do?idSectionTA=LEGISCTA000006199553&cidTexte=LEGITEXT000006069577 + Bofip (dépassement micro-bnc): https://bofip.impots.gouv.fr/bofip/4807-PGP.html + Bofip (dépassement micro-bic): https://bofip.impots.gouv.fr/bofip/1802-PGP.html + autoentrepreneur.urssaf.fr: https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html + entreprise . TVA . franchise de TVA: oui entreprise . résultat fiscal: @@ -178,10 +242,10 @@ entreprise . exercice: date trop ancienne: type: notification sévérité: avertissement - formule: début < 01/01/2018 + formule: début < 01/01/2022 description: La date saisie est trop ancienne. Le simulateur n’intègre pas les - barèmes avant 2018. + barèmes avant 2022. début: type: date @@ -195,10 +259,11 @@ entreprise . exercice: durée: titre: durée de l’exercice - formule: - durée: - depuis: début - jusqu'à: fin + somme: + - durée: + depuis: début + jusqu'à: fin + - 1 jour durée maximale: type: notification @@ -268,6 +333,8 @@ entreprise . capital social: question: Quele est le capital social de la société ? unité: € +entreprise . capital social . détenu au moins à 75 pourcents par des personnes physiques: oui + entreprise . salariés: entreprise . salariés . effectif: @@ -298,15 +365,13 @@ entreprise . salariés . effectif: Le franchissement d’un seuil à la hausse n’est pris en compte que s’il est atteint ou dépassé pendant 5 années civiles consécutives. une possibilité: - choix obligatoire: oui - possibilités: - - moins de 5 - - moins de 11 - - moins de 20 - - moins de 50 - - moins de 150 - - moins de 250 - - plus de 250 + - moins de 5 + - moins de 11 + - moins de 20 + - moins de 50 + - moins de 150 + - moins de 250 + - plus de 250 par défaut: "'moins de 5'" diff --git "a/modele-social/r\303\250gles/entreprise/imposition.publicodes" "b/modele-social/r\303\250gles/entreprise/imposition.publicodes" index fa69042aab..2ac192cfbb 100644 --- "a/modele-social/r\303\250gles/entreprise/imposition.publicodes" +++ "b/modele-social/r\303\250gles/entreprise/imposition.publicodes" @@ -1,10 +1,8 @@ entreprise . imposition: question: Quel est le type d’imposition de votre entreprise ? une possibilité: - choix obligatoire: oui - possibilités: - - IR - - IS + - IR + - IS par défaut: variations: @@ -48,11 +46,9 @@ entreprise . imposition . IR . type de bénéfices: question: Quel est le type de bénéfices de votre entreprise ? par défaut: oui une possibilité: - choix obligatoire: oui - possibilités: - - BNC - - BIC - - BA + - BNC + - BIC + - BA références: 'Impôt sur le revenu : BIC, BNC, comment ça marche ?': https://www.economie.gouv.fr/entreprises/impot-sur-revenu-bic-bnc @@ -126,94 +122,53 @@ entreprise . imposition . IS: Quelles sont les entreprises soumises à l’impôt sur les sociétés (IS) ?: "https://bpifrance-creation.fr/encyclopedie/fiscalite-lentreprise/generalites/is-impot-societes" Comparaison IR/IS: "https://bpifrance-creation.fr/encyclopedie/fiscalite-lentreprise/generalites/imposition-benefices#:~:text=Principe%20de%20l%27imp%C3%B4t%20sur%20les%20soci%C3%A9t%C3%A9s,-Une%20distinction%20est&text=Les%20entreprises%20dont%20le%20chiffre,%2C%20et%2025%20%25%20au%20del%C3%A0." +entreprise . imposition . IS . total: + somme: + - montant + - contribution sociale + entreprise . imposition . IS . montant: unité: €/an - applicable si: prorata temporis > 0 variations: - - si: exercice . début >= 01/2022 + - si: éligible taux réduit alors: barème: assiette: résultat imposable multiplicateur: prorata temporis tranches: - taux: taux réduit - plafond: plafond taux réduit 1 + plafond: 42500 €/an - taux: taux normal - - si: exercice . début >= 01/2021 - alors: - barème: - assiette: résultat imposable - multiplicateur: prorata temporis - tranches: - - taux: taux réduit - plafond: plafond taux réduit 1 - - taux: 26.5% - - si: exercice . début >= 01/2020 - alors: - barème: - assiette: résultat imposable - multiplicateur: prorata temporis - tranches: - - taux: taux réduit - plafond: plafond taux réduit 1 - - taux: 28% - - si: exercice . début >= 01/01/2019 - alors: - barème: - assiette: résultat imposable - multiplicateur: prorata temporis - tranches: - - taux: taux réduit - plafond: plafond taux réduit 1 - - taux: 28% - plafond: plafond taux réduit 2 - - taux: 31% - - si: exercice . début >= 01/01/2018 - alors: - barème: - assiette: résultat imposable - multiplicateur: prorata temporis - tranches: - - taux: taux réduit - plafond: plafond taux réduit 1 - - taux: 28% - plafond: plafond taux réduit 2 - - taux: 33.3333% + - sinon: résultat imposable * taux normal arrondi: oui - références: Fiche impots.gouv.fr: https://www.impots.gouv.fr/portail/international-professionnel/impot-sur-les-societes Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F23575 avec: - plafond taux réduit 1: - applicable si: éligible taux réduit - variations: - - si: exercice . début >= 01/2022 - alors: 42500 €/an - - sinon: 38120 €/an - - plafond taux réduit 2: - applicable si: éligible taux réduit - valeur: 500000 €/an - taux normal: 25% taux réduit: 15% + taux normal: 25% entreprise . imposition . IS . éligible taux réduit: par défaut: oui toutes ces conditions: - - chiffre d'affaires <= 7630 k€/an * prorata temporis - - capital détenu au moins à 75 pourcents par des personnes physiques - - avec: - capital détenu au moins à 75 pourcents par des personnes physiques: oui + - chiffre d'affaires <= 10000 k€/an * prorata temporis + - capital social . détenu au moins à 75 pourcents par des personnes physiques entreprise . imposition . IS . prorata temporis: description: | - Lorsque la durée de l’exercice n’est pas égale à un an, on pro-ratise les + Lorsque la durée de l’exercice n’est pas égale à un an, on proratise les plafonds utilisés dans le barème de l’impôt sur les sociétés. unité: '%' formule: exercice . durée / 1 an + note: | + Ici on rapporte le nombre de jours de l’exercice à 1 an. En réalité on devrait + rapporter le nombre de mois de l’exercice à 12 mois, et pour les mois + incomplets, rapporter le nombre de jours à 30 jours. + + > **Exemple pour un exercice du 1er janvier au 15 octobre :** + > - prorata temporis théorique = (9 mois complets + (15 jours / 30)) / 12 = 79,17 % + > - prorata temporis calculé = 288 jours / 365 = 78,90 % # TODO: c'est un peu plus subtil que cela : « En cas d’exercice ouvert ou # arrêté en cours de mois calendaire, le nombre de jours résiduels concourt à # la détermination du rapport pour un montant égal au rapport existant entre @@ -222,6 +177,10 @@ entreprise . imposition . IS . prorata temporis: Bofip: https://bofip.impots.gouv.fr/bofip/2065-PGP.html/identifiant%3DBOI-IS-LIQ-20-20-20180801 entreprise . imposition . IS . contribution sociale: + # NB: n'est pas utilisé car le seul usage de entreprise . imposition . IS . total + # est dans le simulateur de l'impôt sur les sociétés, et celui-ci ne demande pas + # le chiffres d'affaires et dans ce cas c'est la valeur par défaut de la non + # applicabilité qui est utilisée. description: | La contribution sociale sur les bénéfices est un impôt distinct de l’impôt sur les sociétés. Son montant n’est pas déductible des résultats. @@ -229,13 +188,21 @@ entreprise . imposition . IS . contribution sociale: L’assiette bénéficie d’un abattement important, et seules les entreprises réalisant plus de 2,3 millions d’euros de bénéfices sont concernées par cette contribution. + non applicable si: + par défaut: oui + toutes ces conditions: + - non applicable si: entreprise . catégorie juridique . EI + valeur: chiffre d'affaires <= 7630 k€/an * prorata temporis + - capital social . détenu au moins à 75 pourcents par des personnes physiques formule: produit: - valeur: IS . montant - abattement: 763000 €/an * prorata temporis + abattement: 763 k€/an * prorata temporis - 3.3% + arrondi: oui références: - Bofip: https://bofip.impots.gouv.fr/bofip/3492-PGP.html/identifiant%3DBOI-IS-AUT-10-20-20130318 + Contribution sociale sur l'impôt sur les sociétés: https://entreprendre.service-public.fr/vosdroits/F23510 + Contribution sociale sur l'IS - Modalités de calcul : https://bofip.impots.gouv.fr/bofip/3492-PGP.html/identifiant%3DBOI-IS-AUT-10-20-20130318 entreprise . imposition . IS . résultat imposable: titre: Résultat de l’exercice @@ -246,12 +213,14 @@ entreprise . imposition . IS . résultat imposable: entreprise . imposition . IS . information sur le report de déficit: type: notification formule: résultat imposable < 0 €/an - # TODO: Support des références dans les notifications description: | Les déficits subits au cours d’un exercice peuvent être reportés sur les exercices suivants (report en avant), ou sur le seul exercice précédent (report en arrière). + [Voir la fiche « Impôt sur les sociétés (IS) : report de déficit » sur + Entreprendre.Service-Public.fr](https://entreprendre.service-public.fr/vosdroits/F23628) + entreprise . imposition . IS . résultat net: résumé: Après déduction des charges et de l’impôt sur les société somme: @@ -264,23 +233,15 @@ entreprise . imposition . IS . résultat net: entreprise . imposition . régime: question: Quel est le régime d’imposition de votre entreprise ? une possibilité: - choix obligatoire: oui - possibilités: - - micro-entreprise - - déclaration contrôlée - - réel simplifié - - réel normal + - micro-entreprise + - déclaration contrôlée + - réel simplifié + - réel normal références: Les différents régimes d’imposition: https://www.economie.gouv.fr/entreprises/les-differents-regimes-dimposition entreprise . imposition . régime . micro-entreprise: titre: micro-fiscal - non applicable si: entreprise . imposition . IS - valeur: régime = 'micro-entreprise' - par défaut: non - - rend non applicable: dirigeant . indépendant . cotisations facultatives - question: Avez-vous opté pour le régime micro-fiscal ? description: | Avec le régime micro-fiscal, les charges déductibles sont estimées forfaitairement, en fonction d’un pourcentage du chiffre d’affaires. Ce pourcentage dépend du type d’activité : 71% pour les activités de vente, restauration et hébergement (location de meublé de tourisme @@ -288,6 +249,11 @@ entreprise . imposition . régime . micro-entreprise: Cette option permet de simplifier votre comptabilité et peut être avantageuse en termes de revenu imposable dans le cas où vos charges de fonctionnement sont faibles. + non applicable si: entreprise . imposition . IS + valeur: régime = 'micro-entreprise' + question: Avez-vous opté pour le régime micro-fiscal ? + par défaut: non + rend non applicable: dirigeant . indépendant . cotisations facultatives références: Régime micro-fiscal: https://entreprendre.service-public.fr/vosdroits/F23267 "Changement de régime d’imposition : comment ça marche ?": https://www.economie.gouv.fr/entreprises/changement-regime-imposition @@ -335,74 +301,6 @@ entreprise . imposition . régime . micro-entreprise . alerte seuil dépassés: est dépassé. [En savoir plus](/documentation/entreprise/chiffre-d'affaires/seuil-micro/dépassé) -entreprise . chiffre d'affaires . seuil micro: - experimental: oui - -entreprise . chiffre d'affaires . seuil micro . libérale: - unité: €/an - variations: - - si: date >= 01/2023 - alors: 77700 €/an - - sinon: 72600 €/an - -entreprise . chiffre d'affaires . seuil micro . total: - unité: €/an - variations: - - si: date >= 01/2023 - alors: 188700 €/an - - sinon: 176200 €/an - -entreprise . chiffre d'affaires . seuil micro . dépassé: - experimental: oui - applicable si: imposition . IR - description: | - Le statut de micro-entreprise s’applique tant que le chiffre d’affaires annuel - (effectivement encaissé au cours de l’année civile) ne dépasse pas les seuils du - régime fiscal de la micro-entreprise. - - En cas de dépassement **sur deux années consécutives**, l’entreprise bascule - automatiquement dans le régime de [l’entreprise - individuelle](/simulateurs/indépendant). - - À la fin de la première année d’activité, le CA est proratisé par rapport à la - durée d’activité. - - > ##### Exemple : - > Un contribuable crée une entreprise le 1er août et encaisse des recettes HT de - > `50 000 €` au cours des cinq mois d’activité de sa première année civile - > d’exploitation. - > Les recettes de cette première année civile sont ajustées *prorata temporis* - > pour les comparer au plafond : - > - > `50 000€ x (365/153) = 119 280 €` - - - Les charges ne sont pas déductibles pour le calcul du plafond (comme pour le - calcul des cotisations) - - - ### Multi-activité - - Lorsqu’un entrepreneur exerce 2 activités au sein de sa micro-entreprise, le - seuil de chiffre d’affaires à respecter n’est pas pour autant doublé. En effet - l’exercice de plusieurs activités avec la même micro-entreprise n’augmente pas - les seuils. - - références: - Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32353 - Article 50-0 du Code général des impôts: https://www.legifrance.gouv.fr/affichCode.do?idSectionTA=LEGISCTA000006199553&cidTexte=LEGITEXT000006069577 - Bofip (dépassement micro-bnc): https://bofip.impots.gouv.fr/bofip/4807-PGP.html - Bofip (dépassement micro-bic): https://bofip.impots.gouv.fr/bofip/1802-PGP.html - autoentrepreneur.urssaf.fr: https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html - unité: €/an - # TODO: les seuils micro sont dupliqués à plusieurs endroits (artiste-auteur . - # revenus . BNC . contrôle micro-bnc, tableau de la comparaison de régime, - # économie collaborative). Il faudrait référencer la même valeur partout où - # elle est utilisée. - une de ces conditions: - - entreprise . chiffre d'affaires > total - - entreprise . chiffre d'affaires . service > libérale - entreprise . imposition . régime . déclaration contrôlée: applicable si: IR . type de bénéfices . BNC valeur: régime = 'déclaration contrôlée' diff --git "a/modele-social/r\303\250gles/imp\303\264t.publicodes" "b/modele-social/r\303\250gles/imp\303\264t.publicodes" index c12c173bde..170d484e6e 100644 --- "a/modele-social/r\303\250gles/imp\303\264t.publicodes" +++ "b/modele-social/r\303\250gles/imp\303\264t.publicodes" @@ -46,13 +46,10 @@ impôt . méthode de calcul: # où l’on aura a calculer l’impot avec plusieurs sources de revenu non applicable si: dirigeant . auto-entrepreneur . impôt . versement libératoire > 0 par défaut: par défaut - valeur: - une possibilité: - choix obligatoire: oui - possibilités: - - taux neutre - - taux personnalisé - - barème standard + une possibilité: + - taux neutre + - taux personnalisé + - barème standard références: Différence taux neutre / personnalisé: https://www.impots.gouv.fr/particulier/questions/comment-gerer-mon-prelevement-la-source Calcul du taux d’imposition: https://www.economie.gouv.fr/files/files/ESPACE-EVENEMENTIEL/PAS/Fiche_de_calcul_taux_simplifiee.pdf @@ -834,13 +831,10 @@ impôt . foyer fiscal: impôt . foyer fiscal . situation de famille: question: Quelle est votre situation familiale ? - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - célibataire - - couple - - veuf + une possibilité: + - célibataire + - couple + - veuf par défaut: "'célibataire'" impôt . foyer fiscal . situation de famille . célibataire: diff --git "a/modele-social/r\303\250gles/salari\303\251/contrat.publicodes" "b/modele-social/r\303\250gles/salari\303\251/contrat.publicodes" index bb1400e247..3af5cf3407 100644 --- "a/modele-social/r\303\250gles/salari\303\251/contrat.publicodes" +++ "b/modele-social/r\303\250gles/salari\303\251/contrat.publicodes" @@ -2,13 +2,11 @@ salarié . contrat: icônes: 📄 question: De quel type de contrat s'agit-il ? une possibilité: - choix obligatoire: oui - possibilités: - - CDI - - CDD - - apprentissage - - professionnalisation - - stage + - CDI + - CDD + - apprentissage + - professionnalisation + - stage par défaut: "'CDI'" description: | Le contrat qui lie une entreprise (via son établissement) à un individu, qui est alors son salarié. @@ -135,10 +133,8 @@ salarié . contrat . apprentissage . diplôme préparé: déprécié: oui # Était utile pour une aide à l'embauche de 2019 question: Quel type de diplôme l'apprenti prépare-t-il ? une possibilité: - choix obligatoire: oui - possibilités: - - niveau bac ou moins - - niveau supérieur au bac + - niveau bac ou moins + - niveau supérieur au bac par défaut: "'niveau supérieur au bac'" avec: @@ -159,14 +155,11 @@ salarié . contrat . apprentissage . diplôme préparé: salarié . contrat . apprentissage . ancienneté: déprécié: oui # Était utile pour une aide à l'embauche de 2019 question: Depuis combien de temps l'apprenti est-il employé ? - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - moins d'un an - - moins de deux ans - - moins de trois ans - - moins de quatre ans + une possibilité: + - moins d'un an + - moins de deux ans + - moins de trois ans + - moins de quatre ans par défaut: "'moins d'un an'" salarié . contrat . apprentissage . ancienneté . moins d'un an: @@ -214,23 +207,55 @@ salarié . contrat . apprentissage . assiette réduite apprentissage: salarié . contrat . apprentissage . assiette réduite apprentissage . CSG-CRDS: description: - Pour les contrats conclus depuis le 1er mars 2025, les apprentis bénéficient - d’une exonération de CSG et de CRDS jusqu’à 50% du Smic. + Pour les contrats conclus **depuis le 1er mars 2025**, les apprentis bénéficient + d’une exonération de CSG et de CRDS jusqu’à **50 % du Smic**. + + Si la rémunération brute de l’apprenti est inférieure à 50 % du Smic, alors la + part employeur de la mutuelle (qui fait partie de l’assiette de la CSG-CRDS) + est également exonérée de CSG et de CRDS. - Pour les contrats conclus avant, cette exonération est totale. + Pour les contrats conclus **avant le 1er mars 2025**, cette exonération est + totale. références: Embaucher un alternant en contrat d’apprentissage - les exonérations: https://www.urssaf.fr/accueil/employeur/embaucher-gerer-salaries/embaucher/contrat-apprentissage.html#ancre-les-exonerations Contrat d’apprentissage - Quel est le salaire de l’apprenti ?: https://www.service-public.fr/particuliers/vosdroits/F2918#fiche-item-4 - remplace: - références à: cotisations . assiette - dans: salarié . cotisations . CSG-CRDS + Article L136-1-1 du Code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000048683400 + remplace: cotisations . CSG-CRDS . assiette de base variations: - - si: date >= 03/2025 + - si: + toutes ces conditions: + - date >= 03/2025 + - rémunération . brut > 50% * SMIC alors: - valeur: cotisations . assiette - abattement: 50% * SMIC + valeur: salarié . cotisations . CSG-CRDS . assiette de base + contexte: + cotisations . assiette . sans prévoyance: + valeur: cotisations . assiette . sans prévoyance + abattement: 50% * SMIC - sinon: 0 +salarié . contrat . apprentissage . assiette réduite apprentissage . taxe sur les salaires: + description: | + La part du salaire des apprentis correspondant à 11 % du Smic n’est pas soumise + à la taxe sur les salaires. + remplace: régimes spécifiques . taxe sur les salaires . assiette + valeur: cotisations . CSG-CRDS . assiette de base + contexte: + salarié . cotisations . CSG-CRDS . assiette de base . assiette avant abattement: + valeur: salarié . cotisations . CSG-CRDS . assiette de base . assiette avant abattement + abattement: 11% * SMIC + références: + Article 231 bis I du Code général des impôts: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000006303786/ + +salarié . contrat . apprentissage . exonération taxe sur les salaires: + description: | + Les entreprises de 10 salariés ou moins sont exonérées de la taxe sur les + salaires de ses apprentis. + valeur: entreprise . salariés . effectif < 11 + rend non applicable: régimes spécifiques . taxe sur les salaires + références: + Article 231 bis I du Code général des impôts: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000006303786/ + salarié . contrat . professionnalisation . jeune de moins de 30 ans: question: Le salarié embauché a-t-il moins de 30 ans ? par défaut: oui @@ -246,12 +271,11 @@ salarié . contrat . CDD . motif: description: | Le CDD est un contrat d'exception: son recours doit être autorisé par l'un des motifs spécifiés dans la loi. une possibilité: - choix obligatoire: oui # cette contrainte devrait découler de la valeur CDD en amont, c'est un fix temporaire, qui devra être levé au passage à une simulation CDI / CDD - possibilités: - - classique - - contrat aidé - - complément formation - - issue d'apprentissage + # cette contrainte devrait découler de la valeur CDD en amont, c'est un fix temporaire, qui devra être levé au passage à une simulation CDI / CDD + - classique + - contrat aidé + - complément formation + - issue d'apprentissage # les CDD d'usage "concentrent la moitié des embauches en CDD" par défaut: "'classique . accroissement activité'" références: @@ -264,13 +288,11 @@ salarié . contrat . CDD . motif: classique: titre: motifs classiques une possibilité: - choix obligatoire: oui - possibilités: - - remplacement - - accroissement activité - - saisonnier - - usage - - mission + - remplacement + - accroissement activité + - saisonnier + - usage + - mission références: Code du travail - Article L1242-2: https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=714D2E2B814371F4F1D5AA88472CD621.tpdila20v_1?idArticle=LEGIARTI000033024658&cidTexte=LEGITEXT000006072050&dateTexte=20170420 diff --git "a/modele-social/r\303\250gles/salari\303\251/conventions-collectives/b\303\242timent.publicodes" "b/modele-social/r\303\250gles/salari\303\251/conventions-collectives/b\303\242timent.publicodes" index a16a2fab8b..98c723aa7f 100644 --- "a/modele-social/r\303\250gles/salari\303\251/conventions-collectives/b\303\242timent.publicodes" +++ "b/modele-social/r\303\250gles/salari\303\251/conventions-collectives/b\303\242timent.publicodes" @@ -11,13 +11,10 @@ salarié . convention collective . BTP: salarié . convention collective . BTP . catégorie: question: À quelle catégorie le salarié appartient-t-il ? par défaut: "'ouvrier'" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - ouvrier - - etam - - cadre + une possibilité: + - ouvrier + - etam + - cadre salarié . convention collective . BTP . catégorie . ouvrier: titre: Ouvrier @@ -169,19 +166,16 @@ salarié . convention collective . BTP . congés intempéries: salarié . convention collective . BTP . congés intempéries . caisse de rattachement: question: À quelle caisse l'entreprise est-elle rattachée pour le versement de la cotisation congés intempéries ? - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - idf - - nord ouest - - grand ouest - - centre ouest - - centre - - grand est - - rhône alpes auvergne - - méditerranée - - sud ouest + une possibilité: + - idf + - nord ouest + - grand ouest + - centre ouest + - centre + - grand est + - rhône alpes auvergne + - méditerranée + - sud ouest par défaut: "'idf'" avec: diff --git "a/modele-social/r\303\250gles/salari\303\251/conventions-collectives/spectacle-vivant.publicodes" "b/modele-social/r\303\250gles/salari\303\251/conventions-collectives/spectacle-vivant.publicodes" index c5fe52e3da..6f3004a114 100644 --- "a/modele-social/r\303\250gles/salari\303\251/conventions-collectives/spectacle-vivant.publicodes" +++ "b/modele-social/r\303\250gles/salari\303\251/conventions-collectives/spectacle-vivant.publicodes" @@ -62,12 +62,9 @@ salarié . régimes spécifiques . intermittents du spectacle: - convention collective . SVP question: A quel statut d'intermittent est rattaché l'employé ? par défaut: "'technicien'" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - technicien - - artiste + une possibilité: + - technicien + - artiste salarié . régimes spécifiques . intermittents du spectacle . formation professionnelle: remplace: formation professionnelle diff --git "a/modele-social/r\303\250gles/salari\303\251/conventions-collectives/sport.publicodes" "b/modele-social/r\303\250gles/salari\303\251/conventions-collectives/sport.publicodes" index 1b70d77d1b..c2e5225b1d 100644 --- "a/modele-social/r\303\250gles/salari\303\251/conventions-collectives/sport.publicodes" +++ "b/modele-social/r\303\250gles/salari\303\251/conventions-collectives/sport.publicodes" @@ -77,13 +77,10 @@ salarié . convention collective . sport . cotisations . régime frais de santé salarié . convention collective . sport . cotisations . régime frais de santé . option: question: Quel option a été choisi pour le régime des frais de santé ? - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - R1 - - R2 - - R3 + une possibilité: + - R1 + - R2 + - R3 par défaut: "'R1'" références: unamens.fr: https://www.umanens.fr/reglementation-couverture-sante-obligatoire/ccn-sport diff --git "a/modele-social/r\303\250gles/salari\303\251/cotisations.publicodes" "b/modele-social/r\303\250gles/salari\303\251/cotisations.publicodes" index 0d4057160e..64104078dc 100644 --- "a/modele-social/r\303\250gles/salari\303\251/cotisations.publicodes" +++ "b/modele-social/r\303\250gles/salari\303\251/cotisations.publicodes" @@ -517,7 +517,7 @@ salarié . cotisations . CSG-CRDS . assiette de base: avec: assiette abattue: barème: - assiette: cotisations . assiette . sans prévoyance # - rémunération . revenus de remplacement + assiette: assiette avant abattement multiplicateur: temps de travail . plafond sécurité sociale # c'est en fait un abattement de 1,75% sur la partie en-dessous de 4 fois le plafond @@ -525,6 +525,8 @@ salarié . cotisations . CSG-CRDS . assiette de base: - taux: 98.25% plafond: 4 - taux: 100% + assiette avant abattement: + valeur: cotisations . assiette . sans prévoyance # - rémunération . revenus de remplacement salarié . cotisations . CSG-CRDS . assiette revenu remplacements: # TODO : déplacer dans une section "revenu de remplacement" diff --git "a/modele-social/r\303\250gles/salari\303\251/exon\303\251rations/lodeom.publicodes" "b/modele-social/r\303\250gles/salari\303\251/exon\303\251rations/lodeom.publicodes" index 162e4f87ca..ba8d4d80a7 100644 --- "a/modele-social/r\303\250gles/salari\303\251/exon\303\251rations/lodeom.publicodes" +++ "b/modele-social/r\303\250gles/salari\303\251/exon\303\251rations/lodeom.publicodes" @@ -1,11 +1,8 @@ salarié . cotisations . exonérations . zones lodeom: question: Quelle est votre localisation ? - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - zone un - - zone deux + une possibilité: + - zone un + - zone deux avec: zone un: valeur: zones lodeom = 'zone un' @@ -83,11 +80,9 @@ salarié . cotisations . exonérations . lodeom . zone un: barèmes: question: Quel barème envisagez-vous ? une possibilité: - choix obligatoire: oui - possibilités: - - compétitivité - - compétitivité renforcée - - innovation et croissance + - compétitivité + - compétitivité renforcée + - innovation et croissance avec: compétitivité: valeur: barèmes = 'compétitivité' @@ -307,11 +302,9 @@ salarié . cotisations . exonérations . lodeom . zone deux: barèmes: question: Quel barème souhaitez-vous appliquer ? une possibilité: - choix obligatoire: oui - possibilités: - - moins de 11 salariés - - sectoriel - - renforcé + - moins de 11 salariés + - sectoriel + - renforcé avec: moins de 11 salariés: valeur: barèmes = 'moins de 11 salariés' diff --git "a/modele-social/r\303\250gles/salari\303\251/salari\303\251.publicodes" "b/modele-social/r\303\250gles/salari\303\251/salari\303\251.publicodes" index 89f431d578..cde77bc949 100644 --- "a/modele-social/r\303\250gles/salari\303\251/salari\303\251.publicodes" +++ "b/modele-social/r\303\250gles/salari\303\251/salari\303\251.publicodes" @@ -11,18 +11,15 @@ salarié . convention collective: experimental: oui par défaut: "'droit commun'" question: "Quelle convention collective est applicable à l'entreprise ?" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - HCR - - BTP - - sport - - SVP - - compta - - optique - - autre - - droit commun + une possibilité: + - HCR + - BTP + - sport + - SVP + - compta + - optique + - autre + - droit commun avec: avertissement convention collective: @@ -252,16 +249,13 @@ salarié . régimes spécifiques . DFS . profession: question: Quelle est la profession du salarié pour l'application de la déduction forfaitaire spécifique ? - formule: - une possibilité: - possibilités: - - journaliste - - ouvrier du bâtiment - - artiste musicien - - artiste dramatique - - pilote de ligne ou personnel navigant - - voyageur, représentant et placier - choix obligatoire: oui + une possibilité: + - journaliste + - ouvrier du bâtiment + - artiste musicien + - artiste dramatique + - pilote de ligne ou personnel navigant + - voyageur, représentant et placier avec: artiste dramatique: @@ -339,15 +333,12 @@ salarié . régimes spécifiques . taux réduits . profession: question: Quelle est la profession du salarié pour l'application de taux de cotisations réduits ? - formule: - une possibilité: - possibilités: - - VRP multicarte - - journaliste - - profession médicale - - artiste du spectacle - - mannequin - choix obligatoire: oui + une possibilité: + - VRP multicarte + - journaliste + - profession médicale + - artiste du spectacle + - mannequin avec: VRP multicarte: @@ -518,7 +509,7 @@ salarié . régimes spécifiques . taxe sur les salaires: distribuent. barème: assiette: - valeur: cotisations . CSG-CRDS . assiette de base + valeur: assiette abattement: rémunération . net . imposable . exonération prime d'impatriation tranches: - taux: 4.25% @@ -547,6 +538,9 @@ salarié . régimes spécifiques . taxe sur les salaires: Taxe sur les salaires: https://www.service-public.fr/professionnels-entreprises/vosdroits/F22576 Exonérations spécifiques à la taxe sur les salaires: http://bofip.impots.gouv.fr/bofip/6691-PGP.html + avec: + assiette: cotisations . CSG-CRDS . assiette de base + salarié . coût total employeur: identifiant court: cout-total-employeur synonymes: [salaire chargé] diff --git a/site/mon-entreprise.fr/images/og/default.png b/site/mon-entreprise.fr/images/og/default.png new file mode 100644 index 0000000000..61f4c9dedc Binary files /dev/null and b/site/mon-entreprise.fr/images/og/default.png differ diff --git a/site/mon-entreprise.fr/images/og/simulateur-salarie-en.png b/site/mon-entreprise.fr/images/og/simulateur-salarie-en.png new file mode 100644 index 0000000000..82c7c5c4bc Binary files /dev/null and b/site/mon-entreprise.fr/images/og/simulateur-salarie-en.png differ diff --git a/site/mon-entreprise.fr/images/og/simulateur-salarie-fr.png b/site/mon-entreprise.fr/images/og/simulateur-salarie-fr.png new file mode 100644 index 0000000000..ef7949b1cf Binary files /dev/null and b/site/mon-entreprise.fr/images/og/simulateur-salarie-fr.png differ diff --git a/site/public/images/og/default.png b/site/public/images/og/default.png new file mode 100644 index 0000000000..61f4c9dedc Binary files /dev/null and b/site/public/images/og/default.png differ diff --git a/site/public/images/og/simulateur-salarie-en.png b/site/public/images/og/simulateur-salarie-en.png new file mode 100644 index 0000000000..82c7c5c4bc Binary files /dev/null and b/site/public/images/og/simulateur-salarie-en.png differ diff --git a/site/public/images/og/simulateur-salarie-fr.png b/site/public/images/og/simulateur-salarie-fr.png new file mode 100644 index 0000000000..ef7949b1cf Binary files /dev/null and b/site/public/images/og/simulateur-salarie-fr.png differ diff --git a/site/scripts/i18n/utils.js b/site/scripts/i18n/utils.js index 87b0e4df41..421869a1c4 100644 --- a/site/scripts/i18n/utils.js +++ b/site/scripts/i18n/utils.js @@ -198,9 +198,12 @@ export const fetchTranslation = async (text) => { 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ - text: text.replace(/{{/g, '').replace(/}}/g, ''), + text: text + .replace(/ > /g, ' > ') + .replace(/{{/g, '') + .replace(/}}/g, ''), tag_handling: 'xml', - ignore_tags: 'keep', + ignore_tags: 'var,quote', source_lang: 'FR', target_lang: 'EN', }), @@ -213,8 +216,9 @@ export const fetchTranslation = async (text) => { try { const { translations } = await response.json() const translation = translations[0].text - .replace(//g, '{{') - .replace(/<\/keep>/g, '}}') + .replace(//g, '{{') + .replace(/<\/var>/g, '}}') + .replace(/ > <\/quote>/g, ' > ') console.log( `✅ Deepl translation succeeded for:\n\t${text}\n\t${translation}\n` ) diff --git a/site/source/components/EngineValue/Condition.tsx b/site/source/components/EngineValue/Condition.tsx index 7389ebdbfd..531b53882c 100644 --- a/site/source/components/EngineValue/Condition.tsx +++ b/site/source/components/EngineValue/Condition.tsx @@ -1,16 +1,36 @@ import { useEngine } from '../utils/EngineContext' import { ConditionProps } from './types' +/** + * Utilisation : + * + * + * { children } + * + * Les enfants seront rendus si l'expression est vraie. + * Exemple : 0}> + * + * + * { children } + * + * Les enfants seront rendus si l'expression est fausse. + * Exemple : 0}> + * Cet exemple est équivalent à + * mais cette propriété est utile lorsque la condition d'affichage est du type + * "toujours sauf toutes ces conditions" qui se traduit en Publicodes par + * "toutes ces conditions" != oui + */ export function Condition({ expression, children, engine: engineFromProps, contexte = {}, + non = false, }: ConditionProps) { const defaultEngine = useEngine() const engine = engineFromProps ?? defaultEngine const nodeValue = engine.evaluate({ - '!=': [expression, 'non'], + '!=': [expression, non ? 'oui' : 'non'], contexte, }).nodeValue diff --git a/site/source/components/EngineValue/types.ts b/site/source/components/EngineValue/types.ts index 6c89779642..6219d39abb 100644 --- a/site/source/components/EngineValue/types.ts +++ b/site/source/components/EngineValue/types.ts @@ -20,4 +20,5 @@ export type ConditionProps = { children: React.ReactNode engine?: Engine contexte?: Contexte + non?: boolean } diff --git "a/site/source/components/R\303\251ductionDeCotisations/MonthOptions.tsx" "b/site/source/components/R\303\251ductionDeCotisations/MonthOptions.tsx" index 26932304ae..9d105bd566 100644 --- "a/site/source/components/R\303\251ductionDeCotisations/MonthOptions.tsx" +++ "b/site/source/components/R\303\251ductionDeCotisations/MonthOptions.tsx" @@ -14,9 +14,6 @@ import { QuantitéField, SmallBody, Strong, - StyledInput, - StyledInputContainer, - StyledSuffix, Ul, } from '@/design-system' import { euros } from '@/domaine/Montant' @@ -332,17 +329,12 @@ const StyledLabel = styled(SmallBody)` // - Créer un composant dédié dans le design-system // - Utiliser des sélecteurs CSS génériques const NumberFieldContainer = styled.div` - max-width: 120px; - ${StyledInputContainer} { - border-color: ${({ theme }) => theme.colors.bases.primary[800]}; - background-color: 'rgba(255, 255, 255, 10%)'; - &:focus-within { - outline-color: ${({ theme }) => theme.colors.bases.primary[700]}; - } - ${StyledInput}, ${StyledSuffix} { - color: ${({ theme }) => theme.colors.bases.primary[800]}!important; - } - } + max-width: 120px; + + /* ✅ Personnalisation sans dépendre des composants internes */ + --textfield-border-color: ${({ theme }) => theme.colors.bases.primary[800]}; + --textfield-text-color: ${({ theme }) => theme.colors.bases.primary[800]}; + --textfield-focus-outline-color: ${({ theme }) => theme.colors.bases.primary[700]}; ` const StyledSmallBody = styled(SmallBody)` font-weight: bold; diff --git a/site/source/components/conversation/getOnePossibilityOptions.tsx b/site/source/components/conversation/getOnePossibilityOptions.tsx index 07bdb9e72c..861fa3ad12 100644 --- a/site/source/components/conversation/getOnePossibilityOptions.tsx +++ b/site/source/components/conversation/getOnePossibilityOptions.tsx @@ -37,9 +37,13 @@ export const getOnePossibilityOptions = ( nodeKind: 'reference' })[] ) - .filter( - (explanation) => engine.evaluate(explanation).nodeValue !== null - ) + .filter((explanation) => { + return ( + engine.evaluate(explanation).nodeValue !== null && + engine.evaluate({ 'est applicable': explanation.dottedName }) + .nodeValue + ) + }) .map(({ dottedName }) => getOnePossibilityOptions(engine, dottedName as DottedName) ), diff --git "a/site/source/components/simulationExplanation/Ind\303\251pendantCotisationsForfaitaires.tsx" "b/site/source/components/simulationExplanation/Ind\303\251pendantCotisationsForfaitaires.tsx" index a75aedd120..77c603bb64 100644 --- "a/site/source/components/simulationExplanation/Ind\303\251pendantCotisationsForfaitaires.tsx" +++ "b/site/source/components/simulationExplanation/Ind\303\251pendantCotisationsForfaitaires.tsx" @@ -5,6 +5,8 @@ import { FromBottom } from '@/components/ui/animate' import { useEngine } from '@/components/utils/EngineContext' import { Button, H3, Intro, Markdown, Message, Spacing } from '@/design-system' +import { Condition } from '../EngineValue/Condition' + export default function CotisationsForfaitaires() { const rule = useEngine().getRule( 'dirigeant . indépendant . cotisations et contributions . début activité' @@ -14,12 +16,25 @@ export default function CotisationsForfaitaires() {

{rule.title}

- - - Montant des cotisations forfaitaires :{' '} - - - + {/* TODO: supprimer cette Condition quand + https://github.com/betagouv/mon-entreprise/issues/4035 + sera résolu */} + + + + Cotisations forfaitaires :{' '} + + + + {rule.rawNode.description ?? ''} {rule.rawNode.références && ( diff --git "a/site/source/components/simulationExplanation/Ind\303\251pendantExplanation.tsx" "b/site/source/components/simulationExplanation/Ind\303\251pendantExplanation.tsx" index 78adb1f486..08ad0072d8 100644 --- "a/site/source/components/simulationExplanation/Ind\303\251pendantExplanation.tsx" +++ "b/site/source/components/simulationExplanation/Ind\303\251pendantExplanation.tsx" @@ -10,8 +10,6 @@ import StackedBarChart from '@/components/StackedBarChart' import { H3 } from '@/design-system' import { Condition } from '../EngineValue/Condition' -import { WhenApplicable } from '../EngineValue/WhenApplicable' -import { WhenNotApplicable } from '../EngineValue/WhenNotApplicable' import CotisationsForfaitaires from './IndépendantCotisationsForfaitaires' import CotisationsRégularisation from './IndépendantCotisationsRégularisation' import InstitutionsPartenaires from './InstitutionsPartenaires' @@ -23,12 +21,15 @@ export default function IndépendantExplanation() { return ( <>
- + {/* TODO: remplacer Condition par When(Not)Applicable quand + https://github.com/betagouv/mon-entreprise/issues/4035 + sera résolu */} + - - + + - +
diff --git a/site/source/components/utils/Meta.tsx b/site/source/components/utils/Meta.tsx index 9e12855106..d9fc3528d6 100644 --- a/site/source/components/utils/Meta.tsx +++ b/site/source/components/utils/Meta.tsx @@ -23,6 +23,20 @@ export default function Meta({ ogImage, }: PropType) { const { t, i18n } = useTranslation() + const siteUrl = 'https://mon-entreprise.urssaf.fr' + const defaultImage = '/images/og/default.png' + + const relativeOgImage = + ogImage ?? + (i18n.language === 'fr' + ? defaultImage + : defaultImage) + + const absoluteOgImage = relativeOgImage.startsWith('http') + ? relativeOgImage + : `${siteUrl}${relativeOgImage}` + + return ( - + + + + + + + + ) } diff --git a/site/source/design-system/molecules/field/TextField.tsx b/site/source/design-system/molecules/field/TextField.tsx index 46ff30b9a7..9e8eed73b2 100644 --- a/site/source/design-system/molecules/field/TextField.tsx +++ b/site/source/design-system/molecules/field/TextField.tsx @@ -143,12 +143,11 @@ export const StyledInputContainer = styled.div<{ }>` border-radius: ${({ theme }) => theme.box.borderRadius}; border: ${({ theme }) => - `${theme.box.borderWidth} solid - ${ + `${theme.box.borderWidth} solid var(--textfield-border-color, ${ theme.darkMode ? theme.colors.extended.grey[100] : theme.colors.extended.grey[700] - }`}; + })`}; outline: transparent solid 1px; position: relative; display: flex; @@ -163,12 +162,15 @@ export const StyledInputContainer = styled.div<{ outline-color: ${({ theme, $hasError }) => $hasError ? theme.colors.extended.error[400] - : theme.darkMode - ? theme.colors.bases.primary[100] - : theme.colors.bases.primary[700]}; + : `var(--textfield-focus-outline-color, ${ + theme.darkMode + ? theme.colors.bases.primary[100] + : theme.colors.bases.primary[700] + })`}; outline-offset: ${({ theme }) => theme.spacings.xxs}; outline-width: ${({ theme }) => theme.spacings.xxs}; } + &:focus-within ${StyledLabel} { color: ${({ theme }) => theme.colors.bases.primary[800]}; background-color: transparent; @@ -225,9 +227,11 @@ export const StyledInputContainer = styled.div<{ theme.spacings.xs }) ${theme.spacings.sm} ${theme.spacings.xs}`}; color: ${({ theme }) => - theme.darkMode - ? theme.colors.extended.grey[100] - : theme.colors.extended.grey[800]}; + `var(--textfield-text-color, ${ + theme.darkMode + ? theme.colors.extended.grey[100] + : theme.colors.extended.grey[800] + })`}; } ${({ $small }) => @@ -238,4 +242,4 @@ export const StyledInputContainer = styled.div<{ line-height: 1.25rem; } `} -` +` \ No newline at end of file diff --git a/site/source/locales/rules-en.yaml b/site/source/locales/rules-en.yaml index 369ce2da0a..3d235773f3 100644 --- a/site/source/locales/rules-en.yaml +++ b/site/source/locales/rules-en.yaml @@ -2508,33 +2508,33 @@ dirigeant . indépendant . PL . PAMC . assiette participation CPAM: **income from conventional activity / (100% + average fee overrun)**. - > **Proof:** + > **Proof:** - > + > - > If we take the following variables, + > If we take the following variables, - > - `h+` : total fees (with overrun) + > - `h+` : total fees (with overrun) - > - `h`: fees without overrun + > - `h`: fees without overrun - > - `d%` : average percentage fee exceeded + > - `d%` : average percentage fee exceeded - > + > - > We have: `h+ = h + h * d% = h * (100% + d%)`. + > We have: `h+ = h + h * d% = h * (100% + d%)`. - > And: `total fees - total excess fees = fees without excess = h`. + > And: `total fees - total excess fees = fees without excess = h`. - > + > - > If we replace the CPAM participation base in the formula, we obtain : + > If we replace the CPAM participation base in the formula, we obtain : - 1. `income from conventional activity * h / h+` > 2. + > 1. `income from conventional activity * h / h+` - 2. `income from conventional activity * h / (h * (100% + d%))` > 3. + > 2. `income from conventional activity * h / (h * (100% + d%))` - > 3. `income from conventional activity / (100% + d%)` + > 3. `income from conventional activity / (100% + d%)` note.fr: > La formule donnée par l’Urssaf est la suivante : @@ -2606,9 +2606,9 @@ dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentist The formula for calculating the overrun rate is as follows: - > Urssaf rate = (overruns - amounts reimbursed CMU lump sums) / (amounts reimbursable > procedures + amounts reimbursed CMU lump sums). + > Urssaf rate = (overruns - reimbursed CMU lump-sum amounts) / (reimbursable - > reimbursable procedures + reimbursed CMU lump-sum amounts) + > procedures amounts + reimbursed CMU lump-sum amounts) description.fr: > Le « taux Urssaf » permet de calculer la part de votre cotisation d’assurance @@ -2655,6 +2655,10 @@ dirigeant . indépendant . PL . PAMC . maladie: titre.en: '[automatic] disease (after CPAM participation)' titre.fr: maladie (après participation CPAM) dirigeant . indépendant . PL . PAMC . maladie . contribution additionnelle: + avec: + taux: + titre.en: '[automatic] rate' + titre.fr: taux titre.en: '[automatic] supplementary contribution' titre.fr: contribution additionnelle dirigeant . indépendant . PL . PAMC . maladie . participation CPAM: @@ -3322,7 +3326,7 @@ dirigeant . indépendant . conjoint collaborateur: #### Advantages of the status of collaborating spouse - > This status of collaborating spouse is flexible, simple (few administrative formalities) and of low cost for the company for a complete social protection. It can be chosen even if the spouse has an activity outside the company. + > This status of collaborating spouse is flexible, simple (few administrative formalities) and of low cost for the company for a complete social protection. It can be chosen even if the spouse has an activity outside the company. description.fr: > En tant que collaborateur, le conjoint d'un indépendant verse des cotisations en matière de retraite et d'invalidité-décès et bénéficie en @@ -3625,18 +3629,18 @@ dirigeant . indépendant . cotisations et contributions . début activité: titre.en: '[automatic] sickness lump sum' titre.fr: assiette forfaitaire maladie description.en: > - [automatic] When you start your business, your **professional income** is - not known. + [automatic] When you start your business, as your professional income is not + known, your - contributions for the first two years are calculated on a **lump-sum basis**. + contributions** for the first two years are calculated on a **lump-sum basis**. - are calculated on a **lump-sum basis**. + calculated on a **lump-sum basis**. These contributions will be adjusted and regularized on the basis of your actual income - for the year in question. If your income is higher than the fixed base used to calculate + for the year in question. If your income exceeds the flat-rate base used to calculate taken into account for calculating provisional contributions, you will be @@ -3650,11 +3654,12 @@ dirigeant . indépendant . cotisations et contributions . début activité: and **plan your cash flow** accordingly. description.fr: > - Lorsque vous commencez votre activité, vos **revenus professionnels** + Lorsque vous commencez votre activité, vos revenus professionnels n’étant + pas - n’étant pas connus, **les cotisations et contributions des deux premières + connus, les **cotisations et contributions** des deux premières années sont - années sont calculées sur une **base forfaitaire**. + calculées sur une **base forfaitaire**. @@ -4782,7 +4787,7 @@ déclaration charge sociales . nature de l'activité . artisanale: and know-how. - > For example: works, activities related to building, repair of products supplied by the client, hairdressers... + > For example: works, activities related to building, repair of products supplied by the client, hairdressers... - The company must not employ more than 10 employees (the activity becomes commercial beyond that). @@ -5258,23 +5263,23 @@ déclaration revenus PAMC . dividendes: children. - > For information, dividends are subject to : + > For information, dividends are subject to : - > - social security contributions for the portion exceeding 10% of the share capital + > - social security contributions for the portion exceeding 10% of the share capital - > share capital contributed by the majority shareholder, share premiums and + > share capital contributed by the majority shareholder, share premiums and - > and contributions to shareholders' current accounts (average over the year). + > and contributions to shareholders' current accounts (average over the year). - > contributed by the manager); + > contributed by the manager); - > - social security contributions (17.2%) for the portion below 10% not subject to + > - social security contributions (17.2%) for the portion below 10% not subject to - > contributions; + > contributions; - > - income tax on all dividends (i.e. 12.8%, i.e. + > - income tax on all dividends (i.e. 12.8%, i.e. - > progressive scale after a 40% allowance under certain conditions). + > progressive scale after a 40% allowance under certain conditions). description.fr: > Indiquez la part des dividendes perçus supérieure à 10% du montant du capital @@ -5930,13 +5935,13 @@ entreprise . activité . nature: bodies (order, chamber or union). - > Examples of regulated professions: architect, lawyer, nurse, doctor... + > Examples of regulated professions: architect, lawyer, nurse, doctor... These are other people who practice a science or art, and whose intellectual activity plays the main role. Their income must represent remuneration for personal work, without any subordinate relationship, while engaging their technical and moral responsibility. - > Examples of non-regulated professions: developer, historian, urban planner... + > Examples of non-regulated professions: developer, historian, urban planner... description.fr: > Certaines professions libérales ont été classées dans le domaine libéral par la loi et leur titre est protégé. Leurs membres doivent respecter @@ -6112,13 +6117,13 @@ entreprise . activités: bodies (order, chamber or union). - > Examples of regulated professions: architect, lawyer, nurse, doctor... + > Examples of regulated professions: architect, lawyer, nurse, doctor... These are other people who practice a science or art, and whose intellectual activity plays the main role. Their income must represent remuneration for personal work, without any subordinate relationship, while engaging their technical and moral responsibility. - > Examples of non-regulated professions: developer, historian, urban planner... + > Examples of non-regulated professions: developer, historian, urban planner... description.fr: > Certaines professions libérales ont été classées dans le domaine libéral par la loi et leur titre est protégé. Leurs membres doivent respecter @@ -6295,10 +6300,10 @@ entreprise . activités . saisonnière: you contribute on your actual income. - You can request the application of this exemption from your space in urssaf: Messaging > New message > Another subject (information, documents or supporting documents) > Request information on my account or a summary > Make a request or an additional request " + You can request the application of this exemption from your space in urssaf: Messaging > New message > Another subject (information, documents or supporting documents) > Request information on my account or a summary > Make a request or an additional request " - > Please note: the minimum base for the basic pension guarantees the validation of 3 quarters of old-age insurance. + > Please note: the minimum base for the basic pension guarantees the validation of 3 quarters of old-age insurance. description.fr: > Les professionnels exerçant une activité saisonnière peuvent bénéficier @@ -6395,6 +6400,9 @@ entreprise . capital social: question.fr: Quele est le capital social de la société ? titre.en: '[automatic] Share capital' titre.fr: Capital social +entreprise . capital social . détenu au moins à 75 pourcents par des personnes physiques: + titre.en: '[automatic] at least 75 percent owned by individuals' + titre.fr: détenu au moins à 75 pourcents par des personnes physiques entreprise . catégorie juridique: note.en: '[automatic] We base ourselves here on the legal categories defined by INSEE' note.fr: On se base ici sur les catégories juridiques définies par l'INSEE @@ -6679,7 +6687,7 @@ entreprise . charges: expense with no fixed asset. - > Note**: social contributions to the self-employed workers' scheme and the deductible + > **Note**: social contributions to the self-employed workers' scheme and the deductible and the deductible portion of CSG are deductible from taxable income and income subject to @@ -6890,21 +6898,21 @@ entreprise . chiffre d'affaires . seuil micro . dépassé: duration of activity. - > ##### Example: + > ##### Example: - > A taxpayer sets up a business on August 1 and receives revenues of + > A taxpayer sets up a business on August 1 and receives revenues of - > 50,000 over the five months of the first calendar year. + > 50,000 over the five months of the first calendar year. - > of operations. + > of operations. - > Revenues for this first calendar year are adjusted *prorata temporis* to > compare them with the ceiling + > Revenues for this first calendar year are adjusted *prorata temporis* to - > to compare with the ceiling: + > compare them with the ceiling: - > + > - > `50 000€ x (365/153) = 119 280 €` + > `50 000€ x (365/153) = 119 280 €` @@ -7005,7 +7013,7 @@ entreprise . chiffre d'affaires . vente restauration hébergement: or accommodation - > Note: for furnished rentals, only classified furnished tourist accommodation and bed and breakfast are included in this category; other furnished rentals are included in the "BIC services" category. + > Note: for furnished rentals, only classified furnished tourist accommodation and bed and breakfast are included in this category; other furnished rentals are included in the "BIC services" category. This income is taxable in the BIC category. @@ -7193,8 +7201,10 @@ entreprise . date de cessation: description.fr: La date de cessation est la date à laquelle l’entreprise cessera son activité. - question.en: '[automatic] When do you plan to declare your cessation of activity?' - question.fr: À quelle date comptez-vous déclarer la cessation d’activité ? + question.en: + '[automatic] On what date have you or do you intend to declare the + cessation of activity?' + question.fr: À quelle date avez-vous ou comptez-vous déclarer la cessation d’activité ? titre.en: '[automatic] termination date' titre.fr: date de cessation entreprise . date de création: @@ -7273,10 +7283,10 @@ entreprise . exercice: date trop ancienne: description.en: '[automatic] The date entered is too old. The simulator does not - include scales prior to 2018.' + integrate scales before 2022.' description.fr: La date saisie est trop ancienne. Le simulateur n’intègre pas - les barèmes avant 2018. + les barèmes avant 2022. titre.en: '[automatic] date too old' titre.fr: date trop ancienne durée: @@ -7520,22 +7530,26 @@ entreprise . imposition . IS . information sur le report de déficit: (carry forward), or to the previous year only (carry back). back). + + + [See the fact sheet "Impôt sur les sociétés (IS) : report de déficit" on + + Entreprendre.Service-Public.fr](https://entreprendre.service-public.fr/vosdroits/F23628) description.fr: > Les déficits subits au cours d’un exercice peuvent être reportés sur les exercices suivants (report en avant), ou sur le seul exercice précédent (report en arrière). + + + [Voir la fiche « Impôt sur les sociétés (IS) : report de déficit » sur + + Entreprendre.Service-Public.fr](https://entreprendre.service-public.fr/vosdroits/F23628) titre.en: '[automatic] information on deficit carryover' titre.fr: information sur le report de déficit entreprise . imposition . IS . montant: avec: - plafond taux réduit 1: - titre.en: '[automatic] ceiling reduced rate 1' - titre.fr: plafond taux réduit 1 - plafond taux réduit 2: - titre.en: '[automatic] ceiling reduced rate 2' - titre.fr: plafond taux réduit 2 taux normal: titre.en: '[automatic] standard rate' titre.fr: taux normal @@ -7551,8 +7565,33 @@ entreprise . imposition . IS . prorata temporis: the ceilings used in the corporate income tax scale. description.fr: | - Lorsque la durée de l’exercice n’est pas égale à un an, on pro-ratise les + Lorsque la durée de l’exercice n’est pas égale à un an, on proratise les plafonds utilisés dans le barème de l’impôt sur les sociétés. + note.en: > + [automatic] Here, the number of days in the financial year is divided by 1 + year. In reality, we should divide the number of months in the financial + year by 12, and for incomplete months, divide the number of days by 30. + + + > **Example for a financial year running from January 1 to October 15:** + + > - theoretical prorata temporis = (9 full months + (15 days / 30)) / 12 = 79.17 + + > - calculated prorata temporis = 288 days / 365 = 78.90 + note.fr: > + Ici on rapporte le nombre de jours de l’exercice à 1 an. En réalité on + devrait + + rapporter le nombre de mois de l’exercice à 12 mois, et pour les mois + + incomplets, rapporter le nombre de jours à 30 jours. + + + > **Exemple pour un exercice du 1er janvier au 15 octobre :** + + > - prorata temporis théorique = (9 mois complets + (15 jours / 30)) / 12 = 79,17 % + + > - prorata temporis calculé = 288 jours / 365 = 78,90 % titre.en: '[automatic] prorata temporis' titre.fr: prorata temporis entreprise . imposition . IS . résultat imposable: @@ -7565,11 +7604,10 @@ entreprise . imposition . IS . résultat net: résumé.fr: Après déduction des charges et de l’impôt sur les société titre.en: '[automatic] net result' titre.fr: résultat net +entreprise . imposition . IS . total: + titre.en: '[automatic] total' + titre.fr: total entreprise . imposition . IS . éligible taux réduit: - avec: - capital détenu au moins à 75 pourcents par des personnes physiques: - titre.en: '[automatic] capital at least 75 percent owned by individuals' - titre.fr: capital détenu au moins à 75 pourcents par des personnes physiques titre.en: '[automatic] eligible for reduced rate' titre.fr: éligible taux réduit entreprise . imposition . régime: @@ -9048,21 +9086,21 @@ protection sociale . retraite . base: benefit from the **full rate**. - > **Detailed calculation:** 50% x average annual income x pension pro rata + > **Detailed calculation:** 50% x average annual income x pension pro rata - > + > - > With : + > With : - > - _average annual income_ = average of salaries and income contributed by + > - _average annual income_ = average of salaries and income contributed by - > self-employed during the 25 most advantageous years of your + > self-employed during the 25 most advantageous years of your - > career ; + > career ; - > - _prorata de pension_ = length of insurance with the Assurance retraite /q + > - _prorata de pension_ = length of insurance with the Assurance retraite /q - > insurance period to obtain a full pension. + > insurance period to obtain a full pension. description.fr: > Le montant de votre pension pour la retraite de base est calculé à partir de la @@ -9450,7 +9488,7 @@ protection sociale . retraite . complémentaire: supplementary pension contributions. - > This amount may vary between now and your retirement, depending on + > This amount may vary between now and your retirement, depending on point value. Nevertheless, it provides an order of magnitude @@ -9820,7 +9858,7 @@ salarié . activité partielle . indemnisation entreprise: The employer may receive partial activity allowance up to a maximum of 1,000 hours per year and per employee**. - > Warning**: in the event of fraud or false declaration, the employer is liable to 2 years' imprisonment and a €30,000 fine. + > Warning**: in the event of fraud or false declaration, the employer is liable to 2 years' imprisonment and a €30,000 fine. description.fr: >- Si l'employeur a obtenu l'autorisation administrative, il peut déposer une **demande d'indemnisation** qui lui permet d'obtenir le **remboursement @@ -10201,7 +10239,7 @@ salarié . contrat . CDD . motif: titre.fr: Accroissement temporaire d'activité mission: description.en: > - [automatic] > Also known as a defined purpose contract. + [automatic] > Also known as a defined purpose contract. Recruitment of engineers and managers, within the meaning of the collective agreements, with a view to achieving a defined objective when an extended branch agreement or, failing that, a company agreement so provides and defines : @@ -10385,17 +10423,34 @@ salarié . contrat . apprentissage . assiette réduite apprentissage: titre.fr: assiette réduite apprentissage salarié . contrat . apprentissage . assiette réduite apprentissage . CSG-CRDS: description.en: >- - [automatic] For contracts signed on or after March 1, 2025, apprentices are - exempt from CSG and CRDS up to 50% of the minimum wage. + [automatic] For contracts signed **since March 1, 2025**, apprentices are + exempt from CSG and CRDS up to **50% of Smic**. + + If the apprentice's gross remuneration is less than 50% of the minimum wage, the employer's share of the health insurance fund (which forms part of the CSG-CRDS base) is also exempt from CSG and CRDS. - For contracts signed before, this exemption is total. + For contracts signed **before March 1, 2025**, this exemption is total. description.fr: >- - Pour les contrats conclus depuis le 1er mars 2025, les apprentis bénéficient - d’une exonération de CSG et de CRDS jusqu’à 50% du Smic. + Pour les contrats conclus **depuis le 1er mars 2025**, les apprentis + bénéficient d’une exonération de CSG et de CRDS jusqu’à **50 % du Smic**. - Pour les contrats conclus avant, cette exonération est totale. + Si la rémunération brute de l’apprenti est inférieure à 50 % du Smic, alors la part employeur de la mutuelle (qui fait partie de l’assiette de la CSG-CRDS) est également exonérée de CSG et de CRDS. + + Pour les contrats conclus **avant le 1er mars 2025**, cette exonération est totale. titre.en: '[automatic] CSG-CRDS' titre.fr: CSG-CRDS +salarié . contrat . apprentissage . assiette réduite apprentissage . taxe sur les salaires: + description.en: > + [automatic] The portion of an apprentice's salary corresponding to 11% of + the minimum wage is not subject to payroll tax. + + payroll tax. + description.fr: > + La part du salaire des apprentis correspondant à 11 % du Smic n’est pas + soumise + + à la taxe sur les salaires. + titre.en: '[automatic] payroll tax' + titre.fr: taxe sur les salaires salarié . contrat . apprentissage . diplôme: titre.en: '[automatic] Diploma prepared' titre.fr: Diplôme préparé @@ -10439,6 +10494,17 @@ salarié . contrat . apprentissage . diplôme préparé: question.fr: Quel type de diplôme l'apprenti prépare-t-il ? titre.en: '[automatic] prepared diploma' titre.fr: diplôme préparé +salarié . contrat . apprentissage . exonération taxe sur les salaires: + description.en: > + [automatic] Companies with 10 or fewer employees are exempt from payroll tax + on + + apprentices. + description.fr: | + Les entreprises de 10 salariés ou moins sont exonérées de la taxe sur les + salaires de ses apprentis. + titre.en: '[automatic] payroll tax exemption' + titre.fr: exonération taxe sur les salaires salarié . contrat . date d'embauche: question.en: "[automatic] What is the employee's date of hire?" question.fr: Quelle est la date d'embauche du salarié ? @@ -11256,6 +11322,9 @@ salarié . cotisations . CSG-CRDS . assiette de base: assiette abattue: titre.en: '[automatic] ' titre.fr: assiette abattue + assiette avant abattement: + titre.en: '[automatic] base before allowance' + titre.fr: assiette avant abattement titre.en: '[automatic] base plate' titre.fr: assiette de base salarié . cotisations . CSG-CRDS . assiette heures supplémentaires et complémentaires défiscalisées: @@ -12654,7 +12723,7 @@ salarié . cotisations . formation professionnelle: collective agreements. - > For example, for the Syntec collective agreement, a supplement of 0.025% is mandatory. + > For example, for the Syntec collective agreement, a supplement of 0.025% is mandatory. The rate is increased to 1.3% for temporary work companies. In addition, if the threshold of 10 employees is crossed, specific rates apply in order to limit the increase of the contribution to professional training: @@ -12987,7 +13056,7 @@ salarié . coût total employeur: [automatic] The total cost of hiring an employee, including deferred assistance in addition to the remuneration components. - > It is therefore also a measure of the value that the employee brings to the company: the employer is willing to pay this amount in return for the work provided. + > It is therefore also a measure of the value that the employee brings to the company: the employer is willing to pay this amount in return for the work provided. To this total cost, you must not forget to add the expenses specific to your company: finding the right candidate, workstation, equipment, initial training, occupational medicine, etc. @@ -13732,6 +13801,10 @@ salarié . régimes spécifiques . taux réduits . réduction de taux: titre.en: '[automatic] rate reduction' titre.fr: réduction de taux salarié . régimes spécifiques . taxe sur les salaires: + avec: + assiette: + titre.en: '[automatic] plate' + titre.fr: assiette description.en: '[automatic] The payroll tax in France is a progressive tax created in 1948 that some employers must pay on the salaries they distribute.' @@ -14241,9 +14314,9 @@ salarié . rémunération . frais professionnels: - the employer provides free transport for the employee. - > Good to know + > Good to know - > No proof of fuel costs is required when the employer's contribution does not exceed €200 for fuel costs, or €500 for fuel costs for electric, plug-in hybrid or hydrogen vehicles. + > No proof of fuel costs is required when the employer's contribution does not exceed €200 for fuel costs, or €500 for fuel costs for electric, plug-in hybrid or hydrogen vehicles. description.fr: > Une prise en charge par l’employeur, sous forme de « prime de transport », des frais de carburant et d’alimentation des diff --git a/site/source/locales/ui-en.yaml b/site/source/locales/ui-en.yaml index d84fc62509..87a6257c9f 100644 --- a/site/source/locales/ui-en.yaml +++ b/site/source/locales/ui-en.yaml @@ -1776,7 +1776,7 @@ pages: included in the simulator. title: Corporate tax simulator indépendant: - cotisations-forfaitaires: "Flat-rate contributions: " + cotisations-forfaitaires: "Flat-rate contributions : " meta: description: Calculating net income after tax and contributions from sales and vice versa diff --git a/site/source/locales/ui-fr.yaml b/site/source/locales/ui-fr.yaml index a968a97f57..76c3948095 100644 --- a/site/source/locales/ui-fr.yaml +++ b/site/source/locales/ui-fr.yaml @@ -1885,7 +1885,7 @@ pages: pas intégrés dans le simulateur. title: Simulateur d’impôt sur les sociétés indépendant: - cotisations-forfaitaires: "Montant des cotisations forfaitaires : " + cotisations-forfaitaires: "Cotisations forfaitaires : " meta: description: Calcul du revenu net après impôt et des cotisations à partir du chiffre d'affaires et inversement diff --git a/site/source/pages/simulateurs/impot-societe/index.tsx b/site/source/pages/simulateurs/impot-societe/index.tsx index 58ca5a210f..bb5396b979 100644 --- a/site/source/pages/simulateurs/impot-societe/index.tsx +++ b/site/source/pages/simulateurs/impot-societe/index.tsx @@ -139,7 +139,7 @@ function Explanations() { diff --git a/site/source/pages/simulateurs/impot-societe/simulationConfig.ts b/site/source/pages/simulateurs/impot-societe/simulationConfig.ts index 45311f60f9..436aee2596 100644 --- a/site/source/pages/simulateurs/impot-societe/simulationConfig.ts +++ b/site/source/pages/simulateurs/impot-societe/simulationConfig.ts @@ -6,7 +6,6 @@ const ISSimulationConfig: SimulationConfig = { salarié: 'non', 'entreprise . catégorie juridique': "''", 'entreprise . imposition': "'IS'", - 'entreprise . imposition . IS . éligible taux réduit': 'oui', 'entreprise . TVA . franchise de TVA': 'non', }, } diff --git a/site/test/modele-social/entreprise/imposition.test.ts b/site/test/modele-social/entreprise/imposition.test.ts new file mode 100644 index 0000000000..908a4292d4 --- /dev/null +++ b/site/test/modele-social/entreprise/imposition.test.ts @@ -0,0 +1,113 @@ +import rules, { DottedName } from 'modele-social' +import Engine from 'publicodes' +import { beforeEach, describe, expect, it } from 'vitest' + +import ISSimulationConfig from '@/pages/simulateurs/impot-societe/simulationConfig' + +const situationParDéfaut = { + ...ISSimulationConfig.situation, + 'entreprise . charges': '10 k€/an', + 'dirigeant . rémunération . totale': 0, +} + +describe('entreprise . imposition', () => { + let engine: Engine + beforeEach(() => { + engine = new Engine(rules) + }) + + describe('IS', () => { + it('calcule un impôt sur les sociétés nul en cas de déficit', () => { + const e = engine.setSituation({ + ...situationParDéfaut, + "entreprise . chiffre d'affaires": '8 k€/an', + }) + + expect(e).toEvaluate( + 'entreprise . imposition . IS . résultat imposable', + -2000 + ) + expect(e).toEvaluate('entreprise . imposition . IS . montant', 0) + expect(e).not.toBeApplicable( + 'entreprise . imposition . IS . contribution sociale' + ) + expect(e).toEvaluate('entreprise . imposition . IS . total', 0) + }) + + it('calcule un impôt sur les sociétés pour un résultat imposable inférieur au plafond de taux réduit', () => { + const e = engine.setSituation({ + ...situationParDéfaut, + "entreprise . chiffre d'affaires": '52.5 k€/an', + }) + + expect(e).toEvaluate( + 'entreprise . imposition . IS . résultat imposable', + 42500 + ) + expect(e).toEvaluate('entreprise . imposition . IS . montant', 6375) + expect(e).not.toBeApplicable( + 'entreprise . imposition . IS . contribution sociale' + ) + expect(e).toEvaluate('entreprise . imposition . IS . total', 6375) + }) + + it('calcule un impôt sur les sociétés pour un résultat imposable supérieur au plafond de taux réduit pour une entreprise exonérée de contribution sociale', () => { + const e = engine.setSituation({ + ...situationParDéfaut, + "entreprise . chiffre d'affaires": '110 k€/an', + }) + + expect(e).toEvaluate( + 'entreprise . imposition . IS . résultat imposable', + 100000 + ) + expect(e).toEvaluate('entreprise . imposition . IS . montant', 20750) + expect(e).not.toBeApplicable( + 'entreprise . imposition . IS . contribution sociale' + ) + expect(e).toEvaluate('entreprise . imposition . IS . total', 20750) + }) + + it('calcule un impôt sur les sociétés pour un résultat imposable supérieur au plafond de taux réduit pour une entreprise soumise à la contribution sociale et éligible au taux réduit', () => { + const e = engine.setSituation({ + ...situationParDéfaut, + "entreprise . chiffre d'affaires": '9010 k€/an', + }) + + expect(e).toEvaluate( + 'entreprise . imposition . IS . résultat imposable', + 9000000 + ) + expect(e).toEvaluate('entreprise . imposition . IS . montant', 2245750) + expect(e).toBeApplicable( + 'entreprise . imposition . IS . contribution sociale' + ) + expect(e).toEvaluate( + 'entreprise . imposition . IS . contribution sociale', + 48931 + ) + expect(e).toEvaluate('entreprise . imposition . IS . total', 2294681) + }) + + it('calcule un impôt sur les sociétés pour un résultat imposable supérieur au plafond de taux réduit pour une entreprise soumise à la contribution sociale et non éligible au taux réduit', () => { + const e = engine.setSituation({ + ...situationParDéfaut, + "entreprise . chiffre d'affaires": '10010 k€/an', + }) + + expect(e).toEvaluate( + 'entreprise . imposition . IS . résultat imposable', + 10000000 + ) + expect(e).toEvaluate('entreprise . imposition . IS . montant', 2500000) + expect(e).toBeApplicable( + 'entreprise . imposition . IS . contribution sociale' + ) + expect(e).toEvaluate( + 'entreprise . imposition . IS . contribution sociale', + 57321 + ) + expect(e).toEvaluate('entreprise . imposition . IS . total', 2557321) + }) + }) +}) diff --git "a/site/test/regressions/__snapshots__/imp\303\264t-soci\303\251t\303\251.test.ts.snap" "b/site/test/regressions/__snapshots__/imp\303\264t-soci\303\251t\303\251.test.ts.snap" index 2035482ebc..764058aa53 100644 --- "a/site/test/regressions/__snapshots__/imp\303\264t-soci\303\251t\303\251.test.ts.snap" +++ "b/site/test/regressions/__snapshots__/imp\303\264t-soci\303\251t\303\251.test.ts.snap" @@ -1,53 +1,53 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`calculate simulations-impot-société > bénéfices 1`] = ` -"entreprise . imposition . IS . contribution sociale: 0 +"entreprise . imposition . IS . contribution sociale: null entreprise . imposition . IS . montant: 0 Notifications affichées : entreprise . imposition . IS . information sur le report de déficit" `; exports[`calculate simulations-impot-société > bénéfices 2`] = ` -"entreprise . imposition . IS . contribution sociale: 0 +"entreprise . imposition . IS . contribution sociale: null entreprise . imposition . IS . montant: 0" `; exports[`calculate simulations-impot-société > bénéfices 3`] = ` -"entreprise . imposition . IS . contribution sociale: 0 +"entreprise . imposition . IS . contribution sociale: null entreprise . imposition . IS . montant: 300" `; exports[`calculate simulations-impot-société > bénéfices 4`] = ` -"entreprise . imposition . IS . contribution sociale: 0 +"entreprise . imposition . IS . contribution sociale: null entreprise . imposition . IS . montant: 3000" `; exports[`calculate simulations-impot-société > bénéfices 5`] = ` -"entreprise . imposition . IS . contribution sociale: 0 -entreprise . imposition . IS . montant: 45762" +"entreprise . imposition . IS . contribution sociale: null +entreprise . imposition . IS . montant: 45750" `; exports[`calculate simulations-impot-société > bénéfices 6`] = ` -"entreprise . imposition . IS . contribution sociale: 0 -entreprise . imposition . IS . montant: 495762" +"entreprise . imposition . IS . contribution sociale: null +entreprise . imposition . IS . montant: 495750" `; exports[`calculate simulations-impot-société > bénéfices 7`] = ` -"entreprise . imposition . IS . contribution sociale: 139750 -entreprise . imposition . IS . montant: 4995762" +"entreprise . imposition . IS . contribution sociale: 139821 +entreprise . imposition . IS . montant: 5000000" `; exports[`calculate simulations-impot-société > prorata temporis 1`] = ` -"entreprise . imposition . IS . contribution sociale: 0 -entreprise . imposition . IS . montant: 245762" +"entreprise . imposition . IS . contribution sociale: null +entreprise . imposition . IS . montant: 245750" `; exports[`calculate simulations-impot-société > prorata temporis 2`] = ` -"entreprise . imposition . IS . contribution sociale: 0 -entreprise . imposition . IS . montant: 277936" +"entreprise . imposition . IS . contribution sociale: null +entreprise . imposition . IS . montant: 248218" `; exports[`calculate simulations-impot-société > prorata temporis 3`] = ` -"entreprise . imposition . IS . contribution sociale: 0 -entreprise . imposition . IS . montant: 272981" +"entreprise . imposition . IS . contribution sociale: null +entreprise . imposition . IS . montant: 243968" `; diff --git "a/site/test/regressions/__snapshots__/ind\303\251pendant.test.ts.snap" "b/site/test/regressions/__snapshots__/ind\303\251pendant.test.ts.snap" index da9307b964..7371696563 100644 --- "a/site/test/regressions/__snapshots__/ind\303\251pendant.test.ts.snap" +++ "b/site/test/regressions/__snapshots__/ind\303\251pendant.test.ts.snap" @@ -124,6 +124,18 @@ impôt . montant: 592" exports[`calculate simulations-indépendant > années précédentes 1`] = ` "dirigeant . indépendant . cotisations et contributions . début activité: null +dirigeant . indépendant . revenu professionnel: 62367 +dirigeant . rémunération . cotisations: 27280 +dirigeant . rémunération . net: 60000 +dirigeant . rémunération . net . après impôt: 48004 +dirigeant . rémunération . totale: 87280 +entreprise . charges: 0 +entreprise . chiffre d'affaires: 87280 +impôt . montant: 11996" +`; + +exports[`calculate simulations-indépendant > années précédentes 2`] = ` +"dirigeant . indépendant . cotisations et contributions . début activité: null dirigeant . indépendant . revenu professionnel: 51974 dirigeant . rémunération . cotisations: 22810 dirigeant . rémunération . net: 50000 @@ -134,7 +146,7 @@ entreprise . chiffre d'affaires: 72810 impôt . montant: 9186" `; -exports[`calculate simulations-indépendant > années précédentes 2`] = ` +exports[`calculate simulations-indépendant > années précédentes 3`] = ` "dirigeant . indépendant . cotisations et contributions . début activité: null dirigeant . indépendant . revenu professionnel: 41594 dirigeant . rémunération . cotisations: 18798 @@ -146,18 +158,6 @@ entreprise . chiffre d'affaires: 58798 impôt . montant: 6400" `; -exports[`calculate simulations-indépendant > années précédentes 3`] = ` -"dirigeant . indépendant . cotisations et contributions . début activité: 3548 -dirigeant . indépendant . revenu professionnel: 31191 -dirigeant . rémunération . cotisations: 13973 -dirigeant . rémunération . net: 30000 -dirigeant . rémunération . net . après impôt: 26637 -dirigeant . rémunération . totale: 43973 -entreprise . charges: 0 -entreprise . chiffre d'affaires: 43973 -impôt . montant: 3363" -`; - exports[`calculate simulations-indépendant > conjoint collaborateur 1`] = ` "dirigeant . indépendant . cotisations et contributions . début activité: null dirigeant . indépendant . revenu professionnel: 52104 diff --git "a/site/test/regressions/__snapshots__/professions-lib\303\251rales.test.ts.snap" "b/site/test/regressions/__snapshots__/professions-lib\303\251rales.test.ts.snap" index 8abfce02d5..a48fce17d9 100644 --- "a/site/test/regressions/__snapshots__/professions-lib\303\251rales.test.ts.snap" +++ "b/site/test/regressions/__snapshots__/professions-lib\303\251rales.test.ts.snap" @@ -100,6 +100,17 @@ protection sociale . retraite . trimestres: 4" `; exports[`calculate simulations-professions-libérales > CIPAV années précédentes 1`] = ` +"dirigeant . indépendant . cotisations et contributions: 26788 +dirigeant . rémunération . net: 60000 +dirigeant . rémunération . net . après impôt: 48008 +entreprise . chiffre d'affaires: 86788 +impôt . montant: 11992 +protection sociale . retraite . base: 340 +protection sociale . retraite . complémentaire: 390 +protection sociale . retraite . trimestres: 4" +`; + +exports[`calculate simulations-professions-libérales > CIPAV années précédentes 2`] = ` "dirigeant . indépendant . cotisations et contributions: 21074 dirigeant . rémunération . net: 50000 dirigeant . rémunération . net . après impôt: 40828 @@ -110,7 +121,7 @@ protection sociale . retraite . complémentaire: 291 protection sociale . retraite . trimestres: 4" `; -exports[`calculate simulations-professions-libérales > CIPAV années précédentes 2`] = ` +exports[`calculate simulations-professions-libérales > CIPAV années précédentes 3`] = ` "dirigeant . indépendant . cotisations et contributions: 15033 dirigeant . rémunération . net: 40000 dirigeant . rémunération . net . après impôt: 33630 @@ -121,17 +132,6 @@ protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; -exports[`calculate simulations-professions-libérales > CIPAV années précédentes 3`] = ` -"dirigeant . indépendant . cotisations et contributions: 11587 -dirigeant . rémunération . net: 30000 -dirigeant . rémunération . net . après impôt: 26656 -entreprise . chiffre d'affaires: 41587 -impôt . montant: 3344 -protection sociale . retraite . base: null -protection sociale . retraite . complémentaire: 0 -protection sociale . retraite . trimestres: 0" -`; - exports[`calculate simulations-professions-libérales > CIPAV conjoint collaborateur 1`] = ` "dirigeant . indépendant . cotisations et contributions: 31571 dirigeant . rémunération . net: 60000 @@ -452,11 +452,11 @@ protection sociale . retraite . trimestres: 4" `; exports[`calculate simulations-professions-libérales > médecin 4`] = ` -"dirigeant . indépendant . cotisations et contributions: 115354 -dirigeant . rémunération . net: 284646 -dirigeant . rémunération . net . après impôt: 173574 +"dirigeant . indépendant . cotisations et contributions: 108568 +dirigeant . rémunération . net: 291432 +dirigeant . rémunération . net . après impôt: 177102 entreprise . chiffre d'affaires: 400000 -impôt . montant: 111072 +impôt . montant: 114330 protection sociale . retraite . base: 360 protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" diff --git "a/site/test/regressions/__snapshots__/salari\303\251.test.ts.snap" "b/site/test/regressions/__snapshots__/salari\303\251.test.ts.snap" index 8be30d23c6..981ae24aa8 100644 --- "a/site/test/regressions/__snapshots__/salari\303\251.test.ts.snap" +++ "b/site/test/regressions/__snapshots__/salari\303\251.test.ts.snap" @@ -140,8 +140,8 @@ exports[`calculate simulations-salarié > apprentissage 1`] = ` "salarié . contrat . salaire brut: 1500 salarié . contrat . salaire brut . équivalent temps plein: null salarié . coût total employeur: 1132 -salarié . rémunération . net . payé après impôt: 1267 -salarié . rémunération . net . à payer avant impôt: 1267 +salarié . rémunération . net . payé après impôt: 1353 +salarié . rémunération . net . à payer avant impôt: 1353 Notifications affichées : salarié . rémunération . assiette de vérification du SMIC . contrôle" `; @@ -150,8 +150,8 @@ exports[`calculate simulations-salarié > apprentissage 2`] = ` "salarié . contrat . salaire brut: 2500 salarié . contrat . salaire brut . équivalent temps plein: null salarié . coût total employeur: 3162 -salarié . rémunération . net . payé après impôt: 2059 -salarié . rémunération . net . à payer avant impôt: 2059" +salarié . rémunération . net . payé après impôt: 2145 +salarié . rémunération . net . à payer avant impôt: 2145" `; exports[`calculate simulations-salarié > atmp 1`] = ` diff --git "a/site/test/regressions/imp\303\264t-soci\303\251t\303\251.yaml" "b/site/test/regressions/imp\303\264t-soci\303\251t\303\251.yaml" index 0b56e87e81..5b4a88ace9 100644 --- "a/site/test/regressions/imp\303\264t-soci\303\251t\303\251.yaml" +++ "b/site/test/regressions/imp\303\264t-soci\303\251t\303\251.yaml" @@ -5,13 +5,14 @@ bénéfices: - entreprise . résultat fiscal: 20000 €/an - entreprise . résultat fiscal: 200000 €/an - entreprise . résultat fiscal: 2000000 €/an - - entreprise . résultat fiscal: 20000000 €/an + - entreprise . chiffre d'affaires: 20000000 €/an + entreprise . résultat fiscal: 20000000 €/an prorata temporis: - entreprise . résultat fiscal: 1000000 €/an - entreprise . résultat fiscal: 1000000 €/an - entreprise . exercice . début: 01/01/2020 - entreprise . exercice . fin: 01/06/2020 + entreprise . exercice . début: 01/01/2024 + entreprise . exercice . fin: 01/06/2024 - entreprise . résultat fiscal: 1000000 €/an - entreprise . exercice . début: 01/01/2020 - entreprise . exercice . fin: 01/06/2021 + entreprise . exercice . début: 01/01/2024 + entreprise . exercice . fin: 01/06/2025 diff --git "a/site/test/regressions/ind\303\251pendant.yaml" "b/site/test/regressions/ind\303\251pendant.yaml" index 216f7149a0..972724a614 100644 --- "a/site/test/regressions/ind\303\251pendant.yaml" +++ "b/site/test/regressions/ind\303\251pendant.yaml" @@ -9,12 +9,12 @@ - dirigeant . rémunération . net: 1000000 €/an années précédentes: + - dirigeant . rémunération . net: 60000 €/an + date: 01/2024 - dirigeant . rémunération . net: 50000 €/an date: 01/2023 - dirigeant . rémunération . net: 40000 €/an date: 01/2022 - - dirigeant . rémunération . net: 30000 €/an - date: 01/2021 inversions: - dirigeant . rémunération . totale: 2000 €/an diff --git "a/site/test/regressions/professions-lib\303\251rales.yaml" "b/site/test/regressions/professions-lib\303\251rales.yaml" index 186e22637d..68dc2b8382 100644 --- "a/site/test/regressions/professions-lib\303\251rales.yaml" +++ "b/site/test/regressions/professions-lib\303\251rales.yaml" @@ -127,12 +127,12 @@ CIPAV ACRE: dirigeant . rémunération . net: 50000 €/an CIPAV années précédentes: + - dirigeant . rémunération . net: 60000 €/an + date: 01/2024 - dirigeant . rémunération . net: 50000 €/an date: 01/2023 - dirigeant . rémunération . net: 40000 €/an date: 01/2022 - - dirigeant . rémunération . net: 30000 €/an - date: 01/2021 CIPAV année incomplète: - &AnnéeIncomplete