Supprime l'utilisation du mécanisme synchronisation pour la commune de localisation

- Renomme `localisation` en `commune`
- Déplace la logique de `getNextStep` dans un hook `useMissingVariables`
pull/2305/head
Johan Girod 2022-09-23 14:45:48 +02:00
parent e9a61d0dc1
commit 860d7b4cf4
50 changed files with 517 additions and 362 deletions

11
.vscode/settings.json vendored
View File

@ -1,6 +1,13 @@
{
"spellright.language": ["fr", "en"],
"spellright.documentTypes": ["yaml", "git-commit", "markdown"],
"spellright.language": [
"fr",
"en"
],
"spellright.documentTypes": [
"yaml",
"git-commit",
"markdown"
],
"typescript.tsdk": "node_modules/typescript/lib",
"editor.tabSize": 2,
"cSpell.words": ["mycompanyinfrance", "smarttag"],

View File

@ -1 +1,7 @@
# Mon-entreprise API
Vous pouvez réutiliser les calculs de mon-entreprise sur votre site ou service très facilement grâce à notre API REST ouverte et sans authentification.
**[👉️ Voir la documentation sur mon-entreprise](https://mon-entreprise.urssaf.fr/d%C3%A9veloppeur/api)**
**[📊 Voir les statistiques dutilisation](https://mon-entreprise.urssaf.fr/stats?module=api-rest)**

View File

@ -30,7 +30,7 @@
"@apidevtools/swagger-cli": "^4.0.4",
"@koa/cors": "^3.3.0",
"@koa/router": "^10.1.1",
"@publicodes/api": "^1.0.0-beta.54",
"@publicodes/api": "^1.0.0-beta.55",
"@sentry/node": "^7.1.1",
"@sentry/tracing": "^7.1.1",
"got": "^12.4.1",
@ -40,7 +40,7 @@
"koa-static": "^5.0.0",
"modele-social": "workspace:^",
"nodemon": "^2.0.16",
"publicodes": "^1.0.0-beta.54",
"publicodes": "^1.0.0-beta.55",
"rate-limiter-flexible": "^2.3.8",
"swagger-ui-dist": "^4.11.1"
},

View File

@ -1,12 +1,12 @@
openapi: 3.0.0
openapi: 3.1.0
info:
title: Mon-entreprise API
version: beta
version: v1
description: |
Cet API expose les règles Publicodes de [mon-entreprise](https://mon-entreprise.urssaf.fr/).
Cet API expose les calculs des simulateurs de [mon-entreprise](https://mon-entreprise.urssaf.fr/).
Pour plus d'informations, consultez [notre documentation](/d%C3%A9veloppeur/api).
**[📒 Voir la documentation](https://mon-entreprise.urssaf.fr/d%C3%A9veloppeur/api)**
servers:
- url: /api/v1/
@ -18,7 +18,7 @@ paths:
content:
application/json:
examples:
SalaireBrutEnNet:
'Salaire brut en net':
value:
{
'situation':
@ -30,7 +30,7 @@ paths:
'expressions':
['salarié . rémunération . net . à payer avant impôt'],
}
MicroEntreprise:
'Auto-entrepreneur':
value:
{
situation:
@ -57,7 +57,7 @@ paths:
get:
parameters:
- examples:
SalaireNet:
'Salaire net':
value: 'salarié . rémunération . net . à payer avant impôt'
Impot:
value: 'impôt . méthode de calcul'

View File

@ -15,6 +15,7 @@ exports[`e2e test mon-entreprise api > Test evaluate brut => net + super brut 2`
"salarié . cotisations . prévoyances . santé . montant": 2320,
"salarié . cotisations . prévoyances . santé . taux employeur": 2320,
"salarié . régimes spécifiques . DFS": 1624,
"salarié . régimes spécifiques . alsace moselle": 352,
"salarié . rémunération . avantages en nature": 23027,
"salarié . rémunération . frais professionnels . titres-restaurant": 25347,
"salarié . rémunération . frais professionnels . trajets domicile travail . forfait mobilités durables . montant": 59450,
@ -24,7 +25,8 @@ exports[`e2e test mon-entreprise api > Test evaluate brut => net + super brut 2`
"salarié . rémunération . primes . fin d'année": 23026,
"salarié . temps de travail . heures supplémentaires": 46922,
"situation personnelle . domiciliation fiscale à l'étranger": 580,
"établissement . localisation": 880,
"établissement . commune . département": 2458,
"établissement . commune . département . outre-mer": 992,
},
"nodeValue": 2749.50805,
"traversedVariables": [
@ -154,8 +156,7 @@ exports[`e2e test mon-entreprise api > Test evaluate brut => net + super brut 2`
"salarié . cotisations . maladie . salarié",
"salarié . cotisations . maladie . salarié . taux",
"salarié . régimes spécifiques . alsace moselle",
"établissement . localisation . département",
"établissement . localisation",
"établissement . commune . département",
"salarié . cotisations . retraite complémentaire . salarié",
"salarié . cotisations . retraite complémentaire",
"salarié . cotisations . retraite complémentaire . employeur",
@ -178,6 +179,8 @@ exports[`e2e test mon-entreprise api > Test evaluate brut => net + super brut 2`
"salarié . cotisations . chômage . employeur . taux",
"salarié . cotisations . CSG-CRDS",
"salarié . cotisations . CSG-CRDS . CSG",
"établissement . commune . département . outre-mer . Mayotte",
"établissement . commune . département . outre-mer",
"salarié . cotisations . CSG-CRDS . CSG . déductible",
"salarié . cotisations . CSG-CRDS . CSG . déductible . taux",
"salarié . cotisations . CSG-CRDS . assiette de base",
@ -257,32 +260,34 @@ exports[`e2e test mon-entreprise api > Test evaluate brut => net + super brut 2`
},
{
"missingVariables": {
"dirigeant . gérant minoritaire": 814757,
"dirigeant . gérant minoritaire": 798729,
"entreprise . TVA": 5,
"entreprise . association non lucrative": 11,
"entreprise . catégorie juridique": 5865649,
"entreprise . catégorie juridique": 5750669,
"entreprise . salariés . effectif . seuil": 515,
"salarié . activité partielle": 24705,
"salarié . contrat": 197257,
"salarié . activité partielle": 24153,
"salarié . contrat": 193409,
"salarié . contrat . statut cadre": 811,
"salarié . contrat . temps de travail . temps partiel": 41573,
"salarié . convention collective": 49065,
"salarié . contrat . temps de travail . temps partiel": 40733,
"salarié . convention collective": 47961,
"salarié . cotisations . ATMP . taux fonctions support": 11,
"salarié . cotisations . exonérations . JEI": 611,
"salarié . cotisations . exonérations . lodeom": 111,
"salarié . cotisations . exonérations . JEI": 539,
"salarié . cotisations . exonérations . lodeom . zone un": 111,
"salarié . cotisations . prévoyances . santé . montant": 591,
"salarié . cotisations . prévoyances . santé . taux employeur": 591,
"salarié . coût total employeur . aides . emploi franc . éligible": 45,
"salarié . régimes spécifiques . DFS": 1051,
"salarié . rémunération . avantages en nature": 5121,
"salarié . rémunération . frais professionnels . titres-restaurant": 5537,
"salarié . rémunération . frais professionnels . trajets domicile travail . forfait mobilités durables . montant": 12537,
"salarié . rémunération . frais professionnels . trajets domicile travail . prime de transport . montant": 14201,
"salarié . rémunération . frais professionnels . trajets domicile travail . transports publics . montant": 36865,
"salarié . rémunération . primes . activité . base": 5121,
"salarié . rémunération . primes . fin d'année": 5121,
"salarié . temps de travail . heures supplémentaires": 7821,
"établissement . localisation": 631,
"salarié . régimes spécifiques . DFS": 1059,
"salarié . régimes spécifiques . alsace moselle": 27,
"salarié . rémunération . avantages en nature": 4953,
"salarié . rémunération . frais professionnels . titres-restaurant": 5369,
"salarié . rémunération . frais professionnels . trajets domicile travail . forfait mobilités durables . montant": 12273,
"salarié . rémunération . frais professionnels . trajets domicile travail . prime de transport . montant": 13937,
"salarié . rémunération . frais professionnels . trajets domicile travail . transports publics . montant": 36313,
"salarié . rémunération . primes . activité . base": 4953,
"salarié . rémunération . primes . fin d'année": 4953,
"salarié . temps de travail . heures supplémentaires": 7605,
"établissement . commune . département": 2023,
"établissement . commune . département . outre-mer": 967,
"établissement . taux ATMP": 11,
"établissement . taux ATMP . taux collectif": 7,
},
@ -441,8 +446,7 @@ exports[`e2e test mon-entreprise api > Test evaluate brut => net + super brut 2`
"entreprise . association non lucrative",
"salarié . cotisations . taxe d'apprentissage",
"salarié . régimes spécifiques . alsace moselle",
"établissement . localisation . département",
"établissement . localisation",
"établissement . commune . département",
"salarié . cotisations . CPF CDD",
"salarié . cotisations . forfait social",
"salarié . cotisations . exonérations . employeur",
@ -457,6 +461,8 @@ exports[`e2e test mon-entreprise api > Test evaluate brut => net + super brut 2`
"salarié . cotisations . maladie . employeur . taux réduit",
"salarié . temps de travail . SMIC",
"SMIC . horaire",
"établissement . commune . département . outre-mer . Mayotte",
"établissement . commune . département . outre-mer",
"date",
"salarié . cotisations . allocations familiales . taux",
"salarié . cotisations . allocations familiales . taux réduit",
@ -592,7 +598,8 @@ exports[`e2e test mon-entreprise api > Test evaluate micro entreprise 2`] = `
{
"missingVariables": {
"entreprise . activité . mixte": 278,
"établissement . localisation": 12,
"établissement . commune . département": 18,
"établissement . commune . département . outre-mer": 7,
},
"nodeValue": 1469,
"traversedVariables": [
@ -607,9 +614,10 @@ exports[`e2e test mon-entreprise api > Test evaluate micro entreprise 2`] = `
"impôt . méthode de calcul",
"impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique",
"impôt . taux neutre d'impôt sur le revenu . barème Guyane Mayotte",
"établissement . localisation . outre-mer . Guadeloupe Réunion Martinique",
"établissement . localisation . département",
"établissement . localisation",
"établissement . commune . département . outre-mer . Guadeloupe Réunion Martinique",
"établissement . commune . département . outre-mer",
"établissement . commune . département",
"établissement . commune . département . outre-mer . Mayotte",
"impôt . taux neutre d'impôt sur le revenu",
"date",
"impôt . revenu imposable",
@ -655,7 +663,8 @@ exports[`e2e test mon-entreprise api > Test evaluate micro entreprise 2`] = `
{
"missingVariables": {
"entreprise . activité . mixte": 344,
"établissement . localisation": 12,
"établissement . commune . département": 18,
"établissement . commune . département . outre-mer": 7,
},
"nodeValue": 31207,
"traversedVariables": [
@ -718,9 +727,10 @@ exports[`e2e test mon-entreprise api > Test evaluate micro entreprise 2`] = `
"impôt . méthode de calcul",
"impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique",
"impôt . taux neutre d'impôt sur le revenu . barème Guyane Mayotte",
"établissement . localisation . outre-mer . Guadeloupe Réunion Martinique",
"établissement . localisation . département",
"établissement . localisation",
"établissement . commune . département . outre-mer . Guadeloupe Réunion Martinique",
"établissement . commune . département . outre-mer",
"établissement . commune . département",
"établissement . commune . département . outre-mer . Mayotte",
"impôt . taux neutre d'impôt sur le revenu",
"impôt . revenu imposable",
"dirigeant . rémunération . net . imposable",
@ -744,6 +754,60 @@ exports[`e2e test mon-entreprise api > Test evaluate micro entreprise 2`] = `
{
"message": "
[ Avertissement ]
➡️ Dans la règle \\"déclaration charge sociales . nature de l'activité\\"
⚠️ Cette règle est tagguée comme experimentale.
Cela veut dire qu'elle peut être modifiée, renommée, ou supprimée sans qu'il n'y ait de changement de version majeure dans l'API.
",
},
{
"message": "
[ Avertissement ]
➡️ Dans la règle \\"déclaration charge sociales . nature de l'activité\\"
⚠️ Cette règle est tagguée comme experimentale.
Cela veut dire qu'elle peut être modifiée, renommée, ou supprimée sans qu'il n'y ait de changement de version majeure dans l'API.
",
},
{
"message": "
[ Avertissement ]
➡️ Dans la règle \\"déclaration charge sociales . nature de l'activité\\"
⚠️ Cette règle est tagguée comme experimentale.
Cela veut dire qu'elle peut être modifiée, renommée, ou supprimée sans qu'il n'y ait de changement de version majeure dans l'API.
",
},
{
"message": "
[ Avertissement ]
➡️ Dans la règle \\"déclaration charge sociales . nature de l'activité . libérale\\"
⚠️ Cette règle est tagguée comme experimentale.
Cela veut dire qu'elle peut être modifiée, renommée, ou supprimée sans qu'il n'y ait de changement de version majeure dans l'API.
",
},
{
"message": "
[ Avertissement ]
➡️ Dans la règle \\"déclaration charge sociales . nature de l'activité\\"
⚠️ Cette règle est tagguée comme experimentale.
Cela veut dire qu'elle peut être modifiée, renommée, ou supprimée sans qu'il n'y ait de changement de version majeure dans l'API.
",
},
{
"message": "
[ Avertissement ]
➡️ Dans la règle \\"déclaration charge sociales . nature de l'activité\\"
⚠️ Cette règle est tagguée comme experimentale.
Cela veut dire qu'elle peut être modifiée, renommée, ou supprimée sans qu'il n'y ait de changement de version majeure dans l'API.
",
},
{
"message": "
[ Avertissement ]
➡️ Dans la règle \\"impôt . méthode de calcul\\"
⚠️ Cette règle est tagguée comme experimentale.
@ -987,14 +1051,14 @@ exports[`e2e test mon-entreprise api > Test openapi.json endpoint 2`] = `
},
},
"info": {
"description": "Cet API expose les règles Publicodes de [mon-entreprise](https://mon-entreprise.urssaf.fr/).
"description": "Cet API expose les calculs des simulateurs de [mon-entreprise](https://mon-entreprise.urssaf.fr/).
Pour plus d'informations, consultez [notre documentation](/d%C3%A9veloppeur/api).
**[📒 Voir la documentation](https://mon-entreprise.urssaf.fr/d%C3%A9veloppeur/api)**
",
"title": "Mon-entreprise API",
"version": "beta",
"version": "v1",
},
"openapi": "3.0.0",
"openapi": "3.1.0",
"paths": {
"/evaluate": {
"post": {
@ -1003,7 +1067,7 @@ Pour plus d'informations, consultez [notre documentation](/d%C3%A9veloppeur/api)
"content": {
"application/json": {
"examples": {
"MicroEntreprise": {
"Auto-entrepreneur": {
"value": {
"expressions": [
{
@ -1024,7 +1088,7 @@ Pour plus d'informations, consultez [notre documentation](/d%C3%A9veloppeur/api)
},
},
},
"SalaireBrutEnNet": {
"Salaire brut en net": {
"value": {
"expressions": [
"salarié . rémunération . net . à payer avant impôt",
@ -1115,7 +1179,7 @@ Pour plus d'informations, consultez [notre documentation](/d%C3%A9veloppeur/api)
"Impot": {
"value": "impôt . méthode de calcul",
},
"SalaireNet": {
"Salaire net": {
"value": "salarié . rémunération . net . à payer avant impôt",
},
},

View File

@ -19,10 +19,10 @@
"devDependencies": {
"js-yaml": "^4.1.0",
"onchange": "^7.1.0",
"publicodes": "=1.0.0-beta.54"
"publicodes": "=1.0.0-beta.55"
},
"peerDependencies": {
"publicodes": "^1.0.0-beta.54"
"publicodes": "^1.0.0-beta.55"
},
"scripts": {
"build": "node ../scripts/build-rules.js",

View File

@ -1,3 +1,10 @@
## 1.0.0-beta.2
- Réecrit les règles de la cotisation AT/MP
- Supprime le recours au mécanisme synchronisation pour la localisation de létablissement
- Ajoute le tag experimental à de nouvelles règles
## 1.0.0-beta.1
- Passage du paquet en semver (voir le README)
@ -6,26 +13,26 @@
Les changements suivants sont cassants :
- renomme l'espace de nom `contrat salarié` en `salarié`
- renomme lespace de nom `contrat salarié` en `salarié`
- réécrit les règles liées au remboursement des frais domicile/travail
- réécrit les règles liées aux CDD
- déplace les éléments relatif au contrat dans `salarié . contrat`. Il s'agit de `temps partiel`, `salaire brut` ou encore le `statut cadre`
- déplace les éléments relatif au contrat dans `salarié . contrat`. Il sagit de `temps partiel`, `salaire brut` ou encore le `statut cadre`
- tous les éléments relatifs à la rémunération sont déplacés dans `salarié . rémunération`
- `salarié . régimes spécifiques` : les règles liées aux régimes spéciaux (DFS, cadre, impatriés, etc)
- `plafond sécurité sociale temps plein` devient `plafond sécurité sociale`
- toutes les cotisations sont déplacées dans l'espace de nom `salarié . cotisations`, et utilisent les acronymes comme nom tant que possible.
- toutes les cotisations sont déplacées dans lespace de nom `salarié . cotisations`, et utilisent les acronymes comme nom tant que possible.
**Corrections de bugs**
- Ajoute la limite de déduction sur la part employeur des prévoyances
- Enlève la CSA de l'exonération JEI
- Enlève la CSA de lexonération JEI
- Réecrit les règles de déductions des frais de transport domicile / travail pour coller à la réglementation
- Réecrit les règles sur le CDD pour une meilleure expérience question par question
- Précise le calcul de l'assiette de la CSG
- Précise le calcul de lassiette de la CSG
- Corrige le calcul de la rémunération brut avec prévoyance
**Note sur l'upgrade**
Pour les utilisateur des version précédente, la mise à jour risque d'être longue et fastidieuse. Nous nous en excusons. Le but de cette refacto est de prévenir les changement cassants au maximum à l'avenir.
**Note sur lupgrade**
Pour les utilisateur des version précédente, la mise à jour risque dêtre longue et fastidieuse. Nous nous en excusons. Le but de cette refacto est de prévenir les changement cassants au maximum à lavenir.
Vous pouvez utiliser la fonction recherche de la documentation, et utiliser le nouveau menu de navigation des règles pour plus facilement trouver les nouvelles versions des règles utilisées.
@ -40,4 +47,4 @@ Ajout des déclarations de type dans le paquet
## 0.6.0
Publication du paquet sous forme d'ES modules.
Publication du paquet sous forme dES modules.

View File

@ -1,6 +1,6 @@
{
"name": "modele-social",
"version": "1.0.0-beta.1",
"version": "1.0.0-beta.2",
"description": "Les règles publicodes du système social français",
"type": "module",
"main": "./dist/index.js",
@ -21,10 +21,10 @@
"devDependencies": {
"js-yaml": "^4.1.0",
"onchange": "^7.1.0",
"publicodes": "^1.0.0-beta.54"
"publicodes": "^1.0.0-beta.55"
},
"peerDependencies": {
"publicodes": "^1.0.0-beta.54"
"publicodes": "^1.0.0-beta.55"
},
"scripts": {
"build": "node ../scripts/build-rules.js",

View File

@ -45,7 +45,7 @@ SMIC . net imposable:
SMIC . horaire:
titre global: SMIC horaire
variations:
- si: établissement . localisation . département = 'Mayotte'
- si: établissement . commune . département . outre-mer . Mayotte
alors:
variations:
- si: date >= 01/08/2022

View File

@ -1,4 +1,5 @@
déclaration charge sociales:
experimental: oui
description: >-
Ces règles calculent les montants des charges sociales à reporter dans la déclaration de revenu
des indépendants et dans les déclaration de résultats.

View File

@ -260,9 +260,10 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers .
par: 0.65%
- règle: taux vente
par: 0.29%
par défaut: non
une de ces conditions:
- établissement . localisation . département = 'Bas-Rhin'
- établissement . localisation . département = 'Haut-Rhin'
- établissement . commune . département = 'Bas-Rhin'
- établissement . commune . département = 'Haut-Rhin'
références:
service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32847
@ -272,7 +273,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers .
par: 0.83%
- règle: taux vente
par: 0.37%
valeur: établissement . localisation . département = 'Moselle'
par défaut: non
valeur: établissement . commune . département = 'Moselle'
références:
service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32847

View File

@ -189,7 +189,7 @@ entreprise . TVA . franchise de TVA: oui
entreprise . TVA . franchise de TVA . seuil vente:
variations:
- si: établissement . localisation . outre-mer . Guadeloupe Réunion Martinique
- si: établissement . commune . département . outre-mer . Guadeloupe Réunion Martinique
alors: 110000 €/an
- sinon: 94300 €/an
références:
@ -197,7 +197,7 @@ entreprise . TVA . franchise de TVA . seuil vente:
entreprise . TVA . franchise de TVA . seuil service:
variations:
- si: établissement . localisation . outre-mer . Guadeloupe Réunion Martinique
- si: établissement . commune . département . outre-mer . Guadeloupe Réunion Martinique
alors: 60000 €/an
- si: dirigeant . indépendant . PL . métier = 'avocat'
alors: 44500

View File

@ -4,75 +4,40 @@
type: texte
applicable si: entreprise . SIREN
établissement . localisation:
experimental: oui
icônes: 🌍
description: |
Lorsqu'une entreprise dispose de plusieurs établissements, certaines cotisations sont
calculées à l'échelle de l'établissement et sont fonction de règlementations locales.
établissement . commune:
icônes: 📍
question: Dans quelle commune l'établissement est-il implanté ?
API: commune
# TODO : transform to texte
par défaut:
objet:
code: 29019
nom: Non renseignée
departement:
nom: Non renseigné
taux du versement mobilité: 1.8
variations:
- si:
est défini: nom
alors:
texte: '{{ nom }} ({{ code postal }})'
- sinon: nom
avec:
code commune:
synchronisation:
data: localisation
chemin: code
commune:
description: |
Lorsqu'une entreprise dispose de plusieurs établissements, certaines cotisations sont
calculées à l'échelle de l'établissement et sont fonction de règlementations locales.
synchronisation:
data: localisation
chemin: nom
nom:
taux versement mobilité:
par défaut: 0
unité: '%'
code postal:
département:
synchronisation:
data: localisation
chemin: departement . nom
avec:
outre-mer:
par défaut: non
une de ces conditions:
- département = 'Guadeloupe'
- département = 'Martinique'
- département = 'Guyane'
- département = 'La Réunion'
- département . outre-mer . Mayotte
outre-mer:
applicable si:
une de ces conditions:
- département = 'Guadeloupe'
- département = 'Martinique'
- département = 'Guyane'
- département = 'La Réunion'
- département = 'Mayotte'
outre-mer . Guadeloupe Réunion Martinique:
une de ces conditions:
- département = 'Guadeloupe'
- département = 'Martinique'
- département = 'La Réunion'
établissement . versement mobilité:
experimental: oui
unité: '%'
par défaut: oui
synchronisation:
data: localisation
chemin: taux du versement mobilité
établissement . ZFU:
experimental: oui
applicable si: entreprise . date de création < 01/2015
question: Votre établissement bénéficie-t-il du dispositif zone franche urbaine (ZFU) ?
par défaut: non
établissement . ZFU . durée d'implantation en fin d'année:
formule:
durée:
depuis: entreprise . date de création
jusqu'à: 31/12/2019
avec:
Guadeloupe Réunion Martinique:
une de ces conditions:
- département = 'Guadeloupe'
- département = 'Martinique'
- département = 'La Réunion'
Mayotte: département = 'Mayotte'
établissement . taux ATMP:
description: |
@ -106,3 +71,15 @@
si: taux ATMP < salarié . cotisations . ATMP . taux minimum
niveau: avertissement
description: Le taux renseigné est inférieur au taux minimum légal
établissement . ZFU:
experimental: oui
applicable si: entreprise . date de création < 01/2015
question: Votre établissement bénéficie-t-il du dispositif zone franche urbaine (ZFU) ?
par défaut: non
établissement . ZFU . durée d'implantation en fin d'année:
formule:
durée:
depuis: entreprise . date de création
jusqu'à: 31/12/2019

View File

@ -97,7 +97,7 @@ impôt . revenu imposable . abattement contrat court:
impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique:
icônes: 🇬🇵🇷🇪 🇲🇶
applicable si: établissement . localisation . outre-mer . Guadeloupe Réunion Martinique
applicable si: établissement . commune . département . outre-mer . Guadeloupe Réunion Martinique
remplace: taux neutre d'impôt sur le revenu
grille:
assiette: revenu imposable
@ -189,9 +189,10 @@ impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martin
impôt . taux neutre d'impôt sur le revenu . barème Guyane Mayotte:
icônes: 🇬🇾 🇾🇹
applicable si:
par défaut: non
une de ces conditions:
- établissement . localisation . département = 'Guyane'
- établissement . localisation . département = 'Mayotte'
- établissement . commune . département = 'Guyane'
- établissement . commune . département = 'Mayotte'
remplace: taux neutre d'impôt sur le revenu
grille:
assiette: revenu imposable

View File

@ -29,7 +29,7 @@ salarié . rémunération . revenus de remplacement:
assiette: revenus de remplacement
taux:
variations:
- si: établissement . localisation . département = 'Mayotte'
- si: établissement . commune . département . outre-mer . Mayotte
alors: 2.35%
- si: régimes spécifiques . alsace moselle
alors: 1.5%

View File

@ -184,8 +184,8 @@ salarié . régimes spécifiques . intermittents du spectacle . artiste . réduc
par: cotisations . vieillesse . salarié . déplafonnée . taux * réduction de taux
- règle: cotisations . allocations familiales . taux
par: cotisations . allocations familiales . taux * réduction de taux
- règle: établissement . versement mobilité
par: établissement . versement mobilité * réduction de taux
- règle: cotisations . versement mobilité
par: cotisations . versement mobilité * réduction de taux
- règle: cotisations . FNAL . taux
par: cotisations . FNAL . taux * réduction de taux
formule: 70%

View File

@ -99,18 +99,18 @@ salarié . cotisations . exonérations . heures supplémentaires:
urssaf.fr: https://www.urssaf.fr/portail/home/employeur/beneficier-dune-exoneration/exonerations-generales/la-deduction-forfaitaire-patrona/employeurs-concernes.html
salarié . cotisations . exonérations . lodeom:
beta: oui
valeur: oui
experimental: oui
applicable si:
par défaut: non
nom: zone un
titre: Zone géographique 1 (Guadeloupe, Martinique, La Réunion, Guyane)
références:
fiche Urssaf: https://www.urssaf.fr/portail/home/outre-mer/employeur/exoneration-de-cotisations-di-1/employeurs-situes-en-guadeloupe.html
une de ces conditions:
- établissement . localisation . département = 'Guadeloupe'
- établissement . localisation . département = 'La Réunion'
- établissement . localisation . département = 'Martinique'
- établissement . localisation . département = 'Guyane'
- établissement . commune . département = 'Guadeloupe'
- établissement . commune . département = 'La Réunion'
- établissement . commune . département = 'Martinique'
- établissement . commune . département = 'Guyane'
# TODO : ajouter la zone 2
description: |
Un ensemble assez complexe de réductions de cotisation est disponible pour les salariés d'outre-mer.
@ -697,7 +697,7 @@ salarié . cotisations . CSG-CRDS . non déductible:
- revenus de remplacement . CRDS
salarié . cotisations . CSG-CRDS . CSG:
non applicable si: établissement . localisation . département = 'Mayotte'
non applicable si: établissement . commune . département . outre-mer . Mayotte
description: >-
La contribution sociale généralisée (CSG) est un impôt destiné à participer
au financement de la protection sociale.
@ -1092,7 +1092,7 @@ salarié . cotisations . taxe d'apprentissage:
valeur: cotisations . assiette
abattement:
variations:
- si: établissement . localisation . outre-mer
- si: établissement . commune . département . outre-mer
alors: 20% * temps de travail . SMIC
- sinon: 11% * temps de travail . SMIC
- sinon: cotisations . assiette
@ -1142,7 +1142,7 @@ salarié . cotisations . versement mobilité:
branche: transport
produit:
assiette: cotisations . assiette
taux: établissement . versement mobilité
taux: établissement . commune . taux versement mobilité
références:
Recherchez le taux de versement mobilité applicable dans votre ville: https://www.urssaf.fr/portail/home/taux-et-baremes/versement-mobilite.html

View File

@ -38,11 +38,11 @@ salarié . régimes spécifiques . alsace moselle:
Nous considérons qu'un salarié est affilié au régime Alsace-Moselle quand l'établissement dans lequel il travaille est situé dans ces départements.
Attention : c'est une **simplification** : l'affiliation est plus compliquée que celà, voir les conditions exactes [sur le site du régime](http://regime-local.fr/salaries/).
par défaut: non
une de ces conditions:
- établissement . localisation . département = 'Bas-Rhin'
- établissement . localisation . département = 'Haut-Rhin'
- établissement . localisation . département = 'Moselle'
- établissement . commune . département = 'Bas-Rhin'
- établissement . commune . département = 'Haut-Rhin'
- établissement . commune . département = 'Moselle'
salarié . régimes spécifiques . alsace moselle . ATMP:
avec:
@ -188,8 +188,8 @@ salarié . régimes spécifiques . DFS . profession . journaliste . réduction d
- règle: cotisations . allocations familiales . taux
par: cotisations . allocations familiales . taux * réduction de taux
- règle: établissement . versement mobilité
par: établissement . versement mobilité * réduction de taux
- règle: cotisations . versement mobilité
par: cotisations . versement mobilité * réduction de taux
- règle: cotisations . ATMP . taux
par: cotisations . ATMP . taux * réduction de taux
- règle: cotisations . ATMP . taux minimum

View File

@ -79,8 +79,8 @@
"isbot": "^3.5.0",
"markdown-to-jsx": "^7.1.7",
"modele-social": "workspace:^",
"publicodes": "^1.0.0-beta.54",
"publicodes-react": "^1.0.0-beta.54",
"publicodes": "^1.0.0-beta.55",
"publicodes-react": "^1.0.0-beta.55",
"react": "^17.0.0",
"react-colorful": "^5.5.1",
"react-dom": "^17.0.0",

View File

@ -1,6 +1,7 @@
import { SimulationConfig } from '@/reducers/rootReducer'
import { buildSituationFromObject } from '@/utils'
import { DottedName } from 'modele-social'
import Engine from 'publicodes'
import Engine, { PublicodesExpression } from 'publicodes'
import { CompanyActions } from './companyActions'
import { CompanyCreationAction } from './companyCreationChecklistActions'
import { CompanyStatusAction } from './companyStatusActions'
@ -110,3 +111,25 @@ export const updateShouldFocusField = (shouldFocusField: boolean) =>
type: 'UPDATE_SHOULD_FOCUS_FIELD',
shouldFocusField,
} as const)
export const answerQuestion = (
dottedName: DottedName,
value:
| PublicodesExpression
| undefined
| { batchUpdate: Record<string, PublicodesExpression> }
) => {
if (value && typeof value === 'object' && 'batchUpdate' in value) {
return batchUpdateSituation(
buildSituationFromObject(
dottedName,
value.batchUpdate as Record<string, PublicodesExpression>
)
)
}
return (value == null ? deleteFromSituation : updateSituation)(
dottedName,
value
)
}

View File

@ -14,13 +14,14 @@ export type ApiCommuneJson = {
}
export type SearchCommune = {
code: string
codePostal: string
'code commune': string
'code postal': string
nom: string
département: string
}
export type Commune = SearchCommune & {
'taux du versement mobilité': number
export type Commune = Omit<SearchCommune, 'code commune'> & {
'taux versement mobilité': number
}
export async function searchCommunes(
@ -42,8 +43,15 @@ export async function searchCommunes(
.flatMap(({ codesPostaux, ...commune }) =>
codesPostaux
.sort()
.map((codePostal) => ({ ...commune, codePostal }))
.filter(({ codePostal }) => codePostal.startsWith(number))
.map((codePostal) => ({
'code commune': commune.code,
nom: commune.nom,
'code postal': codePostal,
département: commune.departement.nom,
}))
.filter(({ 'code postal': codePostal }) =>
codePostal.startsWith(number)
)
)
.slice(0, 10)
}
@ -64,36 +72,38 @@ export async function fetchCommuneDetails(
'Le code postal et le code commune fournis sont incompatibles'
)
}
const commune: SearchCommune = { ...apiCommune, codePostal }
const taux = await tauxVersementTransport(commune)
const taux = await tauxVersementTransport(apiCommune.code, codePostal)
if (taux === null) {
return null
}
return {
...commune,
'taux du versement mobilité': taux,
'taux versement mobilité': taux,
nom: apiCommune.nom,
'code postal': codePostal,
département: apiCommune.departement.nom,
}
}
async function tauxVersementTransport(
commune: SearchCommune
codeCommune: string,
codePostal: string
): Promise<number | null> {
let codeCommune = commune.code
// 1. Si c'est une commune à arrondissement, on récupère le bon code correspondant à l'arrondissement.
// Comme il n'y a pas d'API facile pour faire ça, on le fait à la mano
// 1. a : PARIS
if (codeCommune === '75056') {
codeCommune = '751' + commune.codePostal.slice(-2)
codeCommune = '751' + codePostal.slice(-2)
}
// 1. b : LYON
if (codeCommune === '69123') {
codeCommune = '6938' + commune.codePostal.slice(-1)
codeCommune = '6938' + codePostal.slice(-1)
}
// 1. c : MARSEILLE
if (codeCommune === '13055') {
codeCommune = '132' + commune.codePostal.slice(-2)
codeCommune = '132' + codePostal.slice(-2)
}
// 2. On récupère le versement transport associé
const response = await fetch('/data/versement-mobilité.json')

View File

@ -1,18 +1,16 @@
import { batchUpdateSituation } from '@/actions/actions'
import ButtonHelp from '@/design-system/buttons/ButtonHelp'
import { Switch } from '@/design-system/switch'
import { situationSelector } from '@/selectors/simulationSelectors'
import { DottedName } from 'modele-social'
import { serializeEvaluation } from 'publicodes'
import { useCallback } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { situationSelector } from '@/selectors/simulationSelectors'
import styled from 'styled-components'
import { ExplicableRule } from './conversation/Explicable'
import { Condition } from './EngineValue'
import { SimulationGoal } from './Simulation'
import { useEngine } from './utils/EngineContext'
import { Markdown } from './utils/markdown'
import { Switch } from '@/design-system/switch'
import { ExplicableRule } from './conversation/Explicable'
const proportions = {
'entreprise . activité . mixte . proportions . service BIC':

View File

@ -41,7 +41,7 @@ export function CompanyDetails({
et domiciliée à{' '}
<Strong>
<Value
expression="établissement . localisation"
expression="établissement . commune"
linkToRule={false}
/>
</Strong>

View File

@ -1,4 +1,4 @@
import { resetSimulation, updateSituation } from '@/actions/actions'
import { answerQuestion, resetSimulation } from '@/actions/actions'
import { resetCompany } from '@/actions/companyActions'
import Emoji from '@/components/utils/Emoji'
import { EvaluatedRule, useEngine } from '@/components/utils/EngineContext'
@ -10,6 +10,8 @@ import { H2, H3 } from '@/design-system/typography/heading'
import { Link } from '@/design-system/typography/link'
import { Body } from '@/design-system/typography/paragraphs'
import { CurrentSimulatorDataContext } from '@/pages/Simulateurs/metadata'
import { utils } from 'publicodes'
import {
answeredQuestionsSelector,
companySituationSelector,
@ -196,17 +198,23 @@ function StepsTable({
function AnswerElement(rule: EvaluatedRule) {
const dispatch = useDispatch()
const dottedName = rule.dottedName
const handleChange = useCallback(
(value) => {
dispatch(updateSituation(dottedName, value))
},
[dispatch, dottedName]
)
const engine = useEngine()
return rule.rawNode.question ? (
const parentDottedName = utils.ruleParent(rule.dottedName) as DottedName
const questionDottedName = rule.rawNode.question
? rule.dottedName
: parentDottedName && engine.getRule(parentDottedName).rawNode.API
? parentDottedName
: undefined
const handleChange = useCallback(
(value) => {
questionDottedName && dispatch(answerQuestion(questionDottedName, value))
},
[dispatch, questionDottedName]
)
return questionDottedName ? (
<PopoverWithTrigger
small
trigger={(buttonProps) => (
@ -222,11 +230,11 @@ function AnswerElement(rule: EvaluatedRule) {
<>
<form onSubmit={onClose}>
<H3>
{evaluateQuestion(engine, engine.getRule(rule.dottedName))}
<ExplicableRule light dottedName={rule.dottedName} />
{evaluateQuestion(engine, engine.getRule(questionDottedName))}
<ExplicableRule light dottedName={questionDottedName} />
</H3>
<RuleInput
dottedName={rule.dottedName}
dottedName={questionDottedName}
onChange={handleChange}
autoFocus
showSuggestions={false}

View File

@ -1,9 +1,8 @@
import {
deleteFromSituation,
answerQuestion,
goToQuestion,
stepAction,
updateShouldFocusField,
updateSituation,
} from '@/actions/actions'
import RuleInput from '@/components/conversation/RuleInput'
import Notifications from '@/components/Notifications'
@ -19,6 +18,7 @@ import { CurrentSimulatorDataContext } from '@/pages/Simulateurs/metadata'
import {
answeredQuestionsSelector,
situationSelector,
useMissingVariables,
} from '@/selectors/simulationSelectors'
import { evaluateQuestion } from '@/utils'
import { PublicodesExpression } from 'publicodes'
@ -46,7 +46,7 @@ export default function Conversation({
const engine = useContext(EngineContext)
const currentQuestion = useNextQuestions()[0]
const situation = useSelector(situationSelector)
const currentQuestionIsAnswered = situation[currentQuestion] != null
const currentQuestionIsAnswered = !(currentQuestion in useMissingVariables())
const previousAnswers = useSelector(answeredQuestionsSelector)
useEffect(() => {
if (currentQuestion) {
@ -65,12 +65,7 @@ export default function Conversation({
}
const onChange = (value: PublicodesExpression | undefined) => {
dispatch(
(value == null ? deleteFromSituation : updateSituation)(
currentQuestion,
value
)
)
dispatch(answerQuestion(currentQuestion, value))
}
return (

View File

@ -119,9 +119,17 @@ export default function RuleInput<Names extends string = DottedName>({
/>
)
}
if (rule.rawNode.API && rule.rawNode.API === 'commune') {
return <SelectCommune {...commonProps} />
return (
<SelectCommune
{...commonProps}
onChange={(c) => commonProps.onChange({ batchUpdate: c })}
value={value as Evaluation<string>}
/>
)
}
if (rule.rawNode.API && rule.rawNode.API.startsWith('pays détachement')) {
return (
<SelectPaysDétachement
@ -131,7 +139,9 @@ export default function RuleInput<Names extends string = DottedName>({
)
}
if (rule.rawNode.API) {
throw new Error("Les seules API implémentées sont 'commune'")
throw new Error(
"Les seules API implémentées sont 'commune' et 'pays détachement'"
)
}
if (rule.dottedName === 'établissement . taux ATMP . taux collectif') {

View File

@ -10,10 +10,17 @@ import { debounce } from '@/utils'
import { KeyboardEvent, useCallback, useMemo, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import styled, { css } from 'styled-components'
import { InputProps } from '../RuleInput'
function formatCommune(value: SearchCommune) {
return value && `${value.nom} (${value.codePostal})`
return value && `${value.nom} (${value['code postal']})`
}
type SelectCommuneProps = {
onChange: (c: Commune) => void
value: string | undefined | null
missing?: boolean
id?: string
autoFocus?: boolean
}
export default function Select({
@ -22,10 +29,8 @@ export default function Select({
id,
missing,
autoFocus,
}: InputProps) {
const [name, setName] = useState(
missing ? '' : formatCommune(value as Commune)
)
}: SelectCommuneProps) {
const [name, setName] = useState(missing ? '' : value ?? undefined)
const [searchResults, setSearchResults] =
useState<null | Array<SearchCommune>>(null)
const { t } = useTranslation()
@ -51,15 +56,13 @@ export default function Select({
setName(formatCommune(commune))
try {
const communeWithDetails = await fetchCommuneDetails(
commune.code,
commune.codePostal
commune['code commune'],
commune['code postal']
)
if (!communeWithDetails) {
return
}
onChange({
objet: communeWithDetails,
})
onChange(communeWithDetails)
} catch (error) {
// eslint-disable-next-line no-console
console.warn(

View File

@ -3,7 +3,7 @@ import {
answeredQuestionsSelector,
configSelector,
currentQuestionSelector,
objectifsSelector,
useMissingVariables,
} from '@/selectors/simulationSelectors'
import { DottedName } from 'modele-social'
import { useContext, useMemo } from 'react'
@ -12,27 +12,6 @@ import { EngineContext } from './EngineContext'
type MissingVariables = Partial<Record<DottedName, number>>
export function getNextSteps(
missingVariables: Array<MissingVariables>
): Array<DottedName> {
const missingByTotalScore = missingVariables.reduce<Record<string, number>>(
(acc, mv) => ({
...acc,
...Object.fromEntries(
Object.entries(mv).map(([name, score]) => [
name,
(acc[name] || 0) + score,
])
),
}),
{}
)
return Object.entries(missingByTotalScore)
.sort(([, a], [, b]) => b - a)
.map(([a]) => a) as Array<DottedName>
}
// Max : 1
// Min -> 0
const questionDifference = (ruleA = '', ruleB = '') => {
@ -46,7 +25,7 @@ const questionDifference = (ruleA = '', ruleB = '') => {
}
export function getNextQuestions(
missingVariables: Array<MissingVariables>,
missingVariables: MissingVariables,
questionConfig: SimulationConfig['questions'] = {},
answeredQuestions: Array<DottedName> = []
): Array<DottedName> {
@ -56,7 +35,9 @@ export function getNextQuestions(
'liste noire': blacklist = [],
} = questionConfig
const nextSteps = getNextSteps(missingVariables)
const nextSteps = Object.entries(missingVariables)
.sort(([, a], [, b]) => b - a)
.map(([a]) => a as DottedName)
.filter((name) => !answeredQuestions.includes(name))
.filter(
(step) =>
@ -82,14 +63,11 @@ export function getNextQuestions(
}
export const useNextQuestions = function (): Array<DottedName> {
const objectifs = useSelector(objectifsSelector)
const answeredQuestions = useSelector(answeredQuestionsSelector)
const currentQuestion = useSelector(currentQuestionSelector)
const questionsConfig = useSelector(configSelector).questions
const engine = useContext(EngineContext)
const missingVariables = objectifs.map(
(objectif) => engine.evaluate(objectif).missingVariables ?? {}
)
const missingVariables = useMissingVariables()
const nextQuestions = useMemo(() => {
let next = getNextQuestions(
missingVariables,

View File

@ -1,7 +1,7 @@
[
{
"name": "Juin 2022",
"description": "**En bref**\r\n> - Vous pouvez installer mon-entreprise sur votre téléphone et accéder aux simulateurs même sans connection internet !\r\n> - Accédez à toutes les informations de votre entreprise grâce au lien vers [annuaire-entreprise.data.gouv.fr]\r\n> - Améliorations de l'interface et corrections de bugs\r\n\r\n## Accédez aux simulateurs à tout moment ✈️\r\n\r\nTous les simulateurs de mon-entreprise sont maintenant utilisables en mode hors ligne ! Il vous suffit de vous rendre une fois sur le site, et vous pourrez y revenir à tout moment, même sans accès internet.\r\n\r\nEt ce n'est pas tout : vous pouvez installer les simulateurs directement sur votre téléphone ou votre ordinateur pour y revenir en un clic ! Pour cela il vous suffit de cliquer sur « installer » lors de la visite du site depuis le navigateur. \r\n\r\nhttps://user-images.githubusercontent.com/1775934/181524049-56055bd8-342f-43d8-ad38-5f745e2eb89a.mp4\r\n\r\n## Retrouvez toutes les informations de votre entreprise sur une seule page\r\n\r\nVous ne vous rappelez jamais du SIRET ? Impossible de remettre la main sur votre numéro de TVA intercommunautaire ? Vous pouvez consulter toutes les données publiques de votre entreprise sur [annuaire-entreprise.data.gouv.fr]. Nous avons ajouté un lien en bas du tableau de bord de votre entreprise.\r\n![image](https://user-images.githubusercontent.com/1775934/181525140-3c421884-f772-43ee-9d2f-60540df48dd0.png)\r\n\r\n## Améliorations diverses et corrections de bugs\r\n\r\n- Les taux du versement mobilité ont été actualisés\r\n- La grille des taux neutre de l'impôt sur le revenu a été également mis à jour\r\n- Vous pouvez maintenant déposer un avis sur le simulateur salarié grâce au bouton « Je donne mon avis »\r\n- Nous avons corrigé le calcul de l'impôt sur le revenu pour les parents isolés\r\n- L'abattement sur les dividendes a été corrigé\r\n- Nous avons ajouté davantage de liens vers des pages d'explications derrière le bouton « Info » présent à côté des questions\r\n- Corrections de bug divers "
"description": "**En bref**\r\n> - Vous pouvez installer mon-entreprise sur votre téléphone et accéder aux simulateurs même sans connection internet !\r\n> - Accédez à toutes les informations de votre entreprise grâce au lien vers [annuaire-entreprise.data.gouv.fr]\r\n> - Améliorations de l'interface et corrections de bugs\r\n\r\n## Accédez aux simulateurs à tout moment ✈️\r\n\r\nTous les simulateurs de mon-entreprise sont maintenant utilisables en mode hors ligne ! Il vous suffit de vous rendre une fois sur le site, et vous pourrez y revenir à tout moment, même sans accès internet.\r\n\r\nEt ce n'est pas tout : vous pouvez installer les simulateurs directement sur votre téléphone ou votre ordinateur pour y revenir en un clic ! Pour cela il vous suffit de cliquer sur « installer » lors de la visite du site depuis le navigateur. \r\n\r\nhttps://user-images.githubusercontent.com/1775934/181524049-56055bd8-342f-43d8-ad38-5f745e2eb89a.mp4\r\n\r\n## Retrouvez toutes les informations de votre entreprise sur une seule page\r\n\r\nVous ne vous rappelez jamais du SIRET ? Impossible de remettre la main sur votre numéro de TVA intercommunautaire ? Vous pouvez consulter toutes les données publiques de votre entreprise sur [annuaire-entreprise.data.gouv.fr]. Nous avons ajouté un lien en bas du tableau de bord de votre entreprise.\r\n![image](https://user-images.githubusercontent.com/1775934/181525140-3c421884-f772-43ee-9d2f-60540df48dd0.png)\r\n\r\n## Améliorations diverses et corrections de bugs\r\n\r\n- Les taux versement mobilité ont été actualisés\r\n- La grille des taux neutre de l'impôt sur le revenu a été également mis à jour\r\n- Vous pouvez maintenant déposer un avis sur le simulateur salarié grâce au bouton « Je donne mon avis »\r\n- Nous avons corrigé le calcul de l'impôt sur le revenu pour les parents isolés\r\n- L'abattement sur les dividendes a été corrigé\r\n- Nous avons ajouté davantage de liens vers des pages d'explications derrière le bouton « Info » présent à côté des questions\r\n- Corrections de bug divers "
},
{
"name": "Avril 2022",
@ -9,7 +9,7 @@
},
{
"name": "Janvier 2022",
"description": "> **En bref :**\r\n> - Mise à jour législative au 1<sup>er</sup> janvier\r\n> - Nouveau moteur de recherche d'entreprise\r\n> - Travail sur les parcours\r\n> - Mise à jour du formulaire de demande de mobilité\r\n\r\n## Mise à jour législative au 1<sup>er</sup> janvier 2022\r\n\r\nComme tous les ans, certains montants sont revalorisés au 1<sup>er</sup> janvier. C'est le cas en particulier du SMIC qui vaut désormais 1603 € brut par mois pour un salarié travaillant à temps plein. Le barème de l'impôt sur le revenu a aussi été ajusté pour prendre en compte l'inflation. D'autres éléments ont été mis à jour comme les barèmes de cotisation des caisses de retraite, le taux du versement mobilité, le taux de la cotisation pour les indemnités journalières des indépendants ou encore le montant des titres restaurants exonéré de cotisations.\r\n\r\n## Nouveau moteur de recherche d'entreprise 🔍\r\n\r\nNous avons travaillé avec les équipes de [code du travail numérique] (https://code.travail.gouv.fr/) sur un nouveau moteur de recherche des entreprises. Il vous permet de trouver votre entreprise facilement et de manière plus fiable que ce que nous proposions avant. Ce nouveau moteur permet également d'associer à une entreprise des informations comme sa convention collective si elle en possède une, la localisation de son siège social, sa date de création, etc.\r\n\r\n[![recherche d'entreprise](https://user-images.githubusercontent.com/1730702/149759756-02f30ab4-2531-416c-8438-4cdf96b83523.png)](https://mon-entreprise.urssaf.fr/)\r\n\r\n## Travail sur les parcours\r\n\r\nVous avez désormais la possibilité de renseigner votre entreprise actuelle dès la page daccueil du site. Grâce à cela nous identifions les bons outils dans votre situation, par exemple un simulateur de revenu pour un auto-entrepreneur, ou bien une aide à la déclaration fiscale pour les indépendants. Grâce au code APE nous pouvons même identifier la nature de certaines activités pour les professions libérales et aller plus loin dans la personnalisation des outils.\r\n\r\n![image](https://user-images.githubusercontent.com/1730702/149761273-fe9fa7fd-8e4d-45ca-868f-f35a5e1bacb7.png)\r\n\r\n## Mise à jour du formulaire de demande de mobilité\r\n\r\nLe formulaire de demande de mobilité gère désormais le cas des salariés ainsi que des praticiens et auxiliaires médicaux. Un nouveau parcour a été crée dans le cas d'un détachement dans un pays avec une convention bilatérale.\r\n\r\n## Détails des changements\r\n\r\n* ✨ Nouvelle page d'accueil - charte urssaf by @bobylito in https://github.com/betagouv/mon-entreprise/pull/1851\r\n* Améliore le style de la landing et de la page gérer by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1867\r\n* Quelques bugfixes by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1876\r\n* Répare la couleur du placeholder sous chrome by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1877\r\n* Répare la comparaison de régime sociaux by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1886\r\n* Petits fix de la recherche by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1887\r\n* Affiche une bannière dans la section dev lors d'un recrutement by @mquandalle in https://github.com/betagouv/mon-entreprise/pull/1884\r\n* Quelques fixes by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1891\r\n* Améliore le style des simulateurs et de la fiche de paie by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1892\r\n* Correction tests CI master by @mquandalle in https://github.com/betagouv/mon-entreprise/pull/1896\r\n* Corrections de bugs par wiinxt by @mquandalle in https://github.com/betagouv/mon-entreprise/pull/1903\r\n* Modification formulaire DLA suite aux retours Urssaf by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1783\r\n* Mise à jour legislative 1er janvier 2022 by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1912\r\n* 🎨 Affiche le simulateur PL adapté à l'entreprise by @lajarre in https://github.com/betagouv/mon-entreprise/pull/1882\r\n* Modif 1er janvier (suite) by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1915\r\n* Fix E2E tests by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1919\r\n* Met à jour pour 2022 les barèmes et cotisations pour les PLR by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1926\r\n* Remplace le moteur de recherche d'entreprise by @bobylito in https://github.com/betagouv/mon-entreprise/pull/1868\r\n"
"description": "> **En bref :**\r\n> - Mise à jour législative au 1<sup>er</sup> janvier\r\n> - Nouveau moteur de recherche d'entreprise\r\n> - Travail sur les parcours\r\n> - Mise à jour du formulaire de demande de mobilité\r\n\r\n## Mise à jour législative au 1<sup>er</sup> janvier 2022\r\n\r\nComme tous les ans, certains montants sont revalorisés au 1<sup>er</sup> janvier. C'est le cas en particulier du SMIC qui vaut désormais 1603 € brut par mois pour un salarié travaillant à temps plein. Le barème de l'impôt sur le revenu a aussi été ajusté pour prendre en compte l'inflation. D'autres éléments ont été mis à jour comme les barèmes de cotisation des caisses de retraite, le taux versement mobilité, le taux de la cotisation pour les indemnités journalières des indépendants ou encore le montant des titres restaurants exonéré de cotisations.\r\n\r\n## Nouveau moteur de recherche d'entreprise 🔍\r\n\r\nNous avons travaillé avec les équipes de [code du travail numérique] (https://code.travail.gouv.fr/) sur un nouveau moteur de recherche des entreprises. Il vous permet de trouver votre entreprise facilement et de manière plus fiable que ce que nous proposions avant. Ce nouveau moteur permet également d'associer à une entreprise des informations comme sa convention collective si elle en possède une, la localisation de son siège social, sa date de création, etc.\r\n\r\n[![recherche d'entreprise](https://user-images.githubusercontent.com/1730702/149759756-02f30ab4-2531-416c-8438-4cdf96b83523.png)](https://mon-entreprise.urssaf.fr/)\r\n\r\n## Travail sur les parcours\r\n\r\nVous avez désormais la possibilité de renseigner votre entreprise actuelle dès la page daccueil du site. Grâce à cela nous identifions les bons outils dans votre situation, par exemple un simulateur de revenu pour un auto-entrepreneur, ou bien une aide à la déclaration fiscale pour les indépendants. Grâce au code APE nous pouvons même identifier la nature de certaines activités pour les professions libérales et aller plus loin dans la personnalisation des outils.\r\n\r\n![image](https://user-images.githubusercontent.com/1730702/149761273-fe9fa7fd-8e4d-45ca-868f-f35a5e1bacb7.png)\r\n\r\n## Mise à jour du formulaire de demande de mobilité\r\n\r\nLe formulaire de demande de mobilité gère désormais le cas des salariés ainsi que des praticiens et auxiliaires médicaux. Un nouveau parcour a été crée dans le cas d'un détachement dans un pays avec une convention bilatérale.\r\n\r\n## Détails des changements\r\n\r\n* ✨ Nouvelle page d'accueil - charte urssaf by @bobylito in https://github.com/betagouv/mon-entreprise/pull/1851\r\n* Améliore le style de la landing et de la page gérer by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1867\r\n* Quelques bugfixes by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1876\r\n* Répare la couleur du placeholder sous chrome by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1877\r\n* Répare la comparaison de régime sociaux by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1886\r\n* Petits fix de la recherche by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1887\r\n* Affiche une bannière dans la section dev lors d'un recrutement by @mquandalle in https://github.com/betagouv/mon-entreprise/pull/1884\r\n* Quelques fixes by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1891\r\n* Améliore le style des simulateurs et de la fiche de paie by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1892\r\n* Correction tests CI master by @mquandalle in https://github.com/betagouv/mon-entreprise/pull/1896\r\n* Corrections de bugs par wiinxt by @mquandalle in https://github.com/betagouv/mon-entreprise/pull/1903\r\n* Modification formulaire DLA suite aux retours Urssaf by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1783\r\n* Mise à jour legislative 1er janvier 2022 by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1912\r\n* 🎨 Affiche le simulateur PL adapté à l'entreprise by @lajarre in https://github.com/betagouv/mon-entreprise/pull/1882\r\n* Modif 1er janvier (suite) by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1915\r\n* Fix E2E tests by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1919\r\n* Met à jour pour 2022 les barèmes et cotisations pour les PLR by @johangirod in https://github.com/betagouv/mon-entreprise/pull/1926\r\n* Remplace le moteur de recherche d'entreprise by @bobylito in https://github.com/betagouv/mon-entreprise/pull/1868\r\n"
},
{
"name": "Décembre 2021",

View File

@ -7720,19 +7720,11 @@ situation personnelle . domiciliation fiscale à l'étranger:
établissement . ZFU . durée d'implantation en fin d'année:
titre.en: '[automatic] duration of implementation at the end of the year'
titre.fr: durée d'implantation en fin d'année
établissement . localisation:
description.en: |-
When a company has more than one establishment, certain contributions are
calculated at the establishment level and are based on local regulations.
description.fr: >
Lorsqu'une entreprise dispose de plusieurs établissements,
certaines cotisations sont
calculées à l'échelle de l'établissement et sont fonction de règlementations locales.
établissement . commune:
question.en: In which city is the establishment located?
question.fr: Dans quelle commune l'établissement est-il implanté ?
titre.en: localisation
titre.fr: localisation
titre.en: '[automatic] '
titre.fr: commune
établissement . taux ATMP:
description.en: >
[automatic] The rate of the AT/MP contribution is determined for
@ -7769,6 +7761,3 @@ situation personnelle . domiciliation fiscale à l'étranger:
question.fr: Quel est le taux de la cotisation AT/MP pour l'établissement ?
titre.en: '[automatic] ATMP rate'
titre.fr: taux ATMP
établissement . versement mobilité:
titre.en: '[automatic] mobility payment'
titre.fr: versement mobilité

View File

@ -1237,15 +1237,16 @@ pages:
<3>evaluate</3></1><2>Experimental rules also contain a warning in the
"Reuse this calculation" section of the
documentation.</2></4></2><3><0>Reusing data from external
APIs</0><1>Some data in the my-company simulators come from external
APIs. You will have to change their value by yourself in the given input
situation.</1><2>The mobility payment</2><3><0><0>establishment .
mobility payment</0></0></3><4>In the <2>employee</2> simulator, all you
have to do is enter the municipality and the corresponding mobility
payment rate is automatically determined.</4><5>You will have to specify
the rate yourself to redo the calculation. You can find it
again:<1><0>By entering your municipality in a simulator, then searching
for the "mobility payment" rule with the "search" button at the top
APIs</0><1>Some of the data in the my-company simulators come from
external APIs. You will have to retrieve their value yourself to enter
it in the input situation.</1><2>The mobility
payment</2><3><0><0>establishment . municipality . mobility payment
rate</0></0></3><4>In the <2>employee</2> simulator, all you have to do
is enter the municipality and the corresponding mobility payment rate is
automatically determined.</4><5>You will have to specify the rate
yourself to redo the calculation. You can find it again:<1><0>By
entering your municipality in a simulator, then searching for the
"mobility payment" rule with the "search" button at the top
right</0><1>Using the <2>dedicated service on
urssaf.fr</2></1></1></5><6>The collective AT/MP
rate</6><7><0><0>establishment . ATMP rate . collective

View File

@ -1002,15 +1002,16 @@ pages:
Réutiliser ce calcul » de la documentation.</2></4></2><3><0>Réutiliser
une donnée provenant d'API externes</0><1>Certaines données des
simulateurs de mon-entreprise proviennent d'API externes. Il vous faudra
ainsi changer leur valeur par vous-même dans la situation donnée en
entrée.</1><2>Le versement mobilité</2><3><0><0>établissement .
versement mobilité</0></0></3><4>Dans le simulateur <2>salarié</2>, il
suffit de renseigner la commune et le taux du versement mobilité
correspondant est automatiquement déterminé.</4><5>Il vous faudra
préciser le taux vous-même pour refaire le calcul. Vous pouvez le
retrouver :<1><0>En saisissant votre commune dans un simulateur, puis en
recherchant la règle « versement mobilité » avec le bouton « rechercher
» en haut à droite</0><1>Grâce au <2>service dédié sur
ainsi récuperer leur valeur par vous-même pour la saisir dans la
situation donnée en entrée.</1><2>Le versement
mobilité</2><3><0><0>établissement . commune . taux versement
mobilité</0></0></3><4>Dans le simulateur <2>salarié</2>, il suffit de
renseigner la commune et le taux versement mobilité correspondant est
automatiquement déterminé.</4><5>Il vous faudra préciser le taux
vous-même pour refaire le calcul. Vous pouvez le retrouver :<1><0>En
saisissant votre commune dans un simulateur, puis en recherchant la
règle « versement mobilité » avec le bouton « rechercher » en haut à
droite</0><1>Grâce au <2>service dédié sur
urssaf.fr</2></1></1></5><6>Le taux collectif
AT/MP</6><7><0><0>établissement . taux ATMP . taux
collectif</0></0></7><8>Ce taux collectif doit être retrouvé

View File

@ -18,7 +18,7 @@ questions:
- établissement
- situation personnelle
non prioritaires:
- établissement . localisation
- établissement . commune
liste noire:
- entreprise . charges
- entreprise . chiffre d'affaires

View File

@ -9,7 +9,7 @@ questions:
liste:
- salarié . activité partielle
- salarié . temps de travail
- établissement . localisation
- établissement . commune
unité par défaut: €/mois

View File

@ -8,7 +8,7 @@ objectifs:
questions:
à l'affiche:
ACRE: entreprise . exonérations . ACRE
Commune: établissement . localisation
Commune: établissement . commune
Avantages en nature: salarié . rémunération . avantages en nature
Impôt sur le revenu: impôt . méthode de calcul
@ -19,7 +19,7 @@ questions:
- entreprise . association non lucrative
non prioritaires:
- entreprise . TVA
- établissement . localisation
- établissement . commune
- situation personnelle . domiciliation fiscale à l'étranger
- salarié . régimes spécifiques . impatriés

View File

@ -14,7 +14,7 @@ questions:
Heures supplémentaires: salarié . temps de travail . heures supplémentaires
Titres-restaurant: salarié . rémunération . frais professionnels . titres-restaurant
Impôt: impôt . méthode de calcul
Commune: établissement . localisation
Commune: établissement . commune
non prioritaires:
- salarié . régimes spécifiques . DFS
- entreprise . association non lucrative

View File

@ -1,5 +1,5 @@
import PDFElement from '@react-pdf/renderer'
import { EngineContext } from '@/components/utils/EngineContext'
import PDFElement from '@react-pdf/renderer'
import { formatValue, RuleNode } from 'publicodes'
import { useContext } from 'react'
@ -33,18 +33,7 @@ export default function FieldsPDF({ fields }: FieldsPDFProps) {
</Text>
<Text style={styles.value}>
{`${formatValue(engine.evaluate(dottedName)) as string}${
API === 'commune'
? ` (${
(
engine.evaluate(dottedName).nodeValue as Record<
string,
unknown
>
)?.codePostal as string
})`
: ''
} `}
{formatValue(engine.evaluate(dottedName)) as string}
</Text>
</>
)}

View File

@ -1,5 +1,5 @@
import PDFElement from '@react-pdf/renderer'
import urssafPng from '@/images/destinataires/Urssaf.png'
import PDFElement from '@react-pdf/renderer'
import { RuleNode } from 'publicodes'
import FieldsPDF, { styles as fieldStyles } from './FieldsPDF'
import montserratUrl from './Montserrat-SemiBold.ttf'

View File

@ -221,6 +221,18 @@ données assuré:
titre: Commune
non applicable si: étranger
API: commune
condition:
si:
est non défini: nom
alors: nom
sinon:
texte: |
{{nom}} ({{code postal}})
avec:
nom:
titre: Commune
code postal:
commune étranger:
applicable si: étranger
type: texte
@ -281,6 +293,17 @@ entreprise france . adresse:
type: texte
entreprise france . commune:
API: commune
condition:
si:
est non défini: nom
alors: nom
sinon:
texte: |
{{nom}} ({{code postal}})
avec:
nom:
titre: Commune
code postal:
note: 4.4.3 / 4.4.4
entreprise france . organisme urssaf:

View File

@ -8,10 +8,16 @@ import { Markdown } from '@/components/utils/markdown'
import { usePersistingState } from '@/components/utils/persistState'
import useSimulationConfig from '@/components/utils/useSimulationConfig'
import { Button } from '@/design-system/buttons'
import { Spacing, Grid } from '@/design-system/layout'
import { Grid, Spacing } from '@/design-system/layout'
import { headings } from '@/design-system/typography'
import { Intro, SmallBody } from '@/design-system/typography/paragraphs'
import { evaluateQuestion, getMeta, hash, omit } from '@/utils'
import {
buildSituationFromObject,
evaluateQuestion,
getMeta,
hash,
omit,
} from '@/utils'
import { DottedName } from 'modele-social'
import Engine, { PublicodesExpression } from 'publicodes'
import { Fragment, lazy, Suspense, useCallback, useContext } from 'react'
@ -80,6 +86,15 @@ function FormulairePublicodes() {
(dottedName, value) => {
if (value === undefined) {
setSituation((situation) => omit(situation, dottedName))
} else if (engine.getRule(dottedName).rawNode.API === 'commune') {
const commune = {
nom: value.batchUpdate.nom,
'code postal': value.batchUpdate['code postal'],
}
setSituation((situation) => ({
...buildSituationFromObject(dottedName, commune),
...situation,
}))
} else {
setSituation((situation) => ({
...situation,

View File

@ -81,14 +81,14 @@ export function CasParticuliers() {
<H3>Réutiliser une donnée provenant d'API externes</H3>
<Body>
Certaines données des simulateurs de mon-entreprise proviennent d'API
externes. Il vous faudra ainsi changer leur valeur par vous-même dans
la situation donnée en entrée.
externes. Il vous faudra ainsi récuperer leur valeur par vous-même
pour la saisir dans la situation donnée en entrée.
</Body>
<H4>Le versement mobilité</H4>
<Body>
<Code>
<RuleLink dottedName="établissement . versement mobilité">
établissement . versement mobilité
<RuleLink dottedName="établissement . commune . taux versement mobilité">
établissement . commune . taux versement mobilité
</RuleLink>
</Code>
</Body>
@ -97,7 +97,7 @@ export function CasParticuliers() {
<Link to={useSitePaths().absoluteSitePaths.simulateurs.salarié}>
salarié
</Link>
, il suffit de renseigner la commune et le taux du versement mobilité
, il suffit de renseigner la commune et le taux versement mobilité
correspondant est automatiquement déterminé.
</Body>
<Body>

View File

@ -1,7 +1,7 @@
import { DottedName } from '@/../../modele-social'
import { Action } from '@/actions/actions'
import { FabriqueSocialEntreprise } from '@/api/fabrique-social'
import { omit } from '@/utils'
import { buildSituationFromObject, omit } from '@/utils'
import { Situation } from './rootReducer'
const SAVED_NAMESPACES = [
@ -53,7 +53,7 @@ export function companySituation(state: Situation = {}, action: Action) {
case 'COMPANY::ADD_COMMUNE_DETAILS':
return {
...state,
'établissement . localisation': { objet: action.details },
...buildSituationFromObject('établissement . commune', action.details),
}
case 'COMPANY::SET_BÉNÉFICE_TYPE':
return {

View File

@ -1,7 +1,7 @@
import { Action } from '@/actions/actions'
import { Commune } from '@/api/commune'
import { PreviousSimulation } from '@/selectors/previousSimulationSelectors'
import { DottedName } from 'modele-social'
import { PublicodesExpression } from 'publicodes'
import reduceReducers from 'reduce-reducers'
import { combineReducers, Reducer } from 'redux'
import { objectifsSelector } from '../selectors/simulationSelectors'
@ -56,9 +56,8 @@ type Overwrite<T, U> = { [P in keyof Omit<T, keyof U>]: T[P] } & U
export type Situation = Partial<
Overwrite<
Record<DottedName, string | number | { valeur: number; unité: string }>,
Record<DottedName, PublicodesExpression>,
{
'établissement . localisation': { objet: Commune }
'entreprise . imposition': string
année: number
}

View File

@ -1,5 +1,8 @@
import { useEngine } from '@/components/utils/EngineContext'
import { RootState, SimulationConfig, Situation } from '@/reducers/rootReducer'
import { DottedName } from 'modele-social'
import Engine, { utils } from 'publicodes'
import { useSelector } from 'react-redux'
export const configSelector = (state: RootState): Partial<SimulationConfig> =>
state.simulation?.config ?? {}
@ -19,6 +22,17 @@ export const objectifsSelector = (state: RootState) => {
const emptySituation: Situation = {}
export const useMissingVariables = (): Partial<Record<DottedName, number>> => {
const objectifs = useSelector(objectifsSelector)
const engine = useEngine()
return mergeObjectifsMissingVariable(
objectifs.map(
(objectif) => engine.evaluate(objectif).missingVariables ?? {}
),
engine
)
}
export const situationSelector = (state: RootState) =>
state.simulation?.situation ?? emptySituation
@ -50,3 +64,29 @@ export const answeredQuestionsSelector = (state: RootState) =>
export const shouldFocusFieldSelector = (state: RootState) =>
state.simulation?.shouldFocusField ?? false
/**
* Merge objectifs missings that depends on the same input field.
*
* For instance, the commune field (API) will fill `commune . nom` `commune . taux versement transport`, `commune . département`, etc.
*/
function mergeObjectifsMissingVariable<Name extends string>(
missingVariables: Array<Partial<Record<Name, number>>>,
engine: Engine<Name>
): Partial<Record<Name, number>> {
return (
missingVariables.flatMap((missings) => Object.entries(missings)) as Array<
[Name, number]
>
).reduce((missings, [name, value]: [Name, number]) => {
const parentName = utils.ruleParent(name) as Name
if (parentName && engine.getRule(parentName).rawNode.API) {
missings[parentName] = (missings[parentName] ?? 0) + value
return missings
}
missings[name] = value
return missings
}, {} as Partial<Record<Name, number>>)
}

View File

@ -1,9 +1,11 @@
import { DottedName } from 'modele-social'
import Engine, {
formatValue,
PublicodesExpression,
Rule,
RuleNode,
} from 'publicodes'
import { Situation } from './reducers/rootReducer'
export function capitalise0(name: undefined): undefined
export function capitalise0(name: string): string
@ -240,3 +242,17 @@ export function evaluateQuestion(
return question
}
export function buildSituationFromObject<Names extends string = DottedName>(
contextDottedName: Names,
situationObject: Record<string, PublicodesExpression>
): Situation {
return Object.fromEntries(
Object.entries(situationObject).map(
([key, value]: [string, PublicodesExpression]) => [
`${contextDottedName} . ${key}` as Names,
typeof value === 'string' ? `'${value}'` : value,
]
)
)
}

View File

@ -1,10 +1,7 @@
import rules from 'modele-social'
import Engine from 'publicodes'
import { describe, expect, it } from 'vitest'
import {
getNextQuestions,
getNextSteps,
} from '../source/components/utils/useNextQuestion'
import { getNextQuestions } from '../source/components/utils/useNextQuestion'
describe('conversation', function () {
it('should start with the first missing variable', function () {
@ -15,7 +12,7 @@ describe('conversation', function () {
'top . a': { question: '?', titre: 'a', unité: '€' },
'top . b': { question: '?', titre: 'b', unité: '€' },
}).evaluate('top . startHere').missingVariables
expect(getNextQuestions([missingVariables])[0]).to.equal('top . a')
expect(getNextQuestions(missingVariables)[0]).to.equal('top . a')
})
it('should first ask for questions without defaults, then those with defaults', function () {
const engine = new Engine({
@ -46,12 +43,11 @@ describe('conversation', function () {
},
cadre: {
question: 'Est-ce un cadre ?',
'par défaut': 'non',
},
})
expect(
getNextQuestions([engine.evaluate('net').missingVariables])[0]
getNextQuestions(engine.evaluate('net').missingVariables)[0]
).to.equal('brut')
engine.setSituation({
@ -59,7 +55,7 @@ describe('conversation', function () {
})
expect(
getNextQuestions([engine.evaluate('net').missingVariables])[0]
getNextQuestions(engine.evaluate('net').missingVariables)[0]
).to.equal('cadre')
})
@ -78,23 +74,3 @@ describe('conversation', function () {
expect(result).to.include('salarié . contrat . CDD . motif')
})
})
describe('getNextSteps', function () {
it('should give priority to questions by total weight when advancing the same target count', function () {
let missingVariablesByTarget = [
{
effectif: 24.01,
cadre: 30,
},
{
effectif: 24.01,
cadre: 10.1,
},
{},
]
let result = getNextSteps(missingVariablesByTarget)
expect(result[0]).to.equal('effectif')
})
})

View File

@ -1,5 +1,11 @@
// Vitest Snapshot v1
exports[`calculate simulations-salarié > ATMP 1`] = `"[2370,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > ATMP 2`] = `"[2312,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > ATMP 3`] = `"[2326,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > CCN HCR 1`] = `
"[3480,0,2500,1983,1872]
Notifications affichées : salarié . convention collective . contrôle décharge"
@ -131,11 +137,11 @@ exports[`calculate simulations-salarié > contrat pro 2`] = `"[1566,0,1500,1165,
exports[`calculate simulations-salarié > effectif 1`] = `"[2354,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > effectif 2`] = `"[2401,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > effectif 2`] = `"[2365,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > effectif 3`] = `"[2413,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > effectif 3`] = `"[2377,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > effectif 4`] = `"[2413,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > effectif 4`] = `"[2377,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié > frais pro - DFS 1`] = `"[2078,0,2000,1622,1622]"`;
@ -187,7 +193,7 @@ exports[`calculate simulations-salarié > heures supplémentaires et complément
exports[`calculate simulations-salarié > heures supplémentaires et complémentaires 2`] = `"[2415,0,2000,1606,1572]"`;
exports[`calculate simulations-salarié > heures supplémentaires et complémentaires 3`] = `"[2524,0,2000,1636,1601]"`;
exports[`calculate simulations-salarié > heures supplémentaires et complémentaires 3`] = `"[2486,0,2000,1636,1601]"`;
exports[`calculate simulations-salarié > heures supplémentaires et complémentaires 4`] = `
"[2454,0,2000,1616,1581]

View File

@ -29,6 +29,7 @@ it('calculate simulations-salarié', () => {
"salarié . cotisations . prévoyances . santé . montant",
"salarié . cotisations . prévoyances . santé . taux employeur",
"salarié . régimes spécifiques . DFS",
"salarié . régimes spécifiques . alsace moselle",
"salarié . régimes spécifiques . impatriés",
"salarié . rémunération . avantages en nature",
"salarié . rémunération . frais professionnels . titres-restaurant",
@ -39,7 +40,8 @@ it('calculate simulations-salarié', () => {
"salarié . rémunération . primes . fin d'année",
"salarié . temps de travail . heures supplémentaires",
"situation personnelle . domiciliation fiscale à l'étranger",
"établissement . localisation",
"établissement . commune . département",
"établissement . commune . département . outre-mer",
]
`)
})

View File

@ -45,6 +45,14 @@ apprentissage:
salarié . contrat . apprentissage . diplôme préparé: "'niveau bac ou moins'"
salarié . contrat . apprentissage . ancienneté: "'moins de deux ans'"
ATMP:
- salarié . contrat . salaire brut: 2000 €/mois
établissement . taux ATMP: '3 %'
- salarié . contrat . salaire brut: 2000 €/mois
établissement . taux ATMP: '0.1 %'
- salarié . contrat . salaire brut: 2000 €/mois
salarié . cotisations . ATMP . taux fonctions support: oui
contrat pro:
- salarié . contrat: "'professionnalisation'"
salarié . contrat . date d'embauche: 01/10/2020
@ -132,16 +140,16 @@ impôt sur le revenu:
impôt . méthode de calcul: "'taux neutre'"
- salarié . contrat . salaire brut: 3000 €/mois
impôt . méthode de calcul: "'taux neutre'"
établissement . localisation . département: "'Guadeloupe'"
établissement . commune . département: "'Guadeloupe'"
- salarié . contrat . salaire brut: 30000 €/mois
impôt . méthode de calcul: "'taux neutre'"
établissement . localisation . département: "'Guadeloupe'"
établissement . commune . département: "'Guadeloupe'"
- salarié . contrat . salaire brut: 3000 €/mois
impôt . méthode de calcul: "'taux neutre'"
établissement . localisation . département: "'Mayotte'"
établissement . commune . département: "'Mayotte'"
- salarié . contrat . salaire brut: 30000 €/mois
impôt . méthode de calcul: "'taux neutre'"
établissement . localisation . département: "'Mayotte'"
établissement . commune . département: "'Mayotte'"
- salarié . contrat . salaire brut: 3000 €/mois
impôt . méthode de calcul: "'taux personnalisé'"
impôt . taux personnalisé: 10%

View File

@ -4714,9 +4714,9 @@ __metadata:
languageName: node
linkType: hard
"@publicodes/api@npm:^1.0.0-beta.54":
version: 1.0.0-beta.54
resolution: "@publicodes/api@npm:1.0.0-beta.54"
"@publicodes/api@npm:^1.0.0-beta.55":
version: 1.0.0-beta.55
resolution: "@publicodes/api@npm:1.0.0-beta.55"
dependencies:
"@koa/cors": ^3.3.0
"@koa/router": ^10.1.1
@ -4725,7 +4725,7 @@ __metadata:
openapi-validator-middleware: ^3.2.6
peerDependencies:
publicodes: ^1.0.0-beta.47
checksum: 8383c05d90b638db49b951dda470adf361ec103ecb43b6b3a4e3a0da84d9f62083391ba46c1927cb0bcd1c90dd66b7b20a8e7a6df3b2e592df88fba56c6af79a
checksum: 82bcc777c5b5b644b3ae7fdb9d5b9c0d76c3a940411856e443db94ea9e6f756d2630bbbb90514cc256c6959a7e863b20a8eb778d27c5219bf2e0af9dc36d75cf
languageName: node
linkType: hard
@ -10036,7 +10036,7 @@ __metadata:
"@apidevtools/swagger-cli": ^4.0.4
"@koa/cors": ^3.3.0
"@koa/router": ^10.1.1
"@publicodes/api": ^1.0.0-beta.54
"@publicodes/api": ^1.0.0-beta.55
"@sentry/node": ^7.1.1
"@sentry/tracing": ^7.1.1
"@types/koa": ^2.13.4
@ -10053,7 +10053,7 @@ __metadata:
koa-static: ^5.0.0
modele-social: "workspace:^"
nodemon: ^2.0.16
publicodes: ^1.0.0-beta.54
publicodes: ^1.0.0-beta.55
rate-limiter-flexible: ^2.3.8
rimraf: ^3.0.2
swagger-ui-dist: ^4.11.1
@ -15664,9 +15664,9 @@ __metadata:
dependencies:
js-yaml: ^4.1.0
onchange: ^7.1.0
publicodes: =1.0.0-beta.54
publicodes: =1.0.0-beta.55
peerDependencies:
publicodes: ^1.0.0-beta.54
publicodes: ^1.0.0-beta.55
languageName: unknown
linkType: soft
@ -21278,9 +21278,9 @@ __metadata:
dependencies:
js-yaml: ^4.1.0
onchange: ^7.1.0
publicodes: ^1.0.0-beta.54
publicodes: ^1.0.0-beta.55
peerDependencies:
publicodes: ^1.0.0-beta.54
publicodes: ^1.0.0-beta.55
languageName: unknown
linkType: soft
@ -23665,28 +23665,28 @@ __metadata:
languageName: node
linkType: hard
"publicodes-react@npm:^1.0.0-beta.54":
version: 1.0.0-beta.54
resolution: "publicodes-react@npm:1.0.0-beta.54"
"publicodes-react@npm:^1.0.0-beta.55":
version: 1.0.0-beta.55
resolution: "publicodes-react@npm:1.0.0-beta.55"
dependencies:
styled-components: ^5.1.0
peerDependencies:
publicodes: 1.0.0-beta.40
react: ^17 || ^18
react-dom: ^17 || ^18
checksum: 104e489dabdd865f50110348ea778bfd896817b27497803115fe04e95b91c9f59fc1ab11bb54b1af5f6e9a093721ca2720f086f501a1c00acfac6987202ce2d1
checksum: c5472d2c71834ce021ecb6e107fb45663c786dcc947d3e5a1768638cddc61fd475925e8c54aaa41b4ebd3fc9e27bd4ad538ea4b28fd27cecff2db36bee8cb10d
languageName: node
linkType: hard
"publicodes@npm:=1.0.0-beta.54, publicodes@npm:^1.0.0-beta.54":
version: 1.0.0-beta.54
resolution: "publicodes@npm:1.0.0-beta.54"
"publicodes@npm:=1.0.0-beta.55, publicodes@npm:^1.0.0-beta.55":
version: 1.0.0-beta.55
resolution: "publicodes@npm:1.0.0-beta.55"
dependencies:
moo: ^0.5.1
nearley: ^2.19.2
peerDependencies:
"@types/mocha": ^9.0.0
checksum: 2a02cfa9e21e1aeb757c757f597ca3ece6d2c22fa863a3cf95b85c14238ff801e8d1a1357dcec03961b517da3154aedfe9ddeb58761c468c31aec6ae692f2e29
checksum: 280ea364ccde2a12e74357d300bf5a86d55f6d7acbf9ad38b6b82ef2ae86f4fad24d4ce167d1897a53f6d86b229a4b01ab4c9aeb3e2a8c5c4643c16fe12e52ee
languageName: node
linkType: hard
@ -25783,8 +25783,8 @@ __metadata:
markdown-to-jsx: ^7.1.7
modele-social: "workspace:^"
netlify-cli: ^10.6.3
publicodes: ^1.0.0-beta.54
publicodes-react: ^1.0.0-beta.54
publicodes: ^1.0.0-beta.55
publicodes-react: ^1.0.0-beta.55
react: ^17.0.0
react-colorful: ^5.5.1
react-dom: ^17.0.0