Travail sur la documentation dans la simulation

Ajout de titres
🐛 certaines documentation de variables ne s'affichaient pas
etc.

+ Résolution bug evaluateVariable
pull/6/head
mama 2017-04-28 17:47:01 +02:00
parent 55ac04ccb5
commit 268d721364
28 changed files with 1179 additions and 307 deletions

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 780 KiB

After

Width:  |  Height:  |  Size: 824 KiB

View File

@ -52,7 +52,7 @@
- maintenant : Les congés peuvent être pris dès lembauche [...]
references:
références:
Fiche service-public.gouv.fr: https://www.service-public.fr/particuliers/vosdroits/F2931
Code du travail - Article L3141-24: https://www.legifrance.gouv.fr/affichCodeArticle.do?cidTexte=LEGITEXT000006072050&idArticle=LEGIARTI000006902661&dateTexte=&categorieLien=cid
Congés payés et contrat CDD: https://www.easycdd.com/LEGISLATION-CDD/L-embauche-le-suivi-du-contrat-CDD-les-incidents-frequents/Conges-payes-et-contrat-CDD

View File

@ -3,6 +3,7 @@
- espace: contrat salarié . CDD . motif
nom: contrat aidé
titre: Contrat aidé
# Voir le TODO de contrat salarié . CDD . événement . CDD poursuivi en CDI
# formule:
# une possibilité:

View File

@ -1,6 +1,6 @@
- espace: contrat salarié . CDD
nom: motif
nom complet: motif de recours
titre: Motif de recours
question: Quel est le motif de recours au CDD ?
description: |
Le CDD est un contrat d'exception: son recours doit être autorisé par l'un des motifs spécifiés dans la loi.
@ -49,11 +49,11 @@
Nous regroupons dans cette catégorie les cas suivants.
- Remplacement d'un salarié en cas :
a) D'absence ;
b) De passage provisoire à temps partiel, conclu par avenant à son contrat de travail ou par échange écrit entre ce salarié et son employeur ;
c) De suspension de son contrat de travail ;
d) De départ définitif précédant la suppression de son poste de travail après consultation du comité d'entreprise ou, à défaut, des délégués du personnel, s'il en existe ;
e) D'attente de l'entrée en service effective du salarié recruté par contrat à durée indéterminée appelé à le remplacer ;
- D'absence ;
- De passage provisoire à temps partiel, conclu par avenant à son contrat de travail ou par échange écrit entre ce salarié et son employeur ;
- De suspension de son contrat de travail ;
- De départ définitif précédant la suppression de son poste de travail après consultation du comité d'entreprise ou, à défaut, des délégués du personnel, s'il en existe ;
- D'attente de l'entrée en service effective du salarié recruté par contrat à durée indéterminée appelé à le remplacer ;
- Remplacement d'un chef d'entreprise artisanale, industrielle ou commerciale, d'une personne exerçant une profession libérale, de son conjoint participant effectivement à l'activité de l'entreprise à titre professionnel et habituel ou d'un associé non salarié d'une société civile professionnelle, d'une société civile de moyens d'une société d'exercice libéral ou de toute autre personne morale exerçant une profession libérale ;
@ -67,9 +67,9 @@
Recrutement d'ingénieurs et de cadres, au sens des conventions collectives, en vue de la réalisation d'un objet défini lorsqu'un accord de branche étendu ou, à défaut, un accord d'entreprise le prévoit et qu'il définit :
a) Les nécessités économiques auxquelles ces contrats sont susceptibles d'apporter une réponse adaptée ;
b) Les conditions dans lesquelles les salariés sous contrat à durée déterminée à objet défini bénéficient de garanties relatives à l'aide au reclassement, à la validation des acquis de l'expérience, à la priorité de réembauche et à l'accès à la formation professionnelle continue et peuvent, au cours du délai de prévenance, mobiliser les moyens disponibles pour organiser la suite de leur parcours professionnel ;
c) Les conditions dans lesquelles les salariés sous contrat à durée déterminée à objet défini ont priorité d'accès aux emplois en contrat à durée indéterminée dans l'entreprise.
- Les nécessités économiques auxquelles ces contrats sont susceptibles d'apporter une réponse adaptée ;
- Les conditions dans lesquelles les salariés sous contrat à durée déterminée à objet défini bénéficient de garanties relatives à l'aide au reclassement, à la validation des acquis de l'expérience, à la priorité de réembauche et à l'accès à la formation professionnelle continue et peuvent, au cours du délai de prévenance, mobiliser les moyens disponibles pour organiser la suite de leur parcours professionnel ;
- Les conditions dans lesquelles les salariés sous contrat à durée déterminée à objet défini ont priorité d'accès aux emplois en contrat à durée indéterminée dans l'entreprise.
- espace: contrat salarié . CDD . motif . classique
nom: usage
@ -77,7 +77,7 @@
alias: motif extra
description: Emplois pour lesquels, dans certains secteurs d'activité définis par décret ou par convention ou accord collectif de travail étendu, il est d'usage constant de ne pas recourir au contrat de travail à durée indéterminée en raison de la nature de l'activité exercée et du caractère par nature temporaire de ces emplois ;
références:
service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F33693
Embauche en contrat d'extra : https://www.service-public.fr/professionnels-entreprises/vosdroits/F33693
formule-futur: #TODO intégrer ça dans le formulaire. Comment ?
contrainte:
@ -107,9 +107,10 @@
- espace: contrat salarié . CDD . motif
nom: complément formation
titre: Complément de formation professionnelle assuré par l'employeur
description: l'employeur s'engage, pour une durée et dans des conditions déterminées par décret, à assurer un complément de formation professionnelle au salarié.
description: L'employeur s'engage, pour une durée et dans des conditions déterminées par décret, à assurer un complément de formation professionnelle au salarié.
références:
Code du travail - Article L1242-3 : https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=714D2E2B814371F4F1D5AA88472CD621.tpdila20v_1?idArticle=LEGIARTI000006901196&cidTexte=LEGITEXT000006072050&dateTexte=20170420
Code du travail - Décret D1242-3 : https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000018537448&cidTexte=LEGITEXT000006072050
- espace: contrat salarié . CDD . motif

