diff --git a/package.json b/package.json
index 78f595893..f2e35f0a1 100644
--- a/package.json
+++ b/package.json
@@ -36,6 +36,7 @@
"babel-core": "^6.7.4",
"babel-eslint": "^7.1.1",
"babel-loader": "^6.2.4",
+ "babel-plugin-syntax-do-expressions": "^6.13.0",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-polyfill": "^6.9.1",
"babel-preset-es2015": "^6.6.0",
diff --git a/règles/entités/salariat/Salariat.CDD.yaml b/règles/entités/salariat/Salariat.CDD.yaml
index 4049fcb7a..5ea1946fe 100644
--- a/règles/entités/salariat/Salariat.CDD.yaml
+++ b/règles/entités/salariat/Salariat.CDD.yaml
@@ -16,7 +16,7 @@
attache: Salariat . CDD
description: |
Le CDD est un contrat d'exception: son recours doit être autorisé par l'une des raisons suivantes
- choix exclusif:
+ choix exclusifs:
- saisonnier
- jeune vacances
- sénior
@@ -60,7 +60,7 @@
référence: https://www.service-public.fr/particuliers/vosdroits/F32476
# concerne: emploi temporaire par nature
formule:
- choix exclusif:
+ choix exclusifs:
variable: Entreprise . secteur activité
possibilités:
- Déménagement
@@ -86,10 +86,11 @@
- Variable: événements
attache: Salariat . CDD
+ description: Certains événements influent le prix d'un CDD
# au lieu de lister tous les cas, l'alternative est de simplement indiquer qu'ils sont exclusifs,
# et les identifier dynamiquement par leur attribut "attache" :
# choix: exlusif # par rapport à 'choix: multiples'
- choix exclusif:
+ choix exclusifs:
- CDD poursuivi en CDI
- refus CDI avantageux
- rupture anticipée salarié
@@ -99,7 +100,7 @@
- Variable: CDD poursuivi en CDI
attache: Salariat . CDD . événements
- choix exclusif:
+ choix exclusifs:
- embauche en CDI suivant le CDD
- CDD requalifié en CDI # quand ça arrive ?
diff --git a/règles/entités/salariat/Salariat.contrats-aidés.yaml b/règles/entités/salariat/Salariat.contrats-aidés.yaml
index c47d772f1..a5dfc283e 100644
--- a/règles/entités/salariat/Salariat.contrats-aidés.yaml
+++ b/règles/entités/salariat/Salariat.contrats-aidés.yaml
@@ -1,7 +1,7 @@
- Variable: Contrat aidé
attache: Salariat
- choix exclusif:
+ choix exclusifs:
- contrat unique insertion
- emploi avenir
- CDD . motif = sénior # le choix a été fait de rattacher la notion de contrat CDD sénior au motif de recours CDD, plutôt qu'aux contrats aidés
@@ -16,13 +16,13 @@
- Variable: Contrat unique insertion
attache: Salariat . contrat aidé
- choix exclusif:
+ choix exclusifs:
- CUI-CAE
- CUI-CIE
- Variable: Alternance
attache: Salariat . alternance
- choix exclusif:
+ choix exclusifs:
- apprentissage
- professionnalisation
diff --git a/règles/entités/salariat/Salariat.yaml b/règles/entités/salariat/Salariat.yaml
index 7d22293e9..f4eef6bf3 100644
--- a/règles/entités/salariat/Salariat.yaml
+++ b/règles/entités/salariat/Salariat.yaml
@@ -10,7 +10,8 @@
# Cet ensemble de variables sont définies implicitement sur l'entité Salariat
- Variable: Salaire de base
- type: nombre positif
+ attache: Salariat
+ contrainte: nombre positif
- Variable: Salaire brut
formule:
diff --git a/règles/rémunération-travail/cdd/majoration-chomage.yaml b/règles/rémunération-travail/cdd/majoration-chomage.yaml
index 1a699fe27..b96cb2d61 100644
--- a/règles/rémunération-travail/cdd/majoration-chomage.yaml
+++ b/règles/rémunération-travail/cdd/majoration-chomage.yaml
@@ -5,18 +5,18 @@
type: majoration
description: Majoration des contributions patronales d’assurance chômage pour les contrats à durée déterminée courts (CDD)
-
+ concerne: Salariat . CDD . durée <= 3
formule:
linéaire:
assiette: assiette cotisations sociales
taux:
logique numérique:
- - CDD poursuivi en CDI: 0%
- - motif . accroissement temporaire d'activité:
- - durée ≤ 1: 3% # TODO 1 mois, pas 1 rien, évidemment
- - durée ≤ 3: 1.5%
- - motif . usage:
- - durée ≤ 3: 0.5%
+ - Salariat . CDD . événements . CDD poursuivi en CDI: 0%
+ - Salariat . CDD . motif . accroissement temporaire d'activité:
+ - Salariat . CDD . durée ≤ 1: 3% # TODO 1 mois, pas 1 rien, évidemment
+ - Salariat . CDD . durée ≤ 3: 1.5%
+ - Salariat . CDD . motif . usage:
+ - Salariat . CDD . durée ≤ 3: 0.5%
diff --git a/règles/rémunération-travail/cotisations/agirc.yaml b/règles/rémunération-travail/cotisations/agirc.yaml
index bbdad1020..a9905ddf5 100644
--- a/règles/rémunération-travail/cotisations/agirc.yaml
+++ b/règles/rémunération-travail/cotisations/agirc.yaml
@@ -11,8 +11,6 @@
- http://www.journaldunet.com/management/pratique/primes-et-avantages/5079/gmp-2016-la-garantie-minimale-de-points-calcul-et-montant.html
concerne:
- categorie salarié = privé cadre
- 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.
formule:
barème en taux marginaux:
@@ -60,3 +58,7 @@
1993-07: .0234
- seuil: 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/source/.babelrc b/source/.babelrc
index 15b839870..32dd00f0e 100644
--- a/source/.babelrc
+++ b/source/.babelrc
@@ -5,6 +5,7 @@
"stage-0"
],
"plugins": [
- "transform-decorators-legacy"
+ "transform-decorators-legacy",
+ "syntax-do-expressions"
]
}
diff --git a/source/.eslintrc b/source/.eslintrc
index 36f70fc9b..5d662ed48 100644
--- a/source/.eslintrc
+++ b/source/.eslintrc
@@ -1,6 +1,6 @@
rules:
indent:
- - 2
+ - 1
- tab
quotes:
- 2
diff --git a/source/containers/Home.js b/source/containers/Home.js
index 7a2ba2d93..35b4f829e 100644
--- a/source/containers/Home.js
+++ b/source/containers/Home.js
@@ -35,7 +35,7 @@ export default class Home extends Component {
{this.state.userSearch != null &&
searchRules(this.state.userSearch)
- .map(({type, name, rule}) =>
+ .map(({type, name}) =>
-
{type}
diff --git a/source/engine/conversation.js b/source/engine/conversation.js
new file mode 100644
index 000000000..96dfe2f02
--- /dev/null
+++ b/source/engine/conversation.js
@@ -0,0 +1,8 @@
+export let constructStepMeta = ({name, description}) => ({
+ name: name,
+ question: description || name,
+ title: name,
+ dependencyOfVariables: ['chai pas'],
+ visible: true,
+ helpText: 'Voila un peu d\'aide poto'
+})
diff --git a/source/engine/rules.js b/source/engine/rules.js
index bf48b8830..87d85b646 100644
--- a/source/engine/rules.js
+++ b/source/engine/rules.js
@@ -3,10 +3,11 @@ import entityRules from './load-entity-rules'
import possibleVariableTypes from './possibleVariableTypes.yaml'
import {borrify} from './remove-diacritics'
+import R from 'ramda'
export let findRuleByName = search =>
rules
- .map(extractRuleTypeAndName)
+ .map(enrichRule)
.find( ({name}) =>
name === search
)
@@ -16,22 +17,39 @@ export let searchRules = searchInput =>
.filter( rule =>
rule && hasKnownRuleType(rule) &&
JSON.stringify(rule).indexOf(searchInput) > -1)
- .map(extractRuleTypeAndName)
+ .map(enrichRule)
-export let extractRuleTypeAndName = rule => {
+export let enrichRule = rule => {
let type = possibleVariableTypes.find(t => rule[t])
- return {type, name: rule[type], rule, alias: rule.alias}
+ return {...rule, type, name: rule[type]}
}
-export let hasKnownRuleType = rule => rule && extractRuleTypeAndName(rule).type
+export let hasKnownRuleType = rule => rule && enrichRule(rule).type
let fullDottedName = rule => rule.attache && borrify(
[ rule.attache,
- (({alias, name}) => alias || name)(extractRuleTypeAndName(rule)),
+ do { let {alias, name} = enrichRule(rule)
+ alias || name
+ }
].join(' . ')
)
-export let findGroup = dottedName => console.log('findGroup', dottedName) ||
- entityRules.find(rule => fullDottedName(rule) == dottedName && rule['choix exclusif'])
+export let findRuleByDottedName = dottedName =>
+ entityRules.map(enrichRule).find(rule => fullDottedName(rule) == borrify(dottedName))
+
+export let findGroup = R.pipe(
+ findRuleByDottedName,
+ found => found && found['choix exclusifs'] && found,
+ // Is there a way to express this more litterally in ramda ?
+ // R.unless(
+ // R.isNil,
+ // R.when(
+ // R.has('choix exclusifs'),
+ // R.identity
+ // )
+ // )
+)
+
+console.log('findG', findGroup('Salariat . CDD . événements'))
diff --git a/source/engine/traverse.js b/source/engine/traverse.js
index edc8c444e..da120f9f0 100644
--- a/source/engine/traverse.js
+++ b/source/engine/traverse.js
@@ -1,14 +1,14 @@
import R from 'ramda'
import rules from './load-rules'
import removeDiacritics from './remove-diacritics'
-import {findRuleByName, extractRuleTypeAndName} from './rules'
+import {findRuleByName, enrichRule} from './rules'
import {recognizeExpression} from './expressions'
// L'objectif de la simulation : quelles règles voulons nous calculer ?
let selectedRules = rules.filter(rule =>
R.contains(
- extractRuleTypeAndName(rule).name,
+ enrichRule(rule).name,
['CIF CDD', 'Indemnité de fin de contrat']
)
)
@@ -91,10 +91,10 @@ let deriveRule = situation => R.pipe(
let analyseRule = situation =>
R.pipe(
- extractRuleTypeAndName, // -> {type, name, rule}
+ enrichRule, // -> {type, name, rule}
data => R.assoc(
'derived',
- deriveRule(situation)(data.rule)
+ deriveRule(situation)(data)
)(data)
)
diff --git a/source/reducers.js b/source/reducers.js
index 033a32bcd..9af5dd5ad 100644
--- a/source/reducers.js
+++ b/source/reducers.js
@@ -13,7 +13,8 @@ import { STEP_ACTION, UNSUBMIT_ALL, START_CONVERSATION} from './actions'
import R from 'ramda'
import {borrify} from './engine/remove-diacritics'
-import {findGroup} from './engine/rules'
+import {findGroup, findRuleByDottedName} from './engine/rules'
+import {constructStepMeta} from './engine/conversation'
import computeThemeColours from './components/themeColours'
@@ -68,50 +69,84 @@ export default reduceReducers(
)(analysedSituation),
missingVariablesList = R.keys(missingVariables),
+ yà = console.log('missingVariablesList', missingVariablesList),
+
// identification des groupes de variables manquantes
- groups = [...missingVariablesList.reduce(
- (set, variable) => {
- let subs = R.pipe(
- borrify,
- R.split(' . '),
- R.dropLast(1),
- R.join(' . ')
- )(variable)
+ // groups = [...missingVariablesList.reduce(
+ // (set, variable) => {
+ // let subs = R.pipe(
+ // borrify,
+ // R.split(' . '),
+ // R.dropLast(1),
+ // R.join(' . ')
+ // )(variable)
+ //
+ // if (subs.length)
+ // set.add(subs)
+ //
+ // return set
+ // }
+ // , new Set())],
+ groups = R.groupBy(
+ R.pipe(
+ borrify,
+ R.split(' . '),
+ R.dropLast(1),
+ R.join(' . ')
+ )
+ )(missingVariablesList),
- if (subs.length)
- set.add(subs)
+ yo = console.log('groups', groups),
- return set
- }
- , new Set())],
- // -> groups Set [ "salariat . cdd . evenements", "salariat . cdd . type", "salariat", "salariat . cdd" ]
-
- richGroups = R.pipe(
- R.map(findGroup),
- R.reject(R.isNil)
+ // on va maintenant construire la liste des composants React correspondant aux questions pour obtenir les variables manquantes
+ yyoo = R.pipe(
+ R.mapObjIndexed((variables, group) =>
+ R.pipe(
+ findGroup,
+ R.cond([
+ // Pas de groupe trouvé : ce sont des variables individuelles
+ [R.isNil, () => variables.map(name => {
+ let rule = findRuleByDottedName(name)
+ console.log('rule', name, rule)
+ return Object.assign(constructStepMeta(rule),
+ rule.contrainte == 'nombre positif' ?
+ {
+ component: Input,
+ defaultValue: 0,
+ valueType: euro,
+ attributes: {
+ inputMode: 'numeric',
+ placeholder: 'votre réponse'
+ }
+ } : {
+ component: Question,
+ choices: ['Non', 'Oui'],
+ defaultValue: 'Non',
+ }
+ )})],
+ [R.T, group =>
+ Object.assign(
+ constructStepMeta(group),
+ {
+ component: Question,
+ choices: group['choix exclusifs'],
+ defaultValue: 'Non',
+ helpText: 'Choisissez une réponse'
+ }
+ )]
+ ])
+ )(group)
+ ),
+ R.values,
+ R.unnest
)(groups),
- possibilities = richGroups[0]['choix exclusif']
-
-
- // récupération du groupe. Inclure toutes les possibilités du groupe dans la question pour permettre à
- // l'utilisateur de faire un choix réfléchi -> Question (réponses possibles)
+ l = console.log('yyoo', yyoo)
// la question doit pouvoir stocker tout ça dans la situation (redux-form) correctement
- console.log("groupPossibilities", possibilities)
-
- return {...state, steps: [{
- name: 'év',
- question: 'év',
- title: 'év',
- dependencyOfVariables: ['je sais pas'],
- visible: true,
- component: Question,
- choices: possibilities,
- defaultValue: 'Non'
- }], analysedSituation}
+ return {...state, steps: yyoo, analysedSituation}