diff --git a/jest.config.js b/jest.config.js index 5f6772e4b..606925661 100644 --- a/jest.config.js +++ b/jest.config.js @@ -64,9 +64,7 @@ module.exports = { // maxWorkers: "50%", // An array of directory names to be searched recursively up from the requiring module's location - // moduleDirectories: [ - // "node_modules" - // ], + moduleDirectories: ['node_modules', 'sources'], // An array of file extensions your modules use // moduleFileExtensions: [ diff --git a/netlify.toml b/netlify.toml index 4ac79940f..c3c7e2a39 100644 --- a/netlify.toml +++ b/netlify.toml @@ -201,6 +201,12 @@ to = "/prerender/mon-entreprise/g%C3%A9rer/index.html" status = 200 +[[redirects]] + from = "/coronavirus" + to = "/prerender/mon-entreprise/coronavirus/index.html" + status = 200 + + [[redirects]] from = "/simulateurs/salari%C3%A9" to = "/prerender/mon-entreprise/simulateurs/salari%C3%A9/index.html" @@ -231,6 +237,11 @@ to = "/prerender/mon-entreprise/iframes/simulateur-embauche/index.html" status = 200 +[[redirects]] + from = "/iframes/simulateur-chomage-partiel" + to = "/prerender/mon-entreprise/iframes/simulateur-chomage-partiel/index.html" + status = 200 + [[redirects]] from = "/*" to = "/mon-entreprise.html" diff --git a/publicode/rules.js b/publicode/rules.js index a4979d99d..5e2af3274 100644 --- a/publicode/rules.js +++ b/publicode/rules.js @@ -4,6 +4,7 @@ import artisteAuteur from './rules/artiste-auteur.yaml' import base from './rules/base.yaml' +import chômagePartiel from './rules/chômage-partiel.yaml' import CCBatiment from './rules/conventions-collectives/bâtiment.yaml' import CCHotels from './rules/conventions-collectives/hôtels-cafés-restaurants.yaml' import CCOptique from './rules/conventions-collectives/optique.yaml' @@ -33,7 +34,8 @@ const rules = { ...CCOptique, ...CCSpectacleVivant, ...CCSport, - ...situationPersonnelle + ...situationPersonnelle, + ...chômagePartiel } export default rules diff --git a/publicode/rules/base.yaml b/publicode/rules/base.yaml index dbe649cd7..7d7ba09e3 100644 --- a/publicode/rules/base.yaml +++ b/publicode/rules/base.yaml @@ -37,3 +37,24 @@ SMIC horaire: références: décret: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000037833206 service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F2300 + +SMIC temps plein: + unité: €/mois + + formule: + produit: + assiette: contrat salarié . temps de travail . base légale * période . semaines par mois + facteur: SMIC horaire + références: + décret: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000037833206 + +SMIC temps plein . net imposable: + titre: SMIC net imposable + description: Montant du SMIC net imposable pour un temps plein. + formule: + recalcul: + règle: contrat salarié . rémunération . net imposable . base + avec: + contrat salarié . rémunération . brut de base: SMIC temps plein + références: + barème PAS: https://bofip.impots.gouv.fr/bofip/11255-PGP.html diff --git a/publicode/rules/chômage-partiel.yaml b/publicode/rules/chômage-partiel.yaml new file mode 100644 index 000000000..6398134e3 --- /dev/null +++ b/publicode/rules/chômage-partiel.yaml @@ -0,0 +1,12 @@ +baisse de revenu chômage partiel: + formule: + allègement: + assiette: net sans chômage partiel + abattement: contrat salarié . rémunération . net + +baisse de revenu chômage partiel . net sans chômage partiel: + formule: + recalcul: + règle: contrat salarié . rémunération . net + avec: + contrat salarié . activité partielle: non diff --git a/publicode/rules/conventions-collectives/bâtiment.yaml b/publicode/rules/conventions-collectives/bâtiment.yaml index 3fb3f0a48..0061bc3e5 100644 --- a/publicode/rules/conventions-collectives/bâtiment.yaml +++ b/publicode/rules/conventions-collectives/bâtiment.yaml @@ -132,6 +132,7 @@ contrat salarié . convention collective . BTP . cotisations conventionnelles: - OPPBTP contrat salarié . convention collective . BTP . congés intempéries: + rend non applicable: CDD . compensation pour congés non pris formule: produit: assiette: cotisations . assiette @@ -157,6 +158,7 @@ contrat salarié . convention collective . BTP . congés intempéries: alors: 19.90% références: CIBTP: https://www.cibtp.fr/ + Article L3141-30 du Code du Travail: https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=DF6E6424807679A6EDC2915496BEA32D.tplgfr22s_2?idArticle=LEGIARTI000033020675&cidTexte=LEGITEXT000006072050&dateTexte=20200320 contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement: question: À quelle caisse l'entreprise est-elle rattachée pour le versement de la cotisation congés intempéries ? diff --git a/publicode/rules/conventions-collectives/spectacle-vivant.yaml b/publicode/rules/conventions-collectives/spectacle-vivant.yaml index 15b109d4f..2854ce57b 100644 --- a/publicode/rules/conventions-collectives/spectacle-vivant.yaml +++ b/publicode/rules/conventions-collectives/spectacle-vivant.yaml @@ -79,12 +79,14 @@ contrat salarié . intermittents du spectacle . formation professionnelle: taux: 2.10% contrat salarié . intermittents du spectacle . caisse des congés spectacle: + rend non applicable: CDD . compensation pour congés non pris formule: produit: assiette: rémunération . brut taux: 15.40% références: audiens.org: https://www.audiens.org/files/live/sites/siteAudiens/files/03_documents/entreprise/Fiches-techniques/Conges-Spectacles-Mode-d-emploi-employeur-2019.pdf + Article L3141-30 du Code du Travail: https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=DF6E6424807679A6EDC2915496BEA32D.tplgfr22s_2?idArticle=LEGIARTI000033020675&cidTexte=LEGITEXT000006072050&dateTexte=20200320 contrat salarié . intermittents du spectacle . retraite complémentaire techniciens et cadre: applicable si: diff --git a/publicode/rules/impôt.yaml b/publicode/rules/impôt.yaml index cd125770e..ddde68d75 100644 --- a/publicode/rules/impôt.yaml +++ b/publicode/rules/impôt.yaml @@ -91,7 +91,7 @@ impôt . revenu imposable . abattement contrat court: - contrat salarié . CDD - contrat salarié . CDD . durée contrat <= 2 mois formule: - arrondi: 50% * contrat salarié . SMIC temps plein . net imposable * 1 mois + arrondi: 50% * SMIC temps plein . net imposable * 1 mois note: Cet abattement s'applique aussi pour les conventions de stage ou les contrats de mission (intérim) de moins de 2 mois. références: Bofip - dispositions spécifiques aux contrats courts: https://bofip.impots.gouv.fr/bofip/11252-PGP.html?identifiant=BOI-IR-PAS-20-20-30-10-20180515 diff --git a/publicode/rules/protection-sociale.yaml b/publicode/rules/protection-sociale.yaml index 2df0e2685..af5d643aa 100644 --- a/publicode/rules/protection-sociale.yaml +++ b/publicode/rules/protection-sociale.yaml @@ -319,7 +319,7 @@ protection sociale . santé . indemnités journalières . salarié: produit: assiette: revenu moyen [€/jour] taux: 50% - plafond: 1.8 * contrat salarié . SMIC temps plein [€/jour] + plafond: 1.8 * SMIC temps plein [€/jour] reférences: service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F3053 diff --git a/publicode/rules/salarié.yaml b/publicode/rules/salarié.yaml index 8bbcd9333..8e42e9ba0 100644 --- a/publicode/rules/salarié.yaml +++ b/publicode/rules/salarié.yaml @@ -205,6 +205,167 @@ contrat salarié . frais professionnels . indemnité kilométrique vélo . dista 10 km/jour: 200 par défaut: 80 +contrat salarié . activité partielle: + question: Le salarié est-il en chômage partiel ? + description: >- + À la suite de la crise du Coronavirus, le gouvernement a mis en place un + dispositif de chômage partiel étendu dans lequel l'État prend en charge + l'indemnisation des heures chômées jusqu’à 4,5 SMIC. + + La déclaration d'activité partielle est simplifiée est l'effet est + rétroactif. + + par défaut: non + rend non applicable: + - temps de travail . heures supplémentaires + - temps de travail . heures complémentaires + références: + déclaration employeur: https://activitepartielle.emploi.gouv.fr/aparts/ + service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F23503 + economie.gouv.fr: https://www.economie.gouv.fr/entreprises/activite-partielle + urssaf.fr: https://www.urssaf.fr/portail/home/employeur/reduire-ou-cesser-lactivite/lactivite-partielle.html + +contrat salarié . activité partielle . rémunération mensuelle minimale: + acronyme: RMM + description: >- + Les salariés à temps plein dont l’horaire de travail est réduit ont droit à + une rémunération mensuelle minimale qui peut donner lieu à un versement + complémentaire de l’employeur. + références: + Article L3232-3 du code du travail: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000006902847&cidTexte=LEGITEXT000006072050&dateTexte=20080501 + formule: + recalcul: + règle: contrat salarié . rémunération . net de cotisations + avec: + rémunération . brut de base: SMIC contractuel + activité partielle: non + +contrat salarié . activité partielle . heures chômées: + unité: heures/mois + formule: + produit: + assiette: temps de travail . temps contractuel + taux: 100% - proportion heures travaillées + +contrat salarié . activité partielle . proportion heures travaillées: + titre: proportion heures travaillées + question: Quelle est la proportion d'heures travaillées sur le mois ? + description: >- + Dans le cadre du chômage partiel, la proportion d'heure travaillées correspond + au ratio du nombre d'heures travaillées par rapport au temps de travail + contractuel habituel. + + Un ratio de 0% signifie que l'employé n'a pas travaillé ce mois ci. + Un ratio de 100% signifie que l'employé a effectué toutes ces heures contractuelles. + + Les heures supplémentaires, même habituelles, ne sont pas prises en compte. + unité: '%' + par défaut: 0 + suggestions: + 0%: 0 + 20%: 20 + 50%: 50 + +contrat salarié . activité partielle . indemnités: + titre: indemnités activité partielle + description: >- + La mise en chômage partiel ouvre droit non au paiement d’un salaire mais à + l’allocation spécifique. Pour chaque heure chômée indemnisable, le salarié + reçoit de l'entreprise une indemnité. L'entreprise obtient en contrepartie de + l’Etat une allocation d’activité partielle. + + Si après versement de l’indemnité d’activité partielle la rémunération du + salarié est inférieure à la rémunération mensuelle minimale (RMM garantie par + les articles L3232-1 et suivants du code du travail pour les salariés à temps + plein), l'employeur doit lui verser une allocation complémentaire qui est égale + à la différence entre la rémunération mensuelle minimale (ou Smic net) et la + somme initialement perçue par le salarié. + + formule: + somme: + - base + - complémentaire + - conventionnelle + références: + urssaf.fr: https://www.urssaf.fr/portail/home/employeur/reduire-ou-cesser-lactivite/lactivite-partielle.html + +contrat salarié . activité partielle . indemnités . base: + titre: indemnités d'activité partielle de base + formule: + multiplication: + assiette: retrait absence + taux: 70% + +contrat salarié . activité partielle . indemnités . complémentaire: + titre: indemnité complémentaire + description: >- + L'indemnité complémentaire de chômage partielle est une indemnité versée par + l'entreprise pour les salaires proches du SMIC permettant de s'assurer que + rémunération effectivement perçue ne soit jamais inférieure à celle + du SMIC net. + formule: + allègement: + assiette: rémunération mensuelle minimale + abattement: + somme: + - rémunération . net de cotisations + - indemnités . base + +contrat salarié . activité partielle . indemnités . conventionnelle: + applicable si: convention syntec + formule: + produit: + assiette: rémunération . assiette congés payés + taux: + grille: + assiette: rémunération . assiette congés payés + tranches: + - montant: 95% - 70% + plafond: 2000€ + - montant: 80% - 70% + plafond: plafond sécurité sociale temps plein + - montant: 75% - 70% + références: + Legifrance: https://www.legifrance.gouv.fr/affichIDCCArticle.do?idArticle=KALIARTI000028465400&cidTexte=KALITEXT000028465378&dateTexte=29990101&categorieLien=id + Juritravail: https://www.juritravail.com/Actualite/Hygiene-securite-travail-employeur/Id/327284 + +contrat salarié . activité partielle . retrait absence: + titre: retrait activité partielle + formule: + multiplication: + assiette: rémunération . taux horaire + facteur: heures chômées + +contrat salarié . activité partielle . indemnisation entreprise: + titre: Remboursement de l'indemnité d'activité partielle + description: >- + Dans le cadre de la crise du Coronavirus, le gouvernement a anoncé que + l'indemnité de chômage partiel sera prise à 100% en charge par l'état. + formule: + encadrement: + valeur: indemnités . base + plancher: 8.03 €/heure * heures chômées + plafond: + recalcul: + avec: + rémunération . brut de base: 4.5 * SMIC + +# TODO : This should be merged with other convention collectives +contrat salarié . activité partielle . convention syntec: + question: La convention collective Syntec est-elle applicable à l'entreprise ? + description: >- + Convention Collective applicable aux salariés des Bureaux d'Études + Techniques, des Cabinets d'Ingénieurs-Conseils et des Sociétés de Conseils. + + Cette convention collective prévoit notamment une majoration de l'indemnité + de chômage partielle au dessus du minimum légal et à la charge de + l'entreprise. + par défaut: non + rend non applicable: + # TODO: this is not working, the question is still displayed. This should be + # fixed but is not critical + - profession spécifique + contrat salarié . déduction forfaitaire spécifique: description: >- Pour une liste précise de professions, l'employeur peut pratiquer une @@ -217,7 +378,7 @@ contrat salarié . déduction forfaitaire spécifique: titre: assiette avec DFS remplace: règle: cotisations . assiette - sauf dans: contrat salarié . CSG + sauf dans: contrat salarié . CSG et CRDS # TODO: ajouter pas d'abattement pour l'assurance chômage mais seulement # pour les journalistes. Nécessite probablement de faire un re-remplacement # inverse. @@ -235,13 +396,13 @@ contrat salarié . déduction forfaitaire spécifique: contrat salarié . déduction forfaitaire spécifique . taux: formule: variations: - - si: profession = 'journaliste' + - si: profession spécifique = 'journaliste' alors: 20% - - si: profession = 'ouvrier du bâtiment' + - si: profession spécifique = 'ouvrier du bâtiment' alors: 10% - - si: profession = 'artiste musicien' + - si: profession spécifique = 'artiste musicien' alors: 20% - - si: profession = 'pilote de ligne ou personnel navigant' + - si: profession spécifique = 'pilote de ligne ou personnel navigant' alors: 30% - sinon: 0% références: @@ -356,7 +517,7 @@ contrat salarié . CDD . compensation pour congés non pris: formule: le maximum de: - produit: - assiette: assiette mensuelle + assiette: rémunération . assiette congés payés taux: 10% facteur: proportion congés non pris - produit: @@ -408,15 +569,10 @@ contrat salarié . CDD . congés dus en jours ouvrés: contrat salarié . congés dus par mois: formule: 25 jour ouvré / 12 mois -contrat salarié . CDD . compensation pour congés non pris . assiette mensuelle: - unité: €/mois - - formule: rémunération . brut de base + prime de fin de contrat - contrat salarié . CDD . compensation pour congés non pris . salaire journalier: unité: €/jour ouvré - formule: assiette mensuelle / période . jours ouvrés moyen par mois + formule: rémunération . assiette congés payés / période . jours ouvrés moyen par mois contrat salarié . CDD . prime de fin de contrat: indemnité: @@ -770,8 +926,7 @@ contrat salarié . apprentissage: Le contrat d'apprentissage est un contrat de travail écrit à durée limitée (CDD) ou à durée indéterminée (CDI) entre un salarié et un employeur. Il permet à l'apprenti de suivre une formation en alternance en entreprise sous la responsabilité d'un maître d'apprentissage et en centre de formation des apprentis (CFA) pendant 1 à 3 ans. formule: contrat salarié = 'apprentissage' rend non applicable: - - CSG - - CRDS + - CSG et CRDS - statut cadre - statut JEI - régime des impatriés @@ -916,13 +1071,13 @@ contrat salarié . cotisations . assiette minimale: recalcul: règle: rémunération . assiette de vérification du SMIC avec: - rémunération . brut de base: SMIC + rémunération . brut de base: SMIC horaire * temps de travail . effectif contrat salarié . rémunération . brut de base: titre: Salaire brut - résumé: Brut de base inscrit dans le contrat de travail + résumé: Brut de référence (sans les primes, indemnités ni majorations) type: salaire - question: Quel est le salaire de base ? + question: Quel est votre salaire brut ? description: | C'est le salaire *brut* régulier inscrit dans le contrat de travail. Il ne change jamais entre les mois et ne peut pas être modifié sans signature des deux parties. @@ -985,6 +1140,10 @@ contrat salarié . rémunération . brut de base . équivalent temps plein: salaire médian: 2300 SMIC: 1522 +contrat salarié . rémunération . taux horaire: + unité: €/heure + formule: assiette de vérification du SMIC / temps de travail + contrat salarié . rémunération . taux horaire des heures supplémentaires et complémentaires: description: > Le taux horaire utilisé pour calculer la rémunération liée au heures @@ -1014,6 +1173,26 @@ contrat salarié . rémunération . assiette de vérification du SMIC: payées (et non de manière lissée sur l'année), c'est pourquoi nous ne les incluons pas dans cette formule. +contrat salarié . rémunération . assiette congés payés: + titre: Assiette pour le calcul de l'indemnité de congés payés + description: >- + Pendant ses congés, le salarié ne perçoit pas son salaire. Il perçoit une + indemnité de congés payés. + + Toutes les sommes ayant le caractère de salaire sont prises en compte pour + déterminer l'indemnité de congés payés. Les autres sommes ne sont pas prise en + compte. + formule: + somme: + - brut de base + - heures supplémentaires + - heures complémentaires + - avantages en nature + - primes . ancienneté + - primes . activité + références: + service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F33359 + contrat salarié . rémunération . primes: description: | Les primes sont des compléments de salaire versés au salarié en vertu du @@ -1098,16 +1277,19 @@ contrat salarié . rémunération . brut: # et de retraite complémentaire on ne ré-intègre ici que la part employeur # (car la part salarié est déjà comptabilisé dans `rémunération . brut de # base` dont elle vient en déduction). - somme: - - rémunération . brut de base - - avantages en nature . montant - - primes - - CDD . indemnités salarié - - heures supplémentaires - - heures complémentaires - - frais professionnels - - prévoyance . employeur - - retraite supplémentaire . employeur + allègement: + assiette: + somme: + - rémunération . brut de base + - avantages en nature . montant + - primes + - CDD . indemnités salarié + - heures supplémentaires + - heures complémentaires + - frais professionnels + - prévoyance . employeur + - retraite supplémentaire . employeur + abattement: activité partielle . retrait absence contrat salarié . rémunération . heures supplémentaires: titre: rémunération heures supplémentaires @@ -1135,6 +1317,25 @@ contrat salarié . rémunération . heures complémentaires: - temps de travail . heures complémentaires - temps de travail . heures complémentaires . majoration +contrat salarié . rémunération . revenus de remplacement: + description: >- + Les revenus de remplacement sont les revenus perçus en remplacement de la + rémunération du travail : allocations de chômage ou de chômage partiel, + indemnités maladie ou accident du travail, pension de retraite, revenu + d'intégration sociale, etc. + + Ces revenus sont imposables mais sont exonérés de cotisations sociales. Ils + sont soumis à la CSG/CRDS avec un taux spécifique. + formule: + somme: + - activité partielle . indemnités + note: >- + L'indemnité complémentaire n'est pas ajoutée ici car elle est + systématiquement exonérée de CSG du fait de l'écrêtement pour les bas + revenus. + + L'ajouter abouti à un calcul cyclique (vu qu'elle dépend du montant de la CSG) + contrat salarié . avantages sociaux: description: > Ce sont les avantages sociaux payés par l'employeur. Ils sont spécifiques à l'entreprise, et fournis par des structures privées (mutuelle, assurance...). @@ -1309,27 +1510,6 @@ contrat salarié . plafond sécurité sociale . renonciation proratisation: - règle: plafond sécurité sociale par: plafond sécurité sociale temps plein -contrat salarié . SMIC temps plein: - unité: €/mois - - formule: - produit: - assiette: temps de travail . base légale * période . semaines par mois - facteur: SMIC horaire - références: - décret: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000037833206 - -contrat salarié . SMIC temps plein . net imposable: - titre: SMIC net imposable - description: Montant du SMIC net imposable pour un temps plein. - formule: - recalcul: - règle: rémunération . net imposable . base - avec: - rémunération . brut de base: SMIC temps plein - références: - barème PAS: https://bofip.impots.gouv.fr/bofip/11255-PGP.html - contrat salarié . SMIC contractuel: description: > Valeur du SMIC pro-ratisé pour prendre en compte le temps partiel et utilisé pour la détermination du salaire minimum @@ -1355,8 +1535,7 @@ contrat salarié . cotisations . salariales: - contribution d'équilibre général .salarié - contribution d'équilibre technique .salarié - chômage .salarié - - CSG - - CRDS + - CSG et CRDS - APEC .salarié - complémentaire santé .salarié - conventionnelles @@ -1398,8 +1577,17 @@ contrat salarié . rémunération . net de cotisations: titre: Salaire net de cotisations type: rémunération unité: €/mois + formule: + somme: + - brut + - (- cotisations . salariales) - formule: brut - cotisations . salariales +contrat salarié . rémunération . net avec revenus de remplacement: + formule: + somme: + - net de cotisations + - revenus de remplacement + - (- CSG et CRDS . revenus de remplacement) contrat salarié . rémunération . net imposable: titre: Salaire net imposable @@ -1408,27 +1596,25 @@ contrat salarié . rémunération . net imposable: description: | C'est la base utilisée pour calculer l'impôt sur le revenu. formule: - allègement: - assiette: base - abattement: - somme: - - frais professionnels . part déductible - - prime d'impatriation - - exonération d'impôt des stagiaires et apprentis - - heures supplémentaires et complémentaires défiscalisées - - retraite supplémentaire . exonération fiscale - - prévoyance . exonération fiscale + somme: + - base + - (- frais professionnels . part déductible) + - (- prime d'impatriation) + - (- exonération d'impôt des stagiaires et apprentis) + - (- heures supplémentaires et complémentaires défiscalisées) + - (- retraite supplémentaire . exonération fiscale) + - (- prévoyance . exonération fiscale) références: DSN: https://dsn-info.custhelp.com/app/answers/detail/a_id/2110 contrat salarié . rémunération . net imposable . base: + titre: net imposable avant exonérations description: Le net imposable avant les exonérations et déductions formule: somme: - - rémunération . net de cotisations + - net avec revenus de remplacement - avantages sociaux - - CSG .non déductible - - CRDS + - CSG et CRDS . non déductible contrat salarié . rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées: formule: @@ -1459,8 +1645,9 @@ contrat salarié . prime d'impatriation: contrat salarié . rémunération . net: titre: Salaire net + unité: €/mois type: salaire - question: Quel est le salaire net ? + question: Quel est votre salaire net ? résumé: Salaire net avant impôt description: >- C'est le montant que le salarié toucherait à la fin du mois avant de payer @@ -1475,12 +1662,10 @@ contrat salarié . rémunération . net: le changer, il faut signer un avenant au contrat). formule: - allègement: - assiette: rémunération . net de cotisations - abattement: - somme: - - avantages en nature . montant - - frais professionnels . titres-restaurant . montant + somme: + - net avec revenus de remplacement + - (- avantages en nature . montant) + - (- frais professionnels . titres-restaurant . montant) contrat salarié . rémunération . net après impôt: titre: Salaire net après impôt @@ -1519,7 +1704,7 @@ contrat salarié . prix du travail: contrat salarié . rémunération . total: titre: Total chargé - question: Quel est la rémunération chargée ? + question: Quelle est la rémunération chargée ? résumé: Dépensé par l'entreprise type: salaire unité par défaut: €/mois @@ -1529,6 +1714,7 @@ contrat salarié . rémunération . total: somme: - brut - cotisations . patronales + - activité partielle . indemnités contrat salarié . cotisations . patronales . réductions de cotisations: formule: @@ -1624,9 +1810,8 @@ contrat salarié . cotisations . patronales . conventionnelles: formule: 0 contrat salarié . aides employeur: - titre: aides à l'embauche + titre: aides employeur résumé: Pour l'employeur, différées dans le temps - icônes: 🎁 description: | Ces aides sont appelées différées, car elles ne consistent pas en une simple réduction des cotisations mensuelles : elles interviendront a posteriori par exemple sous forme de crédit d'impôt. @@ -1634,8 +1819,8 @@ contrat salarié . aides employeur: formule: somme: - aide à l'embauche d'apprentis + - activité partielle . indemnisation entreprise - emploi franc - note: contrat salarié . aides employeur . aide à l'embauche d'apprentis: description: | @@ -1707,6 +1892,12 @@ contrat salarié . temps de travail: - heures complémentaires description: En France, la base légale du travail est de 35h/semaine. Mais un grand nombre de dispositions existantes permettent de faire varier ce nombre. Vous pouvez les retrouver sur la page [service-public.fr](https://www.service-public.fr/particuliers/vosdroits/N458) dédiée. +contrat salarié . temps de travail . effectif: + formule: + somme: + - temps de travail + - (- activité partielle . heures chômées) + contrat salarié . temps de travail . temps contractuel: unité: heures/mois formule: @@ -2381,21 +2572,42 @@ contrat salarié . contribution au dialogue social: assiette: cotisations . assiette taux: 0.016% -contrat salarié . assiette CSG et CRDS: - note: Cette assiette est complexe, cette version n'est qu'une simplification. +contrat salarié . CSG et CRDS: + description: >- + La CSG et la CRDS sont dues par tous les salariés remplissant les deux + conditions suivantes : + + - ils sont domiciliés fiscalement en France, + - ils sont à la charge d’un régime français d’assurance maladie obligatoire. + + Si l’un des deux critères n’est pas rempli, la CSG et la CRDS ne sont pas + dues, à la condition d’en apporter la preuve (justificatif fiscal ou carte + d’assuré social). + formule: + somme: + - CSG + - CRDS + +contrat salarié . CSG et CRDS . assiette de base: références: calcul: https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/les-taux-de-cotisations/la-csg-crds/les-revenus-salariaux-soumis-a-l.html abattement: https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/les-taux-de-cotisations/la-csg-crds/abattement-et-deductions/les-revenus-exclus-de-labattemen.html heures supplémentaires: https://dsn-info.custhelp.com/app/answers/detail/a_id/2110 formule: somme: - - assiette abattue + - assiette abattue totale + # TODO : ce sont les cotisations forfaitaires qui ne rentrent pas dans + # l'abattue, et non tous les avantages sociaux - avantages sociaux + # - (- assiette revenu remplacements) + - (- assiette heures supplémentaires et complémentaires défiscalisées) -contrat salarié . assiette CSG et CRDS . assiette abattue: +contrat salarié . CSG et CRDS . assiette abattue totale: formule: barème: - assiette: cotisations . assiette + assiette: + cotisations . assiette + # - rémunération . revenus de remplacement multiplicateur: plafond sécurité sociale # c'est en fait un abattement de 1,75% sur la partie en-dessous de 4 fois le plafond tranches: @@ -2403,7 +2615,13 @@ contrat salarié . assiette CSG et CRDS . assiette abattue: plafond: 4 - taux: 100% -contrat salarié . CSG . assiette heures supplémentaires et complémentaires défiscalisées: +contrat salarié . CSG et CRDS . assiette revenu remplacements: + formule: + produit: + taux: 98.25% + assiette: rémunération . revenus de remplacement + +contrat salarié . CSG et CRDS . assiette heures supplémentaires et complémentaires défiscalisées: formule: produit: assiette: rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées @@ -2411,33 +2629,45 @@ contrat salarié . CSG . assiette heures supplémentaires et complémentaires d références: DSN: https://dsn-info.custhelp.com/app/answers/detail/a_id/2110 -contrat salarié . CSG . assiette CSG déductible: - formule: assiette CSG et CRDS - assiette heures supplémentaires et complémentaires défiscalisées +contrat salarié . CSG et CRDS . non déductible: + titre: CSG non déductible et CRDS + formule: + somme: + - CSG . base .non déductible + - CSG . heures supplémentaires et complémentaires défiscalisées + - CRDS + - revenus de remplacement . CSG non déductible + - revenus de remplacement . CRDS -contrat salarié . CSG: +contrat salarié . CSG et CRDS . CSG: + non applicable si: établissement . localisation . département = 'Mayotte' cotisation: impôt: oui dû par: salarié - description: | - Contribution sociale généralisée. - Prélèvement obligatoire qui participe au financement de la sécurité sociale. - formule: - produit: - composantes: - - attributs: - impôt sur le revenu: non déductible - assiette: assiette CSG et CRDS - taux: 2.4% - - attributs: - impôt sur le revenu: déductible - assiette: assiette CSG déductible - taux: 6.8% - - attributs: - nom: heures supplémentaires et complémentaires défiscalisées - impôt sur le revenu: non déductible - assiette: assiette heures supplémentaires et complémentaires défiscalisées - taux: 6.8% + description: >- + La contribution sociale généralisée (CSG) est un impôt destiné à participer + au financement de la protection sociale. + A la différence des cotisations sociales qui ne portent que sur les revenus + d’activité, la CSG concerne, outre les revenus d’activité et de remplacement + (allocations chômage, indemnités journalières…), les revenus du patrimoine, + les produits de placement ou les sommes engagées ou redistribuées par les + jeux. + + Elle est prélevée à la source sur la plupart des revenus. Elle est recouvrée + par les Urssaf sur les revenus d’activité et par l’administration fiscale + sur les revenus du patrimoine. + + Le produit de la CSG est reversé à la Cnam et à la Cnaf, il finance + également le fonds de solidarité vieillesse + formule: + somme: + - base + - heures supplémentaires et complémentaires défiscalisées + + références: + urssaf.fr: https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/la-base-de-calcul/assiette-csg-crds.html + heures supplémentaires: https://dsn-info.custhelp.com/app/answers/detail/a_id/2110 exemples: - nom: 'CSG cadre' situation: @@ -2450,18 +2680,117 @@ contrat salarié . CSG: cotisations . assiette: 1500 complémentaire santé . forfait: 40 valeur attendue: 137.425 - références: - heures supplémentaires: https://dsn-info.custhelp.com/app/answers/detail/a_id/2110 -contrat salarié . CRDS: +contrat salarié . CSG et CRDS . CSG . taux déductible: + formule: 2.4% +contrat salarié . CSG et CRDS . CSG . taux non déductible: + formule: 6.8% + +contrat salarié . CSG et CRDS . CSG . base: + titre: CSG + formule: + multiplication: + assiette: assiette de base + composantes: + - attributs: + impôt sur le revenu: non déductible + taux: taux déductible + - attributs: + impôt sur le revenu: déductible + taux: taux non déductible + +contrat salarié . CSG et CRDS . CSG . heures supplémentaires et complémentaires défiscalisées: + titre: CSG heures supplémentaires et complémentaires défiscalisées + formule: + produit: + assiette: assiette heures supplémentaires et complémentaires défiscalisées + taux: taux déductible + taux non déductible + +contrat salarié . CSG et CRDS . CRDS: cotisation: impôt: oui dû par: salarié description: Contribution pour le remboursement de la dette sociale formule: produit: - assiette: assiette CSG et CRDS - taux: 0.5% + assiette: + somme: + - assiette de base + - assiette heures supplémentaires et complémentaires défiscalisées + taux: taux + +contrat salarié . CSG et CRDS . CRDS . taux: + titre: taux CRDS + formule: 0.5% + +contrat salarié . CSG et CRDS . revenus de remplacement: + titre: CSG et CRDS revenus de remplacement + description: >- + La CSG et CRDS prélevées sur les revenus de remplacement. + note: >- + Le prélèvement de la CSG et de la CRDS ne peut pas avoir pour effet de + réduire le montant de la rémunération d’activité et des allocations de + chômage à un seuil inférieur au Smic brut. + + formule: + somme: + - revenus de remplacement . CSG déductible + - revenus de remplacement . CSG non déductible + - revenus de remplacement . CRDS + +contrat salarié . CSG et CRDS . revenus de remplacement . CSG déductible: + titre: CSG déductible revenus de remplacement + applicable si: rémunération nette >= SMIC temps plein + formule: montant +contrat salarié . CSG et CRDS . revenus de remplacement . CSG déductible . rémunération nette: + formule: + somme: + - rémunération . net de cotisations + - rémunération . revenus de remplacement + - (- montant) +contrat salarié . CSG et CRDS . revenus de remplacement . CSG déductible . montant: + titre: CSG déductible + formule: + produit: + assiette: CSG et CRDS . assiette revenu remplacements + taux: CSG . taux déductible + +contrat salarié . CSG et CRDS . revenus de remplacement . CSG non déductible: + titre: CSG non déductible revenus de remplacement + applicable si: rémunération nette >= SMIC temps plein + formule: montant +contrat salarié . CSG et CRDS . revenus de remplacement . CSG non déductible . rémunération nette: + formule: + somme: + - rémunération . net de cotisations + - rémunération . revenus de remplacement + - (- CSG déductible . montant) + - (- montant) +contrat salarié . CSG et CRDS . revenus de remplacement . CSG non déductible . montant: + titre: CSG non déductible + formule: + produit: + assiette: CSG et CRDS . assiette revenu remplacements + taux: 3.8% + +contrat salarié . CSG et CRDS . revenus de remplacement . CRDS: + titre: CRDS revenus de remplacement + applicable si: rémunération nette >= SMIC temps plein + formule: montant +contrat salarié . CSG et CRDS . revenus de remplacement . CRDS . rémunération nette: + formule: + somme: + - rémunération . net de cotisations + - rémunération . revenus de remplacement + - (- CSG déductible . montant) + - (- CSG non déductible . montant) + - (- montant) +contrat salarié . CSG et CRDS . revenus de remplacement . CRDS . montant: + titre: CRDS + formule: + produit: + assiette: assiette revenu remplacements + taux: CRDS . taux contrat salarié . FNAL: titre: Contribution au Fonds National d’Aide au Logement @@ -2814,7 +3143,7 @@ contrat salarié . taxe sur les salaires . barème: assiette: 2300 valeur attendue: 2627.97 -contrat salarié . profession: +contrat salarié . profession spécifique: question: Le salarié exerce t-il l'une des professions suivantes ? formule: une possibilité: @@ -2824,14 +3153,14 @@ contrat salarié . profession: - artiste musicien - pilote de ligne ou personnel navigant -contrat salarié . profession . journaliste: +contrat salarié . profession spécifique . journaliste: icônes: ✒ description: >- Concerne les journalistes, rédacteurs, photographes, directeurs de journaux Critiques dramatiques et musicaux. -contrat salarié . profession . journaliste . réduction de taux: - applicable si: profession = 'journaliste' +contrat salarié . profession spécifique . journaliste . réduction de taux: + applicable si: profession spécifique = 'journaliste' remplace: - règle: vieillesse . taux employeur plafonné par: vieillesse . taux employeur plafonné * réduction de taux @@ -2852,8 +3181,8 @@ contrat salarié . profession . journaliste . réduction de taux: par: ATMP . taux minimum * réduction de taux formule: 80% -contrat salarié . profession . journaliste . abattement fiscal: - applicable si: profession = 'journaliste' +contrat salarié . profession spécifique . journaliste . abattement fiscal: + applicable si: profession spécifique = 'journaliste' remplace: rémunération . net imposable titre: net imposable journaliste formule: @@ -2861,20 +3190,20 @@ contrat salarié . profession . journaliste . abattement fiscal: assiette: rémunération . net imposable abattement: 7650€/an -contrat salarié . profession . ouvrier du bâtiment: +contrat salarié . profession spécifique . ouvrier du bâtiment: icônes: 👷‍♂️ description: >- 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. -contrat salarié . profession . artiste musicien: +contrat salarié . profession spécifique . artiste musicien: icônes: 🎼 description: >- Concerne les artistes musiciens, choristes, chefs d’orchestre, régisseurs de théâtre -contrat salarié . profession . pilote de ligne ou personnel navigant: +contrat salarié . profession spécifique . pilote de ligne ou personnel navigant: icônes: ✈ description: >- Concerne les pilotes, radios, mécaniciens navigants des compagnies de @@ -3227,7 +3556,7 @@ contrat salarié . cotisations . assiette forfaitaire . montant: - assiette . salariale - règle: assiette . salariale dans: vieillesse - - règle: assiette CSG et CRDS . assiette abattue + - règle: CSG et CRDS . assiette abattue totale - règle: plafond sécurité sociale par: plafond sécurité sociale temps plein sauf dans: diff --git a/publicode/rules/situation-personnelle.yaml b/publicode/rules/situation-personnelle.yaml index 08845f6d5..e2a35f376 100644 --- a/publicode/rules/situation-personnelle.yaml +++ b/publicode/rules/situation-personnelle.yaml @@ -13,8 +13,7 @@ situation personnelle . domiciliation fiscale à l'étranger: question: La résidence fiscale est-elle située à l'étranger ? rend non applicable: - dirigeant . indépendant . cotisations et contributions . CSG et CRDS - - contrat salarié . CSG - - contrat salarié . CRDS + - contrat salarié . CSG et CRDS - impôt par défaut: non références: diff --git a/source/components/Banner.css b/source/components/Banner.css index b536caca8..0a733f046 100644 --- a/source/components/Banner.css +++ b/source/components/Banner.css @@ -2,9 +2,6 @@ display: flex; align-items: center; margin: 1rem 0; - max-width: 100%; - color: var(--lighterInverseTextColor); - width: 45rem; } .ui__.banner img { diff --git a/source/components/PaySlipSections.js b/source/components/PaySlipSections.js index 818ca3be1..b7e9d95d3 100644 --- a/source/components/PaySlipSections.js +++ b/source/components/PaySlipSections.js @@ -16,6 +16,12 @@ export let SalaireBrutSection = ({ getRule }) => { ), salaireDeBase = getRule('contrat salarié . rémunération . brut de base'), rémunérationBrute = getRule('contrat salarié . rémunération . brut'), + chômagePartielIndemnité = getRule( + 'contrat salarié . activité partielle . indemnités' + ), + chômagePartielAbsence = getRule( + 'contrat salarié . activité partielle . retrait activité partielle' + ), primes = getRule('contrat salarié . rémunération . primes') return (
@@ -30,6 +36,12 @@ export let SalaireBrutSection = ({ getRule }) => { )} /> )} + {chômagePartielIndemnité?.nodeValue && ( + <> + + + + )} {!!heuresSupplémentaires?.nodeValue && ( )} diff --git a/source/components/PercentageField.tsx b/source/components/PercentageField.tsx index 11ffb8721..36cb92eac 100644 --- a/source/components/PercentageField.tsx +++ b/source/components/PercentageField.tsx @@ -1,11 +1,12 @@ +import { formatValue } from 'Engine/format' import React, { useCallback, useState } from 'react' -import { formatPercentage } from 'Engine/format' +import { debounce as debounceFn } from '../utils' import './PercentageField.css' -export default function PercentageField({ onChange, value, debounce }) { +export default function PercentageField({ onChange, value, debounce = 0 }) { const [localValue, setLocalValue] = useState(value) const debouncedOnChange = useCallback( - debounce ? debounce(debounce, onChange) : onChange, + debounce ? debounceFn(debounce, onChange) : onChange, [debounce, onChange] ) @@ -26,7 +27,10 @@ export default function PercentageField({ onChange, value, debounce }) { max="1" /> - {formatPercentage(localValue)} + {formatValue({ + value: localValue, + unit: '%' + })}
) diff --git a/source/components/PreviousSimulationBanner.tsx b/source/components/PreviousSimulationBanner.tsx index d63bb065b..93445c06e 100644 --- a/source/components/PreviousSimulationBanner.tsx +++ b/source/components/PreviousSimulationBanner.tsx @@ -1,7 +1,4 @@ -import { - deletePreviousSimulation, - loadPreviousSimulation -} from 'Actions/actions' +import { loadPreviousSimulation } from 'Actions/actions' import React from 'react' import { Trans } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -20,17 +17,13 @@ export default function PreviousSimulationBanner() { return ( ) } diff --git a/source/components/Simulation.tsx b/source/components/Simulation.tsx index 98c5e4510..ed7794e37 100644 --- a/source/components/Simulation.tsx +++ b/source/components/Simulation.tsx @@ -1,5 +1,7 @@ import Controls from 'Components/Controls' -import Conversation, { ConversationProps } from 'Components/conversation/Conversation' +import Conversation, { + ConversationProps +} from 'Components/conversation/Conversation' import SeeAnswersButton from 'Components/conversation/SeeAnswersButton' import PageFeedback from 'Components/Feedback/PageFeedback' import SearchButton from 'Components/SearchButton' @@ -13,23 +15,28 @@ import * as Animate from 'Ui/animate' import Progress from 'Ui/Progress' type SimulationProps = { - explanations: React.ReactNode + explanations?: React.ReactNode + results?: React.ReactNode customEndMessages?: ConversationProps['customEndMessages'] + showPeriodSwitch?: boolean } export default function Simulation({ explanations, - customEndMessages + results, + customEndMessages, + showPeriodSwitch }: SimulationProps) { const firstStepCompleted = useSelector(firstStepCompletedSelector) const progress = useSelector(simulationProgressSelector) return ( <> - + {firstStepCompleted && ( <> + {results}
)}
- {index === 0 && } + {index === 0 && showPeriodSwitch && }
{ let Header = ({ target }) => { const sitePaths = useContext(SitePathsContext) + const { t } = useTranslation() + const { pathname } = useLocation() + // TODO : Super hacky, we want to amend one label in the covid simulator, but + // because the label is fetched from the global state we have to do a hack + // here based on the URL. + const hackyShowPeriod = pathname === sitePaths.coronavirus return ( {target.title || target.name} + {hackyShowPeriod && ' ' + t('mensuel')}

{target.summary}

@@ -326,7 +333,7 @@ function AidesGlimpse() { {formatCurrency(aides.nodeValue, language)} {' '} - d'aides {emoji(aides.explanation.icons)} + d'aides {emoji(aides.explanation?.icons ?? '')} diff --git a/source/components/conversation/AnswerList.tsx b/source/components/conversation/AnswerList.tsx index 203168f78..062e05b3a 100644 --- a/source/components/conversation/AnswerList.tsx +++ b/source/components/conversation/AnswerList.tsx @@ -1,6 +1,5 @@ import { goToQuestion, resetSimulation } from 'Actions/actions' import Overlay from 'Components/Overlay' -import RuleLink from 'Components/RuleLink' import Value from 'Components/Value' import { getRuleFromAnalysis } from 'Engine/rules' import React from 'react' @@ -19,6 +18,7 @@ import './AnswerList.css' export default function AnswerList({ onClose }) { const dispatch = useDispatch() const { folded, next } = useSelector(stepsToRules) + console.log({ next }) return (

@@ -38,11 +38,15 @@ export default function AnswerList({ onClose }) {

-

- {emoji('🔮 ')} - Prochaines questions -

- + {next.length > 0 && ( + <> +

+ {emoji('🔮 ')} + Prochaines questions +

+ + + )}
) } @@ -62,10 +66,18 @@ function StepsTable({ rules, onClose }) { `} > - + - {' '} +
{' '} ))} diff --git a/source/components/conversation/Input.js b/source/components/conversation/Input.js index f1bf48bc5..b515c0f15 100644 --- a/source/components/conversation/Input.js +++ b/source/components/conversation/Input.js @@ -15,6 +15,8 @@ export default function Input({ onSubmit, dottedName, value, + defaultValue, + autoFocus, unit }) { const colors = useContext(ThemeColorsContext) @@ -36,9 +38,10 @@ export default function Input({
+} + +export default function RangeSlider({ value, onChange }: RangeSliderProps) { + const debouncedOnChange = useCallback(debounce(100, onChange), []) + + return ( + debouncedOnChange(evt.target.value)} + /> + ) +} + +const Input = styled.input` + width: 100%; + height: 15px; + border-radius: 5px; + background: #d3d3d3; + outline: none; + opacity: 0.7; + transition: opacity 0.2s; + + &:hover { + opacity: 1; + } + + &::-webkit-slider-thumb { + appearance: none; + width: 25px; + height: 25px; + border-radius: 50%; + background: var(--color); + cursor: pointer; + } + + &::-moz-range-thumb { + width: 25px; + height: 25px; + border-radius: 50%; + background: var(--color); + cursor: pointer; + } +` diff --git a/source/components/ui/index.css b/source/components/ui/index.css index 6ec4a4dbd..129392f0f 100644 --- a/source/components/ui/index.css +++ b/source/components/ui/index.css @@ -125,9 +125,10 @@ span.ui__.enumeration:not(:last-of-type)::after { .ui__.label { font-size: 85%; - padding: 0.4rem 0.8rem; + padding: 0.4rem 0.6rem; + font-weight: bold; color: white; - background: var(--lighterTextColor); + background: var(--darkColor); border-radius: 0.3rem; text-align: center; } diff --git a/source/engine/RuleInput.tsx b/source/engine/RuleInput.tsx index c7ac8bc37..141bd1cfd 100644 --- a/source/engine/RuleInput.tsx +++ b/source/engine/RuleInput.tsx @@ -4,6 +4,7 @@ import SelectGéo from 'Components/conversation/select/SelectGéo' import SelectAtmp from 'Components/conversation/select/SelectTauxRisque' import SendButton from 'Components/conversation/SendButton' import CurrencyInput from 'Components/CurrencyInput/CurrencyInput' +import PercentageField from 'Components/PercentageField' import ToggleSwitch from 'Components/ui/ToggleSwitch' import { is, prop, unless } from 'ramda' import React from 'react' @@ -117,6 +118,9 @@ export default function RuleInput({ ) } + if (unit?.numerators.includes('%') && isTarget) { + return + } return } diff --git a/source/engine/index.ts b/source/engine/index.ts index b5fae34d0..25724487c 100644 --- a/source/engine/index.ts +++ b/source/engine/index.ts @@ -16,7 +16,8 @@ type EngineConfig = { } let enrichRules = input => { - const rules = typeof input === 'string' ? safeLoad(input) : input + const rules = + typeof input === 'string' ? safeLoad(input.replace(/\t/g, ' ')) : input const rulesList = Array.isArray(rules) ? rules : Object.entries(rules).map(([dottedName, rule]) => ({ @@ -27,20 +28,19 @@ let enrichRules = input => { } export default class Engine { + rules: Array parsedRules: Record defaultValues: Simulation['situation'] situation: Simulation['situation'] = {} cache = { ...emptyCache } constructor(config: EngineConfig = {}) { - const rules = config - ? [ - ...(config.rules ? enrichRules(config.rules) : rulesFr), - ...(config.extra ? enrichRules(config.extra) : []) - ] - : rulesFr - this.parsedRules = parseAll(rules) as any - this.defaultValues = collectDefaults(rules) + this.rules = [ + ...(config?.rules ? enrichRules(config.rules) : rulesFr), + ...(config?.extra ? enrichRules(config.extra) : []) + ] + this.parsedRules = parseAll(this.rules) as any + this.defaultValues = collectDefaults(this.rules) } private resetCache() { diff --git a/source/engine/react.tsx b/source/engine/react.tsx index dc358ee20..a49f6d4e4 100644 --- a/source/engine/react.tsx +++ b/source/engine/react.tsx @@ -1,29 +1,27 @@ import Value from 'Components/Value' -import React, { createContext, useContext, useMemo, useState } from 'react' +import React, { createContext, useContext, useMemo } from 'react' import Engine from '.' -const EngineContext = createContext<{ +export const EngineContext = createContext<{ engine: Engine | null error: string | null }>({ engine: new Engine(), error: null }) type InputProps = { rules?: any + extra?: any situation?: any children: React.ReactNode } -export function Provider({ rules, situation, children }: InputProps) { - const [error, setError] = useState(null) - const engine = useMemo(() => { +export function Provider({ rules, extra, situation, children }: InputProps) { + const [engine, error] = useMemo(() => { try { - setError(null) - return new Engine({ rules }) + return [new Engine({ rules, extra }), null] } catch (err) { - setError(err?.message ?? err.toString()) - return null + return [null, (err?.message ?? err.toString()) as string] } - }, [rules]) + }, [rules, extra]) if (engine !== null && !Object.is(situation, engine.situation)) { engine.setSituation(situation) } diff --git a/source/locales/en.yaml b/source/locales/en.yaml index 5a8c3cc94..9f34e82b2 100644 --- a/source/locales/en.yaml +++ b/source/locales/en.yaml @@ -25,6 +25,8 @@ Commencer: Get started Continuer: Continue Cotisations: Contributions Cotisations sociales: Social contributions +'Covid-19 : Découvrez les mesures de soutien aux entreprises': 'Covid-19: Find out about business support measures' +Coût pour l'entreprise: Cost to the company Crée le: Created on Créer une: Create a De: From @@ -37,6 +39,7 @@ Désactivée: Inactive Détail annuel des cotisations: Annual detail of my contributions Effacer: Reset Embauche: Hiring process +En incluant l'indemnité de chômage partiel: Including short-time working allowance En-dessous de: Below Entreprise Individuelle: Sole Proprietorship Entrez des mots clefs ici: Enter keywords @@ -53,6 +56,7 @@ Gérant majoritaire: Chairman Gérant minoritaire: Managing director Imprimer: Print Impôts: Taxes +'Indemnité chômage partiel prise en charge par l''état :': 'State-paid short-time working allowance :' Indépendant: Independent International: International Intégrer l'interface de simulation: Integrate the simulation interface @@ -75,6 +79,7 @@ Nous n'avons rien trouvé: We didn't find any matching registered company. Oui: 'Yes' Outils pour les développeurs: Tools for developers Pages associées: Related pages +Part du salaire net maintenue: Share of net salary maintained Part employeur: Employer share Part salariale: Employee share Part salarié: Employee share @@ -82,6 +87,7 @@ Pas en auto-entrepreneur: Not in auto-entrepreneur Pas implémenté: Not implemented Passer: Skip Personnalisez l'integration: 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) @@ -108,6 +114,8 @@ 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 net avec chômage partiel :': 'Net income with short-time work :' +Revenu net mensuel: Monthly net income Récapitulatif: Summary Rémunération du dirigeant: Director's remuneration Répartition du chiffre d'affaires: Breakdown of turnover @@ -128,6 +136,7 @@ Taux: Rate Taux calculé: Calculated rate Taux moyen: Average rate Total des retenues: Total withheld +'Total payé par l''entreprise :': 'Total paid by the company :' Tout effacer: Delete all Tranche de l'assiette: Scale bracket Un seul associé: Only one partner @@ -381,6 +390,17 @@ comparaisonRégimes: Create my company as: trimestreValidés: <0>Number of quarters validated <1>(for retirement) composantes: components +coronavirus: + description: >- + <0>Coronavirus and short-time working: what impact on my income?<1>The + government is putting in place measures to support employees affected by the + Coronavirus crisis. One of the key measures is the assumption of the entire + short-time working compensation by the State.<2>This simulator allows + you to find out your net income if you have been placed on short-time work, + as well as the total cost to the company. + page: + description: Estimate net income with short-time working benefits + titre: 'Coronavirus and short-time working: what impact on your income?' cotisation: contribution créer: cta: @@ -807,6 +827,7 @@ listeformejuridique: page: titre: Legal status list for creating your company in France maj2019: The simulation is up-to-date in 2019. +mensuel: monthly mois: month montant à atteindre: minimum value multiplicateur: multiplier @@ -836,7 +857,11 @@ pages: publicode: >- <0>Publicodes<1>Our tools are powered by Publicodes, a new language for encoding "explainable" algorithms. + code: + description: 'Here is the code to copy and paste on your site:' + titre: Integration Code code à copier: 'Here is the code to copy and paste on your site:' + couleur: 'What color? ' home: choice: iframe: >- @@ -858,8 +883,10 @@ pages: module to blend it into the visual theme of your page.<3>The attribute <1>data-lang="en" allows you to choose English as the simulator language. + module: What module? par: per path: + coronavirus: /coronavirus créer: après: /after-registration guideStatut: diff --git a/source/locales/rules-en.yaml b/source/locales/rules-en.yaml index e7b198434..f08a60f7c 100644 --- a/source/locales/rules-en.yaml +++ b/source/locales/rules-en.yaml @@ -1,6 +1,14 @@ SMIC horaire: titre.en: hourly minimum wage (SMIC) titre.fr: SMIC horaire +SMIC temps plein: + titre.en: '[automatic] minimum wage' + titre.fr: SMIC temps plein +SMIC temps plein . net imposable: + description.en: '[automatic] Amount of the net taxable SMIC for a full-time employee.' + description.fr: Montant du SMIC net imposable pour un temps plein. + titre.en: '[automatic] minimum net taxable income' + titre.fr: SMIC net imposable aide déclaration revenu indépendant 2019: description.en: >- [automatic] These rules calculate the amounts claimed in the 2020 social and @@ -252,6 +260,12 @@ 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 +baisse de revenu chômage partiel: + titre.en: '[automatic] short-time working' + titre.fr: baisse de revenu chômage partiel +baisse de revenu chômage partiel . net sans chômage partiel: + titre.en: '[automatic] net without short-time work' + titre.fr: net sans chômage partiel contrat salarié: contrôles.0.en: > [automatic] Remember that a fixed-term contract must always correspond to a @@ -481,9 +495,6 @@ contrat salarié . CDD . compensation pour congés non pris: - maintenant : Les congés peuvent être pris dès l’embauche titre.en: '[automatic] holiday pay' titre.fr: indemnité de congés payés -contrat salarié . CDD . compensation pour congés non pris . assiette mensuelle: - titre.en: monthly basis - titre.fr: assiette mensuelle contrat salarié . CDD . compensation pour congés non pris . proportion congés non pris: titre.en: proportion of untaken leave titre.fr: proportion congés non pris @@ -803,26 +814,136 @@ contrat salarié . CDD . événement . rupture pour faute grave ou force majeure contrat salarié . CDI: titre.en: CDI titre.fr: CDI -contrat salarié . CRDS: - description.en: Contribution for the repayment of the social debt +contrat salarié . CSG et CRDS: + description.en: >- + [automatic] The CSG and the CRDS are payable by all employees meeting the + following two conditions: + + - they are domiciled in France for tax purposes, - they are covered by a + French compulsory health insurance scheme. + + If one of the two criteria is not met, the CSG and CRDS are not due, + provided that proof is provided (tax receipt or social security card). + description.fr: >- + La CSG et la CRDS sont dues par tous les salariés remplissant les deux + conditions suivantes : + + - ils sont domiciliés fiscalement en France, - ils sont à la charge d’un + régime français d’assurance maladie obligatoire. + + Si l’un des deux critères n’est pas rempli, la CSG et la CRDS ne sont pas + dues, à la condition d’en apporter la preuve (justificatif fiscal ou carte + d’assuré social). + titre.en: '[automatic] CSG and CRDS' + titre.fr: CSG et CRDS +contrat salarié . CSG et CRDS . CRDS: + description.en: '[automatic] Contribution for the repayment of the social debt' description.fr: Contribution pour le remboursement de la dette sociale - titre.en: CRDS + titre.en: '[automatic] DRES' titre.fr: CRDS -contrat salarié . CSG: - description.en: |- - Generalized social contribution. - Compulsory levy that contributes to the financing of social security. - description.fr: | - Contribution sociale généralisée. - Prélèvement obligatoire qui participe au financement de la sécurité sociale. - titre.en: CSG +contrat salarié . CSG et CRDS . CRDS . taux: + titre.en: '[automatic] CRDS rate' + titre.fr: taux CRDS +contrat salarié . CSG et CRDS . CSG: + description.en: >- + [automatic] The General Social Contribution (CSG) is a tax intended to + contribute to the financing of social protection. + + Unlike social contributions, which only apply to earned income, the CSG + covers, in addition to earned income and replacement income (unemployment + benefits, daily allowances, etc.), income from assets, investment income or + sums committed or redistributed by the games. + + It is deducted at source from most income. It is collected by the USSAF on + income from activities and by the tax authorities on income from assets. + + The CSG proceeds are paid to the CNAM and the CNAF, and also finance the old + age solidarity fund. + description.fr: >- + La contribution sociale généralisée (CSG) est un impôt destiné à participer + au financement de la protection sociale. + + A la différence des cotisations sociales qui ne portent que sur les revenus + d’activité, la CSG concerne, outre les revenus d’activité et de remplacement + (allocations chômage, indemnités journalières…), les revenus du patrimoine, + les produits de placement ou les sommes engagées ou redistribuées par les + jeux. + + Elle est prélevée à la source sur la plupart des revenus. Elle est recouvrée + par les Urssaf sur les revenus d’activité et par l’administration fiscale + sur les revenus du patrimoine. + + Le produit de la CSG est reversé à la Cnam et à la Cnaf, il finance + également le fonds de solidarité vieillesse + titre.en: '[automatic] CSG' titre.fr: CSG -contrat salarié . CSG . assiette CSG déductible: - titre.en: deductible CSG base - titre.fr: assiette CSG déductible -contrat salarié . CSG . assiette heures supplémentaires et complémentaires défiscalisées: +contrat salarié . CSG et CRDS . CSG . base: + titre.en: '[automatic] CSG' + titre.fr: CSG +contrat salarié . CSG et CRDS . CSG . heures supplémentaires et complémentaires défiscalisées: + titre.en: '[automatic] CSG tax-free overtime and overtime supplements' + titre.fr: CSG heures supplémentaires et complémentaires défiscalisées +contrat salarié . CSG et CRDS . CSG . taux déductible: + titre.en: '[automatic] deductible rate' + titre.fr: taux déductible +contrat salarié . CSG et CRDS . CSG . taux non déductible: + titre.en: '[automatic] non-deductible rate' + titre.fr: taux non déductible +contrat salarié . CSG et CRDS . assiette abattue totale: + titre.en: '[automatic] total slaughter plate' + titre.fr: 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' 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' + titre.fr: assiette revenu remplacements +contrat salarié . CSG et CRDS . non déductible: + titre.en: '[automatic] Non-deductible CSG and CRDS' + titre.fr: CSG non déductible et CRDS +contrat salarié . CSG et CRDS . revenus de remplacement: + description.en: '[automatic] CSG and CRDS deducted from replacement income.' + description.fr: La CSG et CRDS prélevées sur les revenus de remplacement. + note.en: >- + [automatic] The levying of the CSG and the CRDS may not have the effect of + reducing the amount of earned income and unemployment benefits to a + threshold lower than the gross minimum wage. + note.fr: >- + Le prélèvement de la CSG et de la CRDS ne peut pas avoir pour effet de + réduire le montant de la rémunération d’activité et des allocations de + chômage à un seuil inférieur au Smic brut. + titre.en: '[automatic] CSG and CRDS replacement income' + titre.fr: CSG et CRDS revenus de remplacement +contrat salarié . CSG et CRDS . revenus de remplacement . CRDS: + titre.en: '[automatic] CRDS replacement income' + titre.fr: CRDS revenus de remplacement +contrat salarié . CSG et CRDS . revenus de remplacement . CRDS . montant: + titre.en: '[automatic] DRES' + titre.fr: CRDS +contrat salarié . CSG et CRDS . revenus de remplacement . CRDS . rémunération nette: + titre.en: '[automatic] take-home pay' + titre.fr: rémunération nette +contrat salarié . CSG et CRDS . revenus de remplacement . CSG déductible: + titre.en: '[automatic] Deductible MSA replacement income' + titre.fr: CSG déductible revenus de remplacement +contrat salarié . CSG et CRDS . revenus de remplacement . CSG déductible . montant: + titre.en: '[automatic] deductible MSA' + titre.fr: CSG déductible +contrat salarié . CSG et CRDS . revenus de remplacement . CSG déductible . rémunération nette: + titre.en: '[automatic] take-home pay' + titre.fr: rémunération nette +contrat salarié . CSG et CRDS . revenus de remplacement . CSG non déductible: + titre.en: '[automatic] Non-deductible CSG replacement income' + titre.fr: CSG non déductible revenus de remplacement +contrat salarié . CSG et CRDS . revenus de remplacement . CSG non déductible . montant: + titre.en: '[automatic] non-deductible MSA' + titre.fr: CSG non déductible +contrat salarié . CSG et CRDS . revenus de remplacement . CSG non déductible . rémunération nette: + titre.en: '[automatic] take-home pay' + titre.fr: rémunération nette contrat salarié . FNAL: description.en: >- The National Housing Fund (Fnal) is a contribution to ensure the financing @@ -875,14 +996,146 @@ contrat salarié . SMIC contractuel: pour la détermination du salaire minimum titre.en: Contractual minimum wage (SMIC) titre.fr: SMIC contractuel -contrat salarié . SMIC temps plein: - titre.en: full-time mimimum wage (SMIC) - titre.fr: SMIC temps plein -contrat salarié . SMIC temps plein . net imposable: - description.en: '[automatic] Amount of the net taxable SMIC for a full-time employee.' - description.fr: Montant du SMIC net imposable pour un temps plein. - titre.en: '[automatic] minimum net taxable income' - titre.fr: SMIC net imposable +contrat salarié . activité partielle: + description.en: >- + [automatic] Following the Coronavirus crisis, the government introduced an + extended short-time working scheme in which the state pays compensation for + hours worked up to 4.5 SMIC. + + The declaration of partial activity is simplified and the effect is + retroactive. + description.fr: >- + À la suite de la crise du Coronavirus, le gouvernement a mis en place un + dispositif de chômage partiel étendu dans lequel l'État prend en charge + l'indemnisation des heures chômées jusqu’à 4,5 SMIC. + + La déclaration d'activité partielle est simplifiée est l'effet est + rétroactif. + question.en: '[automatic] Is the employee on short-time work?' + question.fr: Le salarié est-il en chômage partiel ? + titre.en: '[automatic] partial activity' + titre.fr: activité partielle +contrat salarié . activité partielle . convention syntec: + description.en: >- + [automatic] Collective bargaining agreement applicable to employees of + Technical Design Offices, Engineering Consultancy Firms and Consulting + Firms. + + This collective bargaining agreement provides in particular for an increase + in the partial unemployment benefit above the legal minimum and at the + expense of the company. + description.fr: >- + Convention Collective applicable aux salariés des Bureaux d'Études + Techniques, des Cabinets d'Ingénieurs-Conseils et des Sociétés de Conseils. + + Cette convention collective prévoit notamment une majoration de l'indemnité + de chômage partielle au dessus du minimum légal et à la charge de + l'entreprise. + question.en: '[automatic] Is the Syntec collective agreement applicable to the company?' + question.fr: La convention collective Syntec est-elle applicable à l'entreprise ? + titre.en: '[automatic] syntec convention' + titre.fr: convention syntec +contrat salarié . activité partielle . heures chômées: + titre.en: '[automatic] non-working hours' + titre.fr: heures chômées +contrat salarié . activité partielle . indemnisation entreprise: + description.en: >- + [automatic] In the context of the Coronavirus crisis, the government has + announced that the short-time working allowance will be 100% paid by the + state. + description.fr: >- + Dans le cadre de la crise du Coronavirus, le gouvernement a anoncé que + l'indemnité de chômage partiel sera 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 . indemnités: + description.en: >- + [automatic] If you are placed on short-time work, you are not entitled to a + salary but to a special allowance. For each hour of compensable time off, + the employee receives an allowance from the company. In return, the company + receives a partial activity allowance from the State. + + If, after payment of the partial activity allowance, the employee's + remuneration is less than the minimum monthly remuneration (RMM guaranteed + by Articles L3232-1 and following of the Labour Code for full-time + employees), the employer must pay him an additional allowance equal to the + difference between the minimum monthly remuneration (or Smic net) and the + sum initially received by the employee. + description.fr: >- + La mise en chômage partiel ouvre droit non au paiement d’un salaire mais à + l’allocation spécifique. Pour chaque heure chômée indemnisable, le salarié + reçoit de l'entreprise une indemnité. L'entreprise obtient en contrepartie + de l’Etat une allocation d’activité partielle. + + Si après versement de l’indemnité d’activité partielle la rémunération du + salarié est inférieure à la rémunération mensuelle minimale (RMM garantie + par les articles L3232-1 et suivants du code du travail pour les salariés à + temps plein), l'employeur doit lui verser une allocation complémentaire qui + est égale à la différence entre la rémunération mensuelle minimale (ou Smic + net) et la somme initialement perçue par le salarié. + titre.en: '[automatic] partial activity compensation' + titre.fr: indemnités activité partielle +contrat salarié . activité partielle . indemnités . base: + titre.en: '[automatic] basic partial severance pay' + titre.fr: indemnités d'activité partielle de base +contrat salarié . activité partielle . indemnités . complémentaire: + description.en: >- + [automatic] The supplementary partial unemployment allowance is an allowance + paid by the company for salaries close to the SMIC to ensure that + remuneration actually received is never lower than the net SMIC. + description.fr: >- + L'indemnité complémentaire de chômage partielle est une indemnité versée par + l'entreprise pour les salaires proches du SMIC permettant de s'assurer que + rémunération effectivement perçue ne soit jamais inférieure à celle du SMIC + net. + titre.en: '[automatic] additional allowance' + titre.fr: indemnité complémentaire +contrat salarié . activité partielle . indemnités . conventionnelle: + titre.en: '[automatic] conventional' + titre.fr: conventionnelle +contrat salarié . activité partielle . proportion heures travaillées: + description.en: >- + [automatic] In the case of short-time working, the proportion of hours + worked corresponds to the ratio of the number of hours worked to the usual + contractual working time. + + A ratio of 0% means that the employee did not work this month. A ratio of + 100% means that the employee worked all those contractual hours. + + Overtime, even usual overtime, is not taken into account. + description.fr: >- + Dans le cadre du chômage partiel, la proportion d'heure travaillées + correspond au ratio du nombre d'heures travaillées par rapport au temps de + travail contractuel habituel. + + Un ratio de 0% signifie que l'employé n'a pas travaillé ce mois ci. Un ratio + de 100% signifie que l'employé a effectué toutes ces heures contractuelles. + + Les heures supplémentaires, même habituelles, ne sont pas prises en compte. + question.en: '[automatic] What is the proportion of hours worked over the month?' + question.fr: Quelle est la proportion d'heures travaillées sur le mois ? + suggestions.0%.en: '[automatic] 0%' + suggestions.0%.fr: 0% + suggestions.20%.en: '[automatic] 20%' + suggestions.20%.fr: 20% + suggestions.50%.en: '[automatic] 50%' + suggestions.50%.fr: 50% + titre.en: '[automatic] proportion of hours worked' + titre.fr: proportion heures travaillées +contrat salarié . activité partielle . retrait absence: + titre.en: '[automatic] partial activity withdrawal' + titre.fr: retrait activité partielle +contrat salarié . activité partielle . rémunération mensuelle minimale: + description.en: >- + [automatic] Full-time employees with reduced working hours are entitled to a + minimum monthly remuneration which may be supplemented by an additional + payment from the employer. + description.fr: >- + Les salariés à temps plein dont l’horaire de travail est réduit ont droit à + une rémunération mensuelle minimale qui peut donner lieu à un versement + complémentaire de l’employeur. + titre.en: '[automatic] minimum monthly pay' + titre.fr: rémunération mensuelle minimale contrat salarié . aides employeur: description.en: > Some aids can be requested by the employer to help hires. @@ -901,8 +1154,8 @@ contrat salarié . aides employeur: officiel](http://www.aides-entreprises.fr). résumé.en: Deferred aids available to the employer. résumé.fr: 'Pour l''employeur, différées dans le temps' - titre.en: deferred employer aids - titre.fr: aides à l'embauche + titre.en: '[automatic] employer assistance' + titre.fr: aides employeur contrat salarié . aides employeur . aide à l'embauche d'apprentis: description.en: > Since 2019, a single hiring aid has replaced four previous schemes. The @@ -1041,14 +1294,6 @@ contrat salarié . apprentissage . diplôme préparé . niveau supérieur au bac niveau II (License, BMS...), et de niveau III (BTS, SUT, BM, ...) titre.en: Degree above the baccalaureate level titre.fr: Diplôme d'un niveau supérieur au bac -contrat salarié . assiette CSG et CRDS: - note.en: '[automatic] This plate is complex, this version is only a simplification.' - note.fr: 'Cette assiette est complexe, cette version n''est qu''une simplification.' - titre.en: CSG and CRDS base - titre.fr: assiette CSG et CRDS -contrat salarié . assiette CSG et CRDS . assiette abattue: - titre.en: reduced base - titre.fr: assiette abattue contrat salarié . avantages sociaux: description.en: >- These are the benefits paid by the employer. They are specific to the @@ -2336,12 +2581,12 @@ 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: +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] profession' - titre.fr: profession -contrat salarié . profession . artiste musicien: + 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. @@ -2350,7 +2595,7 @@ contrat salarié . profession . artiste musicien: théâtre titre.en: '[automatic] musical artist' titre.fr: artiste musicien -contrat salarié . profession . journaliste: +contrat salarié . profession spécifique . journaliste: description.en: >- [automatic] Concerns journalists, editors, photographers, newspaper directors Dramatic and music critics. @@ -2359,13 +2604,13 @@ contrat salarié . profession . journaliste: Critiques dramatiques et musicaux. titre.en: '[automatic] journalist' titre.fr: journaliste -contrat salarié . profession . journaliste . abattement fiscal: +contrat salarié . profession spécifique . journaliste . abattement fiscal: titre.en: '[automatic] net taxable journalist' titre.fr: net imposable journaliste -contrat salarié . profession . journaliste . réduction de taux: +contrat salarié . profession spécifique . journaliste . réduction de taux: titre.en: '[automatic] rate reduction' titre.fr: réduction de taux -contrat salarié . profession . ouvrier du bâtiment: +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 @@ -2376,12 +2621,12 @@ contrat salarié . profession . ouvrier du bâtiment: travaillent en usine ou en atelier. titre.en: '[automatic] construction worker' titre.fr: ouvrier du bâtiment -contrat salarié . profession . pilote de ligne ou personnel navigant: +contrat salarié . profession spécifique . 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 construction - companies for testing prototypes; pilot instructors of flying clubs and - civil aviation schools. + [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 @@ -2587,6 +2832,22 @@ contrat salarié . rémunération: les sommes d'argent versées au salarié. titre.en: Remuneration titre.fr: rémunération +contrat salarié . rémunération . assiette congés payés: + description.en: >- + [automatic] During his or her leave, the employee does not receive his or + her salary. He or she receives holiday pay. + + All sums that have the character of wages are taken into account to + determine the holiday pay. Other amounts are not taken into account. + description.fr: >- + Pendant ses congés, le salarié ne perçoit pas son salaire. Il perçoit une + indemnité de congés payés. + + Toutes les sommes ayant le caractère de salaire sont prises en compte pour + déterminer l'indemnité de congés payés. Les autres sommes ne sont pas prise + en compte. + titre.en: '[automatic] Basis for the calculation of holiday pay allowance' + titre.fr: Assiette pour le calcul de l'indemnité de congés payés contrat salarié . rémunération . assiette de vérification du SMIC: description.en: > This is the salary taken into account to verify that the minimum wage is @@ -2811,10 +3072,10 @@ contrat salarié . rémunération . brut de base: Il ne comprend pas les indemnités, avantages sociaux, avantages en nature et primes... - question.en: What is the monthly gross salary? - question.fr: Quel est le salaire de base ? - résumé.en: Written in the employment contract - résumé.fr: Brut de base inscrit dans le contrat de travail + question.en: '[automatic] What''s your gross salary?' + question.fr: Quel est votre salaire brut ? + résumé.en: '[automatic] Reference gross (excluding premiums, allowances and surcharges)' + résumé.fr: 'Brut de référence (sans les primes, indemnités ni majorations)' suggestions.SMIC.en: '[automatic] SMIC' suggestions.SMIC.fr: SMIC suggestions.salaire médian.en: '[automatic] median earnings' @@ -2864,8 +3125,8 @@ contrat salarié . rémunération . net: Cette somme peut varier en fonction de décisions politiques (augmentation ou diminution des cotisations) alors que le salaire brut est contractuel (pour le changer, il faut signer un avenant au contrat). - question.en: What is the net salary? - question.fr: Quel est le salaire net ? + question.en: '[automatic] What''s your take-home pay?' + question.fr: Quel est votre salaire net ? résumé.en: Received by the employee résumé.fr: Salaire net avant impôt titre.en: Net salary @@ -2900,6 +3161,9 @@ contrat salarié . rémunération . net après impôt: résumé.fr: Versé sur le compte bancaire titre.en: Net salary after income tax titre.fr: Salaire net après impôt +contrat salarié . rémunération . net avec revenus de remplacement: + titre.en: '[automatic] net with replacement income' + titre.fr: net avec revenus de remplacement contrat salarié . rémunération . net de cotisations: titre.en: Remuneration after contributions titre.fr: Salaire net de cotisations @@ -2914,8 +3178,8 @@ contrat salarié . rémunération . net imposable: contrat salarié . rémunération . net imposable . base: description.en: Net taxable income before exemptions and deductions description.fr: Le net imposable avant les exonérations et déductions - titre.en: base - titre.fr: base + titre.en: '[automatic] net taxable before exemptions' + titre.fr: net imposable avant exonérations 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 @@ -3005,6 +3269,40 @@ contrat salarié . rémunération . primes . fin d'année . treizième mois: question.fr: Le salarié bénéficie-t-il d'un treizième mois ? titre.en: thirteenth month titre.fr: treizième mois +contrat salarié . rémunération . revenus de remplacement: + description.en: >- + [automatic] Replacement income is income received in lieu of work: + unemployment or short-time working benefits, sickness or accident benefits, + retirement pension, social integration income, etc. + + This income is taxable but exempt from social security contributions. They + are subject to the CSG/CRDS with a specific rate. + description.fr: >- + Les revenus de remplacement sont les revenus perçus en remplacement de la + rémunération du travail : allocations de chômage ou de chômage partiel, + indemnités maladie ou accident du travail, pension de retraite, revenu + d'intégration sociale, etc. + + Ces revenus sont imposables mais sont exonérés de cotisations sociales. Ils + sont soumis à la CSG/CRDS avec un taux spécifique. + note.en: >- + [automatic] The additional allowance is not added here because it is + systematically exempt from CSG due to the capping for low incomes. + + Adding it results in a cyclical calculation (since it depends on the amount + of the CSG). + note.fr: >- + L'indemnité complémentaire n'est pas ajoutée ici car elle est + systématiquement exonérée de CSG du fait de l'écrêtement pour les bas + revenus. + + L'ajouter abouti à un calcul cyclique (vu qu'elle dépend du montant de la + CSG) + titre.en: '[automatic] replacement revenues' + titre.fr: revenus de remplacement +contrat salarié . rémunération . taux horaire: + titre.en: '[automatic] hourly fee' + titre.fr: taux horaire contrat salarié . rémunération . taux horaire des heures supplémentaires et complémentaires: description.en: > [automatic] The hourly rate used to calculate overtime pay. It includes @@ -3023,8 +3321,8 @@ contrat salarié . rémunération . total: amount. description.fr: | C'est le total que l'employeur doit verser pour employer un salarié. - question.en: What is the remuneration charged? - question.fr: Quel est la rémunération chargée ? + question.en: '[automatic] What is the remuneration charged?' + question.fr: Quelle est la rémunération chargée ? résumé.en: Spent by the company résumé.fr: Dépensé par l'entreprise titre.en: Total salary @@ -3211,6 +3509,9 @@ contrat salarié . temps de travail: contrat salarié . temps de travail . base légale: titre.en: legal base titre.fr: base légale +contrat salarié . temps de travail . effectif: + titre.en: '[automatic] staff' + titre.fr: effectif contrat salarié . temps de travail . heures complémentaires: contrôles.0.en: >- [automatic] Unless otherwise provided by agreement, the number of overtime diff --git a/source/selectors/repartitionSelectors.ts b/source/selectors/repartitionSelectors.ts index 21c3dac00..69430f32e 100644 --- a/source/selectors/repartitionSelectors.ts +++ b/source/selectors/repartitionSelectors.ts @@ -1,21 +1,5 @@ import { getRuleFromAnalysis } from 'Engine/rules' -import { - add, - compose, - equals, - filter, - fromPairs, - map, - mapObjIndexed, - max, - mergeWith, - pick, - pipe, - propEq, - reduce, - sort, - without -} from 'ramda' +import { compose, filter, fromPairs, map, max, reduce, sort } from 'ramda' import { createSelector } from 'reselect' import { analysisWithDefaultsSelector } from 'Selectors/analyseSelectors' import { Rule } from 'Types/rule' @@ -59,7 +43,7 @@ const byMontantTotal = ( a[1].partSalariale ) } - +// TODO : refaire ça proprement dans le moteur const REPARTITION_CSG: Partial> = { 'protection sociale . famille': 0.85, 'protection sociale . santé': 7.75, @@ -67,50 +51,6 @@ const REPARTITION_CSG: Partial> = { // On peut imaginer la partager à toute les composantes concernées 'protection sociale . autres': 0.6 } -function applyCSGInPlace( - CSG: Cotisation, - rawRépartition: Record -): void { - for (const branche in REPARTITION_CSG) { - rawRépartition[branche] = { - partPatronale: - rawRépartition[branche].partPatronale + - (CSG.montant.partPatronale * (REPARTITION_CSG[branche] / (9.2 / 100))) / - 100, - partSalariale: - rawRépartition[branche].partSalariale + - (CSG.montant.partSalariale * (REPARTITION_CSG[branche] / (9.2 / 100))) / - 100 - } - } -} - -const brancheConcernéeParLaRéduction = [ - 'santé', - 'retraite', - 'logement', - 'famille' -].map(branche => 'protection sociale . ' + branche) -function applyReduction( - réduction, - répartitionMap: Record -): Record { - const totalPatronal = (pipe( - pick(brancheConcernéeParLaRéduction), - Object.values, - - reduce(mergeWith(add), {}) - )(répartitionMap) as any).partPatronale - return mapObjIndexed( - ({ partPatronale, partSalariale }, branche: string) => ({ - partPatronale: brancheConcernéeParLaRéduction.find(equals(branche)) - ? partPatronale - (partPatronale / totalPatronal) * réduction.nodeValue - : partPatronale, - partSalariale - }), - répartitionMap - ) -} const répartition = analysis => { let cotisations = fromPairs(analysisToCotisations(analysis) as any) @@ -122,22 +62,8 @@ const répartition = analysis => { réductionsDeCotisations = getRule( 'contrat salarié . cotisations . patronales . réductions de cotisations' ) - let CSG - const autresCotisations = cotisations['protection sociale . autres'] as any - if (autresCotisations) { - CSG = autresCotisations.find(propEq('dottedName', 'contrat salarié . CSG')) - cotisations['protection sociale . autres'] = without( - [CSG], - autresCotisations - ) - } - let répartitionMap = map(totalCotisations as any, cotisations) as any - if (CSG) { - applyCSGInPlace(CSG, répartitionMap) - } - répartitionMap = applyReduction(réductionsDeCotisations, répartitionMap) return { répartition: compose( sort(byMontantTotal), diff --git a/source/sites/mon-entreprise.fr/App.tsx b/source/sites/mon-entreprise.fr/App.tsx index 46f12427a..217803277 100644 --- a/source/sites/mon-entreprise.fr/App.tsx +++ b/source/sites/mon-entreprise.fr/App.tsx @@ -23,6 +23,7 @@ import './App.css' import Footer from './layout/Footer/Footer' import Header from './layout/Header' import trackSimulatorActions from './middlewares/trackSimulatorActions' +import Coronavirus from './pages/Coronavirus' import Créer from './pages/Créer' import IntegrationTest from './pages/Dev/IntegrationTest' import Personas from './pages/Dev/Personas' @@ -118,6 +119,7 @@ const App = () => { /> + { @@ -50,13 +50,6 @@ const Footer = () => { blacklist={feedbackBlacklist.map(lens => view(lens, sitePaths))} />
- {i18n.language === 'fr' && ( - <> - -
- - )} - {i18n.language === 'en' && (

This website is provided by the{' '} diff --git a/source/sites/mon-entreprise.fr/pages/Coronavirus.tsx b/source/sites/mon-entreprise.fr/pages/Coronavirus.tsx new file mode 100644 index 000000000..6c0dc855b --- /dev/null +++ b/source/sites/mon-entreprise.fr/pages/Coronavirus.tsx @@ -0,0 +1,208 @@ +import { setSimulationConfig } from 'Actions/actions' +import RuleLink from 'Components/RuleLink' +import Simulation from 'Components/Simulation' +import chomagePartielConfig from 'Components/simulationConfigs/chômage-partiel.yaml' +import StackedBarChart from 'Components/StackedBarChart' +import { ThemeColorsContext } from 'Components/utils/colors' +import { IsEmbeddedContext } from 'Components/utils/embeddedContext' +import { Markdown } from 'Components/utils/markdown' +import { formatValue } from 'Engine/format' +import { getRuleFromAnalysis } from 'Engine/rules' +import React, { useContext } from 'react' +import { Helmet } from 'react-helmet' +import { Trans, useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' +import { useLocation } from 'react-router' +import { analysisWithDefaultsSelector } from 'Selectors/analyseSelectors' +import Animate from 'Ui/animate' + +export default function ChômagePartiel() { + const dispatch = useDispatch() + const location = useLocation<{ fromGérer?: boolean }>() + const inIframe = useContext(IsEmbeddedContext) + dispatch(setSimulationConfig(chomagePartielConfig, location.state?.fromGérer)) + + const { t } = useTranslation() + + return ( + <> + + + {t( + 'coronavirus.page.titre', + 'Coronavirus et chômage partiel : quel impact sur vos revenus ?' + )} + + + + {!inIframe && ( + +

+ + Coronavirus et chômage partiel + +
+ Quel impact sur mes revenus ? +

+

+ Ce simulateur permet de connaître le revenu net versé au salarié, + ainsi que le coût total restant à charge pour l'entreprise en cas de + chômage partiel. +

+ + )} + } + customEndMessages={ + Voir les résultats au-dessus + } + showPeriodSwitch={false} + /> + {!inIframe && } + + ) +} + +function ExplanationSection() { + const analysis = useSelector(analysisWithDefaultsSelector) + const { language } = useTranslation().i18n + const { palettes } = useContext(ThemeColorsContext) + const getRule = getRuleFromAnalysis(analysis) + + const net = getRule('contrat salarié . rémunération . net') + const indemnité = getRule('contrat salarié . activité partielle . indemnités') + const totalEntreprise = getRule('contrat salarié . prix du travail') + const perteRevenu = getRule('baisse de revenu chômage partiel') + if (!net?.nodeValue) { + return null + } + return ( + +
+
+
+
    +
  • +
    +
    +
    + Revenu net mensuel +
    +

    + En incluant l'indemnité de chômage partiel +

    +
    +
    + + {formatValue({ + value: net.nodeValue, + language, + unit: '€', + maximumFractionDigits: 0 + })} + +
    +
    +
  • +
  • +
    + Coût pour l'entreprise +
    + + {formatValue({ + value: totalEntreprise.nodeValue, + language, + unit: '€', + maximumFractionDigits: 0 + })} + +
    +
    +
  • +
  • + + Part du salaire net maintenue + + +
  • +
+
+
+
+ ) +} + +function TextExplanations() { + const { i18n } = useTranslation() + if (i18n.language !== 'fr') { + return null + } + return ( + + ) +} diff --git a/source/sites/mon-entreprise.fr/pages/Dev/IntegrationTest.tsx b/source/sites/mon-entreprise.fr/pages/Dev/IntegrationTest.tsx index b52717ed4..f3400e6b4 100644 --- a/source/sites/mon-entreprise.fr/pages/Dev/IntegrationTest.tsx +++ b/source/sites/mon-entreprise.fr/pages/Dev/IntegrationTest.tsx @@ -6,7 +6,8 @@ export const integrableModuleNames = [ 'simulateur-autoentrepreneur', 'simulateur-independant', 'simulateur-assimilesalarie', - 'simulateur-artiste-auteur' + 'simulateur-artiste-auteur', + 'simulateur-chomage-partiel' ] export default function IntegrationTest() { diff --git a/source/sites/mon-entreprise.fr/pages/Gérer/Home.tsx b/source/sites/mon-entreprise.fr/pages/Gérer/Home.tsx index 0d685837c..ffad7cbbe 100644 --- a/source/sites/mon-entreprise.fr/pages/Gérer/Home.tsx +++ b/source/sites/mon-entreprise.fr/pages/Gérer/Home.tsx @@ -133,25 +133,45 @@ export default function SocialSecurity() { )} {régime !== 'auto-entrepreneur' && ( - -
{emoji('🤝')}
- -

Estimer le montant d’une embauche

-

- Calculez le montant total que votre entreprise devra - dépenser pour rémunérer votre prochain employé -

-
- + <> + +
{emoji('😷')}
+ +

Connaître les aides

+

+ Calculez le montant des indemnités de chômage partiel. + Découvrez la liste des dispositifs d'aides aux + entreprises. +

+
+ Covid-19 + + +
{emoji('🤝')}
+ +

Estimer le montant d’une embauche

+

+ Calculez le montant total que votre entreprise devra + dépenser pour rémunérer votre prochain employé +

+
+ + )}
@@ -341,7 +361,7 @@ export const CompanySection = ({ company }: CompanySectionProps) => { : company.statutJuridique} {company.isDirigeantMajoritaire != null && ( - + {company.isDirigeantMajoritaire ? ( Dirigeant majoritaire diff --git a/source/sites/mon-entreprise.fr/pages/Iframes/index.tsx b/source/sites/mon-entreprise.fr/pages/Iframes/index.tsx index 145790604..05730dffd 100644 --- a/source/sites/mon-entreprise.fr/pages/Iframes/index.tsx +++ b/source/sites/mon-entreprise.fr/pages/Iframes/index.tsx @@ -2,6 +2,7 @@ import { IsEmbeddedContext } from 'Components/utils/embeddedContext' import React from 'react' import { Route } from 'react-router' import { inIframe } from '../../../../utils' +import SimulateurChômagePartiel from '../Coronavirus' import SimulateurArtisteAuteur from '../Simulateurs/ArtisteAuteur' import SimulateurAssimiléSalarié from '../Simulateurs/AssimiléSalarié' import SimulateurAutoEntrepreneur from '../Simulateurs/AutoEntrepreneur' @@ -37,6 +38,10 @@ export default function Iframes() { path="/iframes/simulateur-artiste-auteur" component={SimulateurArtisteAuteur} /> + {inIframe() && } diff --git a/source/sites/mon-entreprise.fr/pages/Landing/Landing.tsx b/source/sites/mon-entreprise.fr/pages/Landing/Landing.tsx index 755a33fbc..4afa508dc 100644 --- a/source/sites/mon-entreprise.fr/pages/Landing/Landing.tsx +++ b/source/sites/mon-entreprise.fr/pages/Landing/Landing.tsx @@ -39,6 +39,14 @@ export default function Landing() {
+
+ {emoji('😷')}{' '} + + + Covid-19 : Découvrez les mesures de soutien aux entreprises + + +
+

Simulateur de revenus pour salarié @@ -158,6 +160,11 @@ export let SalarySimulation = () => { } /> +
+ + Covid-19 et chômage partiel :{' '} + Calculez votre indemnité + ) diff --git a/source/sites/mon-entreprise.fr/pages/integration/Iframe.tsx b/source/sites/mon-entreprise.fr/pages/integration/Iframe.tsx index b62fb4d54..f996bb23f 100644 --- a/source/sites/mon-entreprise.fr/pages/integration/Iframe.tsx +++ b/source/sites/mon-entreprise.fr/pages/integration/Iframe.tsx @@ -1,9 +1,13 @@ -import { ThemeColorsProvider } from 'Components/utils/colors' +import { + ThemeColorsContext, + ThemeColorsProvider +} from 'Components/utils/colors' import { ScrollToTop } from 'Components/utils/Scroll' import urssafLogo from 'Images/urssaf.svg' -import React, { Suspense, useRef, useState } from 'react' +import React, { Suspense, useContext, useRef, useState } from 'react' +import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' -import { MemoryRouter } from 'react-router-dom' +import { MemoryRouter, useLocation } from 'react-router-dom' import { integrableModuleNames } from '../Dev/IntegrationTest' import Iframes from '../Iframes' import './iframe.css' @@ -15,10 +19,16 @@ import poleEmploiLogo from './images/pole-emploi.png' let LazyColorPicker = React.lazy(() => import('../Dev/ColorPicker')) function IntegrationCustomizer() { + const { search } = useLocation() + const defaultModuleFromUrl = + new URLSearchParams(search ?? '').get('module') ?? '' const [currentModule, setCurrentModule] = React.useState( - integrableModuleNames[0] + integrableModuleNames.includes(defaultModuleFromUrl) + ? defaultModuleFromUrl + : integrableModuleNames[0] ) - const [color, setColor] = useState() + const { color: defaultColor } = useContext(ThemeColorsContext) + const [color, setColor] = useState(defaultColor) return (

@@ -65,25 +75,35 @@ function IntegrationCustomizer() { >

- Quel module ? + Quel module ? + {emoji('🚩')}

- setCurrentModule(event.target.value)} + value={currentModule} + > {integrableModuleNames.map(name => ( ))}

- Quelle couleur ? + + Quelle couleur ?{' '} + + {emoji('🎨')}

Chargement...
}>

- Code d'intégration + + Code d'intégration + + {emoji('🛠')}

- + Voici le code à copier-coller sur votre site :

diff --git a/source/sites/mon-entreprise.fr/sitePaths.ts b/source/sites/mon-entreprise.fr/sitePaths.ts index e9b7324de..c45cf0a0b 100644 --- a/source/sites/mon-entreprise.fr/sitePaths.ts +++ b/source/sites/mon-entreprise.fr/sitePaths.ts @@ -130,6 +130,7 @@ export const constructLocalizedSitePath = (language: string) => { index: t('path.documentation.index', '/documentation'), rule: (dottedName: DottedName) => '/' + encodeRuleName(dottedName) }, + coronavirus: t('path.coronavirus', '/coronavirus'), integration: { index: t('path.integration.index', '/intégration'), iframe: t('path.integration.iframe', '/iframe'), diff --git a/source/webpack.prod.js b/source/webpack.prod.js index bf0bf6292..63498fa5c 100644 --- a/source/webpack.prod.js +++ b/source/webpack.prod.js @@ -123,8 +123,10 @@ module.exports = { '/simulateurs/assimilé-salarié', '/simulateurs/indépendant', '/créer', + '/coronavirus', '/gérer', - '/iframes/simulateur-embauche' + '/iframes/simulateur-embauche', + '/iframes/simulateur-chomage-partiel' ], indexPath: path.resolve('dist', 'mon-entreprise.html') }) diff --git a/test/regressions/__snapshots__/simulations.jest.js.snap b/test/regressions/__snapshots__/simulations.jest.js.snap index d96151198..1548951b9 100644 --- a/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/test/regressions/__snapshots__/simulations.jest.js.snap @@ -106,7 +106,7 @@ exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - a exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - avec charges 2`] = `"[10982,10982,10742,4,19,23]"`; -exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 1`] = `"[0,0,2488,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 1`] = `"[-2313,-2313,2488,0,0,0]"`; exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 2`] = `"[169,169,139,0,1,1]"`; @@ -200,6 +200,24 @@ exports[`calculate simulations-salarié: JEI 2`] = `"[26635,0,0,20000,15969,106 exports[`calculate simulations-salarié: JEI 3`] = `"[4517,0,0,4000,3141,2741]"`; +exports[`calculate simulations-salarié: activité partielle 1`] = `"[27,1218,0,1560,1197,1197]"`; + +exports[`calculate simulations-salarié: activité partielle 2`] = `"[27,2800,0,4000,2594,2354]"`; + +exports[`calculate simulations-salarié: activité partielle 3`] = `"[778,4849,0,8000,5209,4232]"`; + +exports[`calculate simulations-salarié: activité partielle 4`] = `"[850,2240,0,4000,2704,2435]"`; + +exports[`calculate simulations-salarié: activité partielle 5`] = `"[2479,1400,0,4000,2869,2556]"`; + +exports[`calculate simulations-salarié: activité partielle 6`] = `"[27,2100,3750,3000,1940,1844]"`; + +exports[`calculate simulations-salarié: activité partielle 7`] = `"[27,2800,0,4000,2594,2491]"`; + +exports[`calculate simulations-salarié: activité partielle 8`] = `"[227,1400,0,2000,1540,1515]"`; + +exports[`calculate simulations-salarié: activité partielle 9`] = `"[327,4200,0,6000,4182,3494]"`; + exports[`calculate simulations-salarié: aides 1`] = `"[2302,0,0,2000,1561,1524]"`; exports[`calculate simulations-salarié: aides 2`] = `"[12823,0,0,10000,8911,7667]"`; @@ -242,19 +260,19 @@ exports[`calculate simulations-salarié: effectif 3`] = `"[2539,0,0,2000,1561,1 exports[`calculate simulations-salarié: effectif 4`] = `"[2539,0,0,2000,1561,1524]"`; -exports[`calculate simulations-salarié: frais pro - DFS 1`] = `"[2242,0,0,2000,1668,1668]"`; +exports[`calculate simulations-salarié: frais pro - DFS 1`] = `"[2242,0,0,2000,1630,1630]"`; -exports[`calculate simulations-salarié: frais pro - DFS 2`] = `"[2335,0,0,2000,1603,1561]"`; +exports[`calculate simulations-salarié: frais pro - DFS 2`] = `"[2335,0,0,2000,1584,1544]"`; -exports[`calculate simulations-salarié: frais pro - DFS 3`] = `"[2265,0,0,2000,1645,1597]"`; +exports[`calculate simulations-salarié: frais pro - DFS 3`] = `"[2265,0,0,2000,1606,1563]"`; -exports[`calculate simulations-salarié: frais pro - DFS 4`] = `"[2243,0,0,2000,1657,1608]"`; +exports[`calculate simulations-salarié: frais pro - DFS 4`] = `"[2243,0,0,2000,1613,1569]"`; exports[`calculate simulations-salarié: frais pro - DFS 5`] = `"[2437,0,0,2000,1590,1590]"`; -exports[`calculate simulations-salarié: frais pro - DFS 6`] = `"[1767,0,0,1700,1380,1380]"`; +exports[`calculate simulations-salarié: frais pro - DFS 6`] = `"[1767,0,0,1700,1364,1364]"`; -exports[`calculate simulations-salarié: frais pro - DFS 7`] = `"[3287,0,0,2600,2175,2141]"`; +exports[`calculate simulations-salarié: frais pro - DFS 7`] = `"[3287,0,0,2600,2125,2097]"`; exports[`calculate simulations-salarié: frais pro - IKV 1`] = `"[4367,0,0,3200,2530,2320]"`; @@ -292,9 +310,9 @@ exports[`calculate simulations-salarié: impôt sur le revenu 4`] = `"[3896,0,0 exports[`calculate simulations-salarié: impôt sur le revenu 5`] = `"[41834,0,0,30000,24227,14588]"`; -exports[`calculate simulations-salarié: impôt sur le revenu 6`] = `"[4076,0,0,3000,2353,2267]"`; +exports[`calculate simulations-salarié: impôt sur le revenu 6`] = `"[4076,0,0,3000,2626,2481]"`; -exports[`calculate simulations-salarié: impôt sur le revenu 7`] = `"[41834,0,0,30000,24227,15843]"`; +exports[`calculate simulations-salarié: impôt sur le revenu 7`] = `"[41834,0,0,30000,26966,16204]"`; exports[`calculate simulations-salarié: impôt sur le revenu 8`] = `"[4076,0,0,3000,2353,2107]"`; diff --git a/test/regressions/simulations-salarié.yaml b/test/regressions/simulations-salarié.yaml index 4839ddbfc..5f52b524b 100644 --- a/test/regressions/simulations-salarié.yaml +++ b/test/regressions/simulations-salarié.yaml @@ -205,21 +205,48 @@ frais pro - IKV: frais pro - DFS: - contrat salarié . rémunération . brut de base: 2000 - contrat salarié . profession: journaliste + contrat salarié . profession spécifique: journaliste - contrat salarié . rémunération . brut de base: 2000 - contrat salarié . profession: ouvrier du bâtiment + contrat salarié . profession spécifique: ouvrier du bâtiment - contrat salarié . rémunération . brut de base: 2000 - contrat salarié . profession: artiste musicien + contrat salarié . profession spécifique: artiste musicien - contrat salarié . rémunération . brut de base: 2000 - contrat salarié . profession: pilote de ligne ou personnel navigant + contrat salarié . profession spécifique: pilote de ligne ou personnel navigant - contrat salarié . rémunération . brut de base: 2000 - contrat salarié . profession: journaliste + contrat salarié . profession spécifique: journaliste contrat salarié . déduction forfaitaire spécifique . application: non # Test des taux réduits journalistes et abattement fiscal - contrat salarié . rémunération . brut de base: 1700 - contrat salarié . profession: journaliste + contrat salarié . profession spécifique: journaliste - contrat salarié . rémunération . brut de base: 2600 - contrat salarié . profession: journaliste + contrat salarié . profession spécifique: journaliste + +activité partielle: + - contrat salarié . rémunération . brut de base: 1560 + contrat salarié . activité partielle: oui + - contrat salarié . rémunération . brut de base: 4000 + contrat salarié . activité partielle: oui + - contrat salarié . rémunération . brut de base: 8000 + contrat salarié . activité partielle: oui + - contrat salarié . rémunération . brut de base: 4000 + contrat salarié . activité partielle: oui + contrat salarié . activité partielle . proportion heures travaillées: 20 + - contrat salarié . rémunération . brut de base: 4000 + contrat salarié . activité partielle: oui + contrat salarié . activité partielle . proportion heures travaillées: 50 + - contrat salarié . rémunération . brut de base: 3000 + contrat salarié . activité partielle: oui + contrat salarié . temps de travail . temps partiel: oui + contrat salarié . temps de travail . temps partiel . heures par semaine: 28 + - contrat salarié . rémunération . brut de base: 4000 + contrat salarié . activité partielle: oui + contrat salarié . profession spécifique: journaliste + - contrat salarié . rémunération . brut de base: 2000 + contrat salarié . activité partielle: oui + contrat salarié . activité partielle . convention syntec: oui + - contrat salarié . rémunération . brut de base: 6000 + contrat salarié . activité partielle: oui + contrat salarié . activité partielle . convention syntec: oui lodeom: - contrat salarié . rémunération . brut de base: 1521.22 diff --git a/yarn.lock b/yarn.lock index e4d719c46..e41f2a28c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1561,11 +1561,6 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -3727,7 +3722,7 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" -debug@3.2.6, debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: +debug@3.2.6, debug@^3.0.0, debug@^3.1.0, debug@^3.1.1: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3852,7 +3847,7 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.2, detect-libc@^1.0.3: +detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= @@ -4995,13 +4990,6 @@ fs-extra@^6.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-mkdirp-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" @@ -5730,7 +5718,7 @@ i18next@^19.0.1: dependencies: "@babel/runtime" "^7.3.1" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5764,13 +5752,6 @@ iframe-resizer@^4.1.1: resolved "https://registry.yarnpkg.com/iframe-resizer/-/iframe-resizer-4.2.10.tgz#c61c9119bb1bf31931fc3c3bb025e1891b18502c" integrity sha512-9T/AWavGI5Q7nw2ch7qatkKvhK6S11eatuSh0SXpPXN3MV0HtN97KyifWJSuMj47rD6jbqe1CXT91PLQbexvEQ== -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -7585,21 +7566,6 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" @@ -7640,7 +7606,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -7795,15 +7761,6 @@ nearley@^2.19.0, nearley@^2.7.10: randexp "0.4.6" semver "^5.4.1" -needle@^2.2.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117" - integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -7902,22 +7859,6 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.50: version "1.1.52" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" @@ -7935,14 +7876,6 @@ noop-logger@^0.1.1: resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -7987,27 +7920,6 @@ now-and-later@^2.0.0: dependencies: once "^1.3.2" -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -8015,7 +7927,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2: +npmlog@^4.0.1, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -8226,7 +8138,7 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0, os-homedir@^1.0.1: +os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= @@ -8240,19 +8152,11 @@ os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -10211,7 +10115,7 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -10996,19 +10900,6 @@ tar-stream@^2.0.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" @@ -12185,7 +12076,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==