View File

@ -3,7 +3,7 @@
- espace: contrat salarié
nom: CDD
nom complet: CDD
titre: Contrat à durée déterminée
description: Contrat de travail pour lequel un employeur peut recruter un salarié pour une durée déterminée, car la cause de cette détermination, de la date ou échéance de fin de contrat est prévue explicitement par le Code du travail.
référence: https://fr.wikipedia.org/wiki/Contrat_de_travail_%C3%A0_dur%C3%A9e_d%C3%A9termin%C3%A9e_en_France
# # TODO: règle de type : il faut q'un motif et une durée soient sélectionnés pour qu'un contrat soit un CDD. Cela revient à dire que les variables CDD et motif sont obligatoires *dans le contexte* de leur attache
@ -35,6 +35,7 @@
- espace: contrat salarié . CDD
nom: congés non pris
titre: Congés non pris
question: Combien de jours de congés ne seront pas pris ?
description: Combien de jours de congés ne pourront être pris par l'employé, du fait de la durée de son CDD. En jours ouvrés, par rapport aux 25 jours de congés légaux annuels.
format: nombre positif

View File

@ -3,8 +3,9 @@
titre: Événement de contrat
question: Pensez-vous être confronté à l'un de ces événements au cours du contrat ?
description: |
Certains de ces événements impactent fortement les résultats de la simulation, et peuvent donc la racourcir.
Par exemple, dans l'hypothèse d'un CDD poursuivi en CDI, aucune majoration ou indemnité ne sera à verser !
Certains événements impactent fortement les résultats de la simulation, et peuvent donc la racourcir.
> Par exemple, dans l'hypothèse d'un CDD poursuivi en CDI, aucune majoration ou indemnité ne sera à verser !
formule:
une possibilité:
- CDD poursuivi en CDI
@ -17,6 +18,7 @@
- espace: contrat salarié . CDD . événement
nom: CDD poursuivi en CDI
titre: Le CDD est poursuivi en CDI
description: En fin de contrat, le CDD est reconduit en CDI sans interruption.
# TODO quand cette variable est appelée par une autre variable,
# on devrait pouvoir poser la question, puis proposer un bouton qui permette d'aider l'utilisateur à
# y répondre, en lui expliquant la formule suivante :
@ -26,7 +28,6 @@
# - embauche en CDI suivant le CDD
# - CDD requalifié en CDI # quand ça arrive ?
- espace: contrat salarié . CDD . événement
nom: refus CDI avantageux
titre: Refus d'un CDI avantageux

