[moteur] On peut voir la liste de questions nécessaires, groupées
- aucun ordre - pas cliquables encore - pas bien éditorialiséespull/6/head
parent
d1cc3d62d9
commit
3e9bee475d
|
@ -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",
|
||||
|
|
|
@ -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 ?
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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%
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
"stage-0"
|
||||
],
|
||||
"plugins": [
|
||||
"transform-decorators-legacy"
|
||||
"transform-decorators-legacy",
|
||||
"syntax-do-expressions"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
rules:
|
||||
indent:
|
||||
- 2
|
||||
- 1
|
||||
- tab
|
||||
quotes:
|
||||
- 2
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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'
|
||||
})
|
|
@ -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'))
|
||||
|
|
|
@ -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)
|
||||
)
|
||||
|
||||
|
|
|
@ -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}
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue