[moteur] On peut voir la liste de questions nécessaires, groupées

- aucun ordre
- pas cliquables encore
- pas bien éditorialisées
pull/6/head
Mael Thomas 2017-01-24 16:22:40 +01:00
parent d1cc3d62d9
commit 3e9bee475d
13 changed files with 135 additions and 68 deletions

View File

@ -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",

View File

@ -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 ?

View File

@ -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

View File

@ -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:

View File

@ -5,18 +5,18 @@
type: majoration
description: Majoration des contributions patronales dassurance 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%

View File

@ -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 lentreprise jusquà 20 %. De 20 % à 20,30 %, la répartition est la suivante : 66,67 % à la charge du salarié et 33,33 % pour lemployeur.
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 lentreprise jusquà 20 %. De 20 % à 20,30 %, la répartition est la suivante : 66,67 % à la charge du salarié et 33,33 % pour lemployeur.

View File

@ -5,6 +5,7 @@
"stage-0"
],
"plugins": [
"transform-decorators-legacy"
"transform-decorators-legacy",
"syntax-do-expressions"
]
}

View File

@ -1,6 +1,6 @@
rules:
indent:
- 2
- 1
- tab
quotes:
- 2

View File

@ -35,7 +35,7 @@ export default class Home extends Component {
<ul>
{this.state.userSearch != null &&
searchRules(this.state.userSearch)
.map(({type, name, rule}) =>
.map(({type, name}) =>
<li key={name}>
<span className="rule-type">
{type}

View File

@ -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'
})

View File

@ -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'))

View File

@ -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)
)

View File

@ -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),
= 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}