View File

@ -32,8 +32,14 @@
- espace: contrat salarié
nom: salaire brut
titre: Salaire brut
question: Quel est le salaire brut ?
description: Le salaire brut peut être vu comme la somme du salaire net et des cotisations sociales salariales retenues sur le bulletin de paie d'un salarié, ou comme les sommes perçues par le salarié au titre de son contrat de travail, avant retenues sociales et fiscales.
description: |
C'est le salaire de négociation du contrat de travail en France.
Il peut être vu comme :
- la somme du salaire net et des cotisations sociales salariales retenues sur le bulletin de paie d'un salarié
- ou comme les sommes perçues par le salarié au titre de son contrat de travail, avant retenues sociales et fiscales.
format: nombre positif
# TODO En attendant que l'UI devienne plus intelligente, c'est confondu avec le salaire de base.
# intelligente : il faudrait demander : `salaire brut`, puis un bouton `qu'est-ce que c'est` pour nous guider et décortiquer la formule

View File

@ -13,7 +13,7 @@
titre: Votre obligation
action:
texte: Répondez à quelques questions pour estimer le montant des 4 obligations du CDD.
texte: Découvrez en quelques clics le montant des 4 obligations du CDD.
bouton: C'est parti !
objectif: surcoût CDD
conclusion: |
@ -21,7 +21,7 @@
Cliquez sur les obligations en bas pour comprendre vos résultats.
Une remarque ? [Écrivez-nous](mailto:contact@embauche.beta.gouv.fr) !
Une remarque ? [Écrivez-nous](/contact) !
# <i
# style={{cursor: 'pointer'}}
# className="fa fa-envelope-o"

View File

@ -1,22 +1,28 @@
#sim #help {
box-shadow: -1px 1px 15px 1px #eee;
border: 1px solid;
border-radius: 2px;
border-color: #ccc;
font-style: italic;
border: 1px solid #aaa;
border-radius: .3em;
margin: 3em;
padding: 1em;
min-width: 30%;
padding: .6em 1em;
width: 35%;
color: #444;
transition: opacity .4s;
opacity: 0;
visibility: hidden;
position: relative;
overflow: hidden;
background: white;
}
#sim #help blockquote {
font-style: italic;
font-size: 90%;
border-left: 4px solid #eee;
margin-left: .6em;
padding-left: .6em;
}
#sim #help.active {
opacity: 1
visibility: visible;
}
#sim #help i.fa-info-circle {
@ -38,3 +44,7 @@
right: .6em;
cursor: pointer;
}
#sim #help h3 {
margin: .3em 0;
}

View File

