>
diff --git a/mon-entreprise/source/components/layout/NewsBanner.tsx b/mon-entreprise/source/components/layout/NewsBanner.tsx
index 2f71e0e65..7d309da27 100644
--- a/mon-entreprise/source/components/layout/NewsBanner.tsx
+++ b/mon-entreprise/source/components/layout/NewsBanner.tsx
@@ -1,7 +1,7 @@
import { useLocalStorage, writeStorage } from '@rehooks/local-storage'
+import Emoji from 'Components/utils/Emoji'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext } from 'react'
-import emoji from 'react-easy-emoji'
import { useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
import lastRelease from '../../data/last-release.json'
@@ -30,9 +30,10 @@ export default function NewsBanner() {
lastViewedRelease !== lastRelease.name && i18n.language === 'fr'
return showBanner ? (
-
+
{typeof explanations === 'string' ? (
+
)}
)
diff --git a/mon-entreprise/source/components/ui/Fonts.css b/mon-entreprise/source/components/ui/Fonts.css
index 1e94f39f7..f1d97215c 100644
--- a/mon-entreprise/source/components/ui/Fonts.css
+++ b/mon-entreprise/source/components/ui/Fonts.css
@@ -7,6 +7,7 @@
url('/fonts/roboto-v20-latin-regular.woff2') format('woff2'),
/* Chrome 26+, Opera 23+, Firefox 39+ */
url('/fonts/roboto-v20-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+ font-display: swap;
}
/* roboto-italic - latin */
@@ -18,6 +19,7 @@
url('/fonts/roboto-v20-latin-italic.woff2') format('woff2'),
/* Chrome 26+, Opera 23+, Firefox 39+ */
url('/fonts/roboto-v20-latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+ font-display: swap;
}
/* roboto-500 - latin */
@@ -29,6 +31,7 @@
url('/fonts/roboto-v20-latin-500.woff2') format('woff2'),
/* Chrome 26+, Opera 23+, Firefox 39+ */
url('/fonts/roboto-v20-latin-500.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+ font-display: swap;
}
/* montserrat-600 - latin */
@@ -40,4 +43,5 @@
url('/fonts/montserrat-v15-latin-600.woff2') format('woff2'),
/* Chrome 26+, Opera 23+, Firefox 39+ */
url('/fonts/montserrat-v15-latin-600.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+ font-display: swap;
}
diff --git a/mon-entreprise/source/components/ui/Layout.css b/mon-entreprise/source/components/ui/Layout.css
index b854a8b13..b92201c62 100644
--- a/mon-entreprise/source/components/ui/Layout.css
+++ b/mon-entreprise/source/components/ui/Layout.css
@@ -1,36 +1,37 @@
section {
padding: 1rem 0;
}
-
-.ui__.container {
- width: 100%;
- max-width: 850px;
- margin-right: auto;
- margin-left: auto;
- padding-right: 0.6rem;
- padding-left: 0.6rem;
-}
-.ui__.container .ui__.full-width {
- --margin: calc((850px - 100vw - 0.6rem) / 2);
- margin-right: var(--margin);
- margin-left: var(--margin);
-}
-@media (max-width: 850px) {
+@media screen {
+ .ui__.container {
+ width: 100%;
+ max-width: 850px;
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 0.6rem;
+ padding-left: 0.6rem;
+ }
.ui__.container .ui__.full-width {
- margin: 0 -0.6rem;
+ --margin: calc((850px - 100vw - 0.6rem) / 2);
+ margin-right: var(--margin);
+ margin-left: var(--margin);
+ }
+ @media (max-width: 850px) {
+ .ui__.container .ui__.full-width {
+ margin: 0 -0.6rem;
+ }
+ }
+
+ .ui__.container-and-side-block {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ }
+ .ui__.container-and-side-block > .container {
+ flex-shrink: 0;
}
}
-.ui__.container-and-side-block {
- display: flex;
- flex-direction: column;
- align-items: center;
-}
-.ui__.container-and-side-block > .container {
- flex-shrink: 0;
-}
-
-@media (min-width: 1200px) {
+@media screen and (min-width: 1200px) {
.ui__.container-and-side-block {
flex-direction: row;
align-items: flex-start;
@@ -38,23 +39,22 @@ section {
}
.ui__.side-block {
- margin-top: 1rem;
display: flex;
flex-direction: column;
}
-@media (max-width: 1200px) {
+@media screen and (max-width: 1200px) {
.ui__.side-block {
align-self: center;
}
}
-@media (min-width: 1200px) {
+@media screen and (min-width: 1200px) {
.ui__.side-block {
flex-grow: 0;
flex-shrink: 1;
flex: 1;
position: sticky;
- top: 1rem;
+ top: 0rem;
}
}
diff --git a/mon-entreprise/source/components/ui/SocialIcon.tsx b/mon-entreprise/source/components/ui/SocialIcon.tsx
index fa5ae1918..9433843ac 100644
--- a/mon-entreprise/source/components/ui/SocialIcon.tsx
+++ b/mon-entreprise/source/components/ui/SocialIcon.tsx
@@ -3,34 +3,24 @@ import { useContext } from 'react'
export const icons = {
facebook: {
- icon:
- 'M34.1,47V33.3h4.6l0.7-5.3h-5.3v-3.4c0-1.5,0.4-2.6,2.6-2.6l2.8,0v-4.8c-0.5-0.1-2.2-0.2-4.1-0.2 c-4.1,0-6.9,2.5-6.9,7V28H24v5.3h4.6V47H34.1z',
- mask:
- 'M0,0v64h64V0H0z M39.6,22l-2.8,0c-2.2,0-2.6,1.1-2.6,2.6V28h5.3l-0.7,5.3h-4.6V47h-5.5V33.3H24V28h4.6V24 c0-4.6,2.8-7,6.9-7c2,0,3.6,0.1,4.1,0.2V22z',
+ icon: 'M34.1,47V33.3h4.6l0.7-5.3h-5.3v-3.4c0-1.5,0.4-2.6,2.6-2.6l2.8,0v-4.8c-0.5-0.1-2.2-0.2-4.1-0.2 c-4.1,0-6.9,2.5-6.9,7V28H24v5.3h4.6V47H34.1z',
+ mask: 'M0,0v64h64V0H0z M39.6,22l-2.8,0c-2.2,0-2.6,1.1-2.6,2.6V28h5.3l-0.7,5.3h-4.6V47h-5.5V33.3H24V28h4.6V24 c0-4.6,2.8-7,6.9-7c2,0,3.6,0.1,4.1,0.2V22z',
},
twitter: {
- icon:
- 'M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z',
- mask:
- 'M0,0v64h64V0H0z M44.7,25.5c0,0.3,0,0.6,0,0.8C44.7,35,38.1,45,26.1,45c-3.7,0-7.2-1.1-10.1-2.9 c0.5,0.1,1,0.1,1.6,0.1c3.1,0,5.9-1,8.2-2.8c-2.9-0.1-5.3-2-6.1-4.6c0.4,0.1,0.8,0.1,1.2,0.1c0.6,0,1.2-0.1,1.7-0.2 c-3-0.6-5.3-3.3-5.3-6.4c0,0,0-0.1,0-0.1c0.9,0.5,1.9,0.8,3,0.8c-1.8-1.2-2.9-3.2-2.9-5.5c0-1.2,0.3-2.3,0.9-3.3 c3.2,4,8.1,6.6,13.5,6.9c-0.1-0.5-0.2-1-0.2-1.5c0-3.6,2.9-6.6,6.6-6.6c1.9,0,3.6,0.8,4.8,2.1c1.5-0.3,2.9-0.8,4.2-1.6 c-0.5,1.5-1.5,2.8-2.9,3.6c1.3-0.2,2.6-0.5,3.8-1C47.1,23.4,46,24.5,44.7,25.5z',
+ icon: 'M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z',
+ mask: 'M0,0v64h64V0H0z M44.7,25.5c0,0.3,0,0.6,0,0.8C44.7,35,38.1,45,26.1,45c-3.7,0-7.2-1.1-10.1-2.9 c0.5,0.1,1,0.1,1.6,0.1c3.1,0,5.9-1,8.2-2.8c-2.9-0.1-5.3-2-6.1-4.6c0.4,0.1,0.8,0.1,1.2,0.1c0.6,0,1.2-0.1,1.7-0.2 c-3-0.6-5.3-3.3-5.3-6.4c0,0,0-0.1,0-0.1c0.9,0.5,1.9,0.8,3,0.8c-1.8-1.2-2.9-3.2-2.9-5.5c0-1.2,0.3-2.3,0.9-3.3 c3.2,4,8.1,6.6,13.5,6.9c-0.1-0.5-0.2-1-0.2-1.5c0-3.6,2.9-6.6,6.6-6.6c1.9,0,3.6,0.8,4.8,2.1c1.5-0.3,2.9-0.8,4.2-1.6 c-0.5,1.5-1.5,2.8-2.9,3.6c1.3-0.2,2.6-0.5,3.8-1C47.1,23.4,46,24.5,44.7,25.5z',
},
linkedin: {
- icon:
- 'M20.4,44h5.4V26.6h-5.4V44z M23.1,18c-1.7,0-3.1,1.4-3.1,3.1c0,1.7,1.4,3.1,3.1,3.1 c1.7,0,3.1-1.4,3.1-3.1C26.2,19.4,24.8,18,23.1,18z M39.5,26.2c-2.6,0-4.4,1.4-5.1,2.8h-0.1v-2.4h-5.2V44h5.4v-8.6 c0-2.3,0.4-4.5,3.2-4.5c2.8,0,2.8,2.6,2.8,4.6V44H46v-9.5C46,29.8,45,26.2,39.5,26.2z',
- mask:
- 'M0,0v64h64V0H0z M25.8,44h-5.4V26.6h5.4V44z M23.1,24.3c-1.7,0-3.1-1.4-3.1-3.1c0-1.7,1.4-3.1,3.1-3.1 c1.7,0,3.1,1.4,3.1,3.1C26.2,22.9,24.8,24.3,23.1,24.3z M46,44h-5.4v-8.4c0-2,0-4.6-2.8-4.6c-2.8,0-3.2,2.2-3.2,4.5V44h-5.4V26.6 h5.2V29h0.1c0.7-1.4,2.5-2.8,5.1-2.8c5.5,0,6.5,3.6,6.5,8.3V44z',
+ icon: 'M20.4,44h5.4V26.6h-5.4V44z M23.1,18c-1.7,0-3.1,1.4-3.1,3.1c0,1.7,1.4,3.1,3.1,3.1 c1.7,0,3.1-1.4,3.1-3.1C26.2,19.4,24.8,18,23.1,18z M39.5,26.2c-2.6,0-4.4,1.4-5.1,2.8h-0.1v-2.4h-5.2V44h5.4v-8.6 c0-2.3,0.4-4.5,3.2-4.5c2.8,0,2.8,2.6,2.8,4.6V44H46v-9.5C46,29.8,45,26.2,39.5,26.2z',
+ mask: 'M0,0v64h64V0H0z M25.8,44h-5.4V26.6h5.4V44z M23.1,24.3c-1.7,0-3.1-1.4-3.1-3.1c0-1.7,1.4-3.1,3.1-3.1 c1.7,0,3.1,1.4,3.1,3.1C26.2,22.9,24.8,24.3,23.1,24.3z M46,44h-5.4v-8.4c0-2,0-4.6-2.8-4.6c-2.8,0-3.2,2.2-3.2,4.5V44h-5.4V26.6 h5.2V29h0.1c0.7-1.4,2.5-2.8,5.1-2.8c5.5,0,6.5,3.6,6.5,8.3V44z',
},
github: {
- icon:
- 'M32,16c-8.8,0-16,7.2-16,16c0,7.1,4.6,13.1,10.9,15.2 c0.8,0.1,1.1-0.3,1.1-0.8c0-0.4,0-1.4,0-2.7c-4.5,1-5.4-2.1-5.4-2.1c-0.7-1.8-1.8-2.3-1.8-2.3c-1.5-1,0.1-1,0.1-1 c1.6,0.1,2.5,1.6,2.5,1.6c1.4,2.4,3.7,1.7,4.7,1.3c0.1-1,0.6-1.7,1-2.1c-3.6-0.4-7.3-1.8-7.3-7.9c0-1.7,0.6-3.2,1.6-4.3 c-0.2-0.4-0.7-2,0.2-4.2c0,0,1.3-0.4,4.4,1.6c1.3-0.4,2.6-0.5,4-0.5c1.4,0,2.7,0.2,4,0.5c3.1-2.1,4.4-1.6,4.4-1.6 c0.9,2.2,0.3,3.8,0.2,4.2c1,1.1,1.6,2.5,1.6,4.3c0,6.1-3.7,7.5-7.3,7.9c0.6,0.5,1.1,1.5,1.1,3c0,2.1,0,3.9,0,4.4 c0,0.4,0.3,0.9,1.1,0.8C43.4,45.1,48,39.1,48,32C48,23.2,40.8,16,32,16z',
- mask:
- 'M0,0v64h64V0H0z M37.1,47.2c-0.8,0.2-1.1-0.3-1.1-0.8c0-0.5,0-2.3,0-4.4c0-1.5-0.5-2.5-1.1-3 c3.6-0.4,7.3-1.7,7.3-7.9c0-1.7-0.6-3.2-1.6-4.3c0.2-0.4,0.7-2-0.2-4.2c0,0-1.3-0.4-4.4,1.6c-1.3-0.4-2.6-0.5-4-0.5 c-1.4,0-2.7,0.2-4,0.5c-3.1-2.1-4.4-1.6-4.4-1.6c-0.9,2.2-0.3,3.8-0.2,4.2c-1,1.1-1.6,2.5-1.6,4.3c0,6.1,3.7,7.5,7.3,7.9 c-0.5,0.4-0.9,1.1-1,2.1c-0.9,0.4-3.2,1.1-4.7-1.3c0,0-0.8-1.5-2.5-1.6c0,0-1.6,0-0.1,1c0,0,1,0.5,1.8,2.3c0,0,0.9,3.1,5.4,2.1 c0,1.3,0,2.3,0,2.7c0,0.4-0.3,0.9-1.1,0.8C20.6,45.1,16,39.1,16,32c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16 C48,39.1,43.4,45.1,37.1,47.2z',
+ icon: 'M32,16c-8.8,0-16,7.2-16,16c0,7.1,4.6,13.1,10.9,15.2 c0.8,0.1,1.1-0.3,1.1-0.8c0-0.4,0-1.4,0-2.7c-4.5,1-5.4-2.1-5.4-2.1c-0.7-1.8-1.8-2.3-1.8-2.3c-1.5-1,0.1-1,0.1-1 c1.6,0.1,2.5,1.6,2.5,1.6c1.4,2.4,3.7,1.7,4.7,1.3c0.1-1,0.6-1.7,1-2.1c-3.6-0.4-7.3-1.8-7.3-7.9c0-1.7,0.6-3.2,1.6-4.3 c-0.2-0.4-0.7-2,0.2-4.2c0,0,1.3-0.4,4.4,1.6c1.3-0.4,2.6-0.5,4-0.5c1.4,0,2.7,0.2,4,0.5c3.1-2.1,4.4-1.6,4.4-1.6 c0.9,2.2,0.3,3.8,0.2,4.2c1,1.1,1.6,2.5,1.6,4.3c0,6.1-3.7,7.5-7.3,7.9c0.6,0.5,1.1,1.5,1.1,3c0,2.1,0,3.9,0,4.4 c0,0.4,0.3,0.9,1.1,0.8C43.4,45.1,48,39.1,48,32C48,23.2,40.8,16,32,16z',
+ mask: 'M0,0v64h64V0H0z M37.1,47.2c-0.8,0.2-1.1-0.3-1.1-0.8c0-0.5,0-2.3,0-4.4c0-1.5-0.5-2.5-1.1-3 c3.6-0.4,7.3-1.7,7.3-7.9c0-1.7-0.6-3.2-1.6-4.3c0.2-0.4,0.7-2-0.2-4.2c0,0-1.3-0.4-4.4,1.6c-1.3-0.4-2.6-0.5-4-0.5 c-1.4,0-2.7,0.2-4,0.5c-3.1-2.1-4.4-1.6-4.4-1.6c-0.9,2.2-0.3,3.8-0.2,4.2c-1,1.1-1.6,2.5-1.6,4.3c0,6.1,3.7,7.5,7.3,7.9 c-0.5,0.4-0.9,1.1-1,2.1c-0.9,0.4-3.2,1.1-4.7-1.3c0,0-0.8-1.5-2.5-1.6c0,0-1.6,0-0.1,1c0,0,1,0.5,1.8,2.3c0,0,0.9,3.1,5.4,2.1 c0,1.3,0,2.3,0,2.7c0,0.4-0.3,0.9-1.1,0.8C20.6,45.1,16,39.1,16,32c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16 C48,39.1,43.4,45.1,37.1,47.2z',
},
email: {
- icon:
- 'M17,22v20h30V22H17z M41.1,25L32,32.1L22.9,25H41.1z M20,39V26.6l12,9.3l12-9.3V39H20z',
- mask:
- 'M41.1,25H22.9l9.1,7.1L41.1,25z M44,26.6l-12,9.3l-12-9.3V39h24V26.6z M0,0v64h64V0H0z M47,42H17V22h30V42z',
+ icon: 'M17,22v20h30V22H17z M41.1,25L32,32.1L22.9,25H41.1z M20,39V26.6l12,9.3l12-9.3V39H20z',
+ mask: 'M41.1,25H22.9l9.1,7.1L41.1,25z M44,26.6l-12,9.3l-12-9.3V39h24V26.6z M0,0v64h64V0H0z M47,42H17V22h30V42z',
},
}
diff --git a/mon-entreprise/source/components/ui/Typography.css b/mon-entreprise/source/components/ui/Typography.css
index bca055b70..b419fdab8 100644
--- a/mon-entreprise/source/components/ui/Typography.css
+++ b/mon-entreprise/source/components/ui/Typography.css
@@ -1,26 +1,32 @@
html {
transition: none !important;
- line-height: 1.7rem;
-}
-@media (max-width: 500px) {
- html {
- font-size: 0.9em;
- }
-}
-@media (min-width: 500px) and (max-width: 1920px) {
- html {
- font-size: 1.1em;
- }
-}
-@media (min-width: 1920px) {
- html {
- font-size: 1.16em;
- }
}
@media print {
html {
- font-size: 1em;
+ line-height: 1.5em;
+ }
+}
+
+@media screen {
+ html {
+ line-height: 1.7em;
+ }
+}
+@media screen and (max-width: 500px) {
+ html {
+ font-size: 0.9em;
+ }
+}
+
+@media screen and (min-width: 500px) and (max-width: 1920px) {
+ html {
+ font-size: 1.1em;
+ }
+}
+@media screen and (min-width: 1920px) {
+ html {
+ font-size: 1.16em;
}
}
@@ -31,33 +37,41 @@ body {
font-family: 'Roboto', sans-serif;
}
-h1 {
+h1:not(.h),
+.ui__.h.h1 {
margin-top: 2rem;
margin-bottom: 1rem;
font-size: 1.9rem;
line-height: 2.6rem;
}
-h2 {
+h2:not(.h),
+.ui__.h.h2 {
margin-top: 2rem;
margin-bottom: 1rem;
font-size: 1.4rem;
+ line-height: 2.1rem;
}
-h3 {
+
+h3:not(.h),
+.ui__.h.h3 {
margin-top: 1rem;
margin-bottom: 0.6rem;
font-size: 1.2rem;
}
-h4 {
+h4:not(.h),
+.ui__.h.h4 {
margin-top: 0.6rem;
margin-bottom: 0.4rem;
font-size: 1rem;
}
-h5 {
+h5:not(.h),
+.ui__.h.h5 {
margin-top: 0.4rem;
margin-bottom: 0.2rem;
font-size: 0.9rem;
}
-h6 {
+h6:not(.h),
+.ui__.h.h6 {
margin-top: 0.4rem;
margin-bottom: 0.2rem;
font-size: 0.9rem;
diff --git a/mon-entreprise/source/components/ui/WarningBlock.tsx b/mon-entreprise/source/components/ui/WarningBlock.tsx
index 36a009773..2eefbd4f6 100644
--- a/mon-entreprise/source/components/ui/WarningBlock.tsx
+++ b/mon-entreprise/source/components/ui/WarningBlock.tsx
@@ -1,6 +1,6 @@
+import Emoji from 'Components/utils/Emoji'
import { usePersistingState } from 'Components/utils/persistState'
import { ReactNode } from 'react'
-import emoji from 'react-easy-emoji'
import { Trans } from 'react-i18next'
type WarningProps = {
@@ -16,8 +16,8 @@ export default function Warning({ localStorageKey, children }: WarningProps) {
margin-bottom: 1rem;
`}
>
-
- {emoji('🚩 ')}
+
+
Avant de commencer...
@@ -40,7 +40,7 @@ export default function Warning({ localStorageKey, children }: WarningProps) {
css="padding-top: 1rem; padding-bottom: 0.4rem"
>
{children}
-
+
fold(true)}
diff --git a/mon-entreprise/source/components/ui/animate.tsx b/mon-entreprise/source/components/ui/animate.tsx
index b685e6c82..c01b68ee4 100644
--- a/mon-entreprise/source/components/ui/animate.tsx
+++ b/mon-entreprise/source/components/ui/animate.tsx
@@ -1,4 +1,5 @@
-import React, { useEffect, useState } from 'react'
+import { DisableAnimationContext } from 'Components/utils/DisableAnimationContext'
+import React, { useContext, useEffect, useState } from 'react'
import {
animated,
config as configPresets,
@@ -6,7 +7,6 @@ import {
Spring,
SpringConfig,
Trail,
- Transition,
} from 'react-spring/renderprops'
type Props = {
@@ -18,115 +18,102 @@ type Props = {
}
// Todo : better animate with fromRight on desktop
-export const fromBottom = ({
+export function FromBottom({
children,
config = configPresets.stiff,
style: inheritedStyle = {},
delay = 0,
-}: Props) => (
- i) ?? []}
- native={true}
- delay={delay}
- config={config}
- from={{ opacity: 0, y: 10 }}
- to={{ opacity: 1, y: 0 }}
- items={children}
- >
- {(item) => ({ y, ...style }) => (
-
- y !== 0 ? `translate3d(0, ${y}px,0)` : 'none'
- ),
- ...style,
- ...inheritedStyle,
- }}
- >
- {item}
-
- )}
-
-)
-export const fromTop = ({
+}: Props) {
+ if (useContext(DisableAnimationContext)) {
+ return <>{children}>
+ }
+ return (
+ i) ?? []}
+ native={true}
+ delay={delay}
+ config={config}
+ from={{ opacity: 0, y: 10 }}
+ to={{ opacity: 1, y: 0 }}
+ items={children}
+ >
+ {(item) =>
+ ({ y, ...style }) =>
+ (
+
+ y !== 0 ? `translate3d(0, ${y}px,0)` : 'none'
+ ),
+ ...style,
+ ...inheritedStyle,
+ }}
+ >
+ {item}
+
+ )}
+
+ )
+}
+export function FromTop({
children,
config = configPresets.stiff,
style: inheritedStyle = {},
delay = 0,
-}: Props) => (
- i) ?? []}
- native={true}
- delay={delay}
- config={config}
- from={{ opacity: 0, y: -20 }}
- to={{ opacity: 1, y: 0 }}
- items={children}
- >
- {(item) => ({ y, ...style }) => (
-
- y !== 0 ? `translate3d(0, ${y}px,0)` : 'none'
- ),
- ...style,
- ...inheritedStyle,
- }}
- >
- {item}
-
- )}
-
-)
-
-export const leftToRight = ({
- children,
- config = configPresets.stiff,
- delay = 0,
-}: Props) => (
-
- {(item) => (style) => {item} }
-
-)
-
-export const fadeIn = ({
+}: Props) {
+ if (useContext(DisableAnimationContext)) {
+ return <>{children}>
+ }
+ return (
+ i) ?? []}
+ native={true}
+ delay={delay}
+ config={config}
+ from={{ opacity: 0, y: -20 }}
+ to={{ opacity: 1, y: 0 }}
+ items={children}
+ >
+ {(item) =>
+ ({ y, ...style }) =>
+ (
+
+ y !== 0 ? `translate3d(0, ${y}px,0)` : 'none'
+ ),
+ ...style,
+ ...inheritedStyle,
+ }}
+ >
+ {item}
+
+ )}
+
+ )
+}
+export const FadeIn = ({
children,
config = configPresets.default,
delay = 0,
-}: Props) => (
-
- {(style) => {children} }
-
-)
+}: Props) =>
+ useContext(DisableAnimationContext) ? (
+ <>{children}>
+ ) : (
+
+ {(style) => {children} }
+
+ )
-export function appear({
+export function Appear({
children,
className,
unless = false,
@@ -134,13 +121,13 @@ export function appear({
delay = 0,
style,
}: Props & { unless?: boolean }) {
- // TODO: We should rename this function Appear
- // eslint-disable-next-line react-hooks/rules-of-hooks
const [show, setShow] = useState(unless)
- // eslint-disable-next-line react-hooks/rules-of-hooks
useEffect(() => {
window.setTimeout(() => setShow(true), 0)
}, [])
+ if (useContext(DisableAnimationContext)) {
+ return <>{children}>
+ }
return (
)
}
-
-export default {
- appear,
- fromBottom,
- leftToRight,
- fromTop,
- fadeIn,
-}
diff --git a/mon-entreprise/source/components/ui/breakpoints.ts b/mon-entreprise/source/components/ui/breakpoints.ts
new file mode 100644
index 000000000..17175b5bc
--- /dev/null
+++ b/mon-entreprise/source/components/ui/breakpoints.ts
@@ -0,0 +1,7 @@
+type Screen = 'phone' | 'tablet' | 'desktop'
+
+export const breakpoints: Record = {
+ phone: '0px',
+ tablet: '850px',
+ desktop: '1200px',
+}
diff --git a/mon-entreprise/source/components/ui/index.css b/mon-entreprise/source/components/ui/index.css
index b44805e3a..3333053d8 100644
--- a/mon-entreprise/source/components/ui/index.css
+++ b/mon-entreprise/source/components/ui/index.css
@@ -68,12 +68,6 @@ blockquote {
border-radius: 0.3rem;
}
-.ui__.center-flex {
- display: flex;
- justify-content: center;
- flex-wrap: wrap;
-}
-
.ui__.hide {
display: none;
}
@@ -96,6 +90,7 @@ span.ui__.enumeration:not(:last-of-type)::after {
font-size: 85%;
line-height: initial;
padding: 0.4rem 0.6rem;
+ white-space: nowrap;
font-weight: bold;
color: white !important;
background: var(--darkColor);
@@ -213,3 +208,29 @@ input.ui__::placeholder {
opacity: 0.6;
color: grey;
}
+@media screen {
+ .ui__.screen-display-none {
+ display: none !important;
+ }
+}
+
+@media print {
+ .ui__.print-display-none {
+ display: none !important;
+ }
+ .ui__.print-background-force {
+ color-adjust: exact !important;
+ }
+
+ .ui__.toggle input[type='radio']:checked ~ * {
+ box-shadow: none;
+ }
+
+ body {
+ margin: 00mm;
+ }
+}
+@page {
+ margin-top: 0.7cm;
+ margin-bottom: 0.7cm;
+}
diff --git a/mon-entreprise/source/components/utils/DisableAnimationContext.tsx b/mon-entreprise/source/components/utils/DisableAnimationContext.tsx
new file mode 100644
index 000000000..193180943
--- /dev/null
+++ b/mon-entreprise/source/components/utils/DisableAnimationContext.tsx
@@ -0,0 +1,47 @@
+import React, { createContext, useEffect, useState } from 'react'
+import { flushSync } from 'react-dom'
+
+export const DisableAnimationContext = createContext(false)
+
+const useIsPrintContext = () => {
+ const [isPrintContext, setPrintContext] = useState(false)
+ useEffect(() => {
+ const matchListener = (matchMedia: MediaQueryListEvent) => {
+ flushSync(() => setPrintContext(matchMedia.matches))
+ }
+ const matchMediaPrint = window.matchMedia('print')
+
+ setPrintContext(matchMediaPrint.matches)
+ matchMediaPrint.addEventListener('change', matchListener)
+ return () => {
+ matchMediaPrint.removeEventListener('change', matchListener)
+ }
+ }, [])
+
+ // Fix for Firefox (see https://bugzilla.mozilla.org/show_bug.cgi?id=774398)
+ useEffect(() => {
+ window.onbeforeprint = () => {
+ flushSync(() => {
+ setPrintContext(true)
+ })
+ }
+ return () => {
+ window.onbeforeprint = null
+ }
+ }, [setPrintContext])
+
+ return isPrintContext
+}
+
+export function DisableAnimationOnPrintProvider({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ const isPrintContext = useIsPrintContext()
+ return (
+
+ {children}
+
+ )
+}
diff --git a/mon-entreprise/source/components/utils/Emoji.tsx b/mon-entreprise/source/components/utils/Emoji.tsx
index 73ec4d765..37358f454 100644
--- a/mon-entreprise/source/components/utils/Emoji.tsx
+++ b/mon-entreprise/source/components/utils/Emoji.tsx
@@ -1,8 +1,28 @@
import emojiFn from 'react-easy-emoji'
+import { useTranslation } from 'react-i18next'
type PropType = {
- emoji: string
+ emoji: string | undefined
}
+// This custom component has several advantages over the direct use of the
+// `emojiFn` provided by `react-easy-emoji` :
+// - allow to configure the URL to self host twemoji images in production
+// - using a real React component works better with the translation scripts
export default function Emoji({ emoji }: PropType) {
- return emojiFn(emoji)
+ const language = useTranslation().i18n.language
+
+ const siteUrl =
+ language === 'fr' ? process.env.FR_BASE_URL : process.env.EN_BASE_URL
+ if (!emoji) {
+ return null
+ }
+ return emojiFn(
+ emoji,
+ process.env.NODE_ENV === 'production'
+ ? {
+ baseUrl: siteUrl + '/twemoji/2/',
+ ext: '.png',
+ }
+ : ({} as any)
+ )
}
diff --git a/mon-entreprise/source/components/utils/EngineContext.tsx b/mon-entreprise/source/components/utils/EngineContext.tsx
index 16318ce92..d829b710e 100644
--- a/mon-entreprise/source/components/utils/EngineContext.tsx
+++ b/mon-entreprise/source/components/utils/EngineContext.tsx
@@ -1,14 +1,12 @@
-import Engine from 'publicodes'
-import React, { createContext, useContext } from 'react'
import { DottedName } from 'modele-social'
+import Engine, { Rule } from 'publicodes'
+import React, { createContext, useContext } from 'react'
import i18n from '../../locales/i18n'
-export const EngineContext = createContext(new Engine({}))
-export const EngineProvider = EngineContext.Provider
+export type Rules = Record
const unitsTranslations = Object.entries(i18n.getResourceBundle('fr', 'units'))
-
-export const engineOptions = {
+const engineOptions = {
getUnitKey(unit: string): string {
const key = unitsTranslations
.find(([, trans]) => trans === unit)?.[0]
@@ -19,6 +17,12 @@ export const engineOptions = {
return i18n?.t(`units:${unit}`, { count })
},
}
+export function engineFactory(rules: Rules) {
+ return new Engine(rules, engineOptions)
+}
+
+export const EngineContext = createContext(new Engine())
+export const EngineProvider = EngineContext.Provider
export function useEngine(): Engine {
return useContext(EngineContext) as Engine
diff --git a/mon-entreprise/source/components/utils/colors.tsx b/mon-entreprise/source/components/utils/colors.tsx
index 957d0dd43..a6ed0f0ff 100644
--- a/mon-entreprise/source/components/utils/colors.tsx
+++ b/mon-entreprise/source/components/utils/colors.tsx
@@ -49,9 +49,8 @@ const generateDarkenVariations = (
const deriveAnalogousPalettes = (hex: string) => {
const [h, s, l] = convert.hex.hsl(hex.split('#')[1])
return [
- generateDarkenVariations(4, [(h - 45) % 360, 0.75 * s, l]),
- generateDarkenVariations(4, [(h + 45) % 360, 0.75 * s, l]),
- generateDarkenVariations(4, [(h + 90) % 360, 0.75 * s, l]),
+ generateDarkenVariations(2, [h, s, 50]),
+ generateDarkenVariations(2, [(h + 95) % 360, s, 50]),
]
}
diff --git a/mon-entreprise/source/components/utils/embeddedContext.ts b/mon-entreprise/source/components/utils/embeddedContext.ts
deleted file mode 100644
index aa0c62217..000000000
--- a/mon-entreprise/source/components/utils/embeddedContext.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { createContext } from 'react'
-export const IsEmbeddedContext = createContext(false)
diff --git a/mon-entreprise/source/components/utils/embeddedContext.js b/mon-entreprise/source/components/utils/embeddedContext.tsx
similarity index 100%
rename from mon-entreprise/source/components/utils/embeddedContext.js
rename to mon-entreprise/source/components/utils/embeddedContext.tsx
diff --git a/mon-entreprise/source/components/utils/markdown.tsx b/mon-entreprise/source/components/utils/markdown.tsx
index fc3404e6f..a7bcd2ef3 100644
--- a/mon-entreprise/source/components/utils/markdown.tsx
+++ b/mon-entreprise/source/components/utils/markdown.tsx
@@ -1,9 +1,9 @@
-import React, { Suspense, useContext, useEffect } from 'react'
-import emoji from 'react-easy-emoji'
+import React, { useContext, useEffect } from 'react'
import ReactMarkdown, { ReactMarkdownProps } from 'react-markdown'
import { useLocation } from 'react-router-dom'
import { HashLink as Link } from 'react-router-hash-link'
import { SiteNameContext } from '../../Provider'
+import Emoji from './Emoji'
const internalURLs = {
'mon-entreprise.fr': 'mon-entreprise',
@@ -57,7 +57,7 @@ export function LinkRenderer({
)
}
const TextRenderer = ({ children }: { children: string }) => (
- <>{emoji(children)}>
+
)
type MarkdownProps = ReactMarkdownProps & {
@@ -86,7 +86,7 @@ const CodeBlock = ({
target="_blank"
css="position: absolute; bottom: 5px; right: 10px; color: white !important;"
>
- {emoji('⚡')} Lancer le calcul
+ Lancer le calcul
)}
@@ -132,7 +132,7 @@ const flatMapChildren = (children: React.ReactNode): Array
=> {
: child.props?.value ?? flatMapChildren(child.props?.children)
)
}
-function useScrollToHash() {
+export function useScrollToHash() {
useEffect(() => {
const { hash } = window.location
if (hash) {
diff --git a/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts b/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts
index 157d9c140..7b081060e 100644
--- a/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts
+++ b/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts
@@ -13,6 +13,11 @@ export default function ({
const [wasOnScreen, setWasOnScreen] = useState(false)
useEffect(() => {
+ if (typeof IntersectionObserver === 'undefined') {
+ setWasOnScreen(true) // No effect for old browsers
+ return
+ }
+
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
@@ -36,7 +41,7 @@ export default function ({
return () => {
node && unobserve && observer.unobserve(node)
}
- }, [root, rootMargin, threshold, ref.current])
+ }, [root, rootMargin, threshold, unobserve])
return [ref, wasOnScreen]
}
diff --git a/mon-entreprise/source/components/utils/useNextQuestion.tsx b/mon-entreprise/source/components/utils/useNextQuestion.tsx
index 4c9fb3e71..d83849dcc 100644
--- a/mon-entreprise/source/components/utils/useNextQuestion.tsx
+++ b/mon-entreprise/source/components/utils/useNextQuestion.tsx
@@ -95,7 +95,7 @@ export function getNextQuestions(
nextSteps = nextSteps.filter(
(step) =>
(!whitelist.length || whitelist.some((name) => step.startsWith(name))) &&
- (!blacklist.length || !blacklist.some((name) => step.startsWith(name)))
+ (!blacklist.length || !blacklist.some((name) => step === name))
)
const lastStep = last(answeredQuestions)
diff --git a/mon-entreprise/source/components/utils/useSearchParamsSimulationSharing.ts b/mon-entreprise/source/components/utils/useSearchParamsSimulationSharing.ts
index af49e96b6..f50d4c339 100644
--- a/mon-entreprise/source/components/utils/useSearchParamsSimulationSharing.ts
+++ b/mon-entreprise/source/components/utils/useSearchParamsSimulationSharing.ts
@@ -115,10 +115,12 @@ export const cleanSearchParams = (
export const getRulesParamNames = (
parsedRules: ParsedRules
): [DottedName, ParamName][] =>
- (Object.entries(parsedRules) as [
- DottedName,
- { rawNode: { 'identifiant court'?: ShortName } }
- ][]).map(([dottedName, ruleNode]) => [
+ (
+ Object.entries(parsedRules) as [
+ DottedName,
+ { rawNode: { 'identifiant court'?: ShortName } }
+ ][]
+ ).map(([dottedName, ruleNode]) => [
dottedName,
ruleNode.rawNode['identifiant court'] || dottedName,
])
diff --git a/mon-entreprise/source/entry.en.tsx b/mon-entreprise/source/entry.en.tsx
index 3b28e2e2e..209e25c7e 100644
--- a/mon-entreprise/source/entry.en.tsx
+++ b/mon-entreprise/source/entry.en.tsx
@@ -8,6 +8,7 @@ import i18next from './locales/i18n'
import ruleTranslations from './locales/rules-en.yaml'
import translateRules from './locales/translateRules'
import translations from './locales/ui-en.yaml'
+import './sentry'
i18next.addResourceBundle('en', 'translation', translations)
i18next.changeLanguage('en')
diff --git a/mon-entreprise/source/entry.fr.tsx b/mon-entreprise/source/entry.fr.tsx
index 2478e7287..46ee989c2 100644
--- a/mon-entreprise/source/entry.fr.tsx
+++ b/mon-entreprise/source/entry.fr.tsx
@@ -6,6 +6,7 @@ import { hot } from 'react-hot-loader/root'
import 'regenerator-runtime/runtime'
import App from './App'
import i18next from './locales/i18n'
+import './sentry'
i18next.changeLanguage('fr')
diff --git a/mon-entreprise/source/iframe-integration-script.js b/mon-entreprise/source/iframe-integration-script.js
index 52af130ca..daee799a6 100644
--- a/mon-entreprise/source/iframe-integration-script.js
+++ b/mon-entreprise/source/iframe-integration-script.js
@@ -26,6 +26,7 @@ const iframeAttributes = {
id: 'simulateurEmbauche',
src,
style: 'border: none; width: 100%; display: block; height: 500px',
+ allow: 'clipboard-write',
allowfullscreen: true,
webkitallowfullscreen: true,
mozallowfullscreen: true,
diff --git a/mon-entreprise/source/locales/.editorconfig b/mon-entreprise/source/locales/.editorconfig
new file mode 100644
index 000000000..920b782d1
--- /dev/null
+++ b/mon-entreprise/source/locales/.editorconfig
@@ -0,0 +1,7 @@
+[*.yaml]
+indent_style = unset
+indent_size = unset
+end_of_line = unset
+insert_final_newline = unset
+max_line_length = unset
+trim_trailing_whitespace = unset
diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml
index 79dee3b83..3f958f8f0 100644
--- a/mon-entreprise/source/locales/rules-en.yaml
+++ b/mon-entreprise/source/locales/rules-en.yaml
@@ -10,44 +10,43 @@ SMIC temps plein . net imposable:
titre.en: '[automatic] minimum net taxable income'
titre.fr: SMIC net imposable
aide déclaration revenu indépendant 2020:
- description.en: '[automatic] These rules calculate the amounts claimed in the
- 2021 social and tax returns of self-employed persons on 2020 income'
- description.fr:
- Ces règles calculent les montants demandés dans les déclarations
- sociale et fiscale des indépendants de 2021 sur les revenus 2020
+ description.en: '[automatic] These rules calculate the amounts claimed on the
+ 2021 self-employed tax return on 2020 income.'
+ description.fr: Ces règles calculent les montants demandés dans la déclaration
+ de revenu des indépendants de 2021 sur les revenus 2020.
titre.en: '[automatic] assistance declaration independent income 2020'
titre.fr: aide déclaration revenu indépendant 2020
aide déclaration revenu indépendant 2020 . ACRE:
description.en: >-
- [automatic] The aid for the creation or takeover of a business (Acre)
- consists of a partial exemption from social security contributions, known as
- the exemption for the start of activity for 12 months.
+ [automatic] The aid for creating or taking over a business (Acre) consists
+ of a partial exemption from social security charges, known as the start-up
+ exemption, for 12 months.
It is automatic for companies and sole proprietorships (under certain conditions, such as not having benefited from it in the last three years).
- Moreover, for classic self-employed workers it is necessary to respect the condition of being considered as a creator in the sense of [article R131-3 of the Social Security Code](https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000034727582&cidTexte=LEGITEXT000006073189&dateTexte=20170511).
+ In addition, for classic self-employed workers it is necessary to respect the condition of being considered as a creator in the sense of [article R131-3 of the Social Security Code](https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000034727582&cidTexte=LEGITEXT000006073189&dateTexte=20170511).
- ### Details
+ Details
- This exemption covers all contributions except for the supplementary pension contribution and the CSG/CRDS and CFP contributions.
+ This exemption applies to all contributions except for the supplementary pension contribution and the CSG/CRDS and CFP contributions.
- This exemption may be total, partial or nil depending on the income declared:
+ This exemption can be total, partial or zero depending on the income declared:
- - If the income is less than 75% of the PASS, the exemption is total.
+ - If the income is less than 75% of the PASS the exemption is total.
- - If the income is between 75% and 100% of the PASS, the exemption is degressive.
+ - If the income is between 75% and 100% of the PASS the exemption is degressive.
- - If the income is higher than 100% of the PASS, the exemption is nil.
+ - If the income is higher than 100% of the PASS the exemption is nil.
description.fr: >-
L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une
exonération partielle de charges sociales, dite exonération de début
- d'activité pendant 12 mois.
+ d'activité pendant 12 mois.
Elle est automatique pour les sociétés et les entreprises individuelles (sous certaines conditions, comme par exemple ne pas en avoir bénéficié les trois dernières années).
@@ -67,46 +66,502 @@ aide déclaration revenu indépendant 2020 . ACRE:
- Si le revenu est inférieur à 75% du PASS l’exonération est totale.
- - Si le revenu est compris entre 75% et 100% du PASS l’exonération est dégressive.
+ - Si le revenu est compris entre 75% et 100% du PASS l’exonération est dégressive.
- Si le revenu est supérieur à 100% du PASS l’exonération est nulle.
question.en: '[automatic] Does your company benefit from ACRE?'
question.fr: Votre entreprise bénéficie-t-elle de l'ACRE ?
titre.en: '[automatic] ACRE'
titre.fr: ACRE
-aide déclaration revenu indépendant 2020 . CFP:
- résumé.en: '[automatic] contribution to vocational training [D]'
- résumé.fr: contribution à la formation professionnelle [D]
- titre.en: '[automatic] PSC'
- titre.fr: CFP
-aide déclaration revenu indépendant 2020 . CSG déductible:
- résumé.en: '[automatic] [B]'
- résumé.fr: '[B]'
- titre.en: '[automatic] deductible MSA'
- titre.fr: CSG déductible
aide déclaration revenu indépendant 2020 . PRCI:
titre.en: '[automatic] PRCI'
titre.fr: PRCI
aide déclaration revenu indépendant 2020 . SMIC 2020:
titre.en: '[automatic] MINIMUM WAGE 2020'
titre.fr: SMIC 2020
-aide déclaration revenu indépendant 2020 . assiette sociale:
- résumé.en: '[automatic] for your information [A - (B + C + D)].'
- résumé.fr: pour information [A - (B + C + D)]
+aide déclaration revenu indépendant 2020 . comptabilité:
+ question.en: '[automatic] What method of accounting management is used for the company?'
+ question.fr: Quel méthode de gestion de la comptabilité est utilisée pour l'entreprise ?
+ titre.en: '[automatic] controlled declaration regime'
+ titre.fr: régime de la déclaration contrôlée
+aide déclaration revenu indépendant 2020 . comptabilité . engagement:
+ titre.en: '[automatic] accrual accounting'
+ titre.fr: comptabilité d'engagement
+aide déclaration revenu indépendant 2020 . comptabilité . trésorerie:
+ titre.en: '[automatic] cash accounting'
+ titre.fr: comptabilité de trésorerie
+aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles:
+ description.en: '[automatic] Deductible compulsory contributions, useful for
+ calculating the CSG/CRDS base'
+ description.fr: Cotisations obligatoires déductibles, utile pour calculer
+ l'assiette de la CSG/CRDS
+ titre.en: '[automatic] deductible mandatory contributions'
+ titre.fr: cotisations obligatoires déductibles
+aide déclaration revenu indépendant 2020 . cotisations payées:
+ titre.en: '[automatic] contributions paid'
+ titre.fr: cotisations payées
+aide déclaration revenu indépendant 2020 . cotisations payées . CRDS:
+ description.en: >
+ [automatic] You can find this amount in your personal Urssaf space. Here are
+ the steps to follow:
+
+
+ 1. Log on to your [Urssaf personal space](https://www.urssaf.fr/portail/home.html)
+
+ 2. Go to the "Document" tab
+
+ 3. Select "request a certificate".
+
+ 3. Then, "CSG/CRDS certificate".
+
+ 4. Enter in this field the total of the column "Amount not deductible: CRDS" (last line)
+ description.fr: >
+ Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici
+ la marche à suivre :
+
+
+ 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html)
+
+ 2. Allez dans l'onglet "Document"
+
+ 3. Selectionnez "demander une attestation"
+
+ 3. Puis, "attestation CSG/CRDS"
+
+ 4. Reportez dans ce champs le total de la colonne "Montant non déductible : CRDS" (dernière ligne)
+ question.en: '[automatic] What is the total amount of CRDS paid this year?'
+ question.fr: Quel est le montant total de CRDS payé cette année ?
+ titre.en: '[automatic] CRDS'
+ titre.fr: CRDS
+aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductible:
+ description.en: >
+ [automatic] You can find this amount in your personal Urssaf space. Here are
+ the steps to follow:
+
+
+ 1. Log on to your [Urssaf personal space](https://www.urssaf.fr/portail/home.html)
+
+ 2. Go to the "Document" tab
+
+ 3. Select "request a certificate".
+
+ 3. Then, "CSG/CRDS certificate".
+
+ 4. Enter in this field the total of the column "Amount deductible CSG" (last line) (last line)
+ description.fr: >
+ Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici
+ la marche à suivre :
+
+
+ 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html)
+
+ 2. Allez dans l'onglet "Document"
+
+ 3. Selectionnez "demander une attestation"
+
+ 3. Puis, "attestation CSG/CRDS"
+
+ 4. Reportez dans ce champs le total de la colonne "Montant déductible CSG" (dernière ligne)
+ question.en: '[automatic] What is the total amount of deductible CSG paid this year?'
+ question.fr: Quel est le montant total de CSG déductible payé cette année ?
+ titre.en: '[automatic] Deductible CSG'
+ titre.fr: CSG déductible
+aide déclaration revenu indépendant 2020 . cotisations payées . CSG non déductible:
+ description.en: >
+ [automatic] You can find this amount in your personal Urssaf space. Here are
+ the steps to follow:
+
+
+ 1. Log on to your [Urssaf personal space](https://www.urssaf.fr/portail/home.html)
+
+ 2. Go to the "Document" tab
+
+ 3. Select "request a certificate".
+
+ 3. Then, "CSG/CRDS certificate".
+
+ 4. Enter in this field the total of the column "Amount not deductible: CSG" (last line) (last line)
+ description.fr: >
+ Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici
+ la marche à suivre :
+
+
+ 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html)
+
+ 2. Allez dans l'onglet "Document"
+
+ 3. Selectionnez "demander une attestation"
+
+ 3. Puis, "attestation CSG/CRDS"
+
+ 4. Reportez dans ce champs le total de la colonne "Montant non déductible : CSG" (dernière ligne)
+ question.en: '[automatic] What is the total amount of non-deductible CSG paid this year?'
+ question.fr: Quel est le montant total de CSG non déductible payé cette année ?
+ titre.en: '[automatic] Non-deductible CSG'
+ titre.fr: CSG non déductible
+aide déclaration revenu indépendant 2020 . cotisations payées . cotisations obligatoires déductibles:
+ titre.en: '[automatic] deductible mandatory contributions'
+ titre.fr: cotisations obligatoires déductibles
+aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociales:
+ description.en: >
+ [automatic] You can find this amount in your personal Urssaf space. Here are
+ the steps to follow:
+
+
+ 1. Log on to your [Urssaf personal space](https://www.urssaf.fr/portail/home.html)
+
+ 2. Go to the "Document" tab
+
+ 3. Select "statement of account".
+
+ 4. Enter in this field the amount of the column "Contribution", line "Year 2020".
+ description.fr: >
+ Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici
+ la marche à suivre :
+
+
+ 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html)
+
+ 2. Allez dans l'onglet "Document"
+
+ 3. Selectionnez "relevé de situation comptable"
+
+ 4. Reportez dans ce champs le montant de la colonne "Cotisation", ligne "Année 2020"
+ question.en:
+ '[automatic] What is the total amount of social contributions paid
+ during the year?'
+ question.fr:
+ Quel est le montant total des cotisations et contributions sociales
+ payées pendant l'exercice ?
+ titre.en: '[automatic] total social charges'
+ titre.fr: total charges sociales
+aide déclaration revenu indépendant 2020 . cotisations payées version simple:
+ titre.en: '[automatic] dues paid simple version'
+ titre.fr: cotisations payées version simple
+aide déclaration revenu indépendant 2020 . cotisations payées version simple . CSG déductible et CFP:
+ description.en: >
+ [automatic] Enter the amount of the deductible CSG and PSC you paid in 2020
+ (regardless of the year to which these contributions relate).
+ description.fr: >
+ Indiquez le montant de la part de CSG déductible et de CFP que vous avez
+ payé en 2020 (peu importe l’année à laquelle ces contributions se
+ rapportent).
+ question.en: '[automatic] What is the total amount of deductible CSG and CFP
+ paid this year?'
+ question.fr: Quel est le montant total de CSG déductible et CFP payées cette année ?
+ titre.en: '[automatic] Deductible CSG and PSC'
+ titre.fr: CSG déductible et CFP
+aide déclaration revenu indépendant 2020 . cotisations payées version simple . cotisations sociales:
+ description.en: >
+ [automatic] Indicate the amount of social contributions to the compulsory
+ schemes (sickness-maternity, old age, disability-death, family) that you
+ paid in 2020 (regardless of the year to which these contributions relate).
+ description.fr: >
+ Indiquez le montant des cotisations sociales aux régimes obligatoires
+ (maladie-maternité, vieillesse, invalidité-décès, famille) que vous avez
+ payées en 2020 (peu importe l’année à laquelle ces cotisations se
+ rapportent).
+ question.en: '[automatic] How much social security contribution did you pay this year?'
+ question.fr: Quel est le montant de vos cotisations sociales payées cette année ?
+ titre.en: '[automatic] social contributions'
+ titre.fr: cotisations sociales
+aide déclaration revenu indépendant 2020 . formulaire 2033:
+ résumé.en: '[automatic] Tax package for the simplified actual system'
+ résumé.fr: Liasse fiscale du régime réel simplifié
+ titre.en: '[automatic] form 2033-SD'
+ titre.fr: formulaire 2033-SD
+aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 250:
+ description.en: >
+ [automatic] If your business employs employees, add to this amount the total
+ gross remuneration paid during the year
+ description.fr: >
+ Si votre entreprise emploie des salarié, ajoutez à ce montant le total des
+ rémunération brute versée durant l'exercice
+ résumé.en: '[automatic] Staff remuneration (+)'
+ résumé.fr: Rémunérations du personnel (+)
+ titre.en: '[automatic] item 250'
+ titre.fr: rubrique 250
+aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 252:
+ description.en: >
+ [automatic] If your business employs employees, add to this amount the total
+ employer contributions paid during the year
+ description.fr: >
+ Si votre entreprise emploie des salarié, ajoutez à ce montant le total des
+ cotisations patronales payées durant l'exercice
+ résumé.en: '[automatic] Social security charges (+)'
+ résumé.fr: Charges sociales (+)
+ titre.en: '[automatic] heading 252'
+ titre.fr: rubrique 252
+aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 324:
+ résumé.en: '[automatic] Non-deductible taxes'
+ résumé.fr: Impôts et taxes non déductibles
+ titre.en: '[automatic] heading 324'
+ titre.fr: rubrique 324
+aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 325:
+ résumé.en: '[automatic] Of which, deductible amount of optional contributions
+ paid in application of I of Article 154 bis of the CGI of which optional
+ Madelin contributions (I of Article 154 bis of the CGI)'
+ résumé.fr: Dont montant déductible des cotisations
+ facultatives versées en application du I
+ de l'article 154 bis du CGI dont
+ cotisations facultatives Madelin (I de l’art. 154 bis du CGI)
+ titre.en: '[automatic] heading 325'
+ titre.fr: rubrique 325
+aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 326:
+ résumé.en: '[automatic] Of which amount deductible from compulsory social
+ security contributions excluding CSG-CRDS'
+ résumé.fr: Dont montant déductible des cotisations sociales obligatoires hors CSG-CRDS
+ titre.en: '[automatic] heading 326'
+ titre.fr: rubrique 326
+aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 327:
+ résumé.en: '[automatic] Of which, voluntary contributions to new retirement
+ savings plans'
+ résumé.fr: Dont cotisations facultatives aux nouveaux plans d'épargne retraite
+ titre.en: '[automatic] heading 327'
+ titre.fr: rubrique 327
+aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 330:
+ description.en:
+ "[automatic] Also add back the amounts specified [page 8 of the
+ dedicated
+ notice](https://www.impots.gouv.fr/portail/files/formulaires/2033-sd/2019/2\
+ 033-sd_2570.pdf#page=8)"
+ description.fr:
+ Réintégrer également les montants spécifiés [page 8 de la notice
+ dédiée](https://www.impots.gouv.fr/portail/files/formulaires/2033-sd/2019/2033-sd_2570.pdf#page=8)
+ résumé.en: '[automatic] Miscellaneous to be added back (+)'
+ résumé.fr: Divers à réintégrer (+)
+ titre.en: '[automatic] section 330'
+ titre.fr: rubrique 330
+aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 380:
+ résumé.en: '[automatic] Compulsory personal contributions of the operator'
+ résumé.fr: Cotisations personnelles obligatoires de l'exploitant
+ titre.en: '[automatic] item 380'
+ titre.fr: rubrique 380
+aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 381:
+ résumé.en: '[automatic] Optional supplementary premiums and contributions'
+ résumé.fr: Primes et cotisations complémentaires facultatives
+ titre.en: '[automatic] heading 381'
+ titre.fr: rubrique 381
+aide déclaration revenu indépendant 2020 . formulaire 2035:
+ résumé.en: '[automatic] Tax package for the controlled declaration system'
+ résumé.fr: Liasse fiscale du régime de la déclaration contrôlée
+ titre.en: '[automatic] form 2035-A-SD'
+ titre.fr: formulaire 2035-A-SD
+aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BK:
+ résumé.en: '[automatic] Personal social charges'
+ résumé.fr: Charges sociales personnelles
+ titre.en: '[automatic] BK section'
+ titre.fr: rubrique BK
+aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BS:
+ description.en: '[automatic] Contribution to the professional training of the
+ farmer and his spouse, to be added to other existing taxes.'
+ description.fr: Contribution à la formation professionnelle de l'exploitant et
+ de son conjoint, à ajouter aux autres impôts existants.
+ résumé.en: '[automatic] Other taxes (+)'
+ résumé.fr: Autres impôts (+)
+ titre.en: '[automatic] BS section'
+ titre.fr: rubrique BS
+aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BT:
+ résumé.en: '[automatic] Of which mandatory'
+ résumé.fr: Dont obligatoires
+ titre.en: '[automatic] LV section'
+ titre.fr: rubrique BT
+aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BU:
+ résumé.en: '[automatic] Of which, optional to new retirement savings plans'
+ résumé.fr: Dont facultatives aux nouveaux plans d’épargne retraite
+ titre.en: '[automatic] BU section'
+ titre.fr: rubrique BU
+aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BV:
+ résumé.en: '[automatic] Deductible generalized social contribution'
+ résumé.fr: Contribution sociale généralisée déductible
+ titre.en: '[automatic] BV section'
+ titre.fr: rubrique BV
+aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BZ:
+ résumé.en: '[automatic] Of which optional Madelin contributions'
+ résumé.fr: Dont cotisations facultatives Madelin
+ titre.en: '[automatic] section BZ'
+ titre.fr: rubrique BZ
+aide déclaration revenu indépendant 2020 . formulaire 2042:
+ résumé.en: '[automatic] Income tax return'
+ résumé.fr: Déclaration des revenus
+ titre.en: '[automatic] form 2042'
+ titre.fr: formulaire 2042
+aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique 1GB:
+ résumé.en: '[automatic] Salaries and wages'
+ résumé.fr: Traitements et salaires
+ titre.en: '[automatic] item 1GB / 1HB'
+ titre.fr: rubrique 1GB / 1HB
+aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSCA:
+ description.en: >
+ [automatic] The DSCA or DSCB item of the unified tax and social security
+ return corresponds to the amount of compulsory social contributions that are
+ tax deductible (these contributions will be subject to CSG-CRDS). The DSCA
+ or DSCB item appears in the social section "declaration of income of the
+ self-employed" of the 2042 declaration.
+ description.fr: >
+ La rubrique DSCA ou DSCB de la déclaration de revenu fiscale et sociale
+ unifiée correspond au montant des cotisations sociales obligatoires
+ déductibles fiscalement (ces cotisations seront soumises à CSG-CRDS). La
+ rubrique DSCA ou DSCB figure dans le volet social « déclaration de revenus
+ des indépendants » de la déclaration 2042.
+ résumé.en: '[automatic] Compulsory social security contributions'
+ résumé.fr: Cotisations sociales obligatoires
+ titre.en: '[automatic] DSCA / DSCB section'
+ titre.fr: rubrique DSCA / DSCB
+aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSEA:
+ résumé.en: '[automatic] Optional contributions'
+ résumé.fr: Cotisations facultatives
+ titre.en: '[automatic] DSEA / DSEB section'
+ titre.fr: rubrique DSEA / DSEB
+aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSIA:
+ résumé.en: '[automatic] Tobacco shop'
+ résumé.fr: Débit de tabac
+ titre.en: '[automatic] DSIA / DSIB section'
+ titre.fr: rubrique DSIA / DSIB
+aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSLA:
+ résumé.en: '[automatic] Foreign income taxable but exempt from CSG-CRDS'
+ résumé.fr: Revenus étrangers imposables mais exonérés de CSG-CRDS
+ titre.en: '[automatic] DSLA / DSLB section'
+ titre.fr: rubrique DSLA / DSLB
+aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C:
+ titre.en: '[automatic] form 2042 PRO C'
+ titre.fr: formulaire 2042 PRO C
+aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C . rubrique 5HQ:
+ résumé.en: '[automatic] Special declarative regime or micro BNC (gross receipts)'
+ résumé.fr: Régime déclaratif spécial ou micro BNC (recettes brutes)
+ titre.en: '[automatic] item 5HQ / 5IQ'
+ titre.fr: rubrique 5HQ / 5IQ
+aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C . rubrique 5KO:
+ résumé.en: '[automatic] Micro BIC taxable income (sales of goods and similar)'
+ résumé.fr: Revenus imposables micro BIC (ventes de marchandises et assimilées)
+ titre.en: '[automatic] heading 5KO / 5LO'
+ titre.fr: rubrique 5KO / 5LO
+aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C . rubrique 5KP:
+ résumé.en: '[automatic] Micro BIC taxable income (services and furnished rentals)'
+ résumé.fr: Revenus imposables micro BIC (prestations de services et locations meublées)
+ titre.en: '[automatic] item 5KP / 5LP'
+ titre.fr: rubrique 5KP / 5LP
+aide déclaration revenu indépendant 2020 . formulaire 2050:
+ résumé.en: '[automatic] Tax package for the normal actual system'
+ résumé.fr: Liasse fiscale du régime réel normal
+ titre.en: '[automatic] form 2052-SD and 2053-SD'
+ titre.fr: formulaire 2052-SD et 2053-SD
+aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A2:
+ résumé.en: "[automatic] Operator's personal contributions"
+ résumé.fr: Cotisations personnelles de l'exploitant
+ titre.en: '[automatic] item A2'
+ titre.fr: rubrique A2
+aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A5:
+ résumé.en: '[automatic] Of which amount of compulsory social contributions
+ excluding CSG/CRDS'
+ résumé.fr: Dont montant des cotisations sociales obligatoires hors CSG/CRDS
+ titre.en: '[automatic] section A5'
+ titre.fr: rubrique A5
+aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A6:
+ résumé.en: '[automatic] Optional personal supplementary premiums and contributions'
+ résumé.fr: Primes et cotisations complémentaires personnelles facultatives
+ titre.en: '[automatic] heading A6'
+ titre.fr: rubrique A6
+aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A7:
+ résumé.en: '[automatic] Of which optional Madelin contributions'
+ résumé.fr: Dont cotisations facultatives Madelin
+ titre.en: '[automatic] section A7'
+ titre.fr: rubrique A7
+aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A8:
+ résumé.en: '[automatic] Of which, voluntary contributions to new retirement
+ savings plans'
+ résumé.fr: Dont cotisations facultatives aux nouveaux plans d'épargne retraite
+ titre.en: '[automatic] item A8'
+ titre.fr: rubrique A8
+aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FY:
+ description.en: >
+ [automatic] If your business employs employees, add to this amount the total
+ of all remuneration and allowances paid during the year
+ description.fr: >
+ Si votre entreprise emploie des salarié, ajoutez à ce montant le total des
+ rémunérations et indemnités versée durant l'exercice
+ résumé.en: '[automatic] Wages and salaries (+)'
+ résumé.fr: Salaires et traitements (+)
+ titre.en: '[automatic] section FY'
+ titre.fr: rubrique FY
+aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FZ:
+ description.en: >
+ [automatic] If your business employs employees, add to this amount the total
+ employer's contributions paid during the year, as well as any other social
+ security charges
+ description.fr: >
+ Si votre entreprise emploie des salarié, ajoutez à ce montant le total des
+ cotisations patronales payées durant l'exercice, ainsi que toutes les autres
+ charges sociales
+ résumé.en: '[automatic] Social security charges (+)'
+ résumé.fr: Charges sociales (+)
+ titre.en: '[automatic] section FZ'
+ titre.fr: rubrique FZ
+aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique WQ:
+ description.en: "[automatic] Add all reinstatements listed on [page 9 of the
+ record](https://www.impots.gouv.fr/portail/files/formulaires/2032-not-sd/20\
+ 20/2032-not-sd_2959.pdf#page=9)"
+ description.fr: Ajouter toutes les réintégrations listée dans la [page 9 de la
+ notice](https://www.impots.gouv.fr/portail/files/formulaires/2032-not-sd/2020/2032-not-sd_2959.pdf#page=9)
+ résumé.en: '[automatic] Miscellaneous reinstatements (+)'
+ résumé.fr: Réintégrations diverses (+)
+ titre.en: '[automatic] WQ section'
+ titre.fr: rubrique WQ
+aide déclaration revenu indépendant 2020 . informations résultat par formulaire:
+ titre.en: '[automatic] result information by form'
+ titre.fr: informations résultat par formulaire
+aide déclaration revenu indépendant 2020 . informations résultat par formulaire . assiette sociale:
+ description.en: '[automatic] The base used to calculate social security contributions.'
+ description.fr: Assiette utilisée pour le calcul des cotisations sociales.
+ résumé.en: '[automatic] [A - C1]'
+ résumé.fr: '[A - C1]'
titre.en: '[automatic] social base'
titre.fr: assiette sociale
-aide déclaration revenu indépendant 2020 . cotisations sociales déductible:
- description.en: '[automatic] Amount to be reported in Box XI of your social
- security return and Item 326 of Form 2033-D-SD (for the simplified actual)
- or Item A5 of Form 2053-SD (for the normal actual) of your tax return.'
+aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations déductibles:
+ description.en:
+ '[automatic] Deductible social contributions for the calculation
+ of the social security base'
description.fr:
- Montant à reporter dans la case XI de votre déclaration sociale
- et rubrique 326 du formulaire 2033-D-SD (pour le réel simplifié) ou rubrique
- A5 du formulaire 2053-SD (pour le réel normal) de votre déclaration fiscale.
- résumé.en: '[automatic] [C]'
- résumé.fr: '[C]'
- titre.en: '[automatic] deductible compulsory social security contributions'
- titre.fr: cotisations sociales obligatoires déductibles
+ Cotisations et contributions sociales déductibles pour le calcul
+ de l'assiette sociale
+ résumé.en: '[automatic] [C1]'
+ résumé.fr: '[C1]'
+ titre.en: '[automatic] deductible contributions'
+ titre.fr: cotisations déductibles
+aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations non déductibles:
+ description.en: '[automatic] Non-deductible social contributions for the
+ calculation of the social security base'
+ description.fr: Cotisations et contributions sociales non déductibles pour le
+ calcul de l'assiette sociale
+ résumé.en: '[automatic] [C2]'
+ résumé.fr: '[C2]'
+ titre.en: '[automatic] non-deductible contributions'
+ titre.fr: cotisations non déductibles
+aide déclaration revenu indépendant 2020 . informations résultat par formulaire . réduction Covid:
+ description.en: '[automatic] The contribution reduction applicable in the case
+ of the Covid scheme'
+ description.fr: La réduction de cotisation applicable dans le cas du dispositif Covid
+ titre.en: '[automatic] Covid discount'
+ titre.fr: réduction Covid
+aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération nette:
+ description.en:
+ "[automatic] The executive's net income before income tax. This
+ is the remuneration actually paid."
+ description.fr: Le revenu net du dirigeant avant impôt sur le revenu. C'est la
+ rémunération effectivement versée.
+ résumé.en: '[automatic] [A - C1 - C2]'
+ résumé.fr: '[A - C1 - C2]'
+ titre.en: '[automatic] net pay'
+ titre.fr: rémunération nette
+aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération totale:
+ description.en: '[automatic] The manager''s "superbrute" remuneration,
+ including all social contributions.'
+ description.fr: La rémunération "superbrute" du dirigeant, incluant toutes les
+ cotisations et contributions sociales.
+ résumé.en: '[automatic] [A]'
+ résumé.fr: '[A]'
+ titre.en: '[automatic] Total executive compensation'
+ titre.fr: Total rémunération dirigeant
aide déclaration revenu indépendant 2020 . nature de l'activité:
question.en: '[automatic] What is the nature of your business?'
question.fr: Quelle est la nature de votre activité ?
@@ -139,8 +594,8 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . artisanale:
- Les activités artisanales sont répertoriées par un décret
titre.en: '[automatic] artisanal'
titre.fr: artisanale
-? aide déclaration revenu indépendant 2020 . nature de l'activité . commerciale ou industrielle
-: description.en: >
+aide déclaration revenu indépendant 2020 . nature de l'activité . commerciale:
+ description.en: >
[automatic] ### Commercial activity
- Purchases of goods for resale in the same condition (wholesale or retail)
@@ -165,23 +620,23 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . artisanale:
Activité de production ou de transformation grâce à l'utilisation d'outils industriels, extraction, industries minières, manutention, magasinage et stockage
titre.en: '[automatic] commercial or industrial'
- titre.fr: commerciale ou industrielle
+ titre.fr: commerciale
aide déclaration revenu indépendant 2020 . nature de l'activité . libérale:
description.en: >
[automatic] These are the "intellectual" professions, which are not attached
- to any
+ to any specific
specific pension fund.
- This has been the case for all unregulated professions since the
+ This is the case for all unregulated liberal professions since
- 1 January 2020.
+ January 1, 2020.
description.fr: |
Ce sont les professions "intellectuelles", qui ne sont rattachée à aucune
caisse spécifique de retraite.
- C'est le cas de toutes les professions libérale non reglementée depuis le
+ C'est le cas de toutes les professions libérale non réglementées depuis le
1er janvier 2020.
titre.en: '[automatic] Liberal attached to the general regime'
titre.fr: Libérale rattachée au régime général
@@ -191,25 +646,647 @@ aide déclaration revenu indépendant 2020 . plafond sécurité sociale 2020:
aide déclaration revenu indépendant 2020 . période:
titre.en: '[automatic] period'
titre.fr: période
-aide déclaration revenu indépendant 2020 . revenu net fiscal:
- résumé.en: '[automatic] before deduction of social security charges and tax
- exemptions [A]'
- résumé.fr: avant déduction des charges sociales et exonérations fiscales [A]
- titre.en: '[automatic] net taxable income'
- titre.fr: revenu net fiscal
-aide déclaration revenu indépendant 2020 . total charges sociales déductible:
+aide déclaration revenu indépendant 2020 . réduction covid:
+ description.en: >
+ [automatic] Within the framework of the health crisis, the Government has
+ implemented several exceptional measures concerning the social contributions
+ of self-employed workers affected by the coronavirus crisis, including
+
+
+ - a first system of reduction of social security contributions provided for by the 3rd rectifying finance law (LFR3) for 2020(1) within the framework of the first period of health emergency in spring 2020,
+
+ - a second reduction scheme provided for in the Social Security Financing Act (LFSS) for 2021 (2) as part of the second state of health emergency in the autumn of 2020.
+ description.fr: >
+ Dans le cadre de la crise sanitaire, le Gouvernement a mis en œuvre
+ plusieurs mesures exceptionnelles concernant les cotisations et
+ contributions sociales des travailleurs indépendants affectés par la crise
+ du coronavirus avec :
+
+
+ - un premier dispositif de réduction des cotisations et contributions sociales prévu par la 3ème loi de finance rectificative (LFR3) pour 2020(1) dans le cadre de la première période d’état d’urgence sanitaire du printemps 2020,
+
+ - un second dispositif de réduction prévu par la loi de financement de la sécurité sociale (LFSS) pour 2021 (2) dans le cadre de la seconde période d’état d’urgence sanitaire de l’automne 2020.
+ question.en:
+ '[automatic] Do you qualify for the Covid-19 crisis-related payroll
+ tax reduction?'
+ question.fr: Remplissez-vous les conditions pour bénéficier de la réduction de
+ cotisations sociales liées à la crise du Covid-19 ?
+ titre.en: '[automatic] Covid contribution reduction'
+ titre.fr: Réduction de cotisation Covid
+aide déclaration revenu indépendant 2020 . réduction covid . conjoint collaborateur:
+ titre.en: '[automatic] collaborating spouse'
+ titre.fr: conjoint collaborateur
+aide déclaration revenu indépendant 2020 . réduction covid . montant:
+ titre.en: '[automatic] Covid discount'
+ titre.fr: Réduction Covid
+aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020:
+ titre.en: '[automatic] Autumn 2020'
+ titre.fr: automne 2020
+aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020:
+ titre.en: '[automatic] Spring 2020'
+ titre.fr: printemps 2020
+aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles:
+ titre.en: '[automatic] number of eligible months'
+ titre.fr: nombre de mois éligibles
+aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 et S1bis:
+ description.en: >
+ [automatic] For October 2020, your business also had to be located in a
+ curfew zone
+ description.fr: >
+ * Pour octobre 2020, votre activité devait également être située dans une
+ zone d’application des mesures de couvre-feu
+ question.en: >
+ [automatic] Specify the number of months between October 2020* and March
+ 2021 during which you were banned from receiving the public or experienced a
+ 50% drop in turnover
+ question.fr: >
+ Précisez le nombre de mois entre octobre 2020* et mars 2021 durant lesquels
+ vous avez subi une interdiction d’accueil du public ou une baisse de 50% de
+ votre chiffre d’affaires
+ titre.en: '[automatic] S1 and S1bis'
+ titre.fr: S1 et S1bis
+aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2:
+ question.en: >
+ [automatic] Specify the number of months (November 2020 and/or February 2021
+ and/or March 2021) during which you were subject to a prohibition measure
+ that predominantly affects the continuation of your business
+ question.fr: >
+ Précisez le nombre de mois (novembre 2020 et/ou février 2021 et/ou mars
+ 2021) durant lesquels vous avez fait l’objet d’une mesure d’interdiction
+ affectant de manière prépondérante la poursuite de votre activité
+ titre.en: '[automatic] S2'
+ titre.fr: S2
+aide déclaration revenu indépendant 2020 . réduction covid . part CSG:
+ titre.en: '[automatic] Covid reduction on CSG'
+ titre.fr: Part réduction Covid sur CSG
+aide déclaration revenu indépendant 2020 . réduction covid . part CSG . déductible:
+ titre.en: '[automatic] Covid reduction on deductible CSG/CRDS'
+ titre.fr: Part réduction Covid sur CSG/CRDS déductible
+aide déclaration revenu indépendant 2020 . réduction covid . part CSG . non déductible:
+ titre.en: '[automatic] Covid reduction on non-deductible CSG/CRDS'
+ titre.fr: Part réduction Covid sur CSG/CRDS non déductible
+aide déclaration revenu indépendant 2020 . réduction covid . part cotisations:
+ titre.en: '[automatic] Covid reduction on contributions (excluding CSG/CRDS)'
+ titre.fr: Part réduction Covid sur cotisations (hors CSG/CRDS)
+aide déclaration revenu indépendant 2020 . réduction covid . pourcentage cotisations:
+ titre.en: '[automatic] percentage contributions'
+ titre.fr: pourcentage cotisations
+aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité:
+ description.en: >
+ [automatic] The conditions of eligibility for "Covid" aid depend on the
+ sector of activity
+
+ of which the main activity is part.
+
+
+ Hotels, restaurants, bars, etc. are in the so-called
+
+ are in the so-called "S1" category and are entitled to the aid without any other conditions.
+
+
+ Sectors whose activities depend on those of "sector 1" can also benefit from aid
+
+ can also benefit from aid provided that they have had a significant drop in turnover during
+
+ during the period of confinement.
+
+
+ Lastly, the "S2" sectors are those involving the reception of the public, and
+
+ are eligible for aid provided that they have undergone an administrative
+
+ administrative closure.
+
+
+ The procedures are specified on the Urssaf website.
+ description.fr: >
+ Les conditions d’éligibilité aux aides « Covid » dépendent du secteur
+ d’activité
+
+ dont relève l’activité principale.
+
+
+ Les hôtels, restaurants, bars, etc. sont dans
+
+ la catégorie dite "S1" et ont le droit aux aides sans autres conditions.
+
+
+ Les secteurs dont l'activité dépendent de celles du "secteur 1" peuvent
+
+ aussi bénéficier des aides à condition d'avoir eu une baisse de chiffre
+
+ d'affaires significative pendant le confinement.
+
+
+ Enfin les secteurs dits "S2" sont ceux impliquant l'accueil du public, et
+
+ sont éligibles aux aides à condition d'avoir subi une fermeture
+
+ administrative.
+
+
+ Les modalités sont précisées sur le site de l'Urssaf.
+ question.en: |
+ [automatic] In which sector is your main activity?
+ question.fr: |
+ De quel secteur votre activité principale relève-t'elle ?
+ titre.en: '[automatic] line of business'
+ titre.fr: secteur d'activité
+aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1:
+ description.en: >
+ [automatic] Sectors of tourism, hotels, restaurants, sports, culture, air
+ transport and events.
+ description.fr: >
+ Secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la
+ culture, du transport aérien et de l’événementiel.
+ titre.en: '[automatic] Sector S1'
+ titre.fr: Secteur dit S1
+aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis:
+ description.en: >
+ [automatic] Sectors whose activity depends on that of sector 1 and which
+ have suffered a very sharp decline in turnover.
+ description.fr: >
+ Secteurs dont l’activité dépend de celle des secteurs 1 et qui ont subi une
+ très forte baisse de leur chiffre d’affaires.
+ titre.en: '[automatic] Sector known as S1 bis'
+ titre.fr: Secteur dit S1 bis
+aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2:
+ description.en: '[automatic] Other sectors of activity which have been banned
+ from carrying on their business in a preponderant manner.'
+ description.fr: Autres secteurs d’activité qui ont fait l’objet d’une
+ interdiction affectant de manière prépondérante la poursuite de leur
+ activité.
+ titre.en: '[automatic] Sector called S2'
+ titre.fr: Secteur dit S2
+aide déclaration revenu indépendant 2020 . réduction covid . taux CSG:
+ titre.en: '[automatic] CSG rate'
+ titre.fr: taux CSG
+aide déclaration revenu indépendant 2020 . réduction covid . total:
+ description.en: '[automatic] Included in the amount of contributions shown above'
+ description.fr: Intégrée dans le montant des cotisations affiché ci-dessus
+ titre.en: '[automatic] Covid discount'
+ titre.fr: Réduction Covid
+aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020:
+ description.en: >
+ [automatic] Eligibility for the reduction under the second fall 2020 health
+ emergency period is assessed month by month and depends on your industry.
+
+
+ You must also specify the number of months in which you meet the eligibility requirements.
+
+
+ Sector known as S1
+
+ Main activity in the tourism, hotel, restaurant, sports, culture, air transport and events sectors
+
+
+ Month concerned | Conditions of eligibility
+
+ --------------|--------------------------
+
+ October 2020 | Activity carried out in an area where curfew measures apply And have been subject to a measure prohibiting the reception of the public **OR** Activity carried out in an area where curfew measures apply And have suffered a significant drop in monthly turnover(ca)
+
+ November 2020 to March 2021 | To have been subject to a measure of prohibition of reception of the public **OR** To have undergone a strong fall of the monthly sales (ca)
+
+
+ Condition of decrease in turnover:_
+
+
+ You must have suffered a drop in monthly turnover of at least 50% compared to the same month of the previous year, or if you wish, compared to the average monthly turnover of the year 2019, or, for companies created in 2020, compared to the average monthly turnover achieved between the date of creation of the company and August 31, 2020.
+
+
+ This condition is also met when the decrease in monthly turnover compared to the same period of the previous year represents at least 15% of the turnover of the year 2019, or, for companies created in 2019, compared to the turnover of the year 2019 over 12 months.
+
+
+ If you have ceased your activity, the cessation must be after or equal to 17 October 2020.
+
+
+ Good to know: The activities of delivery, withdrawal of order or takeaway sales are not taken into account to assess compliance with the condition of prohibition of reception of the public.
+
+
+ Sector known as S1 bis
+
+ Main activity carried out depending on those of sector S1
+
+
+ Month concerned | Conditions of eligibility
+
+ --------------|--------------------------
+
+ October 2020 | Have been subject to a ban on receiving the public **OR** Have suffered a sharp drop in monthly turnover(ca)
+
+
+ Condition of decrease in turnover:_
+
+
+ You must have suffered a drop in monthly turnover of at least 50% compared to the same month of the previous year, or if you wish, compared to the average monthly turnover of the year 2019, or, for companies created in 2020, compared to the average monthly turnover achieved between the date of creation of the company and August 31, 2020.
+
+
+ This condition is also met when the decrease in monthly turnover compared to the same period of the previous year represents at least 15% of the turnover of the year 2019, or, for companies created in 2019, compared to the turnover of the year 2019 over 12 months.
+
+
+ If you have ceased your activity, the cessation must be after or equal to 17 October 2020.
+
+
+ Good to know: The activities of delivery, withdrawal of order or takeaway sales are not taken into account to assess compliance with the condition of prohibition of reception of the public.
+
+
+ Sector known as S2
+
+ Main activity carried out in a sector other than S1 and S1 bis
+
+
+ - Month concerned** : November 2020, February 2021, March 2021
+
+ - Conditions of eligibility**: To have been the subject of a prohibition measure that predominantly affects the pursuit of the activity, pursuant to Decree no. 2020-1310 of 29 October 2020
+
+
+ If you have ceased your activity, the cessation must be after or equal to 30 October 2020.
+
+
+ Good to know: Delivery activities, order collection or takeaway sales are not taken into account to assess compliance with the prohibition condition.
+ description.fr: >
+ Les conditions d’éligibilité à la réduction au titre de la seconde période
+ d’état d’urgence sanitaire de l’automne 2020 s’évaluent mois par mois et
+ dépendent de votre secteur d’activité.
+
+
+ Vous devez également préciser le nombre de mois où vous remplissez les conditions d’éligibilité.
+
+
+ ### Secteur dit S1
+
+ Activité principale exercée relevant des secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel
+
+
+ Mois concerné | Conditions d'éligibilité
+
+ --------------|--------------------------
+
+ Octobre 2020 | Activité exercée dans une zone d’application des mesures de couvre-feu Et avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Activité exercée dans une zone d’application des mesures de couvre-feu Et avoir subi une forte baisse du chiffre d’affaires mensuel(ca)
+
+ Novembre 2020 à Mars 2021 | Avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Avoir subi une forte baisse du chiffre d’affaires mensuel(ca)
+
+
+ _(ca) Condition de baisse de chiffre d'affaire:_
+
+
+ _Vous devez avoir subi une baisse d’au moins 50% du chiffre d’affaires mensuel par rapport au même mois de l’année précédente, ou si vous le souhaitez par rapport au chiffre d’affaires mensuel moyen de l’année 2019, ou, pour les entreprises créées en 2020, par rapport au montant mensuel moyen du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 31 août 2020._
+
+
+ _Cette condition est également satisfaite lorsque la baisse de chiffre d’affaires mensuel par rapport à la même période de l’année précédente représente au moins 15% du chiffre d’affaires de l’année 2019, ou, pour les entreprises créées en 2019, par rapport au chiffre d’affaires de l’année 2019 ramené sur 12 mois._
+
+
+ Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 17 octobre 2020.
+
+
+ Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction d’accueil du public.
+
+
+ ### Secteur dit S1 bis
+
+ Activité principale exercée dépendant de celles du secteur S1
+
+
+ Mois concerné | Conditions d'éligibilité
+
+ --------------|--------------------------
+
+ Octobre 2020 | Avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Avoir subi une forte baisse du chiffre d’affaires mensuel(ca)
+
+
+ _(ca) Condition de baisse de chiffre d'affaire:_
+
+
+ _Vous devez avoir subi une baisse d’au moins 50% du chiffre d’affaires mensuel par rapport au même mois de l’année précédente, ou si vous le souhaitez par rapport au chiffre d’affaires mensuel moyen de l’année 2019, ou, pour les entreprises créées en 2020, par rapport au montant mensuel moyen du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 31 août 2020._
+
+
+ _Cette condition est également satisfaite lorsque la baisse de chiffre d’affaires mensuel par rapport à la même période de l’année précédente représente au moins 15% du chiffre d’affaires de l’année 2019, ou, pour les entreprises créées en 2019, par rapport au chiffre d’affaires de l’année 2019 ramené sur 12 mois._
+
+
+ Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 17 octobre 2020.
+
+
+ Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction d’accueil du public.
+
+
+ ### Secteur dit S2
+
+ Activité principale exercée dans un secteur autre que S1 et S1 bis
+
+
+ - **Mois concerné** : novembre 2020, février 2021, mars 2021
+
+ - **Conditions d'éligibilité**: Avoir fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de l’activité, en application du décret n° 2020-1310 du 29 octobre 2020
+
+
+ Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 30 octobre 2020.
+
+
+ Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction.
+ question.en: '[automatic] Are you eligible for the first wave of the fall 2020
+ health crisis reduction?'
+ question.fr:
+ Êtes-vous éligibles au dispositif de réduction prévu au titre de la
+ première vague de la crise sanitaire de l'automne 2020 ?
+ titre.en: '[automatic] eligible for aid autumn 2020'
+ titre.fr: éligible aide automne 2020
+aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020:
+ description.en: >
+ [automatic] Eligibility requirements for the reduction under the first
+ Spring 2020 State of Health Emergency period depend on your industry:
+
+
+ ### Sector S1
+
+
+ Main activity in the tourism, hotel, restaurant, sports, culture, air transport and events sectors (see detailed list of activities in sector S1).
+
+
+ Your activity must have started before 1 July 2020.
+
+
+ If you have ceased your activity, the cessation must be after or on 15 March 2020.
+
+
+ Sector S1 bis
+
+
+ Main activity carried out depending on those of sector S1 (See detailed list of activities falling under sector S1 bis) and having suffered a sharp drop in turnover, namely :
+
+
+ - Either a drop in turnover of at least 80% during the period between 15 March and 15 May 2020 compared to the same period the previous year (case 1);
+
+ or, in relation to the average monthly turnover of the year 2019 reduced over two months (case 2);
+
+ or, for companies created after 15 March 2019 and before 10 March 2020, in relation to the average turnover over two months between the date of creation of the company and 15 March 2020 (case 2 bis).
+
+
+ - Or a drop in turnover during the period between 15 March and 15 May 2020 compared to the same period the previous year that represents at least 30% of the turnover for the year 2019 (case 3).
+
+ or, for companies created between 1 and 14 March 2019, a drop in turnover between the date of creation of the company and 31 December 2019 over 12 months (case 3 bis).
+
+
+ Your activity must have started before 1 July 2020.
+
+ If you have ceased your activity, the cessation must be after or equal to 15 March 2020.
+
+
+ Sector S2
+
+
+ Main activity carried out in a sector other than S1 and S1 bis involving the reception of the public and interrupted in application of decree n° 2020-293 of 23 March 2020, excluding voluntary closures.
+
+
+ Your activity must have started before 1 June 2020.
+
+ If you have ceased your activity, the cessation must be after or equal to 15 March 2020.
+ description.fr: >
+ Les conditions d’éligibilité à la réduction au titre de la première période
+ d’état d’urgence sanitaire du printemps 2020 dépendent de votre secteur
+ d’activité :
+
+
+ ### Secteur S1
+
+
+ Activité principale exercée relevant des secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel (Voir liste détaillée des activités relevant du secteur S1).
+
+
+ Votre activité doit avoir débuté avant le 1er juillet 2020.
+
+
+ Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020.
+
+
+ ### Secteur S1 bis
+
+
+ Activité principale exercée dépendant de celles du secteur S1 (Voir liste détaillée des activités relevant du secteur S1 bis) et ayant subi une forte baisse du chiffre d’affaires à savoir :
+
+
+ - Soit une baisse de chiffre d’affaires d’au moins 80% durant la période comprise entre le 15 mars et le 15 mai 2020 par rapport à la même période l’année précédente (cas 1) ;
+
+ ou, par rapport au chiffre d’affaires mensuel moyen de l’année 2019 ramené sur deux mois (cas 2) ;
+
+ ou, pour les entreprises créées après le 15 mars 2019 et avant le 10 mars 2020, par rapport au montant moyen calculé sur deux mois du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 15 mars 2020 (cas 2 bis).
+
+
+ - Soit à une baisse de chiffre d’affaires durant la période comprise entre le 15 mars et le 15 mai 2020 par rapport à la même période l’année précédente qui représente au moins 30 % du chiffre d’affaires de l’année 2019 (cas 3).
+
+ ou, pour les entreprises créées entre le 1er et le 14 mars 2019, une baisse du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 31 décembre 2019 ramené sur 12 mois (cas 3 bis).
+
+
+ Votre activité doit avoir débuté avant le 1er juillet 2020.
+
+ Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020.
+
+
+ ### Secteur S2
+
+
+ Activité principale exercée dans un secteur autre que S1 et S1 bis impliquant l’accueil du public et interrompue en application du décret n° 2020-293 du 23 mars 2020, à l’exclusion des fermetures volontaires.
+
+
+ Votre activité doit avoir débuté avant le 1er juin 2020.
+
+ Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020.
+ question.en:
+ '[automatic] Are you eligible for the first wave of the Spring 2020
+ health crisis reduction scheme?'
+ question.fr:
+ Êtes-vous éligibles au dispositif de réduction prévu au titre de la
+ première vague de la crise sanitaire du printemps 2020 ?
+ titre.en: '[automatic] eligible for aid spring 2020'
+ titre.fr: éligible aide printemps 2020
+aide déclaration revenu indépendant 2020 . régime d'imposition:
+ titre.en: '[automatic] tax regime'
+ titre.fr: régime d'imposition
+aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée:
+ description.en: >
+ [automatic] If you have to declare non-commercial profits (BNC), you may be
+ subject to the controlled declaration regime or the micro-BNC regime; this
+ depends on the amount of your profits.
+
+
+ The controlled declaration regime is the compulsory regime if the non-commercial profits to be declared are greater than €70,000 excluding tax. If the profits are lower, professionals are subject to the micro-BNC regime but can still opt for the controlled declaration regime.
+
+
+ In the case of the controlled declaration, the taxpayer is taxed on the profits actually made. In the case of the micro-BNC system, a flat-rate deduction of 34% is automatically applied after the turnover is declared.
+ description.fr: >
+ Si vous devez déclarer des bénéfices non commerciaux (BNC), vous pouvez être
+ soumis au régime de la déclaration contrôlée ou au régime micro-BNC ; cela
+ dépend du montant de vos bénéfices.
+
+
+ Le régime de la déclaration contrôlée est le régime obligatoire si les bénéfices non commerciaux à déclarer sont supérieurs à 70 000 € HT. Si les bénéfices sont inférieurs, les professionnels dépendent du régime micro-BNC mais peuvent tout de même opter pour le régime de la déclaration contrôlée.
+
+
+ Dans le cas de la déclaration contrôlée, le contribuable est imposé sur les bénéfices effectivement réalisés. Dans le cas du régime micro-BNC, un abattement forfaitaire de 34 % est appliqué automatiquement après déclaration du chiffre d’affaires.
+ titre.en: '[automatic] controlled declaration regime'
+ titre.fr: régime de la déclaration contrôlée
+aide déclaration revenu indépendant 2020 . régime d'imposition . réel:
+ description.en: >
+ [automatic] The simplified tax regime (RSI) and the normal tax regime (RN)
+ apply to profits made during the financial year and to value added tax
+ (VAT).
+
+
+ It is mainly the detail required when filling in the accounting obligations that differentiates these 2 tax systems.
+ description.fr: >
+ Le régime simplifié d'imposition (RSI) et le régime réel normal (RN)
+ s'appliquent aux bénéfices réalisés au cours de l'exercice et à la taxe sur
+ la valeur ajoutée (TVA).
+
+
+ C'est principalement le détail demandé lors du remplissage des obligations comptables qui différencie ces 2 régimes d'imposition.
+ question.en: '[automatic] What is the tax regime applicable to the year?'
+ question.fr: Quel est le régime d'imposition applicable à l'exercice ?
+ titre.en: '[automatic] real'
+ titre.fr: réel
+aide déclaration revenu indépendant 2020 . régime d'imposition . réel . normal:
+ description.en: >
+ [automatic] The accounting of the company subjected to the normal real
+ regime must be more precise than for the simplified real regime:
+
+
+ - It must be based on supporting documents.
+
+ - The company is obliged to proceed with the chronological recording of the movements affecting its assets.
+
+ - The company must carry out an inventory at least once every 12 months.
+
+ - The company must draw up annual accounts comprising a balance sheet, an income statement and annexes.
+
+ - The company must keep a journal book and a general ledger.
+ description.fr: >
+ La comptabilité de l’entreprise soumise au régime réel normal doit être plus
+ précise que pour le régime réel simplifié :
+
+
+ - Elle doit s'appuyer sur des pièces justificatives.
+
+ - L'entreprise est obligée de procéder à l'enregistrement comptable chronologique des mouvements affectant son patrimoine.
+
+ - L'entreprise doit procéder à un inventaire au moins une fois tous les 12 mois.
+
+ - L'entreprise doit établir des comptes annuels comprenant un bilan, un compte de résultat et des annexes.
+
+ - L'entreprise doit tenir un livre journal et un grand livre.
+ titre.en: '[automatic] standard real estate regime'
+ titre.fr: régime réel normal
+aide déclaration revenu indépendant 2020 . régime d'imposition . réel . simplifié:
+ description.en: >
+ [automatic] Companies subject to the simplified real tax regime must keep
+ standard accounts: a balance sheet, an income statement and annexes. Special
+ provisions apply to lighten your accounting obligations:
+
+
+ - the journal book only records daily the income received and the expenses paid
+
+ - receivables and payables are recorded at the end of the financial year
+
+ - the balance sheet provided to the tax authorities is a simplified balance sheet
+ description.fr: >
+ Les entreprises soumises au régime d'imposition réel simplifié doivent tenir
+ une comptabilité classique : un bilan, un compte de résultat et des annexes.
+ Des dispositions particulières s’appliquent pour alléger vos obligations
+ comptables :
+
+
+ - le livre journal n’enregistre journellement que les recettes encaissées et les dépenses payées
+
+ - les créances et les dettes sont constatées à la clôture de l’exercice
+
+ - le bilan fourni à l’administration fiscale est un bilan simplifié
+ titre.en: '[automatic] simplified real estate regime'
+ titre.fr: régime réel simplifié
+aide déclaration revenu indépendant 2020 . rémunération déductible:
+ titre.en: '[automatic] deductible remuneration'
+ titre.fr: rémunération déductible
+aide déclaration revenu indépendant 2020 . résultat simple:
+ titre.en: '[automatic] simple result'
+ titre.fr: résultat simple
+aide déclaration revenu indépendant 2020 . résultat simple . CFP:
+ description.en: '[automatic] Contribution to professional training'
+ description.fr: Contribution à la formation professionnelle
+ résumé.en: '[automatic] [D]'
+ résumé.fr: '[D]'
+ titre.en: '[automatic] PSC'
+ titre.fr: CFP
+aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible:
+ description.en: '[automatic] Amount of CSG deductible from income tax'
+ description.fr: Montant de la CSG déductible à l'impôt sur le revenu
+ résumé.en: '[automatic] [B]'
+ résumé.fr: '[B]'
+ titre.en: '[automatic] Deductible CSG'
+ titre.fr: CSG déductible
+aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale:
+ description.en: '[automatic] Basis for calculating social security contributions'
+ description.fr: Assiette utilisée pour le calcul des cotisations sociales
+ résumé.en: '[automatic] [A - (B + C + D)]'
+ résumé.fr: '[A - (B + C + D)]'
+ titre.en: '[automatic] social base'
+ titre.fr: assiette sociale
+aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires:
+ description.en: >
+ [automatic] To be reported in :
+
+ - the DSCA/DSCB box** on the supplementary data form for the self-employed tax return (form 2042)
+
+ - simplified actual system:** item 326 of form 2033-D-SD
+
+ - normal actual regime:** item A5 of form 2053-SD
+
+ - controlled declaration:** item BT of form 2035-A-SD
+
+ - micro fiscal regime:** no professional tax return to be filed
+ description.fr: >
+ À reporter dans :
+
+ - **la case DSCA/DSCB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042)
+
+ - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD
+
+ - **régime réel normal :** la rubrique A5 du formulaire 2053-SD
+
+ - **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD
+
+ - **régime micro fiscal :** pas de liasse professionnelle fiscale à souscrire
+ résumé.en: '[automatic] [C]'
+ résumé.fr: '[C]'
+ titre.en: '[automatic] Deductible mandatory social security contributions'
+ titre.fr: Cotisations sociales obligatoires déductibles
+aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal:
description.en:
- '[automatic] Amount to be reported in Item 252 of Form 2033-B-SD
- (for Simplified Actual) or in Item FZ of Form 2052-SD (for Regular Actual)
- of your tax return.'
- description.fr:
- Montant à reporter dans la rubrique 252 du formulaire 2033-B-SD
- (pour le réel simplifié) ou en rubrique FZ du formulaire 2052-SD (pour le
- réel normal) de votre déclaration fiscale.
+ '[automatic] Income before deduction of social security charges
+ and tax exemptions'
+ description.fr: Résultat avant déduction des charges sociales et exonérations fiscales
+ résumé.en: '[automatic] [A]'
+ résumé.fr: '[A]'
+ titre.en: '[automatic] net tax income'
+ titre.fr: revenu net fiscal
+aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible:
+ description.en: |
+ [automatic] To be reported in :
+ - simplified actual system:** item 252 of form 2033-B-SD
+ - normal real system:** item FZ of form 2052-SD
+ - controlled declaration:** item BK of form 2035-A-SD
+ - micro fiscal regime:** no professional tax return to be filed
+ description.fr: >
+ À reporter dans :
+
+ - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD
+
+ - **régime réel normal :** la rubrique FZ du formulaire 2052-SD
+
+ - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD
+
+ - **régime micro fiscal :** pas de liasse professionnelle fiscale à souscrire
résumé.en: '[automatic] [B + C + D]'
résumé.fr: '[B + C + D]'
- titre.en: '[automatic] total tax-deductible compulsory social security charges'
- titre.fr: total charges sociales obligatoires déductibles fiscalement
+ titre.en: '[automatic] tax-deductible mandatory social security charges'
+ titre.fr: charges sociales obligatoires déductibles fiscalement
artiste-auteur:
description.en: The artist-author regime
description.fr: Le régime des artistes-auteurs
@@ -233,6 +1310,118 @@ artiste-auteur . cotisations . CSG-CRDS . abattement:
artiste-auteur . cotisations . CSG-CRDS . assiette:
titre.en: base
titre.fr: assiette
+artiste-auteur . cotisations . IRCEC:
+ description.en: >
+ [automatic] If you are a professional artist-author and you are paid in
+ royalties, the
+
+ royalties, the IRCEC is the social security organization that manages your
+
+ management of your compulsory supplementary pension.
+ description.fr: |
+ Si vous êtes artiste-auteur professionnel et que vous êtes rémunéré en
+ droits d’auteur, l’IRCEC est l’organisme de Sécurité sociale qui assure la
+ gestion de votre retraite complémentaire obligatoire.
+ titre.en: '[automatic] Supplementary pension'
+ titre.fr: Retraite complémentaire
+artiste-auteur . cotisations . IRCEC . cotisation RAAP:
+ description.en: >
+ [automatic] You may be eligible for a reduced rate at your request if your
+ income
+
+ do not reach a minimum threshold in a given year. This reduced rate
+
+ also applies to your income that is already subject to contributions under the RACL
+
+ or the RACD.
+ description.fr: |
+ Vous pouvez bénéficier d'un taux réduit à votre demande si vos revenus
+ n'atteignent pas à seuil minimal pour une année donnée. Ce taux réduit
+ s'applique également à vos revenus déjà soumis à cotisation auprès du RACL
+ ou du RACD.
+ titre.en: '[automatic] AMPS contribution'
+ titre.fr: cotisation RAAP
+artiste-auteur . cotisations . IRCEC . cotisation RAAP . seuil d'affiliation:
+ titre.en: '[automatic] membership threshold'
+ titre.fr: seuil d'affiliation
+artiste-auteur . cotisations . IRCEC . cotisation RAAP . taux réduit:
+ description.en: >
+ [automatic] The AMPS scheme allows you to opt for a reduced rate of 4%
+ instead of 8% if you
+
+ if you so request.
+
+
+ The supplementary pension points are acquired pro rata to the amount contributed.
+
+ contributed. By reducing your contribution you reduce the number of points
+
+ acquired.
+ description.fr: |
+ Le régime RAAP vous permet d'opter pour un taux réduit de 4% au lieu de 8%
+ si vous en faite la demande.
+
+ Les points de retraite complémentaire sont acquis au pro-rata du montant
+ cotisé. En réduisant votre cotisation vous réduisez donc le nombre de points
+ acquis.
+ question.en: '[automatic] Would you like to contribute at a reduced rate for
+ your supplementary pension to the IRCEC?'
+ question.fr: Souhaitez-vous cotiser sur la base d'un taux réduit pour votre
+ retraite complémentaire à l'IRCEC ?
+ titre.en: '[automatic] reduced rate'
+ titre.fr: taux réduit
+artiste-auteur . cotisations . IRCEC . cotisation RACD:
+ titre.en: '[automatic] RACD contribution'
+ titre.fr: cotisation RACD
+artiste-auteur . cotisations . IRCEC . cotisation RACL:
+ titre.en: '[automatic] RACL contribution'
+ titre.fr: cotisation RACL
+artiste-auteur . cotisations . IRCEC . profession:
+ description.en: >
+ [automatic] Depending on the nature of their activity, artists-authors
+ contribute to
+
+ one or more complementary pension schemes managed by the IRCEC
+
+ IRCEC: in all cases and if you reach the affiliation threshold
+
+ affiliation threshold, to the RAAP, then depending on your artistic activity to the RACD
+
+ and/or the RACL.
+ description.fr: |
+ Selon la nature de leur activité, les artistes-auteurs cotisent à
+ un ou plusieurs régimes de retraite complémentaire gérés par
+ 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.
+ question.en: '[automatic] Do you work in any of the following occupations?'
+ question.fr: Exercez-vous l'une de professions suivantes ?
+ titre.en: '[automatic] profession'
+ titre.fr: profession
+artiste-auteur . cotisations . IRCEC . profession . RACD:
+ description.en: >
+ [automatic] The following occupations contribute to the CDHA:
+ - Playwrights practising one of the following professions: screenwriter, dialogue writer, adapter, director, author of the literary bible, graphic author of animation, creator of original characters and sets if it is an original universe, etc.
+ - Authors and composers of drama and performing arts: theatre, dance, opera, circus, street arts, etc.
+ description.fr: >
+ Les professions suivantes cotisent au RACD :
+ - Les auteurs dramatiques exerçant l’une des professions suivantes : scénariste, dialoguiste, adaptateur, réalisateur, auteur de la bible littéraire, auteur graphique d’animation, créateur des personnages originaux et des décors s’il s’agit d’un univers original, etc.
+ - Les auteurs et compositeurs dramatiques et du spectacle vivant : théâtre, danse, opéra, cirque, arts de la rue, etc.
+ titre.en: '[automatic] author or composer of drama, live shows, films'
+ titre.fr: auteur ou compositeur dramatique, de spectacle vivant, de films
+artiste-auteur . cotisations . IRCEC . profession . RACL:
+ description.en:
+ '[automatic] Authors and composers of musical works and dubbing
+ dialogue writers contribute to the RACL.'
+ description.fr: Les auteurs et compositeurs d’œuvres musicales et les
+ dialoguistes de doublage cotisent au RACL.
+ titre.en: '[automatic] lyrical author or composer, dubbing dialogue writer'
+ titre.fr: auteur ou compositeur lyrique, dialoguiste de doublage
+artiste-auteur . cotisations . IRCEC . régime RACL:
+ question.en: '[automatic] Do you contribute to the RACL?'
+ question.fr: Cotisez-vous au RACL ?
+ titre.en: '[automatic] RACL plan'
+ titre.fr: régime RACL
artiste-auteur . cotisations . assiette:
description.en: "[automatic] Artists' earnings can be categorized either as
wages and salaries or as non-commercial profits. Social security
@@ -243,37 +1432,46 @@ artiste-auteur . cotisations . assiette:
catégories.
titre.en: base
titre.fr: assiette
-artiste-auteur . cotisations . assiette 2019:
- description.en: >
- [automatic] We calculate the covid aid on the basis of a contribution base
- 2019
-
- equal to the 2020 plate.
- description.fr: |
- Nous calculons l'aide covid sur la base d'une assiette des cotisations 2019
- égale à l'assiette 2020.
- titre.en: '[automatic] plate 2019'
- titre.fr: assiette 2019
artiste-auteur . cotisations . assiette surcotisation:
titre.en: over-contribution base
titre.fr: assiette surcotisation
+artiste-auteur . cotisations . avertissement trimestres retraite:
+ description.en: >
+ [automatic] Your income does not allow you to validate 4 quarters for the
+ basic pension
+
+ pension. You can decide to "over-contribute" to validate 4 quarters and
+
+ benefit from daily allowances.
+ description.fr: |
+ Vos revenus ne vous permettent pas de valider 4 trimestres pour la retraite
+ de base. Vous pouvez décider de « surcotiser » pour valider 4 trimestres et
+ bénéficier d'indemnités journalières.
+ titre.en: '[automatic] warning pension quarters'
+ titre.fr: avertissement trimestres retraite
artiste-auteur . cotisations . formation professionnelle:
titre.en: professional training
titre.fr: formation professionnelle
artiste-auteur . cotisations . option surcotisation:
- question.en: Would you like to over-contribute?
- question.fr: Souhaitez-vous surcotiser ?
- résumé.en: '[automatic] Your income is below the thresholds allowing you to
- validate 4 quarters of retirement. You can choose to overcontribute to
- increase your entitlements.'
- résumé.fr: Vos revenus sont en dessous des seuils vous permettant de valider 4
- trimestres de retraite. Vous pouvez choisir de surcotiser pour augmenter vos
+ description.en: >
+ [automatic] Your income is below the thresholds allowing you to validate all
+ your social
+
+ of your social security rights. You can choose to contribute more to increase your
+
+ rights.
+ description.fr: |
+ Vos revenus sont en dessous des seuils vous permettant de valider l'ensemble
+ de vos droits sociaux. Vous pouvez choisir de surcotiser pour augmenter vos
droits.
+ question.en: '[automatic] Would you like to contribute more to increase your
+ pension rights?'
+ question.fr: Souhaitez-vous surcotiser pour augmenter vos droits à retraite ?
titre.en: overcontribution option
titre.fr: option surcotisation
artiste-auteur . cotisations . vieillesse:
- titre.en: Basic pension contribution
- titre.fr: vieillesse
+ titre.en: '[automatic] Basic pension'
+ titre.fr: Retraite de base
artiste-auteur . revenus:
titre.en: revenues
titre.fr: revenus
@@ -317,39 +1515,119 @@ artiste-auteur . revenus . traitements et salaires:
résumé.fr: Le montant brut hors TVA de vos droits d'auteur (recettes précomptées)
titre.en: Income in wages and salaries
titre.fr: Revenu en traitements et salaires
-artiste-auteur . réduction de cotisations covid 2020:
+bénéficiaire:
description.en: >
- [automatic] In order to take into account the impact of the Covid-19 crisis
- the government has
+ [automatic] A beneficiary is a shareholder in a SAS or a partner in a
- set up a system for the payment of social security contributions of the
-
- artists-authors due by 2020 up to 2 000€.
+ SARL/EURL.
- This aid is calculated on the basis of the social security contribution base of
-
- 2019.
-
-
- The support is automatic and you don't have to take any steps to
-
- to be carried out. You will benefit from this aid after the annual declaration of
-
- 2020 revenues, i.e. in the second quarter of 2021.
+ Attention: we only take into account here the case of the sole shareholder (SASU and EURL).
+ (SASU and EURL).
description.fr: |
- Afin de tenir compte de l'impact de la crise du Covid-19 le gouvernement a
- mis en place une prise en charge des cotisations sociales des
- artistes-auteurs dues pour 2020 pouvant aller jusqu'à 2 000€.
+ Un bénéficiaire est un actionnaire dans une SAS ou un associé dans une
+ SARL/EURL.
- Cette aide est calculée à partir de l'assiette des cotisations sociales de
- 2019.
+ Attention: nous ne prenons en compte ici que le cas de figure de l'associé
+ unique (SASU et EURL).
+ titre.en: '[automatic] recipient'
+ titre.fr: bénéficiaire
+bénéficiaire . compte courant d'associé:
+ description.en: >
+ [automatic] This value is necessary to calculate the maximum amount taxable
+ under the PFU for a beneficiary under the self-employed workers' scheme.
- La prise en charge est automatique et vous n'avez pas de démarche a
- effectuer. Vous bénéficierez de cette aide après la déclaration annuelle de
- revenus 2020, soit au second trimestre 2021.
- titre.en: '[automatic] covid 2020 contribution reduction'
- titre.fr: réduction de cotisations covid 2020
+ The amount taken into account is the average annual balance of the current account. It is determined by the sum of the average monthly balances of the account, divided by the number of months included in the financial year.
+
+ The average monthly balance is equal to the sum of the daily balances, divided by the number of days in the month. The average monthly balance therefore differs from the monthly balance shown in the company's accounts.
+
+ If the account is opened or closed during the fiscal year, the number of months in the fiscal year will be reduced to the number of months the account is in operation. An account is considered to be "operating" even if it is not moved during the fiscal year. The date on which the sums paid into the current account must be assessed is the last day of the financial year preceding the payment of interest.
+ description.fr: >
+ Cette valeur est nécessaire à calculer le montant maximal imposable au PFU
+ pour un bénéficiaire au régime des travailleurs indépendants.
+
+ Le montant pris en compte est le solde moyen annuel du compte courant. Il est déterminé par la somme des soldes moyens mensuels du compte, divisée par le nombre de mois compris dans l’exercice.
+
+ Le solde moyen mensuel est égal à l’addition des soldes journaliers, divisée par le nombre de jours dans le mois. Le solde moyen mensuel diffère donc du solde mensuel figurant dans les comptes de la société.
+
+ En cas d’ouverture ou de clôture du compte en cours d’exercice, le nombre de mois au cours de l’exercice sera réduit au nombre de mois de fonctionnement du compte. Un compte est considéré comme « fonctionnant », même s’il n’est pas mouvementé au cours de l’exercice. La date à laquelle les sommes versées en compte courant doivent être appréciées est le dernier jour de l’exercice précédant le versement des intérêts.
+ question.en: '[automatic] What are the amounts paid in current account by the partner?'
+ question.fr: Quelles sont les sommes versées en compte courant par l'associé ?
+ titre.en: "[automatic] Amounts paid into a partner's current account"
+ titre.fr: Sommes versées en compte courant d'associé
+bénéficiaire . dividendes:
+ titre.en: '[automatic] dividends'
+ titre.fr: dividendes
+bénéficiaire . dividendes . bruts:
+ titre.en: '[automatic] Gross dividends paid'
+ titre.fr: Dividendes bruts versés
+bénéficiaire . dividendes . cotisations et contributions:
+ note.en: '[automatic] The CSG on income subject to the PFU is never deductible'
+ note.fr: La CSG sur les revenus soumis au PFU n'est jamais déductible
+ titre.en: '[automatic] Contributions on dividends'
+ titre.fr: Cotisations et contributions sur dividendes
+bénéficiaire . dividendes . cotisations et contributions . assiette forfaitaire:
+ description.en: >
+ [automatic] This calculation extracts the basis for dividends that are
+ subject to the PFU in terms of
+
+ contributions.
+ description.fr: |
+ Ce calcul extrait l'assiette des dividendes qui sont soumis au PFU en termes
+ de cotisations et contributions.
+ titre.en: '[automatic] Basis for dividends subject to the PFU (or "flat tax")'
+ titre.fr:
+ Assiette des dividendes soumis aux cotisations et contributions au PFU
+ (ou "flat tax")
+bénéficiaire . dividendes . cotisations et contributions . assiette forfaitaire max indépendant:
+ titre.en: '[automatic] max self-employed flat rate'
+ titre.fr: assiette forfaitaire max indépendant
+bénéficiaire . dividendes . cotisations et contributions . assiette régime indépendant:
+ description.en: >
+ [automatic] This base represents the part of the dividends that is not
+ subject to the
+
+ social security contributions but to the contributions of the
+
+ contributions of the self-employed person's scheme.
+ description.fr: |
+ Cette assiette représente la partie des dividendes qui n'est pas soumise au
+ prélèvements sociaux forfaitaires mais aux cotisations et contributions du
+ régime du travailleur indépendant.
+ titre.en: '[automatic] Basis for dividends subject to contributions under the
+ self-employed scheme'
+ titre.fr: Assiette des dividendes soumis aux cotisations et contributions du
+ régime indépendant
+bénéficiaire . dividendes . imposables:
+ description.en: >
+ [automatic] A deduction of 40% applies in the case of
+
+
+ - the company distributing the dividends is subject to corporation tax
+
+ - the company distributing the dividends is French or has its headquarters in the EU or in a
+ state having concluded agreements in this sense with France
+ - the dividends are decided in a general meeting.
+ description.fr: |
+ Un abattement de 40% s'applique dans le cas où
+
+ - la société distributrice des dividendes relève de l'IS
+ - la société distributrice est française ou a son siège en UE ou dans un
+ état ayant conclu des accords en ce sens avec la France
+ - les dividendes sont décidés en assemblée générale.
+ titre.en: '[automatic] Net taxable amount of dividends to which the income tax
+ scale applies'
+ titre.fr:
+ Net imposable des dividendes auxquels s'applique le barème de l'impôt
+ sur le revenu
+bénéficiaire . dividendes . nets:
+ titre.en: '[automatic] Net dividends'
+ titre.fr: Dividendes nets
+bénéficiaire . dividendes . nets d'impôt:
+ résumé.en: '[automatic] After payment of contributions and taxes'
+ résumé.fr: Après paiements des cotisations et impôts
+ titre.en: '[automatic] Net dividends'
+ titre.fr: Dividendes nets
chômage partiel:
titre.en: '[automatic] short-time working'
titre.fr: chômage partiel
@@ -463,11 +1741,13 @@ contrat salarié . ATMP . taux moyen:
titre.fr: taux moyen
contrat salarié . ATMP . taux personnalisé:
description.en: >
- [automatic] Companies with more than 20 employees have an individualized
- rate. The company can consult the rate that the
+ [automatic] Companies with more than 20 employees have an individualised
+ rate. The company can consult its effective rate directly on the
+ net-entreprise space.
description.fr: >
Les entreprises de plus de 20 salariés ont un taux individualisé.
- L'entreprise peut consulter le taux qui la
+ L'entreprise peut consulter son taux effectif directement sur espace
+ net-entreprise.
question.en: "[automatic] What is the company's AT/MP rate?"
question.fr: Quel est le taux AT/MP de l'entreprise ?
titre.en: '[automatic] personalized rate'
@@ -601,7 +1881,7 @@ contrat salarié . CDD . indemnité compensatrice de congés payés:
period.
- Salary continuation method
+ Salary continuation method
This method will most often be favorable to the employee when the employee has
@@ -633,7 +1913,7 @@ contrat salarié . CDD . indemnité compensatrice de congés payés:
rémunération brute totale perçue par le salarié au cours de la période de
référence.
- ### Méthode "maintien du salaire"
+ ### Méthode "maintien du salaire"
Cette méthode sera le plus souvent favorable au salarié lorsque celui-ci a
bénéficié d’une augmentation de salaire.
@@ -648,16 +1928,16 @@ contrat salarié . CDD . indemnité compensatrice de congés payés:
Note that the El Khomri law modifies article L3141-12:
- - before: Leave can be taken as soon as the entitlement arises.
+ - before : Leave can be taken as soon as the rights are opened
- - now: Leaves can be taken as soon as you are hired.
+ - now : Leave can be taken as soon as the employee is hired
note.fr: >
L'indemnité est versée à la fin du contrat, sauf si le CDD se poursuit par
un CDI.
À noter, la loi El Khomri modifie l'article L3141-12:
- - avant : Les congés peuvent être pris dès l'ouverture des droits
+ - avant : Les congés peuvent être pris dès l'ouverture des droits
- maintenant : Les congés peuvent être pris dès l’embauche
titre.en: '[automatic] holiday pay'
@@ -816,28 +2096,6 @@ contrat salarié . CDD . prime de fin de contrat:
- Dans les faits, les CDD Senior perçoivent une indemnité d’un montant équivalent à l’indemnité de précarité : [line](https://www.easycdd.com/LEGISLATION-CDD/Fin-ou-rupture-du-contrat-CDD/La-prime-de-precarite/La-prime-de-precarite-n-est-pas-due-si)
titre.en: End of contract bonus
titre.fr: prime de fin de contrat
-contrat salarié . CDD . taxe forfaitaire sur les CDD d'usage:
- description.en: >
- [automatic] As of January 1, 2020, the employer must pay a tax on the
- following
-
- for each conclusion of a customary fixed-term contract. The objective of this
-
- tax is to discourage the excessive use of short contracts.
-
-
- Certain sectors of activity defined in the Labour Code are not defined in the Labour Code.
-
- concerned by this tax.
- description.fr: |
- À compter du 1er janvier 2020, l'employeur doit s'acquitter d'une taxe
- forfaitaire pour chaque conclusion d'un CDD d'usage. L'objectif de cette
- taxe est de décourager le recours excessif aux contrats courts.
-
- Certains secteurs d'activités définis dans le code du travail ne sont pas
- concernés par cette taxe.
- titre.en: flat-rate tax on customary fixed-term contracts
- titre.fr: taxe forfaitaire sur les CDD d'usage
contrat salarié . CDD . événement:
description.en: >-
Some events have a strong impact on the financial obligations of the
@@ -932,8 +2190,8 @@ contrat salarié . CSG et CRDS . assiette abattue totale:
contrat salarié . CSG et CRDS . assiette de base:
titre.en: '[automatic] base plate'
titre.fr: assiette de base
-? contrat salarié . CSG et CRDS . assiette heures supplémentaires et complémentaires défiscalisées
-: titre.en: '[automatic] tax-free overtime and additional hours base'
+contrat salarié . CSG et CRDS . assiette heures supplémentaires et complémentaires défiscalisées:
+ titre.en: '[automatic] tax-free overtime and additional hours base'
titre.fr: assiette heures supplémentaires et complémentaires défiscalisées
contrat salarié . CSG et CRDS . assiette revenu remplacements:
titre.en: '[automatic] income base replacements'
@@ -1064,8 +2322,8 @@ contrat salarié . activité partielle . heures travaillées:
suggestions.30 h/semaine.fr: 30 h/semaine
titre.en: '[automatic] remaining hours worked'
titre.fr: heures travaillées restantes
-? contrat salarié . activité partielle . heures travaillées . contrôle temps de travail
-: description.en:
+contrat salarié . activité partielle . heures travaillées . contrôle temps de travail:
+ description.en:
'[automatic] In the context of the partial activity, the working
time must be less than that stipulated in the employment contract.'
description.fr:
@@ -1082,8 +2340,8 @@ contrat salarié . activité partielle . indemnisation entreprise:
prise à 100% en charge par l'état.
titre.en: '[automatic] Reimbursement of partial activity allowance'
titre.fr: Remboursement de l'indemnité d'activité partielle
-? contrat salarié . activité partielle . indemnisation entreprise . taux d'indemnisation
-: description.en: >-
+contrat salarié . activité partielle . indemnisation entreprise . taux d'indemnisation:
+ description.en: >-
[automatic] As of June 1, the company's compensation rate increases to 60%.
The compensation paid to the employee remains unchanged and it is therefore
the company that will have to pay the difference.
@@ -1131,8 +2389,8 @@ contrat salarié . activité partielle . indemnités . complémentaire:
contrat salarié . activité partielle . indemnités . conventionnelle:
titre.en: '[automatic] conventional'
titre.fr: conventionnelle
-? contrat salarié . activité partielle . indemnités . conventionnelle . part soumise à cotisation
-: titre.en: '[automatic] contributable portion'
+contrat salarié . activité partielle . indemnités . conventionnelle . part soumise à cotisation:
+ titre.en: '[automatic] contributable portion'
titre.fr: part soumise à cotisation
contrat salarié . activité partielle . retrait absence:
titre.en: '[automatic] partial activity withdrawal'
@@ -1192,8 +2450,8 @@ contrat salarié . aides employeur:
résumé.fr: Pour l'employeur, différées dans le temps
titre.en: '[automatic] employer assistance'
titre.fr: aides employeur
-? contrat salarié . aides employeur . aide exceptionnelle à l'embauche d'apprentis
-: description.en: >-
+contrat salarié . aides employeur . aide exceptionnelle à l'embauche d'apprentis:
+ description.en: >-
[automatic] As part of the economic recovery plan for the start of the new
school year in 2020, the government is putting in place exceptional
assistance for the recruitment of apprentices.
@@ -1236,8 +2494,17 @@ contrat salarié . aides employeur . aide à l'embauche d'apprentis:
Une fois les démarches d'enregistrement effectuées, l'aide est versée automatiquement tous les mois.
titre.en: aid to hire apprentices
titre.fr: aide à l'embauche d'apprentis
-? contrat salarié . aides employeur . aide à l'embauche senior professionnalisation
-: description.en: |
+contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés:
+ description.en: '[automatic] As part of the recovery plan, the government has
+ decided to create a recruitment aid aimed at encouraging the employment of
+ people with disabilities, regardless of their age.'
+ description.fr: Dans le cadre du plan de relance, le gouvernement a décidé de
+ créer une aide à l’embauche visant à favoriser l’emploi des personnes en
+ situation de handicap quel que soit leur âge.
+ titre.en: '[automatic] aid for the recruitment of disabled workers'
+ titre.fr: aide à l'embauche des travailleurs handicapés
+contrat salarié . aides employeur . aide à l'embauche senior professionnalisation:
+ description.en: |
[automatic] Employers can get €2,000 for the hiring of an
jobseekers over 45 years of age on a professionalization contract.
description.fr: |
@@ -1245,26 +2512,30 @@ contrat salarié . aides employeur . aide à l'embauche d'apprentis:
demandeur d'emploi de plus de 45 ans en contrat de professionnalisation.
titre.en: '[automatic] senior professionalization hiring assistance'
titre.fr: aide à l'embauche senior professionnalisation
+contrat salarié . aides employeur . aides à l'embauche:
+ description.en: >
+ [automatic] The State provides aid to encourage the hiring of certain
+ priority groups. This aid cannot be combined with other aid.
+ description.fr: >
+ L'État met en place des aides pour encourager l'embauche de certains publics
+ prioritaires. Ces aides sont non cumulables entre elles.
+ titre.en: '[automatic] hiring aids'
+ titre.fr: aides à l'embauche
contrat salarié . aides employeur . emploi franc:
description.en: >
- [automatic] Deferred assistance paid by Pôle emploi for hiring a job seeker
+ [automatic] Deferred aid paid by Pôle emploi for the hiring of a job seeker
- registered with Pôle Emploi and living in a priority district of the city
+ registered with Pôle Emploi and residing in a priority neighbourhood of the city
(QPV).
- - *Hiring on permanent contracts*: €5,000/year for 3 years, i.e. a total of €15,000
+ - Hiring on a permanent contract*: €5000/year for 3 years, i.e. a total of €15,000
- - * hiring on a fixed-term contract of at least 6 months*: 2,500€/year for 2 years, i.e. 5,000€ maximum
+ - Hiring on a fixed-term contract of at least 6 months*: €2,500/year for 2 years, i.e. a maximum of €5,000
- > As part of the "France Relance" plan, the scheme is being upgraded to
-
- hiring until January 31, 2021.
-
-
- [🗺 Check address eligibility](https://sig.ville.gouv.fr/recherche-adresses-qp-polville)
+ [🗺 Check the eligibility of an address](https://sig.ville.gouv.fr/recherche-adresses-qp-polville)
description.fr: >
Aide différée versée par Pôle emploi pour l'embauche d'un demandeur d'emploi
@@ -1278,25 +2549,20 @@ contrat salarié . aides employeur . emploi franc:
- *embauche en CDD d'au moins 6 mois* : 2 500€/an pendant 2 ans, soit 5 000€ au maximum
- > Dans le cadre du plan "France Relance", le dispositif est revalorisé pour
-
- une embauche jusqu'au 31 janvier 2021.
-
-
[🗺 Vérifier l'éligibilité d'une adresse](https://sig.ville.gouv.fr/recherche-adresses-qp-polville)
titre.en: '[automatic] open job'
titre.fr: emploi franc
contrat salarié . aides employeur . emploi franc . éligible:
description.en: >
- [automatic] Terms and conditions:
+ [automatic] Conditions:
- - The recruited employee is a job seeker registered with Pôle Emploi and resides in a priority district of the city (QPV) [check the eligibility of a district](https://sig.ville.gouv.fr/recherche-adresses-qp-polville)
+ - The employee recruited is a job seeker registered with Pôle Emploi and resides in a priority urban district (QPV) [check the eligibility of a district](https://sig.ville.gouv.fr/recherche-adresses-qp-polville)
- - The employer is up to date with its contributions and has not made an economic layoff for the position filled in the 6 months prior to recruitment.
+ - The employer is up to date with its contributions and has not made an economic redundancy for the position filled in the 6 months preceding recruitment
- - The recruited employee must not have been part of the company's workforce in the 6 months prior to hiring.
+ - The employee recruited must not have been part of the company's workforce in the 6 months prior to recruitment
description.fr: >
- Conditions :
+ Conditions :
- Le salarié recruté est un demandeur d'emploi inscrit à Pôle Emploi et réside dans un quartier prioritaire de la ville (QPV) [vérifier l'éligibilité d'un quartier](https://sig.ville.gouv.fr/recherche-adresses-qp-polville)
@@ -1434,13 +2700,14 @@ contrat salarié . complémentaire santé . contrôle min:
titre.fr: contrôle min
contrat salarié . complémentaire santé . forfait:
description.en: >-
- [automatic] The employer has the obligation to offer a complementary health
- care package. He must pay at least half of the cost.
+ [automatic] The employer is obliged to offer a complementary health
+ insurance. The employer must cover at least half of the cost of the
+ supplementary health insurance.
- The amount may vary, but the plan must cover a legal minimum basket of care.
+ The amount may vary, but the plan must cover a minimum legal basket of care.
description.fr: >-
L'employeur a l'obligation de proposer une offre de complémentaire santé. Il
- doit prendre à sa charge au moins la moitié de son coût.
+ doit prendre à sa charge au moins la moitié de son coût.
Le montant peut varier, mais la prévoyance doit couvrir un panier minimum légal de soins.
note.en: '[automatic] For historical reasons, social health coverage for
@@ -1554,8 +2821,8 @@ contrat salarié . convention collective . BTP . catégorie:
contrat salarié . convention collective . BTP . catégorie . cadre:
titre.en: '[automatic] Framework'
titre.fr: Cadre
-? contrat salarié . convention collective . BTP . catégorie . cadre . prévoyance complémentaire
-: titre.en: '[automatic] supplementary pension'
+contrat salarié . convention collective . BTP . catégorie . cadre . prévoyance complémentaire:
+ titre.en: '[automatic] supplementary pension'
titre.fr: prévoyance complémentaire
contrat salarié . convention collective . BTP . catégorie . etam:
description.en: '[automatic] Employee, technician, master angel'
@@ -1567,52 +2834,52 @@ contrat salarié . convention collective . BTP . catégorie . etam:
13 décembre 1990.
titre.en: '[automatic] ETAM'
titre.fr: ETAM
-? contrat salarié . convention collective . BTP . catégorie . etam . prévoyance complémentaire
-: titre.en: '[automatic] supplementary pension'
+contrat salarié . convention collective . BTP . catégorie . etam . prévoyance complémentaire:
+ titre.en: '[automatic] supplementary pension'
titre.fr: prévoyance complémentaire
contrat salarié . convention collective . BTP . catégorie . ouvrier:
titre.en: '[automatic] Worker'
titre.fr: Ouvrier
-? contrat salarié . convention collective . BTP . catégorie . ouvrier . prévoyance complémentaire
-: titre.en: '[automatic] supplementary pension'
+contrat salarié . convention collective . BTP . catégorie . ouvrier . prévoyance complémentaire:
+ titre.en: '[automatic] supplementary pension'
titre.fr: prévoyance complémentaire
contrat salarié . convention collective . BTP . congés intempéries:
titre.en: '[automatic] bad weather'
titre.fr: congés intempéries
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement
-: question.en:
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement:
+ question.en:
'[automatic] To which fund is the company attached for the payment
of the bad weather contribution?'
question.fr: À quelle caisse l'entreprise est-elle rattachée pour le versement
de la cotisation congés intempéries ?
titre.en: '[automatic] home office fund'
titre.fr: caisse de rattachement
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . centre
-: titre.en: '[automatic] centre'
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . centre:
+ titre.en: '[automatic] centre'
titre.fr: centre
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . centre ouest
-: titre.en: '[automatic] western center'
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . centre ouest:
+ titre.en: '[automatic] western center'
titre.fr: centre ouest
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . grand est
-: titre.en: '[automatic] great east'
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . grand est:
+ titre.en: '[automatic] great east'
titre.fr: grand est
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . grand ouest
-: titre.en: '[automatic] great west'
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . grand ouest:
+ titre.en: '[automatic] great west'
titre.fr: grand ouest
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . idf
-: titre.en: '[automatic] Île-de-France'
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . idf:
+ titre.en: '[automatic] Île-de-France'
titre.fr: Île-de-France
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . méditerranée
-: titre.en: '[automatic] mediterranean'
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . méditerranée:
+ titre.en: '[automatic] mediterranean'
titre.fr: méditerranée
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . nord ouest
-: titre.en: '[automatic] northwest'
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . nord ouest:
+ titre.en: '[automatic] northwest'
titre.fr: nord ouest
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . rhône alpes auvergne
-: titre.en: '[automatic] rhône alpes auvergne'
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . rhône alpes auvergne:
+ titre.en: '[automatic] rhône alpes auvergne'
titre.fr: rhône alpes auvergne
-? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . sud ouest
-: titre.en: '[automatic] southwest'
+contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . sud ouest:
+ titre.en: '[automatic] southwest'
titre.fr: sud ouest
contrat salarié . convention collective . BTP . cotisations conventionnelles:
titre.en: '[automatic] conventional contributions'
@@ -1622,12 +2889,15 @@ contrat salarié . convention collective . HCR:
description.fr: L'entreprise est un hôtel, café, restaurant ou assimilé.
titre.en: '[automatic] hotels, cafés and restaurants HCR'
titre.fr: hôtels, cafés restaurants HCR
-? contrat salarié . convention collective . HCR . majoration heures supplémentaires
-: titre.en: overtime increase
+contrat salarié . convention collective . HCR . majoration heures supplémentaires:
+ titre.en: overtime increase
titre.fr: majoration heures supplémentaires
contrat salarié . convention collective . HCR . montant forfaitaire d'un repas:
titre.en: fixed amount of a meal
titre.fr: montant forfaitaire d'un repas
+contrat salarié . convention collective . HCR . prévoyance conventionnelle:
+ titre.en: '[automatic] conventional pension fund'
+ titre.fr: prévoyance conventionnelle
contrat salarié . convention collective . SVP:
description.en: >
The company depends on the national collective agreement of performing arts
@@ -1687,8 +2957,8 @@ contrat salarié . convention collective . compta:
ainsi que les centres de gestion agréés et les associations agréées (AGC).
titre.en: '[automatic] Chartered Accountants and Statutory Auditors'
titre.fr: Experts-comptables et commissaires aux comptes
-? contrat salarié . convention collective . compta . majoration heures supplémentaires
-: titre.en: '[automatic] overtime increase'
+contrat salarié . convention collective . compta . majoration heures supplémentaires:
+ titre.en: '[automatic] overtime increase'
titre.fr: majoration heures supplémentaires
contrat salarié . convention collective . contrôle décharge:
description.en: '[automatic] Caution: the implementation of the collective
@@ -1728,8 +2998,8 @@ contrat salarié . convention collective . optique . prévoyance . employeur:
contrat salarié . convention collective . optique . prévoyance . salarié:
titre.en: '[automatic] employee'
titre.fr: salarié
-? contrat salarié . convention collective . optique . salaire minimum conventionnel
-: titre.en: '[automatic] standard minimum wage'
+contrat salarié . convention collective . optique . salaire minimum conventionnel:
+ titre.en: '[automatic] standard minimum wage'
titre.fr: salaire minimum conventionnel
contrat salarié . convention collective . sport:
description.en: >
@@ -1747,37 +3017,37 @@ contrat salarié . convention collective . sport:
contrat salarié . convention collective . sport . cotisations:
titre.en: contributions
titre.fr: cotisations
-? contrat salarié . convention collective . sport . cotisations . assiette forfaitaire
-: titre.en: flat-rate contribution base
+contrat salarié . convention collective . sport . cotisations . assiette forfaitaire:
+ titre.en: flat-rate contribution base
titre.fr: assiette forfaitaire
-? contrat salarié . convention collective . sport . cotisations . assiette franchisée
-: titre.en: franchised contribution base
+contrat salarié . convention collective . sport . cotisations . assiette franchisée:
+ titre.en: franchised contribution base
titre.fr: assiette franchisée
-? contrat salarié . convention collective . sport . cotisations . financement du paritarisme
-: note.en: '[automatic] is calculated on the payroll'
+contrat salarié . convention collective . sport . cotisations . financement du paritarisme:
+ note.en: '[automatic] is calculated on the payroll'
note.fr: se calcule sur la masse salariale
titre.en: financing of gender mainstreaming
titre.fr: financement du paritarisme
-? contrat salarié . convention collective . sport . cotisations . formation professionnelle
-: titre.en: professional training
+contrat salarié . convention collective . sport . cotisations . formation professionnelle:
+ titre.en: professional training
titre.fr: formation professionnelle
-? contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDD
-: titre.en: CIF CDD
+contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDD:
+ titre.en: CIF CDD
titre.fr: CIF CDD
-? contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDI
-: titre.en: CIF CDI
+contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDI:
+ titre.en: CIF CDI
titre.fr: CIF CDI
-? contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation
-: titre.en: professional training plan
+contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation:
+ titre.en: professional training plan
titre.fr: plan de formation
-? contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation . versement minimum
-: titre.en: minimum contribution
+contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation . versement minimum:
+ titre.en: minimum contribution
titre.fr: versement minimum
-? contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation
-: titre.en: professionalization
+contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation:
+ titre.en: professionalization
titre.fr: professionnalisation
-? contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation . versement minimum
-: titre.en: minimum contribution
+contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation . versement minimum:
+ titre.en: minimum contribution
titre.fr: versement minimum
contrat salarié . convention collective . sport . cotisations . franchise:
titre.en: exemption
@@ -1788,31 +3058,31 @@ contrat salarié . convention collective . sport . cotisations . patronales:
contrat salarié . convention collective . sport . cotisations . prévoyance:
titre.en: insurance
titre.fr: prévoyance
-? contrat salarié . convention collective . sport . cotisations . régime frais de santé
-: titre.en: health care plan
+contrat salarié . convention collective . sport . cotisations . régime frais de santé:
+ titre.en: health care plan
titre.fr: régime frais de santé
-? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option
-: question.en: What option was chosen for the health care plan?
+contrat salarié . convention collective . sport . cotisations . régime frais de santé . option:
+ question.en: What option was chosen for the health care plan?
question.fr: Quel option a été choisi pour le régime des frais de santé ?
titre.en: option
titre.fr: option
-? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R1
-: titre.en: R1
+contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R1:
+ titre.en: R1
titre.fr: R1
-? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R2
-: titre.en: R2
+contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R2:
+ titre.en: R2
titre.fr: R2
-? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R3
-: titre.en: R3
+contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R3:
+ titre.en: R3
titre.fr: R3
-? contrat salarié . convention collective . sport . cotisations . régime frais de santé . taux
-: titre.en: rate
+contrat salarié . convention collective . sport . cotisations . régime frais de santé . taux:
+ titre.en: rate
titre.fr: taux
contrat salarié . convention collective . sport . exonération cotisation AT:
titre.en: exemption from AT contribution
titre.fr: exonération cotisation AT
-? contrat salarié . convention collective . sport . exonération cotisation AT . refus
-: question.en: Has the employer refused to be exempt from AT contributions?
+contrat salarié . convention collective . sport . exonération cotisation AT . refus:
+ question.en: Has the employer refused to be exempt from AT contributions?
question.fr: L'employeur a-t'il refusé d'être exonéré de cotisations AT ?
titre.en: refusal of AT exemption
titre.fr: refus exonération AT
@@ -1824,8 +3094,8 @@ contrat salarié . convention collective . sport . joueur entraineur:
contrat salarié . convention collective . sport . primes:
titre.en: event bonuses
titre.fr: primes de manifestation
-? contrat salarié . convention collective . sport . primes . autres manifestations
-: question.en: What is the bonus for the other events
+contrat salarié . convention collective . sport . primes . autres manifestations:
+ question.en: What is the bonus for the other events
question.fr: Quelles primes pour les autres manifestations ?
titre.en: other events
titre.fr: autres manifestations
@@ -1834,43 +3104,43 @@ contrat salarié . convention collective . sport . primes . manifestation 1:
question.fr: Quelle prime pour la première manifestation ?
titre.en: event 1
titre.fr: manifestation 1
-? contrat salarié . convention collective . sport . primes . manifestation 1 . franchise
-: titre.en: exemption event 1
+contrat salarié . convention collective . sport . primes . manifestation 1 . franchise:
+ titre.en: exemption event 1
titre.fr: franchise manifestation 1
contrat salarié . convention collective . sport . primes . manifestation 2:
question.en: What is the bonus for the second event ?
question.fr: Quelle prime pour la deuxième manifestation ?
titre.en: event 2
titre.fr: manifestation 2
-? contrat salarié . convention collective . sport . primes . manifestation 2 . franchise
-: titre.en: exemption event 2
+contrat salarié . convention collective . sport . primes . manifestation 2 . franchise:
+ titre.en: exemption event 2
titre.fr: franchise manifestation 2
contrat salarié . convention collective . sport . primes . manifestation 3:
question.en: What is the bonus for the third event ?
question.fr: Quelle prime pour la troisième manifestation ?
titre.en: event 3
titre.fr: manifestation 3
-? contrat salarié . convention collective . sport . primes . manifestation 3 . franchise
-: titre.en: exemption event 3
+contrat salarié . convention collective . sport . primes . manifestation 3 . franchise:
+ titre.en: exemption event 3
titre.fr: franchise manifestation 3
contrat salarié . convention collective . sport . primes . manifestation 4:
question.en: What is the bonus for the fourth event ?
question.fr: Quelle prime pour la quatrième manifestation ?
titre.en: event 4
titre.fr: manifestation 4
-? contrat salarié . convention collective . sport . primes . manifestation 4 . franchise
-: titre.en: exemption event 4
+contrat salarié . convention collective . sport . primes . manifestation 4 . franchise:
+ titre.en: exemption event 4
titre.fr: franchise manifestation 4
contrat salarié . convention collective . sport . primes . manifestation 5:
question.en: What is the bonus for the fifth event ?
question.fr: Quelle prime pour la cinquième manifestation ?
titre.en: event 5
titre.fr: manifestation 5
-? contrat salarié . convention collective . sport . primes . manifestation 5 . franchise
-: titre.en: exemption event 5
+contrat salarié . convention collective . sport . primes . manifestation 5 . franchise:
+ titre.en: exemption event 5
titre.fr: franchise manifestation 5
-? contrat salarié . convention collective . sport . primes . nombre de manifestations
-: question.en: How many paid sportive events did the player perform this month?
+contrat salarié . convention collective . sport . primes . nombre de manifestations:
+ question.en: How many paid sportive events did the player perform this month?
question.fr: Combien de manifestations rémunérées le joueur a-t'il effectué ?
titre.en: number of events
titre.fr: nombre de manifestations
@@ -1944,14 +3214,14 @@ contrat salarié . cotisations . patronales . réductions de cotisations:
The formula below therefore automatically selects the most advantageous for the employer.
description.fr: >-
- À l'exception de la déduction heure supplémentaire, les dispositifs de
- réduction de cotisations patronales sont mutuellement exclusif.
+ À l'exception de la déduction heure supplémentaire, les dispositifs de
+ réduction de cotisations patronales sont mutuellement exclusif.
- Le formule ci dessous selectionne donc automatiquement le plus avantageux pour l'employeur.
+ Le formule ci dessous selectionne donc automatiquement le plus avantageux pour l'employeur.
titre.en: "[automatic] employer's reductions"
titre.fr: réductions patronales
-? contrat salarié . cotisations . patronales . réductions de cotisations . déduction heures supplémentaires
-: note.en: '[automatic] Deduction does not apply to overtime work.'
+contrat salarié . cotisations . patronales . réductions de cotisations . déduction heures supplémentaires:
+ note.en: '[automatic] Deduction does not apply to overtime work.'
note.fr: La déduction ne s’applique pas aux heures complémentaires
titre.en: flat-rate deduction for overtime
titre.fr: déduction forfaitaire pour heures supplémentaires
@@ -1969,8 +3239,8 @@ contrat salarié . cotisations . salariales . conventionnelles:
contrat salarié . cotisations . salariales . réduction heures supplémentaires:
titre.en: reduction for overtime hours
titre.fr: réduction heures supplémentaires
-? contrat salarié . cotisations . salariales . réduction heures supplémentaires . taux des cotisations réduites
-: description.en: the effective rate of the employee's pension contributions
+contrat salarié . cotisations . salariales . réduction heures supplémentaires . taux des cotisations réduites:
+ description.en: the effective rate of the employee's pension contributions
description.fr: le taux effectif des cotisations d'assurance vieillesse à la
charge du salarié
titre.en: reduced contribution rates
@@ -1979,25 +3249,75 @@ contrat salarié . cotisations . salariales . réductions de cotisations:
titre.en: '[automatic] pay cuts'
titre.fr: réductions salariales
contrat salarié . déduction forfaitaire spécifique:
- description.en: '[automatic] For a specific list of professions, the employer
- may make a specific flat-rate deduction for professional expenses on the
- basis of the calculation of social security contributions.'
- description.fr: Pour une liste précise de professions, l'employeur peut
- pratiquer une déduction forfaitaire spécifique pour frais professionnels sur
- la base de calcul des cotisations sociales.
+ description.en: >-
+ [automatic] For a specific list of professions, the employer can apply a
+ specific fixed deduction (DFS) for professional expenses on the basis of
+ calculation of social contributions. It can be applied if the employee
+ actually incurs expenses during his professional activity.
+
+ If no expenses are actually incurred, or if the employer pays or reimburses all of the professional expenses, the DFS cannot be applied.
+ description.fr: >-
+ Pour une liste précise de professions, l'employeur peut pratiquer une
+ déduction forfaitaire spécifique (DFS) pour frais professionnels sur la base
+ de calcul des cotisations sociales. spécifique consiste en un abattement sur
+ l'assiette des cotisations sociales. Elle peut s'appliquer si le salarié
+ supporte effectivement des frais lors de son activité professionnelle.
+
+ En l’absence de frais effectivement engagés, ou si l’employeur prend en charge ou rembourse la totalité des frais professionnels, il est impossible d’appliquer la DFS.
+ question.en: '[automatic] Does the employee benefit from a specific standard deduction?'
+ question.fr: Le salarié bénéficie-t-il d'une déduction forfaitaire spécifique ?
titre.en: '[automatic] plate with DFS'
titre.fr: assiette avec DFS
-contrat salarié . déduction forfaitaire spécifique . application:
- description.en: '[automatic] The specific flat-rate deduction consists of a
- deduction from the social security contribution base. The employer may waive
- this deduction in order to grant more rights to the employee, in particular
- in terms of pension and unemployment insurance.'
- description.fr: La déduction forfaitaire spécifique consiste en un abattement
- sur l'assiette des cotisations sociales. L'employeur peut renoncer à
- appliquer cette déduction afin d'accorder plus de droits au salarié,
- notamment en terme de retraite et d'assurance chômage.
- titre.en: '[automatic] DFS implementation'
- titre.fr: application de la DFS
+contrat salarié . déduction forfaitaire spécifique . profession:
+ question.en:
+ "[automatic] What is the employee's occupation for the application
+ of the specific flat-rate deduction?"
+ question.fr: Quelle est la profession du salarié pour l'application de la
+ déduction forfaitaire spécifique ?
+ titre.en: '[automatic] profession'
+ titre.fr: profession
+contrat salarié . déduction forfaitaire spécifique . profession . artiste musicien:
+ description.en: '[automatic] Concerns musicians, chorus members, conductors,
+ theatre managers'
+ description.fr: Concerne les artistes musiciens, choristes, chefs d’orchestre,
+ régisseurs de théâtre
+ titre.en: '[automatic] musical artist'
+ titre.fr: artiste musicien
+contrat salarié . déduction forfaitaire spécifique . profession . journaliste:
+ description.en: '[automatic] Concerns journalists, editors, photographers,
+ newspaper editors Drama and music critics.'
+ description.fr:
+ Concerne les journalistes, rédacteurs, photographes, directeurs
+ de journaux Critiques dramatiques et musicaux.
+ titre.en: '[automatic] journalist'
+ titre.fr: journaliste
+contrat salarié . déduction forfaitaire spécifique . profession . journaliste . abattement fiscal:
+ titre.en: '[automatic] net taxable journalist'
+ titre.fr: net imposable journaliste
+contrat salarié . déduction forfaitaire spécifique . profession . journaliste . réduction de taux:
+ titre.en: '[automatic] rate reduction'
+ titre.fr: réduction de taux
+contrat salarié . déduction forfaitaire spécifique . profession . ouvrier du bâtiment:
+ description.en: '[automatic] Concerns construction workers referred to in
+ paragraphs 1 and 2 of Article 1 of the Decree of 17 November 1936, excluding
+ those working in factories or workshops.'
+ description.fr:
+ Concerne les ouvriers du bâtiment visés aux paragraphes 1er et 2
+ de l’article 1er du décret du 17 novembre 1936, à l’exclusion de ceux qui
+ travaillent en usine ou en atelier.
+ titre.en: '[automatic] construction worker'
+ titre.fr: ouvrier du bâtiment
+contrat salarié . déduction forfaitaire spécifique . profession . pilote de ligne ou personnel navigant:
+ description.en: '[automatic] Concerns pilots, radios, flight engineers of air
+ transport companies; pilots and mechanics employed by aircraft and engine
+ manufacturing companies for the testing of prototypes; pilot instructors of
+ flying clubs and civil aviation schools'
+ description.fr: Concerne les pilotes, radios, mécaniciens navigants des
+ compagnies de transports aériens ; pilotes et mécaniciens employés par les
+ maisons de construction d’avions et de moteurs pour l’essai de prototypes ;
+ pilotes moniteurs d’aéro-clubs et des écoles d’aviation civile
+ titre.en: '[automatic] airline pilot or flight attendant'
+ titre.fr: pilote de ligne ou personnel navigant
contrat salarié . déduction forfaitaire spécifique . taux:
titre.en: '[automatic] rates'
titre.fr: taux
@@ -2105,8 +3425,8 @@ contrat salarié . frais professionnels:
contrat salarié . frais professionnels . abonnement transports publics:
titre.en: '[automatic] public transport pass'
titre.fr: abonnement transports publics
-? contrat salarié . frais professionnels . abonnement transports publics . montant
-: description.en: >
+contrat salarié . frais professionnels . abonnement transports publics . montant:
+ description.en: >
[automatic] The employer must pay 50% of the amount spent by the employee on
public transport to work.
@@ -2142,15 +3462,15 @@ contrat salarié . frais professionnels . abonnement transports publics:
suggestions.Técély.fr: Técély
titre.en: '[automatic] Public transport season ticket'
titre.fr: Abonnement aux transports publics
-? contrat salarié . frais professionnels . abonnement transports publics . prise en charge
-: titre.en: "[automatic] Public transport season ticket, employer's share (deductible)"
+contrat salarié . frais professionnels . abonnement transports publics . prise en charge:
+ titre.en: "[automatic] Public transport season ticket, employer's share (deductible)"
titre.fr: Abonnement transports publics, part prise en charge par l'employeur
(déductible)
-? contrat salarié . frais professionnels . abonnement transports publics . taux de participation employeur
-: titre.en: '[automatic] employer participation rate'
+contrat salarié . frais professionnels . abonnement transports publics . taux de participation employeur:
+ titre.en: '[automatic] employer participation rate'
titre.fr: taux de participation employeur
-? contrat salarié . frais professionnels . abonnement transports publics . taux de prise en charge
-: titre.en: Employer's share
+contrat salarié . frais professionnels . abonnement transports publics . taux de prise en charge:
+ titre.en: Employer's share
titre.fr: Taux de prise en charge
contrat salarié . frais professionnels . part déductible:
description.en: '[automatic] Share of expenses deducted from the social
@@ -2161,19 +3481,19 @@ contrat salarié . frais professionnels . part déductible:
titre.fr: Frais professionnels déductibles
contrat salarié . frais professionnels . titres-restaurant:
description.en: >-
- [automatic] The meal voucher is a special "meal" payment voucher issued by
+ [automatic] The meal voucher is a special "meal" payment voucher given by
the employer to the employee.
- The employee may only use the meal vouchers in his or her possession to pay for consumption:
+ The employee can only use the meal vouchers in his possession to pay for consumption:
- - of a meal,
+ - a meal,
- - of directly consumable food preparations,
-
- - of fruits and vegetables.
+ - directly consumable food preparations,
- This security can be issued in paper or dematerialised form.
+ - fruit and vegetables.
+
+ This title can be issued on paper or in dematerialized form.
description.fr: >-
Le titre-restaurant est un titre spécial de paiement « des repas » remis par
l’employeur au salarié.
@@ -2184,7 +3504,7 @@ contrat salarié . frais professionnels . titres-restaurant:
- d’un repas,
- de préparations alimentaires directement consommables,
-
+
- de fruits et légumes.
Ce titre peut être émis sur support papier ou sous forme dématérialisée.
@@ -2192,15 +3512,15 @@ contrat salarié . frais professionnels . titres-restaurant:
question.fr: Le salarié reçoit-il des titres-restaurant ?
titre.en: '[automatic] restaurant vouchers'
titre.fr: titres-restaurant
-? contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur max
-: description.en:
+contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur max:
+ description.en:
"[automatic] The employer's share of the meal voucher must be a
maximum of 60%."
description.fr: La part employeur du titre-restaurant doit être de 60% au maximum
titre.en: '[automatic] control max. employer rate'
titre.fr: contrôle taux employeur max
-? contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur min
-: description.en: "[automatic] The employer's share of the meal voucher must be at least 50%."
+contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur min:
+ description.en: "[automatic] The employer's share of the meal voucher must be at least 50%."
description.fr: La part employeur du titre-restaurant doit être de 50% au minimum
titre.en: '[automatic] control minimum employer rate'
titre.fr: contrôle taux employeur min
@@ -2237,8 +3557,8 @@ contrat salarié . frais professionnels . titres-restaurant . nombre:
contrat salarié . frais professionnels . titres-restaurant . part déductible:
titre.en: '[automatic] Restaurant vouchers (deductible)'
titre.fr: Titres-restaurant (déductible)
-? contrat salarié . frais professionnels . titres-restaurant . taux participation employeur
-: description.en:
+contrat salarié . frais professionnels . titres-restaurant . taux participation employeur:
+ description.en:
'[automatic] Employer-paid portion of the meal voucher. Must be
a minimum of 50% and a maximum of 60%.'
description.fr:
@@ -2255,11 +3575,11 @@ contrat salarié . frais professionnels . titres-restaurant . part déductible:
contrat salarié . frais professionnels . transports personnels:
titre.en: '[automatic] personal transports'
titre.fr: transports personnels
-? contrat salarié . frais professionnels . transports personnels . carburant faible émission
-: titre.en: '[automatic] low emission fuel'
+contrat salarié . frais professionnels . transports personnels . carburant faible émission:
+ titre.en: '[automatic] low emission fuel'
titre.fr: carburant faible émission
-? contrat salarié . frais professionnels . transports personnels . carburant faible émission . montant
-: description.en: >
+contrat salarié . frais professionnels . transports personnels . carburant faible émission . montant:
+ description.en: >
[automatic] The employer may cover all or part of the fuel costs incurred by
the employee for his electric, plug-in hybrid or hydrogen vehicle, upon
presentation of proof.
@@ -2298,16 +3618,16 @@ contrat salarié . frais professionnels . transports personnels:
titre.en: '[automatic] Fuel support for electric, plug-in hybrid or hydrogen vehicles'
titre.fr: Prise en charge du carburant pour véhicule électrique, hybride
rechargeable ou hydrogène
-? contrat salarié . frais professionnels . transports personnels . carburant faible émission . part déductible
-: titre.en: '[automatic] Fuel support for electric vehicles, plug-in hybrids or
+contrat salarié . frais professionnels . transports personnels . carburant faible émission . part déductible:
+ titre.en: '[automatic] Fuel support for electric vehicles, plug-in hybrids or
hydrogen (deductible part)'
titre.fr: Prise en charge du carburant pour véhicule électrique, hybride
rechargeable ou hydrogène (part déductible)
-? contrat salarié . frais professionnels . transports personnels . forfait mobilités durables
-: titre.en: '[automatic] sustainable mobility package'
+contrat salarié . frais professionnels . transports personnels . forfait mobilités durables:
+ titre.en: '[automatic] sustainable mobility package'
titre.fr: forfait mobilités durables
-? contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . montant
-: description.en: >
+contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . montant:
+ description.en: >
[automatic] The employer may cover all or part of the travel expenses
related to the use of vehicles included in the sustainable mobility package.
@@ -2368,19 +3688,19 @@ contrat salarié . frais professionnels . transports personnels:
forfait mobilités durables ?
titre.en: '[automatic] Coverage of transport costs for sustainable mobility packages'
titre.fr: Prise en charge des frais de transports forfait mobilités durables
-? contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . part déductible
-: titre.en: '[automatic] Coverage of fixed-price transport costs for sustainable
+contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . part déductible:
+ titre.en: '[automatic] Coverage of fixed-price transport costs for sustainable
mobility (deductible part)'
titre.fr: Prise en charge des frais de transports forfait mobilités durables
(part déductible)
contrat salarié . frais professionnels . transports personnels . montant:
titre.en: '[automatic] Personal transport'
titre.fr: Transports personnels
-? contrat salarié . frais professionnels . transports personnels . part déductible
-: titre.en: '[automatic] deductible portion'
+contrat salarié . frais professionnels . transports personnels . part déductible:
+ titre.en: '[automatic] deductible portion'
titre.fr: part déductible
-? contrat salarié . frais professionnels . transports personnels . proportion déduction
-: titre.en: '[automatic] Deductibility Proportion Factor'
+contrat salarié . frais professionnels . transports personnels . proportion déduction:
+ titre.en: '[automatic] Deductibility Proportion Factor'
titre.fr: Facteur de proportion de la déductibilité
contrat salarié . intermittents du spectacle:
question.en: To which "intermittent" status is the employee attached?
@@ -2452,11 +3772,11 @@ contrat salarié . intermittents du spectacle . artiste . acteur de complément:
une production cinématographique ?
titre.en: complementary actor
titre.fr: acteur de complément
-? contrat salarié . intermittents du spectacle . artiste . acteur de complément . assiette forfaitaire
-: titre.en: flat-rate base
+contrat salarié . intermittents du spectacle . artiste . acteur de complément . assiette forfaitaire:
+ titre.en: flat-rate base
titre.fr: assiette forfaitaire
-? contrat salarié . intermittents du spectacle . artiste . acteur de complément . nombre jours travaillés
-: titre.en: number of days worked
+contrat salarié . intermittents du spectacle . artiste . acteur de complément . nombre jours travaillés:
+ titre.en: number of days worked
titre.fr: nombre jours travaillés
contrat salarié . intermittents du spectacle . artiste . activité accessoire:
question.en: >
@@ -2467,8 +3787,8 @@ contrat salarié . intermittents du spectacle . artiste . activité accessoire:
stages, etc) ?
titre.en: incidental activity
titre.fr: activité accessoire
-? contrat salarié . intermittents du spectacle . artiste . nombre jours travaillés
-: question.en: For how many continuous days is the artist engaged?
+contrat salarié . intermittents du spectacle . artiste . nombre jours travaillés:
+ question.en: For how many continuous days is the artist engaged?
question.fr: Pour combien de jours continus l'artiste est-il engagé ?
titre.en: number of days worked
titre.fr: nombre jours travaillés
@@ -2481,8 +3801,8 @@ contrat salarié . intermittents du spectacle . artiste . plafond proratisé:
contrat salarié . intermittents du spectacle . artiste . réduction de taux:
titre.en: rate reduction
titre.fr: réduction de taux
-? contrat salarié . intermittents du spectacle . artiste . réduction de taux . ATMP
-: titre.en: ATMP
+contrat salarié . intermittents du spectacle . artiste . réduction de taux . ATMP:
+ titre.en: ATMP
titre.fr: ATMP
contrat salarié . intermittents du spectacle . caisse des congés spectacle:
titre.en: '"spectacle" holiday fund'
@@ -2490,8 +3810,8 @@ contrat salarié . intermittents du spectacle . caisse des congés spectacle:
contrat salarié . intermittents du spectacle . formation professionnelle:
titre.en: formation professionnelle
titre.fr: formation professionnelle
-? contrat salarié . intermittents du spectacle . retraite complémentaire techniciens et cadre
-: titre.en: supplementary pension for technicians and "cadre"
+contrat salarié . intermittents du spectacle . retraite complémentaire techniciens et cadre:
+ titre.en: supplementary pension for technicians and "cadre"
titre.fr: retraite complémentaire techniciens et cadre
contrat salarié . intermittents du spectacle . technicien:
titre.en: technician
@@ -2499,6 +3819,11 @@ contrat salarié . intermittents du spectacle . technicien:
contrat salarié . intermittents du spectacle . technicien . non cadre:
titre.en: not "cadre"
titre.fr: non cadre
+contrat salarié . jeune de moins de 26 ans:
+ question.en: '[automatic] Is the employee under 26 years of age?'
+ question.fr: Le salarié a-t-il moins de 26 ans ?
+ titre.en: '[automatic] young person under 26 years old'
+ titre.fr: jeune de moins de 26 ans
contrat salarié . lodeom:
description.en: >
A rather complex set of contribution reductions is available for overseas
@@ -2750,54 +4075,6 @@ contrat salarié . prix du travail:
résumé.fr: Dépensé par l'entreprise
titre.en: labor cost
titre.fr: Coût total
-contrat salarié . profession spécifique:
- question.en: '[automatic] Does the employee work in one of the following professions?'
- question.fr: Le salarié exerce t-il l'une des professions suivantes ?
- titre.en: '[automatic] specific profession'
- titre.fr: profession spécifique
-contrat salarié . profession spécifique . artiste musicien:
- description.en: '[automatic] Concerns musicians, choir members, conductors,
- theatre managers, etc.'
- description.fr: Concerne les artistes musiciens, choristes, chefs d’orchestre,
- régisseurs de théâtre
- titre.en: '[automatic] musical artist'
- titre.fr: artiste musicien
-contrat salarié . profession spécifique . journaliste:
- description.en: '[automatic] Concerns journalists, editors, photographers,
- newspaper directors Dramatic and music critics.'
- description.fr:
- Concerne les journalistes, rédacteurs, photographes, directeurs
- de journaux Critiques dramatiques et musicaux.
- titre.en: '[automatic] journalist'
- titre.fr: journaliste
-contrat salarié . profession spécifique . journaliste . abattement fiscal:
- titre.en: '[automatic] net taxable journalist'
- titre.fr: net imposable journaliste
-contrat salarié . profession spécifique . journaliste . réduction de taux:
- titre.en: '[automatic] rate reduction'
- titre.fr: réduction de taux
-contrat salarié . profession spécifique . ouvrier du bâtiment:
- description.en: '[automatic] Concerns the construction workers referred to in
- paragraphs 1 and 2 of Article 1 of the Decree of 17 November 1936, excluding
- those working in factories or workshops.'
- description.fr:
- Concerne les ouvriers du bâtiment visés aux paragraphes 1er et 2
- de l’article 1er du décret du 17 novembre 1936, à l’exclusion de ceux qui
- travaillent en usine ou en atelier.
- titre.en: '[automatic] construction worker'
- titre.fr: ouvrier du bâtiment
-contrat salarié . profession spécifique . pilote de ligne ou personnel navigant:
- description.en:
- '[automatic] Concerns pilots, radio operators, flight engineers
- of air transport companies; pilots and mechanics employed by aircraft and
- engine construction companies to test prototypes; pilot instructors of
- flying clubs and civil aviation schools.'
- description.fr: Concerne les pilotes, radios, mécaniciens navigants des
- compagnies de transports aériens ; pilotes et mécaniciens employés par les
- maisons de construction d’avions et de moteurs pour l’essai de prototypes ;
- pilotes moniteurs d’aéro-clubs et des écoles d’aviation civile
- titre.en: '[automatic] airline pilot or flight crew'
- titre.fr: pilote de ligne ou personnel navigant
contrat salarié . professionnalisation:
description.en: >
[automatic] The professionalization contract is a work-study contract
@@ -2870,8 +4147,8 @@ contrat salarié . retraite supplémentaire . exonération fiscale:
contrat salarié . retraite supplémentaire . part déductible:
titre.en: '[automatic] deductible portion'
titre.fr: part déductible
-? contrat salarié . retraite supplémentaire . plafond d'exonération sociale employeur
-: titre.en: "[automatic] employer's social security ceiling"
+contrat salarié . retraite supplémentaire . plafond d'exonération sociale employeur:
+ titre.en: "[automatic] employer's social security ceiling"
titre.fr: plafond d'exonération sociale employeur
contrat salarié . réduction générale:
description.en: >
@@ -3084,8 +4361,8 @@ contrat salarié . rémunération . avantages en nature . nourriture:
contrat salarié . rémunération . avantages en nature . nourriture . montant:
titre.en: food
titre.fr: nourriture
-? contrat salarié . rémunération . avantages en nature . nourriture . repas par mois
-: question.en: |
+contrat salarié . rémunération . avantages en nature . nourriture . repas par mois:
+ question.en: |
[automatic] How many meals per month are paid for by the company?
question.fr: |
Combien de repas par mois sont payés par l'entreprise ?
@@ -3311,8 +4588,8 @@ contrat salarié . rémunération . net imposable:
C'est la base utilisée pour calculer l'impôt sur le revenu.
titre.en: Net taxable salary
titre.fr: Salaire net imposable
-? contrat salarié . rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées
-: titre.en: tax-free overtime hours
+contrat salarié . rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées:
+ titre.en: tax-free overtime hours
titre.fr: heures supplémentaires et complémentaires défiscalisées
contrat salarié . rémunération . primes:
description.en: |
@@ -3376,8 +4653,8 @@ contrat salarié . rémunération . primes . fin d'année:
travail.
titre.en: Year-end or thirteenth month bonus
titre.fr: Prime de fin d'année ou de treizième mois
-? contrat salarié . rémunération . primes . fin d'année . prime de fin d'année en mois
-: note.en: >
+contrat salarié . rémunération . primes . fin d'année . prime de fin d'année en mois:
+ note.en: >
[automatic] Some companies offer an end-of-year bonus on a 13.5, 14 or even
15-month basis.
note.fr: >
@@ -3676,8 +4953,8 @@ contrat salarié . temps de travail . contrôle 48h max:
description.fr: La durée hebdomadaire maximale de travail ne peut pas dépasser 48h
titre.en: '[automatic] control 48h max'
titre.fr: contrôle 48h max
-? contrat salarié . temps de travail . contrôle heures complémentaires 10 pourcents
-: description.en:
+contrat salarié . temps de travail . contrôle heures complémentaires 10 pourcents:
+ description.en:
'[automatic] Unless otherwise provided by agreement, the number
of overtime hours may not exceed one tenth of the contractual duration of
the part-time contract.'
@@ -3888,11 +5165,16 @@ dirigeant . assimilé salarié:
alors au régime général de la sécurité sociale, avec quelques contraintes
cependant. Par exemple, ils ne cotisent pas au chômage, et n'y ont donc pas
droit.
+ note.en: '[automatic] We do not manage the case of SAS(U) with IR for the moment'
+ note.fr: Nous ne gérons pas le cas des SAS(U) à l'IR pour l'instant
titre.en: Assimilated salaried
titre.fr: assimilé salarié
dirigeant . assimilé salarié . réduction ACRE:
titre.en: '[automatic] ACRE reduction'
titre.fr: réduction ACRE
+dirigeant . assimilé salarié . réduction ACRE . assiette taux réduit:
+ titre.en: '[automatic] base reduced rate'
+ titre.fr: assiette taux réduit
dirigeant . assimilé salarié . réduction ACRE . notification taux annuel:
description.en: >
[automatic] The ACRE rate used is an annual average. The
@@ -3903,9 +5185,6 @@ dirigeant . assimilé salarié . réduction ACRE . notification taux annuel:
simulateur ne prends pas encore en compte le calcul de l'ACRE mois par mois.
titre.en: '[automatic] notification annual rate'
titre.fr: notification taux annuel
-dirigeant . assimilé salarié . réduction ACRE . taux:
- titre.en: '[automatic] ACRE rate'
- titre.fr: taux ACRE
dirigeant . auto-entrepreneur:
description.en: >
Self-enterprise is a simplified sole proprietorship. At the beginning
@@ -3920,6 +5199,13 @@ dirigeant . auto-entrepreneur:
cotisations sociales par un prélèvement unique mensuel.
titre.en: auto-entrepreneur
titre.fr: auto-entrepreneur
+dirigeant . auto-entrepreneur . chiffre d'affaires:
+ question.en: '[automatic] What is your turnover?'
+ question.fr: Quel est votre chiffre d'affaires ?
+ résumé.en: '[automatic] Total revenue (excluding tax)'
+ résumé.fr: Montant total des recettes (hors taxe)
+ titre.en: '[automatic] revenues'
+ titre.fr: chiffre d'affaires
dirigeant . auto-entrepreneur . cotisations et contributions:
titre.en: Contributions
titre.fr: cotisations et contributions
@@ -3942,14 +5228,14 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC . commerce:
dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers:
titre.en: Chamber of Crafts taxes
titre.fr: taxe pour frais de chambre des métiers
-? dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Alsace
-: titre.en: '[automatic] Alsace rate'
+dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Alsace:
+ titre.en: '[automatic] Alsace rate'
titre.fr: taux Alsace
-? dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Moselle
-: titre.en: '[automatic] Moselle rate'
+dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Moselle:
+ titre.en: '[automatic] Moselle rate'
titre.fr: taux Moselle
-? dirigeant . auto-entrepreneur . cotisations et contributions . contribution formation professionnelle
-: description.en: >
+dirigeant . auto-entrepreneur . cotisations et contributions . contribution formation professionnelle:
+ description.en: >
[automatic] In addition to social security charges, self-employed
entrepreneurs are liable for a
@@ -3994,8 +5280,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations:
taux dépend de la catégorie d'activité.
titre.en: contributions
titre.fr: cotisations
-? dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE
-: description.en: >
+dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE:
+ description.en: >
[automatic] This rate corresponds to the contribution reduction that applies
to
@@ -4012,8 +5298,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations:
titre.en: |
"ACRE" rate
titre.fr: taux ACRE auto-entrepreneur
-? dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE . prestation de service
-: titre.en: '[automatic] service delivery rate with ACRE'
+dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE . prestation de service:
+ titre.en: '[automatic] service delivery rate with ACRE'
titre.fr: taux prestation de service avec ACRE
dirigeant . auto-entrepreneur . impôt:
titre.en: tax
@@ -4074,10 +5360,10 @@ dirigeant . auto-entrepreneur . impôt . versement libératoire . montant:
dirigeant . auto-entrepreneur . net après impôt:
description.en: >-
[automatic] The net income of the auto-entrepreneur after deduction of
- income tax and social security contributions.
+ income tax and social contributions.
- **Caution: To properly assess the profitability of the business, do not forget to subtract from this amount the expenses incurred for the activity. This may include, for example:
+ Note:** To properly assess the profitability of the business, do not forget to subtract from this amount the expenses incurred in the course of the activity. This may include, for example:
- The purchase of raw materials
@@ -4085,15 +5371,15 @@ dirigeant . auto-entrepreneur . net après impôt:
- Subscription to paid services
- - Renting a room
+ - Rental of premises
- - and so on.
+ - etc...
description.fr: >-
- Le revenu net de l'auto-entrepreneur après déduction de l'impôt sur le
+ Le revenu net de l'auto-entrepreneur après déduction de l'impôt sur le
revenu et des cotisations sociales.
- **Attention :** Pour bien évaluer la rentabilité de l'entreprise, il ne faut pas oublier de retrancher à ce montant les dépenses engagées dans le cadre de l'activité. Cela peut inclure par exemple :
+ **Attention :** Pour bien évaluer la rentabilité de l'entreprise, il ne faut pas oublier de retrancher à ce montant les dépenses engagées dans le cadre de l'activité. Cela peut inclure par exemple :
- L'achat des matière premières
@@ -4101,7 +5387,7 @@ dirigeant . auto-entrepreneur . net après impôt:
- L'abonnement à des services payants
- - La location d'un local
+ - La location d'un local
- etc...
question.en: What is the desired net after-tax income?
@@ -4111,10 +5397,9 @@ dirigeant . auto-entrepreneur . net après impôt:
titre.en: net income after tax
titre.fr: revenu net après impôt
dirigeant . auto-entrepreneur . net de cotisations:
- description.en:
- This is the income net of contributions and expenses, before the
- payment of income tax.
- description.fr: Il s'agit du revenu net de cotisations et de charges, avant le
+ description.en: '[automatic] This is the income after deductions for
+ contributions, before payment of income tax.'
+ description.fr: Il s'agit du revenu après déductions des cotisations, avant le
paiement de l'impôt sur le revenu.
question.en: What pre-tax income do you want to receive?
question.fr: Quel revenu avant impôt voulez-vous toucher ?
@@ -4136,116 +5421,30 @@ dirigeant . auto-entrepreneur . notification calcul ACRE annuel:
d'acre sur une meme année.
titre.en: '[automatic] notification calculation ACRE annual calculation'
titre.fr: notification calcul ACRE annuel
-dirigeant . auto-entrepreneur . seuils dépassés:
- description.en: >
- [automatic] The status of micro-entrepreneur applies as long as the annual
- turnover (actually received during the calendar year) does not exceed the
- thresholds of the micro-enterprise tax regime.
-
-
- If the limit is exceeded **in two consecutive years**, the auto-entrepreneur automatically switches to the [sole proprietorship] (/simulators/independent) scheme.
-
-
- At the end of the first year of activity, the turnover is prorated according to the duration of activity.
-
-
- For example:
-
- > A taxpayer sets up a business on August 1st and collects revenues excluding tax of `50,000 €` during the five months of activity of its first calendar year of operation.
-
- > The revenues of this first calendar year are adjusted *prorata temporis* to compare them to the ceiling :
-
- >
-
- > `50 000€ x (365/153) = 119 280 €`
-
-
-
- Expenses are not deductible for the calculation of the ceiling (as for the calculation of contributions).
-
-
-
- ### Multi-activity
-
-
- When an entrepreneur carries out 2 activities within his micro-enterprise, the
-
- The turnover threshold to be respected is not doubled. At
-
- effect the exercise of several activities with the same micro-enterprise
-
- does not increase the thresholds.
- description.fr: >
- Le statut de micro-entrepreneur 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'auto-entrepreneur 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.
- titre.en: '[automatic] exceeded thresholds'
- titre.fr: seuils dépassés
-dirigeant . auto-entrepreneur . seuils dépassés . notification:
- description.en: '[automatic] The annual turnover threshold for the
- self-employment plan is exceeded. Read
- more](/documentation/manager/self-entrepreneur/exceeded thresholds)'
- description.fr: Le seuil annuel de chiffre d'affaires pour le régime de
- l'auto-entreprise est dépassé. [En savoir
- plus](/documentation/dirigeant/auto‑entrepreneur/seuils-dépassés)
- titre.en: '[automatic] notification'
- titre.fr: notification
dirigeant . indépendant:
titre.en: indépendant
titre.fr: indépendant
dirigeant . indépendant . IJSS:
description.en: >-
- [automatic] In the event of illness, maternity or accident, the general
- social security system and special schemes provide "cash" benefits.
+ [automatic] In case of illness, maternity or accident, including after a
+ work stoppage or a stoppage for childcare related to the Covid-19 epidemic,
+ the general Social Security scheme provides "cash" benefits.
- These are per diems from Social Security (IJSS).
+ These are the Social Security daily allowances (IJSS).
- Compensation in addition to the Social Security daily allowances paid under a provident fund contract does not constitute replacement income.
-
- Note: Disability benefits paid by disability/death plans are not affected.
+ Benefits supplementing Social Security daily allowances paid under a provident contract do not constitute replacement income.
+
+ Note: Disability benefits paid by disability and death schemes are not concerned
description.fr: >-
- En cas de maladie, maternité, ou accident, le régime général de Sécurité
- sociale ainsi que les régimes spéciaux assurent le versement de prestations
- « en espèces ».
+ En cas de maladie, maternité, ou accident, y compris suite à un arrêt de
+ travail ou un arrêt pour garde d’enfant en lien avec l’épidémie du Covid-19,
+ le régime général de Sécurité sociale assure le versement de prestations «
+ en espèces ».
Ce sont les indemnités journalières de Sécurité sociale (IJSS).
Les indemnités complémentaires aux indemnités journalières de la Sécurité sociale versées dans le cadre d’un contrat de prévoyance ne constituent pas des revenus de remplacement.
-
+
Note: Les prestations d’invalidité versées par les régimes d’invalidité-décès ne sont pas concernées
question.en: '[automatic] Have you received daily allowances for sickness,
maternity or paternity as a result of your self-employed activity?'
@@ -4255,18 +5454,18 @@ dirigeant . indépendant . IJSS:
titre.fr: indemnités journalières de sécurité sociale
dirigeant . indépendant . IJSS . imposable:
description.en: >-
- [automatic] Indicate only the taxable replacement income received, i.e. all
- replacement income received **except for daily allowances in connection with
- a Long Term Affection (LTA)**.
+ [automatic] Indicate only taxable replacement income received, i.e. all
+ replacement income received **except for daily allowances related to a Long
+ Term Condition (LTC)**.
- This income will be deducted from your contribution base, so that you are not subject to the CSG-CRDS twice:
+ This income will be deducted from your contribution base, so that you are not subject to CSG-CRDS twice:
> Replacement income is: the lump-sum maternal rest allowance, the lump-sum daily allowance for interruption of activity, the replacement allowance for maternity, paternity or adoption and the daily sickness allowance.
description.fr: >-
Indiquez uniquement les revenus de remplacement imposables perçus, donc tous
les revenus de remplacement perçus **sauf les indemnités journalières en
- lien avec une Affection de Longue Durée (ALD)**.
+ lien avec une Affection de Longue Durée (ALD)**.
Ces revenus seront déduits de votre assiette des contributions, afin de ne pas être soumis deux fois à la CSG-CRDS :
@@ -4328,14 +5527,14 @@ dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV:
Cette dispense entraîne l’annulation des droits pour l’année et les points non cotisés ne sont pas rachetables.
titre.en: '[automatic] Supplementary old-age benefit (CARCDSF dental surgeon)'
titre.fr: Prestation complémentaire vieillesse (CARCDSF chirurgien-dentiste)
-? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . forfaitaire
-: titre.en: '[automatic] lump sum'
+dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . forfaitaire:
+ titre.en: '[automatic] lump sum'
titre.fr: forfaitaire
-? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . participation CPAM
-: titre.en: '[automatic] CPAM participation in the supplementary old-age benefit'
+dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . participation CPAM:
+ titre.en: '[automatic] CPAM participation in the supplementary old-age benefit'
titre.fr: Participation CPAM à la prestation complémentaire vieillesse
-? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . proportionnelle
-: titre.en: '[automatic] proportional'
+dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . proportionnelle:
+ titre.en: '[automatic] proportional'
titre.fr: proportionnelle
dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . RID:
titre.en: '[automatic] disability and death (CARCDSF Dental Surgeon)'
@@ -4352,17 +5551,17 @@ dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . exonération PCV
plus](http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations)
titre.en: '[automatic] PCV exemption'
titre.fr: exonération PCV
-? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . prix d'une consultation
-: titre.en: '[automatic] consulting fee'
+dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . prix d'une consultation:
+ titre.en: '[automatic] consulting fee'
titre.fr: prix d'une consultation
dirigeant . indépendant . PL . CARCDSF . retraite complémentaire:
titre.en: '[automatic] supplementary pension (CARCDSF)'
titre.fr: retraite complémentaire (CARCDSF)
-? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire
-: titre.en: '[automatic] flat-rate contribution'
+dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire:
+ titre.en: '[automatic] flat-rate contribution'
titre.fr: cotisation forfaitaire
-? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable
-: description.en: >
+dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable:
+ description.en: >
[automatic] You have the possibility of benefiting from a contribution
reduction
@@ -4377,8 +5576,8 @@ dirigeant . indépendant . PL . CARCDSF . retraite complémentaire:
plus](/documentation/dirigeant/indépendant/PL/CARCDSF/retraite-complémentaire/cotisation-forfaitaire/taux-réduction)
titre.en: '[automatic] applicable reduction'
titre.fr: réduction applicable
-? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . taux réduction
-: description.en: >
+dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . taux réduction:
+ description.en: >
[automatic] Affiliates whose net professional income for the year N-1 is
less than 85%.
@@ -4418,8 +5617,8 @@ dirigeant . indépendant . PL . CARCDSF . retraite complémentaire:
annexes (2033 B et D ou 2053 et 2058 A) de l’année 2019.
titre.en: '[automatic] discount rate'
titre.fr: taux réduction
-? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation proportionnelle
-: titre.en: '[automatic] proportional contribution'
+dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation proportionnelle:
+ titre.en: '[automatic] proportional contribution'
titre.fr: cotisation proportionnelle
dirigeant . indépendant . PL . CARCDSF . sage-femme:
titre.en: '[automatic] midwife'
@@ -4585,16 +5784,17 @@ dirigeant . indépendant . PL . CARMF . ASV . participation CPAM:
dirigeant . indépendant . PL . CARMF . invalidité décès:
description.en: >-
[automatic] The CARMF manages a provident scheme paying a pension in the
- event of permanent disability and a death benefit as well as a pension for
- surviving spouses and children in the event of the death of the insured.
+ event of permanent disability and a capital sum in the event of death, as
+ well as an annuity for the surviving spouses and children in the event of
+ the death of the insured.
- The contribution is divided into three flat-rate classes, the amount of which is determined according to your net income from self-employment in the penultimate year.
+ The contribution consists of three flat-rate classes, the amount of which is determined on the basis of your net self-employed income for the year before last.
- Without communication of the self-employed earnings and the tax notice of the penultimate year, the compensation rate cannot be determined. Pending receipt of this document, compensation will be based on the rate for class A.
+ The rate of compensation cannot be determined unless you provide your self-employed income and the tax notice for the year before last. Pending receipt of this document, the compensation will be based on the rate for class A.
description.fr: >-
La CARMF gère un régime de prévoyance versant une pension en cas
d'invalidité permanente et un capital décès ainsi qu’une rente pour les
- conjoints et enfants survivants en cas de décès de l'assuré.
+ conjoints et enfants survivants en cas de décès de l'assuré.
La cotisation comporte trois classes forfaitaires dont le montant est déterminé en fonction de vos revenus nets d'activité indépendante de l’avant-dernière année.
@@ -4618,13 +5818,13 @@ dirigeant . indépendant . PL . CARMF . retraite CNAVPL . participation CPAM:
titre.fr: participation CPAM à la retraite de base
dirigeant . indépendant . PL . CARMF . retraite complémentaire:
description.en: >-
- [automatic] The CARMF manages the supplementary pension plan.
+ [automatic] The CARMF manages the complementary pension scheme.
- The amount of contributions is determined on the basis of net income from self-employment in the penultimate year.
+ The amount of the contributions is determined according to the net income from independent activity of the penultimate year.
- Contributions for the first two years of affiliation are not due, unless you were over 40 when you started your self-employed activity. In that case, the contribution is proportional to the net self-employment income of 2018, with no further adjustment, with a maximum contribution of €14 110 .
+ Contributions for the first two years of membership are not due, unless you are over 40 years of age when you start your liberal activity. In that case, the contribution is proportional to the capped net self-employed income of 2018, without any subsequent adjustment, with a maximum contribution of € 14,110.
description.fr: >-
- La CARMF gère le régime de retraite complémentaire.
+ La CARMF gère le régime de retraite complémentaire.
Le montant des cotisations est déterminé en fonction des revenus nets d’activité indépendante de l’avant-dernière année.
@@ -4685,8 +5885,8 @@ dirigeant . indépendant . PL . CIPAV:
dirigeant . indépendant . PL . CIPAV . invalidité et décès:
titre.en: '[automatic] disability and death (CIPAV)'
titre.fr: invalidité et décès (CIPAV)
-? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation
-: description.en: '[automatic] The Cipav manages a pension scheme that pays a
+dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation:
+ description.en: '[automatic] The Cipav manages a pension scheme that pays a
pension in the event of permanent disability and a lump-sum death benefit as
well as a pension for surviving spouses and children in the event of the
death of the insured. By default, members contribute in "class A" but it is
@@ -4703,53 +5903,18 @@ dirigeant . indépendant . PL . CIPAV . invalidité et décès:
question.fr: Dans quelle classe cotisez-vous pour le régime invalidité-décès de la CIPAV ?
titre.en: '[automatic] contribution class'
titre.fr: classe de cotisation
-? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . A
-: titre.en: '[automatic] class A'
+dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . A:
+ titre.en: '[automatic] class A'
titre.fr: classe A
-? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . B
-: titre.en: '[automatic] class B'
+dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . B:
+ titre.en: '[automatic] class B'
titre.fr: classe B
-? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . C
-: titre.en: '[automatic] class C'
+dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . C:
+ titre.en: '[automatic] class C'
titre.fr: classe C
dirigeant . indépendant . PL . CIPAV . retraite complémentaire:
titre.en: '[automatic] supplementary pension (CIPAV)'
titre.fr: retraite complémentaire (CIPAV)
-? dirigeant . indépendant . PL . CIPAV . retraite complémentaire . réduction COVID
-: description.en: >
- [automatic] The Cipav is offering a reduction of up to €1392 on its
- membership fees for the
-
- additional retirement without reducing the number of points earned. This
-
- help is not automatic, but can be obtained upon request via the
-
- member's area messaging.
-
-
- [Apply](https://www.lacipav.fr/dispositif-exceptionnel-procedure)
- description.fr: >
- La Cipav met en place une réduction jusqu'à 1392€ de cotisation sur la
-
- retraire complémentaire sans diminution du nombre de points acquis. Cette
-
- aide n'est pas automatique, mais peut-être obtenue sur simple demande via la
-
- messagerie de l'espace adhérent.
-
-
- [Faire votre demande](https://www.lacipav.fr/dispositif-exceptionnel-procedure)
- question.en: |
- [automatic] Have you applied for the reduction of
- supplementary pension without income conditions?
- question.fr: |
- Avez-vous fait une demande pour bénéficier de la réduction de cotisations de
- retraite complémentaire sans conditions de revenus ?
- titre.en: '[automatic] VIDOC reduction'
- titre.fr: réduction COVID
-? dirigeant . indépendant . PL . CIPAV . retraite complémentaire . réduction COVID . montant
-: titre.en: '[automatic] VIDOC reduction'
- titre.fr: réduction COVID
dirigeant . indépendant . PL . CNBF:
description.en: >
[automatic] The Caisse Nationale des Barreaux Français (CNBF) is the
@@ -4784,8 +5949,8 @@ dirigeant . indépendant . PL . CNBF . retraite de base:
dirigeant . indépendant . PL . CNBF . retraite de base . cotisation forfaitaire:
titre.en: '[automatic] flat-rate contribution'
titre.fr: cotisation forfaitaire
-? dirigeant . indépendant . PL . CNBF . retraite de base . cotisation proportionnelle
-: titre.en: '[automatic] proportional contribution'
+dirigeant . indépendant . PL . CNBF . retraite de base . cotisation proportionnelle:
+ titre.en: '[automatic] proportional contribution'
titre.fr: cotisation proportionnelle
dirigeant . indépendant . PL . PAMC:
titre.en: '[automatic] PAMC'
@@ -4830,16 +5995,16 @@ dirigeant . indépendant . PL . PAMC . CURPS:
titre.fr: Contribution aux unions régionales des professionnels de santé
dirigeant . indépendant . PL . PAMC . IJSS:
description.en: >-
- [automatic] Social Security (IJSS) daily allowances are paid in the case of
- maternity/paternity/adoption leave.
+ [automatic] The daily social security benefits (IJSS) are paid in the case
+ of maternity/paternity/adoption leave.
- The CSG-CRDS is automatically deducted by Health Insurance at the time of payment. Their amount is therefore deducted from the base for the calculation of the CSG-CRDS remaining due.
+ The CSG-CRDS is automatically deducted by the Health Insurance at the time of payment. Their amount is therefore deducted from the base for the calculation of the remaining CSG-CRDS due.
- Compensation in addition to the Social Security daily allowances paid under a provident fund contract does not constitute replacement income.
-
- Note: Disability benefits paid by disability/death plans are not affected.
+ The supplementary allowances to the daily allowances paid by the Social Security under a provident contract do not constitute replacement income.
+
+ Note: Disability benefits paid by the disability-death schemes are not concerned.
description.fr: >-
Les indemnités journalières de Sécurité sociale (IJSS) sont versées dans le
cas de congé maternité/paternité/adoption.
@@ -4849,7 +6014,7 @@ dirigeant . indépendant . PL . PAMC . IJSS:
Les indemnités complémentaires aux indemnités journalières de la Sécurité sociale versées dans le cadre d’un contrat de prévoyance ne constituent pas des revenus de remplacement.
-
+
Note: Les prestations d’invalidité versées par les régimes d’invalidité-décès ne sont pas concernées.
question.en:
'[automatic] What is the amount of the daily maternity or paternity
@@ -4861,8 +6026,8 @@ dirigeant . indépendant . PL . PAMC . IJSS:
dirigeant . indépendant . PL . PAMC . allocations familiales:
titre.en: '[automatic] family allowances (after CPAM participation)'
titre.fr: allocations familiales (après participation CPAM)
-? dirigeant . indépendant . PL . PAMC . allocations familiales . participation CPAM
-: titre.en: '[automatic] CPAM participation in family allowances'
+dirigeant . indépendant . PL . PAMC . allocations familiales . participation CPAM:
+ titre.en: '[automatic] CPAM participation in family allowances'
titre.fr: Participation CPAM aux allocations familiales
dirigeant . indépendant . PL . PAMC . assiette participation CPAM:
description.en:
@@ -4871,59 +6036,59 @@ dirigeant . indépendant . PL . PAMC . assiette participation CPAM:
description.fr: Aussi appelé revenu conventionnel, il s'agit du revenu des
honoraires nets de dépassement.
note.en: >
- [automatic] The formula referenced in the Urssaf texts is as follows:
+ [automatic] The formula referred to in the Urssaf texts is as follows:
- > (income from the agreed activity) x (total fees - total fee overruns) / total amount of fees.
+ > (income from contracted activity) x (total fees - total excess fees) / total amount of fees.
- This formula can be simplified into:
+ This formula can be simplified to :
- > (income from the activity covered by the agreement) / (100% + average fee overrun)
+ (income from the activity under agreement) / (100% + average fee overrun)
- ### Proof
+ Proof
- If we take the following variables,
+ If we take the following variables,
- > `h+`: total fees (with overruns)
- `h` : fees without exceeding
- d%': percentage by which the average fee is exceeded
+ h+` : total fees (with overrun)
+ h': fees without overrun
+ d%`: average overcharge percentage
- We've got:
+ We have :
- >
- `h+ = h + h * d%`
- `h+ = h * (100% + d%)`
+ >
+ h+ = h + h * d%`.
+ h+ = h * (100% + d%)`
- If we replace in the formula the CPAM participation base, we have :
+ If we replace in the formula of the CPAM participation base, we have :
- > 1. `(income from the activity covered by the agreement) * h / h+`
+ 1. `(income from the contracted activity) * h / h+` > 2.
- > 2. `(income from the activity covered by the agreement) * h / (h * (100% + d%))
+ 2. `(income from activity under agreement) * h / (h * (100% + d%))
- > 3. `(income from the agreement activity) / (100% + d%)`.
+ 3. `(income from activity under agreement) / (100% + d%)
note.fr: >
- La formule référencée dans les textes Urssaf est la suivante :
+ La formule référencée dans les textes Urssaf est la suivante :
- > (revenu de l’activité conventionnée) x (total des honoraires - total des dépassements d’honoraires) / montant total des honoraires.
+ > (revenu de l’activité conventionnée) x (total des honoraires - total des dépassements d’honoraires) / montant total des honoraires.
- On peut simplififer cette formule en :
+ On peut simplififer cette formule en :
> (revenu de l’activité conventionnée) / (100% + dépassement d'honoraire moyen)
### Preuve
- Si on prends les variables suivantes,
+ Si on prends les variables suivantes,
> `h+` : total des honoraires (avec dépassement)
`h` : honoraires sans dépassement
`d%`: pourcentage de dépassement d'honoraire moyen
- On a :
+ On a :
- >
+ >
`h+ = h + h * d%`
`h+ = h * (100% + d%)`
@@ -4931,44 +6096,44 @@ dirigeant . indépendant . PL . PAMC . assiette participation CPAM:
> 1. `(revenu de l’activité conventionnée) * h / h+`
- > 2. `(revenu de l’activité conventionnée) * h / (h * (100% + d%))
+ > 2. `(revenu de l’activité conventionnée) * h / (h * (100% + d%))
> 3. `(revenu de l’activité conventionnée) / (100% + d%)`
titre.en: '[automatic] CPAM contribution base'
titre.fr: assiette participation CPAM
-? dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste
-: titre.en: '[automatic] CPAM participation plate (dental surgeon)'
+dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste:
+ titre.en: '[automatic] CPAM participation plate (dental surgeon)'
titre.fr: assiette participation CPAM (chirurgien dentiste)
-? dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf
-: description.en: >
- [automatic] The "Urssaf rate" (UR rate) is used to calculate the share of
+dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf:
+ description.en: >
+ [automatic] The "Urssaf rate" (UR rate) is used to calculate the part of
your
- health and maternity insurance contribution paid by the CPAM.
+ sickness and maternity insurance contribution paid by the CPAM.
- This rate is pre-filled on your business tax return. It
+ This rate is pre-filled on your professional income tax return. It
- is derived from your Individual Activity Report data and from
+ is taken from the data in your Relevé individuel d'activité et de
- requirements (RIAP).
+ prescriptions (RIAP).
- The lower the rate, the greater the CPAM participation, and therefore the greater the CPAM participation and therefore the greater the CPAM participation.
+ The lower the rate, the higher the CPAM contribution and therefore the lower the
- the share to be borne by the practitioner is low.
+ the practitioner's share of the cost is low.
- ## Rate calculation
+ Calculation of the rate
- The formula for calculating the rate of overshoot is as follows:
+ The formula for calculating the overrun rate is as follows:
- > Urssaf rate = (overruns - amounts reimbursed CMU lump sums) / (amounts reimbursed acts + amounts reimbursed CMU lump sums)
+ Urssaf rate = (overruns - amounts reimbursed CMU lump sums) / (amounts reimbursable acts + amounts reimbursed CMU lump sums)
description.fr: >
Le « taux Urssaf » (taux UR) permet de calculer la part de votre
- cotisation d’assurance maladie-maternité prise en charge par la CPAM.
+ cotisation d’assurance maladie-maternité prise en charge par la CPAM.
Ce taux est pré-rempli sur votre déclaration de revenus professionnels. Il
@@ -4986,15 +6151,15 @@ dirigeant . indépendant . PL . PAMC . assiette participation CPAM:
## Calcul du taux
- La formule de calcul du taux de dépassement est la suivante :
+ La formule de calcul du taux de dépassement est la suivante :
> Taux Urssaf = (dépassements - montants remboursés forfaits CMU) / (montants remboursables actes + montants remboursés forfaits CMU)
question.en: '[automatic] What is your "Urssaf rate"?'
question.fr: Quel est votre "taux Urssaf" ?
titre.en: '[automatic] Urssaf rate'
titre.fr: taux Urssaf
-? dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf . notification
-: description.en: '[automatic] The Urssaf rate must be less than 100'
+dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf . notification:
+ description.en: '[automatic] The Urssaf rate must be less than 100'
description.fr: Le taux Urssaf doit être inférieur à 100
titre.en: '[automatic] notification'
titre.fr: notification
@@ -5022,34 +6187,35 @@ dirigeant . indépendant . PL . PAMC . participation CPAM:
d'une partie de leur cotisations par l'Assurance Maladie.
titre.en: '[automatic] Health insurance participation'
titre.fr: Participation assurance maladie
-? dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée
-: description.en: >
- [automatic] Non-agreement revenues are all those which do not fall within
- the scope of
+dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée:
+ description.en: >
+ [automatic] Non-agreed revenues are all those that do not fall into the
+ following categories
- the following categories:
-
- - Reimbursable deed fees (including the
+ the following categories:
- fee overruns and travel expenses shown on the statement
+
+ - Fees from reimbursable procedures (including excess fees and
+
+ Fees from reimbursable procedures (including overcharges and travel expenses listed on the
SNIR)
- - Fees resulting from retrocessions concerning reimbursable deeds
+ - Fees from retrocessions for reimbursable procedures
received as a substitute
- - All lump sums paid by health insurance
+ - All lump-sum payments made by the health insurance
- (teletransmission assistance, compensation, compensation for training, etc.).
+ (assistance with teletransmission, compensation, compensation for continuing education
- continuous, installation bonus, ...)
+ training, installation bonus, etc.)
description.fr: |
Les recettes non conventionnées sont toutes celles qui ne rentrent pas dans
- les catégories suivantes :
-
+ les catégories suivantes :
+
- Honoraires tirés des actes remboursables (y compris les
dépassements d’honoraires et les frais de déplacement figurant sur le relevé
SNIR)
@@ -5072,8 +6238,8 @@ dirigeant . indépendant . PL . PAMC . participation CPAM:
suggestions.30%.fr: 30%
titre.en: '[automatic] proportion of revenue from non-agreement activities'
titre.fr: proportion recette activité non conventionnée
-? dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée . notification
-: description.en: |
+dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée . notification:
+ description.en: |
[automatic] The proportion cannot be more than 100%.
description.fr: |
La proportion ne peut pas être supérieure à 100%
@@ -5186,13 +6352,13 @@ dirigeant . indépendant . PL . métier . expert-comptable:
titre.fr: expert-comptable
dirigeant . indépendant . PL . métier . rattaché CIPAV:
description.en: >
- [automatic] You work in a regulated profession attached to the CIPAV. The
- list of these professions is :
+ [automatic] You work in a regulated trade that is affiliated with the CIPAV.
+ The list of these trades is :
- - Architect (architect, interior designer, construction economist, project manager, expert surveyor)
+ - Architect (architect, interior architect, construction economist, project manager, surveyor)
- - Mountain guide (ski instructor, high mountain guide, mid-mountain guide)
+ - Mountain guide (ski instructor, high mountain guide, medium mountain guide)
- Osteopath
@@ -5200,18 +6366,18 @@ dirigeant . indépendant . PL . métier . rattaché CIPAV:
- Psychotherapist
- - Occupational Therapist
+ - Occupational therapist
- Dietician
- Chiropractor
- - Consulting Engineer
+ - Consulting engineer
- - Speaker's guide
+ - Guide-lecturer
description.fr: >
Vous exercez un métier réglementé rattaché à la CIPAV. La liste de ces
- métiers est :
+ métiers est :
- Architecte (architecte, architecte d’intérieur, économiste de la construction, maître d’œuvre, géomètre expert)
@@ -5315,34 +6481,34 @@ dirigeant . indépendant . PL . métier . secteur médecin . non conventionné:
titre.fr: non conventionné
dirigeant . indépendant . PL . option régime général:
description.en: >
- [automatic] Persons already practising an unregulated professional practice
+ [automatic] Persons already practising an unregulated liberal profession
before
- 2019 may opt between 2019 and 2023 for Social Security for the
+ 2019 can opt between 2019 and 2023 for Social Security for the self-employed, provided that they
- independent, provided that they are up to date in the payment of all of their
+ provided that they are up to date with the payment of all their
- contributions to the CIPAV.
+ contributions to the CIPAV.
- This option will allow them to benefit from the same rights as artisans
+ This option will allow them to benefit from the same rights as craftsmen and tradesmen
- and traders (daily allowances, retirement, disability, etc.).
+ This option will allow them to benefit from the same rights as artisans and traders (daily allowances, retirement, disability, etc.).
- In particular, they will have access to per diems in the event of the cessation of
+ In particular, they will have access to daily allowances in the event of sick leave or maternity
- work or maternity, which is not the case at the CIPAV.
+ maternity, which is not the case with the CIPAV.
- The application must be made to the CIPAV. It will take effect on 1 January 2010.
+ The application must be made to the CIPAV. It will take effect on January 1 of the following year and will be
- January of the following year and will be final.
+ January of the following year and will be definitive.
description.fr: |
Les personnes exerçant déjà une profession libérale non réglementée avant
2019 peuvent opter entre 2019 et 2023 pour la Sécurité sociale pour les
indépendants, à condition d’être à jour dans le paiement de toutes leurs
- cotisations à la CIPAV.
+ cotisations à la CIPAV.
Cette option leur permettra de bénéficier des mêmes droits que les artisans
et commerçants (indemnités journalières, retraite, invalidité, etc.).
@@ -5359,18 +6525,18 @@ dirigeant . indépendant . PL . option régime général:
titre.fr: option régime général
dirigeant . indépendant . PL . retraite CNAVPL:
description.en: |
- [automatic] All professions (except lawyers)
+ [automatic] All liberal professions (except lawyers)
have the same contribution rates for their basic pension.
- The National Old Age Insurance Fund for the Professions
- is the organization that federates the various caisses
- existing (CIPAV, CARPIMKO, CARCDSF, CAVEC etc.)
+ The national old-age insurance fund for the liberal professions is
+ professions is the body that federates the various existing funds
+ (CIPAV, CARPIMKO, CARCDSF, CAVEC etc.)
description.fr: |
Toutes les professions libérale (à l'exception des avocats)
ont les mêmes taux de cotisations pour leur retraite de base.
La caisse nationale d'assurance vieillesse des professions
- libérales est l'organisme qui fédère les différentes caisses
+ libérales est l'organisme qui fédère les différentes caisses
existantes (CIPAV, CARPIMKO, CARCDSF, CAVEC etc..)
titre.en: '[automatic] basic retirement (CNAVPL)'
titre.fr: retraite de base (CNAVPL)
@@ -5394,8 +6560,8 @@ dirigeant . indépendant . PL . régime général:
d'option](/documentation/dirigeant/indépendant/PL/option-régime-général)
titre.en: '[automatic] overall regime'
titre.fr: régime général
-? dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire
-: description.en: |
+dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire:
+ description.en: |
[automatic] The unregulated professions that started their activity at
As of January 1, 2019 or those who started their activity before the
date of 1 January 2019 and have opted for the general regime for the
@@ -5413,8 +6579,8 @@ dirigeant . indépendant . PL . régime général:
complémentaire ?
titre.en: unregulated specific rate for unregulated professions
titre.fr: taux spécifique profession libérale non reglementée
-? dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire . montant
-: titre.en: '[automatic] supplementary pension (PLNR rate)'
+dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire . montant:
+ titre.en: '[automatic] supplementary pension (PLNR rate)'
titre.fr: retraite complémentaire (taux PLNR)
dirigeant . indépendant . assiette des cotisations:
description.en: '[automatic] This is the basis for social security
@@ -5422,90 +6588,68 @@ dirigeant . indépendant . assiette des cotisations:
description.fr: Il s'agit de l'assiette des cotisations sociales, nombre forcément positif
titre.en: '[automatic] contribution base'
titre.fr: assiette des cotisations
-dirigeant . indépendant . avertissement base forfaitaire:
+dirigeant . indépendant . assiette minimale:
description.en: >
- [automatic] When you start your business, your professional income
+ [automatic] If the entrepreneur's income is in deficit or below the
+ calculation bases, certain contributions will be increased to a minimum
+ amount.
- not being known, the dues and contributions of the first two
-
- years are calculated on a flat-rate basis.
+ The contributions for daily allowances, basic pension, disability and death and for training are no longer calculated according to the entrepreneur's income but according to a "base" (the amount withheld that serves as the basis for calculating a tax or a fee).
-
- This base amounts to 19% of the annual Social Security ceiling for
-
- in the first and second year of operation.
-
-
-
- There is an adjustment in the second year based on the
-
- actual income reported for the previous year. In most cases,
-
- the amount of provisional contributions will be significantly higher.
-
-
-
- This simulator calculates the **cruising speed** contributions (after
-
- regularization). It therefore allows you to anticipate the amount of this accrual/deferral.
-
- and plan your cash flow accordingly.
+ The minimum contributions do not apply if you are receiving the RSA or the activity bonus.
description.fr: >
- Lorsque vous commencez votre activité, vos revenus professionnels
+ Si le revenu du chef d'entreprise est déficitaire ou inférieur aux bases de
+ calcul, certaines cotisations seront portées à un montant minimum.
- n’étant pas connus, les cotisations et contributions des deux premières
-
- années sont calculées sur une base forfaitaire.
+ Les cotisations pour les indemnités journalières, retraite de base, invalidité-décès et pour la formation ne sont plus calculées selon le revenu du chef d'entreprise mais selon une "assiette" (montant retenu qui sert de base au calcul d'un impôt ou d'une taxe).
-
- Cette base s’élève à 19 % du plafond annuel de la Sécurité sociale au titre de
-
- la première et de la deuxième année d’activité.
-
-
-
- Il y a un ajustement au cours de la deuxième année en fonction des
-
- revenus réels déclarés pour l'année précédente. Dans la majeure partie des cas,
-
- le montant des cotisations provisionnelles sera significativement plus élevé.
-
-
-
- Ce simulateur calcule les cotisations au **régime de croisière** (après
-
- régularisation). Il vous permet donc d'anticiper le montant de cette régularisation
-
- et de plannifier votre trésorerie en conséquence.
- titre.en: '[automatic] flat-rate warning'
- titre.fr: avertissement base forfaitaire
+ Les cotisations minimales ne s'appliquent pas si vous bénéficiez du RSA ou de la prime d’activité.
+ titre.en: '[automatic] minimum base'
+ titre.fr: assiette minimale
+dirigeant . indépendant . assiette minimale . maladie:
+ description.en: >
+ [automatic] If the entrepreneur's income is in deficit or below the
+ calculation bases, certain contributions will be increased to a minimum
+ amount.
+ description.fr: >
+ Si le revenu du chef d'entreprise est déficitaire ou inférieur aux bases de
+ calcul, certaines cotisations seront portées à un montant minimum.
+ titre.en: '[automatic] minimum health insurance base'
+ titre.fr: assiette minimale maladie
+dirigeant . indépendant . assiette minimale . retraite:
+ description.en: '[automatic] The minimum basic pension contribution allows you
+ to validate 3 quarters of pension, regardless of your income.'
+ description.fr: La cotisation minimale de retraite de base permet de valider 3
+ trimestres de retraite, quel que soit le revenu.
+ titre.en: '[automatic] minimum pension base'
+ titre.fr: assiette minimale retraite
dirigeant . indépendant . conjoint collaborateur:
description.en: >
- [automatic] Allows the executive's spouse to be covered by social protection
- by paying additional social security contributions.
+ [automatic] Allows the manager's spouse to be covered by social protection
+ in return for the payment of additional social contributions.
- In order to benefit from it, the officer's spouse or Pacs partner must:
+ To benefit from this, the manager's spouse or PACS partner must
- - carry out a regular and customary professional activity in the company
+ - carry out a regular and usual professional activity in the company
- - be listed in the RCS for merchants or in the Répertoire des métiers (RM) for craftspeople
+ - be listed in the RCS for traders or in the RM for craftsmen
- - go unremunerated
+ - not be remunerated
- not be a partner in the company.
description.fr: >
Permet au conjoint du dirigeant d'être couvert par la protection sociale
- moyennant le paiement de cotisations sociales supplémantaires.
+ moyennant le paiement de cotisations sociales supplémentaires.
Pour en bénéficier, l'époux(se) ou partenaire de Pacs du dirigeant doit:
- - exercer une activité professionnelle régulière et habituelle dans l'entreprise
+ - exercer une activité professionnelle régulière et habituelle dans l'entreprise
- - faire l'objet d'une mention au RCS pour les commerçants ou au répertoire des métiers (RM) pour les artisans
+ - faire l'objet d'une mention au RCS pour les commerçants ou au répertoire des métiers (RM) pour les artisans
- - ne pas être rémunéré
+ - ne pas être rémunéré
- ne pas être associé de la société.
question.en: Do you have a collaborating spouse?
@@ -5536,26 +6680,35 @@ dirigeant . indépendant . conjoint collaborateur . assiette:
titre.en: base
titre.fr: assiette
dirigeant . indépendant . conjoint collaborateur . assiette . forfaitaire:
- description.en: professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité sociale.
- description.fr:
- Le conjoint collaborateur paiera des cotisations équivalentes à
- un revenu professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité
- sociale.
- titre.en: lump sum
- titre.fr: forfaitaire
+ description.en: >
+ [automatic] The collaborating spouse will pay contributions equivalent to a
+ flat-rate professional income
+
+ fixed at 1/3 of the social security ceiling,
+
+ with the exception of the daily allowance contribution which is calculated on
+
+ a base equivalent to 40% of the PASS.
+ description.fr: |
+ Le conjoint collaborateur paiera des cotisations équivalentes à un revenu
+ professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité sociale,
+ à l’exception de la cotisation indemnités journalières qui est calculée sur
+ une assiette équivalente à 40% du PASS.
+ titre.en: '[automatic] flat-rate base'
+ titre.fr: assiette forfaitaire
dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage:
question.en: What proportion of income does the spouse contribute?
question.fr: À quelle proportion du revenu le conjoint cotise-t'il ?
titre.en: percentage
titre.fr: pourcentage
-? dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . moitié
-: titre.en: 1/2
+dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . moitié:
+ titre.en: 1/2
titre.fr: 1/2
-? dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . tiers
-: titre.en: 1/3
+dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . tiers:
+ titre.en: 1/3
titre.fr: 1/3
-? dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec partage
-: description.en: >
+dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec partage:
+ description.en: >
chacun sur une part du revenu professionnel.
**Cette option baisse le montant des cotisations à payer pour le gérant, mais elle diminue également ses contreparties sociales (pension de retraite, indemnité décès, etc)**
@@ -5566,8 +6719,8 @@ dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage:
**Cette option baisse le montant des cotisations à payer pour le gérant, mais elle diminue également ses contreparties sociales (pension de retraite, indemnité décès, etc)**
titre.en: split income
titre.fr: revenu avec partage
-? dirigeant . indépendant . conjoint collaborateur . assiette . revenu sans partage
-: description.en: '[automatic] The collaborating spouse will pay social security
+dirigeant . indépendant . conjoint collaborateur . assiette . revenu sans partage:
+ description.en: '[automatic] The collaborating spouse will pay social security
contributions calculated on the basis of a percentage of the contribution
base of the company manager (one third or one half).'
description.fr: Le conjoint collaborateur paiera des cotisations sociales
@@ -5581,121 +6734,33 @@ dirigeant . indépendant . conjoint collaborateur . cotisations:
dirigeant . indépendant . conjoint collaborateur . cotisations . assiette:
titre.en: collaborating spouse
titre.fr: assiette conjoint collaborateur
-? dirigeant . indépendant . conjoint collaborateur . cotisations . assiette retraite
-: titre.en: retirement base
+dirigeant . indépendant . conjoint collaborateur . cotisations . assiette retraite:
+ titre.en: retirement base
titre.fr: assiette retraite
-? dirigeant . indépendant . conjoint collaborateur . cotisations . indemnités journalières maladie
-: titre.en: sick pay
+dirigeant . indépendant . conjoint collaborateur . cotisations . indemnités journalières maladie:
+ titre.en: sick pay
titre.fr: indemnités journalières maladie
-? dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès
-: titre.en: disability and death
+dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès:
+ titre.en: disability and death
titre.fr: invalidité et décès
-? dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès . assiette
-: titre.en: disability and death base
+dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès . assiette:
+ titre.en: disability and death base
titre.fr: assiette invalidité et décès
-? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire
-: titre.en: retirement supplement
+dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire:
+ titre.en: retirement supplement
titre.fr: retraite complémentaire
-? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire . assiette
-: titre.en: supplementary pension base
+dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire . assiette:
+ titre.en: supplementary pension base
titre.fr: assiette retraite complémentaire
-? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite de base
-: titre.en: basic retirement
+dirigeant . indépendant . conjoint collaborateur . cotisations . retraite de base:
+ titre.en: basic retirement
titre.fr: retraite de base
-dirigeant . indépendant . contrats madelin:
- question.en:
- '[automatic] Have you subscribed to private complementary contracts
- ("Madelins contracts")'
- question.fr: Avez-vous souscrit à des contrats de complémentaire privée dits
- ("contrats Madelins")
- titre.en: Madelin Contracts
- titre.fr: Contrats Madelin
-dirigeant . indépendant . contrats madelin . contrôle montant charges:
- description.en:
- '[automatic] The amount of all the contributions to your Madelin
- contracts must be included in your operating expenses, but you have
- indicated an amount of contributions greater than the expenses.'
- description.fr:
- Le montant de l'ensemble des cotisations à vos contrats Madelin
- doit être inclus dans vos charges de fonctionnement, or vous avez indiqué un
- montant de cotisations supérieur aux charges.
- titre.en: '[automatic] expense control'
- titre.fr: contrôle montant charges
-dirigeant . indépendant . contrats madelin . montant:
- titre.en: Sum of subscriptions to Madelin contracts
- titre.fr: Somme des cotisations à contrats Madelin
-dirigeant . indépendant . contrats madelin . mutuelle:
- description.en: >
- [automatic] If you contribute under a mutual insurance contract such as the
- Madelin law,
-
- you can deduct part of these contributions from your profits; and
-
- taxable persons that you declare for your self-employed activity.
- description.fr: |
- Si vous cotisez au titre d'un contrat de mutuelle de type loi Madelin,
- vous pouvez déduire une partie de ces cotisations des bénéfices
- imposables que vous déclarez pour votre activité non salariée.
- question.en: '[automatic] How much do you pay to a Madelin Mutual contract?'
- question.fr: Quel est le montant que vous versez à un contrat de mutuelle Madelin ?
- titre.en: '[automatic] Subscription to a Madelin mutual insurance contract'
- titre.fr: Souscription à un contrat de mutuelle Madelin
-dirigeant . indépendant . contrats madelin . mutuelle . plafond:
- note.en: >
- [automatic] Normally it is the tax result that should be used for the cap
- base, but business income is used to avoid a cycle.
- note.fr: >
- Normalement c'est le résultat fiscal qui devrait être utilisé pour
- l'assiette du plafond, mais on utilise le revenu professionnel pour éviter
- un cycle.
- titre.en: ceiling
- titre.fr: plafond
-dirigeant . indépendant . contrats madelin . part déductible fiscalement:
- titre.en: Part of the Madelin contract subscription which is fiscally deductible
- titre.fr: Part de la cotisation à contrat Madelin qui est déductible fiscalement
-dirigeant . indépendant . contrats madelin . part non-déductible fiscalement:
- titre.en: Part of the Madelin contract subscription which is not fiscally deductible
- titre.fr: Part de la cotisation à contrat Madelin qui n'est pas déductible fiscalement
-dirigeant . indépendant . contrats madelin . retraite:
- description.en: >
- [automatic] If you are contributing under a pension contract such as the
- Madelin law,
-
- you can deduct part of these contributions from your profits; and
-
- taxable persons that you declare for your self-employed activity.
- description.fr: |
- Si vous cotisez au titre d'un contrat retraite de type loi Madelin,
- vous pouvez déduire une partie de ces cotisations des bénéfices
- imposables que vous déclarez pour votre activité non salariée.
- question.en: '[automatic] How much do you pay into your Madelin retraite contract?'
- question.fr: Quel est le montant que vous versez à votre contrat Madelin retraite ?
- titre.en: '[automatic] Madelin Retirement Subscription'
- titre.fr: Souscription à une retraite Madelin
-dirigeant . indépendant . contrats madelin . retraite . plafond:
- note.en: >
- [automatic] Normally it is the tax result that should be used for the cap
- base, but business income is used to avoid a cycle.
- note.fr: >
- Normalement c'est le résultat fiscal qui devrait être utilisé pour
- l'assiette du plafond, mais on utilise le revenu professionnel pour éviter
- un cycle.
- titre.en: ceiling
- titre.fr: plafond
dirigeant . indépendant . cotisations et contributions:
- description.en: >
- [automatic] This is the total amount owed by the self-employed person in
- respect of contributions and
-
- mandatory contributions.
-
-
- This amount includes the "covid" contribution reduction in 2020.
+ description.en: '[automatic] '
description.fr: |
C'est le montant total dû par l'indépendant au titre des cotisations et
- contributions obligatoires.
-
- Ce montant inclut la réduction de cotisation "covid" en 2020.
+ contributions obligatoires ainsi qu'au titre de ses cotisations facultatives
+ telles que les contrats Madelin.
note.en: |
[automatic] Unlike contributions, contributions are not reintroduced
for the calculation of the CSG/CRDS. They also do not benefit from the
@@ -5704,8 +6769,8 @@ dirigeant . indépendant . cotisations et contributions:
À la différence des cotisations, les contributions ne sont pas réintroduites
pour le calcul de la CSG/CRDS. Elles ne bénéficient pas non plus de la
réduction ACRE.
- titre.en: all contributions
- titre.fr: cotisations et contributions
+ titre.en: '[automatic] social contributions'
+ titre.fr: cotisations et contributions sociales
dirigeant . indépendant . cotisations et contributions . CSG et CRDS:
titre.en: CSG and CRDS
titre.fr: CSG et CRDS
@@ -5747,35 +6812,27 @@ dirigeant . indépendant . cotisations et contributions . PCV:
conventionnel.
titre.en: '[automatic] Supplementary old-age benefits'
titre.fr: Prestations complémentaires vieillesse
-? dirigeant . indépendant . cotisations et contributions . aide indépendant covid 2020
-: description.en: |
- [automatic] The amount of the reduction depends on your industry.
- It is capped at the final social security contributions for 2020,
- excluding CFP (contribution to vocational training) and CURPS
- (contribution to regional unions of health professionals).
- description.fr: |
- Le montant de la réduction dépend du secteur d'activité dont vous relevez.
- Il est plafonné aux montant des cotisations sociales définitives de 2020,
- hors CFP (contribution à la formation professionnelle) et CURPS
- (contribution aux unions régionales des professionnels de santé).
- titre.en: '[automatic] independent aid covid 2020'
- titre.fr: aide indépendant covid 2020
-dirigeant . indépendant . cotisations et contributions . aides covid 2020:
- description.en: |
- [automatic] The government and social security agencies have established
- contribution reduction schemes for self-employed persons affected by the
- Coronavirus crisis.
- description.fr: |
- Le gouvernement et les organismes de sécurité sociale ont mis en place des
- dispositifs de réduction de cotisation pour les indépendants impactés par la
- crise du Coronavirus.
- titre.en: '[automatic] covid 2020 aid'
- titre.fr: aides covid 2020
+dirigeant . indépendant . cotisations et contributions . PSS proratisé:
+ description.en: >
+ [automatic] The social security ceiling, prorated by the duration of
+ activity during the year (in the case of activity created or ceased during
+ the year).
+
+
+ Useful for calculating lump-sum contributions at the beginning of the activity or the amount of the ACRE
+ description.fr: >
+ Le plafond de la sécurité sociale, proratisé par la durée d'activité pendant
+ l'année (dans le cas d'activité crée ou cessée en cours d'année).
+
+
+ Utile pour calculer les cotisations forfaitaires de début d'activité ou le montant de l'ACRE
+ titre.en: '[automatic] prorated social security ceiling'
+ titre.fr: plafond de la sécurité sociale proratisé
dirigeant . indépendant . cotisations et contributions . allocations familiales:
titre.en: '[automatic] child benefit'
titre.fr: allocations familiales
-? dirigeant . indépendant . cotisations et contributions . contributions spéciales
-: description.en: |
+dirigeant . indépendant . cotisations et contributions . contributions spéciales:
+ description.en: |
[automatic] Some special plans may add additional contributions
(e.g. CURPS for the CPAMs)
description.fr: |
@@ -5786,6 +6843,69 @@ dirigeant . indépendant . cotisations et contributions . allocations familiales
dirigeant . indépendant . cotisations et contributions . cotisations:
titre.en: social contributions
titre.fr: cotisations
+dirigeant . indépendant . cotisations et contributions . début activité:
+ description.en: >
+ [automatic] When you start your activity, your **professional income
+
+ income is not known**, the contributions for the first two years are calculated on a
+
+ are calculated on a **lump sum basis**.
+
+
+
+ These contributions will be adjusted and regularised according to your actual income for the year of exercise.
+
+ the year of the exercise. If your income is higher than the flat rate taken into account for the calculation
+
+ for the calculation of the provisional contributions, you will be liable to pay an **additional
+
+ of contributions**.
+
+
+
+ This simulator calculates the so-called definitive contributions on the basis of your actual income from
+
+ activity. It therefore enables you to anticipate the amount of this adjustment and to
+
+ plan your cash flow** accordingly.
+ description.fr: >
+ 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 de
+
+ l’année d’exercice. Si votre revenu est supérieur à la base forfaitaire prise en compte
+
+ pour le calcul des cotisations provisionnelles alors vous serez redevable d’un **complément
+
+ de cotisations**.
+
+
+
+ Ce simulateur calcule les cotisations dites définitives sur la base des revenus réels de votre
+
+ activité. Il vous permet donc de pouvoir anticiper le montant de cette régularisation et de
+
+ **planifier votre trésorerie** en conséquence.
+ note.en: '[automatic] The flat-rate base is 19% of the annual Social Security
+ ceiling** for the first and second year of activity (with the exception of
+ the health contribution and daily allowances for which the flat-rate base is
+ equal to 40% of the annual Social Security ceiling).'
+ note.fr: La base forfaitaire s’élève à **19 % du plafond annuel de la Sécurité
+ sociale** au titre de la première et de la deuxième année d’activité (à
+ l’exception de la cotisation Maladie et indemnités journalières pour
+ lesquelles l’assiette forfaitaire est égale à 40% du plafond annuel de la
+ Sécurité sociale).
+ titre.en: '[automatic] Flat-rate contributions at the beginning of the activity'
+ titre.fr: Cotisations forfaitaires de début d'activité
+dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire:
+ titre.en: '[automatic] '
+ titre.fr: assiette forfaitaire
dirigeant . indépendant . cotisations et contributions . déduction tabac:
description.en: >
[automatic] If you are also engaged in a commercial activity as a
@@ -5811,38 +6931,31 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac:
souhaitez exonérer de cotisation vieillesse ?
titre.en: '[automatic] tobacco deduction'
titre.fr: déduction tabac
-? dirigeant . indépendant . cotisations et contributions . déduction tabac . revenus déduits
-: titre.en: '[automatic] contribution base (with tobacco deduction)'
+dirigeant . indépendant . cotisations et contributions . déduction tabac . revenus déduits:
+ titre.en: '[automatic] contribution base (with tobacco deduction)'
titre.fr: assiette des cotisations (avec déduction tabac)
-? dirigeant . indépendant . cotisations et contributions . exonération de cotisations minimales
-: titre.en: '[automatic] minimum contribution holiday'
- titre.fr: exonération de cotisations minimales
dirigeant . indépendant . cotisations et contributions . exonérations:
titre.en: exemptions
titre.fr: exonérations
dirigeant . indépendant . cotisations et contributions . exonérations . ACRE:
titre.en: ACRE
titre.fr: ACRE
-? dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . PSS proratisé
-: titre.en: Prorated PSS
- titre.fr: PSS proratisé
-? dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . prorata sur l'année
-: description.en: >
- [automatic] Since the calculation of self-employed contributions is made
- over the entire year,
+dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . prorata sur l'année:
+ description.en: >
+ [automatic] As the calculation of the self-employed contributions is carried
+ out over the whole year
- the exemption is prorated according to the effective duration of the ACRE over the current year.
+ the exemption is prorated according to the actual duration of the ACRE in the current year.
- For example, for a company created on February 1, 2018, the prorated calculation for the
+ For example, for a company created on February 1, 2018, the calculation of the prorata for the
- 2019 dues will be as follows :
+ contributions for 2019 will be as follows:
- 31 days of acreage remaining in 2019 / 365 days = 8.5%.
+ 31 days of acre remaining in 2019 / 365 days = 8.5%`
description.fr: >
- Comme le calcul des cotisations indépendants s'effectue sur l'année
- entière,
+ Comme le calcul des cotisations indépendants s'effectue sur l'année entière,
l'exonération est proratisée en fonction de la durée effective de l'ACRE sur l'année courante.
@@ -5855,17 +6968,17 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ACRE:
`31 jours d'acre restant en 2019 / 365 jours = 8,5%`
titre.en: prorated over the year
titre.fr: prorata sur l'année
-? dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . taux
-: titre.en: rates
+dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . taux:
+ titre.en: rates
titre.fr: taux
dirigeant . indépendant . cotisations et contributions . exonérations . ZFU:
titre.en: ZFU
titre.fr: ZFU
-? dirigeant . indépendant . cotisations et contributions . exonérations . ZFU . taux
-: titre.en: ZFU exemption rate
+dirigeant . indépendant . cotisations et contributions . exonérations . ZFU . taux:
+ titre.en: ZFU exemption rate
titre.fr: taux exonération ZFU
-? dirigeant . indépendant . cotisations et contributions . exonérations . invalidité
-: description.en:
+dirigeant . indépendant . cotisations et contributions . exonérations . invalidité:
+ description.en:
Persons receiving an invalidity pension from a non-agricultural
self-employed workers' scheme enjoy full exemption from sickness and
supplementary pension contributions.
@@ -5888,14 +7001,14 @@ dirigeant . indépendant . cotisations et contributions . exonérations . âge:
question.fr: Bénéficiez-vous du dispositif d'exonération "âge"
titre.en: age
titre.fr: âge
-? dirigeant . indépendant . cotisations et contributions . formation professionnelle
-: note.en: '[automatic] The rate is not increased for artisans with a
+dirigeant . indépendant . cotisations et contributions . formation professionnelle:
+ note.en: '[automatic] The rate is not increased for artisans with a
collaborating spouse.'
note.fr: Le taux n'est pas majoré pour les artisans avec conjoint collaborateur
titre.en: professional training
titre.fr: formation professionnelle
-? dirigeant . indépendant . cotisations et contributions . indemnités journalières maladie
-: description.en: >
+dirigeant . indépendant . cotisations et contributions . indemnités journalières maladie:
+ description.en: >
[automatic] Contributions for daily allowances for self-employed persons. If
the
@@ -5933,30 +7046,20 @@ dirigeant . indépendant . cotisations et contributions . maladie:
Le terme "lorsque" laisse entendre qu'en cas de dépassement du seuil 5xPSS, tout le revenu est soumis à 6.5%. Il semblerait qu'une interprétation inverse soit à privilégier : seule la part supérieure à ce seuil est soumise à ce taux, et c'est cette implémentation que nous avons retenue.
titre.en: '[automatic] disease'
titre.fr: maladie
-dirigeant . indépendant . cotisations et contributions . maladie . taux:
- titre.en: '[automatic] rate'
- titre.fr: taux
-dirigeant . indépendant . cotisations et contributions . maladie . taux RSA:
- note.en: |
- [automatic] For RSA freelancers, only the simple reduction defined in
- the decree for calculating the health contribution is taken into account.
- The reinforced reduction below 40% of the security ceiling
- social is not, because there is no minimum base.
- note.fr: |
- Pour les indépendants au RSA, seule la réduction simple définie dans
- le décret de calcul de la cotisation maladie est prise en compte.
- La réduction renforcée en-dessous de 40% du plafond de la sécurité
- sociale ne l'est pas, car il n'y a pas d'assiette minimale.
- titre.en: '[automatic] RSA rate'
- titre.fr: taux RSA
-? dirigeant . indépendant . cotisations et contributions . maladie . taux RSA part variable
-: titre.en: '[automatic] rate RSA variable part'
- titre.fr: taux RSA part variable
-? dirigeant . indépendant . cotisations et contributions . maladie . taux variable
-: titre.en: '[automatic] floating rate'
- titre.fr: taux variable
-? dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger
-: description.en:
+dirigeant . indépendant . cotisations et contributions . maladie . taux progressif:
+ titre.en: '[automatic] progressive rate'
+ titre.fr: taux progressif
+dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire:
+ description.en: >
+ [automatic] Additional reduction of the sickness rate for income below 40%
+ of the social security ceiling
+ description.fr: >
+ La réduction supplémentaire du taux maladie pour les revenu inférieurs à 40%
+ du plafond de la sécurité sociale
+ titre.en: '[automatic] further reduction'
+ titre.fr: réduction supplémentaire
+dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger:
+ description.en:
'[automatic] In return for the CSG exemption, contributors have
a higher sickness rate. In contrast to other insured tradesmen/artisans,
they do not benefit from the reduction of the health contribution rate
@@ -5967,68 +7070,210 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux RSA:
cotisation maladie en fonction du revenu déclaré.
titre.en: '[automatic] Illness (tax domicile abroad)'
titre.fr: Maladie (domiciliation fiscale à l'étranger)
-? dirigeant . indépendant . cotisations et contributions . retraite complémentaire
-: titre.en: '[automatic] retirement supplement'
+dirigeant . indépendant . cotisations et contributions . non déductibles:
+ titre.en: '[automatic] Non-tax-deductible contributions'
+ titre.fr: Cotisations et contributions non déductibles fiscalement
+dirigeant . indépendant . cotisations et contributions . retraite complémentaire:
+ titre.en: '[automatic] retirement supplement'
titre.fr: retraite complémentaire
-? dirigeant . indépendant . cotisations et contributions . retraite complémentaire . plafond
-: titre.en: '[automatic] supplementary pension ceiling for self-employed persons'
- titre.fr: plafond retraite complémentaire des indépendants
dirigeant . indépendant . cotisations et contributions . retraite de base:
titre.en: '[automatic] basic retirement'
titre.fr: retraite de base
-dirigeant . indépendant . revenu net de cotisations:
- description.en:
- This is the income net of contributions and expenses, before the
- payment of income tax.
- description.fr: Il s'agit du revenu net de cotisations et de charges, avant le
- paiement de l'impôt sur le revenu.
- question.en: What pre-tax income do you want to receive?
- question.fr: Quel revenu avant impôt voulez-vous toucher ?
- résumé.en: Before taxes
- résumé.fr: Avant déduction de l'impôt sur le revenu
- titre.en: net contribution income
- titre.fr: revenu net de cotisations
-dirigeant . indépendant . revenu professionnel:
+dirigeant . indépendant . cotisations et contributions . régularisation:
description.en: >
- [automatic] It is the net income of deductible contributions of the
- self-employed person, which is used as the basis for the calculation of
- contributions for self-employed persons.
+ [automatic] Contributions are calculated provisionally
+
+ on the basis of the last income declared
+
+ (or the lump sum, if no income has yet been declared).
+
+ Once the year is over and the professional income is known
+
+ the contributions are adjusted.
- Attention: **our calculation is made at cruising speed**:
- the self-employed person who is starting out will pay a relatively small package of social security contributions for the first 2 years. He will then have to regularise this situation in relation to the income he has actually received.
+ This simulator calculates the contributions **after adjustment**.
+
+ It therefore enables you to anticipate the amount of this regularisation and to plan your cash flow
+
+ your cash flow accordingly.
- Therefore, this calculation should be seen as "the amount that will have to be paid out anyway" in the short term after 2 years of exercise.
+
+ If your activity income changes significantly compared to the previous year
+
+ you have the possibility to communicate to URSSAF a
+
+ forecast amount for the current year, which will be taken as the basis for the calculation** (be careful, however, you will be required to make an accurate estimate).
+
+ (be careful, however, you will be required to make an accurate estimate).
description.fr: >
- C'est le revenu net de cotisations déductibles du travailleur indépendant,
- qui sert de base au calcul des cotisations pour les indépendants.
+ Les cotisations et contributions sont calculées à titre provisionnel
+
+ sur la base du dernier revenu déclaré
+
+ (ou du montat forfaitaire, si aucun revenu n'est encore déclaré).
+
+ Une fois l'année écoulée et le revenu professionnel connu,
+
+ les cotisations et contributions sont régularisées.
- Attention : **notre calcul est fait au régime de croisière**:
- l'indépendant qui se lance paiera pendant ses 2 premières années un forfait relativement réduit de cotisations sociales. Il devra ensuite régulariser cette situation par rapport au revenu qu'il a vraiment perçu.
+ Ce simulateur calcule les cotisations **après régularisation**.
+
+ Il vous permet donc d'anticiper le montant de cette régularisation et de planifier votre
+
+ trésorerie en conséquence.
- Il faut donc voir ce calcul comme *le montant qui devra de toute façon être payé* à court terme après 2 ans d'exercice.
+
+ Si vos revenus d'activité changent beaucoup par rapport à l'année précédente,
+
+ vous avez la possibilité de communiquer à l'URSSAF un
+
+ **montant prévisionnel pour l'année en cours, qui sera pris comme base de calcul**
+
+ (attention cependant, vous serez tenus de faire une estimation précise).
+ titre.en: '[automatic] How the adjustment of provisional contributions works'
+ titre.fr: Comment fonctionne la régularisation des cotisations provisionnelles
+dirigeant . indépendant . cotisations facultatives:
+ description.en: >
+ [automatic] It is possible for the self-employed to subscribe to private
+ contracts for complementary health care or a retirement savings plan.
+
+ Payments to these contracts are designated as "optional contributions" by the tax authorities.
+
+
+ They are tax deductible (up to a limit), but not deductible for the basis of social contributions.
+ description.fr: >
+ Il est possible pour l'indépendant de souscrire à des contrats privés pour
+ la complémentaire santé, ou un plan d'épargne retraite.
+
+ Les versements à ces contrats sont désigné par l'appellation "cotisations facultative" par l'administration fiscale.
+
+
+ Ils sont déductible d'impôts (dans la limite d'un plafond), mais non déductible pour l'assiette des cotisations et contributions sociales.
+ question.en: '[automatic] Have you subscribed to any private provident and/or
+ supplementary pension contracts (Madelin contracts, retirement savings
+ plans)?'
+ question.fr:
+ Avez-vous souscrit à des contrats de prévoyance et / ou de retraite
+ complémentaire privés (contrats Madelin, plans d'épargne retraite) ?
+ titre.en: '[automatic] optional contributions'
+ titre.fr: cotisations facultatives
+dirigeant . indépendant . cotisations facultatives . PER:
+ description.en: '[automatic] The individual PER is open to everyone. You can
+ subscribe to it with a financial institution or an insurance company. This
+ new plan is the successor to the PERP and Madelin contracts, which will no
+ longer be offered from 1 October 2020. Your savings accumulated on the Perp
+ and Madelin can be transferred to the individual PER at your request. This
+ contract entitles you to tax benefits and your rights are transferable to
+ the other PERs. There are cases of early release.'
+ description.fr: Le PER individuel est ouvert à tous. Vous pouvez le souscrire
+ auprès d'un établissement financier ou d'un organisme d'assurance. Ce
+ nouveau plan succède au PERP et au contrat Madelin, qui ne seront plus
+ proposés à partir du 1er octobre 2020. Votre épargne accumulée sur le Perp
+ et le Madelin peut être à votre demande transférée sur le PER individuel. Ce
+ contrat donne droit à des avantages fiscaux et vos droits sont transférables
+ vers les autres PER. Il y a des cas de déblocage anticipé.
+ question.en: '[automatic] How much do you contribute to a PER (new retirement
+ savings plan, as of October 1, 2019)?'
+ question.fr: Quel est le montant des cotisations que vous versez dans le cadre
+ d'un PER (nouveau plan épargne retraite, depuis le 1er octobre 2019) ?
+ titre.en: '[automatic] Retirement savings plan'
+ titre.fr: Plan d'épargne retraite
+dirigeant . indépendant . cotisations facultatives . contrats madelin:
+ titre.en: '[automatic] Sum of contributions to Madelin contracts'
+ titre.fr: Somme des cotisations à contrats Madelin
+dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance:
+ description.en: >
+ [automatic] If you contribute to a supplementary insurance contract (health,
+ loss of employment)
+
+ under the Madelin law, you can deduct these contributions from the taxable profits
+
+ that you declare for your self-employed activity.
+ description.fr: >
+ Si vous cotisez au titre d'un contrat de prévoyance complémentaire (santé,
+ perte d'emploi subie)
+
+ de type loi Madelin, vous pouvez déduire ces cotisations des bénéfices
+
+ imposables que vous déclarez pour votre activité non salariée.
+ question.en: '[automatic] How much do you pay for your Madelin supplementary
+ insurance policies (health, sudden loss of employment)?'
+ question.fr: Quel est le montant que vous versez pour vos contrats Madelin de
+ prévoyance complémentaire (santé, perte d'emploi subie) ?
+ titre.en: '[automatic] Subscribing to a Madelin supplementary insurance contract'
+ titre.fr: Souscription à un contrat de prévoyance complémentaire Madelin
+dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite:
+ description.en: |
+ [automatic] If you contribute to a Madelin-type retirement contract
+ you can deduct part of these contributions from the taxable profits
+ that you declare for your self-employed activity.
+ description.fr: |
+ Si vous cotisez au titre d'un contrat retraite de type loi Madelin,
+ vous pouvez déduire une partie de ces cotisations des bénéfices
+ imposables que vous déclarez pour votre activité non salariée.
+ question.en: '[automatic] How much do you pay for your Madelin supplementary
+ pension contract?'
+ question.fr: Quel est le montant que vous versez pour votre contrat Madelin
+ retraite complémentaire ?
+ titre.en: '[automatic] Subscription to a Madelin pension'
+ titre.fr: Souscription à une retraite Madelin
+dirigeant . indépendant . cotisations facultatives . déductibles:
+ titre.en: '[automatic] Tax-deductible portion of voluntary contributions'
+ titre.fr: Part des cotisations facultatives déductible fiscalement
+dirigeant . indépendant . cotisations facultatives . non déductibles:
+ titre.en: '[automatic] Non-deductible portion of voluntary contributions'
+ titre.fr: Part des cotisations facultatives non déductible fiscalement
+dirigeant . indépendant . cotisations facultatives . plafond prévoyance:
+ note.en: >
+ [automatic] Normally it is the tax result that should be used for the basis
+ of the ceiling, but we use the professional income to avoid a cycle.
+ note.fr: >
+ Normalement c'est le résultat fiscal qui devrait être utilisé pour
+ l'assiette du plafond, mais on utilise le revenu professionnel pour éviter
+ un cycle.
+ titre.en: '[automatic] planning ceiling'
+ titre.fr: plafond prévoyance
+dirigeant . indépendant . cotisations facultatives . plafond retraite complémentaire:
+ note.en: >
+ [automatic] Normally it is the tax result that should be used for the basis
+ of the ceiling, but we use the professional income to avoid a cycle.
+ note.fr: >
+ Normalement c'est le résultat fiscal qui devrait être utilisé pour
+ l'assiette du plafond, mais on utilise le revenu professionnel pour éviter
+ un cycle.
+ titre.en: '[automatic] supplementary pension ceiling'
+ titre.fr: plafond retraite complémentaire
+dirigeant . indépendant . cotisations facultatives . total:
+ titre.en: '[automatic] Total optional contributions'
+ titre.fr: Total des cotisations facultatives
+dirigeant . indépendant . revenu professionnel:
+ description.en:
+ "[automatic] remuneration of the manager under the self-employed
+ persons' scheme"
+ description.fr: rémunération du dirigeant au régime des indépendant
titre.en: professional income
titre.fr: revenu professionnel
dirigeant . indépendant . revenus étrangers:
description.en: >
- [automatic] Foreign income is income declared by self-employed persons in
- respect of income received from self-employment in another EU/EEA country or
- in Switzerland abroad.
+ [automatic] Foreign income is income declared by self-employed persons for
+ income received from the exercise of a self-employed activity in another EU
+ or EEA country or in Switzerland abroad.
- This income is subject only to contributions and is included in the social security base. However, these revenues are specifically identified in order to deduct them from the CSG/CRDS base.
+ This income is only subject to contributions and is included in the social security base. However, this income is specifically identified in order to deduct it from the CSG/CRDS base.
- To find out whether this income is subject to income tax, please refer to the explanatory note on the website [impots.gouv.fr](https://www.impots.gouv.fr/portail/international-particulier/imposition-des-revenus-de-source-etrangere).
+ To find out whether this income is subject to income tax, please refer to the explanatory note on the website [impots.gouv.fr](https://www.impots.gouv.fr/portail/international-particulier/imposition-des-revenus-de-source-etrangere)
description.fr: >
Les revenus étrangers sont des revenus déclarés par les travailleurs
indépendants pour des revenus perçus au titre de l’exercice d’une activité
- non salariée dans un autre Etat de l’UE, EEE ou en Suisse à l’étranger.
+ non salariée dans un autre Etat de l’UE, EEE ou en Suisse à l’étranger.
- Ces revenus ne sont soumis qu’aux cotisations et sont intégrés à l’assiette sociale. Par contre, ces revenus sont identifiés spécifiquement afin de les déduire de l’assiette de la CSG/CRDS.
+ Ces revenus ne sont soumis qu’aux cotisations et sont intégrés à l’assiette sociale. Par contre, ces revenus sont identifiés spécifiquement afin de les déduire de l’assiette de la CSG/CRDS.
Pour savoir si ces revenus sont soumis à l'impôt sur le revenu, référez-vous à la notice explicative sur le site [impots.gouv.fr](https://www.impots.gouv.fr/portail/international-particulier/imposition-des-revenus-de-source-etrangere)
question.en:
@@ -6042,32 +7287,53 @@ dirigeant . indépendant . revenus étrangers . montant:
question.fr: Quel est leur montant ?
titre.en: foreign income
titre.fr: revenus perçu à l'étranger
-dirigeant . indépendant . résultat fiscal:
- description.en: Taxable net, amount on which tax has to be calculated.
- description.fr: Il s'agit du net imposable, assiette sur laquelle l'impôt est calculé.
- résumé.en: Base for tax calculation
- résumé.fr: Assiette du calcul de l'impôt
- titre.en: fiscal earnings
- titre.fr: résultat fiscal
-dirigeant . rémunération totale:
- description.en: >-
- This is what the company spends in total for the director income. This
- "super gross" remuneration includes all social security contributions to be
- paid.
-
- It can also be considered as the monetary value of the director's work.
- description.fr: >-
+dirigeant . rémunération:
+ titre.en: '[automatic] compensation'
+ titre.fr: rémunération
+dirigeant . rémunération . cotisations:
+ titre.en: '[automatic] contributions'
+ titre.fr: cotisations
+dirigeant . rémunération . imposable:
+ titre.en: '[automatic] taxable income'
+ titre.fr: revenu imposable
+dirigeant . rémunération . impôt:
+ titre.en: '[automatic] income tax'
+ titre.fr: impôt sur le revenu
+dirigeant . rémunération . nette:
+ question.en: '[automatic] What is your net income?'
+ question.fr: Quelle est votre revenu net ?
+ résumé.en: '[automatic] After deduction of contributions and expenses'
+ résumé.fr: Après déduction des cotisations, contributions et charges
+ titre.en: '[automatic] net income'
+ titre.fr: revenu net
+dirigeant . rémunération . nette après impôt:
+ description.en: '[automatic] The net income after deduction of income tax and
+ social security contributions.'
+ description.fr: Le revenu net après déduction de l'impôt sur le revenu et des
+ cotisations sociales.
+ question.en: '[automatic] What is the desired net income after tax?'
+ question.fr: Quel est le revenu net après impôt souhaité ?
+ résumé.en: '[automatic] What you get from this activity'
+ résumé.fr: Ce que vous rapporte cette activité
+ titre.en: '[automatic] After-tax income'
+ titre.fr: Revenu après impôt
+dirigeant . rémunération . totale:
+ description.en: >
+ [automatic] This is what the company spends in total for the remuneration of
+ the manager. This "super gross" remuneration includes all social security
+ contributions to be paid. It can also be considered as the monetary value of
+ the executive's work.
+ description.fr: >
C'est ce que l'entreprise dépense en tout pour la rémunération du dirigeant.
Cette rémunération "super-brute" inclut toutes les cotisations sociales à
- payer.
-
- On peut aussi considérer que c'est la valeur monétaire du travail du dirigeant.
- question.en: How much do you think you will make available for your remuneration?
- question.fr: Quel montant pensez-vous dégager pour votre rémunération ?
- résumé.en: Spent by the company
- résumé.fr: Dépensé par l'entreprise
- titre.en: Director total income
- titre.fr: rémunération totale
+ payer. On peut aussi considérer que c'est la valeur monétaire du travail du
+ dirigeant.
+ question.en: '[automatic] What is the total amount you expect to earn in compensation?'
+ question.fr: Quel montant total pensez-vous dégager pour votre rémunération ?
+ résumé.en: '[automatic] Including contributions'
+ résumé.fr: Incluant les cotisations et contributions
+ titre.en: '[automatic] Total compensation'
+ titre.fr: Rémunération totale
entreprise:
description.en: The contract binds a company and an employee
description.fr: |
@@ -6076,42 +7342,42 @@ entreprise:
titre.fr: entreprise
entreprise . ACRE:
description.en: >-
- [automatic] The aid for the creation or takeover of a business (Acre)
- consists of a partial exemption from social security contributions, known as
- the exemption for the start of activity for 12 months.
+ [automatic] The aid for creating or taking over a business (Acre) consists
+ of a partial exemption from social security charges, known as the start-up
+ exemption, for 12 months.
It is **automatic** for **companies and sole proprietorships** (under certain conditions, such as not having benefited from it in the last three years).
- For **auto-entrepreneurs** on the other hand, it must be requested and is reserved for the following beneficiaries:
+ For **self-employed** entrepreneurs, however, it must be applied for and is reserved for the following beneficiaries
- - Jobseekers (compensated or uncompensated but with at least 6 months of registration with Pôle Emploi in the last 18 months).
+ - Jobseekers (whether or not they receive compensation but have been registered with Pôle Emploi for at least 6 months during the last 18 months).
- - Recipients of social assistance (RSA, ASS, ATA).
+ - Beneficiaries of social assistance (RSA, ASS, ATA)
- - Young people between 18 and 25 years old (up to 29 years old for persons recognized as disabled)
+ - Young people between 18 and 25 years old (up to 29 years old for people recognized as disabled)
- - People creating a micro-enterprise in a priority district of the city (QPPV)
+ - People setting up a micro-enterprise in a priority urban district (QPPV)
- > * *Historical*
+ *History*:
- - For self-enterprises created from 1 January 2020, the exemption is again subject to conditions.
+ - For self-businesses created from 1 January 2020, the exemption is again subject to conditions.
- - For companies created between 1 January 2019 and 31 December 2019, the reduction is generalized to all creators, unless you have already obtained the ACCRE in the three previous years.
+ - For businesses created between January 1, 2019 and December 31, 2019, the reduction is generalized to all creators, unless you have already obtained the ACCRE in the previous three years
- - For companies created before 1 January 2019, the contribution exemption was called ACCRE and was subject to conditions and was not automatic: it had to be applied for.
+ - For companies created before January 1, 2019, the exemption from contributions called ACCRE was subject to conditions and was not automatic: you had to apply for it.
description.fr: >-
L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une
exonération partielle de charges sociales, dite exonération de début
- d'activité pendant 12 mois.
+ d'activité pendant 12 mois.
Elle est **automatique** pour les **sociétés et les entreprises individuelles** (sous certaines conditions, comme par exemple ne pas en avoir bénéficié les trois dernières années).
- Pour les **auto-entrepreneurs** en revanche, elle doit être demandée et est réservée aux bénéficiaires suivants:
+ Pour les **auto-entrepreneurs** en revanche, elle doit être demandée et est réservée aux bénéficiaires suivants:
- Les demandeurs d'emplois (indemnisés ou non indemnisés mais ayant au moins 6 mois d’inscription à Pôle Emploi au cours des 18 derniers mois).
@@ -6140,7 +7406,7 @@ entreprise . ACRE:
titre.en: ACRE
titre.fr: ACRE
entreprise . ACRE par défaut:
- titre.en: '[automatic] default ACRE'
+ titre.en: '[automatic] Default ACRE'
titre.fr: ACRE par défaut
entreprise . activité:
description.en: '[automatic] Your type of activity will determine a large part
@@ -6177,7 +7443,7 @@ entreprise . activité . artisanale:
- Les activités artisanales sont répertoriées par un décret
titre.en: Craft
titre.fr: artisanale
-entreprise . activité . commerciale ou industrielle:
+entreprise . activité . commerciale:
description.en: >
[automatic] ### Commercial activity
@@ -6203,7 +7469,7 @@ entreprise . activité . commerciale ou industrielle:
Activité de production ou de transformation grâce à l'utilisation d'outils industriels, extraction, industries minières, manutention, magasinage et stockage
titre.en: commercial or industrial
- titre.fr: commerciale ou industrielle
+ titre.fr: commerciale
entreprise . activité . débit de tabac:
question.en: '[automatic] Do you engage in tobacco sales?'
question.fr: Exercez-vous une activité de vente de tabac ?
@@ -6264,59 +7530,55 @@ entreprise . activité . libérale réglementée:
entreprise . activité . mixte:
description.en: >
[automatic] It is possible to have several activities with different types
- of income
+ of income for the same
- different for the same company.
+ for the same company.
- For example, a plumbing company that charges for the purchase and installation of a
+ For example, a plumbing company that charges for the purchase and installation of a faucet
- robinet has a part of its turnover in sales of equipment (the tap)
+ faucet has a part of its turnover in sale of material (the faucet)
- and a part in service provision (the installation)
+ and a part in service provision (the installation).
- There are three main families of income in the eyes of the administration
-
- fiscal and social :
+ There are three categories with different standard expense allowance rates:
- - (Sales of goods, restaurants and accommodation (BIC))(/documentation/enterprise/turnover/sales-restaurants and accommodation)
+ - [Sales of goods, catering and accommodation (BIC)](/documentation/company/turnover/sales-restoration-accommodation) (71% allowance)
- - Commercial or craft services (BIC)](/documentation/enterprise/turnover/ BIC services)
+ - Commercial or artisanal services (BIC)](/documentation/company/turnover/service-BIC) (50% deduction)
- - (Other services and liberal activity (NCBs))(/documentation/enterprise/turnover/services- NCBs)
+ - Other services and liberal activities (BNC)](/documentation/company/turnover/service-BNC) (34% deduction)
- If your company has activities that correspond to more than one type of
+ If your company has activities corresponding to several categories of income, answer yes to this
- returned, answer yes to this question.
+ answer yes to this question.
description.fr: >
Il est possible d'avoir plusieurs activités avec des types de revenus
- différents pour une même entreprise.
+ différents pour une même entreprise.
Par exemple, une entreprise de plomberie qui facture l'achat et la pose d'un
robinet a une partie de son chiffre d'affaires en vente de materiel (le robinet)
- et une partie en prestation de service (la pose)
+ et une partie en prestation de service (la pose).
- Il existe trois principales familles de revenus au yeux de l'administration
-
- fiscale et sociale :
+ Il existe trois catégories avec des taux d’abattement forfaitaire pour frais différents :
- - [Ventes de biens, restauration et hébergement (BIC)](/documentation/entreprise/chiffre-d'affaires/vente-restauration-hébergement)
+ - [Ventes de biens, restauration et hébergement (BIC)](/documentation/entreprise/chiffre-d'affaires/vente-restauration-hébergement) (abattement de 71%)
- - [Prestation de service commerciale ou artisanale (BIC)](/documentation/entreprise/chiffre-d'affaires/prestations-de-service-BIC)
+ - [Prestation de service commerciale ou artisanale (BIC)](/documentation/entreprise/chiffre-d'affaires/service-BIC) (abattement de 50%)
- - [Autres prestation de service et activité libérale (BNC)](/documentation/entreprise/chiffre-d'affaires/prestations-de-service-BNC)
+ - [Autres prestation de service et activité libérale (BNC)](/documentation/entreprise/chiffre-d'affaires/service-BNC) (abattement de 34%)
- Si votre entreprise a des activités correspondants à plus d'un type de
+ Si votre entreprise a des activités correspondants à plusieurs catégories de
revenus, répondez oui à cette question.
question.en: '[automatic] Does your company have several types of activities?'
@@ -6326,6 +7588,10 @@ entreprise . activité . mixte:
entreprise . activité . mixte . proportions:
description.en: '[automatic] Share of the various activities in turnover'
description.fr: Part des différentes activités dans le chiffre d'affaires
+ note.en: '[automatic] It is up to the user to check that the sum of the three
+ percentages is 100%.'
+ note.fr: Il appartient à l'utilisateur de bien vérifier que la somme des trois
+ pourcentages renseignés vaut 100%.
titre.en: '[automatic] activity proportion'
titre.fr: proportion activité
entreprise . activité . service ou vente:
@@ -6365,57 +7631,39 @@ entreprise . association non lucrative:
question.fr: S'agit-il d'une association à but non lucratif ?
titre.en: non-profit organisation
titre.fr: association non lucrative
-entreprise . bénéfice:
- résumé.en: '[automatic] Taxable for corporate income tax purposes'
- résumé.fr: Imposable à l'impôt sur les sociétés
- titre.en: '[automatic] Profit for the year'
- titre.fr: Bénéfice de l'exercice
-entreprise . bénéfice . information sur le report de déficit:
- description.en: >
- [automatic] Deficits incurred in one year can be carried forward to
- subsequent years (carry-forward), or carried back to the previous year only
- (carry-back).
-
-
- [More info on service-public.fr](https://www.service-public.fr/professionnels-entreprises/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).
-
-
- [Plus d'infos sur service-public.fr](https://www.service-public.fr/professionnels-entreprises/vosdroits/F23628)
- titre.en: '[automatic] deficit carry forward information'
- titre.fr: information sur le report de déficit
+entreprise . capital social:
+ description.en: |
+ [automatic] This value must include the value of the share premiums.
+ description.fr: |
+ Cette valeur doit inclure la valeur des primes d'émission.
+ question.en: '[automatic] What is the share capital of the company?'
+ question.fr: Quele est le capital social de la société ?
+ titre.en: '[automatic] Share capital'
+ titre.fr: Capital social
entreprise . charges:
description.en: >
- These are the company's expenses incurred in the company's interest,
- excluding executive compensation. For companies and businesses excluding
- auto-entrepreneur, these expenses are said to be deductible from the result:
- the company will not pay any contributions or taxes on it. For the
- self-entrepreneur, they are not deductible: the contractor pays them with
- his salary staff net of contributions and income.
+ [automatic]
+
+ These are the expenses of the company incurred in the interest of the company, excluding the remuneration of the director. For companies and businesses other than auto-entrepreneurs, these expenses are said to be deductible from the result: the company will not pay any contributions or taxes on them. For the auto-entrepreneur, they are not deductible from the turnover.
- We do not yet process VAT: charges are to be entered excluding tax.
+ We do not yet deal with VAT: the expenses are to be entered without tax (except for self-employed entrepreneurs who are exempt from VAT)
- For example, loads can be:
+ For example, the expenses can be :
- purchase of raw materials for a production activity
- purchase of products for resale, for a commercial activity
- - meal costs: the supplement over the cost of a meal at home
-
- - Madelin contracts subscriptions
+ - meal expenses: the extra cost of a meal at home
- Attention: the purchase of a computer at 1000€ is not a charge, but a capital asset: it is an asset that will benefit the company for a period of for several years. Each year, a portion of this asset is and this deductible depreciation can be included in this calculation, for example 200€ per year for 5 years.
+ Attention: the purchase of a computer at 1000€ is not an expense, but a fixed asset: it is an asset that will benefit the company for several years. Each year, a part of this fixed asset is depreciated, and this deductible depreciation can be integrated in this calculation, for example 200€ per year for 5 years.
- On the other hand, a mobile phone for less than 500€ can be considered as a charge without immobilization.
+ On the other hand, a mobile phone costing less than €500 can be treated as an expense with no fixed asset.
description.fr: >
Ce sont les dépenses de l'entreprise engagées dans l'intérêt de celle-ci, hors rémunération du dirigeant. Pour les sociétés et entreprises hors auto-entrepreneur, ces charges sont dites déductibles du résultat : l'entreprise ne paiera pas de cotisations ou impôt dessus. Pour l'auto-entrepreneur, elles ne sont pas déductibles du chiffre d'affaires encaissé.
@@ -6433,8 +7681,6 @@ entreprise . charges:
- frais de repas : le supplément par rapport au coût d'un repas à domicile
- - les cotisations aux contrats Madelin
-
Attention : l'achat d'un ordinateur à 1000€ n'est pas une charge, mais une immobilisation : c'est un bien qui va profiter à l'entreprise pendant plusieurs années. Chaque année, une partie de cette immobilisation est amortie, et cet amortissement déductible peut être intégré dans ce calcul, par exemple 200€ par an pendant 5 ans.
@@ -6444,11 +7690,16 @@ entreprise . charges:
question.fr: Quelles sont les charges de l'entreprise ?
résumé.en: All the expenses necessary for the company"
résumé.fr: Toutes les dépenses nécessaires à l'entreprise
- titre.en: expenses
- titre.fr: charges de fonctionnement
-entreprise . charges dont rémunération dirigeant:
- titre.en: expenses of which executive compensation
- titre.fr: charges dont rémunération dirigeant
+ titre.en: '[automatic] expenses (excluding management remuneration)'
+ titre.fr: charges (hors rémunération dirigeant)
+entreprise . charges . dirigeant:
+ description.en:
+ '[automatic] Amounts related to executive compensation that are
+ tax deductible.'
+ description.fr: Les montants liés à la rémunération du dirigeant qui sont
+ déductibles d'impôt.
+ titre.en: '[automatic] Deductible expenses for managers'
+ titre.fr: Charges déductibles dirigeant
entreprise . chiffre d'affaires:
question.en: What is your expected turnover ?
question.fr: Quel est votre chiffre d'affaires envisagé ?
@@ -6465,14 +7716,22 @@ entreprise . chiffre d'affaires . BIC:
bénéfice industriels et commerciaux (BIC ou micro-BIC).
titre.en: '[automatic] BIC'
titre.fr: BIC
-entreprise . chiffre d'affaires . franchise de TVA dépassée:
- description.en: |
- [automatic] The VAT exemption is a device that exempts businesses from the
- declaration and payment of VAT. It applies below a threshold of
- annual turnover depending on the activity.
+entreprise . chiffre d'affaires . franchise de TVA:
+ titre.en: '[automatic] VAT exemption'
+ titre.fr: franchise de TVA
+entreprise . chiffre d'affaires . franchise de TVA . dépassement:
+ description.en: >
+ [automatic] The VAT exemption is a system that exempts companies from
+ declaring and paying
- The professional covered by this scheme shall invoice his services or his
- sales excluding tax, and cannot deduct VAT from its purchases.
+ declaration and payment of VAT. It applies below a threshold of
+
+ depending on the activity.
+
+
+ The professional who falls under this system invoices his services or sales without tax, and cannot
+
+ and cannot deduct VAT from their purchases.
description.fr: |
La franchise de TVA est un dispositif qui exonère les entreprises de la
déclaration et du paiement de la TVA. Il s'applique en dessous d'un seuil de
@@ -6481,27 +7740,21 @@ entreprise . chiffre d'affaires . franchise de TVA dépassée:
Le professionnel qui relève de ce dispositif facture ses prestations ou ses
ventes en hors taxe, et ne peut pas déduire la TVA de ses achats.
note.en: >
- [automatic] The increased thresholds (which apply if the "reduced" threshold
- was not exceeded in year `n - 2`) are taken into account here.
+ [automatic] We take into account here the increased thresholds (which apply
+ if the "reduced" threshold has not been exceeded in year `n - 2`)
note.fr: >
On prend compte ici des seuils majorés (qui s'appliquent si le seuil
"minoré" n'a pas été dépassé en année `n - 2`)
- titre.en: '[automatic] VAT exemption exceeded'
- titre.fr: franchise de TVA dépassée
-entreprise . chiffre d'affaires . franchise de TVA dépassée . notification:
- description.en: >
+ résumé.en: |
[automatic] The annual turnover threshold for VAT exemption is exceeded.
- More information](/documentation/enterprise/turnover/exceeded VAT exemption)
- description.fr: >
+ résumé.fr: |
Le seuil annuel de chiffre d'affaires pour la franchise de TVA est dépassé.
- [En savoir
- plus](/documentation/entreprise/chiffre-d'affaires/franchise-de-TVA-dépassée)
- titre.en: '[automatic] notification'
- titre.fr: notification
-entreprise . chiffre d'affaires . franchise de TVA dépassée . seuil service:
- titre.en: '[automatic] service threshold'
+ titre.en: '[automatic] overtaking'
+ titre.fr: dépassement
+entreprise . chiffre d'affaires . franchise de TVA . seuil service:
+ titre.en: '[automatic] threshold service'
titre.fr: seuil service
-entreprise . chiffre d'affaires . franchise de TVA dépassée . seuil vente:
+entreprise . chiffre d'affaires . franchise de TVA . seuil vente:
titre.en: '[automatic] sales threshold'
titre.fr: seuil vente
entreprise . chiffre d'affaires . service:
@@ -6513,8 +7766,8 @@ entreprise . chiffre d'affaires . service:
description.fr: |
Il s’agit de toute opération ne comportant pas de transfert de propriété de
biens corporels (c'est-à-dire ayant une existence matérielle)
- titre.en: '[automatic] service'
- titre.fr: service
+ titre.en: '[automatic] Turnover from services'
+ titre.fr: Chiffre d'affaires de prestation de service
entreprise . chiffre d'affaires . service BIC:
description.en: >
[automatic] This is any transaction that does not involve a transfer of
@@ -6540,8 +7793,8 @@ entreprise . chiffre d'affaires . service BIC:
services qui nécessite plus qu'un ordinateur pour être effectuées.
**Exemples** : transports, service à la personne, réparation etc.
- question.en: '[automatic] What is the turnover from commercial or artisanal services?'
- question.fr: Quel est le chiffre d'affaires issus de prestations de service
+ question.en: '[automatic] What is the turnover from commercial or craft services?'
+ question.fr: Quel est le chiffre d'affaires issu de prestations de service
commerciales ou artisanales ?
résumé.en: '[automatic] Turnover excluding tax'
résumé.fr: Chiffre d'affaires hors taxe
@@ -6549,21 +7802,22 @@ entreprise . chiffre d'affaires . service BIC:
titre.fr: Prestations de service commerciales ou artisanales (BIC)
entreprise . chiffre d'affaires . service BNC:
description.en: >
- [automatic] These are all operations whose intellectual activity is based on
+ [automatic] These are all operations in which intellectual activity plays an
+ essential role.
- an essential role.
+ an essential role.
- **Examples**: consulting, support, translation, development,
+ Examples**: consulting, coaching, translation, development,
- training, education, sports
+ training, teaching, sports
- The income from this turnover is taxable under the BNC regime (non-trading profits).
+ The income from this turnover is taxable under the BNC regime (non-commercial profits)
description.fr: >
Ce sont toutes les opérations dont l'activité intellectuelle tient
- un rôle essentiel.
+ un rôle essentiel.
**Exemples** : conseil, accompagnement, traduction, développement,
@@ -6572,72 +7826,162 @@ entreprise . chiffre d'affaires . service BNC:
Les revenus tirés de ce chiffre d'affaires sont imposable au régime BNC (bénéfices non commerciaux)
- question.en: '[automatic] What is the turnover from liberal services?'
- question.fr: Quel est le chiffre d'affaires issus de prestations de service libérale ?
- résumé.en: '[automatic] Turnover excluding tax'
- résumé.fr: Chiffre d'affaires hors taxe
+ question.en: '[automatic] What are the revenues from the liberal activity?'
+ question.fr: Quelles sont les recettes issues de l’activité libérale ?
+ résumé.en: '[automatic] Revenue excluding taxes'
+ résumé.fr: Recettes hors taxes
titre.en: '[automatic] Other services and liberal activities (BNC)'
titre.fr: Autres prestations de service et activités libérales (BNC)
+entreprise . chiffre d'affaires . seuil micro dépassé:
+ description.en: >
+ [automatic] The status of micro-enterprise applies as long as the annual
+ turnover (actually received during the calendar year) does not exceed the
+ thresholds of the micro-enterprise tax regime.
+
+
+ If the thresholds are exceeded **over two consecutive years**, the company automatically switches to the [sole proprietorship](/simulator/self-employed) regime.
+
+
+ At the end of the first year of activity, the turnover is prorated according to the duration of activity.
+
+
+ Example:
+
+ > A taxpayer sets up a business on August 1 and collects revenues (excluding VAT) of `50,000` during the five months of activity of his first calendar year of operation.
+
+ The receipts of this first calendar year are adjusted *prorata temporis* to compare them to the ceiling:
+
+ >
+
+ > `50 000€ x (365/153) = 119 280 €`
+
+
+
+ Charges are not deductible for the calculation of the ceiling (as for the calculation of the contributions)
+
+
+
+ Multi-activity
+
+
+ When an entrepreneur carries out 2 activities within his micro-enterprise, the turnover
+
+ turnover threshold is not doubled. In
+
+ Indeed, the exercise of several activities with the same micro-enterprise
+
+ does not increase the thresholds.
+ description.fr: >
+ 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.
+ titre.en: '[automatic] micro threshold exceeded'
+ titre.fr: seuil micro dépassé
entreprise . chiffre d'affaires . vente restauration hébergement:
- description.en: |
- [automatic] ### Sale of goods
- This is the turnover of all operations involving
- transfer of ownership of tangible property, i.e., property with a
- material existence.
+ description.en: >
+ [automatic] Sale of goods
- ### Catering and hosting
- This is the turnover of all catering operations.
- or lodging (except classified tourist accommodation)
+ This is the turnover of all transactions involving
+
+ transfer of ownership of a tangible asset, i.e. an asset that has a physical
+
+ material existence.
+
+
+ Catering and accommodation
+
+ This is the turnover of all catering and accommodation operations
+
+ or accommodation
+
+
+ Note: for furnished rentals, only classified furnished tourist accommodation and guest rooms are included in this accommodation category; other furnished rentals are included in the "Provision of BIC services" category
+
+
+ This income is taxable in the BIC category
+ description.fr: >
+ ### Vente de biens
- This income is taxable under the BIC regime
- description.fr: |
- ### Vente de biens
Il s’agit du chiffre d'affaires de toutes les opérations comportant
+
transfert de propriété d'un bien corporel, c'est-à-dire un bien ayant une
- existence matérielle.
+
+ existence matérielle.
+
### Restauration et hébergement
- Il s’agit du chiffre d'affaires de toutes les opérations de restauration
- ou hébergement (hors meublé de tourisme classé)
- Ces revenus sont imposable au régime BIC
- question.en: '[automatic] What is the turnover from the sale of goods, food or
- accommodation?'
- question.fr: Quel est le chiffre d'affaires issus de la vente de bien,
+ Il s’agit du chiffre d'affaires de toutes les opérations de restauration
+
+ ou hébergement
+
+
+ > Note : pour les locations meublées, seules les locations de meublé de tourisme classé et de chambre d’hôte entrent dans cette catégorie hébergement ; les autres locations meublées relèvent de la catégorie « Prestations de service BIC »
+
+
+ Ces revenus sont imposables dans la catégorie des BIC
+ question.en:
+ '[automatic] What is the turnover from the sale of goods, catering
+ or accommodation?'
+ question.fr: Quel est le chiffre d'affaires issu de la vente de biens,
restauration ou hébergement ?
résumé.en: '[automatic] Turnover excluding tax'
résumé.fr: Chiffre d'affaires hors taxe
titre.en: '[automatic] Sale of goods, catering, accommodation (BIC)'
titre.fr: Vente de biens, restauration, hébergement (BIC)
-entreprise . chiffre d'affaires minimum:
- description.en: The minimum amount of sales (excluding tax) to be achieved to
- reach the break-even point.
- description.fr:
- Le montant minimum des ventes (H.T) à réaliser pour atteindre le
- seuil de rentabilité.
- question.en: What is your minimum planned turnover?
- question.fr: Quel est votre chiffre d'affaires minimum envisagé ?
- titre.en: Minimum turnover
- titre.fr: chiffre d'affaires minimum
entreprise . date de création:
description.en: >
- [automatic] The activity start date (or creation date) is set at the time of
- the
+ [automatic] The date of commencement of activity (or date of creation) is
+ set when you declare your
- declaration of your company.
+ declaration of your company.
- You can [fill in your company](/manage), in order to pre-fill in the following fields
+ You can [fill in your company](/manage), to pre-fill this information
- automatically this information.
+ this information automatically.
- If you don't have the exact day, the month is usually enough for a good
+ If you do not have the exact day, the month is usually enough for a good
approximation.
description.fr: |
La date de début d'activité (ou date de création) est fixée lors de la
- déclaration de votre entreprise.
+ déclaration de votre entreprise.
Vous pouvez [renseigner votre entreprise](/gérer), pour préremplir
automatiquement cette information.
@@ -6650,7 +7994,7 @@ entreprise . date de création:
suggestions.Début 2020.fr: Début 2020
suggestions.Début 2021.en: '[automatic] Early 2021'
suggestions.Début 2021.fr: Début 2021
- suggestions.Fin 2017.en: '[automatic] End 2017'
+ suggestions.Fin 2017.en: '[automatic] End of 2017'
suggestions.Fin 2017.fr: Fin 2017
titre.en: Creation date
titre.fr: date de création
@@ -6667,6 +8011,9 @@ entreprise . date de création . contrôle date passée:
pas vous être trompé dans la saisie ?
titre.en: '[automatic] past date check'
titre.fr: contrôle date passée
+entreprise . dividendes:
+ titre.en: '[automatic] dividends'
+ titre.fr: dividendes
entreprise . durée d'activité:
titre.en: length of service
titre.fr: durée d'activité
@@ -6755,14 +8102,14 @@ entreprise . exercice . fin:
titre.fr: fin
entreprise . exonérée de TVA:
description.en: >
- [automatic] Certain types of businesses are not subject to VAT.
+ [automatic] Certain types of businesses are not subject to VAT.
- They pay payroll tax in return.
+ These companies pay payroll tax in return.
- This is the case, for example, with banking, financial or insurance institutions.
+ This is the case, for example, for banking, financial or insurance institutions.
description.fr: >
- Certains types d'entreprises ne sont pas assujetties à la TVA.
+ Certains types d'entreprises ne sont pas assujetties à la TVA.
Ces dernières payent la taxe sur les salaires en contrepartie.
@@ -6774,53 +8121,107 @@ entreprise . exonérée de TVA:
titre.fr: exonérée de TVA
entreprise . imposition:
description.en: >
- [automatic] The entrepreneur can choose one of the two systems for taxing
- the profits of his activity:
+ [automatic] Indicate whether the taxation system of the income related to
+ the self-employed activity is :
- - income tax, where profits are declared on the personal income tax return and taxed according to a progressive tax scale.
+ - Income tax: the company's profits are taxed directly to the self-employed person, at the progressive income tax rate.
- - corporate income tax, where profits are declared in the name of the company
+ - corporate tax: the company's profits are taxed in the name of the company, at the corporate tax rate.
description.fr: >
- Le créateur d'entreprise peut opter pour l'un des deux régimes d'imposition
- des bénéfices de son activité :
+ Indiquez si le régime d’imposition des revenus liés à l’activité
+ indépendante relèvent :
- - l'impôt sur le revenu, où les bénéfices sont déclarés sur la déclaration de revenus personnelle et imposés au barème progressif
+ - de l’impôt sur le revenu : les bénéfices de l’entreprise sont imposés directement auprès du travailleur indépendant, au barème progressif de l’impôt sur le revenu.
- - l'impôt sur les sociétés, où les bénéfices sont déclarés au nom de la société
- question.en: '[automatic] What tax regime is the company subject to?'
- question.fr: À quel régime d'imposition l'entreprise est-elle soumise ?
+ - de l’impôt sur les sociétés : les bénéfices de l’entreprise sont imposés au nom de la société, au taux de l’impôt sur les sociétés.
+ question.en: '[automatic] How is the company taxed?'
+ question.fr: Comment l'entreprise est-elle imposée ?
titre.en: '[automatic] taxation'
titre.fr: imposition
entreprise . imposition . IR:
- titre.en: '[automatic] To income tax'
- titre.fr: À l'impôt sur le revenu
+ titre.en: '[automatic] Income tax'
+ titre.fr: Impôt sur le revenu
+entreprise . imposition . IR . information sur le report de déficit:
+ description.en: >
+ [automatic] When your taxable income is negative, it reduces the taxable
+ income of the tax household.
+
+ A deficit can be deducted up to 6 years after its realization.
+
+
+ See detailed tax rules](https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301)
+ description.fr: >
+ Lorsque votre résultat fiscal est négatif, ce dernier vient réduire le
+ revenu imposables du foyer fiscal.
+
+ Un déficit peut être imputé jusqu'à 6 ans après sa réalisation.
+
+
+ [Voir les règles fiscales détaillées](https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301)
+ titre.en: '[automatic] information on deficit carryover'
+ titre.fr: information sur le report de déficit
+entreprise . imposition . IR . micro-fiscal:
+ description.en: >
+ [automatic] With the micro tax system, the deductible expenses are estimated
+ on a flat rate basis, according to a percentage of the turnover. This
+ percentage depends on the type of activity: 71% for sales, catering and
+ accommodation (rental of classified furnished tourist accommodation and
+ guest rooms), 50% for commercial or craft services, 34% for liberal
+ activities.
+
+
+ This option allows you to simplify your accounting and can be advantageous in terms of taxable income and subject to social security contributions if your operating expenses are low.
+ description.fr: >
+ 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 classé et
+ chambre d’hôte), 50% pour les prestations de service commerciales ou
+ artisanales, 34% pour les activités libérales.
+
+
+ Cette option permet de simplifier votre comptabilité et peut être avantageuse en termes de revenu imposable et soumis à cotisations et contributions sociales dans le cas où vos charges de fonctionnement sont faibles.
+ question.en: '[automatic] Have you opted for the micro-tax system?'
+ question.fr: Avez-vous opté pour le régime micro-fiscal ?
+ titre.en: '[automatic] micro-tax'
+ titre.fr: micro-fiscal
+entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés:
+ description.en: '[automatic] The annual turnover threshold for the micro-tax
+ regime is exceeded. Learn
+ more](/documentation/company/turnover/threshold-micro-tax-exceeded)'
+ description.fr: Le seuil annuel de chiffre d'affaires pour le régime
+ micro-fiscal est dépassé. [En savoir
+ plus](/documentation/entreprise/chiffre-d'affaires/seuil-micro-dépassé)
+ titre.en: '[automatic] threshold alert exceeded'
+ titre.fr: alerte seuil dépassés
+entreprise . imposition . IR . micro-fiscal . revenu abattu:
+ description.en: >
+ [automatic] The micro-entrepreneur is exempted from drawing up a
+ professional declaration of profits under the BNC or BIC heading.
+
+
+ All they have to do is enter the annual gross turnover (BIC) or revenue (BNC) in the supplementary income tax return (n°2042-C Pro).
+ description.fr: >
+ Le micro-entrepreneur est dispensé d'établir une déclaration professionnelle
+ de bénéfices au titre des BNC ou BIC.
+
+
+ Il lui suffit de porter dans la déclaration complémentaire de revenu (n°2042-C Pro) le montant annuel du chiffre d'affaires brut (BIC) ou des recettes (BNC).
+ titre.en: '[automatic] flat-rate micro-tax deduction'
+ titre.fr: abattement forfaitaire micro-fiscal
entreprise . imposition . IS:
- titre.en: '[automatic] To corporate tax'
- titre.fr: À l'impôt sur les sociétés
-entreprise . imposition . IS . notification IS non intégré:
- description.en: >
- [automatic] This simulator does not include corporate taxes or the taxation
- of
-
- dividends. The "Corporate Tax" option is only used in the following cases
-
- income tax calculation.
- description.fr: |
- Ce simulateur n'intègre pas l'impôts sur les sociétés ni la fiscalité des
- dividendes. L'option "Impôt sur les Sociétés" est uniquement utilisée dans
- le calcul de l'impôt sur le revenu.
- titre.en: '[automatic] non-integrated IS notification'
- titre.fr: notification IS non intégré
-entreprise . impôt sur les sociétés:
- titre.en: corporate income tax
+ titre.en: '[automatic] Corporate income tax'
+ titre.fr: Impôt sur les sociétés
+entreprise . imposition . IS . impôt sur les sociétés:
+ titre.en: '[automatic] corporate tax'
titre.fr: impôt sur les sociétés
-entreprise . impôt sur les sociétés . contribution sociale:
+entreprise . imposition . IS . impôt sur les sociétés . contribution sociale:
description.en: >
- [automatic] The social contribution on profits is a tax separate from the
- corporate tax. Its amount is not deductible from profits.
+ [automatic] The social contribution on profits is a separate tax from the
+ corporate tax. Its amount is not deductible from the results.
- The tax base benefits from a significant reduction, and only companies making more than EUR 2,3 million in profits are concerned by this contribution.
+ The tax base benefits from a significant deduction, and only companies with a profit of more than 2.3 million euros are concerned by this contribution.
description.fr: >
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.
@@ -6829,26 +8230,47 @@ entreprise . impôt sur les sociétés . 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.
titre.en: '[automatic] social contribution'
titre.fr: contribution sociale
-entreprise . impôt sur les sociétés . plafond taux réduit 1:
+entreprise . imposition . IS . impôt sur les sociétés . plafond taux réduit 1:
titre.en: '[automatic] ceiling reduced rate 1'
titre.fr: plafond taux réduit 1
-entreprise . impôt sur les sociétés . plafond taux réduit 2:
+entreprise . imposition . IS . impôt sur les sociétés . plafond taux réduit 2:
titre.en: '[automatic] ceiling reduced rate 2'
titre.fr: plafond taux réduit 2
-entreprise . impôt sur les sociétés . prorata temporis:
+entreprise . imposition . IS . impôt sur les sociétés . prorata temporis:
description.en: >
- [automatic] When the duration of the fiscal year is not equal to one year,
- we pro-rate the
+ [automatic] When the duration of the financial year is not equal to one
+ year, the ceilings used in the
- ceilings used in the corporate tax scale.
+ the ceilings used in the corporate tax schedule.
description.fr: |
Lorsque la durée de l’exercice n'est pas égale à un an, on pro-ratise les
plafonds utilisés dans le barème de l'impôt sur les sociétés.
titre.en: '[automatic] prorata temporis'
titre.fr: prorata temporis
-entreprise . impôt sur les sociétés . éligible taux réduit:
- titre.en: '[automatic] eligible reduced rate'
+entreprise . imposition . IS . impôt sur les sociétés . éligible taux réduit:
+ titre.en: '[automatic] eligible for reduced rate'
titre.fr: éligible taux réduit
+entreprise . imposition . IS . information sur le report de déficit:
+ description.en: >
+ [automatic] Losses incurred during a fiscal year can be carried forward to
+ subsequent years (carry forward), or back to the previous year only (carry
+ back).
+ 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).
+ titre.en: '[automatic] information on deficit carryover'
+ titre.fr: information sur le report de déficit
+entreprise . imposition . IS . résultat imposable:
+ résumé.en: '[automatic] Taxable for corporate income tax purposes'
+ résumé.fr: Imposable à l'impôt sur les sociétés
+ titre.en: '[automatic] Result for the year'
+ titre.fr: Résultat de l'exercice
+entreprise . imposition . IS . résultat net:
+ résumé.en: '[automatic] After deduction of expenses and corporate income tax'
+ 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 . ratio alternants:
description.en: >
This fraction determines the additional contribution for learning for the
@@ -6866,26 +8288,9 @@ entreprise . ratio alternants:
suggestions.5%.fr: 5%
titre.en: work-study employees ratio
titre.fr: Fraction d'alternants
-entreprise . rémunération du dirigeant:
- description.en: >
- This is the portion of revenue after expenses that is allocated to the
- executive's compensation. The higher this share, the higher the executive's
- compensation increases, and the lower the company's profit.
- description.fr: >
- C'est la part du chiffre d'affaires après charges qui est allouée à la
- rémunération du dirigeant. Plus cette part est élevée, plus la rémunération
- du dirigeant augmente, et plus le bénéfice de l'entreprise diminue.
- question.en: How much of the after-charge revenue is allocated to the
- executive's compensation?
- question.fr: Quelle part du chiffre d'affaires après charge est allouée à la
- rémunération du dirigeant ?
- titre.en: executive compensation
- titre.fr: rémunération du dirigeant
-entreprise . résultat net:
- résumé.en: What remains after corporate income tax
- résumé.fr: Ce qu'il reste après impôt sur les sociétés
- titre.en: net result
- titre.fr: résultat net
+entreprise . résultat fiscal:
+ titre.en: '[automatic] tax result'
+ titre.fr: résultat fiscal
entreprise . taxe sur les salaires:
description.en: '[automatic] When the amount of payroll tax is less than
€1200/year, there is no need to make a declaration and the tax is not
@@ -6905,7 +8310,52 @@ impôt:
description.en: '[automatic] This set of formulas is a simplified income tax model.'
description.fr: Cet ensemble de formules est un modèle simplifié de l'impôt sur le revenu.
titre.en: income tax
- titre.fr: impôts sur le revenu
+ titre.fr: impôt sur le revenu
+impôt . dividendes:
+ titre.en: '[automatic] Taxation of dividends'
+ titre.fr: Imposition des dividendes
+impôt . dividendes . PFU:
+ description.en: >
+ [automatic] This amount is to be paid in the form of a deposit at the time
+ of payment of the
+
+ dividends.
+
+
+ The advance payment is not compulsory if the tax income n-2 is less than
+
+ à
+
+ - 50,000 € for a single person,
+ - 75,000 for a couple subject to joint taxation (married or
+ married or in a civil union).
+
+ In this case, the beneficiary may apply for exemption no later than
+
+ 30 November of the year preceding the year of payment
+ description.fr: |
+ Ce montant est à verser sous forme d'acompte au moment du versement des
+ dividendes.
+
+ L'acompte n'est pas obligatoire au cas où le revenu fiscal n-2 est inférieur
+ à
+
+ - 50 000 € pour une personne seule,
+ - 75 000 € pour un couple soumis à l'imposition commune (mariés ou
+ pacsés).
+
+ Dans ce cas, le bénéficiaire peut faire la demande de dispense au plus tard
+ le 30 novembre de l'année précédant celle du paiement
+ titre.en: '[automatic] Amount of tax on dividends under the Prélèvement
+ Forfaitaire Unique (or "flat tax")'
+ titre.fr:
+ Montant de l'impôt sur dividendes au titre du Prélèvement Forfaitaire
+ Unique (ou "flat tax")
+impôt . dividendes . montant en sus des autres revenus imposables:
+ titre.en: '[automatic] Amount of tax on dividends, in addition to tax on other
+ taxable income'
+ titre.fr: Montant de l'impôt sur dividendes, en sus de l'impôt sur les autres
+ revenus imposables
impôt . domiciliation étranger non implémentée:
description.en: >
[automatic] Non-resident withholding tax is not yet implemented. For more
@@ -6945,15 +8395,18 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut:
impôt . foyer fiscal . impôt sur le revenu . impôt brut . sans plafonnement:
titre.en: '[automatic] uncapped'
titre.fr: sans plafonnement
+impôt . foyer fiscal . impôt sur le revenu . impôt brut . sans plafonnement . sans parts rattachées:
+ titre.en: '[automatic] without attached units'
+ titre.fr: sans parts rattachées
impôt . foyer fiscal . impôt sur le revenu . impôt brut par part:
description.en: >
- [automatic] This is the famous income tax schedule. It's a five-bracket
- marginal scale.
+ [automatic] Here is the famous income tax scale. It is a marginal scale with
+ 5 brackets.
A contribution on high incomes adds two more brackets.
- Attention: for an annual income of 100 000€, the taxpayer will only pay 41 000€ tax (the rate of the 4th bracket is 41%)! This 41% is only applied to the part of his income above 72 617€.
+ Attention: for an income of 100 000€ per year, the taxpayer will not pay 41 000€ of tax (the rate of the 4th bracket is 41%)! This 41% is only applied to the part of his income above 72 617€.
description.fr: >
Voici le fameux barème de l'impôt sur le revenu. C'est un barème marginal à
5 tranches.
@@ -6961,15 +8414,21 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut par part:
Une contribution sur les hauts revenus ajoute deux tranches supplémentaires.
- Attention : pour un revenu de 100 000€ annuels, le contribuable ne paiera 41 000€ d'impôt (le taux de la 4ème tranche est 41%) ! Ces 41% sont appliqués uniquement à la part de ses revenus supérieure à 72 617€.
+ Attention : pour un revenu de 100 000€ annuels, le contribuable ne paiera pas 41 000€ d'impôt (le taux de la 4ème tranche est 41%) ! Ces 41% sont appliqués uniquement à la part de ses revenus supérieure à 72 617€.
titre.en: '[automatic] gross tax per unit'
titre.fr: impôt brut par part
+impôt . foyer fiscal . impôt sur le revenu . impôt brut par part . sans parts rattachées:
+ titre.en: '[automatic] without attached units'
+ titre.fr: sans parts rattachées
impôt . foyer fiscal . impôt sur le revenu . quotient familial:
titre.en: '[automatic] family quotient'
titre.fr: quotient familial
-? impôt . foyer fiscal . impôt sur le revenu . quotient familial . plafond avantage
-: titre.en: '[automatic] advantage ceiling'
+impôt . foyer fiscal . impôt sur le revenu . quotient familial . plafond avantage:
+ titre.en: '[automatic] advantage ceiling'
titre.fr: plafond avantage
+impôt . foyer fiscal . impôt sur le revenu . quotient familial . sans parts rattachées:
+ titre.en: '[automatic] without attached units'
+ titre.fr: sans parts rattachées
impôt . foyer fiscal . impôt à payer:
titre.en: '[automatic] tax payable'
titre.fr: impôt à payer
@@ -7007,6 +8466,9 @@ impôt . foyer fiscal . nombre de parts . principales:
impôt . foyer fiscal . nombre de parts . rattachées:
titre.en: '[automatic] related'
titre.fr: rattachées
+impôt . foyer fiscal . nombre de parts . sans parts rattachées:
+ titre.en: '[automatic] without attached units'
+ titre.fr: sans parts rattachées
impôt . foyer fiscal . revenu fiscal de référence:
description.en: "[automatic] The reference tax income corresponds to the
household's slaughtered income adjusted with a quotient mechanism and
@@ -7023,17 +8485,17 @@ impôt . foyer fiscal . revenu imposable:
impôt . foyer fiscal . revenu imposable . autres revenus imposables:
question.en: '[automatic] What is the total amount of other taxable household income?'
question.fr: Quel est le montant total des autres revenus imposables du foyer fiscal ?
- titre.en: '[automatic] other taxable income'
- titre.fr: autres revenus imposables
+ titre.en: '[automatic] Other taxable income of the tax household'
+ titre.fr: Autres revenus imposables du foyer fiscal
impôt . foyer fiscal . revenu imposable . revenu d'activité abattu:
- description.en: '[automatic] In the general case, the tax is calculated after
- the application of a fixed lump-sum allowance. However, everyone can opt to
- declare their "actual expenses", which will replace this default lump-sum
- deduction.'
- description.fr: Dans le cas général, l'impôt est calculé après l'application
- d'un abattement forfaitaire fixe. Chacun peut néanmoins opter pour la
- déclaration de ses *frais réels*, qui viendront remplacer ce forfait par
- défaut.
+ description.en: >
+ [automatic] In the general case, the tax is calculated after the application
+ of a fixed abatement. However, everyone can opt to declare their *actual
+ expenses*, which will replace this default fixed allowance.
+ description.fr: >
+ Dans le cas général, l'impôt est calculé après l'application d'un abattement
+ forfaitaire fixe. Chacun peut néanmoins opter pour la déclaration de ses
+ *frais réels*, qui viendront remplacer ce forfait par défaut.
titre.en: '[automatic] earned income slaughtered'
titre.fr: revenu d'activité abattu
impôt . foyer fiscal . situation de famille:
@@ -7053,6 +8515,12 @@ impôt . foyer fiscal . situation de famille . veuf:
impôt . foyer fiscal . taux effectif:
titre.en: '[automatic] yield rate'
titre.fr: taux effectif
+impôt . montant:
+ titre.en: '[automatic] Income tax'
+ titre.fr: Impôt sur le revenu
+impôt . montant si autres revenus imposables uniquement:
+ titre.en: '[automatic] Amount of tax if no dividend is received'
+ titre.fr: Montant de l'impôt dans le cas où aucun dividende ne serait touché
impôt . méthode de calcul:
description.en: >
We have implemented three ways to calculate income tax:
@@ -7079,6 +8547,13 @@ impôt . méthode de calcul:
question.fr: Comment souhaitez-vous calculer l'impôt sur le revenu ?
titre.en: calculation method
titre.fr: méthode de calcul
+impôt . méthode de calcul . PFU:
+ description.en: '[automatic] Calculation of the tax on income from movable
+ assets with the single flat rate tax (or "flat tax")'
+ description.fr: Calcul de l'impôt des revenus de capitaux mobiliers avec le
+ prélèvement forfaitaire unique (ou "flat tax")
+ titre.en: '[automatic] with one-time deduction'
+ titre.fr: avec prélèvement forfaitaire unique
impôt . méthode de calcul . barème standard:
description.en: '[automatic] The "official" tax calculation, the one the tax
authorities use to calculate your tax rate.'
@@ -7158,8 +8633,8 @@ impôt . taux neutre d'impôt sur le revenu:
abattu.
titre.en: neutral income tax rate
titre.fr: taux neutre d'impôt sur le revenu
-? impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique
-: note.en: '[automatic] This scale was not upgraded in 2021.'
+impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique:
+ note.en: '[automatic] This scale was not upgraded in 2021.'
note.fr: Ce barème n'a pas été revalorisé en 2021.
titre.en: Guadeloupe Reunion Island Martinique scale
titre.fr: barème Guadeloupe Réunion Martinique
@@ -7438,18 +8913,16 @@ protection sociale . retraite:
Simulez et gérez votre retraite sur [info-retraite.fr](https://www.info-retraite.fr/portail-info/home.html).
note.en: >
- [automatic] This is an estimate for purely indicative purposes, in order to
- compare the retirement of the different schemes.
+ [automatic] This is a purely indicative estimate for the purpose of
+ comparing the pensions of the various schemes.
- In particular, we limit ourselves to the following assumptions:
- - The worker is considered to have retired at full rate, either by contributing the required number of quarters (172), or by retiring at full rate age (67).
- - The worker is considered to have had the same income throughout his or her career.
- - The worker is considered to have remained in the same regime throughout his or her career.
- - We don't take into account any markdowns / surcharges.
- - We do not take into account the pension funds of the regulated liberal professions (the 10 sections of the Cnavpl and the Cnbf).
- - The number of validated quarters per year is not calculated.
-
- These limits will evolve as the simulator develops.
+ We limit ourselves to the following assumptions:
+ - It is assumed that the worker has retired at the full rate, by contributing the required number of quarters (172), or by leaving at the full rate age (67 years)
+ - The worker is considered to have had the same income throughout his career
+ - It is considered that the worker has remained in the same scheme throughout his career
+ - Minorities/increases are not taken into account
+ - We do not take into account the pension funds of the regulated liberal professions (the 10 sections of the Cnavpl and the Cnbf)
+ - The number of quarters validated per year is not calculated
note.fr: >
Il s'agit d'une estimation a but purement indicatif, afin de comparer la
retraite des différents régimes.
@@ -7461,8 +8934,6 @@ protection sociale . retraite:
- On ne prend pas en compte les minorations / majorations
- On ne prend pas en compte les caisses de retraite des professions libérales réglementées (les 10 sections de la Cnavpl et la Cnbf)
- On ne calcule pas le nombre de trimestres validés par année
-
- Ces limites seront amenées à évoluer au fur et à mesure du développement du simulateur
résumé.en: Guarantees on average 60 to 70% of the last income from employment
after age 65.
résumé.fr: Garantit en moyenne 60 à 70 % du dernier revenu d'activité après 65 ans.
@@ -7492,6 +8963,21 @@ protection sociale . retraite . base . taux de la pension:
(ou avant si tous les trimestres sont validés).
titre.en: rate of the pension
titre.fr: taux de la pension
+protection sociale . retraite . complémentaire indépendants:
+ titre.en: supplementary pension for self-employed
+ titre.fr: complémentaire indépendants
+protection sociale . retraite . complémentaire indépendants . points acquis:
+ titre.en: acquired points
+ titre.fr: points acquis
+protection sociale . retraite . complémentaire indépendants . prix d'achat du point:
+ titre.en: buying cost of the point
+ titre.fr: prix d'achat du point
+protection sociale . retraite . complémentaire indépendants . total points acquis:
+ titre.en: '[automatic] total points earned'
+ titre.fr: total points acquis
+protection sociale . retraite . complémentaire indépendants . valeur du point:
+ titre.en: value of the point
+ titre.fr: valeur du point
protection sociale . retraite . complémentaire salarié:
titre.en: supplementary pension for employees
titre.fr: complémentaire salarié
@@ -7507,32 +8993,24 @@ protection sociale . retraite . complémentaire salarié . points acquis:
protection sociale . retraite . complémentaire salarié . valeur du point:
titre.en: value of the point
titre.fr: valeur du point
-protection sociale . retraite . complémentaire sécurité des indépendants:
- titre.en: supplementary pension for self-employed
- titre.fr: complémentaire sécurité des indépendants
-? protection sociale . retraite . complémentaire sécurité des indépendants . points acquis
-: titre.en: acquired points
- titre.fr: points acquis
-? protection sociale . retraite . complémentaire sécurité des indépendants . points acquis par mois
-: titre.en: acquired points per month
- titre.fr: points acquis par mois
-? protection sociale . retraite . complémentaire sécurité des indépendants . prix d'achat du point
-: titre.en: buying cost of the point
- titre.fr: prix d'achat du point
-? protection sociale . retraite . complémentaire sécurité des indépendants . valeur du point
-: titre.en: value of the point
- titre.fr: valeur du point
protection sociale . retraite . mois cotisés:
titre.en: contributed months
titre.fr: mois cotisés
+protection sociale . retraite . plr:
+ description.en: '[automatic] We have not implemented the specific rules for
+ regulated professions.'
+ description.fr: Nous n'avons pas implémenté les règles spécifiques aux
+ professions libérales relementées.
+ titre.en: '[automatic] Retirement from regulated professions'
+ titre.fr: Retraite profession libérale réglementée
protection sociale . retraite . trimestres validés:
titre.en: '[automatic] validated quarters'
titre.fr: trimestres validés
-? protection sociale . retraite . trimestres validés . barème trimestres générique
-: titre.en: generic quarters scale
+protection sociale . retraite . trimestres validés . barème trimestres générique:
+ titre.en: generic quarters scale
titre.fr: barème trimestres générique
-? protection sociale . retraite . trimestres validés . trimestres auto-entrepreneur
-: description.en: Minimum turnover thresholds for the validation of quarters for
+protection sociale . retraite . trimestres validés . trimestres auto-entrepreneur:
+ description.en: Minimum turnover thresholds for the validation of quarters for
retirement as a self-employed entrepreneur. Below the minimum amount, you
will only have access to the solidarity allowance.
description.fr:
@@ -7679,31 +9157,6 @@ période . jours ouvrés moyen par mois:
période . semaines par mois:
titre.en: week per month
titre.fr: semaines par mois
-revenu net après impôt:
- description.en: |
- This is the income net of contributions and taxes.
- In other words, that's what you get in the end from your bank account.
- description.fr: |
- Il s'agit du revenu net de charges, cotisations et d'impôts.
- Autrement dit, c'est ce que vous gagnez à la fin sur votre compte en banque.
- question.en: What income do you want to receive?
- question.fr: Quel revenu voulez-vous toucher ?
- résumé.en: Paid into the bank account
- résumé.fr: Disponible sur votre compte en banque
- titre.en: Net income after tax
- titre.fr: revenu net après impôt
-revenus net de cotisations:
- description.en: |
- l'impôt sur le revenu.
- description.fr: >
- Il s'agit du revenu net de cotisations et de charges, avant le paiement de
- l'impôt sur le revenu.
- question.en: What pre-tax income do you want to earn?
- question.fr: Quel revenu avant impôt voulez-vous toucher ?
- résumé.en: Before tax
- résumé.fr: Avant impôt
- titre.en: net contribution income
- titre.fr: revenus net de cotisations
situation personnelle:
titre.en: personal situation
titre.fr: situation personnelle
@@ -7774,86 +9227,6 @@ situation personnelle . domiciliation fiscale à l'étranger:
établissement . localisation . outre-mer . Guadeloupe Réunion Martinique:
titre.en: '[automatic] Guadeloupe Reunion Martinique'
titre.fr: Guadeloupe Réunion Martinique
-établissement . secteur d'activité covid:
- description.en: >
- [automatic] Eligibility conditions for covid aid depend on the sector
-
- of the establishment's activity.
-
-
- Hotels, restaurants, bars, etc. are in
-
- the so-called "S1" category and are entitled to aid without further conditions.
-
-
- Sectors whose activity depends on those of "sector 1" may
-
- also benefit from the aid on condition that they have had a fall in turnover
-
- of significant business during lockdown.
-
-
- Finally, the so-called "S2" sectors are those involving the reception of the public, and
-
- are eligible for aid on condition that they have been closed down
-
- administrative.
-
-
- The terms and conditions are specified on the Urssaf website.
- description.fr: |
- Les conditions d'éligibilité aux aides "covid" dépendent du secteur
- d'activité de l'établissement.
-
- Les hôtels, restaurants, bars, etc. sont dans
- la catégorie dite "S1" et ont le droit aux aides sans autre conditions.
-
- Les secteurs dont l'activité dépendent de celles du "secteur 1" peuvent
- aussi bénéficier des aides à condition d'avoir eu une baisse de chiffre
- d'affaires significative pendant le confinement.
-
- Enfin les secteurs dits "S2" sont ceux impliquant l'accueil du public, et
- sont éligibles aux aides à condition d'avoir subit une fermeture
- administrative.
-
- Les modalités sont précisées sur le site de l'Urssaf.
- question.en: >
- [automatic] covid" reduction device: is your main activity in one of the
- following sectors?
- question.fr: >
- Dispositif de réduction "covid" : votre activité principale relève-t'elle
- d'un des secteurs suivants ?
- titre.en: '[automatic] covid business line'
- titre.fr: secteur d'activité covid
-établissement . secteur d'activité covid . S1:
- titre.en: '[automatic] Sector "1" - tourism, hotels and restaurants'
- titre.fr: Secteur "1" - tourisme, hôtellerie, restauration
-établissement . secteur d'activité covid . S1-bis:
- titre.en: '[automatic] Sector "1a" - whose activity depends on that of sector 1'
- titre.fr: Secteur "1 bis" - dont l'activité dépend de celle des secteurs 1
-établissement . secteur d'activité covid . S2:
- titre.en: '[automatic] Sector "2" - activity involving the reception of the
- public that has been interrupted'
- titre.fr: Secteur "2" - activité impliquant l'accueil du public qui a été interrompue
-établissement . secteur d'activité covid . activité interrompue:
- question.en: |
- [automatic] Was your business interrupted because of the Covid-19 outbreak?
- question.fr: |
- Votre activité a-t'elle été interrompue à cause de l’épidémie de Covid-19 ?
- titre.en: '[automatic] interrupted activity'
- titre.fr: activité interrompue
-? établissement . secteur d'activité covid . baisse significative de chiffre d'affaires
-: question.en: |
- [automatic] Has your business suffered a drop in turnover of at least 80%?
- between 15 March and 15 May 2020 compared to the previous year?
- question.fr: |
- Votre activité a-t-elle subit une baisse d'au moins 80% de chiffre d'affaire
- entre le 15 mars et le 15 mai 2020 par rapport à l'année précédentes ?
- titre.en: '[automatic] significant drop in turnover'
- titre.fr: baisse significative de chiffre d'affaires
-établissement . secteur d'activité covid . éligible aide:
- titre.en: '[automatic] eligible aid'
- titre.fr: éligible aide
établissement . taux du versement transport:
titre.en: Rate of transport tax
titre.fr: taux du versement transport
diff --git a/mon-entreprise/source/locales/translateRules.ts b/mon-entreprise/source/locales/translateRules.ts
index ea5b354c1..2380a11ec 100644
--- a/mon-entreprise/source/locales/translateRules.ts
+++ b/mon-entreprise/source/locales/translateRules.ts
@@ -41,17 +41,15 @@ export const attributesToTranslate = [
'identifiant court',
]
-const translateProp = (lang: string, translation: Translation) => (
- rule: Rule,
- prop: string
-) => {
- if (prop === 'suggestions' && rule?.suggestions) {
- return translateSuggestion(prop, rule, translation, lang)
+const translateProp =
+ (lang: string, translation: Translation) => (rule: Rule, prop: string) => {
+ if (prop === 'suggestions' && rule?.suggestions) {
+ return translateSuggestion(prop, rule, translation, lang)
+ }
+ let propTrans = translation[prop + '.' + lang]
+ propTrans = propTrans?.replace(/^\[automatic\] /, '')
+ return propTrans ? assoc(prop, propTrans, rule) : rule
}
- let propTrans = translation[prop + '.' + lang]
- propTrans = propTrans?.replace(/^\[automatic\] /, '')
- return propTrans ? assoc(prop, propTrans, rule) : rule
-}
function translateRule(
lang: string,
@@ -69,11 +67,11 @@ function translateRule(
)
}
-export default function translateRules(
+export default function translateRules(
lang: string,
- translations: Record,
- rules: Record
-): Record {
+ translations: Record,
+ rules: Record
+): Record {
const translatedRules = mapObjIndexed(
(rule: Rule, name: string) => translateRule(lang, translations, name, rule),
rules
diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml
index 5ec483893..41f86d53e 100644
--- a/mon-entreprise/source/locales/ui-en.yaml
+++ b/mon-entreprise/source/locales/ui-en.yaml
@@ -8,11 +8,12 @@
<0>Oui0>: <0>Yes0>
A quoi servent mes cotisations ?: What's included in my contributions?
Accueil: Home
-Afficher la description publicode: Display publicode description
+Afficher la description publicodes: Display publicodes description
Aide à la déclaration de revenu: Income tax return assistance
Aide à la déclaration de revenus au titre de l'année 2019: Help with your 2019 income tax return
Aides Covid-19: Covid-19 Aids
Alors: Then
+Annuel: Yearly
Année d'activité: Years of activity
Artiste-auteur: Artist-author
Assimilé salarié: '"Assimilé-salarié"'
@@ -70,6 +71,8 @@ Exemples: Examples
Exemples de simulation de salaire: Examples of salary simulations
Exonérations: Exemptions
Explorez notre documentation: Explore our documentation
+ExportSimulation:
+ Banner: <0>Print or save as PDF0>
Faire une simulation: Launch a simulation
Fiche de paie: Payslip
Gestion des données personnelles: Management of personal data
@@ -80,9 +83,11 @@ Gérant minoritaire: Managing director
Gérant minoritaire ou égalitaire: Minority or equal manager
Habituellement: Usually
Imprimer: Print
+Impôt au barème: Tax on the scale
Impôts: Taxes
"Indemnité chômage partiel prise en charge par l'état :": "State-paid short-time working allowance :"
Indépendant: Indépendant
+Indépendants et dirigeants: Self-employed and executives
International: International
Intégrer l'interface de simulation: Integrate the simulation interface
Intégrer la bibliothèque de calcul: Integrate the calculation library
@@ -93,6 +98,7 @@ Janvier 2019: January 2019
Jusqu’au: Until
La somme de: This rule is the sum of
Liste des statuts juridiques: List of legal statutes
+Mensuel: Monthly
Mes réponses: My answers
Modifier: Modify
Modifier mes réponses: Change my answers
@@ -106,8 +112,8 @@ Non: No
Nous n'avons rien trouvé: We didn't find any matching registered company.
Oui: Yes
Outils pour les développeurs: Tools for developers
+PFU (<1>"flat tax"1>): Flat tax
Pages associées: Related pages
-Par profession: By job
Par statut: By status
Part du salaire net maintenue: Share of net salary maintained
Part employeur: Employer share
@@ -116,18 +122,24 @@ Part salarié: Employee share
Pas en auto-entrepreneur: Not in auto-entrepreneur
Pas implémenté: Not implemented
Passer: Skip
-Personnalisez l'integration: Customize the integration
+Personnalisez l'intégration: Customize the integration
"Perte de revenu net :": "Loss of net income :"
Plafonds des tranches: Wafer ceilings
Plein écran: Fullscreen
Plus d'informations: More information (fr)
Plusieurs associés: Several partners
+"Pour en savoir plus, rendez-vous sur le site <2>aquoiserventlescotisations":
+ urssaf:
+ fr2>: To find out more, visit <2>aquoiserventlescotisations.urssaf.fr2>
Prise en charge du revenu net avec chômage partiel: Net income support with short-time working
Prochaines questions: Next questions
Professionnels de santé: Health Care Professionals
+Professions: Professions
+Professions libérales: By job
Protection sociale: Social security
Précédent: Previous
Prévisualisation: Preview
+Que cherchez-vous ?: What are you looking for?
Quel module ?: What module?
Quelle couleur ?: What color?
Quelques exemples de salaires: Some salary exemples
@@ -146,8 +158,11 @@ Retour à mon activité: Back to my business
Revenir à la documentation: Go back to documentation
Revenu (incluant les dépenses liées à l'activité): Revenue (including expenses related to the activity)
Revenu disponible: Disposable income
+Revenu du dirigeant par statut: Executive income by status
"Revenu net avec chômage partiel :": "Net income with short-time work :"
Revenu net mensuel: Monthly net income
+Revenus étranger: Foreign income
+Règles de calculs: Rules
Réductions: Discounts
Rémunération du dirigeant: Director's remuneration
Répartition du chiffre d'affaires: Breakdown of turnover
@@ -163,6 +178,7 @@ Salariés et employeurs: Employees and employers
Sans responsabilité limitée: Without limited liability
Si: If
Simulateur de salaire: Employee salary simulation
+Simulateurs: Simulations
Simulations personnalisées: Customized simulations
Sinon: Else
Situation personnelle: Personal situation
@@ -175,10 +191,12 @@ Total des retenues: Total withheld
Tout effacer: Delete all
Tout le site: The whole site
Tranche de l'assiette: Scale bracket
+Travailleurs Non Salariés (TNS): Non-salaried workers (TNS)
Un seul associé: Only one partner
Une idée ?<1>1>Contactez-nous !: Any ideas?<1>1>Contact us!
"Versement : ": "Payment : "
Vie privée: Privacy
+Voir la fiche Urssaf: See the Urssaf sheet
Voir la fiche de paie: See the pay slip
Voir la répartition des cotisations: View contribution breakdown
Voir le code source: See the source code
@@ -190,29 +208,25 @@ Votre forme juridique: Your legal status
Vous êtes dirigeant d'une SAS(U) ? <2>Accéder au simulateur de revenu dédié2>: Are you a SAS(U) manager? <2>Access the dedicated income simulator2>
aide: aid or subsidy
aide-déclaration-indépendant:
- description: <0>Help with your 2019 income tax return0><1>This tool is a tax
- (income) and social security<1> (ISD1>) declaration aid for self-employed
- workers. It enables you to find out the amount of social security charges
- deductible from your net tax result.1><2>You remain fully responsible for
- any omissions or inaccuracies in your statements.2><3><0><0>This tool
- concerns you if you are in any of the following cases :0><1><0>you
- contribute to the general scheme for self-employed persons0><1>your
- company is in the actual tax system and in accrual accounting1>1><2>It
- does not concern you if you are in one of the following cases:2><3><0>you
- are self-employed under a pension scheme for the liberal
- professions0><1>you are managers of companies subject to corporate income
- tax1><2>you have opted for the micro-fiscal regime2><3>your company is
- domiciled in the DOM (French Overseas Departments and
- Territories)3>3>0>3><4>What is your tax result in
- 2019?<1>1><2>Social security charges and tax exemptions not
- included<2>2>2> 4><5>The tax result corresponds to income less
- expenses. It can be positive (profit) or negative (deficit).5>
+ banner: Find out more about our tax<1>return1>tool
+ description: <0><0>This tool is an aid for the declaration of income for
+ <2>self-employed workers2>. It allows you to know the amount of deductible
+ social charges.0><1>You remain entirely responsible for any omissions or
+ inaccuracies in your declaration.1>0><1><0>This tool concerns you if you
+ are in the following situation:0><1><0>you contribute to the general
+ scheme for self-employed workers0>1><2>It does not concern you if you
+ are in one of the following cases:2><3><0>you carry out a liberal activity
+ covered by a pension scheme for the liberal professions in accrual
+ accounting0><1>your company is domiciled in the
+ DOM1>3>1><2>2><3>Taxation3><4>These few questions help determine
+ the type of declaration to be completed, as well as the methods of
+ calculating social security contributions.4>
entreprise:
description: You can fill in your company to pre-fill in the form
titre: <0>Company and activity0>
results:
ongoing: Calculation in progress...
- title: Reporting help 📄
+ title: Your tax returns
an: year
année: year
applicable si: applicable if
@@ -446,6 +460,12 @@ créer:
titre: Create a company
warningPL: "Note: the case of regulated liberal professions is not covered"
d'aides: of aid
+dividendes:
+ warning: <0>This simulation is only given as an indication. It only concerns
+ French companies subject to corporation tax (IS), and does not concern
+ managers affiliated to the self-employed workers' regime.0><1>The amount
+ of tax on dividends is calculated in addition to the tax on other taxable
+ income. 1>
domiciliation inconnue: unknown address
domiciliée à: domiciled in
déductible: deductible
@@ -651,6 +671,7 @@ entreprise:
titre: Write the company's articles
titre: The to-do list for creating your business
titre2: Recommended before starting your activity
+est un SIREN non diffusable: is a non-distributable SIREN
examples: Examples
expected: the expected result was
facteur: multiplier
@@ -756,6 +777,12 @@ gérer:
<0>Discover the hiring process0>
<1>The list of things to do to make sure you don't forget anything when hiring a new employee1>
+ kbis: <0>How do I get a Kbis?0><1>The Kbis is a record that proves the
+ existence of a commercial company. You can get the Kbis for your company
+ using monidenum.fr1>
+ kbis-autoentrepreneur: <0>How do I get a Kbis?0><1>Auto-entrepreneurs do not
+ have a Kbis. They can however retrieve and present a K extract. See the
+ service-public website for more information.1>
sécuritéSociale: <0>Understanding social security0> <1>What are social
security contributions used for? Update on the social protection system
enjoyed by all workers in France1>
@@ -774,13 +801,13 @@ indicationTempsPlein: in full-time gross salary equivalent
inférieurs à: lower than
jour: day
landing:
- aboutUs: "<0>Who are we?0><1>We are a small <2>, autonomous and
- multidisciplinary<0>team0>2> within<5>URSSAF5>. We have at heart to be
- close to your needs in order to constantly improve this site in accordance
- with the <8>beta.gouv.fr8> approach.1><2>We have developed this site to
- <2>support entrepreneurs2> in the development of their business.2><3>Our
- objective is to <2>remove all uncertainties regarding the administration2>
- so that you can concentrate on what matters: your business.3>"
+ aboutUs: "<0>Who are we?0><1>We are a small, independent, multidisciplinary
+ <2>team2> within the <5>Urssaf5>. We are committed to being close to
+ your needs in order to constantly improve this site in accordance with the
+ <8>beta.gouv.fr8> approach.1><2>We have developed this site to <2>assist
+ entrepreneurs2> in the development of their business.2><3>Our objective
+ is to <2>remove all administrative uncertainties2> so that you can focus
+ on what really matters: your business.3>"
choice:
create: <0>Create a company0><1>Assistance in choosing the status and the
complete list of creation steps1>
@@ -802,10 +829,6 @@ legalNotice:
0>
title: Contact
editeur:
- content: >
- Incubator of digital services,<1>1> Direction interministérielle du
- numérique et du système d'information et de communication de l'Etat
- (DINSIC),<3>3> Services of the Prime Minister
title: Publisher
hosting:
content: >
@@ -831,6 +854,9 @@ newsletter:
Subscribe to our monthly newsletter to receive <2>official advice on
starting a business2> and access new features in advance.
titre: Stay informed
+nextSteps:
+ integration-iframe: <0><0>0> Integrate the web module0><1>Add this simulator
+ to your website in one click with a simple script.1>
non: no
non applicable si: not applicable if
non déductible: not deductible
@@ -897,53 +923,50 @@ pages:
scheme (in french).1>0>
dévelopeurs:
bibliothèque: "<0>Integrate our calculation library0><1>If you think that your
- site or service would benefit from displaying salary calculations, for
- example switching from gross salary to net salary, good news: all the
- contribution and tax calculations behind my-company.fr are free and easily
+ website or service would benefit from displaying salary calculations, for
+ example to switch from gross salary to net salary, good news: all the tax
+ and contribution calculations behind mon-entreprise.fr are free and easily
reusable thanks to the <2>NPM publicodes library2>.1><2>How to use
this library?2><3>All our calculation rules are written in `publicodes`,
- a declarative language developed by beta.gouv.fr and Urssaf to encode
+ a declarative language developed by beta.gouv.fr and the Urssaf to encode
algorithms of public interest. <2>Learn more about publicodes2>3><4>To
- perform your own calculations, you need to install the publicodes
+ perform your own calculations, you must install the publicodes
interpreter, download the rules used on my-company, call the evaluation
function.4><5>Installation5><6><0>npm install --save publicodes
- social-system0>6><7><0>0> The following dependencies are also needed
- for now, but will be made optional in a future version of the publicodes
- package.7><8><0>npm install --save react react-router-dom
- react-router-hash-link0>8><9>For more details on the installation,
- please refer to the <2>dedicated documentation2>.9><10>Start the
- calculation10><11>All you have to do is set up the engine with the rules
- in the `social-system' package, and call the `evaluate' function on the
- rule you want the value of. Here is an example for the gross / net
- calculation11><12><0>0>12><13>Setting up the calculation13><14>As
- you will have seen in the previous example, the recipe for a calculation
- is simple: input variables (gross salary), one or more output variables
- (net salary).14><15>However, the calculation can be parameterized with
- all the possibilities allowed in the legislation.15><16>All these
- variables are listed and explained in the <2>online documentation2>.
- This documentation is auto-generated from the publicodes rule files, so it
- is constantly updated.16><17>Let's run a calculation closer to a
- payslip: here is a description of the input situation annotated with links
- to the corresponding pages of the documentation :17><18><0> An
- <3>executive3> earning <7>3,400€ gross7>, who benefits from
- <11>restaurant vouchers11> and works in a company with <15>22
- employees15>.0>18><19>Here is the calculation for this more complete
- example:19><20><0>0>20><21><0>0>Note that in the previous example
- we have to specify the transport payment rate ourselves.21><22>Whereas
- in the <2>employee2> simulator, you only have to fill in the
+ modele-social0>6><7>For more details on the installation, please refer
+ to the <2>dedicated documentation2>7><8>Launch the
+ calculation8><9>All you have to do is set up the engine with the rules
+ from the `social-modele` package and call the `evaluate` function on the
+ rule you want the value of. Here is an example for the gross/net
+ calculation9><10><0>0>10><11>Setting up the calculation11><12>As
+ you can see in the previous example, the recipe for a calculation is
+ simple: input variables (gross salary), one or more output variables (net
+ salary).12><13>The calculation is however configurable with all the
+ possibilities allowed in the legislation.13><14>All these variables are
+ listed and explained in the <2>online documentation2>. This
+ documentation is auto-generated from the publicode rules files, so it is
+ constantly updated.14><15>Let's run a calculation closer to a pay slip:
+ here is a description of the input situation with links to the
+ corresponding pages in the documentation:15><16><0> An <3>executive3>
+ earning <7>€3,400 gross7>, who receives <11>meal vouchers11> and works
+ in a company with <15>22 employees15>.0>16><17>Here is what the
+ calculation looks like for this more complete
+ example:17><18><0>0>18><19><0>0>Note that in the previous example
+ we have to specify the rate of transport payment ourselves.19><20>In the
+ <2>employee2> simulator, however, you only have to enter the
municipality and the corresponding rate is automatically determined. This
- is intentional: to keep the library (and the site) light, we use two
- online APIs. The<4>Geo - communes API4> to switch from the commune name
- to the commune code. Then the<7>Transport Pay API7>, developed and
+ is deliberate: to keep the library (and the site) light, we use two online
+ APIs. The<4>Geo - communes API4> to go from the commune name to the
+ commune code. Then the<7>Transport Payment API7>, developed and
maintained by us, which is not documented but its use is very simple and
- understandable <10>in this React component that calls it10>, a component
- that also uses the common API.22><23>Making economic graphics{emoji('
- 📈')}23><24>It is also possible to use the library for economic or
- political analysis calculations. Here, labour prices and net wages are
- plotted against gross wages.24><25>One can see the progressiveness of
- the total wage, which is in percent lower for a minimum wage than for a
- high income. In other words, high earners pay part of the social security
- contributions of low earners.25><26><0>0>26>"
+ understandable <10>in this React component that calls it10>, component
+ that also calls the common API.20><21>Making economic graphs
+ <1>1>21><22>It is also possible to use the library for economic or
+ political analysis calculations. Here, we plot the price of labor and the
+ net salary as a function of the gross.22><23>We can see the
+ progressivity of the total wage, which is in percent lower for a minimum
+ wage than for a high income. In other words, high earners pay part of the
+ social contributions of low earners.23><24><0>0>24>"
développeurs:
choice:
github: <0>Contribute to GitHub0><1>All our tools are open and publicly
@@ -951,7 +974,7 @@ pages:
library: <0>Using the calculation engine0><1>The entire socio-fiscal
calculation engine developed by Urssaf, freely available in the form of
an NPM library.1>
- publicode: <0>Publicodes0><1>Our tools are powered by Publicodes, a new
+ publicodes: <0>Publicodes0><1>Our tools are powered by Publicodes, a new
language for encoding "explainable" algorithms.1>
code:
description: "Here is the code to copy and paste on your site:"
@@ -969,12 +992,20 @@ pages:
source tools to be integrated seemlessly in the usual journey of your
users.
titre: Integrate social security law at the heart of your tools
- iframe: <0>Integrate the Web module0><1>Our simulators can be seamlessly
- integrated by adding a simple line of code to your web page.1><2>You can
- choose the simulator to integrate and <2>customize the main color of the
- module2> to blend it into the visual theme of your page.2><3>The
- attribute <1>data-lang="en"1> allows you to choose English as the
- simulator language.3>
+ iframe:
+ csp-1: <0>Iframe integration and content security policy0><1>The error below
+ that is displayed in the console is related to the communication between
+ the parent page and the iframe for automatic resizing to the displayed
+ content.1>
+ csp-2: "You can correct it with the following policy:"
+ intro: <0><0>Integrate the web module0><1>Our simulators can be integrated
+ seamlessly by adding a simple line of code to your web page.1><2>You
+ can choose the simulator to integrate and <2>customize the main color of
+ the module2> to fit the visual theme of your page.2><3>The
+ <1>data-lang="en"1> attribute allows you to choose English as the
+ simulator language.3>0><1>1><2>Note that if your site uses a
+ content security policy via the HTTP <1>Content-Security-Policy1>
+ response header, a benign error may appear in the console.<3>3>2>
module: What module?
gérer:
aide-déclaration-indépendant:
@@ -991,6 +1022,41 @@ pages:
title: "Self-employed: demand for mobility in Europe"
shortname: Demand for mobility in Europe
simulateurs:
+ EI:
+ meta:
+ description: Calculation of income from turnover, after deduction of
+ contributions and taxes
+ ogDescription: "Thanks to the auto-entrepreneur income simulator developed by
+ Urssaf, you can estimate your income based on your monthly or annual
+ turnover to better manage your cash flow. Or the other way round: find
+ out how much to charge to achieve a certain income."
+ ogTitle: "Sole proprietorship: quickly calculate your net income from your
+ turnover and vice versa"
+ titre: "Sole proprietorship (EI): income simulator"
+ seo explanation: <0>How to calculate the net income of a sole trader?0><1>A
+ sole trader must pay social security contributions to the authorities.
+ These contributions are used to finance social security, and open up
+ rights, particularly for retirement and health insurance. They are also
+ used to finance professional training.1><2><0>0> <2>See the details
+ of the calculation of contributions2>2><3>Do not forget to deduct
+ all expenses incurred in the course of the business (equipment, raw
+ materials, premises, transport). These are deductible from the company's
+ income, which means that you will not pay tax or contributions on their
+ amount (unless you have opted for the micro-tax option).3><4>The
+ complete calculation formula is therefore :<1><0>Net income = Turnover -
+ Professional expenses - Social contributions0>1>4><5>How do you
+ calculate the social security contributions of a sole
+ proprietorship?5><6>The manager of a sole proprietorship pays social
+ security contributions, proportional to the company's <2>2>. Their
+ amount varies according to the type of activity (liberal profession,
+ craftsman, shopkeeper, etc.), or any exemptions granted (ACRE, ZFU, RSA,
+ etc.). To find out the amount, you can use this simulator, and refine
+ the6><7> As a company's result is only known at the end of the
+ accounting year, the manager pays provisional contributions which will
+ then be adjusted once the real income has been declared, the following
+ year.7>
+ shortname: Sole proprietorship
+ title: Income simulator for sole proprietorship (EI)
accueil:
header: All the simulators on this site are kept up to date with the latest
legislative developments.
@@ -1003,6 +1069,8 @@ pages:
emploi franc: For the hiring of a young person from a priority district of the
city (QPV). The aid can be up to €17,000 over three years.<1>1>The
aid is paid every <3>6 months3> by Pôle Emploi.
+ handicapé: For the recruitment of a disabled worker.<1>1>The aid is paid
+ <3>quarterly3> by the Agence de services et de paiement (ASP).
jeune: For the hiring of a young person under the age of 26 on a permanent
contract or for a fixed-term contract of at least 3 months.<1>1>The
aid is paid <3>quarterly3> by the Services and Payment Agency (ASP).
@@ -1020,6 +1088,8 @@ pages:
message fin: You can now simulate the exact cost of hiring by selecting an
eligible grant.
meta:
+ description: Find out about the main forms of aid for hiring and estimate their
+ amount by answering a few questions.
title: Hiring incentives
outro: <0>Learn more about incentives0><1>As part of the "Plan Relance" plan,
the government is putting in place a series of measures to encourage new
@@ -1086,6 +1156,9 @@ pages:
avocat:
shortname: Lawyer
title: Income simulator for private lawyers
+ cartes:
+ intégrer module web: <0>Integrate the web module0><1>Add this simulator to
+ your website in one click1>
chirurgien-dentiste:
shortname: Dental surgeon
title: Income simulator for a private dental surgeon
@@ -1191,18 +1264,110 @@ pages:
this, simply enter the announced compensation in the total loaded box.
The simulation can then be refined by answering the various
questions.4>"
+ dividendes:
+ meta:
+ description: Calculate the amount of tax and contributions on dividends paid by
+ your company.
+ title: Dividends
+ seo: <0>Dividends and distributions0><1>At the end of a company's financial
+ year, the result of the previous year can be kept in reserve (for future
+ investments) or paid out as dividends. From the point of view of the
+ beneficiaries, this is income from movable capital, subject to specific
+ contributions and taxation.1><2>This simulator only takes into account
+ the case of the natural person beneficiary and the dividends decided by
+ the company.2><3>How are the levies on dividends
+ calculated?3><4>Dividends may be subject to a single flat-rate
+ withholding tax of 30% including tax and social security contributions
+ (also known as<1> flat tax1>). Optionally, the tax scale can be
+ chosen. This simulator can be used to compare the two systems.4><5>An
+ advance payment of the amount of tax (12.8%) is deducted at the time of
+ payment of the dividends, unless the beneficiary meets <2>certain
+ criteria2>.5><6>Particular case of the manager under the
+ self-employed worker regime6><7> Under the self-employed worker's
+ regime, the portion of dividends exceeding 10% of the share capital will
+ be subject to contributions and levies in the same way as the manager's
+ income.7><8>This case is not yet taken into account by this
+ simulator.8>
+ title: Dividend Payment Simulator
+ ei:
+ meta:
+ description: Calculation of income from turnover, after deduction of
+ contributions and taxes
+ ogDescription: "Thanks to the income simulator for sole proprietorships
+ developed by Urssaf, you can estimate your income based on your
+ monthly or annual turnover to better manage your cash flow. Or the
+ other way round: find out how much to charge to achieve a certain
+ income."
+ ogTitle: "Sole proprietorship: quickly calculate your net income from your
+ turnover and vice versa"
+ titre: "Sole proprietorship (EI): income simulator"
+ seo explanation: <0>How to calculate the net income of a sole trader?0><1>A
+ sole trader must pay social security contributions to the authorities.
+ These contributions are used to finance social security, and open up
+ rights, particularly for retirement and health insurance. They are also
+ used to finance professional training.1><2><0>0> <2>See the details
+ of the calculation of contributions2>2><3>Do not forget to deduct
+ all expenses incurred in the course of the business (equipment, raw
+ materials, premises, transport). These are deductible from the company's
+ income, which means that you will not pay tax or contributions on their
+ amount (unless you have opted for the micro-tax option).3><4>The
+ complete calculation formula is therefore :<1><0>Net income = Turnover -
+ Professional expenses - Social contributions0>1>4><5>How do you
+ calculate the social security contributions of a sole
+ proprietorship?5><6>The manager of a sole proprietorship pays social
+ security contributions in proportion to the company's <2>taxable
+ income2>. Their amount also varies according to the type of activity
+ (liberal profession, craftsman, tradesman, etc.), or any exemptions
+ granted (ACRE, ZFU, RSA, etc.).6><7> As a company's result is only
+ known at the end of the accounting period, the manager pays provisional
+ contributions which will then be adjusted once the actual income has
+ been declared, the following year.7><8>This simulator allows you to
+ calculate the exact amount of social security contributions based on a
+ desired turnover or net income. You can specify your situation by
+ answering the questions displayed below the simulation.8>
+ shortname: EI
+ title: Simulator for sole proprietorship (EI)
+ eirl:
+ meta:
+ description: Calculation of income from turnover, after deduction of
+ contributions and taxes
+ ogDescription: "Thanks to the income simulator for EIRL developed by Urssaf, you
+ can estimate the amount of your income based on your monthly or annual
+ turnover to better manage your cash flow. Or in the opposite
+ direction: know how much to charge to reach a certain income."
+ ogTitle: "EIRL manager: quickly calculate your net income from your turnover and
+ vice versa"
+ titre: "EIRL : income simulator for managers"
+ shortname: EIRL
+ title: EIRL Simulator
+ eurl:
+ meta:
+ description: Calculation of the net salary from the total allocated to
+ remuneration and vice versa
+ ogDescription: As an employee-equivalent manager, you can immediately calculate
+ your net income after tax from the total allocated to your
+ remuneration.
+ ogTitle: "EURL manager's remuneration: a simulator to find out your net salary"
+ titre: "EURL : income simulator for managers"
expert-comptable:
shortname: Chartered Accountant
title: Income simulator for chartered accountant and auditor in private practice
indépendant:
+ cotisations-forfaitaires: "Amount of lump sum contributions : "
meta:
description: Calculation of net income after tax and contributions based on
turnover and vice versa
- title: "Independent: Urssaf income simulator"
+ title: "Self-employed: income simulator"
+ retraite-droits-acquis: "<0>Retirement: rights acquired in 20210><1><0>Basic
+ pension : <2><0><0>0> vested quarters0>2>0><1>Supplementary
+ pension : <2><0>This simulator does not manage the acquired rights of
+ supplementary pension for the liberal
+ professions0>2><3><0><0><0>0> points acquired0>0>3>1>1>"
shortname: Independent
title: Income simulator for the self-employed
is:
meta:
+ description: Calculate your corporate tax
title: Corporate Tax Simulator
seo: <0>How is corporate tax calculated?0><1>Corporate income tax applies to
the profits made by corporations (SA, SAS, SASU, SARL, etc.) and on an
@@ -1233,6 +1398,11 @@ pages:
title: PAMC diet simulators
shortname: PAMC
title: "PAMC: contribution and income simulators"
+ print-info:
+ date: This simulation was performed on
+ recover: You can find this simulation and other tools to help you create and
+ manage your business on <2>mon-entreprise.fr2>.
+ title: Would you like to recover this simulation?
profession-libérale:
meta:
description: Net Income Calculation for Self-Employed Persons in Liberal Income
@@ -1244,6 +1414,9 @@ pages:
shortname: Midwife
title: Income simulator for private midwives
salarié:
+ alt-image1: Net salary (received by the employee) = Gross salary (written in the
+ employment contract) - employee contributions (pension, social security,
+ etc.)
explication seo: <0>Calculate your net salary0><1>During the job interview,
the employer usually offers a "gross" remuneration. The announced amount
thus includes employee contributions, which are used to finance the
@@ -1315,7 +1488,7 @@ pages:
ogDescription: As an officer in a similar position, immediately calculate your
net income after tax from the total allocated to your compensation.
ogTitle: "SASU executive compensation: a simulator to find out your net salary"
- titre: "Head of SASU: Urssaf revenue simulator"
+ titre: "SASU : income simulator for managers"
seo-explanation: "<0>How to calculate the salary of a SASU executive? 0><1>As
for a classic employee, the SASU <2>manager2> pays social security
contributions on the remuneration he pays himself. The contributions are
@@ -1332,8 +1505,8 @@ pages:
remuneration. To do this, simply enter the total amount allocated in the
\"total charged\" box. The simulation can then be refined by answering
the various questions.4>"
- shortname: Head of SASU
- title: Income simulator for SASU manager
+ shortname: EURL
+ title: EURL Simulator
titre: Revenue simulator for SAS(U) executive
économie-collaborative:
meta:
@@ -1429,7 +1602,7 @@ selectionRégime:
urssaf: The figures are indicative and do not replace the actual accounts of the
Urssaf, impots.gouv.fr, etc
shareSimulation:
- banner: "To share this simulation: <2>Generate a dedicated link2>"
+ banner: <0>Generate a share link0>
button:
copied: Copied
copy: Copy the link
@@ -1442,25 +1615,17 @@ simulateurs:
explanation:
CNAPL: It recovers contributions related to your retirement and disability/death
plan.
- aides covid:
- deduction: <0>Deduction of turnover0><1>The terms and conditions of the
- "covid" discount are presented on the Urssaf
- website.1><2><0>{emoji('▶')}0> More information2>
- portail: <0>Government assistance0><1>The Ministry of the Economy offers a
- portal listing business support measures.1><2><0>{emoji('▶')}0>
- Support measures2>
- reduction: <0>Contribution reduction0><1>You can benefit from a reduction in
- your final contributions for the year 2020.1><2><0>0>2>
- soutien: <0>Listening and support0><1>An <2>initial listening and
- psychological support unit2> has been set up for company directors
- weakened by the crisis.1><2><0>{emoji('📞')}0> 08 05 65 50 502>
- pamc: <0><0>Your partner institutions0><1><0><0><0>0>0><1>Contributions
- collected by Urssaf, which are used to finance social security (health
- insurance, family allowances, dependency
- care).1><2><0>0>2>0><1>1><2><0><0><0>0>0><1>As a contracted
- health professional, you benefit from having part of your contributions
- covered by the Assurance Maladie.1><2><0>0>
- <2>2>2>0>2>1>0>
+ institutions:
+ cpam: As a health professional under agreement, you benefit from a part of your
+ contributions being covered by the Health Insurance.
+ dgfip: The Direction générale des finances publiques (DGFiP) is the body that
+ collects income tax. <2>The amount calculated <2>takes into account the
+ abatement of the micro-tax system2>.2>
+ notice acre: The amounts indicated above are calculated without taking into
+ account the ACRE start-up exemption
+ titre: Your partner institutions
+ urssaf: The contributions collected by the Urssaf, which are used to finance
+ social security (health insurance, family allowances, dependence).
inversionFail: >-
The amount entered results in an impossible result. This is due to a
threshold effect in the calculation of contributions.
@@ -1553,12 +1718,12 @@ une de ces conditions: one of these applies
à: to
économieCollaborative:
accueil:
- contenu: <0> You have revenues from online platforms (Airbnb, Abritel, Drivy,
- Blablacar, Leboncoin, etc.)? You must report them in most cases. However,
- it can be difficult to find your way around.0> <1>Follow this guide to
- find out in a few clicks how to be in good standing.1> <2>From 2020
- onwards, these revenues will be automatically reported by the platforms to
- the tax authorities and Urssaf.2>
+ contenu: <0>Do you have income from <2>online platforms2> (Airbnb, Abritel,
+ Drivy, Blablacar, Leboncoin, etc.)? You must declare them in most cases.
+ However, it can be difficult to find your way around
+ <5><0>0>5>.0><1>Follow this guide to find out in a few clicks how to
+ be in order.1><2>From 2020, these revenues will be automatically
+ communicated by the platforms to the tax authorities and the Urssaf.2>
question: What types of activity did you undertake?
réassurance: "PS: this tool is only there to inform you, no data will be
transmitted to the administrations"
diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml
new file mode 100644
index 000000000..5fdbef674
--- /dev/null
+++ b/mon-entreprise/source/locales/ui-fr.yaml
@@ -0,0 +1,1353 @@
+"404":
+ action: Revenir en lieu sûr
+ message: Cette page n'existe pas ou n'existe plus
+"<0>0> Pour en savoir plus, rendez-vous sur le site <3>aquoiserventlescotisations":
+ urssaf:
+ fr3>: <0>0> Pour en savoir plus, rendez-vous sur le site
+ <3>aquoiserventlescotisations.urssaf.fr3>
+<0>Oui0>: <0>Oui0>
+Assimilé salarié: Assimilé salarié
+Aucun résultat: Aucun résultat
+Auto-entrepreneur: Auto-entrepreneur
+Auto-entrepreneur en EIRL: Auto-entrepreneur en EIRL
+Autres outils: Autres outils
+Cette commune n'existe pas: Cette commune n'existe pas
+Chercher dans la documentation: Chercher dans la documentation
+Commencer: Commencer
+Continuer: Continuer
+Cotisations sociales: Cotisations sociales
+Crée le: Crée le
+Créer une: Créer une
+Devenir: Devenir
+Découvrir: Découvrir
+En savoir plus: En savoir plus
+Entreprise Individuelle: Entreprise Individuelle
+Exonérations: Exonérations
+Explorez notre documentation: Explorez notre documentation
+ExportSimulation:
+ Banner: <0>Imprimer ou sauvegarder en PDF0>
+Fiche de paie: Fiche de paie
+Gestion des données personnelles: Gestion des données personnelles
+Gérant majoritaire: Gérant majoritaire
+Gérant minoritaire: Gérant minoritaire
+Gérant minoritaire ou égalitaire: Gérant minoritaire ou égalitaire
+Impôt au barème: Impôt au barème
+Indépendant: Indépendant
+Indépendants et dirigeants: Indépendants et dirigeants
+International: International
+Intégrer nos simulateurs: Intégrer nos simulateurs
+J'ai compris: J'ai compris
+Jusqu’au: Jusqu’au
+Liste des statuts juridiques: Liste des statuts juridiques
+Mes réponses: Mes réponses
+Modifier: Modifier
+Montant de l'impôt sur les sociétés: Montant de l'impôt sur les sociétés
+"Nom de l'entreprise ou SIREN ": "Nom de l'entreprise ou SIREN "
+Non: Non
+Oui: Oui
+Outils pour les développeurs: Outils pour les développeurs
+PFU (<1>"flat tax"1>): PFU (<1>"flat tax"1>)
+Part employeur: Part employeur
+Part salarié: Part salarié
+Pas en auto-entrepreneur: Pas en auto-entrepreneur
+Passer: Passer
+Personnalisez l'intégration: Personnalisez l'intégration
+Plus d'informations: Plus d'informations
+Plusieurs associés: Plusieurs associés
+"Pour en savoir plus, rendez-vous sur le site <2>aquoiserventlescotisations":
+ urssaf:
+ fr2>: Pour en savoir plus, rendez-vous sur le site
+ <2>aquoiserventlescotisations.urssaf.fr2>
+Prochaines questions: Prochaines questions
+Professions libérales: Professions libérales
+Précédent: Précédent
+Prévisualisation: Prévisualisation
+Que cherchez-vous ?: Que cherchez-vous ?
+Quelques intégrations: Quelques intégrations
+Rechercher: Rechercher
+Ressources utiles: Ressources utiles
+Retour: Retour
+Retour à la création: Retour à la création
+Retour à mon activité: Retour à mon activité
+Revenu du dirigeant par statut: Revenu du dirigeant par statut
+Revenus étranger: Revenus étranger
+Règles de calculs: Règles de calculs
+Répartition du chiffre d'affaires: Répartition du chiffre d'affaires
+S'inscrire: S'inscrire
+Salaire: Salaire
+Salaire net: Salaire net
+Salariés et employeurs: Salariés et employeurs
+Simulateurs: Simulateurs
+Situation personnelle: Situation personnelle
+Suivant: Suivant
+Total des retenues: Total des retenues
+Tout effacer: Tout effacer
+Tout le site: Tout le site
+Travailleurs Non Salariés (TNS): Travailleurs Non Salariés (TNS)
+Un seul associé: Un seul associé
+Une idée ?<1>1>Contactez-nous !: Une idée ?<1>1>Contactez-nous !
+"Versement : ": "Versement : "
+Voir la fiche Urssaf: Voir la fiche Urssaf
+Voir la fiche de paie: Voir la fiche de paie
+Voir les autres simulateurs: Voir les autres simulateurs
+Voir mes paramètres: Voir mes paramètres
+Votre adresse e-mail: Votre adresse e-mail
+Votre forme juridique: Votre forme juridique
+Vous êtes dirigeant d'une SAS(U) ? <2>Accéder au simulateur de revenu dédié2>: Vous êtes dirigeant d'une SAS(U) ? <2>Accéder au simulateur de revenu dédié2>
+aide-déclaration-indépendant:
+ banner: Découvrez notre outil d'<1>aide à la déclaration des revenus1>
+ description: <0><0>Cet outil est une aide à la déclaration de revenus à
+ destination des <2>travailleurs indépendants2>. Il vous permet de
+ connaître le montant des charges sociales déductibles.0><1>Vous restez
+ entièrement responsable d'éventuelles omissions ou inexactitudes dans votre
+ déclaration.1>0><1><0>Cet outil vous concerne si vous êtes dans le cas
+ suivant :0><1><0>vous cotisez au régime général des travailleurs
+ indépendants0>1><2>Il ne vous concerne pas si vous êtes dans un des cas
+ suivants :2><3><0>vous exercez une activité libérale relevant d’un régime
+ de retraite des professions libérales en comptabilité
+ d'engagement0><1>votre entreprise est domiciliée dans les
+ DOM1>3>1><2>2><3>Imposition3><4>Ces quelques questions permettent
+ de déterminer le type de déclaration à remplir, ainsi que les modalités de
+ calcul des cotisations sociales.4>
+ entreprise:
+ description: "<0>Facultatif : 0>Vous pouvez renseigner votre entreprise pour
+ pré-remplir le formulaire"
+ titre: <0>Entreprise et activité0>
+ results:
+ title: Vos déclarations fiscales
+après:
+ ape:
+ description: Le code APE correspond au <1>secteur d'activité1> de votre
+ entreprise. Il classifie la branche principale de votre entreprise dans la
+ nomenclature nationale d'activités françaises « NAF » (<3>voir la
+ liste3>). <6>Il détermine aussi la convention collective applicable à
+ l'entreprise, et en partie le taux de la cotisation accidents du travail
+ et maladies professionnelles à payer.6><7>En cas de code APE erroné,
+ vous pouvez <2>demander une modification2> à l'INSEE.7>
+ titre: Le code APE
+ intro: "Une fois votre {{statutChoisi}} créée, vous recevez les informations
+ suivantes :"
+ kbis:
+ description:
+ "1": C'est le document officiel qui atteste de <2>l'existence légale d'une
+ entreprise commerciale2>. Le plus souvent, pour être valable par les
+ procédures administratives, il doit dater de moins de 3 mois. <5>Plus
+ d'infos.5>
+ "2": Ce document est généralement demandé lors de la candidature à un appel
+ d'offre public, de l'ouverture d'un compte bancaire, d'achats
+ d'équipement professionnel auprès de fournisseurs, etc.
+ titre: Le Kbis
+ siret:
+ description: Le numéro SIREN <1>est l'identifiant de votre entreprise1> tandis
+ que le numéro SIRET identifie chaque établissement de la même entreprise.
+ Le SIRET commence par le SIREN, auquel on ajoute le numéro d'établissement
+ (NIC).
+ titre: Le numéro SIRET
+ titre: Après la création
+associés:
+ choix1: Seul
+ choix2: Plusieurs personnes
+ description: "<0>Une entreprise avec un seul associé est plus simple à créer et
+ gérer. Un associé peut-être une personne physique (un individu) ou une
+ personne morale (par exemple une société).0><1>Note : ce choix n'est pas
+ définitif. Vous pouvez tout à fait commencer votre société seul, et
+ accueillir de nouveaux associés au cours de votre développement.1>"
+ page:
+ description: Découvrez quels status choisir en fonction du nombre d'associés
+ participant à la création de l'entreprise.
+ titre: Nombre d'associés pour créer une entreprise
+ titre: Seul ou à plusieurs
+autoentrepreneur:
+ description: "<0>À la différence de l'entreprise individuelle,
+ l'auto-entrepreneur bénéficie d'un régime simplifié de déclaration et de
+ paiement : les cotisations sociales et l'impôt sur le revenu sont calculés
+ sur le chiffre d'affaires encaissé.0><1><0>Note0> : Certaines activités
+ sont exclues de ce statut (<2> voir la liste2>). Certaines activités sont
+ réglementées avec une qualification ou une expérience professionnelle
+ (<4>voir la liste4>).1>"
+ page:
+ description: Un auto-entrepreneur bénéficie d'un système simplifié de
+ déclaration et de paiement, pour lesquelles les impôts et cotisations
+ sociales sont basés sur le chiffre d'affaires réalisé chaque mois. C'est
+ un choix intéressant si vous n'avez pas besoin de beaucoup de capital et
+ que vous souhaitez démarrer rapidement.
+ titre: Auto-entrepreneur
+ titre: Entreprise individuelle ou auto-entrepreneur
+back: Reprendre la simulation
+comparaisonRégimes:
+ ACRE: <0>ACRE0><1>1 an <1>(automatique et inconditionnelle)1>1><2>Entre 3
+ et 4 trimestres <2>(sous conditions d'éligibilité)2>2>
+ AS:
+ tagline: Le régime tout compris
+ AT: <0>Couverture accidents du travail0>
+ assuranceMaladie: <0>Assurance maladie <2>(médicaments, soins,
+ hospitalisations)2>0><1>Identique pour tous1>
+ auto:
+ tagline: Pour commencer sans risques
+ choix:
+ AS: Assimilé salarié
+ EI: Entreprise individuelle
+ auto: Auto-entrepreneur
+ indep: Indépendant
+ comparaisonDétaillée: <0><0>Afficher plus d'informations0>0>
+ complémentaireDeductible: <0>Contrats prévoyance et retraite facultatives
+ déductibles0><1>Oui <1>(sous certaines conditions)1>1><2>Oui <1>(Loi
+ Madelin)1>2>
+ comptabilité: <0>Gestion comptable, sociale, juridique...0><1>Accompagnement
+ fortement conseillé<1>(expert comptable, comptable, centre de gestion
+ agrée...)1>1><2>Simplifiée <2>(peut être gérée par
+ l'auto-entrepreneur)2>2>
+ cotisationMinimale: <0>Paiement de cotisations minimales0>
+ cotisations: <0>Paiement des cotisations0><1>Mensuel1><2>Provision mensuelle
+ ou trimestrielle<1>(avec régularisation après coup en fonction du revenu
+ réel)1>2><3>Mensuel ou trimestriel3>
+ description: Lorsque vous créez votre société, le choix du statut juridique va
+ déterminer à quel régime social le dirigeant est affilié. Il en existe trois
+ différents, avec chacun ses avantages et inconvénients. Avec ce comparatif,
+ trouvez celui qui vous correspond le mieux.
+ déduction: <0>Déduction des charges0><1>Oui <1>(régime fiscal du
+ réel)1>1><2>Non<1>(mais abattement forfaitaire pour le calcul de l'impôt
+ sur le revenu)1>2>
+ indemnités: <0>Indemnités journalières <1>(en cas d'arrêt maladie)1>0>
+ indep:
+ tagline: La protection sociale à la carte
+ mutuelle: <0>Mutuelle santé<1>1>0><1>Obligatoire1><2>Fortement conseillée2>
+ plafondCA: <0>Plafond de chiffre
+ d'affaires0><1><0>Non0>1><2><0>Oui0><1>(72 600 € en services / 176
+ 200 € en vente de biens, restauration ou hébergement)1>2>
+ retraite: <0>Retraite0>
+ retraiteEstimation:
+ infobulles:
+ AS: Pension calculée pour 172 trimestres cotisés au régime général sans
+ variations de revenus.
+ auto: Pension calculée pour 172 trimestres cotisés en auto-entrepreneur sans
+ variations de revenus.
+ indep: Pension calculée à titre indicatif pour 172 trimestres cotisés au régime
+ des indépendants sans variations de revenus.
+ legend: <0>Pension de retraite0><1>(avant impôts)1>
+ revenuNetAvantImpot: <0>Revenu net de cotisations <1>(avant impôts)1>0>
+ seuil: <0>Revenu minimum pour l'ouverture des droits aux
+ prestations0><1>Oui1><2>Non <1>(cotisations minimales
+ obligatoires)1>2><3>Oui3>
+ simulationText: <0>Comparer mes revenus, pension de retraite et indemnité
+ maladie0><1>1><2>Lancer la simulation2>
+ status:
+ AS: SAS, SASU ou SARL avec gérant minoritaire
+ auto: Auto-entreprise
+ indep:
+ "1": EI, EIRL, EURL ou SARL avec gérant majoritaire
+ "2": EI ou EIRL
+ legend: Statuts juridiques possibles
+ titreSelection: "Créer mon entreprise en tant que :"
+ trimestreValidés: <0>Nombre de trimestres validés <1>(pour la retraite)1>0>
+créer:
+ cta:
+ continue: Continuer le guide
+ default: Trouver le bon statut
+ description: Avant d'entamer les démarches administratives pour créer votre
+ entreprise, vous devez choisir un statut juridique adapté à votre activité
+ ressources:
+ autoEntrepreneur: <0>Démarche auto-entrepreneur0><1>Vous souhaitez devenir
+ auto-entrepreneur ? Découvrez les étapes pour bien démarrer votre
+ activité1>
+ comparaison: <0>Comparateur de régimes0><1>Indépendant, assimilé-salarié ou
+ auto-entrepreneur ? Calculez les différences en terme de revenus,
+ cotisations, retraite, etc1>
+ listeStatuts: <0>Liste des statuts juridiques0><1>Vous savez déjà quel statut
+ choisir ? Accédez directement à la liste des démarches associées1>
+ titre: Créer une entreprise
+ warningPL: Le cas des professions libérales réglementées n'est pas encore traité
+d'aides: d'aides
+dividendes:
+ warning: <0>Cette simulation est uniquement donnée à titre indicatif. Elle ne
+ concerne que les sociétés françaises à l'impôt sur les sociétés (IS), et ne
+ concerne pas les dirigeants affiliés au régime des travailleurs
+ indépendants.0><1>Le montant de l'impôt sur les dividendes est calculé en
+ sus de l'impôt sur les autres revenus imposables. 1>
+domiciliation inconnue: domiciliation inconnue
+domiciliée à: domiciliée à
+embauche:
+ chaque mois: <0>Tous les mois0><1><0>Utiliser un logiciel de paie pour
+ calculer les cotisations sociales et les transmettre via la déclaration
+ sociale nominative (DSN).<1>1>Certaines offres de service de l’Urssaf
+ comme le <4>titre emploi service entreprise (Tese)4> ou le <8>chèque
+ emploi associatif (CEA)8> gèrent automatiquement la transmission de la DSN
+ pour vous.0><1>Remettre la fiche de paie à votre employé1>1>
+ tâches:
+ complémentaire santé:
+ description: Vous devez couvrir vos salariés avec l'assurance complémentaire
+ santé privée de votre choix (aussi appelée "mutuelle"), pour autant
+ qu'elle offre un ensemble de garanties minimales. L'employeur doit payer
+ au moins la moitié du forfait.
+ titre: Choisir une complémentaire santé
+ contrat:
+ titre: Signer un contrat de travail avec votre employé
+ description: Toutes les étapes nécessaires à l'embauche de votre premier employé.
+ dpae:
+ description: Ceci peut être fait par le biais du formulaire appelé DPAE, doit
+ être complété dans les 8 jours avant toute embauche, et peut <2>être
+ effectué en ligne2>.
+ titre: Déclarer l'embauche à l'administration sociale
+ logiciel de paie:
+ description: Les fiches de paie et les déclarations peuvent être traitées en
+ ligne gratuitement par le <2>Tese2>. Vous pouvez aussi utiliser un
+ <5>logiciel de paie privé.5>
+ titre: Choisir un logiciel de paie
+ medecine:
+ description: N'oubliez pas de planifier un rendez-vous initial pour chaque
+ nouvelle embauche. <2>Plus d'infos.2>
+ titre: S'inscrire à un bureau de médecine du travail
+ page:
+ description: Toutes les démarches nécessaires à l'embauche de votre premier salarié.
+ pension:
+ description: Trouver mon institution de prévoyance
+ titre: Prendre contact avec l'institution de prévoyance complémentaire
+ obligatoire qui vous est assignée
+ registre:
+ titre: Tenir un registre des employés à jour
+ titre: Les formalités pour embaucher
+en deux fois: en deux fois
+en incluant: en incluant
+en titres-restaurant: en titres-restaurant
+entreprise:
+ ressources:
+ après: <0>Après la création0><1>SIREN, SIRET, code APE, KBis. Un petit
+ glossaire des termes que vous pourrez (éventuellement) rencontrer après la
+ création.1>
+ simu:
+ assimilé: <0>Simulateur de rémunération pour dirigeant de SASU0><1>Simuler le
+ montant de vos cotisations sociales pour bien préparer votre business
+ plan.1>
+ autoEntrepreneur: <0>Simulateur de revenus auto-entrepreneur0><1>Simuler le
+ montant de vos cotisations sociales et de votre impôt et estimez votre
+ futur revenu net.1>
+ indépendant: <0>Simulateur de cotisations indépendant0><1>Simuler le montant
+ de vos cotisations sociales pour bien préparer votre business plan.1>
+ retour: ← Choisir un autre statut
+ tâches:
+ adresse:
+ description: <0><0>L'adresse0> est l'espace physique où votre entreprise sera
+ incorporée. Dans certains lieux et certaines situations, vous pouvez
+ bénéficier d'un financement public important (exonération de charges, de
+ taxes, etc.). <3>Plus d'infos3>0>
+ titre: Choisir une adresse pour le siège
+ affectation:
+ description: "<0>La <1>déclaration d'affectation du patrimoine1> permet de
+ séparer le patrimoine professionnel de votre patrimoine personnel, qui
+ devient alors insaisissable. Cette démarche est gratuite si elle est
+ effectué au moment de la création d'entreprise.0><1>Pour cela, il
+ suffit simplement de déclarer quelles biens sont affectés au patrimoine
+ de votre entreprise. Tous les apports nécessaires à votre activité
+ professionnelle doivent y figurer (par exemple : fond de commerce,
+ marque, brevet, ou encore matériel professionnel). Vous pouvez vous
+ charger vous-même de l'évaluation de la valeur du bien si celle ci ne
+ dépasse pas les 30 000 €.1><2><0>Plus d'informations0>2>"
+ titre: Effectuer une déclaration d'affectation de patrimoine
+ assurance:
+ description: <0>Une PME ou un travailleur indépendant doit se protéger contre
+ les principaux risques auxquels il est exposé et souscrire des contrats
+ de garantie. Qu'elle soit locataire ou propriétaire de ses murs,
+ l'entreprise doit assurer ses immeubles, son matériel professionnel, ses
+ biens, ses matières premières, ses véhicules, ainsi qu'en matière de
+ responsabilité civile de l'entreprise et de ses dirigeants ou en matière
+ de perte d'exploitation.0><1>Plus d'infos1>
+ titre: Juger de la nécessité de prendre une assurance
+ avancement: Utilisez cette liste pour suivre votre avancement dans les
+ démarches. Votre progression est automatiquement sauvegardée dans votre
+ navigateur.
+ banque:
+ description:
+ "1": Le but d'un <1>compte bancaire d'entreprise1> est de séparer les actifs
+ de l'entreprise des vôtres.
+ "2": "Le compte d'entreprise vous permet de :"
+ EI: "Si son ouverture n'est pas obligatoire pour un IE, elle reste fortement
+ recommandée. "
+ liste: <0>Différencier vos opérations privées et
+ professionnelles0><1>Faciliter les déclarations fiscales1>
+ titre: Ouvrir un compte bancaire
+ capital:
+ description: <0>Le <1>dépôt du capital social1> doit être fait au moment de la
+ constitution d'une société par une personne agissant au nom de la
+ société et ayant reçu des apports en numéraire (somme d'argent) de la
+ part des créanciers de la société (actionnaire ou associé).0><1>Le
+ dépôt consiste en un transfert d'une somme d'argent sur un compte bloqué
+ auprès d'une banque ou de la <2>Caisse des dépôts et consignations2>
+ ou d'un notaire, qui doit alors fournir un certificat de dépôt du
+ capital.1>
+ titre: Déposer le capital
+ comptable:
+ description: La gestion d'une entreprise impose un certain nombre
+ d'<1>obligations comptables1>. Il est conseillé de faire appel aux
+ services d'un comptable ou d'un logiciel de comptabilité en ligne.
+ titre: Choisir un comptable
+ formeJuridique:
+ titre: Choisir la forme juridique
+ formulaire:
+ description: <0>Vous pouvez faire votre inscription en ligne à tout moment,
+ l'enregistrer et y revenir comme vous le souhaitez.0><1><0>Faire la
+ démarche en ligne0>1>
+ titre: Créer mon entreprise en ligne
+ journal:
+ description: "<0>Vous devez publier la création de votre entreprise dans un
+ journal d'annonces légales (« JAL »), pour un coût de publication qui
+ dépend du volume de l'annonce et des tarifs pratiqués par le journal
+ choisi 0><1><0>Trouver un journal d'annonces légales
+ (JAL)0>1><2>Cette annonce doit contenir les informations suivantes :
+ 2><3><0>Le nom de l'entreprise et éventuellement son acronyme0><1>La
+ forme juridique1><2>Le capital de l'entreprise2><3>L'adresse du
+ siège3><4>L'objet social4><5>La durée de l'entreprise5><6>Les
+ noms, prénoms et adresses des dirigeants et des personnes ayant le
+ pouvoir d'engager la société envers les tiers6><7>Le lieu et le numéro
+ du RCS auprès duquel la société est immatriculée7>3>"
+ titre: Publier une annonce de création dans un journal
+ nom:
+ description: <0><0>La dénomination sociale0> est le nom de votre entreprise
+ aux yeux de la loi, écrit sur tous vos documents administratifs. Il peut
+ être différent de votre nom commercial.0><1>Il est conseillé de
+ vérifier que le nom est disponible, c'est-à-dire qu'il ne porte pas
+ atteinte à un nom déjà protégé par une marque, une raison sociale, un
+ nom commercial, un nom de domaine Internet, etc. Vous pouvez vérifier
+ dans la base de données <1>INPI1>.1>
+ titre: Trouver un nom d'entreprise
+ objetSocial:
+ description: L'<1>objet social1> est l'activité principale de l'entreprise.
+ Une activité secondaire peut être enregistrée.
+ titre: Déterminer l'objet social
+ statuts:
+ description: Il s'agit d'un document officiel qui intègre la forme juridique,
+ nomme les associés et leurs contributions au capital. <2>Dans le cas
+ d'une création d'entreprise avec plusieurs associés, il est recommandé
+ de faire appel à un juriste pour les rédiger. 2>
+ exemple: Exemple de statuts pour votre
+ titre: Écrire les statuts
+ titre: À faire pour créer votre entreprise
+ titre2: Recommandé avant le début de l'activité
+est un SIREN non diffusable: est un SIREN non diffusable
+feedback:
+ question: Êtes-vous satisfait de cette page ?
+ reportError: Faire une suggestion
+ simulator: Êtes-vous satisfait de ce simulateur ?
+ thanks: Merci de votre retour !
+footer:
+ accessibilité: "Accessibilité : non conforme"
+formeJuridique:
+ EI: Aucun apport en capital n'est nécessaire. Le capital privé et le capital de
+ l'entreprise ne font qu'un.
+ EIRL: Permet d'attribuer un capital spécifique à son activité professionnelle,
+ et de choisir le régime d'imposition sur les société (IS) plutôt que revenu
+ (IR) La société et l'individu constituent la même personne. Ne convient pas
+ si l'associé unique est une personne morale (entreprise) ou si vous pensez
+ accueillir d'autres associés au cours de votre développement (choisissez
+ EURL dans ce cas).
+ EURL: L'entreprise n'a qu'un associé. La responsabilité est limitée au montant
+ de l'apport de capital. Evolue en SARL lors de l'arrivée de nouveaux
+ associés dans la société.
+ SA: Société ayant au moins deux actionnaires. C'est le seul statut qui permet
+ d'être coté en bourse (à partir de 7 actionnaires). Le capital social
+ minimum est de 37.000 €.
+ SARL: Société ayant au moins deux associés dont la responsabilité financière est
+ limitée au montant de leur apport au capital. Le capital minimum est fixé
+ librement dans les statuts. Les associés se répartissent des parts sociales
+ toutes identiques, et la société est dirigée par un ou plusieurs gérants qui
+ sont forcément des personnes physiques. Le fonctionnement d'une SARL est
+ encadré par le code du commerce.
+ SAS: Société ayant au moins deux associés. La responsabilité financière des
+ associés est limitée au montant de leur apport au capital de la société. Le
+ capital minimum est fixé librement dans les statuts. Les associés se
+ répartissent des actions qui peuvent être de plusieurs catégories, et la
+ société est dirigée par un président qui peut être une personne morale (une
+ autre société). La SAS se caractérise par une grande souplesse de
+ fonctionnement (statuts sur mesure).
+ SASU: L'entreprise n'a qu'un associé. La responsabilité est limitée au montant
+ de l'apport de capital de l'unique associé (qui peut être une personne
+ morale).
+ SNC: La responsabilité des associés pour les dettes de la société est solidaire
+ (un seul associé peut être poursuivi pour la totalité de la dette) et
+ indéfinie (responsable sur la totalité de son patrimoine personnel).
+ micro: Un auto-entrepreneur exerce son activité en entreprise individuelle, avec
+ un régime forfaitaire pour ses cotisations sociales et un calcul spécifique
+ de l'impôt.
+ micro-EIRL: Un auto-entrepreneur option EIRL exerce son activité en entreprise
+ individuelle en choisissant l'option "Entrepreneur individuel à
+ responsabilité limitée", avec à un régime forfaitaire pour le calcul des
+ impôts et le paiement des cotisations de sécurité sociale.
+ titre: Choix du statut juridique
+gérant minoritaire:
+ description: "<0>Certaines règles spéciales s'appliquent selon le nombre
+ d'actions détenues.0><1><0><0>Gérant majoritaire0> : Vous êtes
+ l'administrateur majoritaire (ou faite partie d'un conseil d'administration
+ majoritaire).0><1><0>Gérant minoritaire0> : Vous êtes administrateur
+ minoritaire ou égalitaire (ou faites partie d'un conseil d'administration
+ minoritaire ou égalitaire).1>1>"
+ page:
+ description: Certaines règles particulières s'appliquent en fonction du nombre
+ d'actions détenues par l'administrateur, ce qui peut conduire à un statut
+ différent lors de la création de votre société
+ titre: Gérant majoritaire ou minoritaire
+ titre: Gérant majoritaire ou minoritaire
+gérer:
+ choix:
+ chomage-partiel: <0>Activité partielle0><1>Calculez le reste à payer après
+ remboursement de l'État lorsque vous activez le dispositif pour un
+ employé.1>
+ déclaration: <0>Remplir ma déclaration de revenus0><1>Calculez facilement les
+ montants des charges sociales à reporter dans votre déclaration de revenu
+ au titre de 20201>
+ embauche: <0>Estimer le montant d’une embauche0><1>Calculez le montant total
+ que votre entreprise devra dépenser pour rémunérer votre prochain
+ employé1>
+ is: <0>Estimer le montant de l’impôt sur les sociétés0><1>Calculez le montant
+ de l'impôt sur les sociétés à partir de votre bénéfice.1>
+ revenus: <0>Calculer mon revenu net de cotisations0><1>Estimez précisément le
+ montant de vos cotisations grâce au simulateur {{régime}} de l'Urssaf1>
+ cta: Renseigner mon entreprise
+ description: Vous souhaitez vous verser un revenu ou embaucher ? <1>1>Vous
+ aurez à payer des cotisations et des impôts. <3>3>Anticipez leurs montants
+ grâce aux simulateurs adaptés à votre situation.
+ entreprise:
+ auto: "Êtes-vous auto-entrepreneur ? "
+ changer: Changer l'entreprise sélectionnée
+ dirigeant: <0>Êtes-vous dirigeant majoritaire ?0><1>Si vous êtes
+ administrateur majoritaire ou si vous faites partie d'un conseil
+ d'administration majoritaire, vous n'aurez pas le même régime de sécurité
+ sociale que si vous êtes minoritaire.1>
+ majoritaire: Dirigeant majoritaire
+ minoritaire: Dirigeant minoritaire
+ ressources:
+ autoEntrepreneur: <0>Accéder au site officiel auto-entrepreneur0><1>Vous
+ pourrez effectuer votre déclaration de chiffre d'affaires, payer vos
+ cotisations, et plus largement trouver toutes les informations relatives
+ au statut d'auto-entrepreneur1>
+ embaucher: <0>Découvrir les démarches d’embauche 0><1>La liste des choses à
+ faire pour être sûr de ne rien oublier lors de l’embauche d’un nouveau
+ salarié1>
+ kbis: <0>Récupérer un extrait de Kbis0><1>Le Kbis est un document permettant
+ de justifier de l'enregistrement de l'entreprise au <2>RCS2> et de
+ prouver son existence légale. Ce document peut être récupéré gratuitement
+ pour votre entreprise via le site MonIdeNum.1>
+ kbis-autoentrepreneur: <0>Récupérer un extrait de Kbis?0><1>Les
+ auto-entrepreneurs n'ont pas de Kbis. Ils peuvent cependant récupérer et
+ présenter un extrait K. Voir le site du service-public pour plus
+ d'informations.1>
+ sécuritéSociale: <0>Comprendre la sécurité sociale 0><1>A quoi servent les
+ cotisations sociales ? Le point sur le système de protection sociale dont
+ bénéficient tous les travailleurs en France1>
+ titre: Gérer mon activité
+impotSociété:
+ exerciceDates: Exercice du <2>2> au <6>6>
+ warning: "Ce simulateur s’adresse aux <2>TPE2> : il prend en compte les taux
+ réduits de l’impôt sur les sociétés."
+inférieurs à: inférieurs à
+landing:
+ aboutUs: "<0>Qui sommes-nous ?0><1>Nous sommes une petite <2>équipe2>
+ autonome et pluridisciplinaire au sein de l’<5>Urssaf5>. Nous avons à cœur
+ d’être au près de vos besoins afin d’améliorer en permanence ce site
+ conformément à l'approche <8>beta.gouv.fr8>.1><2>Nous avons développé ce
+ site pour <2>accompagner les créateurs d’entreprise2> dans le
+ développement de leur activité.2><3>Notre objectif est de <2>lever toutes
+ les incertitudes vis à vis de l’administration2> afin que vous puissiez
+ vous concentrer sur ce qui compte : votre activité.3>"
+ choice:
+ create: <0>Créer une entreprise0><1>Un accompagnement au choix du statut
+ juridique et la liste complète des démarches de création1>
+ manage: <0>Gérer mon activité0><1>Des outils personnalisés pour anticiper le
+ montant des cotisations sociales à payer et mieux gérer votre
+ trésorerie.1>
+ simulators: <0>Accéder aux simulateurs0><1>La liste exhaustive de tous les
+ simulateurs disponibles sur le site.1>
+ subtitle: Les ressources nécessaires pour développer votre activité, du statut
+ juridique à l'embauche.
+ title: L'assistant officiel de l'entrepreneur
+legalNotice:
+ contact:
+ content: <0>contact@mon-entreprise.beta.gouv.fr0>
+ title: Contact
+ editeur:
+ title: Editeur
+ hosting:
+ content: Netlify<1>1>610 22nd Street, Suite 315,<3>3>San Francisco, CA 94107
+ <5>5>Site web : <7>https://www.netlify.com7>
+ title: Prestataire d'hébergement
+ publication:
+ content: M. Yann-Gaël Amghar, Directeur de l'Acoss
+ title: Directeur de la publication
+ title: Mentions légales
+listeformejuridique:
+ page:
+ titre: Liste des statuts juridiques pour la création de votre entreprise
+mensuel: mensuel
+newsletter:
+ register:
+ confirmation: Votre inscription est confirmée !
+ description: Inscrivez-vous à notre newsletter pour être informé des nouveautés
+ et accéder aux nouvelles fonctionnalités en avant-première.
+ titre: Restez au courant
+nextSteps:
+ integration-iframe: <0><0>0> Intégrer le module web0><1>Ajouter ce
+ simulateur sur votre site internet en un clic via un script clé en main.1>
+noresults: Aucun résultat ne correspond à cette recherche
+page:
+ documentation:
+ title: Documentation
+ simulateurs:
+ accueil:
+ description: <0>Tous les simulateurs sur ce site sont :0><1><0><0>Maintenus à
+ jour0> avec les dernières évolutions législatives0><1><0>Améliorés
+ en continu0> afin d'augmenter le nombre de dispositifs pris en
+ compte1><2><0>Intégrables facilement et gratuitement0> sur n'importe
+ quel site internet. <3>En savoir plus3>.2>1>
+pages:
+ accessibilité: <0>Accessibilité0><1>1><2>Cette page n'est pas une page
+ d'aide, mais une déclaration de conformité au <2>RGAA2> 4.0 qui vise
+ à définir le niveau d'accessibilité général constaté sur le site
+ conformément à la réglementation. Cette page est obligatoire pour être
+ conforme au RGAA 4.0.2><3>Qu’est-ce que l’accessibilité
+ numérique ?3><4>Un site web accessible est un site qui permet à tous
+ les internautes d’accéder à ses contenus sans difficulté, y compris aux
+ personnes qui présentent un handicap et utilisent des logiciels ou matériels
+ spécialisés.4><5>Un site accessible permet par exemple
+ de :5><6><0>Naviguer avec des synthèses vocales ou des plages braille
+ (notamment utilisées par les internautes aveugles ou
+ malvoyants).0><1>Personnaliser l’affichage du site selon ses besoins
+ (grossissement des caractères, modification des couleurs,
+ etc.).1><2>Naviguer sans utiliser la souris, avec le clavier uniquement ou
+ via un écran tactile.2>6><7>Déclaration d’accessibilité7><8>L'Acoss
+ s’engage à rendre ses sites internet accessibles conformément à l’article 47
+ de la loi n° 2005-102 du 11 février 2005.8><9>À cette fin, elle rédige
+ <2>la stratégie et le plan d’action à mettre en œuvre2>.9><10>Cette
+ déclaration d’accessibilité s’applique à
+ <2>https://mon-entreprise.fr2>.10><11>État de
+ conformité11><12><0>https://mon-entreprise.fr0> n’est actuellement pas
+ en conformité avec le <3>référentiel général d’amélioration de
+ l’accessibilité (RGAA)3>. L’audit de conformité sera prochainement
+ planifié. Les corrections seront prises en compte suite à
+ l’audit.12><13>Droit à la compensation13><14>Dans l’attente d’une mise
+ en conformité totale, vous pouvez obtenir une version accessible des
+ documents ou des informations qui y seraient contenues en envoyant un
+ courriel à <2>accessibilite@acoss.fr2> en indiquant le nom du document
+ concerné et/ou les informations que vous souhaiteriez obtenir. Les
+ informations demandées vous seront transmises dans les meilleurs
+ délais.14><15>Amélioration et contact15><16>Vous pouvez nous aider à
+ améliorer l’accessibilité du site en nous signalant les problèmes éventuels
+ que vous rencontrez. Pour ce faire, envoyez-nous un courriel à
+ <2>accessibilite@acoss.fr2>.16><17>Défenseur des droits17><18>Cette
+ procédure est à utiliser dans le cas suivant.18><19>Vous avez signalé au
+ responsable du site internet un défaut d’accessibilité qui vous empêche
+ d’accéder à un contenu ou à un des services du portail et vous n’avez pas
+ obtenu de réponse satisfaisante.19><20><0>Écrire un message au Défenseur
+ des droits
+ (<1>https://formulaire.defenseurdesdroits.fr/1>)0><1>Contacter le
+ délégué du Défenseur des droits dans votre région
+ (<1>https://www.defenseurdesdroits.fr/saisir/delegues1>)1><2>Envoyer un
+ courrier par la poste (gratuit, ne pas mettre de timbre)
+ à :<1>1>Défenseur des droits<3>3>Libre réponse
+ 71120<5>5>75342 Paris CEDEX 072>20><21>Mis à jour le
+ 29/01/202121>
+ common:
+ ressources-auto-entrepreneur:
+ FAQ: <0><0>❓ Questions fréquentes0><1>Une liste exhaustive et maintenue à jour
+ de toutes les questions fréquentes (et moins fréquentes) que l'on est
+ amené à poser en tant qu'auto-entrepreneur1>0>
+ impôt: <0><0>📑 Comment déclarer son revenu aux impôts ?0><1>Les informations
+ officielles de l'administration fiscale concernant les
+ auto-entrepreneurs et le régime de la micro-entreprise.1>0>
+ dévelopeurs:
+ bibliothèque: "<0>Intégrez notre bibliothèque de calcul0><1>Si vous pensez que
+ votre site ou service gagnerait à afficher des calculs de salaire, par
+ exemple passer du salaire brut au salaire net, bonne nouvelle : tous les
+ calculs de cotisations et impôts qui sont derrière mon-entreprise.fr sont
+ libres et facilement réutilisable grâce à la <2>bibliothèque NPM
+ publicodes2>.1><2>Comment utiliser cette librairie ?2><3>Toutes nos
+ règles de calculs sont écrites en `publicodes`, un language déclaratif
+ développé par beta.gouv.fr et l'Urssaf pour encoder des algorithme
+ d'intérêt public. <2>En savoir plus sur publicodes2>3><4>Pour
+ effectuer vos propre calculs, vous devons donc installer l'interpréteur
+ publicodes, télécharger les règles utilisées sur mon-entreprise, appeler
+ la fonction d'évaluation.4><5>Installation5><6><0>npm install --save
+ publicodes modele-social0>6><7>Pour plus de détails sur
+ l'installation, se référer à la <2>documentation dédiée2>7><8>Lancer
+ le calcul8><9>Il ne vous reste plus qu'à paramétrer le moteur avec les
+ règles du paquet `modele-social` et à appeler la fonction `evaluate` sur
+ la règle que dont vous souhaitez la valeur. Voici un exemple pour le
+ calcul brut / net9><10><0>0>10><11>Paramétrer le calcul11><12>Vous
+ l'aurez constaté dans l'exemple précédent, la recette d'un calcul est
+ simple : des variables d'entrée (le salaire brut), une ou plusieurs
+ variables de sorties (le salaire net).12><13>Le calcul est cependant
+ paramétrable avec toutes les possibilités permise dans la
+ legislation.13><14>Toutes ces variables sont listées et expliquées sur
+ la <2>documentation en ligne2>. Cette documentation est auto-générée
+ depuis les fichiers de règles publicodes, elle est donc constamment à
+ jour.14><15>Lançons un calcul plus proche d'une fiche de paie : voici
+ une description de la situation d'entrée annotée de liens vers les pages
+ correspondantes de la documentation :15><16><0> Un <3>cadre3> gagnant
+ <7>3 400€ bruts7> , qui bénéficie de <11>titres-restaurant11> et qui
+ travaille dans une entreprise de <15>22 salariés15>.0>16><17>Voici
+ ce que donne le calcul pour cet exemple plus complet
+ :17><18><0>0>18><19><0>0>Notez que dans l'exemple précédent nous
+ devons spécifier nous-même le taux de versement transport.19><20>Alors
+ que dans le simulateur <2>salarié2>, il suffit de renseigner la commune
+ et le taux correspondant est automatiquement déterminé. C'est voulu : pour
+ garder la bibliothèque (et le site) légers, nous utilisons deux API en
+ ligne. L'<4>API Géo - communes4> pour passer du nom de la commune au
+ code commune. Puis l'<7>API versement transport7>, développé et maintenu
+ par nos soins, qui n'est pas documenté mais son utilisation est très
+ simple et compréhensible <10>dans ce composant React qui l'appelle10>,
+ composant qui fait aussi appel à l'API commune.20><21>Faire des
+ graphiques économiques <1>1>21><22>Il est aussi possible d'utiliser la
+ bibliothèque pour des calculs d'analyse économique ou politique. Ici, on
+ trace le prix du travail et le salaire net en fonction du brut.22><23>On
+ peut constater la progressivité du salaire total, qui est en pourcent plus
+ faible pour un SMIC que pour un haut revenu. Autrement dit, les hauts
+ salaires paient une partie des cotisations sociales des bas
+ salaires.23><24><0>0>24>"
+ développeurs:
+ choice:
+ github: <0>Contribuer sur GitHub0><1>Tous nos outils sont ouverts et
+ développés publiquement sur GitHub.1>
+ library: <0>Libraire de calcul0><1>L'intégralité du moteur de calcul
+ socio-fiscal développé par l'Urssaf, mis à disposition librement sous
+ forme de bibliothèque NPM.1>
+ publicodes: <0>Publicodes0><1>Nos outils sont propulsés par Publicodes, un
+ nouveau langage pour encoder des algorithmes “explicables”.1>
+ code:
+ description: "Voici le code à copier-coller sur votre site :"
+ titre: Code d'intégration
+ couleur: "Quelle couleur ? "
+ home:
+ choice:
+ iframe: <0>Intégrer un simulateur0><1>Intégrer l'un de nos simulateurs en un
+ clic dans votre site Web, via un script clé en main.1>
+ description: En plus du site mon-entreprise.fr, nous développons des outils
+ gratuits et libres à intégrer directement chez vous, dans les parcours
+ habituels de vos utilisateurs.
+ iframe:
+ csp-1: <0>Intégration iframe et politique de sécurité de contenu0><1>L'erreur
+ ci-dessous qui s'affiche dans la console est liée à la communication
+ entre la page parente et l'iframe pour le redimensionnement automatique
+ au contenu affiché.1>
+ csp-2: "Vous pouvez la corriger avec la politique suivante :"
+ intro: <0><0>Intégrez le module Web0><1>Nos simulateurs sont intégrables de
+ manière transparente en ajoutant une simple ligne de code à votre page
+ Web.1><2>Vous pouvez choisir le simulateur à intégrer et
+ <2>personnaliser la couleur principale du module2> pour le fondre dans
+ le thème visuel de votre page.2><3>L'attribut <1>data-lang="en"1>
+ vous permet quant à lui de choisir l'anglais comme langue du
+ simulateur.3>0><1>1><2>À noter que si votre site utilise une
+ politique de sécurité de contenu via l'en-tête de réponse HTTP
+ <1>Content-Security-Policy1>, une erreur bénigne peut apparaître dans
+ la console. <3>3>2>
+ module: Quel module ?
+ gérer:
+ aide-déclaration-indépendant:
+ meta:
+ description: Calculer facilement les montants des charges sociales à reporter
+ dans votre déclaration de revenu 2020.
+ title: "Déclaration de revenus indépendant : calcul du montant des cotisations"
+ shortname: Aide à la déclaration de revenu
+ title: Aide à la déclaration de revenus au titre de l'année 2020
+ demande-mobilité:
+ meta:
+ description: Formulaire interactif à compléter pour les indépendants souhaitant
+ exercer leur activité dans d'autres pays d'Europe
+ title: "Travailleur indépendant : demande de mobilité en Europe"
+ shortname: Demande de mobilité internationale
+ simulateurs:
+ accueil:
+ header: Tous les simulateurs sur ce site sont maintenus à jour avec les
+ dernières évolutions législatives.
+ titre: Simulateurs disponibles
+ aides-embauche:
+ aides:
+ apprenti: Pour l’embauche d’un apprenti ou d’un jeune en contrat de
+ professionnalisation.<1>1>L’aide est versée <3>mensuellement3> et
+ automatiquement par l’Agence de services et de paiement (ASP).
+ emploi franc: Pour l’embauche d’un jeune issu d’un quartier prioritaire de la
+ ville (QPV). L’aide peut aller jusqu’à 17 000 € sur trois
+ ans.<1>1>L’aide est versée tous les <3>6 mois3> par Pôle emploi.
+ handicapé: Pour l’embauche d’un travailleur en situation de
+ handicap.<1>1>L’aide est versée <3>trimestriellement3> par
+ l’Agence de services et de paiement (ASP).
+ jeune: Pour l’embauche d’un jeune de moins de 26 ans en CDI ou pour un CDD d’au
+ moins 3 mois.<1>1>L’aide est versée <3>trimestriellement3> par
+ l’Agence de services et de paiement (ASP).
+ senior: Pour une embauche en contrat de professionnalisation d’un demandeur
+ d’emploi de 45 ans ou plus.<1>1>L’aide est versée par Pôle emploi
+ sous la forme de deux versements de 1000 € chacun.
+ card:
+ action: Simuler une embauche
+ montant: Montant de l’aide
+ première année: " la première année"
+ introduction: <0><0><0>0>0>Les employeurs peuvent bénéficier d'une aide
+ financière pour l'embauche de certains publics prioritaires. Découvrez
+ les dispositifs existants et estimez le montant de l'aide en répondant
+ aux questions.0>
+ message fin: Vous pouvez maintenant simuler le coût d’embauche précis en
+ sélectionnant une aide éligible.
+ meta:
+ description: Découvrez les principales aides à l’embauche et estimez leur
+ montant en répondant à quelques questions.
+ title: Aides à l’embauche
+ outro: <0>En savoir plus sur les aides0><1>Vous pouvez retrouver une liste
+ plus complète des aides à l'embauche existantes sur le portail
+ <2>les-aides.fr2> édité par les chambres de commerce et
+ d'industrie.1><2>Dans le cadre du plan « France Relance » le
+ gouvernement met en place une série de mesures pour encourager les
+ nouvelles embauches.2><3>Rendez-vous sur le portail
+ <2>#1jeune1solution2> pour en savoir plus3>
+ titres:
+ aides: Les aides
+ aidesDisponibles: Aides disponibles
+ autresAides: Les autres aides
+ warning: Ce simulateur présente une liste réduite des aides à l'embauche et
+ n'intègre pas l'ensemble des conditions d'éligibilité.<1>1>Une
+ simulation plus complète peut être réalisée en cliquant sur « Simuler
+ une Embauche ».
+ artiste-auteur:
+ meta:
+ description: Estimez les cotisations sociales sur les droits d'auteur et sur le
+ revenu BNC
+ title: "Artiste-auteur: calcul des cotisations Urssaf"
+ shortname: Artiste-auteur
+ title: Estimer mes cotisations d’artiste-auteur
+ auto-entrepreneur:
+ meta:
+ description: Calcul du revenu à partir du chiffre d'affaires, après déduction
+ des cotisations et des impôts
+ ogDescription: "Grâce au simulateur de revenu auto-entrepreneur développé par
+ l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction
+ de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre
+ trésorerie. Ou dans le sens inverse : savoir quel montant facturer
+ pour atteindre un certain revenu."
+ ogTitle: "Auto-entrepreneur : calculez rapidement votre revenu net à partir du
+ CA et vice-versa"
+ titre: "Auto-entrepreneurs : simulateur de revenus"
+ seo explanation: <0>Comment calculer le revenu net d'un auto-entrepreneur
+ ?0><1>Un auto-entrepreneur doit payer des cotisations et contributions
+ sociales à l'administration. Ces cotisations servent au financement de
+ la sécurité sociale, et ouvrent des droits notamment pour la retraite et
+ pour l'assurance maladie. Elles permettent également de financer la
+ formation professionnelle. Leur montant varie en fonction du type
+ d'activité.1><2><0>0> <2>Voir le détail du calcul des
+ cotisations2>2><3>Il ne faut pas oublier de retrancher toutes les
+ dépenses effectuées dans le cadre de l'activité professionnelle
+ (équipements, matières premières, local, transport). Bien qu'elles ne
+ soient pas utilisées pour le calcul des cotisations et de l'impôt, elles
+ doivent être prises en compte pour vérifier si l'activité est viable
+ économiquement.3><4>La formule de calcul complète est donc
+ :<1><0>Revenu net = Chiffres d'affaires − Cotisations sociales −
+ Dépenses professionnelles0>1>4><5>Comment calculer l'impôt sur le
+ revenu pour un auto-entrepreneur ?5><6>Si vous avez opté pour le
+ versement libératoire lors de la création de votre auto-entreprise,
+ l'impôt sur le revenu est payé en même temps que les cotisations
+ sociales.6><7><0>0> <2>Voir comment est calculé le montant du
+ versement libératoire2>7><8>Sinon, vous serez imposé selon le barème
+ standard de l'impôt sur le revenu. Le revenu imposable est alors calculé
+ comme un pourcentage du chiffre d'affaires. C'est qu'on appel
+ l'abattement forfaitaire. Ce pourcentage varie en fonction du type
+ d'activité excercé. On dit qu'il est forfaitaire car il ne prends pas en
+ compte les dépenses réelles effectuées dans le cadre de
+ l'activité.8><9><0>0> <2>Voir le détail du calcul du revenu abattu
+ pour un auto-entrepreneur2>9>
+ shortname: Auto-entrepreneur
+ title: Simulateur de revenus auto-entrepreneur
+ auxiliaire:
+ shortname: Auxiliaire méd.
+ title: Simulateur de revenus pour auxiliaire médical en libéral
+ tooltip: Infirmiers, masseurs-kinésithérapeutes, pédicures-podologues,
+ orthophonistes et orthoptistes
+ avocat:
+ shortname: Avocat
+ title: Simulateur de revenus pour avocat en libéral
+ chirurgien-dentiste:
+ shortname: Chirurgien-dentiste
+ title: Simulateur de revenus pour chirurgien-dentiste en libéral
+ chômage-partiel:
+ meta:
+ description: Calcul du revenu net pour l'employé et du reste à charge pour
+ l'employeur après remboursement de l'Etat, en prenant en compte toutes
+ les cotisations sociales.
+ ogDescription: Accédez à une première estimation en saisissant à partir d'un
+ salaire brut. Vous pourrez ensuite personaliser votre situation (temps
+ partiel, convention, etc). Prends en compte la totalité des
+ cotisations, y compris celles spécifiques à l'indemnité (CSG et CRDS).
+ ogTitle: "Simulateur chômage partiel : découvrez l'impact sur le revenu net
+ salarié et le coût total employeur."
+ titre: "Calcul de l'indemnité chômage partiel : le simulateur Urssaf"
+ seo: <0>Comment calculer l'indemnité d'activité partielle ?0><1>L'indemnité
+ d'activité partielle de base est fixée par la loi à <2>70% du brut2>.
+ Elle est proratisée en fonction du nombre d'heures chômées. Pour un
+ salarié à 2300 € brut mensuel, qui travaille à 50% de son temps usuel,
+ cela donne <5>2300 € × 50% × 70% = 805 €5>1><2>A cette indemnité de
+ base s'ajoute l'indemnité complémentaire pour les salaires proches du
+ SMIC. Ce complément intervient lorsque le cumul de la rémunération et de
+ l'indemnité de base est en dessous d'un SMIC net. Ces indemnités sont
+ prises en charge par l'employeur, qui sera ensuite remboursé en parti ou
+ en totalité par l'État.2><3>👉 <2>Voir le détail du calcul de
+ l'indemnité2>3><4>Comment calculer la part remboursée par l'État
+ ?4><5>L'État prend en charge une partie de l'indemnité partielle pour
+ les salaires allant jusqu'à <1>4,5 SMIC1>, avec un minimum à 8,03€ par
+ heures chômée. Concrètement, cela abouti à une prise en charge
+ à<3>100%3> pour les salaires proches du SMIC. Celle-ci diminue
+ progressivement jusqu'à se stabiliser à <6>93%6> pour les salaires
+ compris <9>entre 2000 € et 7000 €9> (salaire correspondant à la limite
+ de 4,5 SMIC).5><6>👉 <2>Voir le détail du calcul du remboursement de
+ l'indemnité2>6><7>Comment déclarer une activité partielle
+ ?7><8>Face à la crise du coronavirus, les modalités de passage en
+ activité partielle ont été allégées. L'employeur est autorisé a placer
+ ses salariés en activité partielle avant que la demande officielle ne
+ soit déposée. Celui-ci dispose ensuite d'un délai de <2>30 jours2>
+ pour se mettre en règle. Les indemnités seront versées avec un effet
+ rétro-actif débutant à la mise en place du chômage partiel.8><9>👉
+ <2>Effectuer la demande de chômage partiel2>9><10> Quelles sont les
+ cotisations sociales à payer pour l'indemnité d'activité partielle
+ ?10><11>L'indemnité d'activité partielle est soumise à la CSG/CRDS et
+ à une contribution maladie dans certains cas. Pour en savoir plus, voir
+ la page explicative sur <2>le site de l'Urssaf2>.11>
+ shortname: Chômage partiel
+ title: "Covid-19 : Simulateur de chômage partiel"
+ comparaison:
+ meta:
+ description: Auto-entrepreneur, indépendant ou dirigeant de SASU ? Avec ce
+ comparatif, trouvez le régime qui vous correspond le mieux
+ title: "Création d'entreprise : le comparatif des régimes sociaux"
+ shortname: Comparaison des statuts
+ title: "Indépendant, assimilé salarié ou auto-entrepreneur : quel régime choisir
+ ?"
+ dividendes:
+ meta:
+ description: Calculez le montant de l'impôt et des cotisations sur les
+ dividendes versés par votre entreprise.
+ title: Dividendes
+ seo: <0>Les dividendes et distributions0><1>A la fin de l'exercice d'une
+ société, le résultat de l'exercice précédent peut être conservé en
+ réserve (pour de futurs investissements) ou bien être versé en
+ dividendes. Du point de vue des bénéficiaires, ce sont des revenus de
+ capitaux mobiliers, soumis à des cotisations et une imposition
+ spécifiques.1><2>Ne sont pris en compte dans ce simulateur que les cas
+ de figure du bénéficiaire personne physique et des dividendes décidés
+ par la société.2><3>Comment sont calculés les prélèvements sur les
+ dividendes ?3><4>Les dividendes peuvent être soumis au prélèvement
+ forfaitaire unique de 30% incluant imposition et contributions sociales
+ (aussi appelé<1> flat tax1>). Par option, le barème de l'impôt peut
+ être choisi. Ce simulateur peut être utilisé pour comparer les deux
+ régimes.4><5>Un acompte du montant de l'impôt (12,8%) est prélevé au
+ moment du versement des dividendes, sauf si le bénéficiaire remplit
+ <2>certains critères2>.5><6>Cas particulier du dirigeant au régime
+ du travailleur indépendant6><7> Au régime du travailleur indépendant,
+ la part des dividendes dépassant 10% du capital social sera soumise au
+ cotisations et contributions au même titre que les revenus du
+ dirigeant.7><8>Ce cas de figure n'est pas encore pris en compte par ce
+ simulateur.8>
+ title: Simulateur de versement de dividendes
+ ei:
+ meta:
+ description: Calcul du revenu à partir du chiffre d'affaires, après déduction
+ des cotisations et des impôts
+ ogDescription: "Grâce au simulateur de revenu pour entreprise individuelle
+ développé par l'Urssaf, vous pourrez estimer le montant de vos revenus
+ en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux
+ gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant
+ facturer pour atteindre un certain revenu."
+ ogTitle: "Entreprise individuelle (EI) : calculez rapidement votre revenu net à
+ partir du CA et vice-versa"
+ titre: "Entreprise individuelle (EI) : simulateur de revenus"
+ seo explanation: <0>Comment calculer le revenu net d'un dirigeant d'entreprise
+ individuelle (EI) ?0><1>Un dirigeant d'entreprise individuelle doit
+ payer des cotisations et contributions sociales à l'administration. Ces
+ cotisations servent au financement de la sécurité sociale, et ouvrent
+ des droits notamment pour la retraite et pour l'assurance maladie. Elles
+ permettent également de financer la formation
+ professionnelle.1><2><0>0> <2>Voir le détail du calcul des
+ cotisations2>2><3>Il ne faut pas oublier de retrancher toutes les
+ dépenses effectuées dans le cadre de l'activité professionnelle
+ (équipements, matières premières, local, transport). Ces dernières sont
+ déductibles du résultat de l'entreprise, cela veut dire que vous ne
+ payerez pas d'impôt ou de cotisations sur leur montant (sauf si vous
+ avez opté pour l'option micro-fiscal).3><4>La formule de calcul
+ complète est donc :<1><0>Revenu net = Chiffres d'affaires − Dépenses
+ professionnelles - Cotisations sociales0>1>4><5>Comment calculer
+ les cotisations sociales d'une entreprise individuelle ?5><6>Le
+ dirigeant d'une entreprise individuelle paye des cotisations sociales,
+ proportionnelle au <2>résultat fiscal2> de l'entreprise. Leur montant
+ varie également en fonction du type d'activité (profession libérale,
+ artisan, commerçants, etc), où des éventuelles exonérations accordées
+ (ACRE, ZFU, RSA, etc.).6><7> Comme le résultat d'une entreprise n'est
+ connu qu'à la fin de l'exercice comptable, le dirigeant paye des
+ cotisations provisionnelles qui seront ensuite régularisée une fois le
+ revenu réel déclaré, l'année suivante.7><8>Ce simulateur permet de
+ calculer le montant exact des cotisations sociale en partant d'un
+ chiffre d'affaires ou d'un revenu net souhaité. Vous pourrez préciser
+ votre situation en répondant aux questions s'affichant en dessous de la
+ simulation.8>
+ shortname: EI
+ title: Simulateur pour entreprise individuelle (EI)
+ eirl:
+ meta:
+ description: Calcul du revenu à partir du chiffre d'affaires, après déduction
+ des cotisations et des impôts
+ ogDescription: "Grâce au simulateur de revenu pour EIRL développé par l'Urssaf,
+ vous pourrez estimer le montant de vos revenus en fonction de votre
+ chiffre d'affaires mensuel ou annuel pour mieux gérer votre
+ trésorerie. Ou dans le sens inverse : savoir quel montant facturer
+ pour atteindre un certain revenu."
+ ogTitle: "Dirigeant d'EIRL : calculez rapidement votre revenu net à partir du CA
+ et vice-versa"
+ titre: "EIRL : simulateur de revenus pour dirigeant"
+ shortname: EIRL
+ title: Simulateur d'EIRL
+ eurl:
+ meta:
+ description: Calcul du salaire net à partir du total alloué à la rémunération et
+ inversement
+ ogDescription: En tant que dirigeant assimilé-salarié, calculez immédiatement
+ votre revenu net après impôt à partir du total alloué à votre
+ rémunération.
+ ogTitle: "Rémunération du dirigeant d'EURL : un simulateur pour connaître votre
+ salaire net"
+ titre: "EURL : simulateur de revenus pour dirigeant"
+ expert-comptable:
+ shortname: Expert-Comptable
+ title: Simulateur de revenus pour expert comptable et commissaire aux comptes en
+ libéral
+ indépendant:
+ cotisations-forfaitaires: "Montant des cotisations forfaitaires : "
+ meta:
+ description: Calcul du revenu net après impôt et des cotisations à partir du
+ chiffre d'affaires et inversement
+ title: "Indépendant : simulateur de revenus"
+ retraite-droits-acquis: "<0>Retraite : droits acquis sur l'année
+ 20210><1><0>Retraite de base : <2><0><0>0> trimestres
+ acquis0>2>0><1>Retraite complémentaire : <2><0>Ce simulateur ne
+ gère pas les droits acquis de retraite complémentaire pour les
+ professions libérales0>2><3><0><0><0>0> points
+ acquis0>0>3>1>1>"
+ shortname: Indépendant
+ title: Simulateur de revenus pour indépendant
+ is:
+ meta:
+ description: Calculez votre impôt sur les sociétés
+ title: Impôt sur les sociétés
+ seo: <0>Comment est calculé l’impôt sur les sociétés ?0><1>L’impôt sur les
+ sociétés s’applique aux bénéfices réalisés par les sociétés de capitaux
+ (SA, SAS, SASU, SARL, etc.) et sur option facultative pour certaines
+ autres sociétés (EIRL, EURL, SNC, etc.).1><2>Il est calculé sur la
+ base des bénéfices réalisés en France au cours de l’exercice comptable.
+ La durée d’un exercice est normalement d’un an mais il peut être plus
+ court ou plus long (notamment en début d’activité ou à la dissolution de
+ l’entreprise). Dans ce cas le barème de l’impôt est pro-ratisé en
+ fonction de la durée de l’exercice, ce qui est pris en compte dans le
+ simulateur en modifiant les dates de début et de fin de
+ l’exercice.2><3>Taux réduit et régimes spécifiques3><4>Les PME
+ réalisant moins de 7,63 millions d’euros de chiffre d’affaires et dont
+ le capital est détenu à 75% par des personnes physiques bénéficient d’un
+ taux réduit d’impôt sur les sociétés. Ce taux est pris en compte sur le
+ simulateur et il n’est pour l’instant pas possible de simuler
+ l’inéligibilité aux taux réduits.4><5>Enfin il existe des régimes
+ d’impositions spécifiques avec des taux dédiés pour certains types de
+ plus-values (cession de titres, cession de brevets). Ces régimes ne sont
+ pas intégrés dans le simulateur.5>
+ title: Simulateur d'impôt sur les sociétés
+ médecin:
+ shortname: Médecin
+ title: Simulateur de revenus pour médecin en libéral
+ pamc:
+ meta:
+ description: Calcul du revenu net pour les professions libérales du régime PAMC
+ (médecin, chirurgien-dentiste, sage-femme et auxiliaire médical)
+ title: Simulateurs régime PAMC
+ shortname: PAMC
+ title: "PAMC : simulateurs de cotisations et de revenu"
+ print-info:
+ date: Cette simulation a été effectuée le
+ recover: Retrouvez cette simulation ainsi que d'autres outils d'aide à la
+ création et à la gestion d'entreprise, sur <2>mon-entreprise.fr2>.
+ title: Vous souhaitez retrouver cette simulation ?
+ profession-libérale:
+ meta:
+ description: Calcul du revenu net pour les indépendants en libéral à l'impôt sur
+ le revenu (IR, BNC)
+ title: "Professions libérale : le simulateur Urssaf"
+ shortname: Profession libérale
+ title: Simulateur de revenus pour profession libérale
+ sage-femme:
+ shortname: Sage-femme
+ title: Simulateur de revenus pour sage-femme en libéral
+ salarié:
+ alt-image1: Salaire net (perçu par le salarié) = Salaire brut (inscrit dans le
+ contrat de travail) - cotisations salariales (retraite, csg, etc)
+ meta:
+ description: Calcul du salaire net, net après impôt et coût total employeur.
+ Beaucoup d'options disponibles (cadre, stage, apprentissage, heures
+ supplémentaires, etc.)
+ ogDescription: En tant que salarié, calculez immédiatement votre revenu net
+ après impôt à partir du brut mensuel ou annuel. En tant qu'employé,
+ estimez le coût total d'une embauche à partir du brut. Ce simulateur
+ est développé avec les experts de l'Urssaf, et il adapte les calculs à
+ votre situation (statut cadre, stage, apprentissage, heures
+ supplémentaire, titre-restaurants, mutuelle, temps partiel, convention
+ collective, etc.)
+ ogTitle: "Salaire brut, net, net après impôt, coût total : le simulateur ultime
+ pour salariés et employeurs"
+ titre: "Salaire brut / net : le convertisseur Urssaf"
+ seo: "<0>Comment calculer le salaire net ?0><1>Lors de l'entretien d'embauche
+ l'employeur propose en général une rémunération exprimée en « brut ». Le
+ montant annoncé inclut ainsi les cotisations salariales, qui servent à
+ financer la protection sociale du salarié et qui sont retranchées du
+ salaire « net » perçu par le salarié.1><2>Vous pouvez utiliser notre
+ simulateur pour convertir le <2>salaire brut en net2> : il vous suffit
+ pour cela saisir la rémunération annoncée dans la case salaire brut. La
+ simulation peut-être affinée en répondant aux différentes questions
+ (CDD, statut cadre, heures supplémentaires, temps partiel,
+ titre-restaurants, etc.).2><3>3><4>Par ailleurs depuis 2019,
+ l'<1>impôt sur le revenu1> est prélevé à la source. Pour ce faire, la
+ direction générale des finances publiques (DGFiP) transmet à l'employeur
+ le taux d'imposition calculé à partir de la déclaration de revenu du
+ salarié. Si ce taux est inconnu, par exemple lors d'une première année
+ d'activité, l'employeur utilise le <4>taux neutre4>.4><5>Comment
+ calculer le coût d'embauche ?5><6>Si vous cherchez à embaucher, vous
+ pouvez calculer le coût total de la rémunération de votre salarié, ainsi
+ que les montants de cotisations patronales et salariales correspondant.
+ Cela vous permet de définir le niveau de rémunération en connaissant le
+ montant global de charge que cela représente pour votre
+ entreprise.6><7>En plus du salaire, notre simulateur prend en compte
+ le calcul des avantages en nature (téléphone, véhicule de fonction,
+ etc.), ainsi que la mutuelle santé obligatoire.7><8>Il existe des
+ <2>aides différées2> à l'embauche qui ne sont pas toutes prises en
+ compte par notre simulateur, vous pouvez les retrouver sur <6>le portail
+ officiel6>.8>"
+ shortname: Salarié
+ title: Simulateur de revenus pour salarié
+ title-employeur: Simulateur de coûts d'embauche
+ sasu:
+ meta:
+ description: Calcul du salaire net à partir du total alloué à la rémunération et
+ inversement
+ ogDescription: En tant que dirigeant assimilé-salarié, calculez immédiatement
+ votre revenu net après impôt à partir du total alloué à votre
+ rémunération.
+ ogTitle: "Rémunération du dirigeant de SASU : un simulateur pour connaître votre
+ salaire net"
+ titre: "SASU : simulateur de revenus pour dirigeant"
+ seo-explanation: "<0>Comment calculer le salaire d'un dirigeant de SASU ?
+ 0><1>Comme pour un salarié classique, le <2>dirigeant de sasu2> paye
+ des cotisations sociales sur la rémunération qu'il se verse. Les
+ cotisations sont calculées de la même manière que pour le salarié :
+ elles sont décomposées en partie employeur et partie salarié et sont
+ exprimées comme un pourcentage du salaire brut.1><2>Le dirigeant
+ assimilé-salarié ne paye pas de <2>cotisations chômage2>. Par
+ ailleurs, il ne bénéficie pas de la <5>réduction générale de
+ cotisations5> ni des dispositifs encadrés par le code du travail comme
+ les <9>heures supplémentaires9> ou les primes.2><3>Il peut en
+ revanche prétendre à la <2>réduction ACRE2> en debut d'activité, sous
+ certaines conditions.3><4>Vous pouvez utiliser notre simulateur pour
+ calculer la <2>rémunération nette2> à partir d'un montant superbrut
+ alloué à la rémunération du dirigeant. Il vous suffit pour cela saisir
+ le montant total alloué dans la case \"total chargé\". La simulation
+ peut ensuite être affinée en répondant aux différentes questions.4>"
+ shortname: EURL
+ title: Simulateur d'EURL
+ économie-collaborative:
+ meta:
+ description: Airbnb, Drivy, Blablacar, Leboncoin... Découvrez comment être en
+ règle dans vos déclarations
+ title: "Déclaration des revenus des plateforme en ligne : guide intéractif"
+ shortname: Guide économie collaborative
+payslip:
+ disclaimer: Il ne prend pour l'instant pas en compte les accords et conventions
+ collectives, ni la myriade d'aides aux entreprises. Trouvez votre convention
+ collective <2>ici2>, et explorez les aides
+ sur <4>aides-entreprises.fr4>.
+ notice: Le simulateur vous aide à comprendre votre bulletin de paie, sans lui
+ être opposable. Pour plus d'informations, rendez vous
+ sur <1>service-public.fr1>.
+ repartition: Répartition du total chargé
+pour les accidents de trajet/travail et maladie pro: pour les accidents de trajet/travail et maladie pro
+previousSimulationBanner:
+ info: "Votre précédente simulation a été sauvegardée :"
+ retrieveButton: Retrouver ma simulation
+privacyContent:
+ ok: Vos préférences ont bien été enregistrées
+ texte: <0>0><1>Données personnelles1><2>Nous recueillons des statistiques
+ anonymes sur l'utilisation du site, que nous utilisons dans le seul but
+ d'améliorer le service, conformément aux <2>recommandations de la CNIL2>
+ et au règlement RGPD. Ce sont les seules données qui quittent votre
+ navigateur.2><3>Vous pouvez vous soustraire de cette mesure d'utilisation
+ du site ci-dessous :3><4><0><0>0> Je souhaite ne pas envoyer de données
+ anonymes sur mon utilisation du site à des fins de mesures
+ d'audience0>4>
+responsabilité:
+ bouton1: Société
+ bouton2: Entreprise individuelle
+ entreprise-individuelle: "<0>Entreprise individuelle : 0>Une activité
+ économique exercée par une seule personne physique, en son nom propre. Moins
+ de formalités, mais plus de risques en cas de faillite, car votre patrimoine
+ personnel peut être mis à contribution. <3>Vous ne pouvez pas accueillir de
+ nouveaux associés en entreprise individuelle.3>"
+ intro: "Ce choix determine votre degré de responsabilité et votre capacité à
+ accueillir de nouveaux associés dans le futur "
+ société: "<0>Société : 0>Vous ne pouvez pas être tenu personnellement
+ responsable des dettes ou obligations de la société. En revanche, les
+ démarches de création sont un peu plus lourdes, puisqu'elles incluent
+ notamment la rédaction de statuts et le dépôt d'un capital."
+ titre: Entreprise individuelle ou société ?
+shareSimulation:
+ banner: <0>Générer un lien de partage0>
+ button:
+ copied: Copié
+ copy: Copier le lien
+ modal:
+ helpText: Le lien est sélectionné, vous pouvez le copier/coller
+ notice: Voici le lien que vous pouvez envoyer pour accéder à votre simulation.
+ title: Votre lien de partage
+ navigatorShare: Ma simulation Mon Entreprise
+simulateurs:
+ explanation:
+ CNAPL: Elle recouvre les cotisations liées à votre retraite et au régime
+ d'invalidité-décès.
+ institutions:
+ cpam: En tant que professionnel de santé conventionné, vous bénéficiez d'une
+ prise en charge d'une partie de vos cotisations par l'Assurance Maladie.
+ dgfip: La direction générale des finances publiques (DGFiP) est l'organisme qui
+ collecte l'impôt sur le revenu. <2>Le montant calculé <2>prend en compte
+ l'abattement du régime micro-fiscal2>.2>
+ notice acre: Les montants indiqués ci-dessus sont calculés sans prendre en
+ compte l'exonération de début d'activité ACRE
+ titre: Vos institutions partenaires
+ urssaf: Les cotisations recouvrées par l'Urssaf, qui servent au financement de
+ la sécurité sociale (assurance maladie, allocations familiales,
+ dépendance).
+ pamc: <0><0>Vos institutions
+ partenaires0><1><0>0><1>1><2><0><0><0>0>0><1>En tant que
+ professionnel de santé conventionné, vous bénéficiez d'une prise en charge
+ d'une partie de vos cotisations par l'Assurance Maladie.1><2><0>0>
+ <2>2>2>0>2>1><2><0> Les montants indiqués ci-dessus sont
+ calculés sans prendre en compte l'exonération de début d'activité
+ ACRE0>2>0>
+ inversionFail: >-
+ Le montant saisi abouti à un résultat impossible. Cela est dû à un effet de
+ seuil dans le calcul des cotisations.
+
+
+ Nous vous invitons à réessayer en modifiant légèrement le montant renseigné (quelques euros de plus par exemple).
+ précision:
+ défaut: Améliorez votre simulation en répondant aux questions
+ warning:
+ année-courante: Le montant calculé correspond aux cotisations de l’année 2021
+ (pour un revenu 2021).
+ artiste-auteur:
+ "1": Cette estimation est proposée à titre indicatif. Elle est faite à partir
+ des éléments réglementaires applicables et des éléments que vous avez
+ saisis, mais elle ne tient pas compte de l'ensemble de votre situation.
+ Le montant réel de vos cotisations peut donc être différent.
+ "2": Ce simulateur permet d'estimer le montant de vos cotisations à partir de
+ votre revenu projeté
+ auto-entrepreneur: Les auto-entrepreneurs bénéficient d’un régime très simplifié
+ avec un taux forfaitaire pour le calcul des cotisations et contributions
+ sociales appliqué sur le chiffre d’affaires. Selon le choix de la modalité
+ de paiement des impôts il est appliqué un abattement forfaitaire au titre
+ des frais professionnels. Il n’est pas possible de déduire des charges
+ réelles en plus. Votre revenu net est donc le chiffre d’affaires moins
+ toutes les charges engagées pour l’entreprise.
+ cfe: Le simulateur n'intègre pas la cotisation foncière des entreprise (CFE) qui
+ est dûe dès la deuxième année d'exercice. Son montant varie fortement en
+ fonction du chiffre d'affaires et de la domiciliation de l'entreprise.
+ <2>Plus d'infos.2>
+ cotisations-ordinales: Pour les professions réglementées, le simulateur ne
+ calcule pas le montant des cotisations à l'ordre. Elles doivent être
+ ajoutées manuellement dans la case « charges de fonctionnement ».
+ plus: Lire les précisions
+ profession-libérale: <0>Ce simulateur est à destination des professions
+ libérales en BNC. Il ne prend pas en compte les sociétés d'exercice
+ libéral.0>
+ sasu: L'impôt sur les sociétés et la gestion des dividendes ne sont pas encore
+ implémentés.
+ titre: Avant de commencer...
+ urssaf: Les calculs sont indicatifs. Ils ne se substituent pas aux décomptes
+ réels de l’Urssaf, de l’administration fiscale ou de toute autre
+ organisme.
+simulation-end:
+ cta: Connaître les démarches
+ hiring:
+ text: Vous pouvez maintenant concrétiser votre projet d'embauche.
+ text: Vous avez maintenant accès à l'estimation la plus précise possible.
+ title: Vous avez complété cette simulation
+statut du dirigeant:
+ description: <0>Ce choix est important car il détermine le régime de sécurité
+ sociale et la couverture sociale du dirigeant. Le montant et les modalités
+ de paiement des cotisations sociales sont également
+ impactés.0><1><0>0>1>
+ page:
+ description: Ce choix est important parce qu'il détermine le régime de sécurité
+ sociale et la couverture sociale de l'administrateur. Chaque option a des
+ implications juridiques et conduit à un statut différent lors de la
+ création de votre entreprise.
+ titre: Définir le statut du dirigeant
+supérieurs à: supérieurs à
+sécu:
+ contenu: <0>Protection sociale 0><1>En France, tous les travailleurs
+ bénéficient d'une protection sociale de qualité. Ce système obligatoire
+ repose sur la solidarité et vise à assurer le <2>bien-être général de la
+ population2>.1><2>En contrepartie du paiement de <2>contributions
+ sociales2>, le cotisant est couvert sur la maladie, les accidents du
+ travail, chômage ou encore la retraite.2>
+ page:
+ titre: Sécurité sociale
+tous les 6 mois: tous les 6 mois
+trimestriel: trimestriel
+trouver:
+ description: Grâce à la base SIREN, les données publiques sur votre entreprise
+ seront automatiquement disponibles pour la suite du parcours sur le site.
+ titre: Retrouver mon entreprise
+À quoi servent mes cotisations ?: À quoi servent mes cotisations ?
+économieCollaborative:
+ accueil:
+ contenu: <0>Vous avez des revenus issus des <2>plateformes en ligne2> (Airbnb,
+ Abritel, Drivy, Blablacar, Leboncoin, etc.) ? Vous devez les déclarer dans
+ la plupart des cas. Cependant, il peut être difficile de s'y retrouver
+ <5><0>0>5>.0><1>Suivez ce guide pour savoir en quelques clics
+ comment être en règle.1><2>À partir de 2020, ces revenus seront
+ communiqués automatiquement par les plateformes à l’administration fiscale
+ et à l’Urssaf.2>
+ question: Quels types d'activités avez-vous exercé ?
+ réassurance: "PS : cet outil est là uniquement pour vous informer, aucune donnée
+ ne sera transmise aux administrations"
+ titre: Comment déclarer mes revenus des plateformes en ligne ?
+ activité:
+ choix: Quelles sont plus précisément les activités exercées ?
+ impôt: <0>Vous devez déclarez vos revenus aux impôts0><1>Les revenus de cette
+ activité sont imposables.1>
+ pro: <0>Il s'agit d'une activité professionnelle0><1>Les revenus de cette
+ activité sont considérés comme des <2>revenus professionnels dès le 1er
+ euro gagné2>.1>
+ revenusAnnuels: <0>Revenus annuels0><1>Vos revenus annuels pour cette activité sont :1>
+ voirObligations: Voir mes obligations
+ exonération:
+ notice: Si aucun de ces cas ne s'applique à vous, vous n'aurez rien à déclarer.
+ question: Êtes-vous dans un des cas suivants ?
+ obligations:
+ aucune: <0>Rien à faire0><1>Vous n'avez pas besoin de déclarer vos revenus
+ pour ces activités.1>
+ entreprise: <0>Avec une entreprise0><1>Si vous possédez déjà une activité
+ déclarée, vous pouvez ajouter ces revenus à ceux de l'entreprise. Il vous
+ faudra seulement vérifier que son objet social est compatible avec les
+ activités concernées (et le changer si besoin). Sinon, vous aurez à créer
+ une nouvelle entreprise.1><2>Créer une entreprise2>
+ guide: <0>Consulter le guide Urssaf0><1>Découvrez les modalités des statuts
+ sociaux pour chaque type de locations (bien, meublé, courte durée, classé,
+ etc.).1><2>PDF2>
+ impôts: <0>Déclarer vos revenus aux impôts0><1>Pour ces activités, vous avez
+ uniquement besoin de déclarer vos revenus sur votre feuille d'imposition.
+ Pour en savoir plus, vous pouvez consulter la <2>page dédiée sur
+ impots.gouv.fr2>.1>
+ pro: <0>Déclarer en tant qu'activité professionnelle0><1>Vos revenus sont
+ considérés comme revenus professionnels, ils sont soumis aux cotisations
+ sociales. En contrepartie, ils ouvrent vos droit à des prestations
+ sociales (retraite, assurance maladie, maternité, etc.).1>
+ régimeGénéral: <0>Avec l'option régime général0><1>Pour certaines activités,
+ vous pouvez déclarer vos revenus directement sur le site de l'Urssaf.
+ C'est une option intéressante si vous ne souhaitez pas créer d'entreprise
+ ou modifier une entreprise existante. Vous devrez dans tous les cas
+ déclarer ces revenus aux impôts.1><2>Déclarer au régime général2>
+ régimeGénéralDisponible: Régime général disponible
+ titre: Que dois-je faire pour être en règle ?
+ retourAccueil: Retour à la selection d'activités
diff --git a/mon-entreprise/source/pages/Budget/Budget.tsx b/mon-entreprise/source/pages/Budget/Budget.tsx
index e8db500b2..62add1c08 100644
--- a/mon-entreprise/source/pages/Budget/Budget.tsx
+++ b/mon-entreprise/source/pages/Budget/Budget.tsx
@@ -1,10 +1,11 @@
import MoreInfosOnUs from 'Components/MoreInfosOnUs'
+import Emoji from 'Components/utils/Emoji'
import { Markdown } from 'Components/utils/markdown'
import { ScrollToTop } from 'Components/utils/Scroll'
import { formatValue } from 'publicodes'
import { sum, uniq } from 'ramda'
import { useState } from 'react'
-import emoji from 'react-easy-emoji'
+import { Helmet } from 'react-helmet'
import { useTranslation } from 'react-i18next'
import styled from 'styled-components'
import { TrackPage } from '../../ATInternetTracking'
@@ -17,21 +18,23 @@ const [
intro,
ressources2019,
ressources2020,
+ ressources2021,
ressourcesDescription,
] = prose.split(/\r?\n-{3,}\r?\n/)
const ressources = {
2019: ressources2019,
2020: ressources2020,
+ 2021: ressources2021,
}
export default function Budget() {
- const years = ['2019', '2020'] as const
+ const years = ['2019', '2020', '2021'] as const
const quarters = ['T1', 'T2', 'T3', 'T4']
- const [selectedYear, setSelectedYear] = useState('2020')
+ const [selectedYear, setSelectedYear] = useState('2021')
const categories = uniq(
quarters
- .map((q) => Object.keys(budget[2020][q] ?? {}))
+ .map((q) => Object.keys(budget[selectedYear]?.[q] ?? {}))
.reduce((acc, curr) => [...acc, ...curr], [])
)
@@ -39,11 +42,16 @@ export default function Budget() {
return (
<>
+
+ Le budget de mon-entreprise.fr
+
- Budget {emoji('💶')}
+
+ Budget
+
- {emoji('📅')} Année{' '}
+ Année{' '}
@@ -55,10 +63,10 @@ export default function Budget() {
))}
+ Budget consommé
{selectedYear !== '2019' && (
<>
- Emploi des ressources
- 2020
+ {selectedYear}
{quarters.map((q) => (
{q}
))}
@@ -79,7 +87,7 @@ export default function Budget() {
{label}
{quarters.map((q) => {
- const value = budget[2020]?.[q]?.[label]
+ const value = budget[selectedYear]?.[q]?.[label]
return (
{value
@@ -94,7 +102,9 @@ export default function Budget() {
{formatValue(
sum(
- quarters.map((q) => budget[2020]?.[q]?.[label] ?? 0)
+ quarters.map(
+ (q) => budget[selectedYear]?.[q]?.[label] ?? 0
+ )
),
{
displayedUnit: '€',
@@ -109,7 +119,9 @@ export default function Budget() {
Total
{quarters.map((q) => {
- const value = sum(Object.values(budget[2020]?.[q] ?? {}))
+ const value = sum(
+ Object.values(budget[selectedYear]?.[q] ?? {})
+ )
return (
{value
@@ -125,7 +137,7 @@ export default function Budget() {
{formatValue(
sum(
quarters.map((q) =>
- sum(Object.values(budget[2020]?.[q] ?? {}))
+ sum(Object.values(budget[selectedYear]?.[q] ?? {}))
)
),
{
diff --git a/mon-entreprise/source/pages/Budget/budget.md b/mon-entreprise/source/pages/Budget/budget.md
index 389e065a6..261f215a4 100644
--- a/mon-entreprise/source/pages/Budget/budget.md
+++ b/mon-entreprise/source/pages/Budget/budget.md
@@ -13,8 +13,6 @@ dont nous rappelons les principes ici :
---
-## Budget
-
En 2019, le projet dispose d’un budget de **250 000 € HT** pris en charge :
- Par la DINSIC (ancien nom de la [DINUM](https://www.numerique.gouv.fr/dinum/)) à hauteur de 150 000 € HT
@@ -34,38 +32,38 @@ simulateur et une expérimentation sur la paie.
---
-## Budget
+En 2020, le budget est désormais pris en charge à 100% par
+l’[ACOSS](https://www.acoss.fr). En plus de sa contribution financière, l’ACOSS
+fournit des ressources métier expertes provenant du réseau des Urssaf.
-En 2020, le budget de **250 000 € HT** est reconduit. Il est pris en charge à
-100% par l’[ACOSS](https://www.acoss.fr). En plus de cette contribution
-financière, l’ACOSS fournit des ressources métier expertes provenant du réseau
-des Urssaf.
+Une enveloppe est allouée pour expérimenter la transformation du moteur de
+simulations en moteur de paie complète. La solution proposée ne sera finalement
+pas retenue pour la refonte des offres de service de l'Urssaf. Voir le
+[compte-rendu de l'expérimentation](https://pad.incubateur.net/s/ulS0EWvxK#).
-Une enveloppe de **41 667 € HT** est allouée pour expérimenter la transformation
-du moteur de simulations en moteur de paie complète. La solution proposée ne
-sera finalement pas retenue pour la refonte des offres de service de l'Urssaf.
-Voir le [compte-rendu de
-l'expérimentation](https://pad.incubateur.net/s/ulS0EWvxK#).
-
-| | |
-| --------------------------- | ---------------: |
-| Budget mon-entreprise | 250 000 € HT |
-| Budget expérimentation paie | 41 667 € HT |
-| **Total** | **291 667 € HT** |
-
-Au quatrième trimestre mon-entreprise rejoint le programme [programme
+Au quatrième trimestre mon-entreprise rejoint le [programme
Gamma](https://blog.beta.gouv.fr/dinsic/2020/08/20/acceleration-des-startups-d-etat-d-un-retour-d-experience-a-l-experimentation-d-un-programme-d-accompagnement-cible-1/)
qui accompagne l'accélération des services publics crées par beta.gouv. Ce
programme est financé par la [DINUM](https://www.numerique.gouv.fr/dinum/).
---
+En 2021 l'[Urssaf Caisse Nationale](https://www.acoss.fr) prend en charge à 100%
+le financement de mon-entreprise.
+
+Au premier trimestre 2021, l'équipe mon-entreprise continue de bénéficier de
+l'accompagnement du [programme
+Gamma](https://beta.gouv.fr/approche/acceleration) financé par la
+[DINUM](https://www.numerique.gouv.fr/dinum/).
+
+---
+
### Description des catégories
- **Développement 👨💻**
Les coûts de développement représentent la grande majorité de notre budget.
- Nous utilisons une petite équipe de développeurs freelances, qui sont
+ Nous sommes une petite équipe de développeurs freelances,
pluridisciplinaires aussi bien sur les aspects techniques, stratégiques et
métiers. Les rémunérations suivent
[la grille de beta.gouv](https://doc.incubateur.net/communaute/travailler-a-beta-gouv/recrutement/remuneration).
diff --git a/mon-entreprise/source/pages/Budget/budget.yaml b/mon-entreprise/source/pages/Budget/budget.yaml
index f8a37c49c..b05fe83bf 100644
--- a/mon-entreprise/source/pages/Budget/budget.yaml
+++ b/mon-entreprise/source/pages/Budget/budget.yaml
@@ -1,7 +1,7 @@
# Ces données sont optenues avec la commande suivante depuis le repo privé
# `mon-entreprise/compta` :
#
-# $ hledger is -p 2020 -Q -B --depth 2
+# $ hledger is -p 2021 -Q -B --depth 2
#
# La partie « marge du porteur » est amortie par trimestre en prenant 13,31% du
# total du trimestre.
@@ -26,3 +26,13 @@
Développement: 72150
Logiciels et hébergement: 782
Marge du porteur: 9631
+2021:
+ T1:
+ Développement: 44850
+ Logiciels et hébergement: 454
+ Déplacements: 114
+ Marge du porteur: 6045
+ T2:
+ Développement: 57750
+ Logiciels et hébergement: 212
+ Marge du porteur: 7715
diff --git a/mon-entreprise/source/pages/Créer/AfterRegistration.tsx b/mon-entreprise/source/pages/Créer/AfterRegistration.tsx
index 61ff7446e..912111536 100644
--- a/mon-entreprise/source/pages/Créer/AfterRegistration.tsx
+++ b/mon-entreprise/source/pages/Créer/AfterRegistration.tsx
@@ -1,4 +1,4 @@
-import Animate from 'Components/ui/animate'
+import { FromBottom } from 'Components/ui/animate'
import { ScrollToTop } from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext } from 'react'
@@ -18,7 +18,7 @@ export default function AfterRegistration() {
const isAutoentrepreneur = statutChoisi?.match('auto-entrepreneur')
return (
-
+
@@ -116,6 +116,6 @@ export default function AfterRegistration() {
d'équipement professionnel auprès de fournisseurs, etc.
-
+
)
}
diff --git a/mon-entreprise/source/pages/Créer/CreationChecklist.tsx b/mon-entreprise/source/pages/Créer/CreationChecklist.tsx
index 47dd055ef..ae71419c6 100644
--- a/mon-entreprise/source/pages/Créer/CreationChecklist.tsx
+++ b/mon-entreprise/source/pages/Créer/CreationChecklist.tsx
@@ -3,12 +3,12 @@ import {
initializeCompanyCreationChecklist,
} from 'Actions/companyCreationChecklistActions'
import { resetCompanyStatusChoice } from 'Actions/companyStatusActions'
-import * as Animate from 'Components/ui/animate'
+import { FromBottom } from 'Components/ui/animate'
import { CheckItem, Checklist } from 'Components/ui/Checklist'
+import Emoji from 'Components/utils/Emoji'
import Scroll from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext } from 'react'
-import emoji from 'react-easy-emoji'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
@@ -16,7 +16,6 @@ import { Link, useHistory } from 'react-router-dom'
import { RootState } from 'Reducers/rootReducer'
import { LegalStatus } from 'Selectors/companyStatusSelectors'
import { TrackPage } from '../../ATInternetTracking'
-import GuideAutoEntrepreneurUrl from './Guide_Auto-Entrepreneur.pdf'
import StatutDescription from './StatutDescription'
type CreateCompanyProps = {
@@ -52,7 +51,7 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
})
return (
-
+
{titre}
@@ -96,7 +95,7 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
- {emoji('📋')}{' '}
+ {' '}
À faire pour créer votre entreprise
@@ -401,7 +400,7 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
/>
- {emoji('💭')}{' '}
+ {' '}
Recommandé avant le début de l'activité
@@ -455,20 +454,22 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
}
/>
-
- {emoji('🧰')} Ressources utiles
+
+ Ressources utiles
{isAutoentrepreneur && (
- Simulateur de revenus auto-entrepreneur
+
+ Simulateur de revenus auto-entrepreneur
+
Simuler le montant de vos cotisations sociales et de votre impôt
et estimez votre futur revenu net.
@@ -485,7 +486,9 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
}}
>
- Simulateur de cotisations indépendant
+
+ Simulateur de cotisations indépendant
+
Simuler le montant de vos cotisations sociales pour bien
préparer votre business plan.
@@ -497,12 +500,14 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
- Simulateur de rémunération pour dirigeant de SASU
+
+ Simulateur de rémunération pour dirigeant de SASU
+
Simuler le montant de vos cotisations sociales pour bien
préparer votre business plan.
@@ -515,21 +520,39 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
to={sitePaths.créer.après}
>
- Après la création
+ Après la création
SIREN, SIRET, code APE, KBis. Un petit glossaire des termes que
vous pourrez (éventuellement) rencontrer après la création.
+ {i18n.language === 'fr' && isAutoentrepreneur && (
+
+ Guide pratique Urssaf
+
+ Des conseils pour les auto-entrepreneurs : comment préparer son
+ projet pour se lancer dans la création et une présentation
+ détaillée de votre protection sociale.
+
+
+ PDF
+
+ )}
{isAutoentrepreneur && }
{i18n.language === 'fr' && ['EI', 'EIRL', 'EURL'].includes(statut) && (
- Guide Urssaf pour les travailleur indépendant
+
+ Guide Urssaf pour les travailleur indépendant
+
Des conseils sur comment préparer son projet pour se lancer dans
la création et une présentation détaillée de votre protection
@@ -542,7 +565,7 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
)}
-
+
)
}
@@ -569,7 +592,6 @@ const StatutsExample = ({ statut }: StatutsExampleProps) => {
}
export function RessourceAutoEntrepreneur() {
- const { i18n } = useTranslation()
return (
<>
@@ -578,7 +600,7 @@ export function RessourceAutoEntrepreneur() {
href="https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html"
target="_blank"
>
- Questions fréquentes
+ ❓ Questions fréquentes
Une liste exhaustive et maintenue à jour de toutes les questions
fréquentes (et moins fréquentes) que l'on est amené à poser en tant
@@ -586,31 +608,15 @@ export function RessourceAutoEntrepreneur() {
- {i18n.language === 'fr' && (
-
- Guide pratique Urssaf
-
- Des conseils pour les auto-entrepreneurs : comment préparer son
- projet pour se lancer dans la création et une présentation détaillée
- de votre protection sociale.
-
-
-
- PDF
-
-
- )}
- Comment déclarer son revenu aux impôts ?
+
+ 📑 Comment déclarer son revenu aux impôts ?
+
Les informations officielles de l'administration fiscale concernant
les auto-entrepreneurs et le régime de la micro-entreprise.
diff --git a/mon-entreprise/source/pages/Créer/GuideStatut/index.tsx b/mon-entreprise/source/pages/Créer/GuideStatut/index.tsx
index 7ff5b4fda..2e4c0ad8c 100644
--- a/mon-entreprise/source/pages/Créer/GuideStatut/index.tsx
+++ b/mon-entreprise/source/pages/Créer/GuideStatut/index.tsx
@@ -1,5 +1,5 @@
import { resetCompanyStatusChoice } from 'Actions/companyStatusActions'
-import Animate from 'Components/ui/animate'
+import { FromBottom } from 'Components/ui/animate'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { dropWhile, toPairs } from 'ramda'
import { useContext, useEffect } from 'react'
@@ -63,7 +63,7 @@ export default function Créer() {
Choix du statut juridique
-
+
@@ -84,7 +84,7 @@ export default function Créer() {
-
+
>
)
}
diff --git a/mon-entreprise/source/pages/Créer/Guide_Auto-Entrepreneur.pdf b/mon-entreprise/source/pages/Créer/Guide_Auto-Entrepreneur.pdf
deleted file mode 100644
index 00c5d8d08..000000000
Binary files a/mon-entreprise/source/pages/Créer/Guide_Auto-Entrepreneur.pdf and /dev/null differ
diff --git a/mon-entreprise/source/pages/Créer/Home.tsx b/mon-entreprise/source/pages/Créer/Home.tsx
index 6e749754b..d9c71b7a2 100644
--- a/mon-entreprise/source/pages/Créer/Home.tsx
+++ b/mon-entreprise/source/pages/Créer/Home.tsx
@@ -1,4 +1,5 @@
-import Animate from 'Components/ui/animate'
+import PageHeader from 'Components/PageHeader'
+import { FromBottom } from 'Components/ui/animate'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext } from 'react'
import { Helmet } from 'react-helmet'
@@ -19,52 +20,44 @@ export default function Créer() {
!!Object.keys(state.inFranceApp.companyLegalStatus).length
)
return (
-
+
{t('créer.titre', 'Créer une entreprise')}
+ Créer une entreprise
}
+ picture={créerSvg}
+ >
+
+
+ Avant d'entamer les démarches administratives pour créer votre
+ entreprise, vous devez choisir un statut juridique adapté à votre
+ activité
+
+
+
+ {!guideAlreadyStarted
+ ? t('créer.cta.default', 'Trouver le bon statut')
+ : t('créer.cta.continue', 'Continuer le guide')}
+
+
+
+ Le cas des professions libérales réglementées n'est pas encore
+ traité
+
+
+
-
- Créer une entreprise
-
-
-
-
-
- Avant d'entamer les démarches administratives pour créer votre
- entreprise, vous devez choisir un statut juridique adapté à votre
- activité
-
-
-
- {!guideAlreadyStarted
- ? t('créer.cta.default', 'Trouver le bon statut')
- : t('créer.cta.continue', 'Continuer le guide')}
-
-
-
- Le cas des professions libérales réglementées n'est pas encore
- traité
-
-
-
-
-
-
-
+
Ressources utiles
@@ -73,7 +66,7 @@ export default function Créer() {
to={sitePaths.créer.guideStatut.liste}
>
- Liste des statuts juridiques
+ Liste des statuts juridiques
Vous savez déjà quel statut choisir ? Accédez directement à la
liste des démarches associées
@@ -88,7 +81,7 @@ export default function Créer() {
}}
>
- Comparateur de régimes
+ Comparateur de régimes
Indépendant, assimilé-salarié ou auto-entrepreneur ? Calculez les
différences en terme de revenus, cotisations, retraite, etc
@@ -101,7 +94,7 @@ export default function Créer() {
to={sitePaths.créer['auto-entrepreneur']}
>
- Démarche auto-entrepreneur
+ Démarche auto-entrepreneur
Vous souhaitez devenir auto-entrepreneur ? Découvrez les étapes
pour bien démarrer votre activité
@@ -109,6 +102,6 @@ export default function Créer() {
-
+
)
}
diff --git a/mon-entreprise/source/pages/Dev/IntegrationTest.tsx b/mon-entreprise/source/pages/Dev/IntegrationTest.tsx
index d41b581aa..536272f15 100644
--- a/mon-entreprise/source/pages/Dev/IntegrationTest.tsx
+++ b/mon-entreprise/source/pages/Dev/IntegrationTest.tsx
@@ -7,7 +7,7 @@ export default function IntegrationTest() {
const integrableModuleNames = useMemo(
() =>
Object.values(simulators)
- .map((s) => s.iframe)
+ .map((s) => s.iframePath)
.filter(Boolean),
[simulators]
)
diff --git a/mon-entreprise/source/pages/Documentation.tsx b/mon-entreprise/source/pages/Documentation.tsx
index 5b4dc87d7..3b4e844e4 100644
--- a/mon-entreprise/source/pages/Documentation.tsx
+++ b/mon-entreprise/source/pages/Documentation.tsx
@@ -1,6 +1,5 @@
-import SearchBar from 'Components/SearchBar'
-import SearchButton from 'Components/SearchButton'
-import * as Animate from 'Components/ui/animate'
+import SearchRules from 'Components/search/SearchRules'
+import { FromBottom } from 'Components/ui/animate'
import { ThemeColorsProvider } from 'Components/utils/colors'
import { useEngine } from 'Components/utils/EngineContext'
import { ScrollToTop } from 'Components/utils/Scroll'
@@ -12,6 +11,8 @@ import { useSelector } from 'react-redux'
import { Redirect, useHistory, useLocation } from 'react-router-dom'
import { RootState } from 'Reducers/rootReducer'
import { TrackPage } from '../ATInternetTracking'
+import rules, { DottedName } from 'modele-social'
+import RuleLink from '../components/RuleLink'
export default function RulePage() {
const currentSimulation = useSelector(
@@ -32,11 +33,17 @@ export default function RulePage() {
if (pathname === '/documentation') {
return
}
+
+ if (pathname === '/documentation/dev') {
+ return
+ }
+
if (!documentationSitePaths[pathname]) {
return
}
+
return (
-
+
{currentSimulation ? : }
-
-
+
)
}
@@ -88,7 +94,21 @@ function DocumentationLanding() {
Documentation
Explorez toutes les règles de la documentation
-
+
+ >
+ )
+}
+
+function DocumentationRulesList() {
+ const ruleEntries = Object.keys(rules) as DottedName[]
+ return (
+ <>
+ Liste des règles
+ {ruleEntries.map((name) => (
+
+ {name}
+
+ ))}
>
)
}
diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx
new file mode 100644
index 000000000..e679a2f92
--- /dev/null
+++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx
@@ -0,0 +1,148 @@
+import { Explicable } from 'Components/conversation/Explicable'
+
+export function ExplicationsResultatFiscal() {
+ return (
+
+ <>
+ Quelles exonérations inclure ?
+
+ Pour calculer le montant du résultat fiscal avant déduction des
+ exonérations et des charges sociales à indiquer dans ce simulateur,
+ vous pouvez utiliser votre liasse fiscale, en reprenant les montants
+ indiqués dans les lignes fiscales du tableau ci-dessous, en fonction
+ de votre situation (imposition au réel normal ou au réel simplifié).
+
+ L’opération à effectuer est la suivante :
+
+
+ Déterminez le résultat fiscal dans votre liasse, sans déduire le
+ montant de vos cotisations et contributions sociales aux régimes
+ obligatoires de sécurité sociale. Prenez le résultat fiscal
+ correspondant (1)
+
+
+ Ajoutez les exonérations (2)
+
+
+
+
+
+
+
+ Exonérations (2)
+
+
+
+
+
+ Résultat fiscal (1)
+
+
+ Exonérations liées aux zones / activités
+
+
+ Exonérations Madelin et plan d’épargne retraite
+
+
+ Exonérations de plus-values à court terme
+
+ Suramortissement productif
+
+
+ BIC réel normal
+
+ 2058-A-SD
+
+ Ligne XN (bénéfice) Ligne XO (déficit)
+
+
+ 2058-A-SD
+
+ Lignes K9 / L6 / ØV / PP / L2 / 1F / PC / L5 / PA / XC / PB
+
+
+ 2053-SD
+
+ Lignes A7 et A8
+
+
+ 2058-A-SD
+
+ Ligne XG (montant inclus)
+
+
+ 2058-A-SD
+
+ Lignes X9 et YA
+
+
+
+ BIC réel simplifié
+
+ 2033-B-SD
+
+ Ligne 370 (bénéfice) Ligne 372 (déficit)
+
+
+ 2033 B-SD
+
+ Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 138 / 990 / 993
+
+
+ 2033-SD
+
+ Lignes 325 et 327
+
+
+ 2033 B-SD
+
+ Ligne 350 (montant inclus)
+
+
+ 2033 B-SD
+
+ Lignes 655 et 643
+
+
+
+ BNC déclaration contrôlée
+
+ 2035-B-SD
+
+ Ligne CP (bénéfice) Ligne CR (déficit)
+
+
+ 2035-B-SD
+
+ Lignes CS / AW / CU / CI / AX / CQ
+
+
+ 2035-A-SD
+
+ Lignes BZ et BU
+
+
+ 2035-A-SD
+
+ Ligne CL (montant inclus)
+
+
+
+
+ >
+
+ )
+}
diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx
new file mode 100644
index 000000000..5cfe8119c
--- /dev/null
+++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx
@@ -0,0 +1,104 @@
+import { updateSituation } from 'Actions/actions'
+import { ExplicableRule } from 'Components/conversation/Explicable'
+import RuleInput from 'Components/conversation/RuleInput'
+import { FromTop } from 'Components/ui/animate'
+import { EngineContext } from 'Components/utils/EngineContext'
+import { useNextQuestions } from 'Components/utils/useNextQuestion'
+import { DottedName } from 'modele-social'
+import { RuleNode } from 'publicodes'
+import { useCallback, useContext } from 'react'
+import { useDispatch, useSelector } from 'react-redux'
+import { situationSelector } from 'Selectors/simulationSelectors'
+import { Question } from './index'
+
+type SubSectionProp = {
+ dottedName: DottedName
+ hideTitle?: boolean
+}
+export function SubSection({
+ dottedName: sectionDottedName,
+ hideTitle = false,
+}: SubSectionProp) {
+ const engine = useContext(EngineContext)
+ const ruleTitle = engine.getRule(sectionDottedName)?.title
+ const nextSteps = useNextQuestions()
+ const situation = useSelector(situationSelector)
+ const title = hideTitle ? null : ruleTitle
+ const subQuestions = [
+ ...(Object.keys(situation) as Array),
+ ...nextSteps,
+ ].filter((nextStep) => {
+ const {
+ dottedName,
+ rawNode: { question },
+ } = engine.getRule(nextStep)
+ return !!question && dottedName.startsWith(sectionDottedName)
+ })
+
+ return (
+ <>
+ {!!subQuestions.length && title && {title} }
+ {subQuestions.map((dottedName) => (
+
+ ))}
+ >
+ )
+}
+type SimpleFieldProps = {
+ dottedName: DottedName
+ summary?: RuleNode['rawNode']['résumé']
+ question?: RuleNode['rawNode']['question']
+ showSuggestions?: boolean
+}
+export function SimpleField({
+ dottedName,
+ question,
+ summary,
+ showSuggestions,
+}: SimpleFieldProps) {
+ const dispatch = useDispatch()
+ const engine = useContext(EngineContext)
+ const evaluation = engine.evaluate(dottedName)
+ const rule = engine.getRule(dottedName)
+ const situation = useSelector(situationSelector)
+
+ const dispatchValue = useCallback(
+ (value, dottedName) => {
+ dispatch(updateSituation(dottedName, value))
+ },
+ [dispatch]
+ )
+
+ if (
+ !(dottedName in situation) &&
+ evaluation.nodeValue === false &&
+ !(dottedName in evaluation.missingVariables)
+ ) {
+ return null
+ }
+ return (
+
+
+
+
+
+ {question ?? rule.rawNode.question}
+
+
+
{summary ?? rule.rawNode.résumé}
+
+
+
+
+
+ )
+}
diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/FormulaireRésultatComplet.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/FormulaireRésultatComplet.tsx
new file mode 100644
index 000000000..e69de29bb
diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx
new file mode 100644
index 000000000..c7c038c56
--- /dev/null
+++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx
@@ -0,0 +1,172 @@
+import Value, { Condition } from 'Components/EngineValue'
+import RuleLink from 'Components/RuleLink'
+import { FromTop } from 'Components/ui/animate'
+import Emoji from 'Components/utils/Emoji'
+import { useEngine } from 'Components/utils/EngineContext'
+import { Markdown } from 'Components/utils/markdown'
+import { Trans } from 'react-i18next'
+
+export default function ResultatsSimples() {
+ const engine = useEngine()
+
+ return (
+
+
+
+ {' '}
+
+ Montants à reporter dans votre déclaration de revenus
+
+
+
+ L'ancienne Déclaration Sociale des Indépendant (DSI) qui était
+ précédemment à effectuer sur le site net-entreprises.fr est désormais
+ intégrée à la déclaration fiscale des revenus (déclaration 2042) sur
+ impots.gouv.fr.{' '}
+
+ En savoir plus
+
+
+
+ Vous pouvez reporter les montants suivants dans votre déclaration,
+ calculés à partir des informations saisies.
+
+ {(
+ [
+ 'aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires',
+ 'aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible',
+ ] as const
+ ).map((dottedName) => {
+ const r = engine.getRule(dottedName)
+ if (engine.evaluate(dottedName).nodeValue === false) {
+ return null
+ }
+ return (
+
+
+
+ {r.title}
+
+ {r.rawNode.résumé}
+
+
+
+
+
+
+
+
+
+ {r.rawNode.description && (
+
+
+
+ )}
+
+
+ )
+ })}
+
+
+ Pour votre information{' '}
+
+
+ {(
+ [
+ 'aide déclaration revenu indépendant 2020 . réduction covid . total',
+ 'aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal',
+ 'aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible',
+ 'aide déclaration revenu indépendant 2020 . résultat simple . CFP',
+ 'aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale',
+ ] as const
+ ).map((dottedName) => {
+ const r = engine.getRule(dottedName)
+ if (engine.evaluate(dottedName).nodeValue === false) {
+ return null
+ }
+ return (
+
+
+
+ {' '}
+ {r.rawNode.résumé}
+
+
+ {r.rawNode.description && (
+
+
+
+ )}
+
+
+
+
+
+
+
+ )
+ })}
+
+
+
+
+ )
+}
diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx
new file mode 100644
index 000000000..d400c6e0d
--- /dev/null
+++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx
@@ -0,0 +1,162 @@
+import { Explicable } from 'Components/conversation/Explicable'
+import Value, { Condition } from 'Components/EngineValue'
+import RuleLink from 'Components/RuleLink'
+import { FromTop } from 'Components/ui/animate'
+import Emoji from 'Components/utils/Emoji'
+import { useEngine } from 'Components/utils/EngineContext'
+import { Markdown } from 'Components/utils/markdown'
+import { DottedName } from 'modele-social'
+import { useMemo } from 'react'
+import { Trans } from 'react-i18next'
+
+export default function ResultatsParFormulaire() {
+ const engine = useEngine()
+ const informations = (Object.keys(engine.getParsedRules()) as DottedName[])
+ .filter((s) =>
+ s.startsWith(
+ 'aide déclaration revenu indépendant 2020 . informations résultat par formulaire . '
+ )
+ )
+ .map((dottedName) => engine.getRule(dottedName))
+ return (
+
+
+
+ {' '}
+
+ Vos déclarations fiscales
+
+
+
+ Important : les montants affichés ici concernent uniquement le calcul
+ des cotisations de l'exploitant (et du conjoint collaborateur si
+ présent). Les rubriques avec le symbole (+) signifient qu'il vous
+ faudra peut-être ajouter d'autres éléments au montant affiché pour une
+ déclaration correcte.{' '}
+
+
En cas de doute, référez-vous à votre expert comptable.
+ {(
+ [
+ 'aide déclaration revenu indépendant 2020 . formulaire 2035',
+ 'aide déclaration revenu indépendant 2020 . formulaire 2033',
+ 'aide déclaration revenu indépendant 2020 . formulaire 2050',
+ 'aide déclaration revenu indépendant 2020 . formulaire 2042',
+ 'aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C',
+ ] as const
+ ).map((dottedName) => (
+
+ ))}
+
+
+ Pour votre information{' '}
+
+
+ {informations.map((r) => (
+
+
+
+
+
+
+ {r.rawNode.résumé}
+
+
+ {r.rawNode.description && (
+
+
+
+ )}
+
+
+
+
+
+
+ ))}
+
+
+
+
+ )
+}
+
+function DeclarationForm({ dottedName }: { dottedName: DottedName }) {
+ const engine = useEngine()
+ const r = engine.getRule(dottedName)
+ const rubriques = useMemo(
+ () =>
+ Object.keys(engine.getParsedRules()).filter((name) =>
+ name.startsWith(dottedName + ' . ')
+ ),
+ [engine, dottedName]
+ ) as DottedName[]
+ return (
+
+
+
+
+ {r.title} {r.rawNode.résumé}
+
+
+ {rubriques
+ .map((dottedName) => engine.getRule(dottedName))
+ .map((node) => (
+
+
+
+
+ {node.rawNode.résumé}
+ {node.rawNode.description && (
+
+
+
+
+
+ )}
+
+
+
+ {node.title} :{' '}
+
+ {' '}
+ {/*
+ */}
+
+
+
+ ))}
+
+
+
+
+ )
+}
diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml
index 887e6f1b9..ebdf09f27 100644
--- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml
+++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml
@@ -1,13 +1,15 @@
objectifs:
- - aide déclaration revenu indépendant 2020 . revenu net fiscal
- - aide déclaration revenu indépendant 2020 . CSG déductible
- - aide déclaration revenu indépendant 2020 . cotisations sociales déductible
- - aide déclaration revenu indépendant 2020 . CFP
- - aide déclaration revenu indépendant 2020 . total charges sociales déductible
- - aide déclaration revenu indépendant 2020 . assiette sociale
+ - aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles
+ - dirigeant . rémunération . totale
+ - dirigeant . rémunération . nette
+ - aide déclaration revenu indépendant 2020 . formulaire 2033
+ - aide déclaration revenu indépendant 2020 . formulaire 2050
+ - aide déclaration revenu indépendant 2020 . formulaire 2042
+ - aide déclaration revenu indépendant 2020 . formulaire 2035
situation:
dirigeant: "'indépendant'"
aide déclaration revenu indépendant 2020: oui
dirigeant . indépendant . PL . CIPAV: non # TODO En attendant la transitivité des remplacements
+ impôt: non
unité par défaut: '€/an'
diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx
index 05fbe11b0..b62ee3e8b 100644
--- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx
+++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx
@@ -1,21 +1,14 @@
import { updateSituation } from 'Actions/actions'
import Aide from 'Components/conversation/Aide'
-import { Explicable, ExplicableRule } from 'Components/conversation/Explicable'
import RuleInput from 'Components/conversation/RuleInput'
-import Value, { Condition } from 'Components/EngineValue'
-import RuleLink from 'Components/RuleLink'
+import { Condition } from 'Components/EngineValue'
+import PageHeader from 'Components/PageHeader'
+import PreviousSimulationBanner from 'Components/PreviousSimulationBanner'
import 'Components/TargetSelection.css'
-import Animate from 'Components/ui/animate'
+import { FromTop } from 'Components/ui/animate'
import Warning from 'Components/ui/WarningBlock'
-import { EngineContext, useEngine } from 'Components/utils/EngineContext'
-import { ScrollToTop } from 'Components/utils/Scroll'
-import useDisplayOnIntersecting from 'Components/utils/useDisplayOnIntersecting'
-import { useNextQuestions } from 'Components/utils/useNextQuestion'
import useSimulationConfig from 'Components/utils/useSimulationConfig'
-import { DottedName } from 'modele-social'
-import { RuleNode } from 'publicodes'
-import { Fragment, useCallback, useContext } from 'react'
-import emoji from 'react-easy-emoji'
+import { useCallback } from 'react'
import { Trans } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { RootState } from 'Reducers/rootReducer'
@@ -24,424 +17,290 @@ import styled from 'styled-components'
import { TrackPage } from '../../../ATInternetTracking'
import { CompanySection } from '../Home'
import simulationConfig from './config.yaml'
+import { ExplicationsResultatFiscal } from './ExplicationResultatFiscal'
+import { SimpleField, SubSection } from './Fields'
+import ResultatsSimples from './RésultatSimple'
+import ResultatsParFormulaire from './RésultatsParFormulaire'
+import illustration from './undraw_fill_in_mie5.svg'
+
+/**
+ * Nous avons proposé une nouvelle vision des résultat plus complète, avec une proposition d'aide pour
+ * l'ensemble des cases liées aux cotisations sociales.
+ *
+ * Hors de propos pour 2021, étant donné que cela prendrait beaucoup de temps à valider par la DGFiP
+ * En attendant, on propose la version "simple" (mais moins utile).
+ *
+ * Le but est de faire valider la version plus complète pour la déclaration de revenu 2021.
+ */
+const FEATURE_FLAG_RESULTATS_COMPLETS =
+ document.location.search.includes('next')
export default function AideDéclarationIndépendant() {
useSimulationConfig(simulationConfig)
- const dispatch = useDispatch()
- const engine = useEngine()
const company = useSelector(
(state: RootState) => state.inFranceApp.existingCompany
)
-
- const [resultsRef, resultsInViewPort] = useDisplayOnIntersecting({
- threshold: 0.5,
- unobserve: false,
- })
- const setCurrentIncome = useCallback(
- (currentIncome) => {
- dispatch(
- updateSituation('dirigeant . rémunération totale', currentIncome)
- )
- },
- [dispatch, updateSituation]
- )
- const displayForm =
- engine.evaluate('dirigeant . rémunération totale').nodeValue !== null
-
+ const situation = useSelector(situationSelector)
return (
-
-
+ <>
- Aide à la déclaration de revenus au titre de l'année 2020
-
- Cet outil est une aide aux déclarations fiscale (revenu) et sociale (
- DSI ) à
- destination des travailleurs indépendants. Il vous permet de connaître
- le montant des charges sociales déductibles à partir de votre résultat
- net fiscal.
-
-
- Vous restez entièrement responsable d'éventuelles omissions ou
- inexactitudes dans vos déclarations.
-
-
-
-
- Cet outil vous concerne si vous êtes dans tous les cas suivants :
-
-
-
- vous cotisez au régime général des travailleurs indépendants
-
-
- votre entreprise est au régime réel d'imposition et en
- comptabilité d'engagement
-
-
-
- Il ne vous concerne pas si vous êtes dans un des cas suivants :
-
-
-
- vous exercez une activité libérale relevant d’un régime de
- retraite des professions libérales
-
-
- vous êtes gérants de société relevant de l’impôt sur les
- sociétés
-
- vous avez opté pour le régime micro-fiscal
- votre entreprise est domiciliée dans les DOM
-
-
-
-
- Quel est votre résultat fiscal en 2020 ?
-
- Charges sociales et exonérations fiscales non incluses{' '}
-
-
-
+
+
+ Cet outil est une aide à la déclaration de revenus à destination des{' '}
+ travailleurs indépendants . Il vous permet de
+ connaître le montant des charges sociales déductibles.
+
+
+ Vous restez entièrement responsable d'éventuelles omissions ou
+ inexactitudes dans votre déclaration.
+
+
+
+ Cet outil vous concerne si vous êtes dans le cas suivant :
+
+
+ vous cotisez au régime général des travailleurs indépendants
+
+
+
+ Il ne vous concerne pas si vous êtes dans un des cas suivants :
+
+
+
+ vous exercez une activité libérale relevant d’un régime de
+ retraite des professions libérales en comptabilité d'engagement
+
+ votre entreprise est domiciliée dans les DOM
+
+
+
+
+ Imposition
- Le résultat fiscal correspond aux produits moins les charges. Il peut
- être positif (bénéfice) ou négatif (déficit).
+ Ces quelques questions permettent de déterminer le type de déclaration
+ à remplir, ainsi que les modalités de calcul des cotisations sociales.
-
-
-
- {displayForm ? (
+ {Object.keys(situation).length ? (
) : (
)}
- {displayForm && (
- <>
-
-
-
- Entreprise et activité
-
-
- {!company && (
-
-
- Facultatif : Vous pouvez renseigner votre
- entreprise pour pré-remplir le formulaire
-
-
- )}
-
-
-
-
- {/* PLNR */}
-
-
-
-
-
-
- Situation personnelle
-
-
+
+
+
+
+
+
+ Entreprise et activité
+
+
+ {!company && (
+
+
+ Facultatif : Vous pouvez renseigner votre
+ entreprise pour pré-remplir le formulaire
+
+
+ )}
+
+
+
+
+
+ Cette aide à la déclaration concerne uniquement les entreprises
+ déjà en activité en 2020
+
+
+
+
+ {/* PLNR */}
+
+
+
+
+
+ Situation personnelle
+
+
+
-
+
+
-
- Exonérations
-
-
-
-
-
-
-
-
- International
-
-
+
+ Exonérations
+
+
+
+
+
+ {FEATURE_FLAG_RESULTATS_COMPLETS && (
+
+ )}
+
+ International
+
+
+
-
-
+
+
+
-
-
-
-
+
+
+
+
+
+ {/* We can't use a subsection here cause revenu étrangers is not missing when CSG is replaced */}
+
+ Revenus étranger
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {FEATURE_FLAG_RESULTATS_COMPLETS ? (
+ <>
+
+
+
+
+
>
+ ) : (
+
)}
-
- )
-}
-type SubSectionProp = {
- dottedName: DottedName
- hideTitle?: boolean
-}
-function ExplicationsResultatFiscal() {
- return (
-
- <>
- Quelles exonérations inclure ?
-
- Pour calculer le montant du résultat fiscal avant déduction des
- exonérations et des charges sociales à indiquer dans ce simulateur,
- vous pouvez utiliser votre liasse fiscale, en reprenant les montants
- indiqués dans les lignes fiscales du tableau ci-dessous, en fonction
- de votre situation (imposition au réel normal ou au réel simplifié).
-
- L’opération à effectuer est la suivante :
-
-
- Déterminez le résultat fiscal dans votre liasse, sans déduire le
- montant de vos cotisations et contributions sociales aux régimes
- obligatoires de sécurité sociale. Prenez le résultat fiscal
- correspondant (1)
-
-
- Ajoutez les exonérations (2)
-
-
-
-
-
-
- Résultat fiscal (1)
-
-
- Exonérations (2)
-
-
-
-
-
- Exonérations liées aux zones / activités
- Exonérations Madelin et plan d’épargne retraite
- Exonérations de plus-values à court terme
- Suramortissement productif
-
-
- BIC réel normal
-
- 2058-A-SD
-
- Ligne XN (bénéfice) Ligne XO (déficit)
-
-
- 2058-A-SD
-
- Lignes K9 / L6 / ØV / PP / L2 / 1F / L5 / PA / XC / PB
-
-
- 2053-SD
-
- Lignes A7 et A8
-
-
- 2058-A-SD
-
- Ligne XG (montant inclus)
-
-
- 2058-A-SD
-
- Lignes X9 et YA
-
-
-
- BIC réel simplifié
-
- 2033-B-SD
-
- Ligne 370 (bénéfice) Ligne 372 déficit)
-
-
- 2033 B-SD
-
- Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 990 / 993
-
-
- 2033-SD
-
- Lignes 325 et 327
-
-
- 2033 B-SD
-
- Ligne 350 (montant inclus)
-
-
- 2033 B-SD
-
- Lignes 655 et 643
-
-
-
- >
-
- )
-}
-
-function SubSection({
- dottedName: sectionDottedName,
- hideTitle = false,
-}: SubSectionProp) {
- const engine = useContext(EngineContext)
- const ruleTitle = engine.getRule(sectionDottedName)?.title
- const nextSteps = useNextQuestions()
- const situation = useSelector(situationSelector)
- const title = hideTitle ? null : ruleTitle
- const subQuestions = [
- ...(Object.keys(situation) as Array),
- ...nextSteps,
- ].filter((nextStep) => {
- const {
- dottedName,
- rawNode: { question },
- } = engine.getRule(nextStep)
- return !!question && dottedName.startsWith(sectionDottedName)
- })
-
- return (
- <>
- {!!subQuestions.length && title && {title} }
- {subQuestions.map((dottedName) => (
-
- ))}
+
>
)
}
-type SimpleFieldProps = {
- dottedName: DottedName
- summary?: RuleNode['rawNode']['résumé']
- question?: RuleNode['rawNode']['question']
-}
-function SimpleField({ dottedName, question, summary }: SimpleFieldProps) {
+function ImpositionSection() {
const dispatch = useDispatch()
- const engine = useContext(EngineContext)
- const evaluation = engine.evaluate(dottedName)
- const rule = engine.getRule(dottedName)
+
const situation = useSelector(situationSelector)
-
- const dispatchValue = useCallback(
- (value) => {
+ const setSituation = useCallback(
+ (value, dottedName) => {
dispatch(updateSituation(dottedName, value))
- dispatch({
- type: 'STEP_ACTION',
- name: 'fold',
- step: dottedName,
- })
},
- [dispatch, dottedName]
+ [dispatch]
)
-
- if (
- !(dottedName in situation) &&
- evaluation.nodeValue === false &&
- !(dottedName in evaluation.missingVariables)
- ) {
- return null
- }
return (
-
-
-
-
+
+ {situation['entreprise . imposition'] != null && (
+ <>
+ {/*
*/}
+
+ {/* */}
+
-
- {question ?? rule.rawNode.question}
-
-
- {summary ?? rule.rawNode.résumé}
-
-
-
-
-
+
+
+
+
+
+ Quel est votre chiffre d'affaires hors taxes en 2020 ?
+
+
+ Indiquez le montant hors taxes de votre chiffre d’affaires
+ ou de vos recettes bruts (avant déduction de l’abattement
+ forfaitaire pour frais et charges) et avant déduction des
+ exonérations fiscales dont vous avez bénéficié
+
+
+
+
+
+
+
+ Quel est votre résultat fiscal en 2020 ?
+
+ Charges sociales et exonérations fiscales non incluses{' '}
+
+
+
+
+ Le résultat fiscal correspond aux produits moins les
+ charges. Il peut être positif (bénéfice) ou négatif
+ (déficit).
+
+
+
+
+
+
+
+
+ Quel est le montant net de votre rémunération en 2020 ?
+
+ Sans tenir compte des charges sociales
+
+
+
+
+
+
+
+ >
+ )}
+ >
)
}
-function Results() {
- const engine = useEngine()
- const rules = (simulationConfig.objectifs as DottedName[]).map((objectif) =>
- engine.getRule(objectif)
- )
- return (
-
-
-
- Aide à la déclaration
-
- {emoji('📄')}
-
- <>
-
- {rules.map((r) => (
-
-
- {r.title} {r.rawNode.résumé}
-
- {r.rawNode.description && (
- {r.rawNode.description}
- )}
-
-
-
-
-
-
- ))}
-
- >
-
- )
-}
+export const Question = styled.div`
+ margin-top: 1em;
+`
+const BigInput = styled.div`
+ font-size: 130%;
+`
const FormBlock = styled.section`
max-width: 500px;
@@ -453,7 +312,6 @@ const FormBlock = styled.section`
h2 {
border-top: 1px solid var(--lighterColor);
padding-top: 2rem;
- break-after: avoid;
}
select,
@@ -466,10 +324,3 @@ const FormBlock = styled.section`
margin: 0;
}
`
-
-const Question = styled.div`
- margin-top: 1em;
-`
-const BigInput = styled.div`
- font-size: 130%;
-`
diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/undraw_fill_in_mie5.svg b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/undraw_fill_in_mie5.svg
new file mode 100644
index 000000000..b02a345f3
--- /dev/null
+++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/undraw_fill_in_mie5.svg
@@ -0,0 +1 @@
+fill_in
\ No newline at end of file
diff --git a/mon-entreprise/source/pages/Gérer/AideOrganismeLocal.tsx b/mon-entreprise/source/pages/Gérer/AideOrganismeLocal.tsx
index 656d7de65..5338106b1 100644
--- a/mon-entreprise/source/pages/Gérer/AideOrganismeLocal.tsx
+++ b/mon-entreprise/source/pages/Gérer/AideOrganismeLocal.tsx
@@ -1,7 +1,7 @@
+import { FromTop } from 'Components/ui/animate'
import { useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import { RootState } from 'Reducers/rootReducer'
-import animate from 'Components/ui/animate'
import aideOrganismeSvg from './aideOrganisme.svg'
const aideMidiPyrenéesAutoEntrepreneur = (state: RootState) => {
@@ -26,7 +26,7 @@ export default function AideOrganismeLocal() {
return null
}
return (
-
+
-
+
)
}
diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/EndBlock.tsx b/mon-entreprise/source/pages/Gérer/DemandeMobilite/EndBlock.tsx
index 107fb5baf..0d57895cf 100644
--- a/mon-entreprise/source/pages/Gérer/DemandeMobilite/EndBlock.tsx
+++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/EndBlock.tsx
@@ -2,10 +2,10 @@ import { BlobProvider } from '@react-pdf/renderer'
import Overlay from 'Components/Overlay'
import Checkbox from 'Components/ui/Checkbox'
import { ThemeColorsContext } from 'Components/utils/colors'
+import Emoji from 'Components/utils/Emoji'
import { EngineContext, EngineProvider } from 'Components/utils/EngineContext'
import { RuleNode } from 'publicodes/dist/types/rule'
import { lazy, Suspense, useContext, useRef, useState } from 'react'
-import emoji from 'react-easy-emoji'
import SignaturePad from 'react-signature-pad-wrapper'
import { TrackingContext, TrackPage } from '../../../ATInternetTracking'
import PDFDocument from './PDFDocument'
@@ -94,7 +94,7 @@ export default function EndBlock({ fields, isMissingValues }: EndBlockProps) {
className="ui__ simple small button"
onClick={() => signatureRef.current?.clear()}
>
- {emoji('🗑️')} Recommencer{' '}
+ Recommencer{' '}
diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/FieldsPDF.tsx b/mon-entreprise/source/pages/Gérer/DemandeMobilite/FieldsPDF.tsx
index 2337ded79..73b14b3e6 100644
--- a/mon-entreprise/source/pages/Gérer/DemandeMobilite/FieldsPDF.tsx
+++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/FieldsPDF.tsx
@@ -34,10 +34,12 @@ export default function FieldsPDF({ fields }: FieldsPDFProps) {
{formatValue(engine.evaluate(dottedName)) +
(API === 'commune'
? ` (${
- (engine.evaluate(dottedName).nodeValue as Record<
- string,
- unknown
- >)?.codePostal as string
+ (
+ engine.evaluate(dottedName).nodeValue as Record<
+ string,
+ unknown
+ >
+ )?.codePostal as string
})`
: '')}{' '}
diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/demande-mobilité.yaml b/mon-entreprise/source/pages/Gérer/DemandeMobilite/demande-mobilité.yaml
index adad3bb6b..a1747471e 100644
--- a/mon-entreprise/source/pages/Gérer/DemandeMobilite/demande-mobilité.yaml
+++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/demande-mobilité.yaml
@@ -25,7 +25,7 @@ coordonnées assuré . date de naissance:
type: date
note: 1.5
-coordonnées assuré . commune de naissance:
+coordonnées assuré . commune de naissance:
type: groupe
formule: oui
note: 1.7
@@ -51,7 +51,7 @@ coordonnées assuré . domicile personnel . commune . étranger:
coordonnées assuré . domicile personnel . adresse:
type: texte
note: 1.9.1
-coordonnées assuré . domicile personnel . commune:
+coordonnées assuré . domicile personnel . commune:
formule: oui
note: 1.9.2 / 1.9.3
coordonnées assuré . domicile personnel . commune . commune:
@@ -64,8 +64,6 @@ coordonnées assuré . domicile personnel . commune . étranger . code postal:
coordonnées assuré . domicile personnel . commune . étranger . pays:
type: texte
-
-
coordonnées assuré . contact:
type: groupe
formule: oui
@@ -90,7 +88,7 @@ activité france . adresse:
activité france . commune:
API: commune
note: 4.4.3 / 4.4.4
-
+
activité france . organisme urssaf:
type: texte
titre: Organisme Urssaf
@@ -153,7 +151,6 @@ détachement . pays . autre:
titre: Nom du pays
type: texte
-
détachement . date de début:
type: date
note: 2.2
@@ -199,7 +196,7 @@ activité transfrontalière simultanée:
formule: oui
titre: Demande d'activité transfrontalière simultanée
type: groupe
-
+
activité transfrontalière simultanée . salarié hors France:
question: >
Travaillez-vous en tant que salarié dans un autre pays ?
@@ -262,11 +259,11 @@ activité transfrontalière simultanée . activité salariée . lieu d'exercice
description: Votre activité salariée peut être exercée depuis un autre pays que celui de l'employeur par exemple en cas de télétravail.
activité transfrontalière simultanée . activité salariée . lieu d'exercice . lieu de résidence:
- question: Exercerez-vous cette activité salariée dans votre pays de résidence ?
+ question: Exercerez-vous cette activité salariée dans votre pays de résidence ?
non applicable si: employeur
-
+
activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays:
- non applicable si:
+ non applicable si:
une de ces conditions:
- lieu de résidence
- employeur
@@ -278,7 +275,6 @@ activité transfrontalière simultanée . activité salariée . lieu d'exercice
titre: Nom du pays
type: texte
-
activité transfrontalière simultanée . activité salariée . revenus:
titre: Revenus salariés
type: groupe
@@ -293,7 +289,6 @@ activité transfrontalière simultanée . activité salariée . revenus . nombre
unité: heures/semaine
question: Quel est le temps de travail hebdomadaire inscrit au contrat de travail ?
-
activité transfrontalière simultanée . activité salariée . revenus . revenu:
question: Quel revenu estimez-vous obtenir pour cette activité salariée pour les 12 prochains mois (environ) ?
type: nombre
@@ -309,8 +304,6 @@ activité transfrontalière simultanée . activité salariée . revenus . articu
question: Comment votre activité salariée s'articulera-t-elle avec votre activité indépendante au cours des 12 prochains mois (périodes, revenu, etc.) ?
type: paragraphe
-
-
activité transfrontalière simultanée . activité salariée . activité indépendante additionnelle:
question: >
Exercez-vous également une activité non salariée à l'étranger ?
@@ -338,7 +331,6 @@ activité transfrontalière simultanée . activité non salariée . nombre:
plancher: 1
plafond: 3
-
activité transfrontalière simultanée . activité non salariée . n°1:
titre: activité non salarié n°1
type: groupe
diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx b/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx
index c39ced1ca..86b48b2e8 100644
--- a/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx
+++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx
@@ -1,14 +1,15 @@
import { Explicable } from 'Components/conversation/Explicable'
import RuleInput from 'Components/conversation/RuleInput'
import { Condition } from 'Components/EngineValue'
-import * as Animate from 'Components/ui/animate'
+import PageHeader from 'Components/PageHeader'
+import { FromTop } from 'Components/ui/animate'
import Emoji from 'Components/utils/Emoji'
import { EngineContext, EngineProvider } from 'Components/utils/EngineContext'
import { Markdown } from 'Components/utils/markdown'
import { usePersistingState } from 'Components/utils/persistState'
import { DottedName } from 'modele-social'
import Engine, { UNSAFE_isNotApplicable } from 'publicodes'
-import { equals, isEmpty } from 'ramda'
+import { equals, isEmpty, omit } from 'ramda'
import {
createElement,
lazy,
@@ -17,7 +18,6 @@ import {
useContext,
useState,
} from 'react'
-import emoji from 'react-easy-emoji'
import { TrackPage } from '../../../ATInternetTracking'
import { hash } from '../../../utils'
import formulaire from './demande-mobilité.yaml'
@@ -28,13 +28,16 @@ export default function FormulaireMobilitéIndépendant() {
const engine = new Engine(formulaire)
return (
- Demande de mobilité internationale pour travailleur indépendant
-
-
+
+
Travailleur indépendant exerçant son activité à l’étranger : Régime de
Sécurité sociale applicable{' '}
-
-
+
+
Vous exercez une activité non salariée ou salariée dans un ou plusieurs
Etats (pays) membres de l’UE, de l’
@@ -66,7 +69,9 @@ export default function FormulaireMobilitéIndépendant() {
- Attention : ce document doit être signé {emoji('✍️')}
+
+ Attention : ce document doit être signé
+
Aussi, nous vous invitons à utiliser un écran tactile pour le
@@ -123,10 +128,14 @@ function FormulairePublicodes() {
)
const onChange = useCallback(
(dottedName, value) => {
- setSituation((situation) => ({
- ...situation,
- [dottedName]: value,
- }))
+ if (value === undefined) {
+ setSituation((situation) => omit([dottedName], situation))
+ } else {
+ setSituation((situation) => ({
+ ...situation,
+ [dottedName]: value,
+ }))
+ }
},
[setSituation]
)
@@ -146,10 +155,10 @@ function FormulairePublicodes() {
)
return (
-
+
{fields.map(
({ rawNode: { description, type, question }, title, dottedName }) => (
-
+
{type === 'groupe' ? (
<>
{createElement(
@@ -197,7 +206,7 @@ function FormulairePublicodes() {
/>
>
)}
-
+
)
)}
@@ -220,6 +229,6 @@ function FormulairePublicodes() {
) : isMissingValues ? (
) : null}
-
+
)
}
diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/undraw_Traveling_re_weve.svg b/mon-entreprise/source/pages/Gérer/DemandeMobilite/undraw_Traveling_re_weve.svg
new file mode 100644
index 000000000..3d036e4c5
--- /dev/null
+++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/undraw_Traveling_re_weve.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/mon-entreprise/source/pages/Gérer/Embaucher.tsx b/mon-entreprise/source/pages/Gérer/Embaucher.tsx
index 32667e14d..37195af26 100644
--- a/mon-entreprise/source/pages/Gérer/Embaucher.tsx
+++ b/mon-entreprise/source/pages/Gérer/Embaucher.tsx
@@ -2,13 +2,14 @@ import {
checkHiringItem,
initializeHiringChecklist,
} from 'Actions/hiringChecklistAction'
-import Animate from 'Components/ui/animate'
+import { FromBottom } from 'Components/ui/animate'
import { CheckItem, Checklist, ChecklistProps } from 'Components/ui/Checklist'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { connect, useSelector } from 'react-redux'
import { RootState } from 'Reducers/rootReducer'
import { TrackPage } from '../../ATInternetTracking'
+import { SimulatorRessourceCard } from '../Simulateurs/Page'
type EmbaucherProps = {
onChecklistInitialization: ChecklistProps['onInitialization']
@@ -21,7 +22,7 @@ function Embaucher({ onChecklistInitialization, onItemCheck }: EmbaucherProps) {
(state: RootState) => state.inFranceApp.hiringChecklist
)
return (
-
+
@@ -216,7 +217,15 @@ function Embaucher({ onChecklistInitialization, onItemCheck }: EmbaucherProps) {
Remettre la fiche de paie à votre employé
-
+
+
+ Ressources utiles
+
+
+
+
+
+
)
}
diff --git a/mon-entreprise/source/pages/Gérer/Home.tsx b/mon-entreprise/source/pages/Gérer/Home.tsx
index 8a14b5640..8185a3814 100644
--- a/mon-entreprise/source/pages/Gérer/Home.tsx
+++ b/mon-entreprise/source/pages/Gérer/Home.tsx
@@ -6,11 +6,12 @@ import {
import CompanyDetails from 'Components/CompanyDetails'
import FindCompany from 'Components/FindCompany'
import Overlay from 'Components/Overlay'
-import * as Animate from 'Components/ui/animate'
+import PageHeader from 'Components/PageHeader'
+import { FromBottom } from 'Components/ui/animate'
+import Emoji from 'Components/utils/Emoji'
import { ScrollToTop } from 'Components/utils/Scroll'
-import { SitePathsContext } from 'Components/utils/SitePathsContext'
+import { SitePaths, SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext, useEffect, useRef, useState } from 'react'
-import emoji from 'react-easy-emoji'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
@@ -21,22 +22,33 @@ import { TrackPage } from '../../ATInternetTracking'
import AideOrganismeLocal from './AideOrganismeLocal'
import businessPlan from './businessPlan.svg'
-const infereDirigeantFromCompanyDetails = (company: Company | null) => {
+const infereDirigeantFromCompanyDetails = (
+ company: Company | null
+): Exclude<
+ keyof SitePaths['simulateurs'],
+ 'index' | 'profession-libérale' | 'économieCollaborative'
+> | null => {
if (!company) {
return null
}
if (company.isAutoEntrepreneur) {
return 'auto-entrepreneur'
}
+ if (company.statutJuridique === 'EI') {
+ return 'entreprise-individuelle'
+ }
if (
- ['EI', 'EURL'].includes(company.statutJuridique ?? '') ||
- (company.statutJuridique === 'SARL' && company.isDirigeantMajoritaire)
+ company.statutJuridique &&
+ ['EIRL', 'SASU', 'EURL'].includes(company.statutJuridique)
) {
+ return company.statutJuridique.toLowerCase() as 'eirl' | 'sasu' | 'eurl'
+ }
+ if (company.statutJuridique === 'SARL' && company.isDirigeantMajoritaire) {
return 'indépendant'
}
- if (['SASU', 'SAS'].includes(company.statutJuridique ?? '')) {
- return 'SASU'
+ if (company.statutJuridique === 'SAS') {
+ return 'sasu'
}
return null
@@ -57,35 +69,28 @@ export default function Gérer() {
-
-
- Gérer mon activité
-
-
-
- {!company && (
-
-
- Vous souhaitez vous verser un revenu ou embaucher ?
- Vous aurez à payer des cotisations et des impôts.
- Anticipez leurs montants grâce aux simulateurs adaptés à votre
- situation.
-
-
- )}
-
-
-
-
-
+
+ Gérer mon activité}
+ >
+ {!company && (
+
+
+ Vous souhaitez vous verser un revenu ou embaucher ?
+ Vous aurez à payer des cotisations et des impôts.
+ Anticipez leurs montants grâce aux simulateurs adaptés à votre
+ situation.
+
+
+ )}
+
+
<>
- {company?.statutJuridique === 'EI' &&
+ {(company?.statutJuridique === 'EI' ||
+ company?.statutJuridique === 'SARL') &&
!company.isAutoEntrepreneur && (
-
{emoji('✍')}
+
+
+
Remplir ma déclaration de revenus
Calculez facilement les montants des charges sociales à
reporter dans votre déclaration de revenu au titre de
- 2019
+ 2020
@@ -118,7 +125,9 @@ export default function Gérer() {
},
}}
>
-
{emoji('💶')}
+
+
+
Calculer mon revenu net de cotisations
@@ -139,7 +148,9 @@ export default function Gérer() {
pathname: sitePaths.simulateurs['chômage-partiel'],
}}
>
-
{emoji('🕟')}
+
+
+
Activité partielle
@@ -156,12 +167,15 @@ export default function Gérer() {
className="ui__ interactive card box light-border"
to={{
pathname: sitePaths.simulateurs.salarié,
+ search: '?view=employeur',
state: {
fromGérer: true,
},
}}
>
-
{emoji('🤝')}
+
+
+
Estimer le montant d’une embauche
@@ -182,7 +196,9 @@ export default function Gérer() {
},
}}
>
-
{emoji('🗓')}
+
+
+
Estimer le montant de l’impôt sur les sociétés
@@ -200,8 +216,8 @@ export default function Gérer() {
-
- {emoji('🧰 ')}
+
+
Ressources utiles
@@ -213,7 +229,9 @@ export default function Gérer() {
to={sitePaths.gérer.formulaireMobilité}
>
- Exporter son activité en Europe
+
+ Exporter son activité en Europe
+
Le formulaire pour effectuer une demande de mobilité
internationale (détachement ou pluriactivité)
@@ -227,7 +245,9 @@ export default function Gérer() {
to={sitePaths.gérer.embaucher}
>
- Découvrir les démarches d’embauche
+
+ Découvrir les démarches d’embauche{' '}
+
La liste des choses à faire pour être sûr de ne rien oublier
lors de l’embauche d’un nouveau salarié
@@ -241,7 +261,9 @@ export default function Gérer() {
href="https://autoentrepreneur.urssaf.fr"
>
- Accéder au site officiel auto-entrepreneur
+
+ Accéder au site officiel auto-entrepreneur
+
Vous pourrez effectuer votre déclaration de chiffre
d'affaires, payer vos cotisations, et plus largement trouver
@@ -256,7 +278,7 @@ export default function Gérer() {
to={sitePaths.gérer.sécuritéSociale}
>
- Comprendre la sécurité sociale
+ Comprendre la sécurité sociale
A quoi servent les cotisations sociales ? Le point sur le
système de protection sociale dont bénéficient tous les
@@ -264,9 +286,49 @@ export default function Gérer() {
+ {dirigeant === 'auto-entrepreneur' ? (
+
+
+ Récupérer un extrait de Kbis?
+
+ Les auto-entrepreneurs n'ont pas de Kbis. Ils peuvent
+ cependant récupérer et présenter un extrait K. Voir le site
+ du service-public pour plus d'informations.
+
+
+
+ ) : (
+
+
+ Récupérer un extrait de Kbis
+
+ Le Kbis est un document permettant de justifier de
+ l'enregistrement de l'entreprise au{' '}
+
+ RCS
+ {' '}
+ et de prouver son existence légale. Ce document peut être
+ récupéré gratuitement pour votre entreprise via le site
+ MonIdeNum.
+
+
+
+ )}
>
-
+
>
)
}
@@ -278,9 +340,8 @@ type CompanySectionProps = {
export const CompanySection = ({ company }: CompanySectionProps) => {
const [searchModal, showSearchModal] = useState(false)
const [autoEntrepreneurModal, showAutoEntrepreneurModal] = useState(false)
- const [DirigeantMajoritaireModal, showDirigeantMajoritaireModal] = useState(
- false
- )
+ const [DirigeantMajoritaireModal, showDirigeantMajoritaireModal] =
+ useState(false)
const companyRef = useRef(null)
useEffect(() => {
diff --git a/mon-entreprise/source/pages/Gérer/SécuritéSociale.tsx b/mon-entreprise/source/pages/Gérer/SécuritéSociale.tsx
index 3d9b6263f..8cce4abba 100644
--- a/mon-entreprise/source/pages/Gérer/SécuritéSociale.tsx
+++ b/mon-entreprise/source/pages/Gérer/SécuritéSociale.tsx
@@ -1,4 +1,4 @@
-import * as Animate from 'Components/ui/animate'
+import { FromBottom } from 'Components/ui/animate'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { TrackPage } from '../../ATInternetTracking'
@@ -12,7 +12,7 @@ export default function SocialSecurity() {
{t('sécu.page.titre', 'Sécurité sociale')}
-
+
Protection sociale
@@ -32,7 +32,7 @@ export default function SocialSecurity() {
-
+
>
)
}
diff --git a/mon-entreprise/source/pages/Gérer/index.tsx b/mon-entreprise/source/pages/Gérer/index.tsx
index 4e78fb2b0..cc208fcd6 100644
--- a/mon-entreprise/source/pages/Gérer/index.tsx
+++ b/mon-entreprise/source/pages/Gérer/index.tsx
@@ -17,14 +17,16 @@ export default function Gérer() {
return (
<>
-
- ← Retour à mon activité
-
+
+
+ ← Retour à mon activité
+
+
diff --git a/mon-entreprise/source/pages/Iframes/index.tsx b/mon-entreprise/source/pages/Iframes/index.tsx
index c39ec5cb5..8ebdb9ec2 100644
--- a/mon-entreprise/source/pages/Iframes/index.tsx
+++ b/mon-entreprise/source/pages/Iframes/index.tsx
@@ -1,4 +1,5 @@
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
+import { useEffect } from 'react'
import { Helmet } from 'react-helmet'
import { Route, Switch } from 'react-router-dom'
import useSimulatorsData from '../Simulateurs/metadata'
@@ -8,6 +9,16 @@ import IframeFooter from './IframeFooter'
export default function Iframes() {
const simulators = useSimulatorsData()
+ // We hide the vertical scrollbar in the iframe because the iframe is resized
+ // using the "iframe-resizer" module, and if we keep the scrollbar it appears
+ // briefly during transitions, cf.
+ // https://github.com/betagouv/mon-entreprise/issues/1462
+ useEffect(() => {
+ if ('parentIFrame' in window) {
+ document.body.style.overflowY = 'hidden'
+ }
+ }, [])
+
return (
{/** Open external links in the parent frame.
@@ -19,11 +30,11 @@ export default function Iframes() {
{Object.values(simulators)
- .filter(({ iframe }) => !!iframe)
+ .filter(({ iframePath }) => !!iframePath)
.map((s) => (
(
<>
diff --git a/mon-entreprise/source/pages/Landing/Landing.tsx b/mon-entreprise/source/pages/Landing/Landing.tsx
index 74dda960f..535c65e5a 100644
--- a/mon-entreprise/source/pages/Landing/Landing.tsx
+++ b/mon-entreprise/source/pages/Landing/Landing.tsx
@@ -4,7 +4,6 @@ import Emoji from 'Components/utils/Emoji'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import logoSvg from 'Images/logo.svg'
import { useContext } from 'react'
-import emoji from 'react-easy-emoji'
import { Trans, useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import { Link } from 'react-router-dom'
@@ -64,7 +63,9 @@ export default function Landing() {
: sitePaths.créer.index
}
>
- {emoji('💡')}
+
+
+
Créer une entreprise
@@ -84,7 +85,9 @@ export default function Landing() {
className="ui__ interactive card light-border box "
to={sitePaths.gérer.index}
>
-
{emoji('💶')}
+
+
+
Gérer mon activité
@@ -100,7 +103,9 @@ export default function Landing() {
className="ui__ interactive card light-border box"
to={sitePaths.simulateurs.index}
>
-
{emoji('🧮')}
+
+
+
Accéder aux simulateurs
@@ -119,9 +124,9 @@ export default function Landing() {
Nous sommes une petite{' '}
- équipe autonome et pluridisciplinaire
+ équipe
{' '}
- au sein de l’
+ autonome et pluridisciplinaire au sein de l’
Urssaf . Nous avons à cœur
d’être au près de vos besoins afin d’améliorer en permanence ce
site conformément à l'approche{' '}
diff --git a/mon-entreprise/source/pages/Nouveautés/Nouveautés.tsx b/mon-entreprise/source/pages/Nouveautés/Nouveautés.tsx
index fc8e70648..26a330b83 100644
--- a/mon-entreprise/source/pages/Nouveautés/Nouveautés.tsx
+++ b/mon-entreprise/source/pages/Nouveautés/Nouveautés.tsx
@@ -1,10 +1,10 @@
import { determinant, hideNewsBanner } from 'Components/layout/NewsBanner'
import MoreInfosOnUs from 'Components/MoreInfosOnUs'
+import Emoji from 'Components/utils/Emoji'
import { MarkdownWithAnchorLinks } from 'Components/utils/markdown'
import { ScrollToTop } from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext, useEffect } from 'react'
-import emoji from 'react-easy-emoji'
import {
Link,
NavLink,
@@ -54,10 +54,13 @@ export default function Nouveautés() {
<>
-
Les nouveautés {emoji('✨')}
+
+ Les nouveautés
+
- Nous améliorons le site en continu à partir de vos retours. Découvrez
- les{' '}
+ Nous améliorons le site en continu à partir de{' '}
+ vos retours
+ . Découvrez les{' '}
{selectedRelease === 0
? 'dernières nouveautés'
: `nouveautés ${determinant(releaseName)}${releaseName}`}
@@ -116,7 +119,7 @@ const removeGithubIssuesReferences = (text: string) =>
text.replace(/#[0-9]{1,5}/g, '')
const TextRenderer = ({ children }: { children: string }) => (
- <>{emoji(removeGithubIssuesReferences(children))}>
+
)
const NewsSection = styled.section`
diff --git a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx
index b53b3b198..317bd018f 100644
--- a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx
@@ -1,6 +1,6 @@
import Conversation from 'Components/conversation/Conversation'
import { HiddenOptionContext } from 'Components/conversation/Question'
-import Animate from 'Components/ui/animate'
+import { FromTop } from 'Components/ui/animate'
import Warning from 'Components/ui/WarningBlock'
import { ThemeColorsContext } from 'Components/utils/colors'
import Emoji from 'Components/utils/Emoji'
@@ -38,7 +38,7 @@ const aides = [
'contrat salarié . professionnalisation . jeune de moins de 30 ans':
'oui',
},
- dateFin: new Date('2020/02/28'),
+ dateFin: new Date('2021/12/31'),
versement: mensuel ,
description: (
@@ -58,7 +58,7 @@ const aides = [
"contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans":
'oui',
},
- dateFin: new Date('2020/03/31'),
+ dateFin: new Date('2021/05/31'),
versement: trimestriel ,
description: (
@@ -71,12 +71,12 @@ const aides = [
),
},
{
- title: 'Emploi Franc+',
+ title: 'Emploi Franc',
dottedName: 'contrat salarié . aides employeur . emploi franc',
situation: {
'contrat salarié . aides employeur . emploi franc . éligible': 'oui',
},
- dateFin: new Date('2020/03/31'),
+ dateFin: new Date('2021/05/31'),
versement: tous les 6 mois ,
description: (
@@ -87,6 +87,25 @@ const aides = [
),
},
+ {
+ title: 'Travailleur handicapé',
+ dottedName:
+ "contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés",
+ situation: {
+ "contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés . situation de handicap":
+ 'oui',
+ },
+ dateFin: new Date('2021/06/30'),
+ versement: trimestriel ,
+ description: (
+
+ Pour l’embauche d’un travailleur en situation de handicap.
+
+ L’aide est versée trimestriellement par l’Agence de
+ services et de paiement (ASP).
+
+ ),
+ },
{
title: "Demandeur d'emploi de 45 ans ou plus",
dottedName:
@@ -133,6 +152,7 @@ const config = {
'contrat salarié . temps de travail . heures complémentaires',
'contrat salarié . rémunération',
'contrat salarié . aides employeur . emploi franc . éligible',
+ "contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés . situation de handicap",
'contrat salarié . professionnalisation . jeune de moins de 30 ans',
'contrat salarié . professionnalisation . salarié de 45 ans et plus',
],
@@ -209,14 +229,17 @@ function Results() {
const progress = useSimulationProgress()
const baseEngine = useEngine()
const aidesEngines = aides.map((aide) => {
- const engine = new Engine(baseEngine.parsedRules)
+ const engine = baseEngine.shallowCopy()
+ engine.setSituation({ ...aide.situation, ...baseEngine.parsedSituation })
+ const isActive =
+ typeof engine.evaluate(aide.dottedName).nodeValue === 'number'
const situation = { ...baseEngine.parsedSituation, ...aide.situation }
- engine.setSituation(situation)
- return { ...aide, situation, engine }
+ return { ...aide, situation, engine, isActive }
})
- const [aidesActives, aidesInactives] = partition(({ dottedName, engine }) => {
- return typeof engine.evaluate(dottedName).nodeValue === 'number'
- }, aidesEngines)
+ const [aidesActives, aidesInactives] = partition(
+ ({ isActive }) => isActive,
+ aidesEngines
+ )
return progress === 0 ? (
<>
@@ -226,10 +249,12 @@ function Results() {
Les aides
-
+ ({ ...aide, engine: baseEngine }))}
+ />
>
) : (
-
+
Aides disponibles
@@ -242,11 +267,15 @@ function Results() {
-
+
)
}
-function AidesGrid({ aides }: { aides: Array }) {
+function AidesGrid({
+ aides,
+}: {
+ aides: Array
+}) {
return (
{aides.map((aide, i) => (
@@ -260,11 +289,11 @@ function ResultCard({
situation,
title,
dottedName,
+ engine,
dateFin,
versement,
description,
-}: AideDescriptor) {
- const engine = useEngine()
+}: AideDescriptor & { engine: Engine }) {
const rule = engine.getParsedRules()[dottedName]
const valueNode = (rule.explanation.valeur as any)?.explanation.valeur
const evaluation = engine.evaluate(valueNode)
diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx
index 8b929b901..762fffdec 100644
--- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx
@@ -1,18 +1,15 @@
import { DistributionBranch } from 'Components/Distribution'
-import Value, { Condition } from 'Components/EngineValue'
+import { Condition } from 'Components/EngineValue'
+import PeriodSwitch from 'Components/PeriodSwitch'
import SimulateurWarning from 'Components/SimulateurWarning'
-import AidesCovid from 'Components/simulationExplanation/AidesCovid'
+import Simulation from 'Components/Simulation'
+import { InstitutionsPartenairesArtisteAuteur } from 'Components/simulationExplanation/InstitutionsPartenaires'
import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals'
import 'Components/TargetSelection.css'
-import Animate from 'Components/ui/animate'
import { EngineContext } from 'Components/utils/EngineContext'
import useSimulationConfig from 'Components/utils/useSimulationConfig'
-import { DottedName } from 'modele-social'
-import { useContext, useState } from 'react'
+import { useContext } from 'react'
import { Trans } from 'react-i18next'
-import { useSelector } from 'react-redux'
-import { situationSelector } from 'Selectors/simulationSelectors'
-import styled from 'styled-components'
import config from './configs/artiste-auteur.yaml'
export default function ArtisteAuteur() {
@@ -21,91 +18,28 @@ export default function ArtisteAuteur() {
return (
<>
-
-
-
-
-
-
+ }>
+
+
+
+
+
-
-
-
-
+
+
+
+
>
)
}
-type WarningProps = {
- dottedName: DottedName
-}
-
-function Warning({ dottedName }: WarningProps) {
- const description = useContext(EngineContext).getRule(dottedName).rawNode
- .description
- return (
-
- {description}
-
- )
-}
-
-const ResultLine = styled.div`
- padding: 10px;
- font-size: 1.25em;
- display: flexbox;
- flex-direction: column;
-`
-
-const ResultLabel = styled.div`
- flex-grow: 1;
-`
-
function CotisationsResult() {
- const [display, setDisplay] = useState(false)
- const situation = useSelector(situationSelector)
-
- if (Object.keys(situation).length && !display) {
- setDisplay(true)
- }
-
- if (!display) {
- return null
- }
-
return (
-
-
-
-
- Montant des cotisations
-
-
-
-
-
-
-
+ <>
+
-
+ >
)
}
@@ -114,6 +48,10 @@ const branches = [
dottedName: 'artiste-auteur . cotisations . vieillesse',
icon: '👵',
},
+ {
+ dottedName: 'artiste-auteur . cotisations . IRCEC',
+ icon: '👵',
+ },
{
dottedName: 'artiste-auteur . cotisations . CSG-CRDS',
icon: '🏛',
@@ -137,13 +75,15 @@ function RepartitionCotisations() {
À quoi servent mes cotisations ?
- {cotisations.map((cotisation) => (
-
- ))}
+ {cotisations
+ .filter(({ value }) => Boolean(value))
+ .map((cotisation) => (
+
+ ))}
)
diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx
index 4b737e64f..22fb504c3 100644
--- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx
@@ -1,170 +1,49 @@
-import { batchUpdateSituation } from 'Actions/actions'
-import { Explicable } from 'Components/conversation/Explicable'
-import { Condition } from 'Components/EngineValue'
+import ChiffreAffairesActivitéMixte from 'Components/ChiffreAffairesActivitéMixte'
+import { WhenAlreadyDefined } from 'Components/EngineValue'
import PeriodSwitch from 'Components/PeriodSwitch'
import SimulateurWarning from 'Components/SimulateurWarning'
import Simulation from 'Components/Simulation'
+import InstitutionsPartenaires, {
+ InstitutionsPartenairesAutoEntrepreneur,
+} from 'Components/simulationExplanation/InstitutionsPartenaires'
import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals'
import StackedBarChart from 'Components/StackedBarChart'
import { ThemeColorsContext } from 'Components/utils/colors'
-import { useEngine } from 'Components/utils/EngineContext'
-import { Markdown } from 'Components/utils/markdown'
-import { serializeEvaluation } from 'publicodes'
-import { default as React, useCallback, useContext } from 'react'
+import { default as React, useContext } from 'react'
import { Trans, useTranslation } from 'react-i18next'
-import { useDispatch, useSelector } from 'react-redux'
-import { situationSelector } from 'Selectors/simulationSelectors'
-import AidesCovid from '../../components/simulationExplanation/AidesCovid'
-
-const proportions = {
- 'entreprise . activité . mixte . proportions . service BIC':
- "entreprise . chiffre d'affaires . service BIC",
- 'entreprise . activité . mixte . proportions . service BNC':
- "entreprise . chiffre d'affaires . service BNC",
- 'entreprise . activité . mixte . proportions . vente restauration hébergement':
- "entreprise . chiffre d'affaires . vente restauration hébergement",
-} as const
-function useAdjustProportions(): () => void {
- const engine = useEngine()
- const dispatch = useDispatch()
-
- return useCallback(() => {
- const nouveauCA = serializeEvaluation(
- engine.evaluate({
- somme: Object.values(proportions)
- .map((name) => serializeEvaluation(engine.evaluate(name)))
- .filter(Boolean),
- })
- )
- const situation = Object.entries(proportions).reduce(
- (acc, [proportionName, valueName]) => {
- const value = serializeEvaluation(
- engine.evaluate({ valeur: valueName, 'par défaut': '0€/an' })
- )
- const newProportion = serializeEvaluation(
- engine.evaluate({
- valeur: `${value} / ${nouveauCA}`,
- unité: '%',
- })
- )
- console.log(valueName, value, newProportion, nouveauCA)
-
- return { ...acc, [proportionName]: newProportion }
- },
- { "entreprise . chiffre d'affaires": nouveauCA }
- )
- dispatch(batchUpdateSituation(situation))
- }, [engine, dispatch])
-}
export default function AutoEntrepreneur() {
- const adjustProportions = useAdjustProportions()
- const activitéMixte =
- useEngine().evaluate('entreprise . activité . mixte').nodeValue === true
-
return (
<>
}>
-
-
-
-
-
-
-
-
+
-
-
-
+
+
+
>
)
}
-
-function ActivitéMixte({ defaultChecked }: { defaultChecked: boolean }) {
- const dispatch = useDispatch()
- const situation = useSelector(situationSelector)
- const rule = useEngine().getRule('entreprise . activité . mixte')
-
- const onMixteChecked = useCallback(
- (checked: boolean) => {
- dispatch(
- batchUpdateSituation(
- Object.values(proportions).reduce(
- (acc, dottedName) => ({ ...acc, [dottedName]: undefined }),
- { 'entreprise . activité . mixte': checked ? 'oui' : 'non' }
- )
- )
- )
- },
- [dispatch, situation]
- )
- return (
-
-
- onMixteChecked(evt.target.checked)}
- />
- Activité mixte
-
-
-
-
-
- )
-}
-
function Explanation() {
const { t } = useTranslation()
const { palettes } = useContext(ThemeColorsContext)
return (
-
-
Répartition du chiffre d'affaires
@@ -176,7 +55,7 @@ function Explanation() {
color: palettes[0][0],
},
{
- dottedName: 'impôt',
+ dottedName: 'impôt . montant',
title: t('impôt'),
color: palettes[1][0],
},
@@ -188,6 +67,7 @@ function Explanation() {
},
]}
/>
+
)
}
diff --git a/mon-entreprise/source/pages/Simulateurs/ChômagePartiel.tsx b/mon-entreprise/source/pages/Simulateurs/ChômagePartiel.tsx
index e8a1c7626..67fb8891a 100644
--- a/mon-entreprise/source/pages/Simulateurs/ChômagePartiel.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/ChômagePartiel.tsx
@@ -1,6 +1,6 @@
import RuleLink from 'Components/RuleLink'
import Simulation from 'Components/Simulation'
-import Animate from 'Components/ui/animate'
+import { FromTop } from 'Components/ui/animate'
import Warning from 'Components/ui/WarningBlock'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import { useEngine } from 'Components/utils/EngineContext'
@@ -79,7 +79,7 @@ function ExplanationSection() {
const totalEntrepriseHabituel = 'chômage partiel . coût employeur habituel'
return (
-
+
-
+
)
}
diff --git a/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx b/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx
new file mode 100644
index 000000000..20d13e5c6
--- /dev/null
+++ b/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx
@@ -0,0 +1,177 @@
+import { useContext } from 'react'
+import { Trans, useTranslation } from 'react-i18next'
+import { DottedName } from 'modele-social'
+import { Condition } from 'Components/EngineValue'
+import { SimulationGoals, SimulationGoal } from 'Components/SimulationGoals'
+import { ThemeColorsContext } from 'Components/utils/colors'
+import Notifications from 'Components/Notifications'
+import Simulation from 'Components/Simulation'
+import StackedBarChart from 'Components/StackedBarChart'
+import { useDispatch } from 'react-redux'
+import { useEngine } from 'Components/utils/EngineContext'
+import { updateSituation } from 'Actions/actions'
+import { HiddenOptionContext } from 'Components/conversation/Question'
+import Warning from 'Components/ui/WarningBlock'
+
+export default function DividendesSimulation() {
+ return (
+ <>
+
+
+
+ Cette simulation est uniquement donnée à titre indicatif. Elle ne
+ concerne que les sociétés françaises à l'impôt sur les sociétés
+ (IS), et ne concerne pas les dirigeants affiliés au régime des
+ travailleurs indépendants.
+
+
+ Le montant de l'impôt sur les dividendes est calculé en sus de
+ l'impôt sur les autres revenus imposables.{' '}
+
+
+
+
+
+ }>
+ * {
+ margin-top: 0.6rem;
+ }
+ justify-content: center;
+
+ @media (min-width: 590px) {
+ justify-content: space-between;
+ }
+ `}
+ >
+
+
+
+
+
+ >
+ )
+}
+
+function OptionBarèmeSwitch() {
+ const dispatch = useDispatch()
+ const engine = useEngine()
+ const dottedName = 'impôt . méthode de calcul' as DottedName
+ const currentOptionPFU = engine.evaluate(dottedName + ' . PFU').nodeValue
+ const currentOptionBarème = engine.evaluate(
+ dottedName + ' . barème standard'
+ ).nodeValue
+
+ return (
+
+
+ dispatch(updateSituation(dottedName, "'PFU'"))}
+ checked={!!currentOptionPFU}
+ />
+
+
+ PFU ("flat tax" )
+
+
+
+
+
+ dispatch(updateSituation(dottedName, "'barème standard'"))
+ }
+ checked={!!currentOptionBarème}
+ />
+
+ Impôt au barème
+
+
+
+ )
+}
+
+const DividendesSimulationGoals = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+)
+
+const DividendesExplanation = () => {
+ const { t } = useTranslation()
+ const { palettes } = useContext(ThemeColorsContext)
+
+ return (
+
+
+
+
+
+ Répartition du total chargé
+
+
+
+
+
+
+ )
+}
diff --git a/mon-entreprise/source/pages/Simulateurs/Home.tsx b/mon-entreprise/source/pages/Simulateurs/Home.tsx
index 68148e5b9..4c57448d2 100644
--- a/mon-entreprise/source/pages/Simulateurs/Home.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/Home.tsx
@@ -1,10 +1,11 @@
import classnames from 'classnames'
+import PageHeader from 'Components/PageHeader'
import InfoBulle from 'Components/ui/InfoBulle'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
+import Emoji from 'Components/utils/Emoji'
import { HeadingWithAnchorLink } from 'Components/utils/markdown'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext } from 'react'
-import emoji from 'react-easy-emoji'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
@@ -24,23 +25,14 @@ export default function Simulateurs() {
{titre}
-
-
-
{titre}
-
-
- Tous les simulateurs sur ce site sont maintenus à jour avec les
- dernières évolutions législatives.
-
-
-
-
-
-
+
+
+
+ Tous les simulateurs sur ce site sont maintenus à jour avec les
+ dernières évolutions législatives.
+
+
+
Salariés et employeurs
@@ -52,19 +44,30 @@ export default function Simulateurs() {
- Par statut
+ Revenu du dirigeant par statut
+
+
+
+
+
+
+
+
+
+
+ Travailleurs Non Salariés (TNS)
+
+
-
-
<>
- Par profession
+ Professions libérales
@@ -76,15 +79,16 @@ export default function Simulateurs() {
>
+
Autres outils
+
{language === 'fr' && (
)}
-
@@ -102,7 +106,7 @@ export default function Simulateurs() {
de dispositifs pris en compte
- Intégrable facilement et gratuitement sur
+ Intégrables facilement et gratuitement sur
n'importe quel site internet.{' '}
En savoir plus.
@@ -119,9 +123,11 @@ export function SimulateurCard({
meta,
path,
tooltip,
- iframe,
+ iframePath,
icône,
-}: SimulatorData[keyof SimulatorData] & { small?: boolean }) {
+}: SimulatorData[keyof SimulatorData] & {
+ small?: boolean
+}) {
const isIframe = useContext(IsEmbeddedContext)
const name = (
@@ -136,12 +142,14 @@ export function SimulateurCard({
key={path}
to={{
state: { fromSimulateurs: true },
- pathname: (isIframe && iframe) || path,
+ pathname: (isIframe && iframePath) || path,
}}
>
-
- {emoji(icône)}
-
+ {icône && (
+
+
+
+ )}
<>{small ? name : {name} }>
{!small && meta?.description && (
{meta.description}
diff --git a/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx
similarity index 81%
rename from mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx
rename to mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx
index b318a6309..46ff544ff 100644
--- a/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx
@@ -3,12 +3,12 @@ import RuleInput from 'Components/conversation/RuleInput'
import Value from 'Components/EngineValue'
import Notifications from 'Components/Notifications'
import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals'
-import Animate from 'Components/ui/animate'
+import { FromTop } from 'Components/ui/animate'
import Warning from 'Components/ui/WarningBlock'
import { ThemeColorsContext } from 'Components/utils/colors'
+import Emoji from 'Components/utils/Emoji'
import useSimulationConfig from 'Components/utils/useSimulationConfig'
import { useContext } from 'react'
-import emoji from 'react-easy-emoji'
import { Trans } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { SimulationConfig } from 'Reducers/rootReducer'
@@ -17,7 +17,12 @@ import { TrackPage } from '../../ATInternetTracking'
const ISConfig = {
'unité par défaut': '€/an',
- situation: {},
+ situation: {
+ 'entreprise . imposition': "'IS'",
+ 'entreprise . imposition . IS . impôt sur les sociétés . éligible taux réduit':
+ 'oui',
+ "entreprise . chiffre d'affaires . franchise de TVA": 'non',
+ },
} as SimulationConfig
export default function ISSimulation() {
@@ -39,7 +44,7 @@ export default function ISSimulation() {
-
+
>
@@ -49,7 +54,7 @@ export default function ISSimulation() {
function ExerciceDate() {
const dispatch = useDispatch()
return (
-
- {emoji('📆')}
+
+
Exercice du{' '}
dispatch(updateSituation('entreprise . exercice . début', x))
}
@@ -78,23 +85,25 @@ function ExerciceDate() {
au{' '}
dispatch(updateSituation('entreprise . exercice . fin', x))
}
/>
-
+
)
}
function Explanations() {
const situation = useSelector(situationSelector)
- const showResult = situation['entreprise . bénéfice']
+ const showResult =
+ situation['entreprise . imposition . IS . résultat imposable']
if (!showResult) {
return
}
return (
-
+
@@ -121,6 +130,6 @@ function Explanations() {
Montant de l'impôt sur les sociétés
-
+
)
}
diff --git a/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx
new file mode 100644
index 000000000..6a568c803
--- /dev/null
+++ b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx
@@ -0,0 +1,165 @@
+import { updateSituation } from 'Actions/actions'
+import Banner from 'Components/Banner'
+import ChiffreAffairesActivitéMixte from 'Components/ChiffreAffairesActivitéMixte'
+import { Condition } from 'Components/EngineValue'
+import PeriodSwitch from 'Components/PeriodSwitch'
+import SimulateurWarning from 'Components/SimulateurWarning'
+import Simulation from 'Components/Simulation'
+import IndépendantExplanation from 'Components/simulationExplanation/IndépendantExplanation'
+import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals'
+import { useEngine } from 'Components/utils/EngineContext'
+import { SitePathsContext } from 'Components/utils/SitePathsContext'
+import { DottedName } from 'modele-social'
+import { useContext } from 'react'
+import { Trans } from 'react-i18next'
+import { useDispatch } from 'react-redux'
+import { Link } from 'react-router-dom'
+
+export function IndépendantPLSimulation() {
+ return (
+ <>
+
+ }>
+
+
+
+ >
+ )
+}
+
+export function EntrepriseIndividuelle() {
+ return (
+ <>
+
+ }>
+
+
+
+ >
+ )
+}
+
+export default function IndépendantSimulation() {
+ const sitePaths = useContext(SitePathsContext)
+ return (
+ <>
+
+ }>
+ * {
+ margin-top: 0.6rem;
+ }
+ justify-content: center;
+
+ @media (min-width: 590px) {
+ justify-content: space-between;
+ }
+ `}
+ >
+
+
+
+
+
+
+ Découvrez notre outil d'
+
+ aide à la déclaration des revenus
+
+
+
+
+ >
+ )
+}
+function IndépendantSimulationGoals() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+function ImpositionSwitch() {
+ const dispatch = useDispatch()
+ const engine = useEngine()
+ const currentImposition = engine.evaluate('entreprise . imposition').nodeValue
+
+ return (
+
+ {(['IR', 'IS'] as const).map((imposition) => (
+
+
+ dispatch(
+ updateSituation('entreprise . imposition', `'${imposition}'`)
+ )
+ }
+ checked={currentImposition === imposition}
+ />
+
+ {
+ engine.getRule(
+ `entreprise . imposition . ${imposition}` as DottedName
+ ).title
+ }
+
+
+ ))}
+
+ )
+}
diff --git a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx
deleted file mode 100644
index a45d59f88..000000000
--- a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import SimulateurWarning from 'Components/SimulateurWarning'
-import Simulation from 'Components/Simulation'
-import IndépendantExplanation from 'Components/simulationExplanation/IndépendantExplanation'
-export default function IndépendantSimulation() {
- return (
- <>
-
- } />
- >
- )
-}
-export function IndépendantPLSimulation() {
- return (
- <>
-
- } />
- >
- )
-}
diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx
index 18878d3a7..9787bcfc0 100644
--- a/mon-entreprise/source/pages/Simulateurs/Page.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx
@@ -1,15 +1,19 @@
+import { Condition } from 'Components/EngineValue'
import PreviousSimulationBanner from 'Components/PreviousSimulationBanner'
import { ThemeColorsProvider } from 'Components/utils/colors'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
+import Emoji from 'Components/utils/Emoji'
+import { useEngine } from 'Components/utils/EngineContext'
import Meta from 'Components/utils/Meta'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import useSearchParamsSimulationSharing from 'Components/utils/useSearchParamsSimulationSharing'
import useSimulationConfig from 'Components/utils/useSimulationConfig'
import { default as React, useContext } from 'react'
-import { useTranslation } from 'react-i18next'
-import { useLocation } from 'react-router-dom'
+import { Trans, useTranslation } from 'react-i18next'
+import { Link, useLocation } from 'react-router-dom'
import { TrackChapter } from '../../ATInternetTracking'
-import { SimulatorData } from './metadata'
+import { RessourceAutoEntrepreneur } from '../../pages/Créer/CreationChecklist'
+import useSimulatorsData, { SimulatorData } from './metadata'
export default function PageData({
meta,
@@ -18,8 +22,11 @@ export default function PageData({
tracking,
tooltip,
description,
+ iframePath,
+ private: privateIframe,
component: Component,
seoExplanations,
+ nextSteps,
path,
}: SimulatorData[keyof SimulatorData]) {
const inIframe = useContext(IsEmbeddedContext)
@@ -78,9 +85,140 @@ export default function PageData({
+
{config && }
- {seoExplanations && !inIframe && seoExplanations}
+ {!inIframe && (
+ <>
+
+
+ >
+ )}
>
)
}
+
+type NextStepsProps = Pick<
+ SimulatorData[keyof SimulatorData],
+ 'iframePath' | 'nextSteps'
+>
+
+function NextSteps({ iframePath, nextSteps }: NextStepsProps) {
+ const sitePaths = useContext(SitePathsContext)
+ const { language } = useTranslation().i18n
+ const engine = useEngine()
+
+ const guideUrssaf = guidesUrssaf.find(
+ ({ associatedRule }) => engine.evaluate(associatedRule).nodeValue
+ )
+
+ if (!iframePath && !nextSteps && !guideUrssaf) {
+ return null
+ }
+ return (
+
+
+ Ressources utiles
+
+
+
+ )
+}
+
+type SimulatorRessourceCardProps = {
+ simulatorId: keyof SimulatorData
+}
+
+export function SimulatorRessourceCard({
+ simulatorId,
+}: SimulatorRessourceCardProps) {
+ const simulator = useSimulatorsData()[simulatorId]
+ return (
+
+
+ {simulator.icône && }{' '}
+ {simulator.shortName}
+
+ {simulator.meta?.description}
+
+ )
+}
+
+const guidesUrssaf = [
+ {
+ url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf',
+ associatedRule: "dirigeant . indépendant . PL . métier = 'santé . médecin'",
+ title: 'Guide Urssaf pour les médecins libéraux',
+ },
+ {
+ url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf',
+ associatedRule: 'entreprise . activité . libérale réglementée',
+ title: 'Guide Urssaf pour les professions libérales réglementées',
+ },
+ {
+ url: 'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf',
+ associatedRule: 'dirigeant . auto-entrepreneur',
+ title: 'Guide Urssaf pour les auto-entrepreneurs',
+ },
+ {
+ url: 'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf',
+ associatedRule: "dirigeant = 'artiste-auteur'",
+ title: 'Guide Urssaf pour les artistes-auteurs',
+ },
+ {
+ url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf',
+ associatedRule: 'dirigeant',
+ title: 'Guide Urssaf pour les indépendants',
+ },
+]
diff --git a/mon-entreprise/source/pages/Simulateurs/SalariéSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/Salarié.tsx
similarity index 80%
rename from mon-entreprise/source/pages/Simulateurs/SalariéSimulation.tsx
rename to mon-entreprise/source/pages/Simulateurs/Salarié.tsx
index b0e9b0f2f..f056699e1 100644
--- a/mon-entreprise/source/pages/Simulateurs/SalariéSimulation.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/Salarié.tsx
@@ -1,16 +1,13 @@
import Banner from 'Components/Banner'
-import PreviousSimulationBanner from 'Components/PreviousSimulationBanner'
import Simulation from 'Components/Simulation'
import SalaryExplanation from 'Components/simulationExplanation/SalaryExplanation'
-import Emoji from 'Components/utils/Emoji'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
-import { default as React, useContext } from 'react'
-import { Trans, useTranslation } from 'react-i18next'
+import { useContext } from 'react'
+import { Trans } from 'react-i18next'
import { Link } from 'react-router-dom'
export default function SalariéSimulation() {
const sitePaths = useContext(SitePathsContext)
- const { language } = useTranslation().i18n
return (
<>
@@ -42,7 +39,7 @@ export default function SalariéSimulation() {
Vous êtes dirigeant d'une SAS(U) ?{' '}
-
+
Accéder au simulateur de revenu dédié
diff --git a/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml b/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml
index dc05be6ce..8bfc7b626 100644
--- a/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml
@@ -3,3 +3,12 @@ situation:
unité par défaut: €/an
objectifs:
- artiste-auteur . cotisations
+objectifs cachés:
+ - artiste-auteur . revenus
+ - artiste-auteur . cotisations . IRCEC
+questions:
+ liste:
+ - artiste-auteur . revenus . BNC . micro-bnc
+ - artiste-auteur . cotisations . option surcotisation
+ - artiste-auteur . cotisations . IRCEC . cotisation RAAP . taux réduit
+ - artiste-auteur . cotisations . IRCEC . profession
diff --git a/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml b/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml
index 47c0bebc7..270a86b38 100644
--- a/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml
@@ -1,8 +1,8 @@
objectifs:
- - entreprise . chiffre d'affaires
+ - dirigeant . auto-entrepreneur . chiffre d'affaires
- dirigeant . auto-entrepreneur . cotisations et contributions
- dirigeant . auto-entrepreneur . net de cotisations
- - dirigeant . auto-entrepreneur . net après impôt . impôt
+ - dirigeant . rémunération . impôt
- dirigeant . auto-entrepreneur . net après impôt
questions:
@@ -14,7 +14,7 @@ questions:
liste:
- entreprise
- dirigeant
- - impôt
+ - impôt . montant
- établissement
- situation personnelle
non prioritaires:
@@ -22,9 +22,7 @@ questions:
liste noire:
- entreprise . charges
- entreprise . chiffre d'affaires
- - entreprise . chiffre d'affaires . vente restauration hébergement
- - entreprise . chiffre d'affaires . service BIC
- - entreprise . chiffre d'affaires . service BNC
+
unité par défaut: €/an
situation:
entreprise . activité . mixte: non
diff --git a/mon-entreprise/source/pages/Simulateurs/configs/chômage-partiel.yaml b/mon-entreprise/source/pages/Simulateurs/configs/chômage-partiel.yaml
index 68f268772..0a6234c5b 100644
--- a/mon-entreprise/source/pages/Simulateurs/configs/chômage-partiel.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/configs/chômage-partiel.yaml
@@ -4,13 +4,11 @@ objectifs:
objectifs cachés:
- contrat salarié . rémunération . net
- contrat salarié . prix du travail
-
questions:
liste:
- contrat salarié . activité partielle
- contrat salarié . temps de travail
- - contrat salarié . profession spécifique
- établissement . localisation
unité par défaut: €/mois
diff --git a/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml b/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml
index 7e3600e13..6c42247e2 100644
--- a/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml
@@ -1,17 +1,9 @@
objectifs:
- - icône: 👩💼
- nom: Mon revenu
- objectifs:
- - contrat salarié . rémunération . total
- - contrat salarié . cotisations
- - contrat salarié . rémunération . net
- - impôt
- - contrat salarié . rémunération . net après impôt
- - icône: 🏢
- nom: Mon entreprise
- objectifs:
- - entreprise . charges
- - entreprise . chiffre d'affaires minimum
+ - dirigeant . rémunération . totale
+ - contrat salarié . cotisations
+ - contrat salarié . rémunération . net
+ - impôt . montant
+ - contrat salarié . rémunération . net après impôt
questions:
à l'affiche:
@@ -19,9 +11,10 @@ questions:
Commune: établissement . localisation
Avantages en nature: contrat salarié . rémunération . avantages en nature
Impôt sur le revenu: impôt . méthode de calcul
-
+
liste noire:
- entreprise . charges
+ - entreprise . imposition
- entreprise . rémunération du dirigeant
- entreprise . association non lucrative
non prioritaires:
diff --git a/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml b/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml
new file mode 100644
index 000000000..74330a5d7
--- /dev/null
+++ b/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml
@@ -0,0 +1,18 @@
+objectifs:
+ - bénéficiaire . dividendes . bruts
+ - bénéficiaire . dividendes . nets d'impôt
+
+questions:
+ # [TODO] [dividendes-indep]
+ # à l'affiche:
+ # Régime social du dirigeant: dirigeant
+ liste noire:
+ - impôt . méthode de calcul
+
+unité par défaut: €/an
+situation:
+ dirigeant: "'assimilé salarié'" # [TODO] [dividendes-indep]
+ bénéficiaire: oui
+ entreprise . imposition: "'IS'"
+ impôt . méthode de calcul: "'PFU'"
+ dirigeant . rémunération . imposable: 0 €/an
diff --git a/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml b/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml
index 7fe05b0fb..0ae3db706 100644
--- a/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml
@@ -1,35 +1,28 @@
objectifs:
- - icône: 👩💼
- nom: Mon revenu
- objectifs:
- - dirigeant . rémunération totale
- - dirigeant . indépendant . cotisations et contributions
- - dirigeant . indépendant . revenu net de cotisations
- - dirigeant . indépendant . revenu professionnel
- - impôt
- - revenu net après impôt
- - icône: 🏢
- nom: Mon entreprise
- objectifs:
- - entreprise . charges
- - entreprise . chiffre d'affaires minimum
+ - entreprise . chiffre d'affaires
+ - dirigeant . rémunération . totale
+ - dirigeant . rémunération . nette
+ - dirigeant . rémunération . nette après impôt
questions:
à l'affiche:
Type d'activité: entreprise . activité
Date de création: entreprise . date de création
ACRE: entreprise . ACRE
- Contrats Madelins: dirigeant . indépendant . contrats madelin
+ Contrats Madelins: dirigeant . indépendant . cotisations facultatives
Conjoint collaborateur: dirigeant . indépendant . conjoint collaborateur
Impôt sur le revenu: impôt . méthode de calcul
liste noire:
- entreprise . charges
+ - entreprise . imposition
+ - entreprise . exercice . début
+ - entreprise . exercice . fin
liste:
- entreprise
- établissement
- dirigeant . indépendant
- situation personnelle
- - impôt
+ - impôt . montant
non prioritaires:
- dirigeant . indépendant . IJSS
- dirigeant . indépendant . cotisations et contributions . exonérations
diff --git a/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml b/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml
index 184b8cd69..b2549fc1c 100644
--- a/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml
@@ -2,9 +2,9 @@ objectifs:
- entreprise . chiffre d'affaires
- entreprise . charges
- dirigeant . indépendant . cotisations et contributions
- - dirigeant . indépendant . revenu net de cotisations
- - impôt
- - revenu net après impôt
+ - dirigeant . rémunération . nette
+ - impôt . montant
+ - dirigeant . rémunération . nette après impôt
questions:
liste noire:
@@ -17,9 +17,9 @@ questions:
- entreprise
- établissement
- situation personnelle
- - impôt
+ - impôt . montant
non prioritaires:
- - dirigeant . indépendant . contrats madelin
+ - dirigeant . indépendant . cotisations facultatives
- dirigeant . indépendant . IJSS
- dirigeant . indépendant . cotisations et contributions . exonérations
- dirigeant . indépendant . revenus étrangers
diff --git a/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml b/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml
index 8277fe17d..5a92fade0 100644
--- a/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml
@@ -3,16 +3,17 @@ titre: |
objectifs:
- contrat salarié . rémunération . net
- - dirigeant . indépendant . revenu net de cotisations
+ - dirigeant . rémunération . nette
- dirigeant . auto-entrepreneur . net de cotisations
- protection sociale . retraite
- protection sociale . retraite . trimestres validés
- protection sociale . santé . indemnités journalières
questions:
- liste:
- - dirigeant . rémunération totale
+ liste noire:
- entreprise . charges
+ - entreprise . activité . libérale réglementée
+ liste:
- entreprise . activité
unité par défaut: €/an
situation:
diff --git a/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml b/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml
index d11a498fd..a6b7a53d8 100644
--- a/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml
@@ -7,7 +7,6 @@ objectifs:
questions:
à l'affiche:
- Chômage partiel: contrat salarié . activité partielle
Temps partiel: contrat salarié . temps de travail . temps partiel
Emploi franc: contrat salarié . aides employeur . emploi franc . éligible
Cadre: contrat salarié . statut cadre
@@ -26,3 +25,19 @@ questions:
unité par défaut: €/mois
situation:
dirigeant: non
+ contrat salarié . activité partielle: non
+ impôt . méthode de calcul . par défaut:
+ # On utilise le taux neutre qui est plus rapide à calculer et qui correspond
+ # à une fiche de paie pour laquelle le taux effectif n'est pas connu
+ # (employeur qui n'a pas reçu de taux de la DGFiP ou bien jeune qui démarre
+ # un premier travail). cf #1121
+ #
+ # Pour les hauts revenus le barème au taux neutre pose problème car il
+ # provoque des effets de seuils importants (voir #1661). On revient donc à
+ # la méthode “au barème” par défaut pour les hauts revenus. La valeur de
+ # 6000 €/mois correspond au seuil où les tranches du barème neutre
+ # augmentent par paliers de 4% ou 5%.
+ variations:
+ - si: contrat salarié . rémunération . brut de base <= 6000 €/mois
+ alors: "'taux neutre'"
+ - sinon: "'barème standard'"
diff --git a/mon-entreprise/source/pages/Simulateurs/index.tsx b/mon-entreprise/source/pages/Simulateurs/index.tsx
index 4dd5f22e6..0414f7af5 100644
--- a/mon-entreprise/source/pages/Simulateurs/index.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/index.tsx
@@ -59,7 +59,7 @@ export default function Simulateurs() {
{(!lastState || lastState?.fromSimulateurs) && (
← Voir les autres simulateurs
diff --git a/mon-entreprise/source/pages/Simulateurs/metadata-src.js b/mon-entreprise/source/pages/Simulateurs/metadata-src.js
new file mode 100644
index 000000000..88df8c6c4
--- /dev/null
+++ b/mon-entreprise/source/pages/Simulateurs/metadata-src.js
@@ -0,0 +1,567 @@
+/**
+ * Contient l'intégralité des données concernant les différents simulateurs
+ * sans dépendance qui compliquerait leur import dans le script de mise à jour
+ * des données pour Algolia.
+ */
+module.exports = ({ t = (_, text) => text } = {}) => {
+ return {
+ salarié: {
+ tracking: 'salarie',
+ icône: '🤝',
+ title: t(
+ 'pages.simulateurs.salarié.title',
+ 'Simulateur de revenus pour salarié'
+ ),
+ iframePath: 'simulateur-embauche',
+ meta: {
+ description: t(
+ 'pages.simulateurs.salarié.meta.description',
+ "Calcul du salaire net, net après impôt et coût total employeur. Beaucoup d'options disponibles (cadre, stage, apprentissage, heures supplémentaires, etc.)"
+ ),
+ ogDescription: t(
+ 'pages.simulateurs.salarié.meta.ogDescription',
+ "En tant que salarié, calculez immédiatement votre revenu net après impôt à partir du brut mensuel ou annuel. En tant qu'employé, estimez le coût total d'une embauche à partir du brut. Ce simulateur est développé avec les experts de l'Urssaf, et il adapte les calculs à votre situation (statut cadre, stage, apprentissage, heures supplémentaire, titre-restaurants, mutuelle, temps partiel, convention collective, etc.)"
+ ),
+ ogTitle: t(
+ 'pages.simulateurs.salarié.meta.ogTitle',
+ 'Salaire brut, net, net après impôt, coût total : le simulateur ultime pour salariés et employeurs'
+ ),
+ title: t(
+ 'pages.simulateurs.salarié.meta.titre',
+ 'Salaire brut / net : le convertisseur Urssaf'
+ ),
+ },
+ pathId: 'simulateurs.salarié',
+ shortName: t('pages.simulateurs.salarié.shortname', 'Salarié'),
+ nextSteps: ['chômage-partiel', 'aides-embauche'],
+ },
+ 'entreprise-individuelle': {
+ tracking: {
+ chapter2: 'statut_entreprise',
+ chapter3: 'EI',
+ },
+ iframePath: 'simulateur-EI',
+ icône: '🚶♀️',
+ meta: {
+ description: t(
+ 'pages.simulateurs.ei.meta.description',
+ "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts"
+ ),
+ ogDescription: t(
+ 'pages.simulateurs.ei.meta.ogDescription',
+ "Grâce au simulateur de revenu pour entreprise individuelle développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu."
+ ),
+ ogTitle: t(
+ 'pages.simulateurs.ei.meta.ogTitle',
+ 'Entreprise individuelle (EI) : calculez rapidement votre revenu net à partir du CA et vice-versa'
+ ),
+ title: t(
+ 'pages.simulateurs.ei.meta.titre',
+ 'Entreprise individuelle (EI) : simulateur de revenus'
+ ),
+ },
+ pathId: 'simulateurs.entreprise-individuelle',
+ shortName: t('pages.simulateurs.ei.shortname', 'EI'),
+ title: t(
+ 'pages.simulateurs.ei.title',
+ 'Simulateur pour entreprise individuelle (EI)'
+ ),
+
+ nextSteps: ['comparaison-statuts'],
+ },
+ eirl: {
+ tracking: {
+ chapter2: 'statut_entreprise',
+ chapter3: 'EIRL',
+ },
+ icône: '🚶',
+ iframePath: 'simulateur-EIRL',
+ meta: {
+ description: t(
+ 'pages.simulateurs.eirl.meta.description',
+ "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts"
+ ),
+ ogDescription: t(
+ 'pages.simulateurs.eirl.meta.ogDescription',
+ "Grâce au simulateur de revenu pour EIRL développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu."
+ ),
+ ogTitle: t(
+ 'pages.simulateurs.eirl.meta.ogTitle',
+ "Dirigeant d'EIRL : calculez rapidement votre revenu net à partir du CA et vice-versa"
+ ),
+ title: t(
+ 'pages.simulateurs.eirl.meta.titre',
+ 'EIRL : simulateur de revenus pour dirigeant'
+ ),
+ },
+ pathId: 'simulateurs.eirl',
+ shortName: t('pages.simulateurs.eirl.shortname', 'EIRL'),
+ title: t('pages.simulateurs.eirl.title', "Simulateur d'EIRL"),
+
+ nextSteps: ['comparaison-statuts'],
+ },
+ sasu: {
+ tracking: {
+ chapter2: 'statut_entreprise',
+ chapter3: 'SASU',
+ },
+ icône: '📘',
+ iframePath: 'simulateur-assimilesalarie',
+ meta: {
+ description: t(
+ 'pages.simulateurs.sasu.meta.description',
+ 'Calcul du salaire net à partir du total alloué à la rémunération et inversement'
+ ),
+ ogDescription: t(
+ 'pages.simulateurs.sasu.meta.ogDescription',
+ 'En tant que dirigeant assimilé-salarié, calculez immédiatement votre revenu net après impôt à partir du total alloué à votre rémunération.'
+ ),
+ ogTitle: t(
+ 'pages.simulateurs.sasu.meta.ogTitle',
+ 'Rémunération du dirigeant de SASU : un simulateur pour connaître votre salaire net'
+ ),
+ title: t(
+ 'pages.simulateurs.sasu.meta.titre',
+ 'SASU : simulateur de revenus pour dirigeant'
+ ),
+ },
+ pathId: 'simulateurs.sasu',
+ shortName: t('pages.simulateurs.sasu.shortname', 'SASU'),
+ title: t('pages.simulateurs.sasu.title', 'Simulateur de SASU'),
+ nextSteps: ['is', 'comparaison-statuts'],
+ },
+ eurl: {
+ tracking: {
+ chapter2: 'statut_entreprise',
+ chapter3: 'EURL',
+ },
+ icône: '📕',
+ iframePath: 'simulateur-eurl',
+ meta: {
+ description: t(
+ 'pages.simulateurs.eurl.meta.description',
+ 'Calcul du salaire net à partir du total alloué à la rémunération et inversement'
+ ),
+ ogDescription: t(
+ 'pages.simulateurs.eurl.meta.ogDescription',
+ 'En tant que dirigeant assimilé-salarié, calculez immédiatement votre revenu net après impôt à partir du total alloué à votre rémunération.'
+ ),
+ ogTitle: t(
+ 'pages.simulateurs.eurl.meta.ogTitle',
+ "Rémunération du dirigeant d'EURL : un simulateur pour connaître votre salaire net"
+ ),
+ title: t(
+ 'pages.simulateurs.eurl.meta.titre',
+ 'EURL : simulateur de revenus pour dirigeant'
+ ),
+ },
+ pathId: 'simulateurs.eurl',
+ shortName: t('pages.simulateurs.sasu.shortname', 'EURL'),
+ title: t('pages.simulateurs.sasu.title', "Simulateur d'EURL"),
+ nextSteps: ['is', 'comparaison-statuts'],
+ },
+ 'auto-entrepreneur': {
+ tracking: 'auto_entrepreneur',
+ icône: '🚶♂️',
+ iframePath: 'simulateur-autoentrepreneur',
+ meta: {
+ description: t(
+ 'pages.simulateurs.auto-entrepreneur.meta.description',
+ "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts"
+ ),
+ ogDescription: t(
+ 'pages.simulateurs.auto-entrepreneur.meta.ogDescription',
+ "Grâce au simulateur de revenu auto-entrepreneur développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu."
+ ),
+ ogTitle: t(
+ 'pages.simulateurs.auto-entrepreneur.meta.ogTitle',
+ 'Auto-entrepreneur : calculez rapidement votre revenu net à partir du CA et vice-versa'
+ ),
+ title: t(
+ 'pages.simulateurs.auto-entrepreneur.meta.titre',
+ 'Auto-entrepreneurs : simulateur de revenus'
+ ),
+ },
+ pathId: 'simulateurs.auto-entrepreneur',
+ shortName: t(
+ 'pages.simulateurs.auto-entrepreneur.shortname',
+ 'Auto-entrepreneur'
+ ),
+ title: t(
+ 'pages.simulateurs.auto-entrepreneur.title',
+ 'Simulateur de revenus auto-entrepreneur'
+ ),
+ nextSteps: ['indépendant', 'comparaison-statuts'],
+ },
+ indépendant: {
+ tracking: 'independant',
+ icône: '🏃',
+ iframePath: 'simulateur-independant',
+ pathId: 'simulateurs.indépendant',
+ shortName: t('pages.simulateurs.indépendant.shortname', 'Indépendant'),
+ title: t(
+ 'pages.simulateurs.indépendant.title',
+ 'Simulateur de revenus pour indépendant'
+ ),
+ meta: {
+ title: t(
+ 'pages.simulateurs.indépendant.meta.title',
+ 'Indépendant : simulateur de revenus'
+ ),
+ description: t(
+ 'pages.simulateurs.indépendant.meta.description',
+ "Calcul du revenu net après impôt et des cotisations à partir du chiffre d'affaires et inversement"
+ ),
+ },
+ nextSteps: ['comparaison-statuts', 'is'],
+ },
+
+ 'artiste-auteur': {
+ icône: '👩🎨',
+ tracking: 'artiste-auteur',
+ iframePath: 'simulateur-artiste-auteur',
+ meta: {
+ title: t(
+ 'pages.simulateurs.artiste-auteur.meta.title',
+ 'Artiste-auteur: calcul des cotisations Urssaf'
+ ),
+ description: t(
+ 'pages.simulateurs.artiste-auteur.meta.description',
+ "Estimez les cotisations sociales sur les droits d'auteur et sur le revenu BNC"
+ ),
+ ogTitle: 'Artiste-auteur : estimez vos cotisations Urssaf',
+ ogDescription:
+ "Renseignez vos revenus (droits d'auteur et bnc) et découvrez immédiatement le montant des cotisations que vous aurez à payer sur l'année.",
+ },
+ pathId: 'simulateurs.artiste-auteur',
+ title: t(
+ 'pages.simulateurs.artiste-auteur.title',
+ 'Estimer mes cotisations d’artiste-auteur'
+ ),
+ shortName: t(
+ 'pages.simulateurs.artiste-auteur.shortname',
+ 'Artiste-auteur'
+ ),
+ },
+ 'chômage-partiel': {
+ tracking: 'chomage_partiel',
+ pathId: 'simulateurs.chômage-partiel',
+ icône: '😷',
+ iframePath: 'simulateur-chomage-partiel',
+ meta: {
+ description: t(
+ 'pages.simulateurs.chômage-partiel.meta.description',
+ "Calcul du revenu net pour l'employé et du reste à charge pour l'employeur après remboursement de l'Etat, en prenant en compte toutes les cotisations sociales."
+ ),
+ ogDescription: t(
+ 'pages.simulateurs.chômage-partiel.meta.ogDescription',
+ "Accédez à une première estimation en saisissant à partir d'un salaire brut. Vous pourrez ensuite personaliser votre situation (temps partiel, convention, etc). Prends en compte la totalité des cotisations, y compris celles spécifiques à l'indemnité (CSG et CRDS)."
+ ),
+ ogTitle: t(
+ 'pages.simulateurs.chômage-partiel.meta.ogTitle',
+ "Simulateur chômage partiel : découvrez l'impact sur le revenu net salarié et le coût total employeur."
+ ),
+ title: t(
+ 'pages.simulateurs.chômage-partiel.meta.titre',
+ "Calcul de l'indemnité chômage partiel : le simulateur Urssaf"
+ ),
+ },
+ shortName: t(
+ 'pages.simulateurs.chômage-partiel.shortname',
+ 'Chômage partiel'
+ ),
+ title: t(
+ 'pages.simulateurs.chômage-partiel.title',
+ 'Covid-19 : Simulateur de chômage partiel'
+ ),
+
+ nextSteps: ['salarié', 'aides-embauche'],
+ },
+ 'comparaison-statuts': {
+ tracking: 'comparaison_statut',
+ icône: '📊',
+ pathId: 'simulateurs.comparaison',
+ title: t(
+ 'pages.simulateurs.comparaison.title',
+ 'Indépendant, assimilé salarié ou auto-entrepreneur : quel régime choisir ?'
+ ),
+ meta: {
+ description: t(
+ 'pages.simulateurs.comparaison.meta.description',
+ 'Auto-entrepreneur, indépendant ou dirigeant de SASU ? Avec ce comparatif, trouvez le régime qui vous correspond le mieux'
+ ),
+ title: t(
+ 'pages.simulateurs.comparaison.meta.title',
+ "Création d'entreprise : le comparatif des régimes sociaux"
+ ),
+ },
+ shortName: t(
+ 'pages.simulateurs.comparaison.shortname',
+ 'Comparaison des statuts'
+ ),
+ },
+ 'économie-collaborative': {
+ tracking: 'economie_collaborative',
+ meta: {
+ title: t(
+ 'pages.économie-collaborative.meta.title',
+ 'Déclaration des revenus des plateforme en ligne : guide intéractif'
+ ),
+ description: t(
+ 'pages.économie-collaborative.meta.description',
+ 'Airbnb, Drivy, Blablacar, Leboncoin... Découvrez comment être en règle dans vos déclarations'
+ ),
+ },
+ icône: '🙋',
+ pathId: 'simulateurs.économieCollaborative.index',
+ shortName: t(
+ 'pages.économie-collaborative.shortname',
+ 'Guide économie collaborative'
+ ),
+ },
+ 'aide-déclaration-indépendant': {
+ tracking: {
+ chapter1: 'gerer',
+ chapter2: 'aide_declaration_independant',
+ },
+ icône: '✍️',
+ meta: {
+ description: t(
+ 'pages.gérer.aide-déclaration-indépendant.meta.description',
+ 'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2020.'
+ ),
+ title: t(
+ 'pages.gérer.aide-déclaration-indépendant.meta.title',
+ 'Déclaration de revenus indépendant : calcul du montant des cotisations'
+ ),
+ },
+ pathId: 'simulateurs.déclarationIndépendant',
+ shortName: t(
+ 'pages.gérer.aide-déclaration-indépendant.shortname',
+ 'Aide à la déclaration de revenu'
+ ),
+ title: t(
+ 'pages.gérer.aide-déclaration-indépendant.title',
+ "Aide à la déclaration de revenus au titre de l'année 2020"
+ ),
+ },
+ 'demande-mobilité': {
+ tracking: {
+ chapter1: 'gerer',
+ chapter2: 'demande_mobilite',
+ },
+ icône: '🧳',
+ meta: {
+ title: t(
+ 'pages.gérer.demande-mobilité.meta.title',
+ 'Travailleur indépendant : demande de mobilité en Europe'
+ ),
+ description: t(
+ 'pages.gérer.demande-mobilité.meta.description',
+ "Formulaire interactif à compléter pour les indépendants souhaitant exercer leur activité dans d'autres pays d'Europe"
+ ),
+ },
+ pathId: 'gérer.formulaireMobilité',
+ shortName: t(
+ 'pages.gérer.demande-mobilité.shortname',
+ 'Demande de mobilité internationale'
+ ),
+ private: true,
+ iframePath: 'demande-mobilite',
+ },
+ médecin: {
+ tracking: {
+ chapter2: 'profession_liberale',
+ chapter3: 'medecin',
+ },
+ icône: '⚕️',
+ iframePath: 'médecin',
+ pathId: 'simulateurs.profession-libérale.médecin',
+ shortName: t('pages.simulateurs.médecin.shortname', 'Médecin'),
+ title: t(
+ 'pages.simulateurs.médecin.title',
+ 'Simulateur de revenus pour médecin en libéral'
+ ),
+ },
+ 'chirurgien-dentiste': {
+ icône: '🦷',
+ tracking: {
+ chapter2: 'profession_liberale',
+ chapter3: 'chirurgien_dentiste',
+ },
+ iframePath: 'chirurgien-dentiste',
+ pathId: 'simulateurs.profession-libérale.chirurgien-dentiste',
+ shortName: t(
+ 'pages.simulateurs.chirurgien-dentiste.shortname',
+ 'Chirurgien-dentiste'
+ ),
+ title: t(
+ 'pages.simulateurs.chirurgien-dentiste.title',
+ 'Simulateur de revenus pour chirurgien-dentiste en libéral'
+ ),
+ },
+ 'sage-femme': {
+ icône: '👶',
+ tracking: {
+ chapter2: 'profession_liberale',
+ chapter3: 'sage_femme',
+ },
+ iframePath: 'sage-femme',
+ pathId: 'simulateurs.profession-libérale.sage-femme',
+ shortName: t('pages.simulateurs.sage-femme.shortname', 'Sage-femme'),
+ title: t(
+ 'pages.simulateurs.sage-femme.title',
+ 'Simulateur de revenus pour sage-femme en libéral'
+ ),
+ },
+ 'auxiliaire-médical': {
+ tracking: {
+ chapter2: 'profession_liberale',
+ chapter3: 'auxiliaire_medical',
+ },
+ tooltip: t(
+ 'pages.simulateurs.auxiliaire.tooltip',
+ 'Infirmiers, masseurs-kinésithérapeutes, pédicures-podologues, orthophonistes et orthoptistes'
+ ),
+ icône: '🩹',
+ iframePath: 'auxiliaire-medical',
+ pathId: 'simulateurs.profession-libérale.auxiliaire',
+ shortName: t('pages.simulateurs.auxiliaire.shortname', 'Auxiliaire méd.'),
+ title: t(
+ 'pages.simulateurs.auxiliaire.title',
+ 'Simulateur de revenus pour auxiliaire médical en libéral'
+ ),
+ },
+ avocat: {
+ tracking: {
+ chapter2: 'profession_liberale',
+ chapter3: 'avocat',
+ },
+ icône: '⚖', // j'ai hesité avec 🥑 mais pas envie de me prendre un procès
+ iframePath: 'avocat',
+ pathId: 'simulateurs.profession-libérale.avocat',
+ shortName: t('pages.simulateurs.avocat.shortname', 'Avocat'),
+ title: t(
+ 'pages.simulateurs.avocat.title',
+ 'Simulateur de revenus pour avocat en libéral'
+ ),
+ },
+ 'expert-comptable': {
+ tracking: {
+ chapter2: 'profession_liberale',
+ chapter3: 'expert_comptable',
+ },
+ icône: '🧮',
+ iframePath: 'expert-comptable',
+ pathId: 'simulateurs.profession-libérale.expert-comptable',
+ shortName: t(
+ 'pages.simulateurs.expert-comptable.shortname',
+ 'Expert-Comptable'
+ ),
+ title: t(
+ 'pages.simulateurs.expert-comptable.title',
+ 'Simulateur de revenus pour expert comptable et commissaire aux comptes en libéral'
+ ),
+ },
+ 'profession-libérale': {
+ tracking: {
+ chapter2: 'profession_liberale',
+ },
+ icône: '💻',
+ meta: {
+ title: t(
+ 'pages.simulateurs.profession-libérale.meta.title',
+ 'Professions libérale : le simulateur Urssaf'
+ ),
+ description: t(
+ 'pages.simulateurs.profession-libérale.meta.description',
+ "Calcul du revenu net pour les indépendants en libéral à l'impôt sur le revenu (IR, BNC)"
+ ),
+ },
+ iframePath: 'profession-liberale',
+ pathId: 'simulateurs.profession-libérale.index',
+ shortName: t(
+ 'pages.simulateurs.profession-libérale.shortname',
+ 'Profession libérale'
+ ),
+ title: t(
+ 'pages.simulateurs.profession-libérale.title',
+ 'Simulateur de revenus pour profession libérale'
+ ),
+ },
+ pamc: {
+ private: true,
+ iframePath: 'pamc',
+ tracking: {},
+ title: t(
+ 'pages.simulateurs.pamc.title',
+
+ 'PAMC : simulateurs de cotisations et de revenu'
+ ),
+ pathId: 'simulateurs.pamc',
+ icône: '🏥',
+ meta: {
+ title: t(
+ 'pages.simulateurs.pamc.meta.title',
+ 'Simulateurs régime PAMC'
+ ),
+ description: t(
+ 'pages.simulateurs.pamc.meta.description',
+ 'Calcul du revenu net pour les professions libérales du régime PAMC (médecin, chirurgien-dentiste, sage-femme et auxiliaire médical)'
+ ),
+ },
+ shortName: t('pages.simulateurs.pamc.shortname', 'PAMC'),
+ },
+ 'aides-embauche': {
+ icône: '🎁',
+ tracking: 'aides_embauche',
+ meta: {
+ title: t(
+ 'pages.simulateurs.aides-embauche.meta.title',
+ 'Aides à l’embauche'
+ ),
+ description: t(
+ 'pages.simulateurs.aides-embauche.meta.description',
+ 'Découvrez les principales aides à l’embauche et estimez leur montant en répondant à quelques questions.'
+ ),
+ color: '#11965f',
+ },
+ pathId: 'simulateurs.aide-embauche',
+ iframePath: 'aides-embauche',
+ shortName: t(
+ 'pages.simulateurs.aides-embauche.meta.title',
+ 'Aides à l’embauche'
+ ),
+ title: t(
+ 'pages.simulateurs.aides-embauche.meta.title',
+ 'Aides à l’embauche'
+ ),
+ description: t(
+ 'pages.simulateurs.aides-embauche.introduction',
+ "Les employeurs peuvent bénéficier d'une aide financière pour l'embauche de certains publics prioritaires. Découvrez les dispositifs existants et estimez le montant de l'aide en répondant aux questions."
+ ),
+ nextSteps: ['salarié'],
+ },
+ is: {
+ icône: '🗓',
+ tracking: 'impot-societe',
+ pathId: 'simulateurs.is',
+ iframePath: 'impot-societe',
+ meta: {
+ title: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'),
+ description: t(
+ 'pages.simulateurs.is.meta.description',
+ 'Calculez votre impôt sur les sociétés'
+ ),
+ color: '#E71D66',
+ },
+ shortName: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'),
+ title: t(
+ 'pages.simulateurs.is.title',
+ "Simulateur d'impôt sur les sociétés"
+ ),
+
+ nextSteps: ['salarié', 'comparaison-statuts'],
+ },
+ }
+}
diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx
index 26ab3c556..d6a67be2e 100644
--- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx
@@ -8,7 +8,6 @@ import React, { useContext, useMemo } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { SimulationConfig } from 'Reducers/rootReducer'
import { constructLocalizedSitePath } from '../../sitePaths'
-import { RessourceAutoEntrepreneur } from '../Créer/CreationChecklist'
import AideDéclarationIndépendant from '../Gérer/AideDéclarationIndépendant'
import FormulaireMobilitéIndépendant from '../Gérer/DemandeMobilite'
import AidesEmbauche from './AidesEmbauche'
@@ -29,23 +28,30 @@ import logoFranceRelance from './images/logo-france-relance.svg'
import RémunérationSASUPreview from './images/RémunérationSASUPreview.png'
import salaireBrutNetPreviewEN from './images/SalaireBrutNetPreviewEN.png'
import salaireBrutNetPreviewFR from './images/SalaireBrutNetPreviewFR.png'
+import ISSimulation from './ImpôtSociété'
+import dividendesConfig from './configs/dividendes.yaml'
+import DividendesSimulation from './Dividendes'
import IndépendantSimulation, {
+ EntrepriseIndividuelle,
IndépendantPLSimulation,
-} from './IndépendantSimulation'
-import ISSimulation from './ISSimulation'
+} from './Indépendant'
import PAMCHome from './PAMCHome'
-import SalariéSimulation from './SalariéSimulation'
+import SalariéSimulation from './Salarié'
import SchemeComparaisonPage from './SchemeComparaison'
import ÉconomieCollaborative from './ÉconomieCollaborative'
+import getData from './metadata-src.js'
const simulateurs = [
'salarié',
'auto-entrepreneur',
'indépendant',
+ 'eirl',
+ 'eurl',
'sasu',
'chômage-partiel',
'artiste-auteur',
'comparaison-statuts',
+ 'entreprise-individuelle',
'économie-collaborative',
'aide-déclaration-indépendant',
'demande-mobilité',
@@ -59,10 +65,13 @@ const simulateurs = [
'pamc',
'is',
'aides-embauche',
+ 'dividendes',
] as const
+export type SimulatorId = typeof simulateurs[number]
+
export type SimulatorData = Record<
- typeof simulateurs[number],
+ SimulatorId,
{
meta?: {
title: string
@@ -79,15 +88,16 @@ export type SimulatorData = Record<
chapter1?: 'gerer' | 'creer'
}
| string
- icône: string
+ icône?: string
shortName: string
path?: string
tooltip?: string
- iframe?: string
+ iframePath?: string
title?: string
description?: React.ReactNode
config?: SimulationConfig
seoExplanations?: React.ReactNode
+ nextSteps?: Array
private?: true
component: () => JSX.Element
}
@@ -97,40 +107,19 @@ export function getSimulatorsData({
t = (_: unknown, text: string) => text,
sitePaths = constructLocalizedSitePath('fr'),
language = 'fr',
-}): SimulatorData {
+} = {}): SimulatorData {
+ const pureSimulatorsData = getData({ t })
return {
salarié: {
- tracking: 'salarie',
+ ...pureSimulatorsData['salarié'],
config: salariéConfig,
component: SalariéSimulation,
- icône: '🤝',
- title: t(
- 'pages.simulateurs.salarié.title',
- 'Simulateur de revenus pour salarié'
- ),
- iframe: 'simulateur-embauche',
meta: {
- description: t(
- 'pages.simulateurs.salarié.meta.description',
- "Calcul du salaire net, net après impôt et coût total employeur. Beaucoup d'options disponibles (cadre, stage, apprentissage, heures supplémentaires, etc.)"
- ),
- ogDescription: t(
- 'pages.simulateurs.salarié.meta.ogDescription',
- "En tant que salarié, calculez immédiatement votre revenu net après impôt à partir du brut mensuel ou annuel. En tant qu'employé, estimez le coût total d'une embauche à partir du brut. Ce simulateur est développé avec les experts de l'Urssaf, et il adapte les calculs à votre situation (statut cadre, stage, apprentissage, heures supplémentaire, titre-restaurants, mutuelle, temps partiel, convention collective, etc.)"
- ),
+ ...pureSimulatorsData['salarié'].meta,
ogImage:
language === 'fr' ? salaireBrutNetPreviewFR : salaireBrutNetPreviewEN,
- ogTitle: t(
- 'pages.simulateurs.salarié.meta.ogTitle',
- 'Salaire brut, net, net après impôt, coût total : le simulateur ultime pour salariés et employeurs'
- ),
- title: t(
- 'pages.simulateurs.salarié.meta.titre',
- 'Salaire brut / net : le convertisseur Urssaf'
- ),
},
path: sitePaths.simulateurs.salarié,
- shortName: t('pages.simulateurs.salarié.shortname', 'Salarié'),
seoExplanations: (
Comment calculer le salaire net ?
@@ -155,6 +144,10 @@ export function getSimulatorsData({
? urlIllustrationNetBrut
: urlIllustrationNetBrutEn
}
+ alt={t(
+ 'pages.simulateurs.salarié.alt-image1',
+ 'Salaire net (perçu par le salarié) = Salaire brut (inscrit dans le contrat de travail) - cotisations salariales (retraite, csg, etc)'
+ )}
css={`
width: 100%;
`}
@@ -199,13 +192,185 @@ export function getSimulatorsData({
),
+ nextSteps: ['chômage-partiel', 'aides-embauche'],
+ },
+ 'entreprise-individuelle': {
+ ...pureSimulatorsData['entreprise-individuelle'],
+ config: {
+ ...indépendantConfig,
+ situation: {
+ ...indépendantConfig.situation,
+ 'entreprise . imposition': "'IR'",
+ },
+ },
+ meta: {
+ ...pureSimulatorsData['entreprise-individuelle'].meta,
+ ogImage: AutoEntrepreneurPreview,
+ },
+ component: EntrepriseIndividuelle,
+ path: sitePaths.simulateurs['entreprise-individuelle'],
+ seoExplanations: (
+
+
+ Comment calculer le revenu net d'un dirigeant d'entreprise
+ individuelle (EI) ?
+
+
+ Un dirigeant d'entreprise individuelle doit payer des cotisations et
+ contributions sociales à l'administration. Ces cotisations servent
+ au financement de la sécurité sociale, et ouvrent des droits
+ notamment pour la retraite et pour l'assurance maladie. Elles
+ permettent également de financer la formation professionnelle.
+
+
+ {' '}
+
+ Voir le détail du calcul des cotisations
+
+
+
+ Il ne faut pas oublier de retrancher toutes les dépenses effectuées
+ dans le cadre de l'activité professionnelle (équipements, matières
+ premières, local, transport). Ces dernières sont déductibles du
+ résultat de l'entreprise, cela veut dire que vous ne payerez pas
+ d'impôt ou de cotisations sur leur montant (sauf si vous avez opté
+ pour l'option micro-fiscal).
+
+
+ La formule de calcul complète est donc :
+
+
+ Revenu net = Chiffres d'affaires − Dépenses professionnelles -
+ Cotisations sociales
+
+
+
+
+ Comment calculer les cotisations sociales d'une entreprise
+ individuelle ?
+
+
+ Le dirigeant d'une entreprise individuelle paye des cotisations
+ sociales, proportionnelle au{' '}
+
+ résultat fiscal
+ {' '}
+ de l'entreprise. Leur montant varie également en fonction du type
+ d'activité (profession libérale, artisan, commerçants, etc), où des
+ éventuelles exonérations accordées (ACRE, ZFU, RSA, etc.).
+
+
+ {' '}
+ Comme le résultat d'une entreprise n'est connu qu'à la fin de
+ l'exercice comptable, le dirigeant paye des cotisations
+ provisionnelles qui seront ensuite régularisée une fois le revenu
+ réel déclaré, l'année suivante.
+
+
+ Ce simulateur permet de calculer le montant exact des cotisations
+ sociale en partant d'un chiffre d'affaires ou d'un revenu net
+ souhaité. Vous pourrez préciser votre situation en répondant aux
+ questions s'affichant en dessous de la simulation.
+
+
+ ),
+ nextSteps: ['comparaison-statuts'],
+ },
+ eirl: {
+ ...pureSimulatorsData['eirl'],
+ config: indépendantConfig,
+ meta: {
+ ...pureSimulatorsData['eirl'].meta,
+ ogImage: AutoEntrepreneurPreview,
+ },
+ component: IndépendantSimulation,
+ path: sitePaths.simulateurs.eirl,
+ nextSteps: ['comparaison-statuts'],
+ },
+ sasu: {
+ ...pureSimulatorsData['sasu'],
+ config: sasuConfig,
+ meta: {
+ ...pureSimulatorsData['sasu'].meta,
+ ogImage: RémunérationSASUPreview,
+ },
+ path: sitePaths.simulateurs.sasu,
+ component: function SasuSimulation() {
+ return (
+ <>
+
+ } />
+ >
+ )
+ },
+ seoExplanations: (
+
+ Comment calculer le salaire d'un dirigeant de SASU ?
+
+ Comme pour un salarié classique, le{' '}
+ dirigeant de sasu paye des cotisations sociales sur
+ la rémunération qu'il se verse. Les cotisations sont calculées de la
+ même manière que pour le salarié : elles sont décomposées en partie
+ employeur et partie salarié et sont exprimées comme un pourcentage
+ du salaire brut.
+
+
+ Le dirigeant assimilé-salarié ne paye pas de{' '}
+ cotisations chômage . Par ailleurs, il ne bénéficie
+ pas de la{' '}
+
+ réduction générale de cotisations
+ {' '}
+ ni des dispositifs encadrés par le code du travail comme les{' '}
+
+ heures supplémentaires
+ {' '}
+ ou les primes.
+
+
+ Il peut en revanche prétendre à la{' '}
+
+ réduction ACRE
+ {' '}
+ en debut d'activité, sous certaines conditions.
+
+
+ Vous pouvez utiliser notre simulateur pour calculer la{' '}
+ rémunération nette à partir d'un montant superbrut
+ alloué à la rémunération du dirigeant. Il vous suffit pour cela
+ saisir le montant total alloué dans la case "total chargé". La
+ simulation peut ensuite être affinée en répondant aux différentes
+ questions.
+
+
+ ),
+ nextSteps: ['is', 'comparaison-statuts'],
+ },
+ eurl: {
+ ...pureSimulatorsData['eurl'],
+ config: {
+ ...indépendantConfig,
+ situation: {
+ ...indépendantConfig.situation,
+ 'entreprise . imposition': "'IS'",
+ },
+ },
+ meta: {
+ ...pureSimulatorsData['eurl'].meta,
+ ogImage: RémunérationSASUPreview,
+ },
+ path: sitePaths.simulateurs.eurl,
+ component: IndépendantSimulation,
+ nextSteps: ['is', 'comparaison-statuts'],
},
'auto-entrepreneur': {
+ ...pureSimulatorsData['auto-entrepreneur'],
tracking: 'auto_entrepreneur',
config: autoEntrepreneurConfig,
icône: '🚶♂️',
- iframe: 'simulateur-autoentrepreneur',
+ iframePath: 'simulateur-autoentrepreneur',
meta: {
+ ...pureSimulatorsData['auto-entrepreneur'].meta,
description: t(
'pages.simulateurs.auto-entrepreneur.meta.description',
"Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts"
@@ -297,180 +462,37 @@ export function getSimulatorsData({
auto-entrepreneur
-
- Ressources utiles
-
-
-
-
),
+ nextSteps: ['indépendant', 'comparaison-statuts'],
},
indépendant: {
+ ...pureSimulatorsData['indépendant'],
config: indépendantConfig,
- tracking: 'independant',
- icône: '🏃',
- iframe: 'simulateur-independant',
path: sitePaths.simulateurs.indépendant,
- shortName: t('pages.simulateurs.indépendant.shortname', 'Indépendant'),
- title: t(
- 'pages.simulateurs.indépendant.title',
- 'Simulateur de revenus pour indépendant'
- ),
meta: {
- title: t(
- 'pages.simulateurs.indépendant.meta.title',
- 'Indépendant : simulateur de revenus Urssaf'
- ),
- description: t(
- 'pages.simulateurs.indépendant.meta.description',
- "Calcul du revenu net après impôt et des cotisations à partir du chiffre d'affaires et inversement"
- ),
+ ...pureSimulatorsData['indépendant'].meta,
},
component: IndépendantSimulation,
- },
- sasu: {
- config: sasuConfig,
- tracking: 'dirigeant_sasu',
- icône: '👨✈️',
- iframe: 'simulateur-assimilesalarie',
- meta: {
- description: t(
- 'pages.simulateurs.sasu.meta.description',
- 'Calcul du salaire net à partir du total alloué à la rémunération et inversement'
- ),
- ogDescription: t(
- 'pages.simulateurs.sasu.meta.ogDescription',
- 'En tant que dirigeant assimilé-salarié, calculez immédiatement votre revenu net après impôt à partir du total alloué à votre rémunération.'
- ),
- ogImage: RémunérationSASUPreview,
- ogTitle: t(
- 'pages.simulateurs.sasu.meta.ogTitle',
- 'Rémunération du dirigeant de SASU : un simulateur pour connaître votre salaire net'
- ),
- title: t(
- 'pages.simulateurs.sasu.meta.titre',
- 'Dirigeant de SASU : simulateur de revenus Urssaf'
- ),
- },
- path: sitePaths.simulateurs.SASU,
- shortName: t('pages.simulateurs.sasu.shortname', 'Dirigeant de SASU'),
- title: t(
- 'pages.simulateurs.sasu.title',
- 'Simulateur de revenus pour dirigeant de SASU'
- ),
- component: function SasuSimulation() {
- return (
- <>
-
- } />
- >
- )
- },
- seoExplanations: (
-
- Comment calculer le salaire d'un dirigeant de SASU ?
-
- Comme pour un salarié classique, le{' '}
- dirigeant de sasu paye des cotisations sociales sur
- la rémunération qu'il se verse. Les cotisations sont calculées de la
- même manière que pour le salarié : elles sont décomposées en partie
- employeur et partie salarié et sont exprimées comme un pourcentage
- du salaire brut.
-
-
- Le dirigeant assimilé-salarié ne paye pas de{' '}
- cotisations chômage . Par ailleurs, il ne bénéficie
- pas de la{' '}
-
- réduction générale de cotisations
- {' '}
- ni des dispositifs encadrés par le code du travail comme les{' '}
-
- heures supplémentaires
- {' '}
- ou les primes.
-
-
- Il peut en revanche prétendre à la{' '}
-
- réduction ACRE
- {' '}
- en debut d'activité, sous certaines conditions.
-
-
- Vous pouvez utiliser notre simulateur pour calculer la{' '}
- rémunération nette à partir d'un montant superbrut
- alloué à la rémunération du dirigeant. Il vous suffit pour cela
- saisir le montant total alloué dans la case "total chargé". La
- simulation peut ensuite être affinée en répondant aux différentes
- questions.
-
-
- ),
+ nextSteps: ['comparaison-statuts', 'is'],
},
'artiste-auteur': {
- icône: '👩🎨',
- tracking: 'artiste-auteur',
- iframe: 'simulateur-artiste-auteur',
+ ...pureSimulatorsData['artiste-auteur'],
meta: {
- title: t(
- 'pages.simulateurs.artiste-auteur.meta.title',
- 'Artiste-auteur: calcul des cotisations Urssaf'
- ),
- description: t(
- 'pages.simulateurs.artiste-auteur.meta.description',
- "Estimez les cotisations sociales sur les droits d'auteur et sur le revenu BNC"
- ),
- ogTitle: 'Artiste-auteur : estimez vos cotisations Urssaf',
- ogDescription:
- "Renseignez vos revenus (droits d'auteur et bnc) et découvrez immédiatement le montant des cotisations que vous aurez à payer sur l'année.",
+ ...pureSimulatorsData['artiste-auteur'].meta,
},
path: sitePaths.simulateurs['artiste-auteur'],
- title: t(
- 'pages.simulateurs.artiste-auteur.title',
- 'Estimer mes cotisations d’artiste-auteur'
- ),
- shortName: t(
- 'pages.simulateurs.artiste-auteur.shortname',
- 'Artiste-auteur'
- ),
component: ArtisteAuteur,
},
'chômage-partiel': {
- tracking: 'chomage_partiel',
+ ...pureSimulatorsData['chômage-partiel'],
component: ChômagePartielComponent,
config: chômageParielConfig,
path: sitePaths.simulateurs['chômage-partiel'],
- icône: '😷',
- iframe: 'simulateur-chomage-partiel',
meta: {
- description: t(
- 'pages.simulateurs.chômage-partiel.meta.description',
- "Calcul du revenu net pour l'employé et du reste à charge pour l'employeur après remboursement de l'Etat, en prenant en compte toutes les cotisations sociales."
- ),
- ogDescription: t(
- 'pages.simulateurs.chômage-partiel.meta.ogDescription',
- "Accédez à une première estimation en saisissant à partir d'un salaire brut. Vous pourrez ensuite personaliser votre situation (temps partiel, convention, etc). Prends en compte la totalité des cotisations, y compris celles spécifiques à l'indemnité (CSG et CRDS)."
- ),
+ ...pureSimulatorsData['chômage-partiel'].meta,
ogImage: ChômagePartielPreview,
- ogTitle: t(
- 'pages.simulateurs.chômage-partiel.meta.ogTitle',
- "Simulateur chômage partiel : découvrez l'impact sur le revenu net salarié et le coût total employeur."
- ),
- title: t(
- 'pages.simulateurs.chômage-partiel.meta.titre',
- "Calcul de l'indemnité chômage partiel : le simulateur Urssaf"
- ),
},
- shortName: t(
- 'pages.simulateurs.chômage-partiel.shortname',
- 'Chômage partiel'
- ),
- title: t(
- 'pages.simulateurs.chômage-partiel.title',
- 'Covid-19 : Simulateur de chômage partiel'
- ),
seoExplanations: (
Comment calculer l'indemnité d'activité partielle ?
@@ -543,278 +565,140 @@ export function getSimulatorsData({
),
+ nextSteps: ['salarié', 'aides-embauche'],
},
'comparaison-statuts': {
+ ...pureSimulatorsData['comparaison-statuts'],
component: SchemeComparaisonPage,
- tracking: 'comparaison_statut',
- icône: '📊',
path: sitePaths.simulateurs.comparaison,
- title: t(
- 'pages.simulateurs.comparaison.title',
- 'Indépendant, assimilé salarié ou auto-entrepreneur : quel régime choisir ?'
- ),
meta: {
- description: t(
- 'pages.simulateurs.comparaison.meta.description',
- 'Auto-entrepreneur, indépendant ou assimilé salarié ? Avec ce comparatif, trouvez le régime qui vous correspond le mieux'
- ),
- title: t(
- 'pages.simulateurs.comparaison.meta.title',
- "Création d'entreprise : le comparatif des régimes sociaux"
- ),
+ ...pureSimulatorsData['comparaison-statuts'].meta,
},
- shortName: t(
- 'pages.simulateurs.comparaison.shortname',
- 'Comparaison des statuts'
- ),
},
'économie-collaborative': {
- tracking: 'economie_collaborative',
+ ...pureSimulatorsData['économie-collaborative'],
component: ÉconomieCollaborative,
meta: {
- title: t(
- 'pages.économie-collaborative.meta.title',
- 'Déclaration des revenus des plateforme en ligne : guide intéractif'
- ),
- description: t(
- 'pages.économie-collaborative.meta.description',
- 'Airbnb, Drivy, Blablacar, Leboncoin... Découvrez comment être en règle dans vos déclarations'
- ),
+ ...pureSimulatorsData['économie-collaborative'].meta,
},
- icône: '🙋',
path: sitePaths.simulateurs.économieCollaborative.index,
- shortName: t(
- 'pages.économie-collaborative.shortname',
- 'Guide économie collaborative'
- ),
},
'aide-déclaration-indépendant': {
+ ...pureSimulatorsData['aide-déclaration-indépendant'],
component: AideDéclarationIndépendant,
tracking: {
chapter1: 'gerer',
chapter2: 'aide_declaration_independant',
},
- icône: '✍️',
meta: {
- description: t(
- 'pages.gérer.aide-déclaration-indépendant.meta.description',
- 'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2019.'
- ),
- title: t(
- 'pages.gérer.aide-déclaration-indépendant.meta.title',
- 'Déclaration de revenus indépendant : calcul du montant des cotisations'
- ),
+ ...pureSimulatorsData['aide-déclaration-indépendant'].meta,
},
path: sitePaths.gérer.déclarationIndépendant,
- shortName: t(
- 'pages.gérer.aide-déclaration-indépendant.shortname',
- 'Aide à la déclaration de revenu'
- ),
- title: t(
- 'pages.gérer.aide-déclaration-indépendant.title',
- "Aide à la déclaration de revenus au titre de l'année 2019"
- ),
},
'demande-mobilité': {
+ ...pureSimulatorsData['demande-mobilité'],
component: FormulaireMobilitéIndépendant,
tracking: {
chapter1: 'gerer',
chapter2: 'demande_mobilite',
},
- icône: '🧳',
meta: {
- title: t(
- 'pages.gérer.demande-mobilité.meta.title',
- 'Travailleur indépendant : demande de mobilité en Europe'
- ),
- description: t(
- 'pages.gérer.demande-mobilité.meta.description',
- "Formulaire interactif à compléter pour les indépendants souhaitant exercer leur activité dans d'autres pays d'Europe"
- ),
+ ...pureSimulatorsData['demande-mobilité'].meta,
},
path: sitePaths.gérer.formulaireMobilité,
- shortName: t(
- 'pages.gérer.demande-mobilité.shortname',
- 'Demande de mobilité internationale'
- ),
private: true,
- iframe: 'demande-mobilite',
},
médecin: {
+ ...pureSimulatorsData['médecin'],
config: médecinConfig,
tracking: {
chapter2: 'profession_liberale',
chapter3: 'medecin',
},
- icône: '⚕️',
- iframe: 'médecin',
path: sitePaths.simulateurs['profession-libérale'].médecin,
- shortName: t('pages.simulateurs.médecin.shortname', 'Médecin'),
- title: t(
- 'pages.simulateurs.médecin.title',
- 'Simulateur de revenus pour médecin en libéral'
- ),
component: IndépendantPLSimulation,
},
'chirurgien-dentiste': {
+ ...pureSimulatorsData['chirurgien-dentiste'],
config: dentisteConfig,
- icône: '🦷',
tracking: {
chapter2: 'profession_liberale',
chapter3: 'chirurgien_dentiste',
},
- iframe: 'chirurgien-dentiste',
path: sitePaths.simulateurs['profession-libérale']['chirurgien-dentiste'],
- shortName: t(
- 'pages.simulateurs.chirurgien-dentiste.shortname',
- 'Chirurgien-dentiste'
- ),
- title: t(
- 'pages.simulateurs.chirurgien-dentiste.title',
- 'Simulateur de revenus pour chirurgien-dentiste en libéral'
- ),
component: IndépendantPLSimulation,
},
'sage-femme': {
+ ...pureSimulatorsData['sage-femme'],
config: sageFemmeConfig,
- icône: '👶',
tracking: {
chapter2: 'profession_liberale',
chapter3: 'sage_femme',
},
- iframe: 'sage-femme',
path: sitePaths.simulateurs['profession-libérale']['sage-femme'],
- shortName: t('pages.simulateurs.sage-femme.shortname', 'Sage-femme'),
- title: t(
- 'pages.simulateurs.sage-femme.title',
- 'Simulateur de revenus pour sage-femme en libéral'
- ),
component: IndépendantPLSimulation,
},
'auxiliaire-médical': {
+ ...pureSimulatorsData['auxiliaire-médical'],
config: auxiliaireConfig,
tracking: {
chapter2: 'profession_liberale',
chapter3: 'auxiliaire_medical',
},
- tooltip: t(
- 'pages.simulateurs.auxiliaire.tooltip',
- 'Infirmiers, masseurs-kinésithérapeutes, pédicures-podologues, orthophonistes et orthoptistes'
- ),
- icône: '🩹',
- iframe: 'auxiliaire-medical',
path: sitePaths.simulateurs['profession-libérale'].auxiliaire,
- shortName: t('pages.simulateurs.auxiliaire.shortname', 'Auxiliaire méd.'),
- title: t(
- 'pages.simulateurs.auxiliaire.title',
- 'Simulateur de revenus pour auxiliaire médical en libéral'
- ),
component: IndépendantPLSimulation,
},
avocat: {
+ ...pureSimulatorsData['avocat'],
config: avocatConfig,
tracking: {
chapter2: 'profession_liberale',
chapter3: 'avocat',
},
- icône: '⚖', // j'ai hesité avec 🥑 mais pas envie de me prendre un procès
- iframe: 'avocat',
path: sitePaths.simulateurs['profession-libérale'].avocat,
- shortName: t('pages.simulateurs.avocat.shortname', 'Avocat'),
- title: t(
- 'pages.simulateurs.avocat.title',
- 'Simulateur de revenus pour avocat en libéral'
- ),
component: IndépendantPLSimulation,
},
'expert-comptable': {
+ ...pureSimulatorsData['expert-comptable'],
config: expertComptableConfig,
tracking: {
chapter2: 'profession_liberale',
chapter3: 'expert_comptable',
},
- icône: '🧮',
- iframe: 'expert-comptable',
path: sitePaths.simulateurs['profession-libérale']['expert-comptable'],
- shortName: t(
- 'pages.simulateurs.expert-comptable.shortname',
- 'Expert-Comptable'
- ),
- title: t(
- 'pages.simulateurs.expert-comptable.title',
- 'Simulateur de revenus pour expert comptable et commissaire aux comptes en libéral'
- ),
component: IndépendantPLSimulation,
},
'profession-libérale': {
+ ...pureSimulatorsData['profession-libérale'],
config: professionLibéraleConfig,
tracking: {
chapter2: 'profession_liberale',
},
- icône: '💻',
meta: {
- title: t(
- 'pages.simulateurs.profession-libérale.meta.title',
- 'Professions libérale : le simulateur Urssaf'
- ),
- description: t(
- 'pages.simulateurs.profession-libérale.meta.description',
- "Calcul du revenu net pour les indépendants en libéral à l'impôt sur le revenu (IR, BNC)"
- ),
+ ...pureSimulatorsData['profession-libérale'].meta,
},
- iframe: 'profession-liberale',
path: sitePaths.simulateurs['profession-libérale'].index,
- shortName: t(
- 'pages.simulateurs.profession-libérale.shortname',
- 'Profession libérale'
- ),
- title: t(
- 'pages.simulateurs.profession-libérale.title',
- 'Simulateur de revenus pour profession libérale'
- ),
component: IndépendantPLSimulation,
},
pamc: {
+ ...pureSimulatorsData['pamc'],
private: true,
- iframe: 'pamc',
tracking: {},
- title: t(
- 'pages.simulateurs.pamc.title',
-
- 'PAMC : simulateurs de cotisations et de revenu'
- ),
path: sitePaths.simulateurs.pamc,
config: professionLibéraleConfig,
- icône: '🏥',
meta: {
- title: t(
- 'pages.simulateurs.pamc.meta.title',
- 'Simulateurs régime PAMC'
- ),
- description: t(
- 'pages.simulateurs.pamc.meta.description',
- 'Calcul du revenu net pour les professions libérales du régime PAMC (médecin, chirurgien-dentiste, sage-femme et auxiliaire médical)'
- ),
+ ...pureSimulatorsData['pamc'].meta,
},
- shortName: t('pages.simulateurs.pamc.shortname', 'PAMC'),
component: PAMCHome,
},
'aides-embauche': {
- icône: '🎁',
+ ...pureSimulatorsData['aides-embauche'],
tracking: 'aides_embauche',
meta: {
- title: 'Aides à l’embauche',
- description:
- 'Découvrez les principales aides à l’embauche et estimez leur montant en répondant à quelques questions.',
- color: '#11965f',
+ ...pureSimulatorsData['aides-embauche'].meta,
},
path: sitePaths.simulateurs['aides-embauche'],
- iframe: 'aides-embauche',
- shortName: 'Aides à l’embauche',
- title: t(
- 'pages.simulateurs.aides-embauche.meta.title',
- "Aides à l'embauche"
- ),
+ // Cette description est surchargé car elle contient ici du JSX
description: (
@@ -842,25 +726,15 @@ export function getSimulatorsData({
),
component: AidesEmbauche,
+ nextSteps: ['salarié'],
},
is: {
- icône: '🗓',
+ ...pureSimulatorsData['is'],
tracking: 'impot-societe',
path: sitePaths.simulateurs.is,
- iframe: 'impot-societe',
meta: {
- title: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'),
- description: t(
- 'pages.simulateurs.pamc.meta.description',
- 'Calculez votre impôt sur les sociétés'
- ),
- color: '#E71D66',
+ ...pureSimulatorsData['is'].meta,
},
- shortName: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'),
- title: t(
- 'pages.simulateurs.is.title',
- "Simulateur d'impôt sur les sociétés"
- ),
component: ISSimulation,
seoExplanations: (
@@ -895,6 +769,78 @@ export function getSimulatorsData({
),
+ nextSteps: ['salarié', 'dividendes', 'comparaison-statuts'],
+ },
+ dividendes: {
+ icône: '🎩',
+ tracking: 'dividendes',
+ path: sitePaths.simulateurs.dividendes,
+ iframePath: 'dividendes',
+ meta: {
+ title: t('pages.simulateurs.dividendes.meta.title', 'Dividendes'),
+ description: t(
+ 'pages.simulateurs.dividendes.meta.description',
+ "Calculez le montant de l'impôt et des cotisations sur les dividendes versés par votre entreprise."
+ ),
+ color: '#E71D66',
+ },
+ shortName: t('pages.simulateurs.dividendes.meta.title', 'Dividendes'),
+ title: t(
+ 'pages.simulateurs.dividendes.title',
+ 'Simulateur de versement de dividendes'
+ ),
+ component: DividendesSimulation,
+ config: dividendesConfig,
+ seoExplanations: (
+
+ Les dividendes et distributions
+
+ A la fin de l'exercice d'une société, le résultat de l'exercice
+ précédent peut être conservé en réserve (pour de futurs
+ investissements) ou bien être versé en dividendes. Du point de vue
+ des bénéficiaires, ce sont des revenus de capitaux mobiliers, soumis
+ à des cotisations et une imposition spécifiques.
+
+
+ Ne sont pris en compte dans ce simulateur que les cas de figure du
+ bénéficiaire personne physique et des dividendes décidés par la
+ société.
+
+ Comment sont calculés les prélèvements sur les dividendes ?
+
+ Les dividendes peuvent être soumis au prélèvement forfaitaire unique
+ de 30% incluant imposition et contributions sociales (aussi appelé
+ flat tax ). Par option, le barème de l'impôt peut être
+ choisi. Ce simulateur peut être utilisé pour comparer les deux
+ régimes.
+
+
+ Un acompte du montant de l'impôt (12,8%) est prélevé au moment du
+ versement des dividendes, sauf si le bénéficiaire remplit{' '}
+
+ certains critères
+
+ .
+
+
+ Cas particulier du dirigeant au régime du travailleur indépendant
+
+
+ {' '}
+ Au régime du travailleur indépendant, la part des dividendes
+ dépassant 10% du capital social sera soumise au cotisations et
+ contributions au même titre que les revenus du dirigeant.
+
+
+ Ce cas de figure n'est pas encore pris en compte par ce simulateur.
+
+
+ ),
+ nextSteps: ['salarié', 'is', 'comparaison-statuts'],
},
}
}
diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/Activité.tsx b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/Activité.tsx
index 404eeed1b..20d8f1ff4 100644
--- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/Activité.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/Activité.tsx
@@ -1,10 +1,10 @@
-import Animate from 'Components/ui/animate'
+import { FromBottom } from 'Components/ui/animate'
+import Emoji from 'Components/utils/Emoji'
import { Markdown } from 'Components/utils/markdown'
import { ScrollToTop } from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { formatValue } from 'publicodes'
import { useContext } from 'react'
-import emoji from 'react-easy-emoji'
import { Trans, useTranslation } from 'react-i18next'
import { Redirect } from 'react-router-dom'
import { TrackPage } from '../../../ATInternetTracking'
@@ -36,7 +36,7 @@ export default function Activité({
if (activité.activités) {
return (
-
+
{activité.titre}
@@ -52,7 +52,7 @@ export default function Activité({
activités={activité.activités.map(({ titre }: Activity) => titre)}
/>
-
+
)
}
@@ -61,15 +61,15 @@ export default function Activité({
return (
-
+
- {emoji(activité.icônes)} {activité.titre}
+ {activité.titre}
{activité.plateformes && (
- {emoji('📱 ')}
+
{activité.plateformes.join(', ')}
)}
@@ -188,7 +188,7 @@ export default function Activité({
>
)}
-
+
)
}
diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/ActivitésSelection.tsx b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/ActivitésSelection.tsx
index ef445c0be..6bdc1f7eb 100644
--- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/ActivitésSelection.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/ActivitésSelection.tsx
@@ -1,12 +1,12 @@
import classnames from 'classnames'
-import Animate from 'Components/ui/animate'
+import { FromBottom } from 'Components/ui/animate'
import Checkbox from 'Components/ui/Checkbox'
import InfoBulle from 'Components/ui/InfoBulle'
+import Emoji from 'Components/utils/Emoji'
import { ScrollToTop } from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { intersection } from 'ramda'
import React, { useCallback, useContext } from 'react'
-import emoji from 'react-easy-emoji'
import { Trans, useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
import { TrackPage } from '../../../ATInternetTracking'
@@ -29,7 +29,7 @@ export default function ActivitésSelection() {
)
return (
<>
-
+
{titre}
@@ -40,7 +40,11 @@ export default function ActivitésSelection() {
plateformes en ligne (Airbnb, Abritel, Drivy,
Blablacar, Leboncoin, etc.) ? Vous devez les déclarer dans la
plupart des cas. Cependant, il peut être difficile de s'y
- retrouver {emoji('🤔')} .
+ retrouver{' '}
+
+
+
+ .
Suivez ce guide pour savoir en quelques clics comment être en
@@ -67,10 +71,10 @@ export default function ActivitésSelection() {
PS : cet outil est là uniquement pour vous informer, aucune donnée
ne sera transmise aux administrations
{' '}
- {emoji('😌')}
+
-
+
>
)
}
@@ -199,6 +203,8 @@ const ActivitéContent = ({
{plateformes.join(', ')}
{label && {label}
}
- {emoji(icônes)}
+
+
+
>
)
diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx
index 52f463704..1964996dc 100644
--- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx
+++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx
@@ -1,8 +1,8 @@
-import Animate from 'Components/ui/animate'
+import { FromBottom } from 'Components/ui/animate'
+import Emoji from 'Components/utils/Emoji'
import { ScrollToTop } from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext } from 'react'
-import emoji from 'react-easy-emoji'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { Link, Redirect } from 'react-router-dom'
@@ -41,12 +41,12 @@ export default function VotreSituation() {
}
const déclarations = déclarationsSelector(state)
- const régimeGénéralDisponible = activitésEffectuéesSelector(
- state
- ).some((activité) => régimeGénéralDisponibleSelector(state, activité))
+ const régimeGénéralDisponible = activitésEffectuéesSelector(state).some(
+ (activité) => régimeGénéralDisponibleSelector(state, activité)
+ )
return (
-
+
@@ -141,7 +141,7 @@ export default function VotreSituation() {
- {emoji('🧰')} Ressources utiles
+ Ressources utiles
-
+
)
}
diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/activités.en.yaml b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/activités.en.yaml
index ceff6a920..a952b0b54 100644
--- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/activités.en.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/activités.en.yaml
@@ -6,8 +6,8 @@ Location meublée:
- Abritel
- Guest room
- classified tourism
-
-Location meublée standard:
+
+Location meublée standard:
titre: Standard furnished rental
explication: You have rented furnished accommodation for short periods of time to a visiting clientele who do not elect domicile there (excluding guest rooms or furnished tourist accommodation)
exonérations:
@@ -21,7 +21,7 @@ Location meublée de tourisme classé:
titre: Furnished rental of classified tourism
explication: The property must have previously been declared to the municipality where it is located. At the end of this procedure, a declaration number (13 characters) is issued. Any change is subject to a new declaration.
-Location de chambre d'hôtes:
+Location de chambre d'hôtes:
titre: Rental of guest rooms
explication: You are a B&B rental company and meet the requirements of the Tourism Code
@@ -52,7 +52,7 @@ Vente de biens occasionnelle:
exonérée sauf si:
- titre: You sell precious metals (gold, silver, ingots)
explication: For the transfer of precious metals, you are subject to the flat-rate tax on precious metals, which you must pay within one month of the transfer.
-
+
Vente de biens professionnelle:
titre: Sale of professional goods
explication: |
@@ -74,5 +74,3 @@ Co-consommation:
- titre: You exceed the limit of the kilometric scale (for carpooling)
explication: |
When it comes to carpooling, there is a third condition: the full fare must not exceed the current kilometric rate and must be divided by the number of people transported, including the car owner.
-
-
diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/activités.yaml b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/activités.yaml
index 1214a1e00..7db4c1d2f 100644
--- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/activités.yaml
+++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/activités.yaml
@@ -24,7 +24,7 @@
> Vous louez à Paris, dans votre résidence principale, une chambre de 18 m² à un étudiant. Pour être exonéré d'impôt, le loyer mensuel hors charges ne doit pas dépasser en 2019 (187 x 18) / 12 = 280 €.
- titre: Location meublée de longue durée
icônes: 🏠 📆
- explication: Vous avez loué un logement meublé de longue durée
+ explication: Vous avez loué un logement meublé de longue durée
plateformes:
- Leboncoin
- pap.fr
diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js
index def769e08..f239f1baa 100644
--- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js
+++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js
@@ -1,12 +1,14 @@
import { hasConditions } from './activitésData'
-const filterActivités = (filter = () => true) => (state) =>
- Object.entries(state)
- .filter(
- ([activitéTitle, activitéData]) =>
- activitéData.effectuée && filter(activitéData, activitéTitle)
- )
- .map(([activité]) => activité)
+const filterActivités =
+ (filter = () => true) =>
+ (state) =>
+ Object.entries(state)
+ .filter(
+ ([activitéTitle, activitéData]) =>
+ activitéData.effectuée && filter(activitéData, activitéTitle)
+ )
+ .map(([activité]) => activité)
export const nextActivitéSelector = (state, currentActivité) =>
filterActivités(
diff --git a/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx b/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx
index e3215afaa..92bcd2ff8 100644
--- a/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx
+++ b/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx
@@ -1,4 +1,4 @@
-import Animate from 'Components/ui/animate'
+import { FromTop } from 'Components/ui/animate'
import { useState } from 'react'
import stats from '../../data/stats.json'
@@ -6,7 +6,7 @@ export default function DemandeUtilisateurs() {
const [extendedView, setExtendedView] = useState(false)
return (
- Demandes utilisateurs
+ Demandes utilisateurs
Demandes formulées en utilisant le bouton "faire une suggestion"
@@ -47,7 +47,7 @@ function Issue({
closedAt: string | null
}) {
return (
-
+
{count > 1 && (
{count} demandes
@@ -59,7 +59,7 @@ function Issue({
(Résolu en {formatMonth(new Date(closedAt))})
)}
-
+
)
}
diff --git a/mon-entreprise/source/pages/Stats/GlobalStats.tsx b/mon-entreprise/source/pages/Stats/GlobalStats.tsx
new file mode 100644
index 000000000..a2b894436
--- /dev/null
+++ b/mon-entreprise/source/pages/Stats/GlobalStats.tsx
@@ -0,0 +1,202 @@
+import Emoji from 'Components/utils/Emoji'
+import { useTranslation } from 'react-i18next'
+import { SatisfactionStyle } from './SatisfactionChart'
+import { SatisfactionLevel, StatsStruct } from './types'
+import { Indicator, Indicators } from './utils'
+
+const add = (a: number, b: number) => a + b
+const lastCompare = (startDate: Date, dateStr: string) =>
+ startDate < new Date(dateStr)
+
+const BigIndicator: typeof Indicator = ({ main, subTitle, footnote }) => (
+
+ {main}
+
+ }
+ subTitle={subTitle}
+ footnote={footnote}
+ />
+)
+
+const RetoursAsProgress = ({
+ percentages,
+}: {
+ percentages: Record
+}) => (
+
+ {' '}
+ {SatisfactionStyle.map(([level, { emoji: emojiStr, color }]) => (
+
+
+
+ {Math.round(percentages[level])}%
+
+
+ ))}
+
+)
+export default function GlobalStats({ stats }: { stats: StatsStruct }) {
+ const { i18n } = useTranslation()
+ const formatNumber = Intl.NumberFormat(i18n.language).format.bind(null)
+
+ const totalVisits = formatNumber(
+ stats.visitesMois.site.map(({ nombre }) => nombre).reduce(add, 0)
+ )
+ const totalCommenceATI = stats.visitesMois.pages
+ .filter(({ page }) => page === 'simulation_commencee')
+ .map(({ nombre }) => nombre)
+ .reduce(add, 0)
+ // Hardcoded stuff from https://github.com/betagouv/mon-entreprise/pull/1563#discussion_r635893624
+ const totalCommenceMatomo = Object.values({
+ 2019: Math.floor((1262601 * 45) / 100),
+ 2020: 1373536,
+ 2021: 273731,
+ }).reduce(add, 0)
+ const totalCommence = formatNumber(totalCommenceMatomo + totalCommenceATI)
+
+ const day30before = new Date(new Date().setDate(new Date().getDate() - 30))
+
+ const last30dVisitsNum = stats.visitesJours.site
+ .filter(({ date }) => lastCompare(day30before, date))
+ .map(({ nombre }) => nombre)
+ .reduce(add, 0)
+ const last30dVisits = formatNumber(last30dVisitsNum)
+ const last30dCommenceNum = stats.visitesJours.pages
+ .filter(
+ ({ date, page }) =>
+ lastCompare(day30before, date) && page === 'simulation_commencee'
+ )
+ .map(({ nombre }) => nombre)
+ .reduce(add, 0)
+ const last30dCommence = formatNumber(last30dCommenceNum)
+ const last30dConv = Math.round((100 * last30dCommenceNum) / last30dVisitsNum)
+
+ const currentMonthSatisfaction = (() => {
+ const currentMonthSatisfaction = stats.satisfaction
+ .filter(({ month }) =>
+ month.startsWith(new Date().toISOString().slice(0, 7))
+ )
+ .reduce(
+ (acc, { click: satisfactionLevel, nombre }) => ({
+ ...acc,
+ [satisfactionLevel]: acc[satisfactionLevel] + nombre,
+ }),
+ {
+ [SatisfactionLevel.Mauvais]: 0,
+ [SatisfactionLevel.Moyen]: 0,
+ [SatisfactionLevel.Bien]: 0,
+ [SatisfactionLevel.TrèsBien]: 0,
+ }
+ )
+
+ const total = Object.values(currentMonthSatisfaction).reduce(
+ (a, b) => a + b
+ )
+ return {
+ total,
+ percentages: Object.fromEntries(
+ Object.entries(currentMonthSatisfaction).map(([level, count]) => [
+ level,
+ (100 * count) / total,
+ ])
+ ) as Record,
+ }
+ })()
+
+ return (
+ <>
+ {' '}
+
+
+
+
+
+
+
+
+
+
+ Taux de conversion vers une simulation : {' '}
+ {last30dConv}%
+
+
+
+
+ {' '}
+
+
+ }
+ footnote={`${currentMonthSatisfaction.total} avis ce mois ci`}
+ width="75%"
+ />
+
+ >
+ )
+}
diff --git a/mon-entreprise/source/pages/Stats/LazyStats.tsx b/mon-entreprise/source/pages/Stats/LazyStats.tsx
index b93a7f90e..5d1092751 100644
--- a/mon-entreprise/source/pages/Stats/LazyStats.tsx
+++ b/mon-entreprise/source/pages/Stats/LazyStats.tsx
@@ -4,7 +4,7 @@ const Stats = lazy(() => import('./Stats'))
export default function LazyStats() {
return (
Chargement de la page stats
}
+ fallback={Chargement des statistiques...
}
>
diff --git a/mon-entreprise/source/pages/Stats/SatisfactionChart.tsx b/mon-entreprise/source/pages/Stats/SatisfactionChart.tsx
index 8e1dbe2a6..33200710b 100644
--- a/mon-entreprise/source/pages/Stats/SatisfactionChart.tsx
+++ b/mon-entreprise/source/pages/Stats/SatisfactionChart.tsx
@@ -1,7 +1,5 @@
-import { ThemeColorsContext } from 'Components/utils/colors'
+import Emoji from 'Components/utils/Emoji'
import { add, mapObjIndexed } from 'ramda'
-import React, { useContext } from 'react'
-import emoji from 'react-easy-emoji'
import {
Bar,
BarChart,
@@ -10,6 +8,22 @@ import {
Tooltip,
XAxis,
} from 'recharts'
+import { SatisfactionLevel } from './types'
+
+export const SatisfactionStyle: [
+ SatisfactionLevel,
+ { emoji: string; color: string }
+][] = [
+ [SatisfactionLevel.Mauvais, { emoji: '🙁', color: '#ff5959' }],
+ [SatisfactionLevel.Moyen, { emoji: '😐', color: '#fff339' }],
+ [SatisfactionLevel.Bien, { emoji: '🙂', color: '#90e789' }],
+ [SatisfactionLevel.TrèsBien, { emoji: '😀', color: '#0fc700' }],
+]
+
+function toPercentage(data: Record): Record {
+ const total = Object.values(data).reduce(add)
+ return { ...mapObjIndexed((value) => (100 * value) / total, data), total }
+}
type SatisfactionChartProps = {
data: Array<{
@@ -17,39 +31,34 @@ type SatisfactionChartProps = {
nombre: Record
}>
}
-
-function toPercentage(data: Record): Record {
- const total = Object.values(data).reduce(add)
- return { ...mapObjIndexed((value) => (100 * value) / total, data), total }
-}
export default function SatisfactionChart({ data }: SatisfactionChartProps) {
- const { color, lightColor, lighterColor } = useContext(ThemeColorsContext)
if (!data.length) {
return null
}
- const flattenData = data.map((d) => ({ ...d, ...toPercentage(d.nombre) }))
+ const flattenData = data
+ .map((d) => ({ ...d, ...toPercentage(d.nombre) }))
+ .filter((d) => Object.values(d.nombre).reduce((a, b) => a + b, 0))
return (
<>
} />
-
- '🙁'} position="left" />
-
-
- '😐'} position="left" />
-
-
- '🙂'} position="left" />
-
-
- '😀'}
- position="left"
- />
-
+ {SatisfactionStyle.map(([level, { emoji, color }]) => (
+
+ emoji}
+ position="left"
+ />
+
+ ))}
>
@@ -89,13 +98,13 @@ const CustomTooltip = ({ payload, active }: CustomTooltipProps) => {
{' '}
satisfaits{' '}
- ({Math.round(data['très bien'] ?? 0)}% {emoji('😀')} /{' '}
- {Math.round(data['bien'] ?? 0)}% {emoji('🙂')})
+ ({Math.round(data['très bien'] ?? 0)}% /{' '}
+ {Math.round(data['bien'] ?? 0)}% )
{Math.round(data['mauvais'] ?? 0)}% négatifs
- {emoji('🙁')}
+
diff --git a/mon-entreprise/source/pages/Stats/Stats.tsx b/mon-entreprise/source/pages/Stats/Stats.tsx
index 24ce067db..faed49892 100644
--- a/mon-entreprise/source/pages/Stats/Stats.tsx
+++ b/mon-entreprise/source/pages/Stats/Stats.tsx
@@ -2,24 +2,31 @@ import classnames from 'classnames'
import Privacy from 'Components/layout/Footer/Privacy'
import MoreInfosOnUs from 'Components/MoreInfosOnUs'
import InfoBulle from 'Components/ui/InfoBulle'
+import Emoji from 'Components/utils/Emoji'
+import { useScrollToHash } from 'Components/utils/markdown'
import { ScrollToTop } from 'Components/utils/Scroll'
import { formatValue } from 'publicodes'
import { add, groupBy, mapObjIndexed, mergeWith, toPairs } from 'ramda'
-import React, { useCallback, useEffect, useMemo, useState } from 'react'
-import emoji from 'react-easy-emoji'
+import { useCallback, useEffect, useMemo, useState } from 'react'
import { Trans } from 'react-i18next'
-import styled from 'styled-components'
-import { TrackPage } from '../../ATInternetTracking'
-import stats from '../../data/stats.json'
+import { useHistory, useLocation } from 'react-router-dom'
+import { toAtString, TrackPage } from '../../ATInternetTracking'
+import statsJson from '../../data/stats.json'
import { debounce } from '../../utils'
import { SimulateurCard } from '../Simulateurs/Home'
import useSimulatorsData, { SimulatorData } from '../Simulateurs/metadata'
import Chart from './Chart'
import DemandeUtilisateurs from './DemandesUtilisateurs'
+import GlobalStats from './GlobalStats'
import SatisfactionChart from './SatisfactionChart'
+import { Page, PageChapter2, PageSatisfaction, StatsStruct } from './types'
+import { formatDay, formatMonth, Indicator, Indicators } from './utils'
+
+const stats = statsJson as unknown as StatsStruct
type Period = 'mois' | 'jours'
-type Chapter2 = typeof stats.visitesJours.pages[number]['page_chapter2'] | 'PAM'
+type Chapter2 = PageChapter2 | 'PAM'
+
const chapters2: Chapter2[] = [
...new Set(stats.visitesMois.pages.map((p) => p.page_chapter2)),
'PAM',
@@ -29,6 +36,8 @@ type Data =
| Array<{ date: string; nombre: number }>
| Array<{ date: string; nombre: Record }>
+type Pageish = Page | PageSatisfaction
+
const isPAM = (name: string | undefined) =>
name &&
[
@@ -37,26 +46,18 @@ const isPAM = (name: string | undefined) =>
'auxiliaire_medical',
'sage_femme',
].includes(name)
-type RawData = Array<{
- date: string
- page_chapter1?: string
- page_chapter2: string
- page_chapter3?: string
- page?: string
- click?: string
- nombre: number
-}>
+
const filterByChapter2 = (
- data: RawData,
- chapter2: Chapter2
+ pages: Pageish[],
+ chapter2: Chapter2 | ''
): Array<{ date: string; nombre: Record }> => {
return toPairs(
groupBy(
- (p) => p.date,
- data.filter(
+ (p) => ('date' in p ? p.date : p.month),
+ pages.filter(
(p) =>
!chapter2 ||
- (p.page !== 'accueil_pamc' &&
+ ((!('page' in p) || p.page !== 'accueil_pamc') &&
(p.page_chapter2 === chapter2 ||
(chapter2 === 'PAM' && isPAM(p.page_chapter3))))
)
@@ -65,16 +66,16 @@ const filterByChapter2 = (
date,
nombre: mapObjIndexed(
(v: Array<{ nombre: number }>) => v.map((v) => v.nombre).reduce(add),
- groupBy((x) => x.page ?? x.click ?? '', values)
+ groupBy((x) => ('page' in x ? x.page : x.click), values)
),
}))
}
-function groupByDate(data: RawData) {
+function groupByDate(data: Pageish[]) {
return toPairs(
groupBy(
- (p) => p.date,
- data.filter((d) => d.page === 'accueil')
+ (p) => ('date' in p ? p.date : p.month),
+ data.filter((d) => 'page' in d && d.page === 'accueil')
)
).map(([date, values]) => ({
date,
@@ -99,24 +100,49 @@ const computeTotals = (data: Data): number | Record => {
.map((d) => d.nombre)
.reduce(mergeWith(add), {})
}
-export default function Stats() {
- const [period, setPeriod] = useState('mois')
- const [chapter2, setChapter2] = useState('')
+
+const StatsDetail = () => {
+ const defaultPeriod = 'mois'
+ const history = useHistory()
+ const location = useLocation()
+ useScrollToHash()
+ const urlParams = new URLSearchParams(location.search ?? '')
+
+ const [period, setPeriod] = useState(
+ (urlParams.get('periode') as Period) ?? defaultPeriod
+ )
+ const [chapter2, setChapter2] = useState(
+ (urlParams.get('module') as Chapter2) ?? ''
+ )
+
+ // The logic to persist some state in query parameters in the URL could be
+ // abstracted in a dedicated React hook.
+ useEffect(() => {
+ const queryParams = [
+ period !== defaultPeriod && `periode=${period}`,
+ chapter2 && `module=${chapter2}`,
+ ].filter(Boolean)
+ history.replace({
+ search: `?${queryParams.join('&')}`,
+ hash: location.hash,
+ })
+ }, [period, chapter2])
+
const visites = useMemo(() => {
const rawData = period === 'jours' ? stats.visitesJours : stats.visitesMois
if (!chapter2) {
return rawData.site
}
- return filterByChapter2(rawData.pages, chapter2)
+ return filterByChapter2(rawData.pages as Pageish[], chapter2)
}, [period, chapter2])
const repartition = useMemo(() => {
const rawData = stats.visitesMois
- return groupByDate(rawData.pages)
+ return groupByDate(rawData.pages as Pageish[])
}, [])
const satisfaction = useMemo(() => {
- return filterByChapter2(stats.satisfaction, chapter2)
+ return filterByChapter2(stats.satisfaction as Pageish[], chapter2)
}, [chapter2])
const [[startDateIndex, endDateIndex], setDateIndex] = useState<
@@ -146,21 +172,10 @@ export default function Stats() {
() => computeTotals(slicedVisits),
[slicedVisits]
)
+
return (
<>
-
-
-
-
- Statistiques <>{emoji('📊')}>
-
-
- Découvrez nos statistiques d'utilisation mises à jour quotidiennement.
-
- Les données recueillies sont anonymisées.{' '}
-
-
-
+ Statistiques détaillées
1. Sélectionner la fonctionnalité :
@@ -276,6 +291,7 @@ export default function Stats() {
period={'mois'}
data={repartition}
grid={false}
+ stack
layout={'vertical'}
/>
>
@@ -288,67 +304,47 @@ export default function Stats() {
/>
+ >
+ )
+}
+
+export default function Stats() {
+ return (
+ <>
+
+
+
+
+ Statistiques
+
+
+ Découvrez nos statistiques d'utilisation mises à jour quotidiennement.
+
+ Les données recueillies sont anonymisées.{' '}
+
+
+
+
+
>
)
}
-const Indicators = styled.div`
- display: flex;
- flex-direction: row;
- justify-content: space-around;
- margin: 2rem 0;
-`
-
-type IndicatorProps = {
- main?: string
- subTitle?: React.ReactNode
-}
-
-function Indicator({ main, subTitle }: IndicatorProps) {
- return (
-
- {subTitle}
-
- {main}
-
- )
-}
-
-function formatDay(date: string | Date) {
- return new Date(date).toLocaleString('default', {
- weekday: 'long',
- day: 'numeric',
- month: 'long',
- })
-}
-
-function formatMonth(date: string | Date) {
- return new Date(date).toLocaleString('default', {
- month: 'long',
- year: 'numeric',
- })
-}
-
function getChapter2(s: SimulatorData[keyof SimulatorData]): Chapter2 | '' {
- if (s.iframe === 'pamc') {
+ if (s.iframePath === 'pamc') {
return 'PAM'
}
if (!s.tracking) {
return ''
}
- return typeof s.tracking === 'string' ? s.tracking : s.tracking.chapter2 ?? ''
+ const tracking = s.tracking as { chapter2?: Chapter2 }
+ const chapter2 =
+ typeof tracking === 'string' ? tracking : tracking.chapter2 ?? ''
+ return toAtString(chapter2) as typeof chapter2
}
-function SelectedSimulator(props: { chapter2: Chapter2 }) {
+function SelectedSimulator(props: { chapter2: Chapter2 | '' }) {
const simulateur = Object.values(useSimulatorsData()).find(
(s) => getChapter2(s) === props.chapter2 && !(s.tracking as any).chapter3
)
@@ -398,7 +394,7 @@ function SimulateursChoice(props: {
checked={props.value === ''}
/>
- {emoji('🌍')}
+
Tout le site
@@ -413,11 +409,18 @@ function SimulateursChoice(props: {
type="radio"
name="simulateur"
value={getChapter2(s)}
- onChange={(evt) => props.onChange(evt.target.value)}
+ onChange={(evt) =>
+ props.onChange(evt.target.value as Chapter2 | '')
+ }
checked={getChapter2(s) === props.value}
/>
- {s.icône && <>{emoji(s.icône)} >}
+ {s.icône && (
+ <>
+
+
+ >
+ )}
{s.shortName}
diff --git a/mon-entreprise/source/pages/Stats/types.ts b/mon-entreprise/source/pages/Stats/types.ts
new file mode 100644
index 000000000..2c9d7b840
--- /dev/null
+++ b/mon-entreprise/source/pages/Stats/types.ts
@@ -0,0 +1,64 @@
+// Generated using app.quicktype.io
+
+export interface StatsStruct {
+ visitesJours: Visites
+ visitesMois: Visites
+ satisfaction: PageSatisfaction[]
+ retoursUtilisateurs: RetoursUtilisateurs
+}
+
+export interface RetoursUtilisateurs {
+ open: Closed[]
+ closed: Closed[]
+}
+
+export interface Closed {
+ title: string
+ closedAt: string | null
+ number: number
+ count: number
+}
+
+export interface BasePage {
+ nombre: number
+ page_chapter1: string
+ page_chapter2: PageChapter2
+ page_chapter3: string
+}
+export type Page = BasePage & { page: string; date: string }
+export type PageSatisfaction = BasePage & {
+ month: string
+ click: SatisfactionLevel
+}
+
+export enum SatisfactionLevel {
+ Bien = 'bien',
+ Mauvais = 'mauvais',
+ Moyen = 'moyen',
+ TrèsBien = 'très bien',
+}
+
+export interface Visites {
+ pages: Page[]
+ site: Site[]
+}
+
+export interface Site {
+ date: string
+ nombre: number
+}
+
+export enum PageChapter2 {
+ AideDeclarationIndependant = 'aide_declaration_independant',
+ ArtisteAuteur = 'artiste_auteur',
+ AutoEntrepreneur = 'auto_entrepreneur',
+ ChomagePartiel = 'chomage_partiel',
+ ComparaisonStatut = 'comparaison_statut',
+ DirigeantSasu = 'dirigeant_sasu',
+ EconomieCollaborative = 'economie_collaborative',
+ Guide = 'guide',
+ ImpotSociete = 'impot_societe',
+ Independant = 'independant',
+ ProfessionLiberale = 'profession_liberale',
+ Salarie = 'salarie',
+}
diff --git a/mon-entreprise/source/pages/Stats/utils.tsx b/mon-entreprise/source/pages/Stats/utils.tsx
new file mode 100644
index 000000000..b36cd0c5d
--- /dev/null
+++ b/mon-entreprise/source/pages/Stats/utils.tsx
@@ -0,0 +1,66 @@
+import React from 'react'
+import styled from 'styled-components'
+
+export const Indicators = styled.div`
+ display: flex;
+ flex-direction: row;
+ justify-content: space-around;
+ margin: 2rem 0;
+`
+type IndicatorProps = {
+ main?: React.ReactNode
+ subTitle?: React.ReactNode
+ footnote?: string
+ width?: string
+}
+export function Indicator({ main, subTitle, footnote, width }: IndicatorProps) {
+ return (
+
+
+ {subTitle}
+
+
+ {main}
+
+ {footnote && (
+
+ {footnote}
+
+ )}
+
+ )
+}
+export function formatDay(date: string | Date) {
+ return new Date(date).toLocaleString('default', {
+ weekday: 'long',
+ day: 'numeric',
+ month: 'long',
+ })
+}
+export function formatMonth(date: string | Date) {
+ return new Date(date).toLocaleString('default', {
+ month: 'long',
+ year: 'numeric',
+ })
+}
diff --git a/mon-entreprise/source/pages/integration/Iframe.tsx b/mon-entreprise/source/pages/integration/Iframe.tsx
index c503a383c..7b1ac8ce1 100644
--- a/mon-entreprise/source/pages/integration/Iframe.tsx
+++ b/mon-entreprise/source/pages/integration/Iframe.tsx
@@ -1,7 +1,9 @@
+import Overlay from 'Components/Overlay'
import {
ThemeColorsContext,
ThemeColorsProvider,
} from 'Components/utils/colors'
+import Emoji from 'Components/utils/Emoji'
import { ScrollToTop } from 'Components/utils/Scroll'
import urssafLogo from 'Images/Urssaf.svg'
import React, {
@@ -12,7 +14,6 @@ import React, {
useRef,
useState,
} from 'react'
-import emoji from 'react-easy-emoji'
import { Trans } from 'react-i18next'
import { MemoryRouter, useHistory, useLocation } from 'react-router-dom'
import { TrackPage } from '../../ATInternetTracking'
@@ -33,8 +34,8 @@ function IntegrationCustomizer() {
const integrableModuleNames = useMemo(
() =>
Object.values(simulators)
- .filter((s) => s.iframe && !s.private)
- .map((s) => s.iframe),
+ .filter((s) => s.iframePath && !s.private)
+ .map((s) => s.iframePath),
[simulators]
)
const defaultModuleFromUrl =
@@ -54,7 +55,7 @@ function IntegrationCustomizer() {
return (
- Personnalisez l'integration
+ Personnalisez l'intégration
Quel module ?
- {emoji('🚩')}
+
setCurrentModule(event.target.value)}
@@ -112,7 +113,7 @@ function IntegrationCustomizer() {
Quelle couleur ?{' '}
- {emoji('🎨')}
+
Chargement... }>
@@ -121,11 +122,11 @@ function IntegrationCustomizer() {
Code d'intégration
- {emoji('🛠')}
+
- Voici le code à copier-coller sur votre site :
+ Voici le code à copier-coller sur votre site :
@@ -177,8 +178,8 @@ export default function Integration() {
<>
-
-
+
+
Intégrez le module Web
Nos simulateurs sont intégrables de manière transparente en ajoutant
@@ -193,9 +194,14 @@ export default function Integration() {
L'attribut data-lang="en" vous permet quant à lui de choisir
l'anglais comme langue du simulateur.
-
-
-
+
+
+
+ À noter que si votre site utilise une politique de sécurité de contenu
+ via l'en-tête de réponse HTTP Content-Security-Policy , une
+ erreur bénigne peut apparaître dans la console.
+
+
Quelques intégrations
@@ -249,6 +255,44 @@ export default function Integration() {
)
}
+function EnSavoirPlusCSP() {
+ const [opened, setOpened] = useState(false)
+ return (
+ <>
+ setOpened(true)} className="ui__ link-button">
+ En savoir plus
+
+ {opened && (
+ setOpened(false)} style={{ textAlign: 'left' }}>
+
+ Intégration iframe et politique de sécurité de contenu
+
+ L'erreur ci-dessous qui s'affiche dans la console est liée à la
+ communication entre la page parente et l'iframe pour le
+ redimensionnement automatique au contenu affiché.
+
+
+
+ Failed to execute 'postMessage' on 'DOMWindow': The target origin
+ provided ('https://mon-entreprise.fr') does not match the recipient
+ window's origin
+
+
+
+ Vous pouvez la corriger avec la politique suivante :
+
+
+
+ script-src 'self' 'unsafe-inline' https://mon-entreprise.fr;
+
+ img-src 'self' https://mon-entreprise.fr;
+
+
+ )}
+ >
+ )
+}
+
type IntegrationCodeProps = {
module?: string
color?: string
@@ -284,6 +328,7 @@ function IntegrationCode({
margin: auto;
margin-bottom: 1em;
overflow: auto;
+ line-height: 1.6em;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05),
-1px 1px 1px rgba(0, 0, 0, 0.02);
diff --git a/mon-entreprise/source/pages/integration/Library.tsx b/mon-entreprise/source/pages/integration/Library.tsx
index 02b3d8223..29b07ce6c 100644
--- a/mon-entreprise/source/pages/integration/Library.tsx
+++ b/mon-entreprise/source/pages/integration/Library.tsx
@@ -1,6 +1,5 @@
import { ScrollToTop } from 'Components/utils/Scroll'
import Emoji from 'Components/utils/Emoji'
-import emoji from 'react-easy-emoji'
import { Trans } from 'react-i18next'
export default function Library() {
@@ -142,7 +141,9 @@ export default function Library() {
, composant qui fait aussi appel à l'API commune.
- Faire des graphiques économiques{emoji(' 📈')}
+
+ Faire des graphiques économiques
+
Il est aussi possible d'utiliser la bibliothèque pour des calculs
d'analyse économique ou politique. Ici, on trace le prix du travail et
diff --git a/mon-entreprise/source/pages/integration/Options.tsx b/mon-entreprise/source/pages/integration/Options.tsx
index 1c25cb0ca..ec10682be 100644
--- a/mon-entreprise/source/pages/integration/Options.tsx
+++ b/mon-entreprise/source/pages/integration/Options.tsx
@@ -1,9 +1,9 @@
+import { icons } from 'Components/ui/SocialIcon'
+import Emoji from 'Components/utils/Emoji'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext } from 'react'
-import emoji from 'react-easy-emoji'
import { Trans } from 'react-i18next'
import { Link } from 'react-router-dom'
-import { icons } from 'Components/ui/SocialIcon'
import illustration from './illustration.png'
export default function Options() {
@@ -11,7 +11,7 @@ export default function Options() {
return (
<>
- Outils pour les développeurs <>{emoji('👨💻')}>
+ Outils pour les développeurs
@@ -31,12 +31,14 @@ export default function Options() {
-
+
- {emoji('📱')}
+
+
+
Intégrer un simulateur
@@ -52,7 +54,9 @@ export default function Options() {
className="ui__ interactive card box inverted-colors"
to={sitePaths.integration.library}
>
-
{emoji('🧰')}
+
+
+
Libraire de calcul
@@ -100,8 +104,10 @@ export default function Options() {
target="_blank"
href="https://publi.codes"
>
-
{emoji('📚')}
-
+
+
+
+
Publicodes
Nos outils sont propulsés par Publicodes, un nouveau langage pour
diff --git a/mon-entreprise/source/pages/integration/index.tsx b/mon-entreprise/source/pages/integration/index.tsx
index c283ea71f..e9d5edde0 100644
--- a/mon-entreprise/source/pages/integration/index.tsx
+++ b/mon-entreprise/source/pages/integration/index.tsx
@@ -1,8 +1,10 @@
+import Emoji from 'Components/utils/Emoji'
import { ScrollToTop } from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useContext } from 'react'
import { Trans } from 'react-i18next'
import { Link, Route, Switch, useLocation } from 'react-router-dom'
+import styled from 'styled-components'
import { TrackChapter } from '../../ATInternetTracking'
import Iframe from './Iframe'
import Library from './Library'
@@ -15,15 +17,38 @@ export default function Integration() {
<>
+
{pathname !== sitePaths.integration.index && (
-
- 🛠{' '}
-
- Outils pour les développeurs
- {' '}
- 🛠
-
+
+
+ ← Outils pour les développeurs
+
+
)}
+ {/* TODO: Nous pourrions automatiser la publication de cette bannière
+ de recrutement lorsqu'une annonce est postée sur beta.gouv.fr
+ https://github.com/betagouv/beta.gouv.fr/issues/6343 */}
+ {/* */}
@@ -32,3 +57,10 @@ export default function Integration() {
>
)
}
+
+const BackNavigationForDevs = styled.div`
+ transform: translateY(1rem);
+ padding: 0.25rem 1rem;
+ width: max-content;
+ border-radius: 0.25rem;
+`
diff --git a/mon-entreprise/source/reducers/inFranceAppReducer.ts b/mon-entreprise/source/reducers/inFranceAppReducer.ts
index ed2a9cce5..401523630 100644
--- a/mon-entreprise/source/reducers/inFranceAppReducer.ts
+++ b/mon-entreprise/source/reducers/inFranceAppReducer.ts
@@ -83,9 +83,18 @@ function companyStatusChoice(state: LegalStatus | null = null, action: Action) {
return action.statusName
}
+type StatutJuridique =
+ | 'EI'
+ | 'EURL'
+ | 'SARL'
+ | 'SAS'
+ | 'SA'
+ | 'SASU'
+ | 'NON_IMPLÉMENTÉ'
+
const infereLegalStatusFromCategorieJuridique = (
catégorieJuridique: string
-) => {
+): StatutJuridique => {
/*
Nous utilisons le code entreprise pour connaitre le statut juridique
(voir https://www.insee.fr/fr/information/2028129)
@@ -118,7 +127,7 @@ const infereLegalStatusFromCategorieJuridique = (
export type Company = {
siren: string
catégorieJuridique?: string
- statutJuridique?: string
+ statutJuridique?: StatutJuridique
dateDeCréation?: string
isAutoEntrepreneur?: boolean
isDirigeantMajoritaire?: boolean
diff --git a/mon-entreprise/source/reducers/rootReducer.ts b/mon-entreprise/source/reducers/rootReducer.ts
index d250d67f1..f493dab0e 100644
--- a/mon-entreprise/source/reducers/rootReducer.ts
+++ b/mon-entreprise/source/reducers/rootReducer.ts
@@ -103,9 +103,9 @@ function simulation(
unfoldedStep: null,
}
case 'BATCH_UPDATE_SITUATION': {
- return (Object.entries(action.situation as any) as Array<
- [Names, unknown]
- >).reduce(
+ return (
+ Object.entries(action.situation as any) as Array<[Names, unknown]>
+ ).reduce(
(newState, [fieldName, value]) =>
simulation(newState, {
type: 'UPDATE_SITUATION',
diff --git a/mon-entreprise/source/selectors/companyStatusSelectors.ts b/mon-entreprise/source/selectors/companyStatusSelectors.ts
index 96007c7ef..e0c5f9368 100644
--- a/mon-entreprise/source/selectors/companyStatusSelectors.ts
+++ b/mon-entreprise/source/selectors/companyStatusSelectors.ts
@@ -97,21 +97,21 @@ const QUESTION_LIST: Array = keys(
mergeAll(flatten(Object.values(LEGAL_STATUS_DETAILS)))
)
-const isCompatibleStatusWith = (answers: any) => (
- statusRequirements: LegalStatusRequirements
-): boolean => {
- const stringify = map((x) => (!isNil(x) ? JSON.stringify(x) : x))
- const answerCompatibility = Object.values(
- mergeWith(
- (answer, statusValue) =>
- isNil(answer) || isNil(statusValue) || answer === statusValue,
- stringify(statusRequirements as any),
- stringify(answers)
+const isCompatibleStatusWith =
+ (answers: any) =>
+ (statusRequirements: LegalStatusRequirements): boolean => {
+ const stringify = map((x) => (!isNil(x) ? JSON.stringify(x) : x))
+ const answerCompatibility = Object.values(
+ mergeWith(
+ (answer, statusValue) =>
+ isNil(answer) || isNil(statusValue) || answer === statusValue,
+ stringify(statusRequirements as any),
+ stringify(answers)
+ )
)
- )
- const isCompatibleStatus = answerCompatibility.every((x) => x !== false)
- return isCompatibleStatus
-}
+ const isCompatibleStatus = answerCompatibility.every((x) => x !== false)
+ return isCompatibleStatus
+ }
const possibleStatus = (
answers: Array | LegalStatusRequirements
): Record =>
@@ -140,24 +140,23 @@ export const nextQuestionSelector = (state: RootState): Question | null => {
).filter(isCompatibleStatusWith(legalStatusRequirements) as any)
const unansweredQuestions = difference(QUESTION_LIST, questionAnswered)
- const shannonEntropyByQuestion = unansweredQuestions.map((question): [
- typeof question,
- number
- ] => {
- const answerPopulation = Object.values(possibleStatusList).map(
- (status: any) => status[question]
- )
- const frequencyOfAnswers = Object.values(
- countBy(
- (x) => x,
- answerPopulation.filter((x) => x !== undefined)
+ const shannonEntropyByQuestion = unansweredQuestions.map(
+ (question): [typeof question, number] => {
+ const answerPopulation = Object.values(possibleStatusList).map(
+ (status: any) => status[question]
)
- ).map((numOccurrence) => numOccurrence / answerPopulation.length)
- const shannonEntropy = -frequencyOfAnswers
- .map((p) => p * Math.log2(p))
- .reduce(add, 0)
- return [question, shannonEntropy]
- })
+ const frequencyOfAnswers = Object.values(
+ countBy(
+ (x) => x,
+ answerPopulation.filter((x) => x !== undefined)
+ )
+ ).map((numOccurrence) => numOccurrence / answerPopulation.length)
+ const shannonEntropy = -frequencyOfAnswers
+ .map((p) => p * Math.log2(p))
+ .reduce(add, 0)
+ return [question, shannonEntropy]
+ }
+ )
const sortedPossibleNextQuestions = sortBy(
([, entropy]) => -entropy,
diff --git a/mon-entreprise/source/selectors/simulationSelectors.ts b/mon-entreprise/source/selectors/simulationSelectors.ts
index 6bdeb4baa..685998545 100644
--- a/mon-entreprise/source/selectors/simulationSelectors.ts
+++ b/mon-entreprise/source/selectors/simulationSelectors.ts
@@ -23,20 +23,22 @@ const emptySituation: Partial<
export const situationSelector = (state: RootState) =>
state.simulation?.situation ?? emptySituation
+export const initialSituationSelector = (state: RootState) =>
+ state.simulation?.initialSituation ?? emptySituation
+
export const configSituationSelector = (state: RootState) =>
configSelector(state).situation ?? emptySituation
export const firstStepCompletedSelector = createSelector(
- [situationSelector, objectifsSelector],
- (situation, objectifs) => {
- if (!situation) {
- return false
- }
- return objectifs.some((objectif) => {
- return Object.entries(situation).some(([dottedName]) =>
- dottedName.startsWith(objectif)
- )
- })
+ [situationSelector, configSituationSelector, initialSituationSelector],
+ (situation, baseSituation, initialSituation) => {
+ return (
+ Object.keys(situation).filter(
+ (dottedName) =>
+ !Object.keys(baseSituation).includes(dottedName) &&
+ !Object.keys(initialSituation).includes(dottedName)
+ ).length > 0
+ )
}
)
diff --git a/mon-entreprise/source/sentry.ts b/mon-entreprise/source/sentry.ts
new file mode 100644
index 000000000..839f21f54
--- /dev/null
+++ b/mon-entreprise/source/sentry.ts
@@ -0,0 +1,38 @@
+import * as Sentry from '@sentry/react'
+import { Integrations } from '@sentry/tracing'
+
+let branch: string | undefined =
+ process.env.GITHUB_REF?.split('/')?.slice(-1)?.[0]
+
+if (branch === 'merge') {
+ branch = process.env.GITHUB_HEAD_REF
+}
+
+const release = branch && `${branch}-` + process.env.GITHUB_SHA?.substring(0, 7)
+
+if (branch && branch !== 'master') {
+ console.info(
+ `ℹ Vous êtes sur la branche : %c${branch}`,
+ 'font-weight: bold; text-decoration: underline;'
+ )
+}
+
+// We use this variable to hide some features in production while keeping them
+// in feature-branches. In case we do A/B testing with several branches served
+// in production, we should add the public faced branch names in the test below.
+// This is different from the process.env.NODE_ENV in that a feature branch may
+// be build in production mode (with the NODE_ENV) but we may still want to show
+// or hide some features.
+export const productionMode = ['master', 'next'].includes(branch ?? '')
+
+if (productionMode) {
+ Sentry.init({
+ dsn: 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615',
+ integrations: [new Integrations.BrowserTracing()],
+ release,
+ // Set tracesSampleRate to 1.0 to capture 100%
+ // of transactions for performance monitoring.
+ // We recommend adjusting this value in production
+ tracesSampleRate: 0.5,
+ })
+}
diff --git a/mon-entreprise/source/sitePaths.ts b/mon-entreprise/source/sitePaths.ts
index fab64fcb4..74d736646 100644
--- a/mon-entreprise/source/sitePaths.ts
+++ b/mon-entreprise/source/sitePaths.ts
@@ -49,9 +49,12 @@ const sitePathsFr = {
},
simulateurs: {
index: '/simulateurs',
- SASU: '/dirigeant-sasu',
- indépendant: '/indépendant',
'auto-entrepreneur': '/auto-entrepreneur',
+ 'entreprise-individuelle': '/entreprise-individuelle',
+ eirl: '/eirl',
+ sasu: '/sasu',
+ eurl: '/eurl',
+ indépendant: '/indépendant',
comparaison: '/comparaison-régimes-sociaux',
pamc: '/pamc',
salarié: '/salaire-brut-net',
@@ -72,6 +75,7 @@ const sitePathsFr = {
},
is: '/impot-societe',
'aides-embauche': '/aides-embauche',
+ dividendes: '/dividendes',
},
nouveautés: '/nouveautés',
stats: '/stats',
@@ -112,9 +116,12 @@ const sitePathsEn = {
},
simulateurs: {
index: '/calculators',
- SASU: '/sasu-chairman',
indépendant: '/independant',
+ 'entreprise-individuelle': '/sole-proprietorship',
'auto-entrepreneur': '/auto-entrepreneur',
+ eirl: '/eirl',
+ sasu: '/sasu',
+ eurl: '/eurl',
pamc: '/pamc',
comparaison: '/social-scheme-comparaison',
salarié: '/salary',
@@ -135,6 +142,7 @@ const sitePathsEn = {
},
is: '/corporate-tax',
'aides-embauche': '/hiring-incentives',
+ dividendes: '/dividends',
},
nouveautés: '/news',
accessibilité: '/accessibility',
diff --git a/mon-entreprise/source/static/images/destinataires/destinataires.yaml b/mon-entreprise/source/static/images/destinataires/destinataires.yaml
index e7e3251a5..d8073a476 100644
--- a/mon-entreprise/source/static/images/destinataires/destinataires.yaml
+++ b/mon-entreprise/source/static/images/destinataires/destinataires.yaml
@@ -15,5 +15,4 @@ AGFF:
lien: http://www.agff-info.fr/
CNAV:
image: cnav.png
- lien:
- https://fr.wikipedia.org/wiki/Caisse_nationale_de_l%27assurance_vieillesse_des_travailleurs_salari%C3%A9s
+ lien: https://fr.wikipedia.org/wiki/Caisse_nationale_de_l%27assurance_vieillesse_des_travailleurs_salari%C3%A9s
diff --git a/mon-entreprise/source/static/images/logo-dgfip.svg b/mon-entreprise/source/static/images/logo-dgfip.svg
new file mode 100644
index 000000000..b0a9a66c3
--- /dev/null
+++ b/mon-entreprise/source/static/images/logo-dgfip.svg
@@ -0,0 +1 @@
+
diff --git a/mon-entreprise/source/static/images/logos-cnavpl/carcdsf.jpg b/mon-entreprise/source/static/images/logos-caisses-retraite/carcdsf.jpg
similarity index 100%
rename from mon-entreprise/source/static/images/logos-cnavpl/carcdsf.jpg
rename to mon-entreprise/source/static/images/logos-caisses-retraite/carcdsf.jpg
diff --git a/mon-entreprise/source/static/images/logos-cnavpl/carmf.png b/mon-entreprise/source/static/images/logos-caisses-retraite/carmf.png
similarity index 100%
rename from mon-entreprise/source/static/images/logos-cnavpl/carmf.png
rename to mon-entreprise/source/static/images/logos-caisses-retraite/carmf.png
diff --git a/mon-entreprise/source/static/images/logos-cnavpl/carpimko.png b/mon-entreprise/source/static/images/logos-caisses-retraite/carpimko.png
similarity index 100%
rename from mon-entreprise/source/static/images/logos-cnavpl/carpimko.png
rename to mon-entreprise/source/static/images/logos-caisses-retraite/carpimko.png
diff --git a/mon-entreprise/source/static/images/logos-cnavpl/cavec.jpg b/mon-entreprise/source/static/images/logos-caisses-retraite/cavec.jpg
similarity index 100%
rename from mon-entreprise/source/static/images/logos-cnavpl/cavec.jpg
rename to mon-entreprise/source/static/images/logos-caisses-retraite/cavec.jpg
diff --git a/mon-entreprise/source/static/images/logos-cnavpl/cipav.png b/mon-entreprise/source/static/images/logos-caisses-retraite/cipav.png
similarity index 100%
rename from mon-entreprise/source/static/images/logos-cnavpl/cipav.png
rename to mon-entreprise/source/static/images/logos-caisses-retraite/cipav.png
diff --git a/mon-entreprise/source/static/images/logos-cnavpl/cnbf.png b/mon-entreprise/source/static/images/logos-caisses-retraite/cnbf.png
similarity index 100%
rename from mon-entreprise/source/static/images/logos-cnavpl/cnbf.png
rename to mon-entreprise/source/static/images/logos-caisses-retraite/cnbf.png
diff --git a/mon-entreprise/source/static/images/logos-cnavpl/index.tsx b/mon-entreprise/source/static/images/logos-caisses-retraite/index.tsx
similarity index 86%
rename from mon-entreprise/source/static/images/logos-cnavpl/index.tsx
rename to mon-entreprise/source/static/images/logos-caisses-retraite/index.tsx
index 1edf72440..d7b06cbf4 100644
--- a/mon-entreprise/source/static/images/logos-cnavpl/index.tsx
+++ b/mon-entreprise/source/static/images/logos-caisses-retraite/index.tsx
@@ -4,3 +4,4 @@ export { default as CARMF } from './carmf.png'
export { default as CARCDSF } from './carcdsf.jpg'
export { default as CNBF } from './cnbf.png'
export { default as CAVEC } from './cavec.jpg'
+export { default as IRCEC } from './ircec.jpg'
diff --git a/mon-entreprise/source/static/images/logos-caisses-retraite/ircec.jpg b/mon-entreprise/source/static/images/logos-caisses-retraite/ircec.jpg
new file mode 100644
index 000000000..6e386ad87
Binary files /dev/null and b/mon-entreprise/source/static/images/logos-caisses-retraite/ircec.jpg differ
diff --git a/mon-entreprise/source/types/worker-loader.d.ts b/mon-entreprise/source/types/worker-loader.d.ts
index d0ba0fe89..d5e61024c 100644
--- a/mon-entreprise/source/types/worker-loader.d.ts
+++ b/mon-entreprise/source/types/worker-loader.d.ts
@@ -1,7 +1,7 @@
-declare module 'worker-loader*' {
+declare module '*.worker.js' {
class WebpackWorker extends Worker {
constructor()
}
- export = WebpackWorker
+ export default WebpackWorker
}
diff --git a/mon-entreprise/source/utils.ts b/mon-entreprise/source/utils.ts
index a1d268da1..7414a28c2 100644
--- a/mon-entreprise/source/utils.ts
+++ b/mon-entreprise/source/utils.ts
@@ -27,15 +27,6 @@ export function inIframe(): boolean {
}
}
-// We use this variable to hide some features in production while keeping them
-// in feature-branches. In case we do A/B testing with several branches served
-// in production, we should add the public faced branch names in the test below.
-// This is different from the process.env.NODE_ENV in that a feature branch may
-// be build in production mode (with the NODE_ENV) but we may still want to show
-// or hide some features.
-export const productionMode =
- process.env.HEAD && ['master', 'next'].includes(process.env.HEAD)
-
export function softCatch(
fn: (arg: ArgType) => ReturnType
): (arg: ArgType) => ReturnType | null {
@@ -56,10 +47,6 @@ export function mapOrApply(fn: (a: A) => B, x: A | Array ) {
return Array.isArray(x) ? x.map(fn) : fn(x)
}
-export function coerceArray (x: A | Array ): Array {
- return Array.isArray(x) ? x : [x]
-}
-
export function getSessionStorage() {
// In some browsers like Brave, even just reading the variable sessionStorage
// is throwing an error in the iframe, so we can't do things if sessionStorage !== undefined
diff --git a/mon-entreprise/test/.eslintrc.yaml b/mon-entreprise/test/.eslintrc.yaml
index d2c0e276e..726568911 100644
--- a/mon-entreprise/test/.eslintrc.yaml
+++ b/mon-entreprise/test/.eslintrc.yaml
@@ -1,3 +1,3 @@
env:
mocha: true
- jest: true
\ No newline at end of file
+ jest: true
diff --git a/mon-entreprise/test/cycles.test.js b/mon-entreprise/test/cycles.test.js
index 057d7b28f..ccf972c71 100644
--- a/mon-entreprise/test/cycles.test.js
+++ b/mon-entreprise/test/cycles.test.js
@@ -4,31 +4,37 @@ import { cyclicDependencies } from '../../publicodes/core/source/AST/graph'
describe('DottedNames graph', () => {
it("shouldn't have cycles", () => {
- let cyclesDependencies = cyclicDependencies(rules)
+ const [cyclesDependencies, dotGraphs] = cyclicDependencies(rules)
+
+ const dotGraphsToLog = dotGraphs
+ .map(
+ (dotGraph) =>
+ `🌀🌀🌀🌀🌀🌀🌀🌀🌀🌀🌀\n A cycle graph to stare at with Graphviz:\n${dotGraph}\n\n`
+ )
+ .join('\n\n')
expect(
cyclesDependencies,
- `\nThe cycles have been found in the rules dependencies graph.\nSee below for a representation of each cycle.\n⬇️ is a node of the cycle.\n\t- ${cyclesDependencies
+ `${dotGraphsToLog}\nAT LEAST the following cycles have been found in the rules dependencies graph.\nSee below for a representation of each cycle.\n⬇️ is a node of the cycle.\n\t- ${cyclesDependencies
.map(
(cycleDependencies, idx) =>
- '#' +
- idx +
- ':\n\t\t⬇️ ' +
- cycleDependencies
- // .map(
- // ([ruleName, dependencies]) =>
- // ruleName + '\n\t\t\t↘️ ' + dependencies.join('\n\t\t\t↘️ ')
- // )
- .join('\n\t\t⬇️ ')
+ '#' + idx + ':\n\t\t⬇️ ' + cycleDependencies.join('\n\t\t⬇️ ')
)
.join('\n\t- ')}\n\n`
+ ).to.deep.equal([
+ [
+ 'dirigeant . rémunération . imposable',
+ 'dirigeant . auto-entrepreneur . impôt . revenu imposable',
+ "entreprise . chiffre d'affaires",
+ 'dirigeant . rémunération . nette après impôt',
+ 'dirigeant . rémunération . nette',
+ 'dirigeant . rémunération . totale',
+ 'impôt . montant',
+ 'impôt . revenu imposable',
+ ],
+ ])
+ console.warn(
+ "[ WARNING ] A cycle still exists around `entreprise . chiffre d'affaires` see issue #1524 for a definitive fix."
)
- .to.be.an('array')
- .of.length(1)
-
- // Cycle doesn't occur in real life. Will fix in next PR.
- // ⬇️ entreprise . chiffre d'affaires
- // ⬇️ dirigeant . rémunération totale
- // ⬇️ entreprise . chiffre d'affaires
})
})
diff --git a/mon-entreprise/test/persistence.test.ts b/mon-entreprise/test/persistence.test.ts
index e487d81b7..8594f54f4 100644
--- a/mon-entreprise/test/persistence.test.ts
+++ b/mon-entreprise/test/persistence.test.ts
@@ -1,23 +1,22 @@
import { expect } from 'chai'
-import * as sinon from 'sinon'
-import { createStore } from 'redux'
+import { describe, it, beforeEach, afterEach } from 'mocha'
import { createMemoryHistory } from 'history'
-
import { DottedName } from 'modele-social'
+import { createStore } from 'redux'
+import * as sinon from 'sinon'
+import {
+ loadPreviousSimulation,
+ setSimulationConfig,
+ updateSituation,
+} from '../source/actions/actions'
import reducers, {
Simulation,
SimulationConfig,
} from '../source/reducers/rootReducer'
-import { PreviousSimulation } from '../source/selectors/previousSimulationSelectors'
-import safeLocalStorage from '../source/storage/safeLocalStorage'
import { setupSimulationPersistence } from '../source/storage/persistSimulation'
-import {
- loadPreviousSimulation,
- updateSituation,
- setSimulationConfig,
-} from '../source/actions/actions'
+import safeLocalStorage from '../source/storage/safeLocalStorage'
-function delay(ms) {
+function delay(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms))
}
@@ -40,15 +39,15 @@ const initialSimulation: Simulation = {
describe('[persistence] When simulation persistence is setup', () => {
const sandbox = sinon.createSandbox()
- let spiedSafeLocalStorage
- let store
+ let spiedSafeLocalStorage: any
+ let store: any
beforeEach(() => {
spiedSafeLocalStorage = sandbox.spy(safeLocalStorage as any)
store = createStore(reducers, {
simulation: initialSimulation,
activeTargetInput: 'sometargetinput',
- })
+ } as any)
setupSimulationPersistence(store, 0)
})
@@ -81,7 +80,7 @@ describe('[persistence] When simulation config is set', () => {
'{"situation":{"dotted name . other":"42"},"activeTargetInput":"someothertargetinput","foldedSteps":["someotherstep"]}'
const sandbox = sinon.createSandbox()
- let store
+ let store: any
beforeEach(() => {
sandbox
diff --git a/mon-entreprise/test/real-rules.test.js b/mon-entreprise/test/real-rules.test.js
index dad097818..dffdb19f3 100644
--- a/mon-entreprise/test/real-rules.test.js
+++ b/mon-entreprise/test/real-rules.test.js
@@ -6,18 +6,15 @@ import rules from 'modele-social'
// les variables dans les tests peuvent être exprimées relativement à l'espace de nom de la règle,
// comme dans sa formule
let parsedRules = parsePublicodes(rules)
-const engine = new Engine(parsedRules)
+const engine = new Engine(rules)
let runExamples = (examples, rule) =>
examples.map((ex) => {
const expected = ex['valeur attendue']
const situation = Object.entries(ex.situation).reduce(
(acc, [name, value]) => ({
...acc,
- [disambiguateRuleReference(
- engine.parsedRules,
- rule.dottedName,
- name
- )]: value,
+ [disambiguateRuleReference(engine.parsedRules, rule.dottedName, name)]:
+ value,
}),
{}
)
diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap
similarity index 68%
rename from mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap
rename to mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap
index be303bc9b..e8e89da56 100644
--- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap
+++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap
@@ -1,95 +1,100 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[50000,3177,11368,103,14648,35352]"`;
+exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9020,50000,36345,0,1,1,0]"`;
-exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[15000,948,3170,103,4221,10779]"`;
+exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,15000,12630,0,1,1,0]"`;
-exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[5000,312,1293,103,1708,3292]"`;
+exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,5000,4152,0,1,1,0]"`;
-exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `
-"[10000,630,564,103,1297,8703]
-Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire"
+exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,10000,7511,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,10000,8392,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11409,50000,34048,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[82,500,279,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,5000,3431,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9021,50000,37539,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,5000,4881,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[33,15000,14803,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7546,35000,24814,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,50000,31238,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13578,50000,31753,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11461,50000,33870,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14098,50000,31253,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,50000,33870,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5652,50000,39713,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: international 1`] = `"[14610,50000,35287,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,50000,36215,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11365,50000,33986,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1368,5000,3069,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11369,50000,33996,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1369,5000,3083,0,1,1,0]"`;
+
+exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = `"[11369,50000,33996,0,0,1,1]"`;
+
+exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1369,5000,3083,0,0,1,1]"`;
+
+exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = `"[9454,50000,35911,0,0,1,1]"`;
+
+exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = `
+"[1042,500,-681,0,1,1,0]
+Notifications affichées : entreprise . imposition . IR . information sur le report de déficit"
`;
-exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `
-"[10000,630,-1328,103,-595,10595]
-Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire"
+exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = `
+"[1042,1000,-226,0,1,1,0]
+Notifications affichées : entreprise . imposition . IR . information sur le report de déficit"
`;
-exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[50000,3023,11408,103,14534,35466]"`;
+exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1067,1500,203,0,1,1,0]"`;
-exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[500,25,81,103,209,291]"`;
+exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1110,2000,614,0,1,1,0]"`;
-exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[5000,312,1020,103,1435,3565]"`;
+exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1369,5000,3083,0,1,1,0]"`;
-exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[50000,3175,17805,140,21120,28880]"`;
-
-exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[50000,3174,16591,140,19905,30095]"`;
-
-exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[50000,3175,14660,140,17975,32025]"`;
-
-exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[50000,3176,17809,119,21104,28896]"`;
-
-exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[50000,3175,16189,140,19504,30496]"`;
-
-exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[50000,3177,5651,103,8931,41069]"`;
-
-exports[`calculate aide-déclaration-indépendant: international 1`] = `
-"[50000,0,14609,103,14712,35288]
-Notifications affichées : impôt . domiciliation étranger non implémentée"
-`;
-
-exports[`calculate aide-déclaration-indépendant: international 2`] = `"[50000,1267,11875,103,13245,36755]"`;
-
-exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[50000,3176,11362,119,14657,35343]"`;
-
-exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[5000,311,1292,119,1722,3278]"`;
-
-exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[50000,3177,11368,103,14648,35352]"`;
-
-exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[5000,312,1293,103,1708,3292]"`;
-
-exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = `
-"[50000,3177,11368,103,14648,35352]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
-`;
-
-exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[5000,312,1293,103,1708,3292]"`;
-
-exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = `
-"[50000,3177,9453,103,12733,37267]
-Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
-`;
-
-exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = `"[500,25,1041,103,1169,0]"`;
-
-exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = `"[1000,57,1041,103,1201,0]"`;
-
-exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1500,89,1059,103,1251,249]"`;
-
-exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[2000,121,1090,103,1314,686]"`;
-
-exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[5000,312,1293,103,1708,3292]"`;
-
-exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[10000,630,2104,103,2837,7163]"`;
+exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2204,10000,6794,0,1,1,0]"`;
exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = `
-"[100000,6361,20929,103,27393,72607]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[20929,100000,69895,0,1,1,0]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = `
-"[1000000,63664,106448,103,170215,829785]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[106448,1000000,802634,0,1,1,0]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
exports[`calculate simulations-artiste-auteur: bnc 1`] = `"[1230]"`;
exports[`calculate simulations-artiste-auteur: bnc 2`] = `"[1863]"`;
-exports[`calculate simulations-artiste-auteur: bnc 3`] = `"[931]"`;
+exports[`calculate simulations-artiste-auteur: bnc 3`] = `
+"[931]
+Notifications affichées : artiste-auteur . cotisations . avertissement trimestres retraite"
+`;
-exports[`calculate simulations-artiste-auteur: salarié 1`] = `"[160]"`;
+exports[`calculate simulations-artiste-auteur: salarié 1`] = `
+"[160]
+Notifications affichées : artiste-auteur . cotisations . avertissement trimestres retraite"
+`;
exports[`calculate simulations-artiste-auteur: salarié 2`] = `"[1603]"`;
@@ -106,7 +111,7 @@ Notifications affichées : dirigeant . auto-entrepreneur . notification calcul A
`;
exports[`calculate simulations-auto-entrepreneur: ACRE 3`] = `
-"[33228,269,30000,0,30000]
+"[34449,371,30000,0,30000]
Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel"
`;
@@ -121,17 +126,23 @@ exports[`calculate simulations-auto-entrepreneur: activité mixte 2`] = `"[20000
exports[`calculate simulations-auto-entrepreneur: activité mixte 3`] = `"[20000,297,16438,0,16438]"`;
-exports[`calculate simulations-auto-entrepreneur: aides 1`] = `"[5742,62,5000,0,5000]"`;
+exports[`calculate simulations-auto-entrepreneur: aides 1`] = `
+"[5538,45,5000,0,5000]
+Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel"
+`;
-exports[`calculate simulations-auto-entrepreneur: aides 2`] = `"[57415,618,50000,0,50000]"`;
+exports[`calculate simulations-auto-entrepreneur: aides 2`] = `
+"[55380,448,50000,176,49824]
+Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel"
+`;
-exports[`calculate simulations-auto-entrepreneur: impôt sur le revenu 1`] = `"[32092,591,25000,0,25000]"`;
+exports[`calculate simulations-auto-entrepreneur: impôt sur le revenu 1`] = `"[32092,591,25000,706,24294]"`;
exports[`calculate simulations-auto-entrepreneur: échelle de revenus 1`] = `"[574,6,500,0,500]"`;
exports[`calculate simulations-auto-entrepreneur: échelle de revenus 2`] = `"[1148,12,1000,0,1000]"`;
-exports[`calculate simulations-auto-entrepreneur: échelle de revenus 3`] = `"[2297,25,2000,0,2000]"`;
+exports[`calculate simulations-auto-entrepreneur: échelle de revenus 3`] = `"[2296,25,2000,0,2000]"`;
exports[`calculate simulations-auto-entrepreneur: échelle de revenus 4`] = `"[5742,62,5000,0,5000]"`;
@@ -139,23 +150,43 @@ exports[`calculate simulations-auto-entrepreneur: échelle de revenus 5`] = `"[1
exports[`calculate simulations-auto-entrepreneur: échelle de revenus 6`] = `"[22966,247,20000,0,20000]"`;
-exports[`calculate simulations-auto-entrepreneur: échelle de revenus 7`] = `"[57415,618,50000,0,50000]"`;
+exports[`calculate simulations-auto-entrepreneur: échelle de revenus 7`] = `"[57415,618,50000,270,49730]"`;
-exports[`calculate simulations-auto-entrepreneur: échelle de revenus 8`] = `"[80381,865,70000,956,69044]"`;
+exports[`calculate simulations-auto-entrepreneur: échelle de revenus 8`] = `"[80381,865,70000,1334,68666]"`;
exports[`calculate simulations-auto-entrepreneur: échelle de revenus 9`] = `
-"[114830,1236,100000,3297,96703]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[114830,1236,100000,3996,96004]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
exports[`calculate simulations-auto-entrepreneur: échelle de revenus 10`] = `
-"[1148303,12359,1000000,126543,873457]
-Notifications affichées : dirigeant . auto-entrepreneur . seuils dépassés . notification, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[1148303,12359,1000000,131938,868062]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement, entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés"
`;
+exports[`calculate simulations-dividendes: barème couple 2 enfants 1`] = `"[200,166,34,0,112,112,0]"`;
+
+exports[`calculate simulations-dividendes: barème couple 2 enfants 2`] = `"[20000000,11148792,3440000,5411208,11184000,11184000,48]"`;
+
+exports[`calculate simulations-dividendes: barème couple 2 enfants 3`] = `"[200,112,34,40,112,112,36]"`;
+
+exports[`calculate simulations-dividendes: barème couple 2 enfants 4`] = `"[20000,15024,3440,622,11184,11184,6]"`;
+
+exports[`calculate simulations-dividendes: barème défauts 1`] = `"[200,166,34,0,112,112,0]"`;
+
+exports[`calculate simulations-dividendes: barème défauts 2`] = `"[20000000,11112746,3440000,5447254,11184000,11184000,49]"`;
+
+exports[`calculate simulations-dividendes: barème défauts 3`] = `"[200,111,34,47,112,112,42]"`;
+
+exports[`calculate simulations-dividendes: barème défauts 4`] = `"[20000,13205,3440,2260,11184,11184,20]"`;
+
+exports[`calculate simulations-dividendes: pfu 1`] = `"[200,140,34,26,120,120,0]"`;
+
+exports[`calculate simulations-dividendes: pfu 2`] = `"[20000000,14000000,3440000,2560000,12000000,12000000,0]"`;
+
exports[`calculate simulations-impot-société: bénéfices 1`] = `
"[0,0]
-Notifications affichées : entreprise . bénéfice . information sur le report de déficit"
+Notifications affichées : entreprise . imposition . IS . information sur le report de déficit"
`;
exports[`calculate simulations-impot-société: bénéfices 2`] = `"[0,0]"`;
@@ -164,354 +195,403 @@ exports[`calculate simulations-impot-société: bénéfices 3`] = `"[300,0]"`;
exports[`calculate simulations-impot-société: bénéfices 4`] = `"[3000,0]"`;
-exports[`calculate simulations-impot-société: bénéfices 5`] = `"[51044,0]"`;
+exports[`calculate simulations-impot-société: bénéfices 5`] = `"[48628,0]"`;
-exports[`calculate simulations-impot-société: bénéfices 6`] = `"[555044,0]"`;
+exports[`calculate simulations-impot-société: bénéfices 6`] = `
+"[525628,0]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-impot-société: bénéfices 7`] = `"[5595044,159457]"`;
+exports[`calculate simulations-impot-société: bénéfices 7`] = `
+"[5295628,149646]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-impot-société: prorata temporis 1`] = `"[275044,0]"`;
+exports[`calculate simulations-impot-société: prorata temporis 1`] = `
+"[260628,0]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-impot-société: prorata temporis 2`] = `"[277936,0]"`;
+exports[`calculate simulations-impot-société: prorata temporis 2`] = `
+"[277936,0]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-impot-société: prorata temporis 3`] = `"[272981,0]"`;
+exports[`calculate simulations-impot-société: prorata temporis 3`] = `
+"[272981,0]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`;
+exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3559]"`;
-exports[`calculate simulations-indépendant: activité 1`] = `"[26955,6955,20000,20729,601,19399,0,26955]"`;
+exports[`calculate simulations-indépendant: activité 1`] = `"[29086,9086,20000,20787,931,19069,0,29086,3559]"`;
-exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,603,19397,0,29100]"`;
+exports[`calculate simulations-indépendant: activité 2`] = `"[29102,9102,20000,20787,931,19069,0,29102,3575]"`;
-exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1368,1268,100,134,0,100,0,1368]"`;
+exports[`calculate simulations-indépendant: conjoint collaborateur 1`] = `"[77179,27179,50000,52092,9633,40367,0,77179,7308]"`;
-exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[244,144,100,104,0,100,0,244]"`;
+exports[`calculate simulations-indépendant: conjoint collaborateur 2`] = `"[78241,28241,50000,52121,9642,40358,0,78241,4487]"`;
-exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084]"`;
+exports[`calculate simulations-indépendant: conjoint collaborateur 3`] = `"[80761,30761,50000,52189,9663,40337,0,80761,4811]"`;
-exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`;
+exports[`calculate simulations-indépendant: conjoint collaborateur 4`] = `"[75298,25298,50000,52041,9618,40382,0,75298,3809]"`;
-exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084]"`;
+exports[`calculate simulations-indépendant: conjoint collaborateur 5`] = `"[75297,25297,50000,52041,9618,40382,0,75297,3951]"`;
-exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1366,634,686,0,634,0,2000]"`;
+exports[`calculate simulations-indépendant: conjoint collaborateur 6`] = `
+"[652233,152233,500000,517707,220771,279229,0,652233,4487]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33998,35353,3500,30498,0,50000]"`;
+exports[`calculate simulations-indépendant: cotisations facultatives 1`] = `"[30000,13181,16819,17881,467,16352,0,30000,3559]"`;
-exports[`calculate simulations-indépendant: inversions 3`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`;
+exports[`calculate simulations-indépendant: cotisations facultatives 2`] = `"[30000,14381,15619,17881,467,15152,0,30000,3559]"`;
-exports[`calculate simulations-indépendant: inversions 4`] = `"[68273,21573,46700,48551,6700,40000,0,68273]"`;
+exports[`calculate simulations-indépendant: cotisations facultatives 3`] = `"[30000,10381,19619,20431,874,18745,0,30000,3559]"`;
-exports[`calculate simulations-indépendant: inversions 5`] = `"[14460,4460,10000,10390,0,10000,1000,15460]"`;
+exports[`calculate simulations-indépendant: cotisations facultatives 4`] = `"[20000,6732,13268,13809,0,13268,0,20000,3559]"`;
-exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5870,13130,13643,0,13130,1000,20000]"`;
+exports[`calculate simulations-indépendant: cotisations facultatives 5`] = `
+"[300000,79622,220378,228521,82429,137949,0,300000,3559]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-indépendant: inversions 7`] = `"[17999,5557,12442,12928,0,12442,2000,20000]"`;
+exports[`calculate simulations-indépendant: cotisations facultatives 6`] = `
+"[300000,83122,216878,225021,80854,136024,0,300000,3559]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1841,1341,500,547,0,500,0,1841]"`;
+exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1375,1275,100,135,0,100,0,1375,3559]"`;
-exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2431,1431,1000,1063,0,1000,0,2431]"`;
+exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[244,144,100,104,0,100,0,244,3211]"`;
-exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3025,1525,1500,1579,0,1500,0,3025]"`;
+exports[`calculate simulations-indépendant: imposition à l'IS 1`] = `
+"[100000,30105,69895,72609,15123,54772,0,100000,3559]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3618,1618,2000,2095,0,2000,0,3618]"`;
+exports[`calculate simulations-indépendant: imposition à l'IS 2`] = `
+"[100000,30105,69895,72609,15123,54772,0,100000,3559]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
+`;
-exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7302,2302,5000,5195,0,5000,0,7302]"`;
+exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29086,9086,20000,20787,603,19397,0,29086,3559]"`;
-exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`;
+exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3559]"`;
+
+exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29086,9086,20000,20787,2079,17921,0,29086,3559]"`;
+
+exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1386,614,666,0,614,0,2000,3559]"`;
+
+exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16004,33996,35351,4611,29385,0,50000,3559]"`;
+
+exports[`calculate simulations-indépendant: inversions 3`] = `"[14597,4597,10000,10394,0,10000,0,14597,3559]"`;
+
+exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3559]"`;
+
+exports[`calculate simulations-indépendant: inversions 5`] = `"[14597,4597,10000,10394,0,10000,1000,15597,3559]"`;
+
+exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5929,13071,13584,0,13071,1000,20000,3559]"`;
+
+exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5627,12373,12860,0,12373,2000,20000,3559]"`;
+
+exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1861,1361,500,548,0,500,0,1861,3559]"`;
+
+exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466,3559]"`;
+
+exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075,3559]"`;
+
+exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3683,1683,2000,2097,0,2000,0,3683,3559]"`;
+
+exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7428,2428,5000,5199,0,5000,0,7428,3559]"`;
+
+exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14597,4597,10000,10394,0,10000,0,14597,3559]"`;
exports[`calculate simulations-indépendant: échelle de revenus 7`] = `
-"[139593,39593,100000,103788,24909,75091,0,139593]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[139593,39593,100000,103788,28472,71528,0,139593,3559]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
exports[`calculate simulations-indépendant: échelle de revenus 8`] = `
-"[1239954,239954,1000000,1033666,444476,555524,0,1239954]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[1239954,239954,1000000,1033666,473591,526409,0,1239954,3559]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
-exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[2873,0,2373,500,0,500]"`;
+exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[3147,0,2647,500,0,500]"`;
-exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3433,0,2433,1000,0,1000]"`;
+exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3708,0,2708,1000,0,1000]"`;
-exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[3994,0,2494,1500,0,1500]"`;
+exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[4267,0,2767,1500,0,1500]"`;
-exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4554,0,2554,2000,0,2000]"`;
+exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4827,0,2827,2000,0,2000]"`;
-exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[7987,0,2987,5000,0,5000]"`;
+exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[8245,0,3245,5000,0,5000]"`;
-exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14244,0,4244,10000,0,10000]"`;
+exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14422,0,4422,10000,0,10000]"`;
exports[`calculate simulations-professions-libérales: CIPAV 7`] = `
-"[146241,0,46241,100000,24952,75048]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[146241,0,46241,100000,28546,71454]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
exports[`calculate simulations-professions-libérales: CIPAV 8`] = `
-"[1238004,0,238004,1000000,444454,555546]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[1238004,0,238004,1000000,473565,526435]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
-exports[`calculate simulations-professions-libérales: auxiliaire médical 1`] = `"[30000,0,7751,22249,945,21304]"`;
+exports[`calculate simulations-professions-libérales: auxiliaire médical 1`] = `"[30000,0,7733,22267,1297,20970]"`;
-exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = `"[30000,0,8077,21923,932,20991]"`;
+exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = `"[30000,0,8058,21942,1245,20697]"`;
-exports[`calculate simulations-professions-libérales: auxiliaire médical 3`] = `"[300000,0,61784,238216,81297,156919]"`;
+exports[`calculate simulations-professions-libérales: auxiliaire médical 3`] = `"[300000,0,61611,238389,90534,147855]"`;
exports[`calculate simulations-professions-libérales: avocat 1`] = `
-"[50000,0,11821,38179,4705,33474]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[50000,0,11181,38819,6058,32761]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
exports[`calculate simulations-professions-libérales: avocat 2`] = `
-"[50000,0,11821,38179,4705,33474]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[50000,0,11821,38179,5866,32313]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
-exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,0,14951]"`;
+exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5076,14924,81,14843]"`;
exports[`calculate simulations-professions-libérales: expert-comptable 2`] = `
-"[50000,0,14877,35123,3611,31512]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[50000,0,14877,35123,4949,30174]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
-exports[`calculate simulations-professions-libérales: médecin 1`] = `"[50000,0,14293,35707,3669,32038]"`;
+exports[`calculate simulations-professions-libérales: médecin 1`] = `"[50000,0,10817,39183,6167,33016]"`;
-exports[`calculate simulations-professions-libérales: médecin 2`] = `"[50000,0,20283,29717,2330,27387]"`;
+exports[`calculate simulations-professions-libérales: médecin 2`] = `"[50000,0,17650,32350,4117,28233]"`;
-exports[`calculate simulations-professions-libérales: médecin 3`] = `"[300000,0,86546,213454,73125,140329]"`;
+exports[`calculate simulations-professions-libérales: médecin 3`] = `"[300000,0,73630,226370,85125,141245]"`;
-exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,106265,293737,115744,177993]"`;
+exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93706,306294,124328,181966]"`;
exports[`calculate simulations-professions-libérales: médecin 5`] = `
-"[120000,0,34704,85296,17710,67586]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[120000,0,26977,93023,25393,67630]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
-exports[`calculate simulations-professions-libérales: médecin 6`] = `
-"[50000,0,10691,39307,4839,34468]
-Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire"
-`;
+exports[`calculate simulations-professions-libérales: médecin 6`] = `"[50000,0,10663,39337,6213,33124]"`;
-exports[`calculate simulations-professions-libérales: sage-femme 1`] = `"[50000,0,12384,37617,4638,32979]"`;
+exports[`calculate simulations-professions-libérales: sage-femme 1`] = `"[50000,0,12354,37646,5706,31940]"`;
exports[`calculate simulations-professions-libérales: sage-femme 2`] = `
-"[20000,0,5148,14852,0,14852]
+"[20000,0,5136,14864,71,14793]
Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable"
`;
exports[`calculate simulations-professions-libérales: sage-femme 3`] = `
-"[4000,0,1271,2729,0,2729]
+"[4000,0,1267,2733,0,2733]
Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable, dirigeant . indépendant . PL . CARCDSF . sage-femme . exonération PCV"
`;
exports[`calculate simulations-professions-libérales: sage-femme 4`] = `
-"[20000,0,5148,14852,0,14852]
+"[20000,0,5136,14864,71,14793]
Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable"
`;
exports[`calculate simulations-professions-libérales: sage-femme 5`] = `
-"[20000,0,5224,14775,0,14775]
+"[20000,0,5213,14787,59,14728]
Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable"
`;
exports[`calculate simulations-professions-libérales: sage-femme 6`] = `
-"[20000,0,5301,14698,0,14698]
+"[20000,0,5289,14711,47,14664]
Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable"
`;
exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): ACRE 1`] = `
-"[606,0,0,7127,4,13]
+"[606,7272,0,7127,4,13]
Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel"
`;
exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): ACRE 2`] = `
-"[1249,0,0,14429,4,26]
+"[1249,14993,0,14429,4,26]
Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel"
`;
exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): ACRE 3`] = `
-"[1893,0,0,21731,4,40]
+"[1893,22714,0,21731,4,40]
Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel"
`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 1`] = `"[1391,0,0,16041,4,29]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 1`] = `"[1391,16698,0,16041,4,29]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 2`] = `"[1391,0,0,16041,4,29]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 2`] = `"[1391,16698,0,16041,4,29]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 3`] = `"[1391,0,0,16041,4,29]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 3`] = `"[1391,16698,0,16041,4,29]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 4`] = `"[917,0,0,10651,4,20]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 4`] = `"[917,10998,0,10651,4,20]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 5`] = `
-"[14490,0,0,150669,4,46]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
-`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 5`] = `"[14490,173883,0,150669,4,46]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = `"[917,0,0,10651,4,20]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = `"[917,10998,0,10651,4,20]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,0,0,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 7`] = `"[917,10998,0,10651,4,20]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,0,0,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,10998,0,10651,4,20]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = `"[917,0,0,10651,4,20]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,10998,0,null,4,0]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 4`] = `"[917,0,0,10651,4,20]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = `"[917,10998,0,10651,4,20]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 5`] = `"[917,0,0,10651,4,20]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 4`] = `"[917,10998,0,10651,4,20]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 1`] = `"[442,0,0,5261,4,10]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 5`] = `"[917,10998,0,10651,4,20]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 2`] = `"[917,0,0,10651,4,20]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 1`] = `"[442,5299,0,5261,4,10]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = `"[-30,0,0,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 2`] = `"[917,10998,0,10651,4,20]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 2`] = `"[14,0,0,136,0,1]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = `"[-30,-361,0,0,0,0]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 3`] = `"[62,0,0,314,0,2]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 2`] = `"[14,170,0,136,0,1]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 4`] = `"[204,0,0,2566,2,5]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 3`] = `"[62,740,0,314,0,2]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 5`] = `"[442,0,0,5261,4,10]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 4`] = `"[204,2450,0,2566,2,5]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 6`] = `"[917,0,0,10651,4,20]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 5`] = `"[442,5299,0,5261,4,10]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 7`] = `"[2341,0,0,26822,4,46]"`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 6`] = `"[917,10998,0,10651,4,20]"`;
-exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 8`] = `
-"[4758,0,0,51817,4,46]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
-`;
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 7`] = `"[2341,28096,0,26822,4,46]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 8`] = `"[4758,57101,0,51817,4,46]"`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 1`] = `
-"[0,0,9349,1450,2,0]
+"[0,9349,9349,1450,2,0]
Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel"
`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 2`] = `
-"[0,0,18697,2900,3,8]
+"[0,18697,18697,2900,3,8]
Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel"
`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 3`] = `
-"[0,0,28046,4350,4,12]
+"[0,26126,26126,4350,4,12]
Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel"
`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 1`] = `"[0,0,34834,5800,4,16]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 1`] = `"[0,34834,34834,5800,4,16]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 2`] = `"[0,0,34834,5800,4,16]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 2`] = `"[0,34834,34834,5800,4,16]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 3`] = `"[0,0,34834,5800,4,16]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 3`] = `"[0,34834,34834,5800,4,16]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 4`] = `"[0,0,18288,3045,4,8]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 4`] = `"[0,18288,18288,3045,4,8]"`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 5`] = `
-"[0,0,274318,20568,4,56]
-Notifications affichées : dirigeant . auto-entrepreneur . seuils dépassés . notification, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[0,274318,274318,20568,4,56]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement, entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés"
`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 6`] = `"[0,0,17852,2973,3,8]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 6`] = `"[0,17852,17852,2973,3,8]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 1`] = `"[0,0,15580,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 7`] = `"[0,17417,17417,2900,3,8]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 2`] = `"[0,0,15560,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 1`] = `"[0,15580,15580,6600,4,18]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 3`] = `"[0,0,17336,2900,3,8]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 2`] = `"[0,15560,15560,null,4,0]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 4`] = `"[0,0,17417,2900,3,8]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 3`] = `"[0,17336,17336,2900,3,8]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 5`] = `"[0,0,15580,5000,4,14]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 4`] = `"[0,17417,17417,2900,3,8]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): avec charges 1`] = `"[0,0,10450,1740,3,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 5`] = `"[0,15580,15580,5000,4,14]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): avec charges 2`] = `"[0,0,30480,5075,4,14]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): avec charges 1`] = `"[0,10450,10450,1740,3,0]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 1`] = `"[0,0,87,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): avec charges 2`] = `"[0,30480,30480,5075,4,14]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 2`] = `"[0,0,871,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 1`] = `"[0,87,87,0,0,0]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 3`] = `"[0,0,1742,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 2`] = `"[0,871,871,0,0,0]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 4`] = `"[0,0,4354,725,1,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 3`] = `"[0,1742,1742,0,0,0]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 5`] = `"[0,0,8709,1450,2,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 4`] = `"[0,4354,4354,725,1,0]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 6`] = `"[0,0,17417,2900,3,8]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 5`] = `"[0,8709,8709,1450,2,0]"`;
-exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 7`] = `"[0,0,43543,7250,4,20]"`;
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 6`] = `"[0,17417,17417,2900,3,8]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 7`] = `"[0,43543,43543,7250,4,20]"`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 8`] = `
-"[0,0,87085,14500,4,40]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[0,87085,87085,14500,4,40]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] = `
-"[0,8392,0,6102,4,21]
-Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire"
-`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] = `"[0,8392,0,6077,4,21]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `
-"[0,16871,0,12270,4,24]
-Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire"
-`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12220,4,24]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `
-"[0,22331,0,16308,4,32]
-Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire"
-`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22330,0,16241,4,32]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,19388,0,16984,4,33]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16819,0,13265,4,24]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,18995,0,17577,4,34]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15619,0,13265,4,24]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,20297,0,15600,4,30]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19619,0,14540,4,28]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13656,0,10367,4,21]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13268,0,9793,4,21]"`;
exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = `
-"[0,225725,0,57933,4,56]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[0,220378,0,57407,4,56]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `
-"[0,13624,0,10417,4,21]
-Notifications affichées : dirigeant . indépendant . contrats madelin . contrôle montant charges"
+exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13168,0,9743,4,21]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 7`] = `"[0,6868,0,7736,4,21]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13768,0,10043,4,21]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14515,0,null,4,0]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10035,4,21]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13768,0,10043,4,21]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13768,0,10043,4,21]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6794,0,4956,4,21]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13768,0,10043,4,21]"`;
+
+exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = `
+"[0,-1045,0,0,3,21]
+Notifications affichées : entreprise . imposition . IR . information sur le report de déficit"
`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,14555,0,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = `
+"[0,-226,0,0,3,21]
+Notifications affichées : entreprise . imposition . IR . information sur le report de déficit"
+`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,0,0,0]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,614,0,468,3,21]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13804,0,10108,4,21]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3083,0,2257,3,21]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13814,0,10116,4,21]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6794,0,4956,4,21]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13814,0,10116,4,21]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13768,0,10043,4,21]"`;
-exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6894,0,5046,4,21]"`;
-
-exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13814,0,10116,4,21]"`;
-
-exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = `"[0,-1044,0,0,3,21]"`;
-
-exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = `"[0,-225,0,0,3,21]"`;
-
-exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,634,0,483,3,21]"`;
-
-exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3160,0,2322,3,21]"`;
-
-exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6894,0,5046,4,21]"`;
-
-exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13814,0,10116,4,21]"`;
-
-exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33998,0,24913,4,48]"`;
+exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33996,0,24810,4,48]"`;
exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 8`] = `
-"[0,69896,0,36428,4,56]
-Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification"
+"[0,69895,0,36204,4,56]
+Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement"
`;
exports[`calculate simulations-salarié: CCN HCR 1`] = `
-"[3532,0,2500,1998,1887]
+"[3546,0,2500,2005,1894]
Notifications affichées : contrat salarié . convention collective . contrôle décharge"
`;
@@ -541,7 +621,7 @@ Notifications affichées : contrat salarié . convention collective . contrôle
`;
exports[`calculate simulations-salarié: CCN spectacle vivant 1`] = `
-"[3923,0,2500,1938,1856]
+"[3913,0,2500,1938,1856]
Notifications affichées : contrat salarié . CDD . information, contrat salarié . convention collective . contrôle décharge"
`;
@@ -553,7 +633,7 @@ Notifications affichées : contrat salarié . rémunération . contrôle smic"
exports[`calculate simulations-salarié: JEI 1`] = `"[3441,0,3000,2353,2168]"`;
exports[`calculate simulations-salarié: JEI 2`] = `
-"[26625,0,20000,15969,10503]
+"[26625,0,20000,15969,10332]
Notifications affichées : contrat salarié . rémunération . contrôle salaire élevé"
`;
@@ -561,42 +641,44 @@ exports[`calculate simulations-salarié: JEI 3`] = `"[4518,0,4000,3141,2745]"`;
exports[`calculate simulations-salarié: activité partielle 1`] = `"[27,0,1560,1209,1209]"`;
-exports[`calculate simulations-salarié: activité partielle 2`] = `"[427,0,4000,2594,2392]"`;
+exports[`calculate simulations-salarié: activité partielle 2`] = `"[747,0,4000,2594,2392]"`;
-exports[`calculate simulations-salarié: activité partielle 3`] = `"[1429,0,8000,5209,4245]"`;
+exports[`calculate simulations-salarié: activité partielle 3`] = `"[1989,0,8000,5209,4148]"`;
-exports[`calculate simulations-salarié: activité partielle 4`] = `"[1172,0,4000,2704,2426]"`;
+exports[`calculate simulations-salarié: activité partielle 4`] = `"[1428,0,4000,2704,2426]"`;
-exports[`calculate simulations-salarié: activité partielle 5`] = `"[2670,0,4000,2870,2574]"`;
+exports[`calculate simulations-salarié: activité partielle 5`] = `"[2830,0,4000,2870,2574]"`;
-exports[`calculate simulations-salarié: activité partielle 6`] = `"[327,3750,3000,1940,1833]"`;
+exports[`calculate simulations-salarié: activité partielle 6`] = `"[567,3750,3000,1940,1833]"`;
-exports[`calculate simulations-salarié: activité partielle 7`] = `"[427,0,4000,2594,2485]"`;
+exports[`calculate simulations-salarié: activité partielle 7`] = `"[747,0,4000,2594,2485]"`;
exports[`calculate simulations-salarié: activité partielle 8`] = `"[397,0,2000,1555,1522]"`;
exports[`calculate simulations-salarié: activité partielle 9`] = `"[1241,0,2000,1555,1521]"`;
-exports[`calculate simulations-salarié: activité partielle 10`] = `"[927,0,6000,4182,3498]"`;
+exports[`calculate simulations-salarié: activité partielle 10`] = `"[1407,0,6000,4182,3498]"`;
-exports[`calculate simulations-salarié: activité partielle 11`] = `"[2653,0,9000,6237,4945]"`;
+exports[`calculate simulations-salarié: activité partielle 11`] = `"[3213,0,9000,6237,4853]"`;
exports[`calculate simulations-salarié: aides 1`] = `"[2303,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié: aides 2`] = `
-"[12825,0,10000,8911,7620]
+"[12825,0,10000,8911,7530]
Notifications affichées : contrat salarié . rémunération . contrôle salaire élevé, contrat salarié . régime des impatriés . information"
`;
exports[`calculate simulations-salarié: aides 3`] = `"[2050,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié: aides 4`] = `
-"[2658,0,2000,1720,1656]
+"[2657,0,2000,1720,1656]
Notifications affichées : contrat salarié . CDD . information"
`;
exports[`calculate simulations-salarié: aides 5`] = `"[1883,0,2000,1561,1527]"`;
+exports[`calculate simulations-salarié: aides 6`] = `"[2133,0,2000,1561,1527]"`;
+
exports[`calculate simulations-salarié: aides embauche covid 1`] = `
"[1237,0,1500,1165,1165]
Notifications affichées : contrat salarié . rémunération . contrôle smic"
@@ -605,7 +687,7 @@ Notifications affichées : contrat salarié . rémunération . contrôle smic"
exports[`calculate simulations-salarié: aides embauche covid 2`] = `"[7086,0,5000,3948,3298]"`;
exports[`calculate simulations-salarié: aides embauche covid 3`] = `
-"[1493,0,1500,1284,1284]
+"[1490,0,1500,1284,1284]
Notifications affichées : contrat salarié . CDD . information, contrat salarié . rémunération . contrôle smic"
`;
@@ -641,27 +723,27 @@ exports[`calculate simulations-salarié: avantages 3`] = `"[2574,0,2000,1549,150
exports[`calculate simulations-salarié: cadre 1`] = `"[4123,0,3000,2348,2160]"`;
exports[`calculate simulations-salarié: cdd 1`] = `
-"[3292,0,2200,1894,1815]
+"[3282,0,2200,1894,1815]
Notifications affichées : contrat salarié . CDD . information"
`;
exports[`calculate simulations-salarié: cdd 2`] = `
-"[3117,0,2200,1824,1746]
+"[3115,0,2200,1824,1746]
Notifications affichées : contrat salarié . CDD . information"
`;
exports[`calculate simulations-salarié: cdd 3`] = `
-"[3378,0,2200,1997,1918]
+"[3377,0,2200,1997,1918]
Notifications affichées : contrat salarié . CDD . information"
`;
exports[`calculate simulations-salarié: cdd 4`] = `
-"[4112,0,2200,2387,2262]
+"[4111,0,2200,2387,2262]
Notifications affichées : contrat salarié . CDD . information"
`;
exports[`calculate simulations-salarié: cdd 5`] = `
-"[3392,0,2200,1746,1695]
+"[3382,0,2200,1746,1695]
Notifications affichées : contrat salarié . CDD . information, contrat salarié . convention collective . contrôle décharge"
`;
@@ -677,7 +759,7 @@ exports[`calculate simulations-salarié: effectif 3`] = `"[2527,0,2000,1561,1527
exports[`calculate simulations-salarié: effectif 4`] = `"[2527,0,2000,1561,1527]"`;
-exports[`calculate simulations-salarié: frais pro - DFS 1`] = `"[2227,0,2000,1630,1630]"`;
+exports[`calculate simulations-salarié: frais pro - DFS 1`] = `"[2196,0,2000,1630,1630]"`;
exports[`calculate simulations-salarié: frais pro - DFS 2`] = `"[2318,0,2000,1584,1549]"`;
@@ -685,7 +767,7 @@ exports[`calculate simulations-salarié: frais pro - DFS 3`] = `"[2248,0,2000,16
exports[`calculate simulations-salarié: frais pro - DFS 4`] = `"[2232,0,2000,1612,1563]"`;
-exports[`calculate simulations-salarié: frais pro - DFS 5`] = `"[2425,0,2000,1590,1590]"`;
+exports[`calculate simulations-salarié: frais pro - DFS 5`] = `"[2466,0,2000,1561,1527]"`;
exports[`calculate simulations-salarié: frais pro - DFS 6`] = `"[1768,0,1700,1363,1363]"`;
@@ -721,7 +803,7 @@ exports[`calculate simulations-salarié: frais pro - transports personnels seul
exports[`calculate simulations-salarié: frais pro - transports personnels seul 5`] = `"[4397,0,3200,2548,2349]"`;
-exports[`calculate simulations-salarié: frais pro - transports personnels seul 6`] = `"[4125,0,3200,2624,2422]"`;
+exports[`calculate simulations-salarié: frais pro - transports personnels seul 6`] = `"[4125,0,3200,2583,2381]"`;
exports[`calculate simulations-salarié: heures supplémentaires et complémentaires 1`] = `"[2570,0,2000,1636,1601]"`;
@@ -730,12 +812,12 @@ exports[`calculate simulations-salarié: heures supplémentaires et complémenta
exports[`calculate simulations-salarié: heures supplémentaires et complémentaires 3`] = `"[2641,0,2000,1636,1601]"`;
exports[`calculate simulations-salarié: heures supplémentaires et complémentaires 4`] = `
-"[2552,0,2000,1627,1592]
+"[2567,0,2000,1632,1598]
Notifications affichées : contrat salarié . convention collective . contrôle décharge"
`;
exports[`calculate simulations-salarié: heures supplémentaires et complémentaires 5`] = `
-"[2517,0,2000,1601,1566]
+"[2533,0,2000,1606,1572]
Notifications affichées : contrat salarié . convention collective . contrôle décharge"
`;
@@ -782,7 +864,7 @@ Notifications affichées : contrat salarié . rémunération . contrôle salaire
`;
exports[`calculate simulations-salarié: impôt sur le revenu 3`] = `
-"[4520,0,3000,2590,2392]
+"[4515,0,3000,2590,2392]
Notifications affichées : contrat salarié . CDD . information"
`;
@@ -932,21 +1014,21 @@ exports[`calculate simulations-salarié: échelle de salaires 11`] = `"[5674,0,4
exports[`calculate simulations-salarié: échelle de salaires 12`] = `"[7086,0,5000,3948,3298]"`;
exports[`calculate simulations-salarié: échelle de salaires 13`] = `
-"[14321,0,10000,7958,5975]
+"[14321,0,10000,7958,5874]
Notifications affichées : contrat salarié . rémunération . contrôle salaire élevé"
`;
exports[`calculate simulations-salarié: échelle de salaires 14`] = `
-"[28349,0,20000,15969,10503]
+"[28349,0,20000,15969,10332]
Notifications affichées : contrat salarié . rémunération . contrôle salaire élevé"
`;
exports[`calculate simulations-salarié: échelle de salaires 15`] = `
-"[128595,0,100000,87157,48426]
+"[128595,0,100000,87157,45797]
Notifications affichées : contrat salarié . rémunération . contrôle salaire élevé"
`;
exports[`calculate simulations-salarié: échelle de salaires 16`] = `
-"[1244019,0,1000000,896257,498390]
+"[1244019,0,1000000,896257,445619]
Notifications affichées : contrat salarié . rémunération . contrôle salaire élevé"
`;
diff --git a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml
index 7196c3220..6147c6dba 100644
--- a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml
+++ b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml
@@ -1,83 +1,110 @@
échelle de revenus:
- - dirigeant . rémunération totale: 500 €/an
- - dirigeant . rémunération totale: 1000 €/an
- - dirigeant . rémunération totale: 1500 €/an
- - dirigeant . rémunération totale: 2000 €/an
- - dirigeant . rémunération totale: 5000 €/an
- - dirigeant . rémunération totale: 10000 €/an
- - dirigeant . rémunération totale: 100000 €/an
- - dirigeant . rémunération totale: 1000000 €/an
+ - dirigeant . rémunération . totale: 500 €/an
+ - dirigeant . rémunération . totale: 1000 €/an
+ - dirigeant . rémunération . totale: 1500 €/an
+ - dirigeant . rémunération . totale: 2000 €/an
+ - dirigeant . rémunération . totale: 5000 €/an
+ - dirigeant . rémunération . totale: 10000 €/an
+ - dirigeant . rémunération . totale: 100000 €/an
+ - dirigeant . rémunération . totale: 1000000 €/an
nature de l'activité:
- aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'"
- dirigeant . rémunération totale: 5000 €/an
- - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale ou industrielle'"
- dirigeant . rémunération totale: 50000 €/an
- - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale ou industrielle'"
- dirigeant . rémunération totale: 5000 €/an
+ dirigeant . rémunération . totale: 5000 €/an
+ - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale'"
+ dirigeant . rémunération . totale: 50000 €/an
+ - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale'"
+ dirigeant . rémunération . totale: 5000 €/an
- aide déclaration revenu indépendant 2020 . nature de l'activité: "'libérale'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- aide déclaration revenu indépendant 2020 . nature de l'activité: "'libérale'"
- dirigeant . rémunération totale: 5000 €/an
+ dirigeant . rémunération . totale: 5000 €/an
- aide déclaration revenu indépendant 2020 . nature de l'activité: "'libérale'"
entreprise . date de création: 06/04/2020
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire: oui
débit de tabac:
- - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale ou industrielle'"
- dirigeant . rémunération totale: 50000 €/an
+ - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale'"
+ dirigeant . rémunération . totale: 50000 €/an
entreprise . activité . débit de tabac: oui
dirigeant . indépendant . cotisations et contributions . déduction tabac: 30000 €/an
RSA:
- situation personnelle . RSA: oui
- dirigeant . rémunération totale: 500 €/an
+ dirigeant . rémunération . totale: 500 €/an
- situation personnelle . RSA: oui
- dirigeant . rémunération totale: 5000 €/an
+ dirigeant . rémunération . totale: 5000 €/an
conjoint collaborateur:
- dirigeant . indépendant . conjoint collaborateur: oui
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- dirigeant . indépendant . conjoint collaborateur: oui
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- dirigeant . indépendant . conjoint collaborateur: oui
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- dirigeant . indépendant . conjoint collaborateur: oui
aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- dirigeant . indépendant . conjoint collaborateur: oui
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: "'moitié'"
IJSS (indemnité sécurité sociale):
- dirigeant . indépendant . IJSS: oui
dirigeant . indépendant . IJSS . total: 10000 €/an
dirigeant . indépendant . IJSS . imposable: 8000 €/an
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
ACRE:
- aide déclaration revenu indépendant 2020 . ACRE: oui
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- aide déclaration revenu indépendant 2020 . ACRE: oui
- dirigeant . rémunération totale: 15000 €/an
+ dirigeant . rémunération . totale: 15000 €/an
- aide déclaration revenu indépendant 2020 . ACRE: oui
- dirigeant . rémunération totale: 5000 €/an
+ dirigeant . rémunération . totale: 5000 €/an
- aide déclaration revenu indépendant 2020 . ACRE: oui
entreprise . date de création: 01/07/2019
- dirigeant . rémunération totale: 10000 €/an
+ dirigeant . rémunération . totale: 10000 €/an
- aide déclaration revenu indépendant 2020 . ACRE: oui
entreprise . date de création: 01/07/2020
- dirigeant . rémunération totale: 10000 €/an
+ dirigeant . rémunération . totale: 10000 €/an
international:
- situation personnelle . domiciliation fiscale à l'étranger: oui
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- dirigeant . indépendant . revenus étrangers: oui
dirigeant . indépendant . revenus étrangers . montant: 30000€/an
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
+
+aide covid 2020:
+ - dirigeant . rémunération . totale: 50000 €/an
+ aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'"
+ aide déclaration revenu indépendant 2020 . réduction covid: oui
+ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'"
+ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui
+ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020: oui
+ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles: 4
+ - dirigeant . rémunération . totale: 5000 €/an
+ aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'"
+ aide déclaration revenu indépendant 2020 . réduction covid: oui
+ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'"
+ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui
+ - dirigeant . rémunération . totale: 15000 €/an
+ aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'"
+ aide déclaration revenu indépendant 2020 . réduction covid: oui
+ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'"
+ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui
+ aide déclaration revenu indépendant 2020 . ACRE: oui
+ entreprise . date de création: 01/07/2020
+ - dirigeant . rémunération . totale: 35000 €/an
+ aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'"
+ aide déclaration revenu indépendant 2020 . réduction covid: oui
+ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'"
+ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui
+ dirigeant . indépendant . conjoint collaborateur: oui
diff --git a/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml b/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml
index 68d72b28f..f3515fbd5 100644
--- a/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml
+++ b/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml
@@ -29,20 +29,18 @@ ACRE:
entreprise . date de création: 01/01/2020
entreprise . ACRE: oui
- dirigeant . auto-entrepreneur . net de cotisations: 30000 €/an
- entreprise . date de création: 01/06/2019
+ entreprise . date de création: 01/06/2020
entreprise . ACRE: oui
- dirigeant . auto-entrepreneur . net de cotisations: 40000 €/an
- entreprise . date de création: 01/06/2018
+ entreprise . date de création: 01/06/2019
entreprise . ACRE: oui
-
activité mixte:
- - entreprise . chiffre d'affaires: 20000 €/an
+ - dirigeant . auto-entrepreneur . chiffre d'affaires: 20000 €/an
entreprise . activité . mixte: oui
- - entreprise . chiffre d'affaires: 20000 €/an
+ - dirigeant . auto-entrepreneur . chiffre d'affaires: 20000 €/an
entreprise . activité . mixte: oui
entreprise . activité: "'libérale'"
- - entreprise . chiffre d'affaires: 20000 €/an
+ - dirigeant . auto-entrepreneur . chiffre d'affaires: 20000 €/an
entreprise . activité . mixte: oui
entreprise . activité: "'artisanale'"
-
\ No newline at end of file
diff --git a/mon-entreprise/test/regressions/simulations-dividendes.yaml b/mon-entreprise/test/regressions/simulations-dividendes.yaml
new file mode 100644
index 000000000..728d2c886
--- /dev/null
+++ b/mon-entreprise/test/regressions/simulations-dividendes.yaml
@@ -0,0 +1,47 @@
+pfu:
+ - bénéficiaire . dividendes . bruts: 200 €/an
+ impôt . méthode de calcul: "'PFU'"
+ dirigeant: "'assimilé salarié'"
+ - bénéficiaire . dividendes . bruts: 20000000 €/an
+ impôt . méthode de calcul: "'PFU'"
+ dirigeant: "'assimilé salarié'"
+
+barème défauts:
+ - bénéficiaire . dividendes . bruts: 200 €/an
+ impôt . méthode de calcul: "'barème standard'"
+ dirigeant: "'assimilé salarié'"
+ - bénéficiaire . dividendes . bruts: 20000000 €/an
+ impôt . méthode de calcul: "'barème standard'"
+ dirigeant: "'assimilé salarié'"
+ - bénéficiaire . dividendes . bruts: 200 €/an
+ impôt . méthode de calcul: "'barème standard'"
+ dirigeant: "'assimilé salarié'"
+ impôt . foyer fiscal . revenu imposable . autres revenus imposables: 500000 €/an
+ - bénéficiaire . dividendes . bruts: 20000 €/an
+ impôt . méthode de calcul: "'barème standard'"
+ dirigeant: "'assimilé salarié'"
+ impôt . foyer fiscal . revenu imposable . autres revenus imposables: 50000 €/an
+
+barème couple 2 enfants:
+ - bénéficiaire . dividendes . bruts: 200 €/an
+ impôt . méthode de calcul: "'barème standard'"
+ dirigeant: "'assimilé salarié'"
+ impôt . foyer fiscal . enfants à charge: 2
+ impôt . foyer fiscal . situation de famille: "'couple'"
+ - bénéficiaire . dividendes . bruts: 20000000 €/an
+ impôt . méthode de calcul: "'barème standard'"
+ dirigeant: "'assimilé salarié'"
+ impôt . foyer fiscal . enfants à charge: 2
+ impôt . foyer fiscal . situation de famille: "'couple'"
+ - bénéficiaire . dividendes . bruts: 200 €/an
+ impôt . méthode de calcul: "'barème standard'"
+ dirigeant: "'assimilé salarié'"
+ impôt . foyer fiscal . revenu imposable . autres revenus imposables: 500000 €/an
+ impôt . foyer fiscal . enfants à charge: 2
+ impôt . foyer fiscal . situation de famille: "'couple'"
+ - bénéficiaire . dividendes . bruts: 20000 €/an
+ impôt . méthode de calcul: "'barème standard'"
+ dirigeant: "'assimilé salarié'"
+ impôt . foyer fiscal . revenu imposable . autres revenus imposables: 50000 €/an
+ impôt . foyer fiscal . enfants à charge: 2
+ impôt . foyer fiscal . situation de famille: "'couple'"
diff --git a/mon-entreprise/test/regressions/simulations-impôt-société.yaml b/mon-entreprise/test/regressions/simulations-impôt-société.yaml
index 61f4e97e6..0b56e87e8 100644
--- a/mon-entreprise/test/regressions/simulations-impôt-société.yaml
+++ b/mon-entreprise/test/regressions/simulations-impôt-société.yaml
@@ -1,17 +1,17 @@
bénéfices:
- - entreprise . bénéfice: -2000 €/an
- - entreprise . bénéfice: 0 €/an
- - entreprise . bénéfice: 2000 €/an
- - entreprise . bénéfice: 20000 €/an
- - entreprise . bénéfice: 200000 €/an
- - entreprise . bénéfice: 2000000 €/an
- - entreprise . bénéfice: 20000000 €/an
+ - entreprise . résultat fiscal: -2000 €/an
+ - entreprise . résultat fiscal: 0 €/an
+ - entreprise . résultat fiscal: 2000 €/an
+ - entreprise . résultat fiscal: 20000 €/an
+ - entreprise . résultat fiscal: 200000 €/an
+ - entreprise . résultat fiscal: 2000000 €/an
+ - entreprise . résultat fiscal: 20000000 €/an
prorata temporis:
- - entreprise . bénéfice: 1000000 €/an
- - entreprise . bénéfice: 1000000 €/an
+ - 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 . bénéfice: 1000000 €/an
+ - entreprise . résultat fiscal: 1000000 €/an
entreprise . exercice . début: 01/01/2020
entreprise . exercice . fin: 01/06/2021
diff --git a/mon-entreprise/test/regressions/simulations-indépendant.yaml b/mon-entreprise/test/regressions/simulations-indépendant.yaml
index 1cd7fc9ec..d42f99ff9 100644
--- a/mon-entreprise/test/regressions/simulations-indépendant.yaml
+++ b/mon-entreprise/test/regressions/simulations-indépendant.yaml
@@ -1,45 +1,103 @@
échelle de revenus:
- - dirigeant . indépendant . revenu net de cotisations: 500 €/an
- - dirigeant . indépendant . revenu net de cotisations: 1000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 1500 €/an
- - dirigeant . indépendant . revenu net de cotisations: 2000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 5000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 10000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 100000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 1000000 €/an
+ - dirigeant . rémunération . nette: 500 €/an
+ - dirigeant . rémunération . nette: 1000 €/an
+ - dirigeant . rémunération . nette: 1500 €/an
+ - dirigeant . rémunération . nette: 2000 €/an
+ - dirigeant . rémunération . nette: 5000 €/an
+ - dirigeant . rémunération . nette: 10000 €/an
+ - dirigeant . rémunération . nette: 100000 €/an
+ - dirigeant . rémunération . nette: 1000000 €/an
inversions:
- - dirigeant . rémunération totale: 2000 €/an
- - dirigeant . rémunération totale: 50000 €/an
- - revenu net après impôt: 10000 €/an
- - revenu net après impôt: 40000 €/an
- - revenu net après impôt: 10000 €/an
+ - dirigeant . rémunération . totale: 2000 €/an
+ - dirigeant . rémunération . totale: 50000 €/an
+ - dirigeant . rémunération . nette après impôt: 10000 €/an
+ - dirigeant . rémunération . nette après impôt: 40000 €/an
+ - dirigeant . rémunération . nette après impôt: 10000 €/an
entreprise . charges: 1000 €/an
- - entreprise . chiffre d'affaires minimum: 20000 €/an
+ - entreprise . chiffre d'affaires: 20000 €/an
entreprise . charges: 1000 €/an
- - entreprise . chiffre d'affaires minimum: 20000 €/an
+ - entreprise . chiffre d'affaires: 20000 €/an
entreprise . charges: 2000 €/an
cotisations minimales:
- - dirigeant . indépendant . revenu net de cotisations: 100 €/an
- - dirigeant . indépendant . revenu net de cotisations: 100 €/an
+ - dirigeant . rémunération . nette: 100 €/an
+ - dirigeant . rémunération . nette: 100 €/an
situation personnelle . RSA: oui
activité:
- - dirigeant . indépendant . revenu net de cotisations: 20000 €/an
+ - dirigeant . rémunération . nette: 20000 €/an
entreprise . activité: "'libérale'"
- - dirigeant . indépendant . revenu net de cotisations: 20000 €/an
+ - dirigeant . rémunération . nette: 20000 €/an
entreprise . activité: "'artisanale'"
acre:
- - dirigeant . indépendant . revenu net de cotisations: 50000 €/an
+ - dirigeant . rémunération . nette: 50000 €/an
entreprise . ACRE: oui
impôt sur le revenu:
- - dirigeant . indépendant . revenu net de cotisations: 20000 €/an
+ - dirigeant . rémunération . nette: 20000 €/an
impôt . méthode de calcul: "'taux neutre'"
- - dirigeant . indépendant . revenu net de cotisations: 50000 €/an
+ - dirigeant . rémunération . nette: 50000 €/an
impôt . méthode de calcul: "'taux neutre'"
- - dirigeant . indépendant . revenu net de cotisations: 20000 €/an
+ - dirigeant . rémunération . nette: 20000 €/an
impôt . méthode de calcul: "'taux personnalisé'"
impôt . taux personnalisé: 10%
+
+conjoint collaborateur:
+ - &conjoint-collab
+ dirigeant . rémunération . nette: 50000 €/an
+ dirigeant . indépendant . conjoint collaborateur: oui
+ - <<: *conjoint-collab
+ dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
+ - <<: *conjoint-collab
+ dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
+ dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: "'moitié'"
+ - <<: *conjoint-collab
+ dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'"
+ - <<: *conjoint-collab
+ dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'"
+ dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: "'moitié'"
+ - <<: *conjoint-collab
+ dirigeant . rémunération . nette: 500000 €/an
+ dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
+
+cotisations facultatives:
+ # Cas retraite: la cotisation Madelin est inferieure au plafond => le revenu net de
+ # cotisations (résultat comptable) n'est pas affecté car l'assiette des
+ # cotisations ne change pas:
+ - dirigeant . rémunération . totale: 30000 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 3800 €/an # plafond: 10% PSS donc environ 4100
+ # Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de
+ # cotisations est affecté car l'assiette des cotisations est plus élevée
+ - dirigeant . rémunération . totale: 30000 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 5000 €/an # plafond: 10% PSS donc environ 4100
+ # Cas mutuelle
+ - dirigeant . rémunération . totale: 30000 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1000 €/an
+ # Cas global madelin faible
+ - dirigeant . rémunération . totale: 20000 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 200 €/an
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 300 €/an
+ # Cas global madelin grand (plafonds calculés différemment)
+ - dirigeant . rémunération . totale: 300000 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1500 €/an
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an
+ # Cas madelin + PER grand
+ - dirigeant . rémunération . totale: 300000 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . PER: 3500 €/an
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1500 €/an
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an
+
+imposition à l'IS:
+ - entreprise . chiffre d'affaires: 100000 €/an
+ entreprise . imposition: "'IS'"
+ - entreprise . chiffre d'affaires: 100000 €/an
+ entreprise . imposition: "'IS'"
+ impôt . méthode de calcul: "'barème standard'"
diff --git a/mon-entreprise/test/regressions/simulations-professions-libérales.yaml b/mon-entreprise/test/regressions/simulations-professions-libérales.yaml
index 0f0fefbc3..99652beab 100644
--- a/mon-entreprise/test/regressions/simulations-professions-libérales.yaml
+++ b/mon-entreprise/test/regressions/simulations-professions-libérales.yaml
@@ -1,84 +1,84 @@
médecin:
- dirigeant . indépendant . PL . métier: "'santé . médecin'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- # Secteur 2 dépassement honoraire
dirigeant . indépendant . PL . métier: "'santé . médecin'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
dirigeant . indépendant . PL . métier . secteur médecin: "'S2'"
dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 20%
- # Secteur 2 avec dépassement honoraire et grosse rémunération
dirigeant . indépendant . PL . métier: "'santé . médecin'"
- dirigeant . rémunération totale: 300000 €/an
+ dirigeant . rémunération . totale: 300000 €/an
dirigeant . indépendant . PL . métier . secteur médecin: "'S2'"
dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 50%
- # Secteur 2 avec grosse rémunération et activité non conventionnée
dirigeant . indépendant . PL . métier: "'santé . médecin'"
- dirigeant . rémunération totale: 400000 €/an
+ dirigeant . rémunération . totale: 400000 €/an
dirigeant . indépendant . PL . métier . secteur médecin: "'S2'"
dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 50%
dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée: 40%
- # Non conventionné
dirigeant . indépendant . PL . métier: "'santé . médecin'"
- dirigeant . rémunération totale: 120000 €/an
+ dirigeant . rémunération . totale: 120000 €/an
dirigeant . indépendant . PL . métier . secteur médecin: "'non conventionné'"
- # < 2 ans exercice
entreprise . date de création: 01/01/2021
dirigeant . indépendant . PL . métier: "'santé . médecin'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
sage-femme:
- dirigeant . indépendant . PL . métier: "'santé . sage-femme'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- # Réduction retraite complémentaire
dirigeant . indépendant . PL . métier: "'santé . sage-femme'"
- dirigeant . rémunération totale: 20000 €/an
+ dirigeant . rémunération . totale: 20000 €/an
- # Exonération RID
dirigeant . indépendant . PL . métier: "'santé . sage-femme'"
- dirigeant . rémunération totale: 4000 €/an
+ dirigeant . rémunération . totale: 4000 €/an
- # Classe A
dirigeant . indépendant . PL . métier: "'santé . sage-femme'"
- dirigeant . rémunération totale: 20000 €/an
+ dirigeant . rémunération . totale: 20000 €/an
dirigeant . indépendant . PL . CARCDSF . sage-femme . RID . classe: "'A'"
- # Classe B
dirigeant . indépendant . PL . métier: "'santé . sage-femme'"
- dirigeant . rémunération totale: 20000 €/an
+ dirigeant . rémunération . totale: 20000 €/an
dirigeant . indépendant . PL . CARCDSF . sage-femme . RID . classe: "'B'"
- # Classe C
dirigeant . indépendant . PL . métier: "'santé . sage-femme'"
- dirigeant . rémunération totale: 20000 €/an
+ dirigeant . rémunération . totale: 20000 €/an
dirigeant . indépendant . PL . CARCDSF . sage-femme . RID . classe: "'C'"
auxiliaire médical:
- dirigeant . indépendant . PL . métier: "'santé . auxiliaire médical'"
- dirigeant . rémunération totale: 30000 €/an
+ dirigeant . rémunération . totale: 30000 €/an
- # Dépassement honoraire
dirigeant . indépendant . PL . métier: "'santé . auxiliaire médical'"
- dirigeant . rémunération totale: 30000 €/an
+ dirigeant . rémunération . totale: 30000 €/an
dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 20%
- # Grosse rémunération
dirigeant . indépendant . PL . métier: "'santé . auxiliaire médical'"
- dirigeant . rémunération totale: 300000 €/an
+ dirigeant . rémunération . totale: 300000 €/an
dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 100%
avocat:
- dirigeant . indépendant . PL . métier: "'avocat'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
- dirigeant . indépendant . PL . métier: "'avocat'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
entreprise . durée d'activité . en fin d'année: 6 ans
expert-comptable:
- dirigeant . indépendant . PL . métier: "'expert-comptable'"
- dirigeant . rémunération totale: 20000 €/an
+ dirigeant . rémunération . totale: 20000 €/an
- dirigeant . indépendant . PL . métier: "'expert-comptable'"
- dirigeant . rémunération totale: 50000 €/an
+ dirigeant . rémunération . totale: 50000 €/an
CIPAV:
- - dirigeant . indépendant . revenu net de cotisations: 500 €/an
- - dirigeant . indépendant . revenu net de cotisations: 1000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 1500 €/an
- - dirigeant . indépendant . revenu net de cotisations: 2000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 5000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 10000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 100000 €/an
- - dirigeant . indépendant . revenu net de cotisations: 1000000 €/an
+ - dirigeant . rémunération . nette: 500 €/an
+ - dirigeant . rémunération . nette: 1000 €/an
+ - dirigeant . rémunération . nette: 1500 €/an
+ - dirigeant . rémunération . nette: 2000 €/an
+ - dirigeant . rémunération . nette: 5000 €/an
+ - dirigeant . rémunération . nette: 10000 €/an
+ - dirigeant . rémunération . nette: 100000 €/an
+ - dirigeant . rémunération . nette: 1000000 €/an
diff --git a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml
index 6496410af..28ef82fbc 100644
--- a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml
+++ b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml
@@ -1,79 +1,85 @@
échelle de rémunération:
- - dirigeant . rémunération totale: 100 €/an
- - dirigeant . rémunération totale: 1000 €/an
- - dirigeant . rémunération totale: 2000 €/an
- - dirigeant . rémunération totale: 5000 €/an
- - dirigeant . rémunération totale: 10000 €/an
- - dirigeant . rémunération totale: 20000 €/an
- - dirigeant . rémunération totale: 50000 €/an
- - dirigeant . rémunération totale: 100000 €/an
+ - dirigeant . rémunération . totale: 100 €/an
+ - dirigeant . rémunération . totale: 1000 €/an
+ - dirigeant . rémunération . totale: 2000 €/an
+ - dirigeant . rémunération . totale: 5000 €/an
+ - dirigeant . rémunération . totale: 10000 €/an
+ - dirigeant . rémunération . totale: 20000 €/an
+ - dirigeant . rémunération . totale: 50000 €/an
+ - dirigeant . rémunération . totale: 100000 €/an
avec charges:
- - dirigeant . rémunération totale: 10000 €/an
+ - dirigeant . rémunération . totale: 10000 €/an
entreprise . charges: 2000 €/an
- - dirigeant . rémunération totale: 20000 €/an
+ - dirigeant . rémunération . totale: 20000 €/an
entreprise . charges: 15000 €/an
ACRE:
- - dirigeant . rémunération totale: 10000 €/an
+ - dirigeant . rémunération . totale: 10000 €/an
entreprise . date de création: 01/01/2021
entreprise . ACRE: oui
- - dirigeant . rémunération totale: 20000 €/an
+ - dirigeant . rémunération . totale: 20000 €/an
entreprise . date de création: 01/01/2021
entreprise . ACRE: oui
- - dirigeant . rémunération totale: 30000 €/an
+ - dirigeant . rémunération . totale: 30000 €/an
entreprise . date de création: 01/06/2020
entreprise . ACRE: oui
activités:
- - dirigeant . rémunération totale: 20000 €/an
+ - dirigeant . rémunération . totale: 20000 €/an
entreprise . activité: "'libérale'"
- - dirigeant . rémunération totale: 20000 €/an
+ - dirigeant . rémunération . totale: 20000 €/an
entreprise . activité: "'libérale'"
entreprise . activité . libérale réglementée: oui
- - dirigeant . rémunération totale: 20000 €/an
+ - dirigeant . rémunération . totale: 20000 €/an
entreprise . activité: "'artisanale'"
- - dirigeant . rémunération totale: 20000 €/an
- entreprise . activité: "'commerciale ou industrielle'"
+ - dirigeant . rémunération . totale: 20000 €/an
+ entreprise . activité: "'commerciale'"
entreprise . activité . service ou vente: "'vente'"
- - dirigeant . rémunération totale: 20000 €/an
- entreprise . activité: "'commerciale ou industrielle'"
+ - dirigeant . rémunération . totale: 20000 €/an
+ entreprise . activité: "'commerciale'"
entreprise . activité . service ou vente: "'service'"
Contrats Madelin:
# Cas retraite: la cotisation Madelin est inferieure au plafond => le revenu net de
# cotisations (résultat comptable) n'est pas affecté car l'assiette des
# cotisations ne change pas:
- - dirigeant . rémunération totale: 30000 €/an
+ - dirigeant . rémunération . totale: 30000 €/an
entreprise . charges: 10000 €/an
- dirigeant . indépendant . contrats madelin: oui
- dirigeant . indépendant . contrats madelin . mutuelle: 3800 €/an # plafond: 10% PSS donc environ 4100
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 3800 €/an # plafond: 10% PSS donc environ 4100
# Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de
# cotisations est affecté car l'assiette des cotisations est plus élevée
- - dirigeant . rémunération totale: 30000 €/an
+ - dirigeant . rémunération . totale: 30000 €/an
entreprise . charges: 10000 €/an
- dirigeant . indépendant . contrats madelin: oui
- dirigeant . indépendant . contrats madelin . mutuelle: 5000 €/an # plafond: 10% PSS donc environ 4100
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 5000 €/an # plafond: 10% PSS donc environ 4100
# Cas mutuelle
- - dirigeant . rémunération totale: 30000 €/an
+ - dirigeant . rémunération . totale: 30000 €/an
entreprise . charges: 10000 €/an
- dirigeant . indépendant . contrats madelin: oui
- dirigeant . indépendant . contrats madelin . mutuelle: 1000 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1000 €/an
# Cas global madelin faible
- - dirigeant . rémunération totale: 20000 €/an
+ - dirigeant . rémunération . totale: 20000 €/an
entreprise . charges: 1000 €/an
- dirigeant . indépendant . contrats madelin: oui
- dirigeant . indépendant . contrats madelin . mutuelle: 200 €/an
- dirigeant . indépendant . contrats madelin . retraite: 300 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 200 €/an
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 300 €/an
# Cas global madelin grand (plafonds calculés différemment)
- - dirigeant . rémunération totale: 300000 €/an
+ - dirigeant . rémunération . totale: 300000 €/an
entreprise . charges: 15000 €/an
- dirigeant . indépendant . contrats madelin: oui
- dirigeant . indépendant . contrats madelin . mutuelle: 1500 €/an
- dirigeant . indépendant . contrats madelin . retraite: 5000 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1500 €/an
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an
# Cas charges plus faibles que total madelin
- - dirigeant . rémunération totale: 20000 €/an
+ - dirigeant . rémunération . totale: 20000 €/an
entreprise . charges: 500 €/an
- dirigeant . indépendant . contrats madelin: oui
- dirigeant . indépendant . contrats madelin . mutuelle: 300 €/an
- dirigeant . indépendant . contrats madelin . retraite: 300 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 300 €/an
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 300 €/an
+ # PER
+ - dirigeant . rémunération . totale: 20000 €/an
+ dirigeant . indépendant . cotisations facultatives: oui
+ dirigeant . indépendant . cotisations facultatives . PER: 5500 €/an
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 500 €/an
+ dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 900 €/an
diff --git a/mon-entreprise/test/regressions/simulations-salarié.yaml b/mon-entreprise/test/regressions/simulations-salarié.yaml
index 5e638938e..d008a4214 100644
--- a/mon-entreprise/test/regressions/simulations-salarié.yaml
+++ b/mon-entreprise/test/regressions/simulations-salarié.yaml
@@ -113,18 +113,23 @@ aides:
- contrat salarié . rémunération . brut de base: 2000 €/mois
contrat salarié . aides employeur . emploi franc . éligible: oui
contrat salarié . ancienneté . date d'embauche: 01/11/2020
+ contrat salarié . jeune de moins de 26 ans: oui
+ # travailleur handicapé
+ - contrat salarié . rémunération . brut de base: 2000 €/mois
+ contrat salarié . ancienneté . date d'embauche: 01/03/2021
+ contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés . situation de handicap: oui
aides embauche covid:
- contrat salarié . ancienneté . date d'embauche: 01/08/2020
- contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans: oui
+ contrat salarié . jeune de moins de 26 ans: oui
contrat salarié . rémunération . brut de base: 1500 €/mois
- contrat salarié . ancienneté . date d'embauche: 01/08/2020
- contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans: oui
+ contrat salarié . jeune de moins de 26 ans: oui
contrat salarié . rémunération . brut de base: 5000 €/mois
- contrat salarié . ancienneté . date d'embauche: 01/08/2020
contrat salarié: "'CDD'"
contrat salarié . CDD . durée contrat: 3 mois
- contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans: oui
+ contrat salarié . jeune de moins de 26 ans: oui
contrat salarié . rémunération . brut de base: 1500 €/mois
- contrat salarié . ancienneté . date d'embauche: 01/08/2020
contrat salarié: "'apprentissage'"
@@ -307,10 +312,9 @@ frais pro - transports personnels seul:
- contrat salarié . rémunération . brut de base: 3200 €/mois
contrat salarié . frais professionnels . transports personnels . carburant faible émission . montant: 200€/an
contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . montant: 300€/an
- contrat salarié . déduction forfaitaire spécifique . application: oui
+ contrat salarié . déduction forfaitaire spécifique: oui
contrat salarié . déduction forfaitaire spécifique . taux: 20%
-
frais pro - abo transports + transports personnels:
- contrat salarié . rémunération . brut de base: 3200 €/mois
contrat salarié . frais professionnels . abonnement transports publics . montant: 80€/an
@@ -327,21 +331,27 @@ frais pro - abo transports + transports personnels:
frais pro - DFS:
- contrat salarié . rémunération . brut de base: 2000 €/mois
- contrat salarié . profession spécifique: "'journaliste'"
+ contrat salarié . déduction forfaitaire spécifique: oui
+ contrat salarié . déduction forfaitaire spécifique . profession: "'journaliste'"
- contrat salarié . rémunération . brut de base: 2000 €/mois
- contrat salarié . profession spécifique: "'ouvrier du bâtiment'"
+ contrat salarié . déduction forfaitaire spécifique: oui
+ contrat salarié . déduction forfaitaire spécifique . profession: "'ouvrier du bâtiment'"
- contrat salarié . rémunération . brut de base: 2000 €/mois
- contrat salarié . profession spécifique: "'artiste musicien'"
+ contrat salarié . déduction forfaitaire spécifique: oui
+ contrat salarié . déduction forfaitaire spécifique . profession: "'artiste musicien'"
- contrat salarié . rémunération . brut de base: 2000 €/mois
- contrat salarié . profession spécifique: "'pilote de ligne ou personnel navigant'"
+ contrat salarié . déduction forfaitaire spécifique: oui
+ contrat salarié . déduction forfaitaire spécifique . profession: "'pilote de ligne ou personnel navigant'"
- contrat salarié . rémunération . brut de base: 2000 €/mois
- contrat salarié . profession spécifique: "'journaliste'"
- contrat salarié . déduction forfaitaire spécifique . application: non
+ contrat salarié . déduction forfaitaire spécifique: non
+ contrat salarié . déduction forfaitaire spécifique . profession: "'journaliste'"
# Test des taux réduits journalistes et abattement fiscal
- contrat salarié . rémunération . brut de base: 1700 €/mois
- contrat salarié . profession spécifique: "'journaliste'"
+ contrat salarié . déduction forfaitaire spécifique: oui
+ contrat salarié . déduction forfaitaire spécifique . profession: "'journaliste'"
- contrat salarié . rémunération . brut de base: 2600 €/mois
- contrat salarié . profession spécifique: "'journaliste'"
+ contrat salarié . déduction forfaitaire spécifique: oui
+ contrat salarié . déduction forfaitaire spécifique . profession: "'journaliste'"
activité partielle:
- contrat salarié . rémunération . brut de base: 1560 €/mois
@@ -362,7 +372,8 @@ activité partielle:
contrat salarié . temps de travail . temps partiel . heures par semaine: 28 heures/semaine
- contrat salarié . rémunération . brut de base: 4000 €/mois
contrat salarié . activité partielle: oui
- contrat salarié . profession spécifique: "'journaliste'"
+ contrat salarié . déduction forfaitaire spécifique: oui
+ contrat salarié . déduction forfaitaire spécifique . profession: "'journaliste'"
- contrat salarié . rémunération . brut de base: 2000 €/mois
contrat salarié . activité partielle: oui
contrat salarié . activité partielle . convention syntec: oui
diff --git a/mon-entreprise/test/regressions/simulations.jest.js b/mon-entreprise/test/regressions/simulations.jest.ts
similarity index 67%
rename from mon-entreprise/test/regressions/simulations.jest.js
rename to mon-entreprise/test/regressions/simulations.jest.ts
index 4b1777478..69c5e6424 100644
--- a/mon-entreprise/test/regressions/simulations.jest.js
+++ b/mon-entreprise/test/regressions/simulations.jest.ts
@@ -6,9 +6,11 @@
// renamed the test configuration may be adapted but the persisted snapshot will remain unchanged).
/* eslint-disable no-undef */
-import Engine from 'publicodes'
-import rules from '../../../modele-social'
-import { engineOptions } from '../../source/components/utils/EngineContext'
+
+import { expect, it } from '@jest/globals'
+import rules, { DottedName } from '../../../modele-social'
+import { engineFactory } from '../../source/components/utils/EngineContext'
+import { Simulation } from '../../source/reducers/rootReducer'
import aideDéclarationConfig from '../../source/pages/Gérer/AideDéclarationIndépendant/config.yaml'
import artisteAuteurConfig from '../../source/pages/Simulateurs/configs/artiste-auteur.yaml'
import autoentrepreneurConfig from '../../source/pages/Simulateurs/configs/auto-entrepreneur.yaml'
@@ -24,11 +26,18 @@ import independentSituations from './simulations-indépendant.yaml'
import professionsLibéralesSituations from './simulations-professions-libérales.yaml'
import remunerationDirigeantSituations from './simulations-rémunération-dirigeant.yaml'
import employeeSituations from './simulations-salarié.yaml'
+import dividendesSituations from './simulations-dividendes.yaml'
+import dividendesConfig from '../../source/pages/Simulateurs/configs/dividendes.yaml'
-const roundResult = (arr) => arr.map((x) => Math.round(x))
-const engine = new Engine(rules, engineOptions)
-const runSimulations = (situations, targets, baseSituation = {}) =>
- Object.entries(situations).map(([name, situations]) =>
+type SituationsSpecs = Record
+const roundResult = (arr: number[]) => arr.map((x) => Math.round(x))
+const engine = engineFactory(rules)
+const runSimulations = (
+ situationsSpecs: SituationsSpecs,
+ objectifs: DottedName[],
+ baseSituation: Simulation['situation'] = {}
+) =>
+ Object.entries(situationsSpecs).map(([name, situations]) =>
situations.forEach((situation) => {
Object.keys(situation).forEach((situationRuleName) => {
// TODO: This check may be moved in the `engine.setSituation` method
@@ -39,7 +48,9 @@ const runSimulations = (situations, targets, baseSituation = {}) =>
}
})
engine.setSituation({ ...baseSituation, ...situation })
- const res = targets.map((target) => engine.evaluate(target).nodeValue)
+ const res = objectifs.map(
+ (objectif) => engine.evaluate(objectif).nodeValue
+ )
const evaluatedNotifications = Object.values(engine.getParsedRules())
.filter(
@@ -56,7 +67,8 @@ const runSimulations = (situations, targets, baseSituation = {}) =>
// line in the snapshot, which considerably reduce the number of lines of this snapshot
// and improve its readability.
expect(
- JSON.stringify(roundResult(res)) + snapshotedDisplayedNotifications
+ JSON.stringify(roundResult(res as number[])) +
+ snapshotedDisplayedNotifications
).toMatchSnapshot(name)
})
)
@@ -70,11 +82,18 @@ it('calculate simulations-salarié', () => {
})
it('calculate simulations-indépendant', () => {
- const targets = independantConfig.objectifs.reduce(
- (acc, cur) => [...acc, ...cur.objectifs],
- []
- )
- runSimulations(independentSituations, targets, independantConfig.situation)
+ const objectifs = [
+ 'dirigeant . rémunération . totale',
+ 'dirigeant . rémunération . cotisations',
+ 'dirigeant . rémunération . nette',
+ 'dirigeant . indépendant . revenu professionnel',
+ 'impôt . montant',
+ 'dirigeant . rémunération . nette après impôt',
+ 'entreprise . charges',
+ "entreprise . chiffre d'affaires",
+ 'dirigeant . indépendant . cotisations et contributions . début activité',
+ ] as DottedName[]
+ runSimulations(independentSituations, objectifs, independantConfig.situation)
})
it('calculate simulations-auto-entrepreneur', () => {
@@ -92,8 +111,7 @@ it('calculate simulations-rémunération-dirigeant (assimilé salarié)', () =>
{
...remunerationDirigeantConfig.situation,
dirigeant: "'assimilé salarié'",
- },
- 'assimilé salarié'
+ }
)
})
@@ -104,8 +122,7 @@ it('calculate simulations-rémunération-dirigeant (auto-entrepreneur)', () => {
{
...remunerationDirigeantConfig.situation,
dirigeant: "'auto-entrepreneur'",
- },
- 'auto-entrepreneur'
+ }
)
})
@@ -116,8 +133,7 @@ it('calculate simulations-rémunération-dirigeant (indépendant)', () => {
{
...remunerationDirigeantConfig.situation,
dirigeant: "'indépendant'",
- },
- 'indépendant'
+ }
)
})
@@ -135,7 +151,10 @@ it('calculate aide-déclaration-indépendant', () => {
aideDéclarationConfig.objectifs,
{
"aide déclaration revenu indépendant 2020 . nature de l'activité":
- "'commerciale ou industrielle'",
+ "'commerciale'",
+ 'aide déclaration revenu indépendant 2020 . comptabilité': "'engagement'",
+ "aide déclaration revenu indépendant 2020 . régime d'imposition . réel":
+ "'normal'",
...aideDéclarationConfig.situation,
}
)
@@ -153,8 +172,31 @@ it('calculate simulations-professions-libérales', () => {
})
it('calculate simulations-impot-société', () => {
- runSimulations(impotSocieteSituations, [
- 'entreprise . impôt sur les sociétés',
- 'entreprise . impôt sur les sociétés . contribution sociale',
- ])
+ runSimulations(
+ impotSocieteSituations,
+ [
+ 'entreprise . imposition . IS . impôt sur les sociétés',
+ 'entreprise . imposition . IS . impôt sur les sociétés . contribution sociale',
+ ],
+ {
+ 'entreprise . imposition': "'IS'",
+ 'entreprise . imposition . IS . impôt sur les sociétés . éligible taux réduit':
+ 'oui',
+ }
+ )
+})
+
+it('calculate simulations-dividendes', () => {
+ runSimulations(
+ dividendesSituations,
+ [
+ ...dividendesConfig.objectifs,
+ 'bénéficiaire . dividendes . cotisations et contributions',
+ 'impôt . montant',
+ 'impôt . revenu imposable',
+ 'bénéficiaire . dividendes . imposables',
+ "impôt . taux d'imposition",
+ ],
+ dividendesConfig.situation
+ )
})
diff --git a/mon-entreprise/test/regressions/yaml-transformer.js b/mon-entreprise/test/regressions/yaml-transformer.js
new file mode 100644
index 000000000..41a216b8f
--- /dev/null
+++ b/mon-entreprise/test/regressions/yaml-transformer.js
@@ -0,0 +1,20 @@
+// Inspired from yaml-jest https://github.com/danwang/yaml-jest
+var crypto = require('crypto')
+var yaml = require('js-yaml')
+const getCacheKey = (fileData, filePath, options) => {
+ return crypto
+ .createHash('md5')
+ .update(fileData)
+ .update(options.configString)
+ .digest('hex')
+}
+const process = (sourceText) => {
+ const result = yaml.safeLoad(sourceText)
+ const json = JSON.stringify(result, undefined, '\t')
+ return `module.exports = ${json}`
+}
+const transformer = {
+ getCacheKey,
+ process,
+}
+module.exports = transformer
diff --git a/mon-entreprise/test/unit-translations.test.js b/mon-entreprise/test/unit-translations.test.js
index 0b32fd0d5..c4da56cbf 100644
--- a/mon-entreprise/test/unit-translations.test.js
+++ b/mon-entreprise/test/unit-translations.test.js
@@ -4,7 +4,7 @@ import { uniq } from 'ramda'
import rawRules from 'modele-social'
import unitsTranslations from '../source/locales/units.yaml'
-it('use unit that exists in publicode', () => {
+it('use unit that exists in publicodes', () => {
const rules = parsePublicodes(rawRules)
const units = uniq(
Object.keys(rules).reduce(
diff --git a/mon-entreprise/test/useSearchParamsSimulationSharing.test.js b/mon-entreprise/test/useSearchParamsSimulationSharing.test.js
index 02ee5e9bf..d24d0a3e9 100644
--- a/mon-entreprise/test/useSearchParamsSimulationSharing.test.js
+++ b/mon-entreprise/test/useSearchParamsSimulationSharing.test.js
@@ -26,14 +26,13 @@ describe('identifiant court', () => {
})
describe('useSearchParamsSimulationSharing', () => {
- const someRules = parsePublicodes(`
+ const engine = new Engine(`
rule with:
identifiant court: panta
formule: 0
rule without:
formule: 0
`)
- const engine = new Engine(someRules)
const dottedNameParamName = getRulesParamNames(engine.getParsedRules())
describe('getSearchParamsFromSituation', () => {
@@ -92,7 +91,7 @@ rule without:
})
describe('useSearchParamsSimulationSharing hook', () => {
- const someRules = parsePublicodes(`
+ const parsedRules = parsePublicodes(`
rule with:
identifiant court: panta
formule: 0
@@ -100,9 +99,7 @@ rule without:
formule: 0
`)
- const dottedNameParamName = getRulesParamNames(
- new Engine(someRules).getParsedRules()
- )
+ const dottedNameParamName = getRulesParamNames(parsedRules)
let setSearchParams
beforeEach(() => {
diff --git a/mon-entreprise/tsconfig.json b/mon-entreprise/tsconfig.json
index 1c60dc007..f6a778758 100644
--- a/mon-entreprise/tsconfig.json
+++ b/mon-entreprise/tsconfig.json
@@ -1,7 +1,15 @@
{
- "extends": "../tsconfig.json",
"compilerOptions": {
"baseUrl": "source",
+ "moduleResolution": "node",
+ "module": "esnext",
+ "target": "esnext",
+ "esModuleInterop": true,
+ "jsx": "react-jsx",
+ "allowSyntheticDefaultImports": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "allowJs": true,
"paths": {
"Actions/*": ["actions/*"],
"Components": ["components"],
@@ -11,8 +19,9 @@
"Selectors/*": ["selectors/*"],
"Types/*": ["types/*"]
},
+ "typeRoots": ["./types/", "./node_modules/@types"],
"noEmit": true,
"strict": true
},
- "include": ["types", "source", "dev-server.js"]
+ "include": ["source", "test/**/*.ts", "dev-server.js"]
}
diff --git a/mon-entreprise/webpack.common.js b/mon-entreprise/webpack.common.js
index ed5f39bf4..648fb98d3 100644
--- a/mon-entreprise/webpack.common.js
+++ b/mon-entreprise/webpack.common.js
@@ -50,6 +50,11 @@ module.exports.commonLoaders = ({ legacy = false } = {}) => {
}
return [
+ {
+ test: /\.worker\.(js|ts|tsx)$/,
+ use: [babelLoader, 'worker-loader'],
+ exclude: /node_modules|dist/,
+ },
{
test: /\.(js|ts|tsx)$/,
use: babelLoader,
@@ -131,6 +136,11 @@ module.exports.default = {
FR_BASE_URL: 'http://localhost:8080/mon-entreprise',
AT_INTERNET_SITE_ID: '',
}),
+ new EnvironmentPlugin({
+ ALGOLIA_APP_ID: '',
+ ALGOLIA_SEARCH_KEY: '',
+ ALGOLIA_INDEX_PREFIX: '',
+ }),
new EnvironmentPlugin({
GITHUB_REF: '',
GITHUB_HEAD_REF: '',
diff --git a/mon-entreprise/webpack.dev.js b/mon-entreprise/webpack.dev.js
index c0c8b51bb..4eff37f45 100644
--- a/mon-entreprise/webpack.dev.js
+++ b/mon-entreprise/webpack.dev.js
@@ -11,9 +11,17 @@ const {
module.exports = {
...common,
+ node: {
+ // This seems necessary to prevent a "Module not found: 'fs'" error when
+ // launching mocha-webpack:
+ fs: 'empty',
+ },
module: {
rules: [...commonLoaders(), styleLoader('style-loader')],
},
+ watchOptions: {
+ aggregateTimeout: 600,
+ },
mode: 'development',
entry: map((entry) => ['webpack-hot-middleware/client', entry], common.entry),
plugins: [
diff --git a/mon-entreprise/webpack.prod.js b/mon-entreprise/webpack.prod.js
index 1cbea8d37..790762f0e 100644
--- a/mon-entreprise/webpack.prod.js
+++ b/mon-entreprise/webpack.prod.js
@@ -21,6 +21,7 @@ const prerenderConfig = () => ({
staticDir: path.resolve('dist'),
renderer: new Renderer({
renderAfterTime: 5000,
+ inject: true,
skipThirdPartyRequests: true,
}),
postProcess: (context) => {
diff --git a/netlify.toml b/netlify.toml
index 6df977b93..839f2fac6 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -1,3 +1,16 @@
+[[headers]]
+for = "/*"
+[headers.values]
+# TODO : report-only for now to see if there are any errors in Senty
+# https://github.com/betagouv/mon-entreprise/pull/1544#issuecomment-838511556
+Content-Security-Policy-Report-Only = "default-src 'self' mon-entreprise.fr; style-src 'self' 'unsafe-inline' mon-entreprise.zammad.com; connect-src 'self' *.sentry.io raw.githubusercontent.com *.xiti.com mon-entreprise.zammad.com entreprise.data.gouv.fr; form-action 'self' *.sibforms.com *.sentry.io mon-entreprise.zammad.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' entreprise.data.gouv.fr geo.api.gouv.fr *.xiti.com stonly.com code.jquery.com mon-entreprise.zammad.com; img-src 'self' data: *.xiti.com user-images.githubusercontent.com; frame-src 'self' https://www.youtube-nocookie.com https://codesandbox.io"
+
+## Twemoji proxy for client privacy #1219
+[[redirects]]
+ from = "/twemoji/*"
+ to = "https://twemoji.maxcdn.com/:splat"
+ status = 200
+
############
# Redirects following architectural changes
@@ -20,10 +33,16 @@
to=":SITE_FR/simulateurs/salaire-brut-net"
status = 301
-# FR | assimilé-salarié -> dirigeant-sasu
+# FR | assimilé-salarié -> sasu
[[redirects]]
from=":SITE_FR/simulateurs/assimil%C3%A9-salari%C3%A9"
- to=":SITE_FR/simulateurs/dirigeant-sasu"
+ to=":SITE_FR/simulateurs/sasu"
+ status = 301
+
+# FR | dirigeant-sasu -> sasu
+[[redirects]]
+ from=":SITE_FR/simulateurs/dirigeant-sasu"
+ to=":SITE_FR/simulateurs/sasu"
status = 301
# FR | s%C3%A9curit%C3%A9-sociale/auto-entrepreneur -> simulateurs/auto-entrepreneur
@@ -50,31 +69,27 @@
to = ":SITE_FR/documentation/contrat-salari%C3%A9/r%C3%A9mun%C3%A9ration/:splat"
status = 301
+# EN | sasu-chairman -> sasu
+[[redirects]]
+ from=":SITE_FR/simulateurs/sasu-chairman"
+ to=":SITE_FR/simulateurs/sasu"
+ status = 301
+
# Embauche redirection settings
[[redirects]]
- from = "https://embauche.beta.gouv.fr/"
+ from = "https://mon-entreprise.fr/simulation"
to = "https://mon-entreprise.fr/s%C3%A9curit%C3%A9-sociale/salari%C3%A9"
status = 301
+## Old iframe adress
[[redirects]]
- from = "https://embauche.beta.gouv.fr/simulation"
- to = "https://mon-entreprise.fr/s%C3%A9curit%C3%A9-sociale/salari%C3%A9"
- status = 301
-
-[[redirects]]
- from = "https://embauche.beta.gouv.fr/documentation/*"
- to = "https://mon-entreprise.fr/documentation/:splat"
- status = 301
-
-## Old iframe adresse
-[[redirects]]
- from = "https://embauche.beta.gouv.fr/modules/v2/dist/simulateur.js"
+ from = "https://mon-entreprise.fr/modules/v2/dist/simulateur.js"
to = "https://mon-entreprise.fr/simulateur-iframe-integration.js"
status = 301
[[redirects]]
- from = "https://embauche.beta.gouv.fr/dist/simulateur.js"
+ from = "https://mon-entreprise.fr/dist/simulateur.js"
to = "https://mon-entreprise.fr/simulateur-iframe-integration.js"
status = 301
diff --git a/package.json b/package.json
index 9191858d8..2ccc27d04 100644
--- a/package.json
+++ b/package.json
@@ -18,13 +18,13 @@
"@babel/preset-env": "^7.9.5",
"@babel/preset-react": "^7.9.4",
"@babel/preset-typescript": "^7.9.0",
+ "@jest/globals": "^27.0.6",
"@types/cheerio": "^0.22.18",
"@types/classnames": "^2.2.9",
"@types/color-convert": "^1.9.0",
"@types/iframe-resizer": "^3.5.7",
"@types/js-yaml": "^3.12.2",
"@types/mini-css-extract-plugin": "^0.9.1",
- "@types/mocha": "^8.2.0",
"@types/nearley": "^2.11.1",
"@types/ramda": "^0.26.43",
"@types/raven-for-redux": "^1.1.1",
@@ -47,12 +47,13 @@
"@typescript-eslint/parser": "^4.8.1",
"autoprefixer": "^9.7.6",
"babel-eslint": "^11.0.0-beta.0",
- "babel-jest": "^24.9.0",
+ "babel-jest": "^27.0.6",
"babel-loader": "^8.0.2",
"babel-plugin-ramda": "^2.0.0",
"babel-plugin-styled-components": "^1.10.7",
"babel-plugin-webpack-alias": "^2.1.2",
"chai": "^4.1.2",
+ "concurrently": "^6.0.2",
"connect-history-api-fallback": "^1.5.0",
"css-loader": "^0.28.11",
"csv-loader": "^2.1.1",
@@ -73,7 +74,7 @@
"intl-locales-supported": "^1.0.0",
"isomorphic-fetch": "^2.2.1",
"isomorphic-style-loader": "^5.1.0",
- "jest": "^24.9.0",
+ "jest": "^27.0.6",
"jest-transform-nearley": "^1.0.0",
"jsdom": "^12.0.0",
"json-loader": "^0.5.7",
@@ -83,45 +84,44 @@
"mock-local-storage": "^1.0.5",
"nearley-loader": "^2.0.0",
"postcss-loader": "^2.1.2",
- "prettier": "^2.2.1",
+ "prettier": "^2.3.2",
"raw-loader": "^0.5.1",
"react-hot-loader": "^4.12.15",
"rimraf": "^3.0.2",
"serve": "^11.1.0",
"sinon": "^9.2.2",
"sinon-chai": "^3.0.0",
+ "stmux": "^1.8.1",
"style-loader": "^0.23.1",
"terser-webpack-plugin": "^3.0.2",
"toml-loader": "^1.0.0",
- "typescript": "^4.1.0",
+ "typescript": "^4.3.2",
"url-loader": "^4.1.0",
"webpack": "^4.42.0",
"webpack-bundle-analyzer": "^3.7.0",
"webpack-cli": "^3.1.2",
"webpack-dev-middleware": "^3.4.0",
"webpack-hot-middleware": "^2.24.2",
- "yaml-jest": "^1.0.5",
"yaml-loader": "^0.5.0"
},
"optionalDependencies": {
"bundlesize": "^0.18.0",
- "cypress": "^6.8.0",
"prerender-spa-plugin": "^3.4.0"
},
"scripts": {
"lint:eslintrc": "eslint --print-config .eslintrc.js | eslint-config-prettier-check",
"lint:eslint": "export NODE_OPTIONS='--max-old-space-size=4096'; eslint . --ext .js,.jsx,.ts,.tsx",
"lint:eslint:fix": "yarn lint:eslint --fix",
- "lint:prettier": "yarn run prettier --check \"**/*.{js,jsx,ts,tsx}\"",
+ "lint:prettier": "yarn run prettier --check \"**/*.{js,jsx,ts,tsx,yaml,yml}\"",
"lint:prettier:fix": "yarn lint:prettier --write",
"lint:fix": "yarn lint:eslint:fix && yarn lint:prettier:fix",
"prepare": "if [ -z \"$NETLIFY\" ]; then yarn workspaces run prepare; fi",
"lint": "yarn lint:eslintrc && yarn lint:eslint && yarn lint:prettier",
"test": "yarn workspaces run test",
"test:type": "yarn workspaces run tsc",
- "test:regressions": "yarn workspace modele-social build && jest",
+ "test:regressions": "yarn workspace modele-social build && jest --silent",
"clean": "yarn workspaces run clean && rimraf node_modules",
- "start": "yarn workspace publicodes build --watch & yarn workspace publicodes-react build --watch & yarn workspace mon-entreprise start",
+ "start": "stmux -e ERROR -t mon-entreprise-build -M -- [ [ 'yarn workspace publicodes build:watch' : 'yarn workspace publicodes-react build --watch' ] .. 'yarn workspace mon-entreprise start' ] ",
"moso:up": "yarn workspace modele-social run up && yarn workspace mon-entreprise upgrade modele-social",
"publicodes:up": "yarn workspace publicodes-react upgrade publicodes && yarn workspace mon-entreprise upgrade publicodes publicodes-react"
},
diff --git a/publicodes/.editorconfig b/publicodes/.editorconfig
new file mode 100644
index 000000000..610ff3dc5
--- /dev/null
+++ b/publicodes/.editorconfig
@@ -0,0 +1,25 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+trim_trailing_whitespace = true
+# We shall not define indent_size ⬇️ when using tabs.
+# tab_width doesn't make much sense as it can be left to the reader to decide.
+indent_style = tab
+insert_final_newline = true
+max_line_length = 80
+
+[**.{js,jsx,ts,tsx}]
+indent_size = 2
+
+[**.{yml,yaml}]
+# Spaces are mandatory for yaml files:
+indent_style = space
+indent_size = 2
+
+[*.md]
+indent_style = space
+indent_size = 4
+trim_trailing_whitespace = false
+
diff --git a/publicodes/.github/workflows/test-publish.yaml b/publicodes/.github/workflows/test-publish.yaml
new file mode 100644
index 000000000..b2d939e86
--- /dev/null
+++ b/publicodes/.github/workflows/test-publish.yaml
@@ -0,0 +1,76 @@
+name: Test and Publish
+on: [push]
+
+jobs:
+ lint:
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
+ with:
+ path: '**/node_modules'
+ key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
+ - run: yarn install --frozen-lockfile
+ - run: yarn lint:prettier
+
+ test:
+ name: Unit tests
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v1
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 14
+ - run: yarn install
+ - run: yarn test
+
+ test-type:
+ name: Type checking
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v1
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 14
+ - run: yarn install
+ - run: yarn test:type
+
+ test-example-app:
+ name: Test example app
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
+ with:
+ path: '**/node_modules'
+ key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
+ - run: yarn install --frozen-lockfile
+ - working-directory: ./example/publicodes-react
+ run: |
+ yarn install
+ yarn test
+
+ # This job could be in a separate workflow triggered when all the tests passes
+ # using the `workflow_run` event, but it makes it difficult to retrieve the
+ # commit message.
+ publish:
+ if: contains(join(github.event.commits.*.message, ' | '), '📦 Publicodes v1.0.0-beta.')
+ needs: [test, test-type, test-example-app]
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
+ with:
+ path: '**/node_modules'
+ key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
+ - run: yarn install --frozen-lockfile
+ - uses: JS-DevTools/npm-publish@v1
+ with:
+ token: ${{ secrets.NPM_PUBLISH_SECRET }}
+ dry-run: ${{ github.ref != 'refs/heads/master' }}
+ package: ./core/package.json
+ - uses: JS-DevTools/npm-publish@v1
+ with:
+ token: ${{ secrets.NPM_PUBLISH_SECRET }}
+ dry-run: ${{ github.ref != 'refs/heads/master' }}
+ package: ./ui-react/package.json
diff --git a/publicodes/.gitignore b/publicodes/.gitignore
new file mode 100644
index 000000000..3b7c92072
--- /dev/null
+++ b/publicodes/.gitignore
@@ -0,0 +1,12 @@
+.tags*
+.tmp
+/tmp
+.DS_Store
+yarn-error.log
+package-lock.json
+node_modules/
+.env
+dist/
+
+# Local Netlify folder
+.netlify
diff --git a/publicodes/.prettierrc.yaml b/publicodes/.prettierrc.yaml
new file mode 100644
index 000000000..857612a22
--- /dev/null
+++ b/publicodes/.prettierrc.yaml
@@ -0,0 +1,3 @@
+bracketSpacing: true
+semi: false
+singleQuote: true
diff --git a/publicodes/CHANGELOG.md b/publicodes/CHANGELOG.md
new file mode 100644
index 000000000..91dbb2890
--- /dev/null
+++ b/publicodes/CHANGELOG.md
@@ -0,0 +1,36 @@
+# Changelog
+
+## 1.0.0-beta.13
+
+**core**
+
+- Ajout d'un nouveau mécanisme : `résoudre la référence circulaire` (#1472)
+- Simplification de l'API de Engine (#1431)
+
+**publicodes-react**
+
+- Améliore l'affichage des règles virtuelles dépliée dans une somme
+- Ajoute les meta dans les pages de règles (#1411)
+
+## 1.0.0-beta.14
+
+**publicodes-react**
+
+- Corrige un bug bloquant qui empêchait l'utilisation de la bibliothèque
+- Enlève la dépendance à i18n et react-i18n et toute la traduction qui n'était pas utilisée de toute façon
+- Ajoute des tests et une publication automatique des paquets publicodes
+
+## 1.0.0-beta.15
+
+**core**
+
+- Fix bug sur le mécanisme minimum, une valeur non applicable n'est plus considérée comme valant "0" (#1493)
+
+## 1.0.0-beta.16
+
+**core**
+
+- Répare un bug dans le mécanisme résoudre le cycle
+- Suppression des variables temporelles
+- Optimisation de la désactivation de branches
+- Meilleures performances
diff --git a/publicodes/CONTRIBUTING.md b/publicodes/CONTRIBUTING.md
new file mode 100644
index 000000000..d76dbf946
--- /dev/null
+++ b/publicodes/CONTRIBUTING.md
@@ -0,0 +1,22 @@
+# Comment contribuer ?
+
+Merci de prendre le temps de contribuer ! 🎉
+
+Voici quelques informations pour démarrer :
+
+## Rapport de bug, nouvelles fonctionnalités
+
+Nous utilisons GitHub pour suivre tous les bugs et discussions sur les nouvelles fonctionnalités. Pour rapporter un bug ou proposer une évolution vous pouvez [ouvrir une nouvelle discussion](https://github.com/betagouv/publicodes/discussions). N'hésitez pas à utiliser la recherche pour vérifier si le sujet n'est pas déjà traité dans une discussion ouverte.
+
+## Publier une nouvelle version sur NPM
+
+Voici la marche à suivre pour publier une nouvelle version :
+
+1. Renseigner les modifications dans `CHANGELOG.md`
+2. Remplacer les références à la précédente version par la nouvelle version dans les packages.json
+3. Ajouter tous les changements dans un commit avec le message suivant :
+ ```
+ 📦 Publicodes v1.0.0-beta.
+ ```
+ > **Important** Le message doit être exactement celui-ci (emoji compris), car le script de déploiement automatique sur le CI se base sur ce dernier.
+4. Laisser faire le CI, une fois le commit mergé sur master, le paquet sera déployé effectivement
diff --git a/publicodes/LICENSE b/publicodes/LICENSE
new file mode 100644
index 000000000..5f0d0a2c3
--- /dev/null
+++ b/publicodes/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018-2021 beta.gouv.fr
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/publicodes/README.md b/publicodes/README.md
index 8c84c8d4f..22e8da984 100644
--- a/publicodes/README.md
+++ b/publicodes/README.md
@@ -1,8 +1,15 @@
-Publicode est un langage déclaratif pour encoder les algorithmes d'intérêt
+> 🇬🇧 Most of the documentation (including issues and commit messages) is written in French, please raise an [issue](https://github.com/betagouv/publicodes/issues/new) if you are interested and do not speak French. We intend to translate the language and the documentation in the coming weeks.
+
+##
+
+[![Npm version](https://img.shields.io/npm/v/publicodes)](https://www.npmjs.com/package/publicodes)
+[![Gitter chat](https://badges.gitter.im/publicodes/publicodes.png)](https://gitter.im/publicodes/community)
+
+Publicodes est un langage déclaratif pour encoder les algorithmes d'intérêt
public. Il permet de réaliser des calculs généraux tout en fournissant une
explication permettant de comprendre et de documenter ces calculs.
-Publicode est adapté pour modéliser des domaines métiers complexes pouvant être
+Publicodes est adapté pour modéliser des domaines métiers complexes pouvant être
décomposés en règles élémentaires simples (comme la [législation socio-fiscale](https://github.com/betagouv/mon-entreprise/tree/master/publicodes),
[un bilan carbone](https://github.com/laem/futureco-data/blob/master/co2.yaml),
un estimateur de rendement locatif, etc.).
@@ -32,7 +39,3 @@ npm install publicodes
- **[futur.eco](https://futur.eco/)** utilise publicodes pour calculer les bilans
carbone d'un grand nombre d'activités, plats, transports ou biens.
- **[Nos Gestes Climat](https://ecolab.ademe.fr/apps/climat)** utilise publicodes pour proposer un calculateur d'empreinte climat personnel de référence complètement ouvert
-
-## Feuille de route
-
-Pour plus de détails sur les prochaines fonctionalités et notre future direction vous pouvez consulter nos [feuilles de route](https://github.com/betagouv/mon-entreprise/issues?q=is%3Aopen+label%3A%22%F0%9F%8E%AF+feuille+de+route%22+label%3A%22%E2%9A%99%EF%B8%8F+publicodes%22+).
diff --git a/publicodes/core/.gitignore b/publicodes/core/.gitignore
new file mode 100644
index 000000000..aa1ec1ea0
--- /dev/null
+++ b/publicodes/core/.gitignore
@@ -0,0 +1 @@
+*.tgz
diff --git a/publicodes/core/babel.config.json b/publicodes/core/babel.config.json
new file mode 100644
index 000000000..4f9bcc1da
--- /dev/null
+++ b/publicodes/core/babel.config.json
@@ -0,0 +1,20 @@
+{
+ "presets": [
+ [
+ "@babel/preset-env",
+ {
+ "targets": {
+ "node": "current"
+ }
+ }
+ ],
+ "@babel/preset-typescript"
+ ],
+ "plugins": [
+ "@babel/plugin-proposal-class-properties",
+ "@babel/plugin-proposal-optional-chaining",
+ "@babel/plugin-proposal-nullish-coalescing-operator",
+ "@babel/plugin-proposal-object-rest-spread",
+ "@babel/plugin-syntax-dynamic-import"
+ ]
+}
diff --git a/publicodes/core/package.json b/publicodes/core/package.json
index 4a93baa61..6ff92f1be 100644
--- a/publicodes/core/package.json
+++ b/publicodes/core/package.json
@@ -1,6 +1,6 @@
{
"name": "publicodes",
- "version": "1.0.0-beta.12",
+ "version": "1.0.0-beta.16",
"description": "A declarative language for encoding public algorithm",
"main": "dist/index.js",
"types": "dist/types/index.d.ts",
@@ -25,15 +25,27 @@
],
"private": false,
"devDependencies": {
+ "@babel/preset-typescript": "^7.14.5",
+ "babel-loader": "^8.2.2",
"chai": "^4.2.0",
- "intl": "^1.2.5",
- "typescript": "3.4.3",
"dedent-js": "1.0.1",
- "@dagrejs/graphlib": "^2.1.4"
+ "intl": "^1.2.5",
+ "json-loader": "^0.5.7",
+ "mocha": "^9.0.1",
+ "mochapack": "^2.1.2",
+ "nearley-loader": "^2.0.0",
+ "rimraf": "^3.0.2",
+ "typescript": "^4.3.2",
+ "webpack-cli": "^4.7.2",
+ "yaml-loader": "^0.6.0"
},
"dependencies": {
+ "@babel/core": "^7.14.6",
+ "@babel/preset-env": "^7.14.5",
+ "@types/webpack-env": "^1.16.0",
"moo": "^0.5.1",
"nearley": "^2.19.2",
+ "webpack": "^5.39.1",
"yaml": "^1.9.2"
},
"scripts": {
@@ -41,7 +53,8 @@
"clean": "rimraf dist node_modules",
"prepare": "yarn run rimraf dist && yarn run build",
"build": "yarn run webpack --config webpack.config.js && yarn run tsc",
- "test:file": "yarn mocha-webpack --include test/setupIntl.js --webpack-config ./webpack.test.js ",
+ "build:watch": "concurrently \"yarn run webpack --watch --config webpack.config.js\" \"yarn run tsc -w\"",
+ "test:file": "yarn mochapack --include test/setupIntl.js --webpack-config ./webpack.test.js ",
"test": "yarn test:file \"./{,!(node_modules)/**/}!(webpack).test.js\""
},
"engines": {
diff --git a/publicodes/core/source/AST/findCycles.ts b/publicodes/core/source/AST/findCycles.ts
new file mode 100644
index 000000000..009f05bbd
--- /dev/null
+++ b/publicodes/core/source/AST/findCycles.ts
@@ -0,0 +1,330 @@
+/* eslint-disable prefer-rest-params */
+/* eslint-disable @typescript-eslint/no-this-alias */
+// Adapted from https://github.com/dagrejs/graphlib (MIT license)
+// and https://github.com/lodash/lodash (MIT license)
+
+// TODO: type this
+
+function has(obj, key) {
+ return obj != null && Object.prototype.hasOwnProperty.call(obj, key)
+}
+function constant(value) {
+ return function (...args) {
+ return value
+ }
+}
+
+const DEFAULT_EDGE_NAME = '\x00'
+const EDGE_KEY_DELIM = '\x01'
+
+const incrementOrInitEntry = (map, k) => {
+ if (map[k]) {
+ map[k]++
+ } else {
+ map[k] = 1
+ }
+}
+
+const decrementOrRemoveEntry = (map, k) => {
+ if (!--map[k]) {
+ delete map[k]
+ }
+}
+
+const edgeArgsToId = (isDirected, v_, w_, name) => {
+ let v = '' + v_
+ let w = '' + w_
+ if (!isDirected && v > w) {
+ const tmp = v
+ v = w
+ w = tmp
+ }
+ return (
+ v +
+ EDGE_KEY_DELIM +
+ w +
+ EDGE_KEY_DELIM +
+ (name === undefined ? DEFAULT_EDGE_NAME : name)
+ )
+}
+
+const edgeArgsToObj = (isDirected, v_, w_, name) => {
+ let v = '' + v_
+ let w = '' + w_
+ if (!isDirected && v > w) {
+ const tmp = v
+ v = w
+ w = tmp
+ }
+ const edgeObj: any = { v: v, w: w }
+ if (name) {
+ edgeObj.name = name
+ }
+ return edgeObj
+}
+
+const edgeObjToId = (isDirected, edgeObj) => {
+ return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name)
+}
+export class Graph {
+ private _nodeCount = 0
+ private _edgeCount = 0
+
+ private _isDirected: any
+
+ private _label: undefined
+ private _defaultNodeLabelFn: (...args: any[]) => any
+ private _defaultEdgeLabelFn: (...args: any[]) => any
+ private _nodes: Record
+ private _in: Record
+ private _preds: Record>
+ private _out: Record>
+ private _sucs: Record>
+ private _edgeObjs: Record
+ private _edgeLabels: Record
+
+ constructor(opts: Record = {}) {
+ this._isDirected = has(opts, 'directed') ? opts.directed : true
+
+ // Label for the graph itself
+ this._label = undefined
+
+ // Defaults to be set when creating a new node
+ this._defaultNodeLabelFn = constant(undefined)
+
+ // Defaults to be set when creating a new edge
+ this._defaultEdgeLabelFn = constant(undefined)
+
+ // v -> label
+ this._nodes = {}
+
+ // v -> edgeObj
+ this._in = {}
+
+ // u -> v -> Number
+ this._preds = {}
+
+ // v -> edgeObj
+ this._out = {} as Record>
+
+ // v -> w -> Number
+ this._sucs = {}
+
+ // e -> edgeObj
+ this._edgeObjs = {}
+
+ // e -> label
+ this._edgeLabels = {}
+ }
+
+ /* === Graph functions ========= */
+
+ isDirected() {
+ return this._isDirected
+ }
+ setGraph(label) {
+ this._label = label
+ return this
+ }
+ graph() {
+ return this._label
+ }
+
+ /* === Node functions ========== */
+
+ nodeCount() {
+ return this._nodeCount
+ }
+ nodes() {
+ return Object.keys(this._nodes)
+ }
+ setNode(v, value: any = undefined) {
+ if (has(this._nodes, v)) {
+ if (arguments.length > 1) {
+ this._nodes[v] = value
+ }
+ return this
+ }
+
+ this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v)
+ this._in[v] = {}
+ this._preds[v] = {}
+ this._out[v] = {}
+ this._sucs[v] = {}
+ ++this._nodeCount
+ return this
+ }
+ setNodes(vs, value) {
+ vs.forEach((v) => {
+ if (value !== undefined) {
+ this.setNode(v, value)
+ } else {
+ this.setNode(v)
+ }
+ })
+ return this
+ }
+ node(v) {
+ return this._nodes[v]
+ }
+ hasNode(v) {
+ return has(this._nodes, v)
+ }
+ successors(v) {
+ const sucsV = this._sucs[v]
+ if (sucsV) {
+ return Object.keys(sucsV)
+ }
+ }
+
+ /* === Edge functions ========== */
+
+ edgeCount() {
+ return this._edgeCount
+ }
+ edges() {
+ return Object.values(this._edgeObjs)
+ }
+ setEdge(
+ v: string,
+ w: string,
+ value: any = undefined,
+ name: string | undefined = undefined
+ ) {
+ v = '' + v
+ w = '' + w
+
+ const e = edgeArgsToId(this._isDirected, v, w, name)
+ if (has(this._edgeLabels, e)) {
+ if (value !== undefined) {
+ this._edgeLabels[e] = value
+ }
+ return this
+ }
+
+ // It didn't exist, so we need to create it.
+ // First ensure the nodes exist.
+ this.setNode(v)
+ this.setNode(w)
+
+ this._edgeLabels[e] =
+ value !== undefined ? value : this._defaultEdgeLabelFn(v, w, name)
+
+ const edgeObj = edgeArgsToObj(this._isDirected, v, w, name)
+ // Ensure we add undirected edges in a consistent way.
+ v = edgeObj.v
+ w = edgeObj.w
+
+ Object.freeze(edgeObj)
+ this._edgeObjs[e] = edgeObj
+ incrementOrInitEntry(this._preds[w], v)
+ incrementOrInitEntry(this._sucs[v], w)
+ this._in[w][e] = edgeObj
+ this._out[v][e] = edgeObj
+ this._edgeCount++
+ return this
+ }
+
+ edge(v, w, name) {
+ const e =
+ arguments.length === 1
+ ? edgeObjToId(this._isDirected, arguments[0])
+ : edgeArgsToId(this._isDirected, v, w, name)
+ return this._edgeLabels[e]
+ }
+
+ hasEdge(v, w, name) {
+ const e =
+ arguments.length === 1
+ ? edgeObjToId(this._isDirected, arguments[0])
+ : edgeArgsToId(this._isDirected, v, w, name)
+ return has(this._edgeLabels, e)
+ }
+
+ removeEdge(v, w, name) {
+ const e =
+ arguments.length === 1
+ ? edgeObjToId(this._isDirected, arguments[0])
+ : edgeArgsToId(this._isDirected, v, w, name)
+ const edge = this._edgeObjs[e]
+ if (edge) {
+ v = edge.v
+ w = edge.w
+ delete this._edgeLabels[e]
+ delete this._edgeObjs[e]
+ decrementOrRemoveEntry(this._preds[w], v)
+ decrementOrRemoveEntry(this._sucs[v], w)
+ delete this._in[w][e]
+ delete this._out[v][e]
+ this._edgeCount--
+ }
+ return this
+ }
+
+ outEdges(v: string, w: string | undefined = undefined) {
+ const outV = this._out[v]
+ if (outV) {
+ const edges: any = Object.values(outV)
+ if (w === undefined) {
+ return edges
+ }
+ return edges.filter(function (edge) {
+ return edge.w === w
+ })
+ }
+ }
+}
+
+/** Cycles stuff **/
+
+function tarjan(graph) {
+ let index = 0
+ const stack: any[] = []
+ const visited = {} // node id -> { onStack, lowlink, index }
+ const results: any[] = []
+
+ function dfs(v) {
+ const entry = (visited[v] = {
+ onStack: true,
+ lowlink: index,
+ index: index++,
+ })
+ stack.push(v)
+
+ graph.successors(v).forEach(function (w) {
+ if (!Object.prototype.hasOwnProperty.call(visited, w)) {
+ dfs(w)
+ entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink)
+ } else if (visited[w].onStack) {
+ entry.lowlink = Math.min(entry.lowlink, visited[w].index)
+ }
+ })
+
+ if (entry.lowlink === entry.index) {
+ const cmpt: any[] = []
+ let w
+ do {
+ w = stack.pop()
+ visited[w].onStack = false
+ cmpt.push(w)
+ } while (v !== w)
+ results.push(cmpt)
+ }
+ }
+
+ graph.nodes().forEach(function (v) {
+ if (!Object.prototype.hasOwnProperty.call(visited, v)) {
+ dfs(v)
+ }
+ })
+
+ return results
+}
+
+export function findCycles(graph): string[][] {
+ return tarjan(graph).filter(function (cmpt) {
+ return (
+ cmpt.length > 1 || (cmpt.length === 1 && graph.hasEdge(cmpt[0], cmpt[0]))
+ )
+ })
+}
diff --git a/publicodes/core/source/AST/graph.ts b/publicodes/core/source/AST/graph.ts
index 3d072fa66..97a078afc 100644
--- a/publicodes/core/source/AST/graph.ts
+++ b/publicodes/core/source/AST/graph.ts
@@ -1,10 +1,11 @@
-import graphlib from '@dagrejs/graphlib'
+import { ASTNode } from './types'
import parsePublicodes from '../parsePublicodes'
import { RuleNode } from '../rule'
-import { reduceAST } from './index'
-type RulesDependencies = Array<[string, Array]>
-type GraphCycles = Array>
-type GraphCyclesWithDependencies = Array
+import { getChildrenNodes, iterAST } from './index'
+import { findCycles, Graph } from './findCycles'
+
+type RulesDependencies = [string, string[]][]
+type GraphCycles = string[][]
function buildRulesDependencies(
parsedRules: Record
@@ -12,40 +13,56 @@ function buildRulesDependencies(
const uniq = (arr: Array): Array => [...new Set(arr)]
return Object.entries(parsedRules).map(([name, node]) => [
name,
- uniq(buildRuleDependancies(node)),
+ uniq(getDependencies(node)),
])
}
-function buildRuleDependancies(rule: RuleNode): Array {
- return reduceAST(
- (acc, node, fn) => {
- switch (node.nodeKind) {
- case 'replacementRule':
- case 'inversion':
- case 'une possibilité':
- return acc
- case 'recalcul':
- return node.explanation.amendedSituation.flatMap((s) => fn(s[1]))
- case 'reference':
- return [...acc, node.dottedName as string]
- case 'rule':
- // Cycle from parent dependancies are ignored at runtime,
- // so we don' detect them statically
- return fn(rule.explanation.valeur)
- case 'variations':
- // a LOT of cycles with replacements... we disactivate them until we see clearer,
- if (node.rawNode && typeof node.rawNode === 'string') {
- return [...acc, node.rawNode]
- }
- }
- },
- [],
- rule
- )
+function getReferenceName(node: ASTNode): string | undefined {
+ switch (node.nodeKind) {
+ case 'reference':
+ return node.dottedName as string
+ }
+}
+/**
+ * Recursively selects the children nodes that have the ability to include a reference
+ * to a rule.
+ */
+function getReferencingDescendants(node: ASTNode): ASTNode[] {
+ return iterAST((node) => {
+ switch (node.nodeKind) {
+ case 'replacementRule':
+ case 'inversion':
+ case 'une possibilité':
+ case 'reference':
+ case 'résoudre référence circulaire':
+ // "résoudre référence circulaire" is a chained mechanism. When returning `[]` we prevent
+ // iteration inside of the rule's `valeur`, meaning the rule returns no descendants at all.
+ return []
+ case 'recalcul':
+ return node.explanation.amendedSituation.map(([, astNode]) => astNode)
+ case 'rule':
+ return [node.explanation.valeur]
+ case 'variations':
+ if (node.visualisationKind === 'replacement') {
+ return node.explanation
+ .filter(({ condition }) => condition.isDefault)
+ .map(({ consequence }) => consequence)
+ .filter((consequence) => consequence.nodeKind === 'reference')
+ }
+ }
+ return getChildrenNodes(node)
+ }, node)
+}
+function getDependencies(node: ASTNode): string[] {
+ const descendantNodes = Array.from(getReferencingDescendants(node))
+ const descendantsReferences = descendantNodes
+ .map(getReferenceName)
+ .filter((refName): refName is string => refName !== undefined)
+ return descendantsReferences
}
-function buildDependenciesGraph(rulesDeps: RulesDependencies): graphlib.Graph {
- const g = new (graphlib as any).Graph()
+function buildDependenciesGraph(rulesDeps: RulesDependencies) {
+ const g = new Graph()
rulesDeps.forEach(([ruleDottedName, dependencies]) => {
dependencies.forEach((depDottedName) => {
g.setEdge(ruleDottedName, depDottedName)
@@ -60,40 +77,106 @@ export function cyclesInDependenciesGraph(rawRules: RawRules): GraphCycles {
const parsedRules = parsePublicodes(rawRules)
const rulesDependencies = buildRulesDependencies(parsedRules)
const dependenciesGraph = buildDependenciesGraph(rulesDependencies)
- const cycles = (graphlib as any).alg.findCycles(dependenciesGraph)
+ const cycles = findCycles(dependenciesGraph)
return cycles.map((c) => c.reverse())
}
+/**
+ * Make the cycle as small as possible.
+ */
+export function squashCycle(
+ rulesDependenciesObject: Record,
+ cycle: string[]
+): string[] {
+ function* loopFrom(i: number) {
+ let j = i
+ while (true) {
+ yield cycle[j++ % cycle.length]
+ }
+ }
+ const smallCycleStartingAt: string[][] = []
+ for (let i = 0; i < cycle.length; i++) {
+ const smallCycle: string[] = []
+ let previousVertex: string | undefined = undefined
+ for (const vertex of loopFrom(i)) {
+ if (previousVertex === undefined) {
+ smallCycle.push(vertex)
+ previousVertex = vertex
+ } else if (rulesDependenciesObject[previousVertex].includes(vertex)) {
+ if (smallCycle.includes(vertex)) {
+ smallCycle.splice(0, smallCycle.lastIndexOf(vertex))
+ break
+ }
+ smallCycle.push(vertex)
+ previousVertex = vertex
+ }
+ }
+ smallCycleStartingAt.push(smallCycle)
+ }
+
+ const smallest = smallCycleStartingAt.reduce((minCycle, someCycle) =>
+ someCycle.length > minCycle.length ? minCycle : someCycle
+ )
+ return smallest
+}
+
/**
* This function is useful so as to print the dependencies at each node of the
* cycle.
- * ⚠️ Indeed, the graphlib.findCycles function returns the cycle found using the
+ * ⚠️ Indeed, the findCycles function returns the cycle found using the
* Tarjan method, which is **not necessarily the smallest cycle**. However, the
- * smallest cycle would be the most legibe one…
+ * smallest cycle is more readable.
*/
export function cyclicDependencies(
rawRules: RawRules
-): GraphCyclesWithDependencies {
+): [GraphCycles, string[]] {
const parsedRules = parsePublicodes(rawRules)
const rulesDependencies = buildRulesDependencies(parsedRules)
const dependenciesGraph = buildDependenciesGraph(rulesDependencies)
- const cycles = (graphlib as any).alg.findCycles(dependenciesGraph)
- const rulesDependenciesObject = Object.fromEntries(rulesDependencies)
+ const cycles = findCycles(dependenciesGraph)
- return cycles.map((cycle) => {
- const c = cycle.reverse()
+ const reversedCycles = cycles.map((c) => c.reverse())
+ const rulesDependenciesObject = Object.fromEntries(
+ rulesDependencies
+ ) as Record
+ const smallCycles = reversedCycles.map((cycle) =>
+ squashCycle(rulesDependenciesObject, cycle)
+ )
- return [...c, c[0]].reduce((acc, current) => {
- const previous = acc.slice(-1)[0]
- if (previous && !rulesDependenciesObject[previous].includes(current)) {
- return acc
- }
- return [...acc, current]
- }, [])
- // .map(name => [
- // name,
- // rulesDependenciesObject[name].filter(name => c.includes(name))
- // ])
- })
+ const printableStronglyConnectedComponents = reversedCycles.map((c, i) =>
+ printInDotFormat(dependenciesGraph, c, smallCycles[i])
+ )
+
+ return [smallCycles, printableStronglyConnectedComponents]
+}
+
+/**
+ * Is edge in the cycle, in the same order?
+ */
+const edgeIsInCycle = (cycle: string[], v: string, w: string): boolean => {
+ for (let i = 0; i < cycle.length + 1; i++) {
+ if (v === cycle[i] && w === cycle[(i + 1) % cycle.length]) return true
+ }
+ return false
+}
+
+export function printInDotFormat(
+ dependenciesGraph: Graph,
+ cycle: string[],
+ subCycleToHighlight: string[]
+) {
+ const edgesSet = new Set()
+ cycle.forEach((vertex) => {
+ dependenciesGraph
+ .outEdges(vertex)
+ .filter(({ w }) => cycle.includes(w))
+ .forEach(({ v, w }) => {
+ edgesSet.add(
+ `"${v}" -> "${w}"` +
+ (edgeIsInCycle(subCycleToHighlight, v, w) ? ' [color=red]' : '')
+ )
+ })
+ })
+ return `digraph Cycle {\n\t${[...edgesSet].join(';\n\t')};\n}`
}
diff --git a/publicodes/core/source/AST/index.ts b/publicodes/core/source/AST/index.ts
index 65a1d9736..4a1977cc9 100644
--- a/publicodes/core/source/AST/index.ts
+++ b/publicodes/core/source/AST/index.ts
@@ -2,9 +2,14 @@ import { InternalError } from '../error'
import { TrancheNodes } from '../mecanisms/trancheUtils'
import { ReplacementRule } from '../replacement'
import { RuleNode } from '../rule'
-import { ASTNode, NodeKind, TraverseFunction } from './types'
+import {
+ ASTNode,
+ ASTVisitor,
+ ASTTransformer,
+ NodeKind,
+ TraverseFunction,
+} from './types'
-type TransformASTFunction = (n: ASTNode) => ASTNode
/**
This function creates a transormation of the AST from on a simpler
callback function `fn`
@@ -20,42 +25,68 @@ type TransformASTFunction = (n: ASTNode) => ASTNode
by using the function passed as second argument. The returned value will be the
transformed version of the node.
*/
-export function transformAST(
- fn: (
- node: ASTNode,
- updateFn: TransformASTFunction
- ) => ASTNode | undefined | false
-): TransformASTFunction {
- function traverseFn(node: ASTNode) {
- const updatedNode = fn(node, traverseFn)
+export function makeASTTransformer(
+ fn: (node: ASTNode, transform: ASTTransformer) => ASTNode | undefined | false
+): ASTTransformer {
+ function transform(node: ASTNode): ASTNode {
+ const updatedNode = fn(node, transform)
if (updatedNode === false) {
return node
}
if (updatedNode === undefined) {
- return traverseASTNode(traverseFn, node)
+ return traverseASTNode(transform, node)
}
return updatedNode
}
- return traverseFn
+ return transform
+}
+export function makeASTVisitor(
+ fn: (node: ASTNode, visit: ASTVisitor) => 'continue' | 'stop'
+): ASTVisitor {
+ function visit(node: ASTNode) {
+ switch (fn(node, visit)) {
+ case 'continue':
+ traverseASTNode(transformizedVisit, node)
+ return
+ case 'stop':
+ return
+ }
+ }
+ const transformizedVisit: ASTTransformer = (node) => {
+ visit(node)
+ return node
+ }
+ return visit
+}
+
+// Can be made more flexible with other args like a filter function (ASTNode -> Bool).
+export function iterAST(
+ childrenSelector: (node: ASTNode) => Iterable,
+ node: ASTNode
+): ASTNode[] {
+ function* iterate(node: ASTNode): IterableIterator {
+ yield node
+ const selectedSubNodes = childrenSelector(node)
+ for (const subNode of selectedSubNodes) yield* iterate(subNode)
+ }
+ return [...iterate(node)]
}
/**
- This function allows to construct a specific value while exploring the AST with
- a simple reducing function as argument.
-
- `fn` will be called with the currently reduced value `acc` and the current node of the AST
-
-
- The outcome of the callback function has an influence on the exploration of the AST :
- - `undefined`, the exploration continues further down and all the child are reduced
- successively to a single value
- - `T`, the reduced value
-
- `reduceFn` : It is possible to specifically use the reduced value of a child
- by using the function passed as second argument. The returned value will be the reduced version
- of the node
- */
-
+ * This function allows to construct a specific value while exploring the AST with
+ * a simple reducing function as argument.
+ *
+ * `fn` will be called with the currently reduced value `acc` and the current node of the AST
+ *
+ * If the callback function returns:
+ * - `undefined`, the exploration continues further down and all the children are reduced
+ * successively to a single value
+ * - `T`, the reduced value is returned
+ *
+ * `reduceFn` : It is possible to specifically use the reduced value of a child
+ * by using the function passed as second argument. The returned value will be the reduced version
+ * of the node
+ */
export function reduceAST(
fn: (acc: T, n: ASTNode, reduceFn: (n: ASTNode) => T) => T | undefined,
start: T,
@@ -64,14 +95,14 @@ export function reduceAST(
function traverseFn(acc: T, node: ASTNode): T {
const result = fn(acc, node, traverseFn.bind(null, start))
if (result === undefined) {
- return gatherNodes(node).reduce(traverseFn, acc)
+ return getChildrenNodes(node).reduce(traverseFn, acc)
}
return result
}
return traverseFn(start, node)
}
-function gatherNodes(node: ASTNode): ASTNode[] {
+export function getChildrenNodes(node: ASTNode): ASTNode[] {
const nodes: ASTNode[] = []
traverseASTNode((node) => {
nodes.push(node)
@@ -81,7 +112,7 @@ function gatherNodes(node: ASTNode): ASTNode[] {
}
export function traverseParsedRules(
- fn: (n: ASTNode) => ASTNode,
+ fn: ASTTransformer,
parsedRules: Record
): Record {
return Object.fromEntries(
@@ -89,7 +120,10 @@ export function traverseParsedRules(
) as Record
}
-const traverseASTNode: TraverseFunction = (fn, node) => {
+/**
+ * Apply a transform function on children. Not recursive.
+ */
+export const traverseASTNode: TraverseFunction = (fn, node) => {
switch (node.nodeKind) {
case 'rule':
return traverseRuleNode(fn, node)
@@ -114,6 +148,8 @@ const traverseASTNode: TraverseFunction = (fn, node) => {
return traverseArrayNode(fn, node)
case 'durée':
return traverseDuréeNode(fn, node)
+ case 'résoudre référence circulaire':
+ return traverseRésoudreRéférenceCirculaireNode(fn, node)
case 'inversion':
return traverseInversionNode(fn, node)
case 'operation':
@@ -138,8 +174,6 @@ const traverseASTNode: TraverseFunction = (fn, node) => {
return traverseUnitéNode(fn, node)
case 'variations':
return traverseVariationNode(fn, node)
- case 'variable temporelle':
- return traverseVariableTemporelle(fn, node)
case 'replacementRule':
return traverseReplacementNode(fn, node)
default:
@@ -261,6 +295,15 @@ const traversePlancherNode: TraverseFunction<'plancher'> = (fn, node) => ({
},
})
+const traverseRésoudreRéférenceCirculaireNode: TraverseFunction<'résoudre référence circulaire'> =
+ (fn, node) => ({
+ ...node,
+ explanation: {
+ ...node.explanation,
+ valeur: fn(node.explanation.valeur),
+ },
+ })
+
const traversePlafondNode: TraverseFunction<'plafond'> = (fn, node) => ({
...node,
explanation: {
@@ -335,17 +378,3 @@ const traverseVariationNode: TraverseFunction<'variations'> = (fn, node) => ({
consequence: fn(consequence),
})),
})
-
-const traverseVariableTemporelle: TraverseFunction<'variable temporelle'> = (
- fn,
- node
-) => ({
- ...node,
- explanation: {
- period: {
- end: node.explanation.period.end && fn(node.explanation.period.end),
- start: node.explanation.period.start && fn(node.explanation.period.start),
- },
- value: fn(node.explanation.value),
- },
-})
diff --git a/publicodes/core/source/AST/types.ts b/publicodes/core/source/AST/types.ts
index 5cfa47b27..18437a557 100644
--- a/publicodes/core/source/AST/types.ts
+++ b/publicodes/core/source/AST/types.ts
@@ -1,33 +1,32 @@
import { AbattementNode } from '../mecanisms/abattement'
import { ApplicableSiNode } from '../mecanisms/applicable'
import { ArrondiNode } from '../mecanisms/arrondi'
-import { OperationNode } from '../mecanisms/operation'
import { BarèmeNode } from '../mecanisms/barème'
-import { ReferenceNode } from '../reference'
-import { RuleNode } from '../rule'
import { TouteCesConditionsNode } from '../mecanisms/condition-allof'
import { UneDeCesConditionsNode } from '../mecanisms/condition-oneof'
import { DuréeNode } from '../mecanisms/durée'
import { GrilleNode } from '../mecanisms/grille'
import { InversionNode } from '../mecanisms/inversion'
import { MaxNode } from '../mecanisms/max'
-import { PlafondNode } from '../mecanisms/plafond'
import { MinNode } from '../mecanisms/min'
import { NonApplicableSiNode } from '../mecanisms/nonApplicable'
+import { PossibilityNode } from '../mecanisms/one-possibility'
+import { OperationNode } from '../mecanisms/operation'
import { ParDéfautNode } from '../mecanisms/parDéfaut'
+import { PlafondNode } from '../mecanisms/plafond'
import { PlancherNode } from '../mecanisms/plancher'
import { ProductNode } from '../mecanisms/product'
import { RecalculNode } from '../mecanisms/recalcul'
-import { PossibilityNode } from '../mecanisms/one-possibility'
+import { RésoudreRéférenceCirculaireNode } from '../mecanisms/résoudre-référence-circulaire'
import { SituationNode } from '../mecanisms/situation'
import { SommeNode } from '../mecanisms/sum'
import { SynchronisationNode } from '../mecanisms/synchronisation'
import { TauxProgressifNode } from '../mecanisms/tauxProgressif'
import { UnitéNode } from '../mecanisms/unité'
-import { VariableTemporelleNode } from '../mecanisms/variableTemporelle'
import { VariationNode } from '../mecanisms/variations'
+import { ReferenceNode } from '../reference'
import { ReplacementRule } from '../replacement'
-import { Temporal } from '../temporal'
+import { RuleNode } from '../rule'
export type ConstantNode = {
type: 'boolean' | 'objet' | 'number' | 'string'
@@ -57,12 +56,12 @@ export type ASTNode = (
| PlancherNode
| ProductNode
| RecalculNode
+ | RésoudreRéférenceCirculaireNode
| SituationNode
| SommeNode
| SynchronisationNode
| TauxProgressifNode
| UnitéNode
- | VariableTemporelleNode
| VariationNode
| ConstantNode
| ReplacementRule
@@ -83,10 +82,13 @@ export type MecanismNode = Exclude<
ASTNode,
RuleNode | ConstantNode | ReferenceNode
>
-export type NodeKind = ASTNode['nodeKind']
+export type ASTTransformer = (n: ASTNode) => ASTNode
+export type ASTVisitor = (n: ASTNode) => void
+
+export type NodeKind = ASTNode['nodeKind']
export type TraverseFunction = (
- fn: (n: ASTNode) => ASTNode,
+ fn: ASTTransformer,
node: ASTNode & { nodeKind: Kind }
) => ASTNode & { nodeKind: Kind }
@@ -104,14 +106,24 @@ export type Unit = {
}
// Idée : une évaluation est un n-uple : (value, unit, missingVariable, isApplicable)
-// Une temporalEvaluation est une liste d'evaluation sur chaque période. : [(Evaluation, Period)]
type EvaluationDecoration = {
nodeValue: Evaluation
missingVariables: Record
unit?: Unit
- temporalValue?: Temporal
}
export type Types = number | boolean | string | Record
-export type Evaluation = T | false | null
+// TODO: type NotYetDefined & NotApplicable properly (see #14) then refactor any code depending on these:
+export type NotYetDefined = null
+export function isNotYetDefined(value): value is NotYetDefined {
+ return value === null
+}
+export type NotApplicable = false
+export function isNotApplicable(value): value is NotApplicable {
+ return typeof value === 'boolean' && value === false
+}
+export type Evaluation =
+ | T
+ | NotApplicable
+ | NotYetDefined
export type EvaluatedNode = ASTNode &
EvaluationDecoration
diff --git a/publicodes/core/source/evaluation.ts b/publicodes/core/source/evaluation.ts
index aef471908..ebefa3bd2 100644
--- a/publicodes/core/source/evaluation.ts
+++ b/publicodes/core/source/evaluation.ts
@@ -2,22 +2,13 @@ import Engine, { EvaluationFunction } from '.'
import {
ASTNode,
ConstantNode,
- Evaluation,
EvaluatedNode,
+ Evaluation,
NodeKind,
} from './AST/types'
import { warning } from './error'
-import { convertNodeToUnit, simplifyNodeUnit } from './nodeUnits'
+import { convertNodeToUnit } from './nodeUnits'
import parse from './parse'
-import {
- concatTemporals,
- liftTemporalNode,
- mapTemporal,
- pureTemporal,
- Temporal,
- temporalAverage,
- zipTemporals,
-} from './temporal'
export const collectNodeMissing = (
node: EvaluatedNode | ASTNode
@@ -53,7 +44,7 @@ function convertNodesToSameUnit(this: Engine, nodes, mecanismName) {
} catch (e) {
warning(
this.options.logger,
- this.cache._meta.ruleStack[0],
+ this.cache._meta.evaluationRuleStack[0],
`Les unités des éléments suivants sont incompatibles entre elles : \n\t\t${
node?.name || node?.rawNode
}\n\t\t${firstNodeWithUnit?.name || firstNodeWithUnit?.rawNode}'`,
@@ -75,37 +66,17 @@ export const evaluateArray: (
node.explanation.map(evaluate),
node.name
)
+ const values = evaluatedNodes.map(({ nodeValue }) => nodeValue)
+ const nodeValue = values.some((value) => value === null)
+ ? null
+ : values.reduce(reducer, start)
- const temporalValues = concatTemporals(
- evaluatedNodes.map(
- ({ temporalValue, nodeValue }) =>
- temporalValue ?? pureTemporal(nodeValue)
- )
- )
- const temporalValue = mapTemporal((values) => {
- if (values.some((value) => value === null)) {
- return null
- }
- return values.reduce(reducer, start)
- }, temporalValues)
-
- const baseEvaluation = {
+ return {
...node,
missingVariables: mergeAllMissing(evaluatedNodes),
explanation: evaluatedNodes,
...(evaluatedNodes[0] && { unit: evaluatedNodes[0].unit }),
- }
- if (temporalValue.length === 1) {
- return {
- ...baseEvaluation,
- nodeValue: temporalValue[0].value,
- }
- }
-
- return {
- ...baseEvaluation,
- temporalValue,
- nodeValue: temporalAverage(temporalValue as any),
+ nodeValue,
}
}
@@ -132,71 +103,3 @@ export const parseObject = (objectShape, value, context) => {
})
)
}
-
-export function evaluateObject(
- effet: (this: Engine, explanations: any) => any
-) {
- return function (node) {
- const evaluations = Object.fromEntries(
- Object.entries((node as any).explanation).map(([key, value]) => [
- key,
- this.evaluate(value as any),
- ])
- )
- const temporalExplanations = mapTemporal(
- Object.fromEntries,
- concatTemporals(
- Object.entries(evaluations).map(([key, node]) =>
- zipTemporals(pureTemporal(key), liftTemporalNode(node as ASTNode))
- )
- )
- )
- const temporalExplanation = mapTemporal((explanations) => {
- const evaluation = effet.call(this, explanations)
- return {
- ...evaluation,
- explanation: {
- ...explanations,
- ...evaluation.explanation,
- },
- }
- }, temporalExplanations)
-
- const sameUnitTemporalExplanation: Temporal<
- ASTNode & EvaluatedNode & { nodeValue: number }
- > = convertNodesToSameUnit
- .call(
- this,
- temporalExplanation.map((x) => x.value),
- node.nodeKind
- )
- .map((node, i) => ({
- ...temporalExplanation[i],
- value: simplifyNodeUnit(node),
- }))
-
- const temporalValue = mapTemporal(
- ({ nodeValue }) => nodeValue,
- sameUnitTemporalExplanation
- )
- const nodeValue = temporalAverage(temporalValue)
- const baseEvaluation = {
- ...node,
- nodeValue,
- unit: sameUnitTemporalExplanation[0].value.unit,
- explanation: evaluations,
- missingVariables: mergeAllMissing(Object.values(evaluations)),
- }
- if (sameUnitTemporalExplanation.length === 1) {
- return {
- ...baseEvaluation,
- explanation: (sameUnitTemporalExplanation[0] as any).value.explanation,
- }
- }
- return {
- ...baseEvaluation,
- temporalValue,
- temporalExplanation,
- }
- } as EvaluationFunction
-}
diff --git a/publicodes/core/source/format.ts b/publicodes/core/source/format.ts
index d54970a27..8016f3c89 100644
--- a/publicodes/core/source/format.ts
+++ b/publicodes/core/source/format.ts
@@ -2,33 +2,35 @@ import { Evaluation, Unit } from './AST/types'
import { simplifyNodeUnit } from './nodeUnits'
import { formatUnit, serializeUnit } from './units'
-export const numberFormatter = ({
- style,
- maximumFractionDigits = 2,
- minimumFractionDigits = 0,
- language,
-}: {
- style?: string
- maximumFractionDigits?: number
- minimumFractionDigits?: number
- language?: string
-}) => (value: number) => {
- // When we format currency we don't want to display a single decimal digit
- // ie 8,1€ but we want to display 8,10€
- const adaptedMinimumFractionDigits =
- style === 'currency' &&
- maximumFractionDigits >= 2 &&
- minimumFractionDigits === 0 &&
- !Number.isInteger(value)
- ? 2
- : minimumFractionDigits
- return Intl.NumberFormat(language, {
+export const numberFormatter =
+ ({
style,
- currency: 'EUR',
- maximumFractionDigits,
- minimumFractionDigits: adaptedMinimumFractionDigits,
- }).format(value)
-}
+ maximumFractionDigits = 2,
+ minimumFractionDigits = 0,
+ language,
+ }: {
+ style?: string
+ maximumFractionDigits?: number
+ minimumFractionDigits?: number
+ language?: string
+ }) =>
+ (value: number) => {
+ // When we format currency we don't want to display a single decimal digit
+ // ie 8,1€ but we want to display 8,10€
+ const adaptedMinimumFractionDigits =
+ style === 'currency' &&
+ maximumFractionDigits >= 2 &&
+ minimumFractionDigits === 0 &&
+ !Number.isInteger(value)
+ ? 2
+ : minimumFractionDigits
+ return Intl.NumberFormat(language, {
+ style,
+ currency: 'EUR',
+ maximumFractionDigits,
+ minimumFractionDigits: adaptedMinimumFractionDigits,
+ }).format(value)
+ }
export const formatCurrency = (
nodeValue: number | undefined,
@@ -168,9 +170,10 @@ export function serializeValue(
{ nodeValue, unit }: { nodeValue: Evaluation; unit?: Unit },
{ format }: { format: formatUnit }
) {
- const serializedUnit = (unit && typeof nodeValue === 'number'
- ? serializeUnit(unit, nodeValue, format)
- : ''
+ const serializedUnit = (
+ unit && typeof nodeValue === 'number'
+ ? serializeUnit(unit, nodeValue, format)
+ : ''
)?.replace(/\s*\/\s*/g, '/')
return `${nodeValue} ${serializedUnit}`.trim()
}
diff --git a/publicodes/core/source/grammar.ne b/publicodes/core/source/grammar.ne
index 93c12ff1f..2a2207d59 100644
--- a/publicodes/core/source/grammar.ne
+++ b/publicodes/core/source/grammar.ne
@@ -7,8 +7,7 @@
@{%
const {
- string, date, variable, temporalNumericValue, binaryOperation,
- unaryOperation, boolean, number, numberWithUnit, JSONObject
+ string, date, variable, binaryOperation, unaryOperation, boolean, number, numberWithUnit, JSONObject
} = require('./grammarFunctions')
const moo = require("moo");
@@ -61,11 +60,6 @@ main ->
NumericValue ->
AdditionSubstraction {% id %}
| Negation {% id %}
- | TemporalNumericValue {% id %}
-
-TemporalNumericValue ->
- NumericValue %space %periodWord %space %date {% ([value,,word,,dateString]) => temporalNumericValue(value, word, date([dateString])) %}
- | NumericValue %space %periodWord %colon Date {% ([value,,word,,date]) => temporalNumericValue(value, word, date) %}
NumericTerminal ->
Variable {% id %}
diff --git a/publicodes/core/source/grammarFunctions.js b/publicodes/core/source/grammarFunctions.js
index 70d7c8722..0a812f9f6 100644
--- a/publicodes/core/source/grammarFunctions.js
+++ b/publicodes/core/source/grammarFunctions.js
@@ -1,28 +1,24 @@
/* Those are postprocessor functions for the Nearley grammar.ne.
The advantage of putting them here is to get prettier's JS formatting, since Nealrey doesn't support it https://github.com/kach/nearley/issues/310 */
import { normalizeDateString } from './date'
-import { parsePeriod } from './temporal'
-export let binaryOperation = (operationType) => ([A, , operator, , B]) => ({
- [operator]: {
- operationType,
- explanation: [A, B],
- },
-})
+export let binaryOperation =
+ (operationType) =>
+ ([A, , operator, , B]) => ({
+ [operator]: {
+ operationType,
+ explanation: [A, B],
+ },
+ })
-export let unaryOperation = (operationType) => ([operator, , A]) => ({
- [operator]: {
- operationType,
- explanation: [number([{ value: '0' }]), A],
- },
-})
-
-export let temporalNumericValue = (variable, word, date) => ({
- temporalValue: {
- explanation: variable,
- period: parsePeriod(word.value.slice(2), date),
- },
-})
+export let unaryOperation =
+ (operationType) =>
+ ([operator, , A]) => ({
+ [operator]: {
+ operationType,
+ explanation: [number([{ value: '0' }]), A],
+ },
+ })
export let variable = ([firstFragment, nextFragment], _, reject) => {
const fragments = [firstFragment, ...nextFragment].map(({ value }) => value)
diff --git a/publicodes/core/source/index.ts b/publicodes/core/source/index.ts
index 13d540abc..d678a00f7 100644
--- a/publicodes/core/source/index.ts
+++ b/publicodes/core/source/index.ts
@@ -12,15 +12,21 @@ import { Rule, RuleNode } from './rule'
import * as utils from './ruleUtils'
import { formatUnit, getUnitKey } from './units'
-const emptyCache = () => ({
- _meta: { ruleStack: [] },
+const emptyCache = (): Cache => ({
+ _meta: {
+ parentRuleStack: [],
+ evaluationRuleStack: [],
+ disableApplicabilityContextCounter: 0,
+ },
nodes: new Map(),
+ nodesApplicability: new Map(),
})
type Cache = {
_meta: {
- ruleStack: Array
- parentEvaluationStack?: Array
+ parentRuleStack: Array
+ evaluationRuleStack: Array
+ disableApplicabilityContextCounter: number
inversionFail?:
| {
given: string
@@ -31,14 +37,22 @@ type Cache = {
filter?: string
}
nodes: Map
+ nodesApplicability: Map
}
export type EvaluationOptions = Partial<{
unit: string
}>
-export { reduceAST, transformAST } from './AST/index'
-export { Evaluation, Unit } from './AST/types'
+export { reduceAST, makeASTTransformer as transformAST } from './AST/index'
+export {
+ Evaluation,
+ Unit,
+ NotYetDefined,
+ isNotYetDefined,
+ NotApplicable,
+ isNotApplicable,
+} from './AST/types'
export { capitalise0, formatValue } from './format'
export { simplifyNodeUnit } from './nodeUnits'
export { default as serializeEvaluation } from './serializeEvaluation'
@@ -46,7 +60,7 @@ export { parseUnit, serializeUnit } from './units'
export { parsePublicodes, utils }
export { Rule, RuleNode, ASTNode, EvaluatedNode }
-type PublicodesExpression = string | Record | number
+export type PublicodesExpression = string | Record | number
export type Logger = {
log(message: string): void
@@ -59,14 +73,17 @@ type Options = {
getUnitKey?: getUnitKey
formatUnit?: formatUnit
}
+
export type EvaluationFunction = (
this: Engine,
node: ASTNode & { nodeKind: Kind }
) => ASTNode & { nodeKind: Kind } & EvaluatedNode
+
export type ParsedRules = Record<
Name,
RuleNode & { dottedName: Name }
>
+
export default class Engine {
parsedRules: ParsedRules
parsedSituation: Record = {}
@@ -75,25 +92,11 @@ export default class Engine {
options: Options
constructor(
- rules: string | Record | ParsedRules = {},
+ rules: string | Record = {},
options: Partial = {}
) {
this.options = { ...options, logger: options.logger ?? console }
- if (typeof rules === 'string') {
- rules = parsePublicodes(rules, this.options) as ParsedRules
- }
- const firstRuleObject = Object.values(rules)[0] as Rule | RuleNode
- if (
- typeof firstRuleObject !== 'object' ||
- firstRuleObject == null ||
- !('nodeKind' in firstRuleObject)
- ) {
- rules = parsePublicodes(
- rules as Record,
- this.options
- ) as ParsedRules
- }
- this.parsedRules = rules as ParsedRules
+ this.parsedRules = parsePublicodes(rules, this.options) as ParsedRules
this.replacements = getReplacements(this.parsedRules)
}
@@ -150,12 +153,25 @@ export default class Engine {
return this.parsedRules
}
+ getOptions(): Options {
+ return this.options
+ }
+
evaluate(value: N): N & EvaluatedNode
evaluate(value: PublicodesExpression): EvaluatedNode
evaluate(value: PublicodesExpression | ASTNode): EvaluatedNode {
const cachedNode = this.cache.nodes.get(value)
+ // The evaluation of parent applicabilty is slightly different from
+ // regular rules since we cut some of the paths (sums) for optimization.
+ // That's why we need to have a separate cache for this evaluation.
+
if (cachedNode !== undefined) {
return cachedNode
+ } else if (this.inApplicabilityEvaluationContext) {
+ const cachedNodeApplicability = this.cache.nodesApplicability.get(value)
+ if (cachedNodeApplicability) {
+ return cachedNodeApplicability
+ }
}
let parsedNode: ASTNode
@@ -177,9 +193,38 @@ export default class Engine {
this,
parsedNode
)
- this.cache.nodes.set(value, evaluatedNode)
+
+ // TODO: In most cases the two evaluation provide the same result, this
+ // could be optimized. The idea would be to use the “nodesApplicability”
+ // cache iff the rule uses a sum mechanism (ie, some paths are cut from
+ // the full evaluaiton).
+ if (!this.inApplicabilityEvaluationContext) {
+ this.cache.nodes.set(value, evaluatedNode)
+ } else {
+ this.cache.nodesApplicability.set(value, evaluatedNode)
+ }
return evaluatedNode
}
+
+ /**
+ * Shallow Engine instance copy. Keeps references to the original Engine instance attributes.
+ */
+ shallowCopy(): Engine {
+ const newEngine = new Engine()
+ newEngine.options = this.options
+ newEngine.parsedRules = this.parsedRules
+ newEngine.replacements = this.replacements
+ newEngine.parsedSituation = this.parsedSituation
+ newEngine.cache = this.cache
+ return newEngine
+ }
+
+ get inApplicabilityEvaluationContext(): boolean {
+ return (
+ this.cache._meta.parentRuleStack.length > 0 &&
+ this.cache._meta.disableApplicabilityContextCounter === 0
+ )
+ }
}
/**
diff --git a/publicodes/core/source/mecanisms/abattement.ts b/publicodes/core/source/mecanisms/abattement.ts
index 956bd0100..33dc9b936 100644
--- a/publicodes/core/source/mecanisms/abattement.ts
+++ b/publicodes/core/source/mecanisms/abattement.ts
@@ -25,7 +25,7 @@ const evaluateAbattement: EvaluationFunction<'abattement'> = function (node) {
} catch (e) {
warning(
this.options.logger,
- this.cache._meta.ruleStack[0],
+ this.cache._meta.evaluationRuleStack[0],
"Impossible de convertir les unités de l'allègement entre elles",
e
)
diff --git a/publicodes/core/source/mecanisms/arrondi.ts b/publicodes/core/source/mecanisms/arrondi.ts
index 58d1cd88a..ed219e20e 100644
--- a/publicodes/core/source/mecanisms/arrondi.ts
+++ b/publicodes/core/source/mecanisms/arrondi.ts
@@ -2,7 +2,9 @@ import { EvaluationFunction, simplifyNodeUnit } from '..'
import { mergeAllMissing } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import parse from '../parse'
-import { ASTNode } from '../AST/types'
+import { ASTNode, EvaluatedNode } from '../AST/types'
+import { serializeUnit } from '../units'
+import { evaluationError } from '../error'
export type ArrondiNode = {
explanation: {
@@ -24,6 +26,19 @@ const evaluate: EvaluationFunction<'arrondi'> = function (node) {
let arrondi = node.explanation.arrondi
if (nodeValue !== false) {
arrondi = this.evaluate(arrondi)
+
+ if (
+ typeof (arrondi as EvaluatedNode).nodeValue === 'number' &&
+ !serializeUnit((arrondi as EvaluatedNode).unit)?.match(/décimales?/)
+ ) {
+ evaluationError(
+ this.options.logger,
+ this.cache._meta.evaluationRuleStack[0],
+ `L'unité ${serializeUnit(
+ (arrondi as EvaluatedNode).unit
+ )} de l'arrondi est inconnu. Vous devez utiliser l'unité “décimales”`
+ )
+ }
}
return {
diff --git a/publicodes/core/source/mecanisms/barème.ts b/publicodes/core/source/mecanisms/barème.ts
index ac35ee4ec..087f92bda 100644
--- a/publicodes/core/source/mecanisms/barème.ts
+++ b/publicodes/core/source/mecanisms/barème.ts
@@ -3,12 +3,6 @@ import { ASTNode } from '../AST/types'
import { defaultNode, mergeAllMissing } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import parse from '../parse'
-import {
- liftTemporal2,
- liftTemporalNode,
- mapTemporal,
- temporalAverage,
-} from '../temporal'
import { convertUnit, parseUnit } from '../units'
import {
evaluatePlafondUntilActiveTranche,
@@ -39,12 +33,13 @@ export default function parseBarème(v, context): BarèmeNode {
}
}
-function evaluateBarème(tranches, assiette, evaluate, cache) {
+function evaluateBarème(tranches, assiette, evaluate) {
return tranches.map((tranche) => {
if (tranche.isAfterActive) {
return { ...tranche, nodeValue: 0 }
}
const taux = evaluate(tranche.taux)
+ const missingVariables = mergeAllMissing([taux, tranche])
if (
[
@@ -58,7 +53,7 @@ function evaluateBarème(tranches, assiette, evaluate, cache) {
...tranche,
taux,
nodeValue: null,
- missingVariables: mergeAllMissing([taux, tranche]),
+ missingVariables,
}
}
return {
@@ -69,7 +64,7 @@ function evaluateBarème(tranches, assiette, evaluate, cache) {
(Math.min(assiette.nodeValue, tranche.plafondValue) -
tranche.plancherValue) *
convertUnit(taux.unit, parseUnit(''), taux.nodeValue as number),
- missingVariables: mergeAllMissing([taux, tranche]),
+ missingVariables,
}
})
}
@@ -77,45 +72,28 @@ const evaluate: EvaluationFunction<'barème'> = function (node) {
const evaluate = this.evaluate.bind(this)
const assiette = this.evaluate(node.explanation.assiette)
const multiplicateur = this.evaluate(node.explanation.multiplicateur)
- const temporalTranchesPlafond = liftTemporal2(
- (assiette, multiplicateur) =>
- evaluatePlafondUntilActiveTranche.call(this, {
- parsedTranches: node.explanation.tranches,
- assiette,
- multiplicateur,
- }),
- liftTemporalNode(assiette as any),
- liftTemporalNode(multiplicateur as any)
+ const tranches = evaluateBarème(
+ evaluatePlafondUntilActiveTranche.call(this, {
+ parsedTranches: node.explanation.tranches,
+ assiette,
+ multiplicateur,
+ }),
+ assiette,
+ evaluate
)
- const temporalTranches = liftTemporal2(
- (tranches, assiette) =>
- evaluateBarème(tranches, assiette, evaluate, this.cache),
- temporalTranchesPlafond,
- liftTemporalNode(assiette as any)
- )
- const temporalValue = mapTemporal(
- (tranches) =>
- tranches.reduce(
- (value, { nodeValue }) =>
- nodeValue == null ? null : value + nodeValue,
- 0
- ),
- temporalTranches
+ const nodeValue = tranches.reduce(
+ (value, { nodeValue }) => (nodeValue == null ? null : value + nodeValue),
+ 0
)
+
return {
...node,
- nodeValue: temporalAverage(temporalValue),
- ...(temporalValue.length > 1
- ? {
- temporalValue,
- }
- : { missingVariables: mergeAllMissing(temporalTranches[0].value) }),
+ nodeValue,
+ missingVariables: mergeAllMissing(tranches),
explanation: {
assiette,
multiplicateur,
- ...(temporalTranches.length > 1
- ? { temporalTranches }
- : { tranches: temporalTranches[0].value }),
+ tranches,
},
unit: assiette.unit,
} as any
diff --git a/publicodes/core/source/mecanisms/grille.ts b/publicodes/core/source/mecanisms/grille.ts
index b7f5633df..05763dd95 100644
--- a/publicodes/core/source/mecanisms/grille.ts
+++ b/publicodes/core/source/mecanisms/grille.ts
@@ -3,12 +3,6 @@ import { ASTNode } from '../AST/types'
import { defaultNode, mergeAllMissing } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import parse from '../parse'
-import {
- liftTemporal2,
- liftTemporalNode,
- mapTemporal,
- temporalAverage,
-} from '../temporal'
import {
evaluatePlafondUntilActiveTranche,
parseTranches,
@@ -37,78 +31,58 @@ export default function parseGrille(v, context): GrilleNode {
nodeKind: 'grille',
}
}
-const evaluateGrille = (tranches, evaluate) =>
- tranches.map((tranche) => {
- if (tranche.isActive === false) {
- return tranche
- }
- const montant = evaluate(tranche.montant)
- return {
- ...tranche,
- montant,
- nodeValue: montant.nodeValue,
- unit: montant.unit,
- missingVariables: mergeAllMissing([montant, tranche]),
- }
- })
const evaluate: EvaluationFunction<'grille'> = function (node) {
const evaluate = this.evaluate.bind(this)
const assiette = this.evaluate(node.explanation.assiette)
const multiplicateur = this.evaluate(node.explanation.multiplicateur)
- const temporalTranchesPlafond = liftTemporal2(
- (assiette, multiplicateur) =>
- evaluatePlafondUntilActiveTranche.call(this, {
- parsedTranches: node.explanation.tranches,
- assiette,
- multiplicateur,
- }),
- liftTemporalNode(assiette as any),
- liftTemporalNode(multiplicateur as any)
- )
- const temporalTranches = mapTemporal(
- (tranches) => evaluateGrille(tranches, evaluate),
- temporalTranchesPlafond
- )
+ const tranches = evaluatePlafondUntilActiveTranche
+ .call(this, {
+ parsedTranches: node.explanation.tranches,
+ assiette,
+ multiplicateur,
+ })
+ .map((tranche) => {
+ if (tranche.isActive === false) {
+ return tranche
+ }
+ const montant = evaluate(tranche.montant)
+ return {
+ ...tranche,
+ montant,
+ nodeValue: montant.nodeValue,
+ unit: montant.unit,
+ missingVariables: mergeAllMissing([montant, tranche]),
+ }
+ })
- const activeTranches = mapTemporal((tranches) => {
- const activeTranche = tranches.find((tranche) => tranche.isActive)
- if (activeTranche) {
- return [activeTranche]
- }
- const lastTranche = tranches[tranches.length - 1]
- if (lastTranche.isAfterActive === false) {
- return [{ nodeValue: false }]
- }
- return tranches.filter((tranche) => tranche.isActive === null)
- }, temporalTranches)
- const temporalValue = mapTemporal(
- (tranches) =>
- !tranches[0]
- ? false
- : tranches[0].isActive === null
- ? null
- : tranches[0].nodeValue,
- activeTranches
- )
+ let activeTranches
+ const activeTranche = tranches.find((tranche) => tranche.isActive)
+ if (activeTranche) {
+ activeTranches = [activeTranche]
+ } else if (tranches[tranches.length - 1].isAfterActive === false) {
+ activeTranches = [{ nodeValue: false }]
+ } else {
+ activeTranches = tranches.filter((tranche) => tranche.isActive === null)
+ }
+
+ const nodeValue = !activeTranches[0]
+ ? false
+ : activeTranches[0].isActive === null
+ ? null
+ : activeTranches[0].nodeValue
return {
...node,
- nodeValue: temporalAverage(temporalValue),
- ...(temporalValue.length > 1
- ? {
- temporalValue,
- }
- : { missingVariables: mergeAllMissing(activeTranches[0].value) }),
+ nodeValue,
+ missingVariables: mergeAllMissing(activeTranches),
explanation: {
...node.explanation,
assiette,
multiplicateur,
- ...(temporalTranches.length > 1
- ? { temporalTranches }
- : { tranches: temporalTranches[0].value }),
+ tranches,
},
- unit: activeTranches[0]?.value[0]?.unit ?? undefined,
+ unit: activeTranches[0]?.unit ?? undefined,
} as any
}
diff --git a/publicodes/core/source/mecanisms/inversion.ts b/publicodes/core/source/mecanisms/inversion.ts
index aafad83dc..dd540ea0f 100644
--- a/publicodes/core/source/mecanisms/inversion.ts
+++ b/publicodes/core/source/mecanisms/inversion.ts
@@ -1,9 +1,9 @@
-import parse from '../parse'
import { EvaluationFunction } from '..'
import { ConstantNode, Unit } from '../AST/types'
import { mergeMissing } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import { convertNodeToUnit } from '../nodeUnits'
+import parse from '../parse'
import { Context } from '../parsePublicodes'
import { ReferenceNode } from '../reference'
import uniroot from '../uniroot'
@@ -54,7 +54,6 @@ export const evaluateInversion: EvaluationFunction<'inversion'> = function (
}
const evaluatedInversionGoal = this.evaluate(inversionGoal)
const unit = 'unit' in node ? node.unit : evaluatedInversionGoal.unit
-
const originalCache = this.cache
const originalSituation = { ...this.parsedSituation }
let inversionNumberOfIterations = 0
@@ -63,7 +62,6 @@ export const evaluateInversion: EvaluationFunction<'inversion'> = function (
inversionNumberOfIterations++
this.resetCache()
this.cache._meta = { ...originalCache._meta }
-
this.parsedSituation[node.explanation.ruleToInverse] = {
unit: unit,
nodeKind: 'unité',
@@ -139,9 +137,11 @@ export const evaluateInversion: EvaluationFunction<'inversion'> = function (
// // Uncomment to display the two attempts and their result
// console.table([{ x: x1, y: y1 }, { x: x2, y: y2 }])
- // console.log('iteration:', inversionNumberOfIterations)
+ // console.log('iteration inversion:', inversionNumberOfIterations)
+
this.cache = originalCache
this.parsedSituation = originalSituation
+
return {
...node,
unit,
diff --git a/publicodes/core/source/mecanisms/min.ts b/publicodes/core/source/mecanisms/min.ts
index 77b7d78fc..8964fad84 100644
--- a/publicodes/core/source/mecanisms/min.ts
+++ b/publicodes/core/source/mecanisms/min.ts
@@ -16,6 +16,18 @@ export const mecanismMin = (v, context) => {
} as MinNode
}
-const evaluate = evaluateArray<'minimum'>((a, b) => Math.min(a, b), Infinity)
+const min = (a, b) => {
+ if (a === false) {
+ return b
+ }
+ if (b === false) {
+ return a
+ }
+ if (a === null || b === null) {
+ return null
+ }
+ return Math.min(a, b)
+}
+const evaluate = evaluateArray<'minimum'>(min, false)
registerEvaluationFunction('minimum', evaluate)
diff --git a/publicodes/core/source/mecanisms/operation.ts b/publicodes/core/source/mecanisms/operation.ts
index f093548b0..897473604 100644
--- a/publicodes/core/source/mecanisms/operation.ts
+++ b/publicodes/core/source/mecanisms/operation.ts
@@ -1,13 +1,11 @@
import { EvaluationFunction } from '..'
-import { ASTNode } from '../AST/types'
+import { ASTNode, EvaluatedNode } from '../AST/types'
import { convertToDate } from '../date'
import { warning } from '../error'
import { mergeAllMissing } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import { convertNodeToUnit } from '../nodeUnits'
import parse from '../parse'
-import { liftTemporal2, pureTemporal, temporalAverage } from '../temporal'
-import { EvaluatedNode } from '../AST/types'
import { inferUnit, serializeUnit } from '../units'
const knownOperations = {
@@ -43,10 +41,24 @@ const parseOperation = (k, symbol) => (v, context) => {
}
const evaluate: EvaluationFunction<'operation'> = function (node) {
+ // When we only need to evaluate the applicability of a rule, we don't enter
+ // inside “sum terms” since we know that the sum will always be applicable.
+ // However, if somewhere in the evaluation stack we do a comparison, we need
+ // to disable this optimization since in this case we'll need the exact value
+ // of sums in the evaluation subtree.
+ const disableApplicabilityContext = ['≠', '=', '<', '>', '≤', '≥'].includes(
+ node.operator
+ )
+ if (disableApplicabilityContext && this.inApplicabilityEvaluationContext) {
+ this.cache._meta.disableApplicabilityContextCounter += 1
+ }
const explanation = node.explanation.map((node) => this.evaluate(node)) as [
EvaluatedNode,
EvaluatedNode
]
+ if (disableApplicabilityContext && this.inApplicabilityEvaluationContext) {
+ this.cache._meta.disableApplicabilityContextCounter -= 1
+ }
let [node1, node2] = explanation
const missingVariables = mergeAllMissing([node1, node2])
@@ -74,7 +86,26 @@ const evaluate: EvaluationFunction<'operation'> = function (node) {
)
}
}
- const baseNode = {
+
+ const operatorFunction = knownOperations[node.operationKind][0]
+
+ const a = node1.nodeValue as string | false
+ const b = node2.nodeValue as string | false
+
+ const nodeValue =
+ !['≠', '='].includes(node.operator) && a === false && b === false
+ ? false
+ : ['<', '>', '≤', '≥', '∕', '×'].includes(node.operator) &&
+ (a === false || b === false)
+ ? false
+ : a !== false &&
+ b !== false &&
+ ['≠', '=', '<', '>', '≤', '≥'].includes(node.operator) &&
+ [a, b].every((value) => value.match?.(/[\d]{2}\/[\d]{2}\/[\d]{4}/))
+ ? operatorFunction(convertToDate(a), convertToDate(b))
+ : operatorFunction(a, b)
+
+ return {
...node,
explanation,
...((node.operationKind === '*' ||
@@ -84,40 +115,7 @@ const evaluate: EvaluationFunction<'operation'> = function (node) {
unit: inferUnit(node.operationKind, [node1.unit, node2.unit]),
}),
missingVariables,
- }
-
- const operatorFunction = knownOperations[node.operationKind][0]
-
- const temporalValue = liftTemporal2(
- (a: string | false, b: string | false) => {
- if (!['≠', '='].includes(node.operator) && a === false && b === false) {
- return false
- }
- if (
- ['<', '>', '≤', '≥', '∕', '×'].includes(node.operator) &&
- (a === false || b === false)
- ) {
- return false
- }
- if (
- a !== false &&
- b !== false &&
- ['≠', '=', '<', '>', '≤', '≥'].includes(node.operator) &&
- [a, b].every((value) => value.match?.(/[\d]{2}\/[\d]{2}\/[\d]{4}/))
- ) {
- return operatorFunction(convertToDate(a), convertToDate(b))
- }
- return operatorFunction(a, b)
- },
- node1.temporalValue ?? (pureTemporal(node1.nodeValue) as any),
- node2.temporalValue ?? (pureTemporal(node2.nodeValue) as any)
- )
- const nodeValue = temporalAverage(temporalValue, baseNode.unit)
-
- return {
- ...baseNode,
nodeValue,
- ...(temporalValue.length > 1 && { temporalValue }),
}
}
diff --git a/publicodes/core/source/mecanisms/plafond.ts b/publicodes/core/source/mecanisms/plafond.ts
index 952a55e23..0743bfe66 100644
--- a/publicodes/core/source/mecanisms/plafond.ts
+++ b/publicodes/core/source/mecanisms/plafond.ts
@@ -1,4 +1,3 @@
-import { last } from 'ramda'
import { EvaluationFunction } from '..'
import { ASTNode } from '../AST/types'
import { warning } from '../error'
@@ -28,7 +27,7 @@ const evaluate: EvaluationFunction<'plafond'> = function (node) {
} catch (e) {
warning(
this.options.logger,
- this.cache._meta.ruleStack[0],
+ this.cache._meta.evaluationRuleStack[0],
"L'unité du plafond n'est pas compatible avec celle de la valeur à encadrer",
e
)
diff --git a/publicodes/core/source/mecanisms/plancher.ts b/publicodes/core/source/mecanisms/plancher.ts
index 6f06f4425..c4578e305 100644
--- a/publicodes/core/source/mecanisms/plancher.ts
+++ b/publicodes/core/source/mecanisms/plancher.ts
@@ -26,7 +26,7 @@ const evaluate: EvaluationFunction<'plancher'> = function (node) {
} catch (e) {
warning(
this.options.logger,
- this.cache._meta.ruleStack[0],
+ this.cache._meta.evaluationRuleStack[0],
"L'unité du plancher n'est pas compatible avec celle de la valeur à encadrer",
e
)
diff --git a/publicodes/core/source/mecanisms/product.ts b/publicodes/core/source/mecanisms/product.ts
index 334aac143..2d636700e 100644
--- a/publicodes/core/source/mecanisms/product.ts
+++ b/publicodes/core/source/mecanisms/product.ts
@@ -1,7 +1,7 @@
import { EvaluationFunction } from '..'
import { ASTNode } from '../AST/types'
import { warning } from '../error'
-import { defaultNode, evaluateObject, parseObject } from '../evaluation'
+import { defaultNode, mergeAllMissing, parseObject } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import { convertNodeToUnit, simplifyNodeUnit } from '../nodeUnits'
import { areUnitConvertible, convertUnit, inferUnit } from '../units'
@@ -32,19 +32,19 @@ export const mecanismProduct = (v, context) => {
} as ProductNode
}
-const productEffect: EvaluationFunction = function ({
- assiette,
- taux,
- facteur,
- plafond,
-}: any) {
+const evaluateProduit: EvaluationFunction<'produit'> = function (node) {
+ const assiette = this.evaluate(node.explanation.assiette)
+ const taux = this.evaluate(node.explanation.taux)
+ const facteur = this.evaluate(node.explanation.facteur)
+ let plafond = this.evaluate(node.explanation.plafond)
+
if (assiette.unit) {
try {
plafond = convertNodeToUnit(assiette.unit, plafond)
} catch (e) {
warning(
this.options.logger,
- this.cache._meta.ruleStack[0],
+ this.cache._meta.evaluationRuleStack[0],
"Impossible de convertir l'unité du plafond du produit dans celle de l'assiette",
e
)
@@ -72,16 +72,20 @@ const productEffect: EvaluationFunction = function ({
nodeValue = convertUnit(unit, assiette.unit, nodeValue)
unit = assiette.unit
}
+
return simplifyNodeUnit({
+ ...node,
+ missingVariables: mergeAllMissing([assiette, taux, facteur, plafond]),
nodeValue,
unit,
-
explanation: {
- plafondActif: assiette.nodeValue > plafond.nodeValue,
+ assiette,
+ taux,
+ facteur,
+ plafond,
+ plafondActif: (assiette.nodeValue as any) > (plafond as any).nodeValue,
},
})
}
-const evaluate = evaluateObject<'produit'>(productEffect)
-
-registerEvaluationFunction('produit', evaluate)
+registerEvaluationFunction('produit', evaluateProduit)
diff --git a/publicodes/core/source/mecanisms/recalcul.ts b/publicodes/core/source/mecanisms/recalcul.ts
index 7b7327877..1f7443b9b 100644
--- a/publicodes/core/source/mecanisms/recalcul.ts
+++ b/publicodes/core/source/mecanisms/recalcul.ts
@@ -1,24 +1,24 @@
-import { EvaluationFunction } from '..'
-import { ASTNode } from '../AST/types'
+import Engine, { EvaluationFunction } from '..'
+import { ASTNode, EvaluatedNode } from '../AST/types'
import { defaultNode } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import parse from '../parse'
import { ReferenceNode } from '../reference'
import { disambiguateRuleReference } from '../ruleUtils'
-import { EvaluatedNode } from '../AST/types'
import { serializeUnit } from '../units'
export type RecalculNode = {
explanation: {
recalcul: ASTNode
amendedSituation: Array<[ReferenceNode, ASTNode]>
+ parsedSituation?: Engine['parsedSituation']
}
nodeKind: 'recalcul'
}
const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) {
if (this.cache._meta.inRecalcul) {
- return (defaultNode(false) as any) as RecalculNode & EvaluatedNode
+ return defaultNode(null) as any as RecalculNode & EvaluatedNode
}
const amendedSituation = node.explanation.amendedSituation
@@ -32,46 +32,36 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) {
serializeUnit(originRule.unit) !== serializeUnit(replacement.unit)
) as Array<[ReferenceNode & EvaluatedNode, EvaluatedNode]>
- const originalCache = this.cache
- const originalSituation = { ...this.parsedSituation }
- // Optimisation : no need for recalcul if situation is the same
- const invalidateCache = Object.keys(amendedSituation).length > 0
- if (invalidateCache) {
- this.resetCache()
- this.cache._meta = { ...this.cache._meta, inRecalcul: true }
- }
-
- this.parsedSituation = {
- ...this.parsedSituation,
- ...Object.fromEntries(
- amendedSituation.map(([reference, replacement]) => [
- disambiguateRuleReference(
- this.parsedRules,
- reference.contextDottedName,
- reference.name
+ const engine = amendedSituation.length
+ ? this.shallowCopy().setSituation({
+ ...this.parsedSituation,
+ ...Object.fromEntries(
+ amendedSituation.map(([reference, replacement]) => [
+ disambiguateRuleReference(
+ this.parsedRules,
+ reference.contextDottedName,
+ reference.name
+ ),
+ replacement,
+ ]) as any
),
- replacement,
- ]) as any
- ),
- }
+ })
+ : this
+
+ engine.cache._meta.inRecalcul = true
+ const evaluatedNode = engine.evaluate(node.explanation.recalcul)
+ engine.cache._meta.inRecalcul = false
- const evaluatedNode = this.evaluate(node.explanation.recalcul)
- this.parsedSituation = originalSituation
- if (invalidateCache) {
- this.cache = originalCache
- }
return {
...node,
nodeValue: evaluatedNode.nodeValue,
explanation: {
recalcul: evaluatedNode,
amendedSituation,
+ parsedSituation: engine.parsedSituation,
},
missingVariables: evaluatedNode.missingVariables,
...('unit' in evaluatedNode && { unit: evaluatedNode.unit }),
- ...(evaluatedNode.temporalValue && {
- temporalValue: evaluatedNode.temporalValue,
- }),
}
}
diff --git a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts
new file mode 100644
index 000000000..acfb823cf
--- /dev/null
+++ b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts
@@ -0,0 +1,109 @@
+import { EvaluationFunction } from '..'
+import { ASTNode, ConstantNode, Unit } from '../AST/types'
+import { registerEvaluationFunction } from '../evaluationFunctions'
+import parse from '../parse'
+import { Context } from '../parsePublicodes'
+import uniroot from '../uniroot'
+import { UnitéNode } from './unité'
+
+export type RésoudreRéférenceCirculaireNode = {
+ explanation: {
+ ruleToSolve: string
+ valeur: ASTNode
+ }
+ nodeKind: 'résoudre référence circulaire'
+}
+
+export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoudre référence circulaire'> =
+ function (node) {
+ const originalCache = this.cache
+ let inversionNumberOfIterations = 0
+
+ const evaluateWithValue = (
+ n: number,
+ unit: Unit = { numerators: [], denominators: [] }
+ ) => {
+ inversionNumberOfIterations++
+ this.resetCache()
+
+ this.parsedSituation[node.explanation.ruleToSolve] = {
+ unit: unit,
+ nodeKind: 'unité',
+ explanation: {
+ nodeKind: 'constant',
+ nodeValue: n,
+ type: 'number',
+ } as ConstantNode,
+ } as UnitéNode
+ return this.evaluate(node.explanation.valeur)
+ }
+
+ let nodeValue: number | null | undefined = null
+
+ const x0 = 0
+ let valeur = evaluateWithValue(x0)
+
+ const y0 = valeur.nodeValue as number
+ const unit = valeur.unit
+ const missingVariables = valeur.missingVariables
+ let i = 0
+ if (y0 !== null) {
+ // The `uniroot` function parameter. It will be called with its `min` and
+ // `max` arguments, so we can use our cached nodes if the function is called
+ // with the already computed x1 or x2.
+ const test = (x: number): number => {
+ if (x === x0) {
+ return y0 - x0
+ }
+ valeur = evaluateWithValue(x, unit)
+ const y = valeur.nodeValue
+ i++
+ return (y as number) - x
+ }
+
+ const defaultMin = -1_000_000
+ const defaultMax = 100_000_000
+
+ nodeValue = uniroot(test, defaultMin, defaultMax, 0.5, 30, 2)
+ }
+
+ this.cache = originalCache
+
+ if (nodeValue === undefined) {
+ nodeValue = null
+ this.cache._meta.inversionFail = true
+ }
+ if (nodeValue !== null) {
+ valeur = evaluateWithValue(nodeValue, unit)
+ }
+ delete this.parsedSituation[node.explanation.ruleToSolve]
+
+ return {
+ ...node,
+ unit,
+ nodeValue,
+ explanation: {
+ ...node.explanation,
+ valeur,
+ inversionNumberOfIterations,
+ },
+ missingVariables,
+ }
+ }
+
+export default function parseRésoudreRéférenceCirculaire(v, context: Context) {
+ return {
+ explanation: {
+ ruleToSolve: context.dottedName,
+ valeur: parse(v.valeur, context),
+ },
+ nodeKind: 'résoudre référence circulaire',
+ } as RésoudreRéférenceCirculaireNode
+}
+
+parseRésoudreRéférenceCirculaire.nom = 'résoudre la référence circulaire'
+
+registerEvaluationFunction(
+ 'résoudre référence circulaire',
+ evaluateRésoudreRéférenceCirculaire
+)
diff --git a/publicodes/core/source/mecanisms/sum.tsx b/publicodes/core/source/mecanisms/sum.tsx
index 54eba4734..ce45f3d9c 100644
--- a/publicodes/core/source/mecanisms/sum.tsx
+++ b/publicodes/core/source/mecanisms/sum.tsx
@@ -18,4 +18,17 @@ export const mecanismSum = (v, context) => {
} as SommeNode
}
-registerEvaluationFunction('somme', evaluate)
+registerEvaluationFunction('somme', function (node) {
+ if (this.inApplicabilityEvaluationContext) {
+ return {
+ // With a clearer distinction between `getApplicability` and
+ // `getValue` we could avoid faking a `nodeValue: true` and instead
+ // simply return `isApplicable: true, nodeValue: undefined`
+ nodeValue: true,
+ nodeKind: 'somme',
+ missingVariables: {},
+ explanation: [],
+ }
+ }
+ return evaluate.call(this, node)
+})
diff --git a/publicodes/core/source/mecanisms/synchronisation.ts b/publicodes/core/source/mecanisms/synchronisation.ts
index 8e3458ccc..e944051a6 100644
--- a/publicodes/core/source/mecanisms/synchronisation.ts
+++ b/publicodes/core/source/mecanisms/synchronisation.ts
@@ -14,22 +14,16 @@ export type SynchronisationNode = {
const evaluate: EvaluationFunction<'synchronisation'> = function (node: any) {
const data = this.evaluate(node.explanation.data)
const valuePath = node.explanation.chemin.split(' . ')
- const path = (obj) => valuePath.reduce((res, prop) => res[prop], obj)
- const nodeValue = data.nodeValue == null ? null : path(data.nodeValue)
- // If the API gave a non null value, then some of its props may be null (the
- // API can be composed of multiple API, some failing). Then this prop will be
- // set to the default value defined in the API's rule
- const safeNodeValue =
- nodeValue == null && data.nodeValue != null
- ? path(data.explanation.defaultValue)
- : nodeValue
+ const path = (obj) => valuePath.reduce((res, prop) => res?.[prop], obj)
+ const nodeValue = path(data.nodeValue) ?? null
+
const missingVariables = {
...data.missingVariables,
...(data.nodeValue === null ? { [data.dottedName]: 1 } : {}),
}
const explanation = { ...node.explanation, data }
- return { ...node, nodeValue: safeNodeValue, explanation, missingVariables }
+ return { ...node, nodeValue, explanation, missingVariables }
}
export const mecanismSynchronisation = (v, context) => {
diff --git a/publicodes/core/source/mecanisms/trancheUtils.ts b/publicodes/core/source/mecanisms/trancheUtils.ts
index 2b430e06b..415240676 100644
--- a/publicodes/core/source/mecanisms/trancheUtils.ts
+++ b/publicodes/core/source/mecanisms/trancheUtils.ts
@@ -63,7 +63,7 @@ export function evaluatePlafondUntilActiveTranche(
} catch (e) {
warning(
this.options.logger,
- this.cache._meta.ruleStack[0],
+ this.cache._meta.evaluationRuleStack[0],
`L'unité du plafond de la tranche n°${
i + 1
} n'est pas compatible avec celle l'assiette`,
@@ -103,7 +103,7 @@ export function evaluatePlafondUntilActiveTranche(
) {
evaluationError(
this.options.logger,
- this.cache._meta.ruleStack[0],
+ this.cache._meta.evaluationRuleStack[0],
`Le plafond de la tranche n°${
i + 1
} a une valeur inférieure à celui de la tranche précédente`
diff --git a/publicodes/core/source/mecanisms/unité.ts b/publicodes/core/source/mecanisms/unité.ts
index ac57c027c..a27b39e41 100644
--- a/publicodes/core/source/mecanisms/unité.ts
+++ b/publicodes/core/source/mecanisms/unité.ts
@@ -37,7 +37,7 @@ registerEvaluationFunction(parseUnité.nom, function evaluate(node) {
} catch (e) {
warning(
this.options.logger,
- this.cache._meta.ruleStack[0],
+ this.cache._meta.evaluationRuleStack[0],
"Erreur lors de la conversion d'unité explicite",
e
)
diff --git a/publicodes/core/source/mecanisms/variableTemporelle.ts b/publicodes/core/source/mecanisms/variableTemporelle.ts
deleted file mode 100644
index f16edd876..000000000
--- a/publicodes/core/source/mecanisms/variableTemporelle.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { EvaluationFunction } from '..'
-import { ASTNode } from '../AST/types'
-import { registerEvaluationFunction } from '../evaluationFunctions'
-import parse from '../parse'
-import {
- createTemporalEvaluation,
- narrowTemporalValue,
- Temporal,
- temporalAverage,
-} from '../temporal'
-
-export type VariableTemporelleNode = {
- explanation: {
- period: {
- start: ASTNode | undefined
- end: ASTNode | undefined
- }
- value: ASTNode
- }
- nodeKind: 'variable temporelle'
-}
-
-const evaluate: EvaluationFunction<'variable temporelle'> = function (
- node: any
-) {
- const start =
- node.explanation.period.start &&
- this.evaluate(node.explanation.period.start)
- const end =
- node.explanation.period.end && this.evaluate(node.explanation.period.end)
- const value = this.evaluate(node.explanation.value)
- const period = {
- start: start?.nodeValue || null,
- end: end?.nodeValue || null,
- }
- const temporalValue = value.temporalValue
- ? narrowTemporalValue(period, value.temporalValue)
- : createTemporalEvaluation(value.nodeValue, period)
- // TODO explanation missingVariables / period missing variables
- return {
- ...node,
- nodeValue: temporalAverage(temporalValue as Temporal, value.unit),
- temporalValue,
- explanation: {
- period: { start, end },
- value,
- },
- ...('unit' in value && { unit: value.unit }),
- }
-}
-
-export default function parseVariableTemporelle(
- v,
- context
-): VariableTemporelleNode {
- const explanation = parse(v.explanation, context)
- return {
- nodeKind: 'variable temporelle',
- explanation: {
- period: {
- start: v.period.start && parse(v.period.start, context),
- end: v.period.end && parse(v.period.end, context),
- },
- value: explanation,
- },
- }
-}
-
-registerEvaluationFunction('variable temporelle', evaluate)
diff --git a/publicodes/core/source/mecanisms/variations.ts b/publicodes/core/source/mecanisms/variations.ts
index 7cff54a1c..3dc760138 100644
--- a/publicodes/core/source/mecanisms/variations.ts
+++ b/publicodes/core/source/mecanisms/variations.ts
@@ -1,17 +1,10 @@
import { EvaluationFunction } from '..'
-import { ASTNode, Unit } from '../AST/types'
+import { ASTNode, EvaluatedNode, Unit } from '../AST/types'
import { warning } from '../error'
import { bonus, defaultNode, mergeAllMissing } from '../evaluation'
import { registerEvaluationFunction } from '../evaluationFunctions'
import { convertNodeToUnit } from '../nodeUnits'
import parse from '../parse'
-import {
- liftTemporal2,
- pureTemporal,
- sometime,
- Temporal,
- temporalAverage,
-} from '../temporal'
export type VariationNode = {
explanation: Array<{
@@ -62,12 +55,12 @@ export default function parseVariations(v, context): VariationNode {
}
const evaluate: EvaluationFunction<'variations'> = function (node) {
- const [temporalValue, explanation, unit] = node.explanation.reduce<
+ const [nodeValue, explanation, unit] = node.explanation.reduce<
[
- Temporal,
+ EvaluatedNode['nodeValue'],
VariationNode['explanation'],
Unit | undefined,
- Temporal
+ boolean | null
]
>(
(
@@ -75,11 +68,7 @@ const evaluate: EvaluationFunction<'variations'> = function (node) {
{ condition, consequence },
i: number
) => {
- const previousConditionsAlwaysTrue = !sometime(
- (value) => value !== true,
- previousConditions
- )
- if (previousConditionsAlwaysTrue) {
+ if (previousConditions === true) {
return [
evaluation,
[...explanations, { condition, consequence }],
@@ -88,24 +77,19 @@ const evaluate: EvaluationFunction<'variations'> = function (node) {
]
}
const evaluatedCondition = this.evaluate(condition)
- const currentCondition = liftTemporal2(
- (previousCond, currentCond) =>
- previousCond === null
- ? previousCond
- : !previousCond &&
- (currentCond === null ? null : currentCond !== false),
- previousConditions,
- evaluatedCondition.temporalValue ??
- pureTemporal(evaluatedCondition.nodeValue)
- )
+ const currentCondition =
+ previousConditions === null
+ ? previousConditions
+ : !previousConditions &&
+ (evaluatedCondition.nodeValue === null
+ ? null
+ : evaluatedCondition.nodeValue !== false)
+
evaluatedCondition.missingVariables = bonus(
evaluatedCondition.missingVariables
)
- const currentConditionAlwaysFalse = !sometime(
- (x) => x !== false,
- currentCondition
- )
- if (currentConditionAlwaysFalse) {
+
+ if (currentCondition === false) {
return [
evaluation,
[...explanations, { condition: evaluatedCondition, consequence }],
@@ -120,7 +104,7 @@ const evaluate: EvaluationFunction<'variations'> = function (node) {
} catch (e) {
warning(
this.options.logger,
- this.cache._meta.ruleStack[0],
+ this.cache._meta.evaluationRuleStack[0],
`L'unité de la branche n° ${
i + 1
} du mécanisme 'variations' n'est pas compatible avec celle d'une branche précédente`,
@@ -128,15 +112,8 @@ const evaluate: EvaluationFunction<'variations'> = function (node) {
)
}
}
- const currentValue = liftTemporal2(
- (cond, value) => cond && value,
- currentCondition,
- evaluatedConsequence.temporalValue ??
- pureTemporal(evaluatedConsequence.nodeValue)
- )
- const or = (a, b) => a || b
return [
- liftTemporal2(or, evaluation, currentValue),
+ currentCondition && evaluatedConsequence.nodeValue,
[
...explanations,
{
@@ -146,19 +123,18 @@ const evaluate: EvaluationFunction<'variations'> = function (node) {
},
],
unit || evaluatedConsequence.unit,
- liftTemporal2(or, previousConditions, currentCondition),
+ previousConditions || currentCondition,
]
},
- [pureTemporal(false), [], undefined, pureTemporal(false)]
+ [false, [], undefined, false]
)
- const nodeValue = temporalAverage(temporalValue, unit)
const missingVariables = mergeAllMissing(
explanation.reduce(
- (values, { condition, consequence }) => [
+ (values, { condition, satisfied, consequence }) => [
...values,
condition,
- consequence,
+ ...(satisfied ? [consequence] : []),
],
[]
)
@@ -170,7 +146,6 @@ const evaluate: EvaluationFunction<'variations'> = function (node) {
...(unit !== undefined && { unit }),
explanation,
missingVariables,
- ...(temporalValue.length > 1 && { temporalValue }),
}
}
diff --git a/publicodes/core/source/nodeUnits.ts b/publicodes/core/source/nodeUnits.ts
index 504ae21e3..fc2eeb369 100644
--- a/publicodes/core/source/nodeUnits.ts
+++ b/publicodes/core/source/nodeUnits.ts
@@ -1,5 +1,4 @@
import { EvaluatedNode, Unit } from './AST/types'
-import { mapTemporal } from './temporal'
import { convertUnit, simplifyUnit } from './units'
export function simplifyNodeUnit(node) {
@@ -15,20 +14,12 @@ export function convertNodeToUnit(
to: Unit | undefined,
node: Node
): Node {
- const temporalValue =
- node.temporalValue && node.unit
- ? mapTemporal(
- (value) => convertUnit(node.unit, to, value as number),
- node.temporalValue
- )
- : node.temporalValue
return {
...node,
nodeValue:
node.unit && typeof node.nodeValue === 'number'
? convertUnit(node.unit, to, node.nodeValue)
: node.nodeValue,
- ...(temporalValue && { temporalValue }),
unit: to,
}
}
diff --git a/publicodes/core/source/parse.ts b/publicodes/core/source/parse.ts
index 04cabbb0d..68a8c871b 100644
--- a/publicodes/core/source/parse.ts
+++ b/publicodes/core/source/parse.ts
@@ -22,12 +22,12 @@ import plafond from './mecanisms/plafond'
import plancher from './mecanisms/plancher'
import { mecanismProduct } from './mecanisms/product'
import { mecanismRecalcul } from './mecanisms/recalcul'
+import résoudreRéférenceCirculaire from './mecanisms/résoudre-référence-circulaire'
import situation from './mecanisms/situation'
import { mecanismSum } from './mecanisms/sum'
import { mecanismSynchronisation } from './mecanisms/synchronisation'
import tauxProgressif from './mecanisms/tauxProgressif'
import unité from './mecanisms/unité'
-import variableTemporelle from './mecanisms/variableTemporelle'
import variations, { devariate } from './mecanisms/variations'
import { Context } from './parsePublicodes'
import parseReference from './reference'
@@ -147,6 +147,7 @@ ${e.message}`
}
}
+// Chainable mecanisme in their composition order (first one is applyied first)
const chainableMecanisms = [
applicable,
nonApplicable,
@@ -156,6 +157,7 @@ const chainableMecanisms = [
plafond,
parDéfaut,
situation,
+ résoudreRéférenceCirculaire,
abattement,
]
function parseChainedMecanisms(rawNode, context: Context): ASTNode {
@@ -187,7 +189,6 @@ const parseFunctions = {
somme: mecanismSum,
multiplication: mecanismProduct,
produit: mecanismProduct,
- temporalValue: variableTemporelle,
barème,
grille,
'taux progressif': tauxProgressif,
diff --git a/publicodes/core/source/parsePublicodes.ts b/publicodes/core/source/parsePublicodes.ts
index 3faf4e57d..f90f80b6d 100644
--- a/publicodes/core/source/parsePublicodes.ts
+++ b/publicodes/core/source/parsePublicodes.ts
@@ -1,6 +1,6 @@
import yaml from 'yaml'
import { ParsedRules, Logger } from '.'
-import { transformAST, traverseParsedRules } from './AST'
+import { makeASTTransformer, traverseParsedRules } from './AST'
import parse from './parse'
import { getReplacements, inlineReplacements } from './replacement'
import { Rule, RuleNode } from './rule'
@@ -15,20 +15,17 @@ export type Context = {
logger: Logger
}
-type RawRule = Omit | string | undefined | number
-export type RawPublicodes = Record | string
+type RawRule = Omit | string | number
+export type RawPublicodes = Record
export default function parsePublicodes(
- rawRules: RawPublicodes,
+ rawRules: RawPublicodes | string,
partialContext: Partial = {}
): ParsedRules {
// STEP 1: parse Yaml
let rules =
typeof rawRules === 'string'
- ? (yaml.parse(('' + rawRules).replace(/\t/g, ' ')) as Record<
- string,
- RawRule
- >)
+ ? (yaml.parse(('' + rawRules).replace(/\t/g, ' ')) as RawPublicodes)
: { ...rawRules }
// STEP 2: transpile [ref] writing
@@ -43,13 +40,15 @@ export default function parsePublicodes(
}
Object.entries(rules).forEach(([dottedName, rule]) => {
- if (rule == null) {
- rule = {}
+ if (typeof rule === 'string' || typeof rule === 'number') {
+ rule = {
+ formule: `${rule}`,
+ }
}
if (typeof rule !== 'object') {
- rule = {
- formule: '' + rule,
- }
+ throw new SyntaxError(
+ `Rule ${dottedName} is incorrectly written. Please give it a proper value.`
+ )
}
parse({ nom: dottedName, ...rule }, context)
})
@@ -106,7 +105,7 @@ function transpileRef(object: Record | string | Array) {
}
export const disambiguateReference = (parsedRules: Record) =>
- transformAST((node) => {
+ makeASTTransformer((node) => {
if (node.nodeKind === 'reference') {
const dottedName = disambiguateRuleReference(
parsedRules,
diff --git a/publicodes/core/source/reference.ts b/publicodes/core/source/reference.ts
index 6a4a5afaf..8e98ff256 100644
--- a/publicodes/core/source/reference.ts
+++ b/publicodes/core/source/reference.ts
@@ -1,8 +1,6 @@
-import { EvaluatedNode } from './AST/types'
import { InternalError } from './error'
import { registerEvaluationFunction } from './evaluationFunctions'
import { Context } from './parsePublicodes'
-import { RuleNode } from './rule'
export type ReferenceNode = {
nodeKind: 'reference'
@@ -26,6 +24,7 @@ registerEvaluationFunction('reference', function evaluateReference(node) {
if (!node.dottedName) {
throw new InternalError(node)
}
+
const explanation = this.evaluate(this.parsedRules[node.dottedName])
return {
...node,
diff --git a/publicodes/core/source/replacement.tsx b/publicodes/core/source/replacement.tsx
index 04dcac90c..e781a0eaf 100644
--- a/publicodes/core/source/replacement.tsx
+++ b/publicodes/core/source/replacement.tsx
@@ -1,5 +1,5 @@
import { Logger } from '.'
-import { transformAST } from './AST'
+import { makeASTTransformer } from './AST'
import { ASTNode } from './AST/types'
import { InternalError, warning } from './error'
import { defaultNode } from './evaluation'
@@ -25,7 +25,7 @@ export type ReplacementRule = {
//
// The implementation works by first attributing an identifier for each
// replacementRule. We then use this identifier to create a cache key that
-// represent the combinaison of applicables replacements for a given reference.
+// represents the combinaison of applicables replacements for a given reference.
// For example if replacements 12, 13 et 643 are applicable we use the key
// `12-13-643` as the cache identifier in the `inlineReplacements` function.
let remplacementRuleId = 0
@@ -104,31 +104,31 @@ export function inlineReplacements(
replacements: Record>,
logger: Logger
): (n: ASTNode) => ASTNode {
- return transformAST((n, fn) => {
+ return makeASTTransformer((node, transform) => {
if (
- n.nodeKind === 'replacementRule' ||
- n.nodeKind === 'inversion' ||
- n.nodeKind === 'une possibilité'
+ node.nodeKind === 'replacementRule' ||
+ node.nodeKind === 'inversion' ||
+ node.nodeKind === 'une possibilité'
) {
return false
}
- if (n.nodeKind === 'recalcul') {
+ if (node.nodeKind === 'recalcul') {
// We don't replace references in recalcul keys
return {
- ...n,
+ ...node,
explanation: {
- recalcul: fn(n.explanation.recalcul),
- amendedSituation: n.explanation.amendedSituation.map(
- ([name, value]) => [name, fn(value)]
+ recalcul: transform(node.explanation.recalcul),
+ amendedSituation: node.explanation.amendedSituation.map(
+ ([name, value]) => [name, transform(value)]
),
},
}
}
- if (n.nodeKind === 'reference') {
- if (!n.dottedName) {
- throw new InternalError(n)
+ if (node.nodeKind === 'reference') {
+ if (!node.dottedName) {
+ throw new InternalError(node)
}
- return replace(n, replacements[n.dottedName] ?? [], logger)
+ return replace(node, replacements[node.dottedName] ?? [], logger)
}
})
}
diff --git a/publicodes/core/source/rule.ts b/publicodes/core/source/rule.ts
index d4493aec1..cf16a7425 100644
--- a/publicodes/core/source/rule.ts
+++ b/publicodes/core/source/rule.ts
@@ -1,6 +1,8 @@
import { ASTNode, EvaluatedNode } from './AST/types'
+import { warning } from './error'
import { bonus, mergeMissing } from './evaluation'
import { registerEvaluationFunction } from './evaluationFunctions'
+import { capitalise0 } from './format'
import parse, { mecanismKeys } from './parse'
import { Context } from './parsePublicodes'
import { ReferenceNode } from './reference'
@@ -10,7 +12,6 @@ import {
ReplacementRule,
} from './replacement'
import { nameLeaf, ruleParents } from './ruleUtils'
-import { capitalise0 } from './format'
export type Rule = {
formule?: Record | string
@@ -119,25 +120,54 @@ export default function parseRule(
}
registerEvaluationFunction('rule', function evaluate(node) {
- if (this.cache[node.dottedName]) {
- return this.cache[node.dottedName]
- }
const explanation = { ...node.explanation }
-
- const verifyParentApplicability = !this.cache._meta.ruleStack.includes(
- node.dottedName
- )
- this.cache._meta.ruleStack.unshift(node.dottedName)
let parent: EvaluatedNode | null = null
- if (explanation.parent && verifyParentApplicability) {
- parent = this.evaluate(explanation.parent) as EvaluatedNode
+ if (explanation.parent) {
+ if (this.cache._meta.parentRuleStack.includes(node.dottedName)) {
+ parent = { nodeValue: null } as EvaluatedNode
+ } else {
+ this.cache._meta.parentRuleStack.unshift(node.dottedName)
+ parent = this.evaluate(explanation.parent) as EvaluatedNode
+ this.cache._meta.parentRuleStack.shift()
+ }
explanation.parent = parent
}
let valeur: EvaluatedNode | null = null
if (!parent || parent.nodeValue !== false) {
- valeur = this.evaluate(explanation.valeur) as EvaluatedNode
+ if (
+ this.cache._meta.evaluationRuleStack.filter(
+ (dottedName) => dottedName === node.dottedName
+ ).length > 15
+ // I don't know why this magic number, but below, cycle are
+ // detected "too early", which leads to blank value in brut-net simulator
+ ) {
+ warning(
+ this.options.logger,
+ node.dottedName,
+ `
+ Un cycle a été détecté dans lors de l'évaluation de cette règle.
+ Par défaut cette règle sera évaluée à 'null'.
+
+ Pour indiquer au moteur de résoudre la référence circulaire en trouvant le point fixe
+ de la fonction, il vous suffit d'ajouter l'attribut suivant niveau de la règle :
+
+ ${node.dottedName}:
+ "résoudre la référence circulaire: oui"
+ ...
+
+ `
+ )
+
+ valeur = { nodeValue: null } as EvaluatedNode
+ } else {
+ this.cache._meta.evaluationRuleStack.unshift(node.dottedName)
+ valeur = this.evaluate(explanation.valeur) as EvaluatedNode
+ this.cache._meta.evaluationRuleStack.shift()
+ }
+
explanation.valeur = valeur
}
+
const evaluation = {
...node,
explanation,
@@ -148,7 +178,6 @@ registerEvaluationFunction('rule', function evaluate(node) {
),
...(valeur && 'unit' in valeur && { unit: valeur.unit }),
}
- this.cache._meta.ruleStack.shift()
- this.cache[node.dottedName] = evaluation
+
return evaluation
})
diff --git a/publicodes/core/source/temporal.ts b/publicodes/core/source/temporal.ts
deleted file mode 100644
index 14cbd2e79..000000000
--- a/publicodes/core/source/temporal.ts
+++ /dev/null
@@ -1,430 +0,0 @@
-import {
- convertToDate,
- getDifferenceInDays,
- getDifferenceInMonths,
- getDifferenceInYears,
- getRelativeDate,
- getYear,
-} from './date'
-import { Unit, Evaluation, Types, ASTNode, EvaluatedNode } from './AST/types'
-
-export type Period = {
- start: T | null
- end: T | null
-}
-
-export function parsePeriod(word: string, date: Date): Period {
- const startWords = [
- 'depuis',
- 'depuis le',
- 'depuis la',
- 'à partir de',
- 'à partir du',
- 'du',
- ]
- const endWords = [
- "jusqu'à",
- "jusqu'au",
- "jusqu'à la",
- 'avant',
- 'avant le',
- 'avant la',
- 'au',
- ]
- const intervalWords = ['le', 'en']
- if (!startWords.concat(endWords, intervalWords).includes(word)) {
- throw new SyntaxError(
- `Le mot clé '${word}' n'est pas valide. Les mots clés possible sont les suivants :\n\t ${startWords.join(
- ', '
- )}`
- )
- }
- if (word === 'le') {
- return {
- start: date,
- end: date,
- }
- }
- if (word === 'en') {
- return { start: null, end: null }
- }
- if (startWords.includes(word)) {
- return {
- start: date,
- end: null,
- }
- }
- if (endWords.includes(word)) {
- return {
- start: null,
- end: date,
- }
- }
- throw new Error('Non implémenté')
-}
-
-export type TemporalNode = Temporal
-export type Temporal = Array & { value: T }>
-
-export function narrowTemporalValue(
- period: Period,
- temporalValue: Temporal>
-): Temporal> {
- return liftTemporal2(
- (value, filter) => filter && value,
- temporalValue,
- createTemporalEvaluation(true, period)
- )
-}
-
-// Returns a temporal value that's true for the given period and false otherwise.
-export function createTemporalEvaluation(
- value: Evaluation,
- period: Period = { start: null, end: null }
-): Temporal> {
- const temporalValue = [{ ...period, value }]
- if (period.start != null) {
- temporalValue.unshift({
- start: null,
- end: getRelativeDate(period.start, -1),
- value: false,
- })
- }
- if (period.end != null) {
- temporalValue.push({
- start: getRelativeDate(period.end, 1),
- end: null,
- value: false,
- })
- }
- return temporalValue
-}
-
-export function pureTemporal(value: T): Temporal {
- return [{ start: null, end: null, value }]
-}
-
-export function mapTemporal(
- fn: (value: T1) => T2,
- temporalValue: Temporal
-): Temporal {
- return temporalValue.map(({ start, end, value }) => ({
- start,
- end,
- value: fn(value),
- }))
-}
-export function sometime(
- fn: (value: T1) => boolean,
- temporalValue: Temporal
-): boolean {
- return temporalValue.some(({ start, end, value }) => fn(value))
-}
-
-export function liftTemporal2(
- fn: (value1: T1, value2: T2) => T3,
- temporalValue1: Temporal,
- temporalValue2: Temporal
-): Temporal {
- return mapTemporal(
- ([a, b]) => fn(a, b),
- zipTemporals(temporalValue1, temporalValue2)
- )
-}
-
-export function concatTemporals(
- temporalValues: Array>
-): Temporal> {
- return temporalValues.reduce(
- (values, value) => liftTemporal2((a, b) => [...a, b], values, value),
- pureTemporal([]) as Temporal>
- )
-}
-
-export function liftTemporalNode(
- node: N
-): Temporal>> {
- if (!('temporalValue' in node)) {
- return pureTemporal(node)
- }
- const { temporalValue, ...baseNode } = node as N & {
- temporalValue: Temporal>
- }
- return mapTemporal(
- (nodeValue) => ({
- ...baseNode,
- nodeValue,
- }),
- temporalValue
- )
-}
-
-export function zipTemporals(
- temporalValue1: Temporal,
- temporalValue2: Temporal,
- acc: Temporal<[T1, T2]> = []
-): Temporal<[T1, T2]> {
- if (!temporalValue1.length && !temporalValue2.length) {
- return acc
- }
- const [value1, ...rest1] = temporalValue1
- const [value2, ...rest2] = temporalValue2
- console.assert(value1.start === value2.start)
- const endDateComparison = compareEndDate(value1.end, value2.end)
-
- // End dates are equals
- if (endDateComparison === 0) {
- return zipTemporals(rest1, rest2, [
- ...acc,
- { ...value1, value: [value1.value, value2.value] },
- ])
- }
- // Value1 lasts longuer than value1
- if (endDateComparison > 0) {
- console.assert(value2.end !== null)
- return zipTemporals(
- [
- { ...value1, start: getRelativeDate(value2.end as string, 1) },
- ...rest1,
- ],
- rest2,
- [
- ...acc,
- {
- ...value2,
- value: [value1.value, value2.value],
- },
- ]
- )
- }
-
- // Value2 lasts longuer than value1
- if (endDateComparison < 0) {
- console.assert(value1.end !== null)
- return zipTemporals(
- rest1,
- [
- { ...value2, start: getRelativeDate(value1.end as string, 1) },
- ...rest2,
- ],
- [
- ...acc,
- {
- ...value1,
- value: [value1.value, value2.value],
- },
- ]
- )
- }
- throw new EvalError('All case should have been covered')
-}
-
-function beginningOfNextYear(date: string): string {
- return `01/01/${getYear(date) + 1}`
-}
-
-function endsOfPreviousYear(date: string): string {
- return `31/12/${getYear(date) - 1}`
-}
-
-function splitStartsAt(
- fn: (date: string) => string,
- temporal: Temporal