diff --git a/règles/aiguillage.md b/règles/aiguillage.md index 4f1e2a019..4a36a6406 100644 --- a/règles/aiguillage.md +++ b/règles/aiguillage.md @@ -17,7 +17,7 @@ formule: 2016: 2% ``` -Etant donné que le statut cadre est une exception, on pourrait aussi utiliser cette syntaxe bien plus succinte. +Etant donné que le statut cadre est une exception, on pourrait aussi utiliser cette syntaxe bien plus succincte. ```yaml formule: @@ -33,6 +33,8 @@ formule: Dans le cas d'une variable de type énumération, il peut être commode de factoriser le sujet comparé et de parler de 'cas'. +> Mais la variable devient alors une clé, alors qu'elles sont normalement des valeurs, ça peut être perturbant + ```yaml formule: assiette: assiette cotisations sociales @@ -46,9 +48,8 @@ formule: 2016: 2% ``` - -Celle-ci est identique à la précédente, mais ne contient pas de 'si' et est donc plus brève. -On peut la voit comme une alternative adaptée à certains endroits (?). +Celle-ci est similaire à `variations` mais ne contient pas de `si` et est donc plus brève. +On peut la voir comme une alternative adaptée à certains endroits (?). ```yaml formule: diff --git a/règles/entités/salariat/Salariat.yaml b/règles/entités/salariat/Salariat.yaml index 5c68087c6..8c2efb40c 100644 --- a/règles/entités/salariat/Salariat.yaml +++ b/règles/entités/salariat/Salariat.yaml @@ -80,7 +80,8 @@ C'est, en gros, le salaire brut moins les cotisations sociales. Ce salaire est plus important que le brut car c'est ce que le salrié reçoit sur son compte bancaire, et pourtant, le brut est très utilisé lors des négociations salariales. formule: somme: #TODO à l'avenir, exprimer une somme sous forme de requête - - AGIRC simple + - APEC + - AGIRC diff --git a/règles/rémunération-travail/cdd/agirc.yaml b/règles/rémunération-travail/cdd/agirc.yaml new file mode 100644 index 000000000..3f14046de --- /dev/null +++ b/règles/rémunération-travail/cdd/agirc.yaml @@ -0,0 +1,65 @@ +- Cotisation: AGIRC + attache: Salariat + attributs: + branche: retraite + type de retraite: complémentaire + destinataire: AGIRC + description: | + Cotisation de retraite complémentaire cadre. Complète le régime ARRCO, gérée par l'AGIRC (Association Générale des Institutions de Retraite des Cadres) + références: + calcul des cotisations: http://www.agirc-arrco.fr/entreprises/gerer-les-salaries/calcul-des-cotisations/ + garantie minimale de points: http://www.journaldunet.com/management/pratique/primes-et-avantages/5079/gmp-2016-la-garantie-minimale-de-points-calcul-et-montant.html + non applicable si: statut cadre # TODO l'inverse ! Vérifier le fonctionnnement de la négation !statut cadre OU statut cadre = non OU applicable si: statut cadre + + formule: + barème: + assiette: salaire de base #TODO assiette cotisations sociales + multiplicateur des tranches: plafond sécurité sociale + composantes: + - attributs: + dû par: employeur + tranches: + - en-dessous de: 1 + taux: 0% + - de: 1 + à: 8 + taux: 12.75% + # 2016: 12.75% + # 2015: 12.75% + # 2014: 12.68% + # 2006: 12.6% + # 1999: 12.5% + # 1998: 11.875% + # 1997: 11.25% + # 1996: 10.625% + # 1995: 10.% + # 1994: 8.47% + # 1993: 7.02% + - au-dessus de: 8 + taux: 0% + + + - attributs: + dû par: salarié + tranches: + - en-dessous de: 1 + taux: 0% + - de: 1 + à: 8 + taux: 7.8% + # 2016: 7.8% + # 2015: 7.8% + # 2014: 7.75% + # 2006: 7.7% + # 1999: 7.5% + # 1998: 6.875% + # 1997: 6.25% + # 1996: 5.625% + # 1995: 5% + # 1994: 3.63% + # 1993-07: 2.34% + - au-dessus de: 8 + taux: 0% + + notes: | + Il éxiste une tranche C, de 4 à 8 fois la base, sur laquelle la répartition des cotisations est décidée au sein de l’entreprise jusqu’à 20 %. De 20 % à 20,30 %, la répartition est la suivante : 66,67 % à la charge du salarié et 33,33 % pour l’employeur. diff --git a/règles/rémunération-travail/cdd/apec.yaml b/règles/rémunération-travail/cdd/apec.yaml new file mode 100644 index 000000000..c500a235c --- /dev/null +++ b/règles/rémunération-travail/cdd/apec.yaml @@ -0,0 +1,42 @@ +- Cotisation: APEC + attache: Salariat + attributs: + branche: retraite + type de retraite: complémentaire + destinataire: APEC + description: | + Cotisation de retraite complémentaire cadre, pour le fonctionnement de l'APEC + (Association Pour l’Emploi des Cadres) + références: + chiffres clés: http://www.agirc-arrco.fr/l-agirc-et-larrco/chiffres-cles + notes: | + Avant 2011, il y avait une cotisation forfaitaire au lieu de la tranche A + + non applicable si: statut cadre # TODO l'inverse ! Vérifier le fonctionnnement de la négation !statut cadre OU statut cadre = non OU applicable si: statut cadre + + formule: + barème: + assiette: salaire de base #TODO assiette cotisations sociales + multiplicateur des tranches: plafond sécurité sociale + composantes: + - attributs: + dû par: employeur + tranches: + - en-dessous de: 4 + taux: 0.036% + # 2016-01: 0.036% + # 2011-01: 0.036% + # 1993-07: 0% + - au-dessus de: 4 + taux: 0% + + - attributs: + dû par: salarié + tranches: + - en-dessous de: 4 + taux: 0.024% + # 2016-01: 0.024% + # 2011-01: 0.024% + # 1993-07: 0% + - au-dessus de: 4 + taux: 0% diff --git a/règles/rémunération-travail/cdd/supprime-moi.yaml b/règles/rémunération-travail/cdd/supprime-moi.yaml deleted file mode 100644 index 48941bba5..000000000 --- a/règles/rémunération-travail/cdd/supprime-moi.yaml +++ /dev/null @@ -1,42 +0,0 @@ -- Cotisation: AGIRC simple - attache: Salariat - attributs: - branche: retraite - type de retraite: complémentaire - destinataire: AGIRC - description: | - Cotisation de retraite complémentaire cadre. Complète le régime ARRCO - (Association Générale des Institutions de Retraite des Cadres) - références: - calcul des cotisations: http://www.agirc-arrco.fr/entreprises/gerer-les-salaries/calcul-des-cotisations/ - garantie minimale de points: http://www.journaldunet.com/management/pratique/primes-et-avantages/5079/gmp-2016-la-garantie-minimale-de-points-calcul-et-montant.html - # concerne: - # - statut cadre = oui - - formule: - barème: - assiette: salaire de base - multiplicateur des tranches: plafond sécurité sociale - tranches: - - en-dessous de: 1 - taux: 0% - - de: 1 - à: 8 - taux: 7.8% - # 2016: 7.8% - # 2015: 7.8% - # 2014: 7.75% - # 2006: 7.7% - # 1999: 7.5% - # 1998: 6.875% - # 1997: 6.25% - # 1996: 5.625% - # 1995: 5% - # 1994: 3.63% - # 1993-07: 2.34% - - au-dessus de: 8 - taux: 0% - - - notes: | - Il éxiste une tranche C, de 4 à 8 fois la base, sur laquelle la répartition des cotisations est décidée au sein de l’entreprise jusqu’à 20 %. De 20 % à 20,30 %, la répartition est la suivante : 66,67 % à la charge du salarié et 33,33 % pour l’employeur. diff --git a/règles/rémunération-travail/cotisations/agirc.yaml b/règles/rémunération-travail/cotisations/agirc.yaml index ff6a9ea80..7c3d149d1 100644 --- a/règles/rémunération-travail/cotisations/agirc.yaml +++ b/règles/rémunération-travail/cotisations/agirc.yaml @@ -1,16 +1,16 @@ - Cotisation: AGIRC + attache: Salariat attributs: branche: retraite type de retraite: complémentaire destinataire: AGIRC description: | - Cotisation de retraite complémentaire cadre, complémentant le régime ARRCO - (pour l'Association Générale des Institutions de Retraite des Cadres) + Cotisation de retraite complémentaire cadre. Complète le régime ARRCO + (Association Générale des Institutions de Retraite des Cadres) références: - - http://www.agirc-arrco.fr/entreprises/gerer-les-salaries/calcul-des-cotisations/ - - http://www.journaldunet.com/management/pratique/primes-et-avantages/5079/gmp-2016-la-garantie-minimale-de-points-calcul-et-montant.html - concerne: - - statut cadre = oui + calcul des cotisations: http://www.agirc-arrco.fr/entreprises/gerer-les-salaries/calcul-des-cotisations/ + garantie minimale de points: http://www.journaldunet.com/management/pratique/primes-et-avantages/5079/gmp-2016-la-garantie-minimale-de-points-calcul-et-montant.html + non applicable si: statut cadre # TODO l'inverse ! Vérifier le fonctionnnement de la négation !statut cadre OU statut cadre = non OU applicable si: statut cadre formule: barème: @@ -19,44 +19,46 @@ - attributs: dû par: employeur tranches: - - taux: 0% - - - seuil: 1 * plafond sécurité sociale - taux: - 2016: 12.75% - 2015: 12.75% - 2014: 12.68% - 2006: 12.6% - 1999: 12.5% - 1998: 11.875% - 1997: 11.25% - 1996: 10.625% - 1995: 10.% - 1994: 8.47% - 1993: 7.02% - - seuil: 8 * plafond sécurité sociale + - en-dessous de: 1 + taux: 0% + - de: 1 + à: 8 + taux: 12.75% + # 2016: 12.75% + # 2015: 12.75% + # 2014: 12.68% + # 2006: 12.6% + # 1999: 12.5% + # 1998: 11.875% + # 1997: 11.25% + # 1996: 10.625% + # 1995: 10.% + # 1994: 8.47% + # 1993: 7.02% + - au-dessus de: 8 taux: 0% - attributs: dû par: salarié tranches: - - taux: 0% - - - seuil: 1 * plafond sécurité sociale - taux: - 2016: 7.8% - 2015: 7.8% - 2014: 7.75% - 2006: 7.7% - 1999: 7.5% - 1998: 6.875% - 1997: 6.25% - 1996: 5.625% - 1995: 5% - 1994: 3.63% - 1993-07: 2.34% - - seuil: 8 * plafond sécurité sociale + - en-dessous de: 1 + taux: 0% + - de: 1 + à: 8 + taux: 7.8% + # 2016: 7.8% + # 2015: 7.8% + # 2014: 7.75% + # 2006: 7.7% + # 1999: 7.5% + # 1998: 6.875% + # 1997: 6.25% + # 1996: 5.625% + # 1995: 5% + # 1994: 3.63% + # 1993-07: 2.34% + - au-dessus de: 8 taux: 0% notes: | diff --git a/règles/rémunération-travail/cotisations/apec.yaml b/règles/rémunération-travail/cotisations/apec.yaml deleted file mode 100644 index 1e4188884..000000000 --- a/règles/rémunération-travail/cotisations/apec.yaml +++ /dev/null @@ -1,47 +0,0 @@ -- Cotisation: APEC - attributs: - branche: retraite - type de retraite: complémentaire - destinataire: APEC - description: | - Cotisation de retraite complémentaire cadre, pour le fonctionnement de l'APEC - (Association Pour l’Emploi des Cadres) - référence: http://www.agirc-arrco.fr/l-agirc-et-larrco/chiffres-cles - notes: | - Avant 2011, il y avait une cotisation forfaitaire au lieu de la tranche A - - formule: - barème: - assiette: assiette cotisations sociales - multiplicateur: plafond sécurité sociale - composantes: - - - attributs: - dû par: employeur - tranches: - - taux: - 2016-01: 0.036% - 2011-01: 0.036% - 1993-07: 0% - - seuil: 0 #TODO erreur ? - taux: - 2016-01: 0.036% - 1993-07: 0.036% - - seuil: 4 - taux: 0% - - - attributs: - dû par: salarié - tranches: - - taux: - historique: - 2016-01: 0.024% - 2011-01: 0.024% - 1993-07: 0 - - seuil: 0 #TODO erreur ? - taux: - historique: - 2016-01: 0.024% - 1993-07: 0.024% - - seuil: 4 - taux: 0 diff --git a/règles/rémunération-travail/cotisations/arrco.yaml b/règles/rémunération-travail/cotisations/arrco.yaml index 16a04583d..019eb7533 100644 --- a/règles/rémunération-travail/cotisations/arrco.yaml +++ b/règles/rémunération-travail/cotisations/arrco.yaml @@ -1,63 +1,68 @@ - Cotisation: ARRCO + attache: Salariat attributs: branche: retraite type de retraite: complémentaire destinataire: ARRCO description: > - Cotisation de retraite complémentaire pour tous les salariés du secteur privé, - (pour l'Association pour le Régime de Retraite Complémentaire des salariés) - référence: http://www.agirc-arrco.fr/entreprises/gerer-les-salaries/calcul-des-cotisations/ + Cotisation de retraite complémentaire pour tous les salariés du secteur privé, gérée par l'Association pour le Régime de Retraite Complémentaire des salariés + références: + calcul des cotisations: http://www.agirc-arrco.fr/entreprises/gerer-les-salaries/calcul-des-cotisations/ formule: barème: - assiette: assiette cotisations sociales - multiplicateur: plafond sécurité sociale + assiette: salaire de base #TODO assiette cotisations sociales + multiplicateur des tranches: plafond sécurité sociale composantes: - attributs: dû par: employeur - variations: - - si: categorie salarié = privé cadre - tranches: - - taux: - 2016: 4.65% - 2015: 4.65% - 2014: 4.58% - 1999: 4.5% - 1998: 4.125% - 1997: 3.75% - 1996: 3.375% - 1993: 2.952% - - seuil: 1 - taux: 0% - - si: categorie salarié = privé non cadre - tranches: - - taux: - 2016-01: 4.65% - 2015-01: 4.65% - 2014-01: 4.58% - 1999-01: 4.5% - 1998-01: 4.125% - 1997-01: 3.75% - 1996-01: 3.375% - 1993-07: 2.952% - - seuil: 1 - taux: - 2016: 12.15% - 2015: 12.15% - 2014: 12.08% - 2005: 12.% - 2004: 10.5% - 2002: 9% - 2000: 7.5% - - seuil: 3 - taux: 0% + variations: + - si: categorie salarié = privé cadre + tranches: + - en-dessous de: 1 + taux: + 2016: 4.65% + 2015: 4.65% + 2014: 4.58% + 1999: 4.5% + 1998: 4.125% + 1997: 3.75% + 1996: 3.375% + 1993: 2.952% + - au-dessus de: 1 + taux: 0% + - si: categorie salarié = privé non cadre + tranches: + - en-dessous de: 1 + taux: + 2016-01: 4.65% + 2015-01: 4.65% + 2014-01: 4.58% + 1999-01: 4.5% + 1998-01: 4.125% + 1997-01: 3.75% + 1996-01: 3.375% + 1993-07: 2.952% + - de: 1 + à: 3 + taux: + 2016: 12.15% + 2015: 12.15% + 2014: 12.08% + 2005: 12.% + 2004: 10.5% + 2002: 9% + 2000: 7.5% + - au-dessus de: 3 + taux: 0% - Cotisation: dû par: salarié variations: - si: categorie salarié = privé cadre tranches: - - taux: + - en-dessous de: 1 + taux: 2016: 3.1% 2015: 3.1% 2014: 3.05% @@ -66,11 +71,12 @@ 1997: 2.5% 1996: 2.25% 1993: 1.968% - - seuil: 1 + - au-dessus de: 1 taux: 0% - si: catégorie salarié = privé non cadre tranches: - - taux: + - en-dessous de: 1 + taux: 2016: 3.1% 2015: 3.1% 2014: 3.05% @@ -79,7 +85,8 @@ 1997: 2.5% 1996: 2.25% 1993: 1.968% - - seuil: 1 + - de: 1 + à: 3 taux: 2016: 8.1% 2015: 8.1% @@ -88,5 +95,5 @@ 2004: 7% 2002: 6% 1993: 5% - - seuil: 3 + - au-dessus de: 3 taux: 0% diff --git a/règles/rémunération-travail/cotisations/pénibilité.yaml b/règles/rémunération-travail/cotisations/pénibilité.yaml index 7a75efa2c..a51aea046 100644 --- a/règles/rémunération-travail/cotisations/pénibilité.yaml +++ b/règles/rémunération-travail/cotisations/pénibilité.yaml @@ -24,3 +24,33 @@ - si: Salariat . exposition pénibilité multiple 2017: 0.4% 2015: 0.2% + +- Cotisation: pénibilité + attributs: + branche: santé # ou vieillesse car ouvrant droit à une retraite anticipée ? + description: Les dépenses liées à l'utilisation du compte pénibilité par le salarié sont prises en charge par un fonds financé par l'employeur + références: + - https://www.service-public.fr/professionnels-entreprises/vosdroits/F33777 + - https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/les-taux-de-cotisations/les-cotisations-patronales-au-ti/cotisations-dues.html + - Code du travail - Article L4162-19 + + formule: + composantes: + - nom: base + multiplication: + assiette: assiette cotisations sociales + taux: + 2017: 0.01% + + - nom: additionnelle + applicable si: Activité . durée >= 1 mois + multiplication: + assiette: assiette cotisations sociales + taux: + variations: + - si: Salariat . exposition pénibilité simple + 2017: 0.2% + 2015: 0.1% + - si: Salariat . exposition pénibilité multiple + 2017: 0.4% + 2015: 0.2% diff --git a/source/components/Rule.css b/source/components/Rule.css index a012e5f77..1a6f71dc1 100644 --- a/source/components/Rule.css +++ b/source/components/Rule.css @@ -1,5 +1,5 @@ #rule { - font-size: 120%; + font-size: 110%; } #rule pre { @@ -35,6 +35,10 @@ padding-right: .6em; } +#rule ul { + margin: 0; +} + #rule .rule-type { font-size: 35%; } @@ -130,7 +134,6 @@ display: inline-flex; justify-content: start; min-height: 5em; - width: 80%; } #rule-rules .situationValue { @@ -156,7 +159,7 @@ #algorithm { margin-top: 3em; - width: 60%; + width: 100%; } .dictionaryWrapper { @@ -192,7 +195,7 @@ } #rule-rules section { - margin: 1em 3em; + margin: 1em 0 1em 3em; font-weight: 500; font-size: 90%; color: #444 @@ -205,7 +208,7 @@ color: #4B4B66 } -.nodeHead { +.mecanism > .nodeHead { margin-bottom: 1em; } @@ -223,24 +226,27 @@ opacity: .8 } .ruleProp > .nodeHead .name { - background: #df5320 + background: #9b59b6; } .mecanism li { } -.mecanism ul { +.mecanism .properties, .mecanism.list ul { margin-top: 0; padding-left: 1em; list-style-type: none; border-left: 1px dashed #ccc; } -.mecanism ul .key { - color: #d5911a; +.mecanism .properties .key { font-weight: 600; display: inline-block; - margin-bottom: 1em; + margin-bottom: .6em; margin-right: 0.8em; } +.multiplication > .nodeHead .name { + background: #2ecc71; +} + .multiplication li .key { margin-right: .6em; } @@ -292,7 +298,7 @@ color: #5B5B73; text-align: center; margin-top: 1em; - padding: .05em 1em; + padding: .05em .6em; line-height: 1.8em; border-radius: .4em; font-weight: 600; @@ -318,7 +324,16 @@ font-size: 60%; } +.barème > .nodeHead .name { + background: #1abc9c; +} + +.barème .key { + color: #1abc9c +} + .barème table { + margin-top: 1em; width: 80%; text-align: left; } @@ -329,3 +344,32 @@ .barème table tr:nth-child(2n) { background: #f1f1f1 } + +.composantes > .nodeHead .name { + background: #3498db; +} + +.composantes > ul > li { + display: inline-block; +} +.composantes .composante { + width: 45%; +} +.composantes .composante .content { + border-top: 1px solid #3498db; + padding: 1em; + margin-right: 2em; +} +.composantes .composanteAttributes { + list-style-type: none; + padding: .2em; + color: #3498db; +} +.composantes .composanteAttributes span:last-child { + font-weight: 600; +} + +.composantes .composantesSymbol { + font-size: 160%; + color: #3498db; +} diff --git a/source/components/Rule.js b/source/components/Rule.js index 734151248..c76b079bf 100644 --- a/source/components/Rule.js +++ b/source/components/Rule.js @@ -26,13 +26,13 @@ let testingSituationGate = v => // eslint-disable-line no-unused-vars form: state.form }), dispatch => ({ - startConversation: () => dispatch({type: START_CONVERSATION}), + startConversation: rootVariable => dispatch({type: START_CONVERSATION, rootVariable}), }) ) export default class Rule extends Component { componentDidMount() { // C'est ici que la génération du formulaire, et donc la traversée des variables commence - this.props.startConversation() + this.props.startConversation('salaire net') } render() { let { diff --git a/source/containers/App.prod.js b/source/containers/App.prod.js index 923689092..9fbf9c174 100644 --- a/source/containers/App.prod.js +++ b/source/containers/App.prod.js @@ -2,7 +2,7 @@ import React, {Component} from 'react' import { Provider } from 'react-redux' import routes from '../routes' -import Router from 'react-router' +import {Router} from 'react-router' export default class App extends Component { render() { diff --git a/source/engine/known-mecanisms.yaml b/source/engine/known-mecanisms.yaml index 1b80a341b..05db80b3a 100644 --- a/source/engine/known-mecanisms.yaml +++ b/source/engine/known-mecanisms.yaml @@ -75,3 +75,15 @@ barème: C'est un barème en taux marginaux, mécanisme de calcul connu son utilisation dans le calcul de l'impôt sur le revenu. L'assiette est décomposée en plusieurs tranches, qui sont multipliées par un taux spécifique. Les tranches sont très souvent exprimées sous forme de facteurs (par exemple [1, 2, 4]) d'une variable que l'on appelle multiplicateur, par exemple le plafond de la sécurité sociale. + +composantes: + description: | + Beaucoup de cotisations sont composées de deux parties qui partage la méthode de calcul mais diffèrent par des paramètres différents. + + Pour ne pas définir deux variables presque redondantes, on utilise le mécanisme de composante. Il se comportera comme une somme dans les calculs, mais son affichage sur les pages /règle sera adapté. + + Il est même possible, pour les mécanismes `barème` et `multiplication` de garder en commun un paramètre comme l'assiette, puis de déclarer des composantes pour le taux. + + > L'example le plus courant de composantes, c'est la distinction part employeur, part salarié (ex. retraite AGIRC). + + > On peut aussi citer la composante de base de la cotisation pénibilité, et la composante additionnelle. diff --git a/source/engine/rules.js b/source/engine/rules.js index c8b9edcb3..41519944d 100644 --- a/source/engine/rules.js +++ b/source/engine/rules.js @@ -101,21 +101,25 @@ export let findGroup = R.pipe( /********************************* Autres */ -let collectNodeMissingVariables = target => (root, source=root, results=[]) => { +let collectNodeMissingVariables = (root, source=root, results=[]) => { if ( source.nodeValue != null || source.shortCircuit && source.shortCircuit(root) - ) return [] + ) { + // console.log('nodev or shortcircuit root, source', root, source) + return [] + } - if (source[target]) { - results.push(source[target]) + if (source['missingVariables']) { + // console.log('root, source', root, source) + results.push(source['missingVariables']) } for (var prop in source) { - if (R.is(Object)(source[prop])) - collectNodeMissingVariables(target)(root, source[prop], results) + if (R.is(Object)(source[prop])) { + collectNodeMissingVariables(root, source[prop], results) + } } - return results } @@ -125,7 +129,7 @@ export let collectMissingVariables = (groupMethod='groupByMissingVariable') => a R.unless(R.is(Array), R.of), R.chain( v => R.pipe( - collectNodeMissingVariables('missingVariables'), + collectNodeMissingVariables, R.flatten, R.map(mv => [v.variableName, mv]) )(v) diff --git a/source/engine/traverse-common-functions.js b/source/engine/traverse-common-functions.js new file mode 100644 index 000000000..c753f5cce --- /dev/null +++ b/source/engine/traverse-common-functions.js @@ -0,0 +1,5 @@ +import R from 'ramda' + +export let val = node => node.nodeValue + +export let anyNull = R.any(R.pipe(val, R.equals(null))) diff --git a/source/engine/traverse.js b/source/engine/traverse.js index d888992a9..8705d6e1c 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -6,7 +6,7 @@ import knownMecanisms from './known-mecanisms.yaml' import { Parser } from 'nearley' import Grammar from './grammar.ne' import {Node, Leaf} from './traverse-common-jsx' - +import {anyNull, val} from './traverse-common-functions' let nearley = () => new Parser(Grammar.ParserRules, Grammar.ParserStart) @@ -215,8 +215,8 @@ let treat = (situationGate, rule) => rawNode => { if (!R.is(Object)(rawNode)) { - console.log('Cette donnée : ', rawNode) // eslint-disable-line no-console - throw ' doit être un Number, String ou Object' + console.log() // eslint-disable-line no-console + throw 'Cette donnée : ' + rawNode + ' doit être un Number, String ou Object' } let mecanisms = R.intersection(R.keys(rawNode), R.keys(knownMecanisms)) @@ -437,11 +437,9 @@ let treat = (situationGate, rule) => rawNode => { if (k === 'multiplication') { let - val = node => node.nodeValue, mult = (base, rate, facteur, plafond) => Math.min(base, plafond) * rate * facteur, constantNode = constant => ({nodeValue: constant}), - anyNull = R.any(R.pipe(val, R.equals(null))), assiette = reTreat(v['assiette']), //TODO parser le taux dans le parser ? taux = v['taux'] ? reTreat({taux: v['taux']}) : constantNode(1), @@ -498,9 +496,68 @@ let treat = (situationGate, rule) => rawNode => { } if (k === 'barème') { - // Sous entendu : barème en taux marginaux. A étendre (avec une propriété type ?) quand les règles en contiendront d'autres. + // Sous entendu : barème en taux marginaux. + // A étendre (avec une propriété type ?) quand les règles en contiendront d'autres. + if (v.composantes) { //mécanisme de composantes. Voir known-mecanisms.md/composantes + let + baremeProps = R.dissoc('composantes')(v), + composantes = v.composantes.map(c => + ({ + ... reTreat( + { + barème: { + ... baremeProps, + ... R.dissoc('attributs')(c) + } + } + ), + composante: c.nom ? {nom: c.nom} : c.attributs + }) + ), + l = console.log('composantes', composantes.map(val)), + nodeValue = anyNull(composantes) ? null + : R.reduce(R.add, 0, composantes.map(val)) + + return { + nodeValue, + category: 'mecanism', + name: 'composantes', + type: 'numeric', + explanation: composantes, + jsx: + { composantes.map((c, i) => + [
  • + +
    + {c.jsx} +
    +
  • , + i < (composantes.length - 1) &&
  • + ] + ) + } + + } + /> + } + } + + if (v['multiplicateur des tranches'] == null) + throw "un barème nécessite pour l'instant une propriété 'multiplicateur des tranches'" + let - val = node => node.nodeValue, assiette = reTreat(v['assiette']), multiplicateur = reTreat(v['multiplicateur des tranches']), @@ -555,7 +612,7 @@ let treat = (situationGate, rule) => rawNode => { name="barème" value={nodeValue} child={ -