@ -1,9 +1,10 @@
import React, {Component} from 'react'
import {connect} from 'react-redux'
import {findRuleByName} from '../engine/rules'
import {findRuleByDottedName} from '../engine/rules'
import './Aide.css'
import {EXPLAIN_VARIABLE} from '../actions'
import References from './References'
import marked from '../engine/marked'
@connect(
state =>
@ -14,13 +15,16 @@ import References from './References'
})
)
export default class Aide extends Component {
renderExplanationMarkdown(explanation, term) {
return marked(`### ${term} \n\n${explanation}`)
}
render() {
let {explained, stopExplaining} = this.props
if (!explained) return <section id="help" />
let rule = findRuleByName(explained),
text = rule.description || rule.titre,
let rule = findRuleByDottedName(explained),
text = rule.description,
refs = rule.références
let possibilities = rule['choix exclusifs']
@ -31,10 +35,10 @@ export default class Aide extends Component {
<i
className="fa fa-times-circle"
onClick={stopExplaining} ></i>
<p>
{text}
<p
dangerouslySetInnerHTML={{__html: this.renderExplanationMarkdown(text, rule.titre)}}>
</p>
{ possibilities &&
{/* { possibilities &&
<p>
{possibilities.length} possibilités :
<ul>
@ -43,7 +47,7 @@ export default class Aide extends Component {
)}
</ul>
</p>
}
} */}
{refs && <div>
<p>Pour en savoir plus: </p>
<References refs={refs} />

View File

@ -0,0 +1,41 @@
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import R from 'ramda'
import marked from '../engine/marked'
// On ajoute à la section la possibilité d'ouvrir un panneau d'explication des termes.
// Il suffit à la section d'appeler une fonction fournie en lui donnant du JSX
export let AttachDictionary = dictionary => Decorated =>
class extends React.Component {
state = {
term: null,
explanation: null
}
componentDidMount() {
let decoratedNode = ReactDOM.findDOMNode(this.decorated)
decoratedNode.addEventListener('click', e => {
let term = e.target.dataset['termDefinition'],
explanation = R.path([term, 'description'], dictionary)
this.setState({explanation, term})
})
}
renderExplanationMarkdown(explanation, term) {
return marked(`### Mécanisme: ${term}\n\n${explanation}`)
}
render(){
let {explanation, term} = this.state
return (
<div className="dictionaryWrapper">
<Decorated ref={decorated => this.decorated = decorated} {...this.props} explain={this.explain}/>
{explanation &&
<div className="dictionaryPanelWrapper" onClick={() => this.setState({term: null, explanation: null})}>
<div className="dictionaryPanel"
onClick={e => {e.preventDefault(); e.stopPropagation()}}
dangerouslySetInnerHTML={{__html: this.renderExplanationMarkdown(explanation, term)}}>
</div>
</div>
}
</div>
)
}
}

View File

@ -40,6 +40,6 @@ p {
}
#questions-answers {
min-width: 55%;
min-width: 50%;
transition: width 1s;
}

View File

@ -1,65 +0,0 @@
#simulateurIntro {
background: radial-gradient(ellipse at center, #4A89DC -160%,#333350 100%);
color: white;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
#simulateurIntro h1 {
margin-top: 3%;
text-align: center;
font-size: 350%;
font-weight: 800;
}
#simulateurIntro .subtitle {
text-align: center;
font-size: 110%;
font-weight: 300;
}
#simulateurIntro {
margin-top: 4%;
}
#simulateurIntro p {
font-size: 120%;
color: white;
opacity: .9;
width: 45%;
margin: 2em auto;
}
#simulateurIntro #introduction .insist {
font-weight: 600;
/*font-style: italic;*/
}
#simulateurIntro #action {
color: white;
margin-top: 3%;
display: block;
text-align: center;
}
#simulateurIntro #action button {
color: inherit;
background: #4A89DC;
padding: .6em 1.2em;
font-size: 140%;
margin: 0 1em;
width: 12em;
border: none;
box-shadow: 0px 9px 14px 0px rgba(0, 0, 0, 0.1)
}
#simulateurIntro #action button:hover {
box-shadow: none;
opacity: .95;
}
.italic {
font-style: italic;
}

View File

@ -1,38 +0,0 @@
import React from 'react'
import colours from './themeColours'
import PageTypeIcon from './PageTypeIcon'
import './CDDIntro.css'
import {Link} from 'react-router-dom'
export default () => (
<div id="CDDIntro">
<PageTypeIcon type="simulation" />
<h1>Simulateur CDD</h1>
<div className="subtitle">
Découvrir le surcoût employeur du CDD par rapport au CDI
</div>
<section id="introduction">
<p>
En France, le contrat à durée déterminée <span className="insist">est un contrat d'exception au CDI</span>
qui apporte à l'employeur plus de souplesse dans un cadre législatif précis, comportant en particulier des contreparties financières.
</p>
<p>
Ce simulateur calcule pour vous les 4 éléments de ce surcoût :
<ul>
<li key="1">l'indemnité de fin de contrat</li>
<li key="2">le CIF</li>
<li key="3">la majoration chômage</li>
<li key="4">l'indemnité compensatrice de congés payés</li>
</ul>
</p>
<p>Par simplification, ces éléments sont tous calculés par mois de contrat.</p>
<p>
Tout au long de la simulation, cliquez sur les chaque résultat pour <span className="insist">obtenir une explication du calcul</span>. Aussi, vous avez le droit de ne pas savoir: certains termes utilisés dans la simulation ne sont pas évidents : cliquez simplement sur le symbôle qui les suit pour ouvrir une aide contextuelle.
</p>
<Link id="action" to="/cdd"><button>C'est parti !</button></Link>
<p className="italic">
Et n'hésitez pas à nous écrire &nbsp;<i style={{cursor: 'pointer'}} className="fa fa-envelope-o" /> ! La loi française est complexe, car très ciblée. Nous ne la changerons pas, mais pouvons la rendre plus transparente.
</p>
</section>
</div>
)

View File

@ -8,6 +8,7 @@
color: inherit;
/*text-decoration: none;*/
}
.references li {
margin-bottom: .15em;
}

