diff --git a/règles/rémunération-travail/cdd/indemnité_fin_contrat.yaml b/règles/rémunération-travail/cdd/indemnité_fin_contrat.yaml index 4897c6019..c4dade16c 100644 --- a/règles/rémunération-travail/cdd/indemnité_fin_contrat.yaml +++ b/règles/rémunération-travail/cdd/indemnité_fin_contrat.yaml @@ -22,10 +22,10 @@ - contrat aidé # - apprentissage - contrat jeune vacances # (contrat conclu avec un jeune pendant ses vacances scolaires ou universitaires.) - - saisonnier + - CDD type saisonnier formule: linéaire: - assiette: salaire brut + assiette: assiette cotisations sociales taux: 10% références: diff --git a/règles/rémunération-travail/cdd/simples/CIF.yaml b/règles/rémunération-travail/cdd/simples/CIF.yaml index 5003b2c85..cc87bf24c 100644 --- a/règles/rémunération-travail/cdd/simples/CIF.yaml +++ b/règles/rémunération-travail/cdd/simples/CIF.yaml @@ -11,9 +11,9 @@ # Types de CDD - CDD type saisonnier # TODO Commentés pour le développement de la démo CDD seulement - # - contrat jeune vacances - # - contrat aidé # voir la définition précise dans indemnité de fin de contrat - # - apprentissage + - contrat jeune vacances + - contrat aidé # voir la définition précise dans indemnité de fin de contrat + - apprentissage formule: linéaire: diff --git a/source/reducers.js b/source/reducers.js index 201ac7fc9..b479599df 100644 --- a/source/reducers.js +++ b/source/reducers.js @@ -55,10 +55,14 @@ export default reduceReducers( // on calcule la prochaine étape, à ajouter sur la pile let analysedSituation = analyseSituation(name => formValueSelector('conversation')(state, name)), - [firstMissingVariable] = R.pipe( - R.map(({derived: [missingVariables]}) => missingVariables), + yo = console.log('analysedSituation', analysedSituation), + missingVariables = R.pipe( + R.map(({derived: [missingVariables]}) => missingVariables || []), R.flatten )(analysedSituation), + yo2 = console.log('miss', missingVariables), + + [firstMissingVariable] = missingVariables, type = variableType(firstMissingVariable), diff --git a/source/traverse.js b/source/traverse.js index ac4f492b1..2db02f7ed 100644 --- a/source/traverse.js +++ b/source/traverse.js @@ -17,32 +17,28 @@ Voici une liste des mécanismes qui sont à traverser pour notamment : Dans un premier temps, l'idée est de créer un formulaire à questions unitaires optimisées pour que la saisie de données inutiles soit évitée. - - Il faut résoudre le calcul des variables. - ça introduit l'assiette 2300€ - ça nous donne son intervalle en % vu que l'assiette est constante, et donc un avancement du formulaire - ça nous donne des résultats !!!!!! :)) - - Il faut donner des explications à TOUTES les variables. Aucune n'est triviale ! - Il faut ajouter la notion d'entité. - Ce qui permettra de regrouper les questions par thème. Exemple, demander "Quel type de CDD" et ordonner les réponses possibles par influence (e.g. si c'est un CDD d'usage ) - ----------------------------------------- */ - let expressionTests = { 'negatedVariable': v => /!((?:[a-z0-9]|\s|_)+)/g.exec(v), // Cette regexp est trop complexe (il faut parser le tableau après le symbole d'inclusion) ! // 'variableIsIncludedIn': v => /((?:[a-z0-9]|\s|_)+)⊂*/g.exec(v), 'variableComparedToNumber': v => /((?:[a-z0-9]|\s|_)+)([<|>]=?)\s+([0-9]+)/g.exec(v), - 'numberComparedToVariable': v => /([0-9]+)\s+([<|>]=?)((?:[a-z0-9]|\s|_)+)/g.exec(v), - 'variableEqualsNumber': v => /((?:[a-z0-9]|\s|_)+)=((?:[a-z0-9]|\s|_)+)/g.exec(v), - 'variable': v => /((?:[a-z0-9]|\s|_)+)/g.exec(v) + 'numberComparedToVariable': v => /([0-9]+)\s+([<|>]=?)((?:[a-z0-9]|\s|_)+)/g.exec(v), + 'variableEqualsNumber': v => /((?:[a-z0-9]|\s|_)+)=((?:[a-z0-9]|\s|_)+)/g.exec(v), + 'variable': v => /((?:[a-z0-9]|\s|_)+)/g.exec(v) } let recognizeExpression = rawValue => { @@ -55,19 +51,18 @@ let recognizeExpression = rawValue => { let [, variableName] = match // return [variableName, `!${variableName}`] return [variableName, situation => situation(variableName) == 'non'] - } match = expressionTests['variableComparedToNumber'](value) if (match) { let [, variableName, symbol, number] = match - return [variableName, situation => eval(`situation("${variableName}") ${symbol} ${number}`)] //eslint-disable-line no-unused-vars + return [variableName, situation => eval(`situation("${variableName}") ${symbol} ${number}`)] // eslint-disable-line no-unused-vars } match = expressionTests['numberComparedToVariable'](value) if (match) { let [, number, symbol, variableName] = match - return [variableName, situation => eval(`${number} ${symbol} situation("${variableName}")`)] //eslint-disable-line no-unused-vars + return [variableName, situation => eval(`${number} ${symbol} situation("${variableName}")`)] // eslint-disable-line no-unused-vars } match = expressionTests['variableEqualsNumber'](value) @@ -76,7 +71,6 @@ let recognizeExpression = rawValue => { return [variableName, situation => situation(variableName) == number] } - match = expressionTests['variable'](value) if (match) { let [variableName] = match @@ -90,12 +84,12 @@ let deriveRule = situation => R.pipe( R.toPairs, // Reduce to [variables needed to compute that variable, computed variable value] R.reduce(([variableNames, result], [key, value]) => { - if (key === 'concerne'){ + if (key === 'concerne') { let [variableName, evaluation] = recognizeExpression(value) // Si cette variable a été renseignée - if (knownVariable(situation, variableName)){ + if (knownVariable(situation, variableName)) { // Si l'expression n'est pas vraie... - if (!evaluation(situation)){ + if (!evaluation(situation)) { // On court-circuite toute la variable, et on n'a besoin d'aucune information ! return R.reduced([[]]) } else { @@ -111,7 +105,7 @@ let deriveRule = situation => R.pipe( let [subVariableNames, reduced] = R.reduce(([variableNames], expression) => { let [variableName, evaluation] = recognizeExpression(expression) - if (knownVariable(situation, variableName)){ + if (knownVariable(situation, variableName)) { if (evaluation(situation)) { return R.reduced([[], true]) } else { @@ -124,8 +118,8 @@ let deriveRule = situation => R.pipe( else return [variableNames.concat(subVariableNames)] } - if (key === 'formule'){ - if (value['linéaire']){ + if (key === 'formule') { + if (value['linéaire']) { let {assiette, taux} = value['linéaire'] // A propos de l'assiette @@ -133,7 +127,7 @@ let deriveRule = situation => R.pipe( assietteValue = situation(assietteVariableName), unknownAssiette = assietteValue == undefined - if (unknownAssiette){ + if (unknownAssiette) { return [[...variableNames, assietteVariableName]] } else { if (variableNames.length > 0) { @@ -144,11 +138,11 @@ let deriveRule = situation => R.pipe( // Arrivés là, cette formule devrait être calculable ! // A propos du taux - if (typeof taux !== 'string' && typeof taux !== 'number'){ + if (typeof taux !== 'string' && typeof taux !== 'number') { throw 'Oups, pas de taux compliqués s\'il-vous-plaît' } let tauxValue = taux.indexOf('%') > -1 ? - +taux.replace('%', '')/100 : + +taux.replace('%', '') / 100 : +taux return R.reduced([null, assietteValue * tauxValue]) @@ -156,11 +150,9 @@ let deriveRule = situation => R.pipe( } return [variableNames] - }, [[], null]) + }, [[], null]) ) - - let analyseVariable = situation => R.pipe( extractRuleTypeAndName, // -> {type, name, rule} @@ -171,15 +163,18 @@ let analyseVariable = situation => ) // L'objectif de la simulation : quelles règles voulons nous calculer ? -let selectedRules = rules.filter(r => extractRuleTypeAndName(r).name == 'CIF CDD') +let selectedRules = rules.filter(rule => + R.contains( + extractRuleTypeAndName(rule).name, + ['CIF CDD', 'Indemnité de fin de contrat'] + ) + ) export let analyseSituation = situation => R.pipe( R.map(analyseVariable(situation)) )(selectedRules) - - export let variableType = name => { console.log('Getting variable type for ', name) if (name == null) return null @@ -193,9 +188,6 @@ export let variableType = name => { if (typeof rule.formule['somme'] !== 'undefined') return 'numeric' } - - - // let types = { /* (expression): @@ -234,7 +226,6 @@ Variable: Les expressions sont le seul mécanisme relativement embêtant pour le moteur. Dans un premier temps, il les gerera au moyen d'expressions régulières, puis il faudra probablement mieux s'équiper avec un "javascript parser generator" : https://medium.com/@daffl/beyond-regex-writing-a-parser-in-javascript-8c9ed10576a6 - (variable): (string) (négation): @@ -262,7 +253,6 @@ in Variable.formule : variable: (variable) possibilités: [variable.type] - # pas nécessaire pour le CDD in Variable @@ -272,7 +262,4 @@ in Variable.formule : si: (expression) # corps - - - */