View File

@ -22,7 +22,7 @@ export default ({refs}) => (
</span>
</span>
<a href={link} target="_blank">
{name}
{R.head(name).toUpperCase() + R.tail(name)}
</a>
</li>
})}

View File

@ -64,7 +64,7 @@
min-width: 15em;
}
#results li.irrelevant .rule-box {
background: rgba(255, 255, 255, 0.65);
background: rgba(255, 255, 255, 0.5);
}
#results li .pointer {
font-size: 300%;

View File

@ -106,7 +106,7 @@
display: none;
padding-left: 1em;
font-weight: 600;
color: #333350;
color: #4A89DC;
}
#rule-rules.showValues .situationValue {

View File

@ -14,6 +14,7 @@ import {capitalise0} from '../utils'
import knownMecanisms from '../engine/known-mecanisms.yaml'
import marked from '../engine/marked'
import References from './References'
import {AttachDictionary} from './AttachDictionary'
// situationGate function useful for testing :
let testingSituationGate = v => // eslint-disable-line no-unused-vars
@ -105,45 +106,6 @@ export default class Rule extends Component {
}
}
// On ajoute à la section la possibilité d'ouvrir à droite un panneau d'explication des termes.
// Il suffit à la section d'appeler une fonction fournie en lui donnant du JSX
// Ne pas oublier de réduire la largeur de la section pour laisser de la place au dictionnaire.
let AttachDictionary = dictionary => Decorated =>
class extends React.Component {
state = {
term: null,
explanation: null
}
componentDidMount() {
let decoratedNode = ReactDOM.findDOMNode(this.decorated)
decoratedNode.addEventListener('click', e => {
let term = e.target.dataset['termDefinition'],
explanation = R.path([term, 'description'], dictionary)
this.setState({explanation, term})
})
}
renderExplanationMarkdown(explanation, term) {
return marked(`### Mécanisme: ${term}\n\n${explanation}`)
}
render(){
let {explanation, term} = this.state
return (
<div className="dictionaryWrapper">
<Decorated ref={decorated => this.decorated = decorated} {...this.props} explain={this.explain}/>
{explanation &&
<div className="dictionaryPanelWrapper" onClick={() => this.setState({term: null, explanation: null})}>
<div className="dictionaryPanel"
onClick={e => {e.preventDefault(); e.stopPropagation()}}
dangerouslySetInnerHTML={{__html: this.renderExplanationMarkdown(explanation, term)}}>
</div>
</div>
}
</div>
)
}
}
@AttachDictionary(knownMecanisms)
class Algorithm extends React.Component {
state = {

View File

@ -84,7 +84,7 @@ export default class extends React.Component {
Pour simplifier, les résultats sont calculés par mois de contrat.
</p>
<p>
N'hésitez pas à <Link to="/contact">nous écrire</Link> ! La loi française est complexe, car très ciblée. Nous pouvons la rendre plus transparente.
N'hésitez pas à <Link to="/contact">nous écrire</Link> ! La loi française est très ciblée, et donc complexe. Nous pouvons la rendre plus transparente.
</p>
</div>
</div>

View File

@ -4,7 +4,7 @@ import './Explicable.css'
import HoverDecorator from '../HoverDecorator'
import {connect} from 'react-redux'
import {EXPLAIN_VARIABLE} from '../../actions'
import {findRuleByName} from '../../engine/rules'
import {findRuleByDottedName} from '../../engine/rules'
@connect(state => ({explained: state.explainedVariable}), dispatch => ({
@ -14,27 +14,31 @@ import {findRuleByName} from '../../engine/rules'
export default class Explicable extends React.Component {
render(){
let {
name, hover, label,
dottedName, hover, label,
explain, explained,
lightBackground
} = this.props,
rule = findRuleByName(name)
rule = findRuleByDottedName(dottedName)
// Rien à expliquer ici, ce n'est pas une règle
if (!rule) return <span>{label}</span>
let ruleLabel = label || rule.titre || rule.name
// Rien à expliquer ici, il n'y a pas de champ description dans la règle
if (!rule.description && !rule['une possibilité']) return <span>{ruleLabel}</span>
if (!rule.description)
return <span>{ruleLabel}</span>
//TODO montrer les variables de type 'une possibilité'
return (
<span
className={classNames('explicable', {explained: name === explained, dark: lightBackground})} >
{ruleLabel}
className={classNames('explicable', {explained: dottedName === explained, dark: lightBackground})} >
{ruleLabel}
<span
className="icon"
onClick={e => {e.preventDefault(); e.stopPropagation(); explain(name)}}>
onClick={e => {e.preventDefault(); e.stopPropagation(); explain(dottedName)}}>
<i className="fa fa-info" aria-hidden="true"></i>
</span>
</span>

View File

@ -80,11 +80,11 @@ export default class Question extends Component {
{this.renderChildren({children})}
</li>
: <li key={name} className="variantLeaf">
<RadioLabel {...{value: relativeDottedName(dottedName), label: titre || name, input, submit, themeColours}}/>
<RadioLabel {...{value: relativeDottedName(dottedName), label: titre || name, dottedName, input, submit, themeColours}}/>
</li>
)}
{choices.canGiveUp &&
<li key='aucun' className="variantLeaf">
<li key='aucun' className="variantLeaf aucun">
<RadioLabel {...{value: false, label: 'Aucun', input, submit, themeColours}}/>
</li>
}
@ -96,7 +96,7 @@ export default class Question extends Component {
class RadioLabel extends Component {
render() {
let {value, label, input, submit, hover, themeColours} = this.props,
let {value, label, input, submit, hover, themeColours, dottedName} = this.props,
// value = R.when(R.is(Object), R.prop('value'))(choice),
labelStyle =
Object.assign(
@ -111,7 +111,7 @@ class RadioLabel extends Component {
<input
type="radio" {...input} onClick={submit}
value={value} checked={value === input.value ? 'checked' : ''} />
<Explicable name={value} label={label}/>
<Explicable dottedName={dottedName} label={label}/>
</label>
)
}

View File

@ -88,7 +88,7 @@
border: 2px solid #333350;
color: #333350;
display: inline-block;
max-width: 60%;
max-width: 75%;
font-size: 110%;
font-weight: 600;
padding: .6em 1em;
@ -157,6 +157,7 @@
border-left: 1px dashed #ccc;
margin-top: .6em;
padding-left: .6em;
padding-top: .6em;
margin-left: 1em;
}
.step.question .variant > div {
@ -180,7 +181,9 @@
.step.question .variant .variantLeaf {
display: inline-block;
}
.step.question .variantLeaf.aucun label {
font-weight: bold;
}
.step label.radio,
/* A resume of what's been answered */
.resume {
@ -308,7 +311,7 @@ fieldset > .ignore {
.step .input-suggestions a:hover {
background: #4A89DC;
color: white;
text-decoration: none;
text-decoration: none;
}
.help-box {

View File

@ -60,7 +60,7 @@ export default class Home extends Component {
<ul>
<li key="cdd">
<span className="simulateur">Surcoût du CDD</span>
<Link to="/simulateurs/cdd"><button>Essayer</button></Link>
<Link to="/simulateurs/cdd/intro"><button>Essayer</button></Link>
</li>
<li key="embauche">
<span className="simulateur">Prix global de l'embauche</span>

View File

@ -134,7 +134,7 @@ export let constructStepMeta = ({
name: dottedName,
// question: question || name,
question: (
<Explicable label={question || name} name={name} lightBackground={true} />
<Explicable label={question || name} dottedName={dottedName} lightBackground={true} />
),
title: titre || name,
subquestion,

View File

@ -68,7 +68,7 @@ non applicable si:
> Pour une cotisation sociale, cela signifie qu'elle ne me concerne pas, que je n'ai pas à la verser.
La formule est donc à ignorer.
La formule de calcul peut donc être ignorée, quel que soit son montant.
barème:
description: |

View File

@ -456,7 +456,6 @@ let treat = (situationGate, rule) => rawNode => {
: anyNull([taux, assiette, facteur, plafond]) ?
null
: mult(val(assiette), val(taux), val(facteur), val(plafond))
return {
nodeValue,
category: 'mecanism',

View File

@ -23,8 +23,7 @@ let evaluateBottomUp = situationGate => startingFragments => {
export let evaluateVariable = (situationGate, variableName, format) => {
// test rec
let value = situationGate(variableName)
return R.contains(format)(['nombre positif', 'période'])
? value
? (value == undefined ? null : value)
: evaluateBottomUp(situationGate)(splitName(variableName))
}