[moteur] les fichiers sont réordonnés

pull/6/head
Mael Thomas 2017-01-19 16:27:27 +01:00
parent f486eded52
commit 151c83b479
11 changed files with 110 additions and 121 deletions

View File

@ -56,13 +56,13 @@
- Variable: CDD poursuivi en CDI
attache: Salariat . CDD . évènements
attache: Salariat . CDD . événements
possibilités exclusives:
- embauche en CDI suivant le CDD
- CDD requalifié en CDI # quand ça arrive ?
- Variable: refus CDI avantageux
attache: Salariat . CDD . évènements
attache: Salariat . CDD . événements
#TODO qu'est-ce ? (emploi similaire, rémunération >=)
@ -70,11 +70,11 @@
attache: Salariat . CDD
description: L'employeur s'engage à fournir une formation professionnelle, ce qui le dispense de la cotisation CIF CDD
- Variable: rupture anticipée salarié
- Variable: anticipée salarié
attache: Salariat . CDD . ruptures
- Variable: rupture pour faute grave, lourde, cas de force majeure
- Variable: pour faute grave, lourde, cas de force majeure
attache: Salariat . CDD . ruptures
- Variable: rupture CDD pendant période essai
- Variable: pendant période essai
attache: Salariat . CDD . ruptures

View File

@ -6,12 +6,12 @@
référence: Code du travail - Article L6322-37
non applicable si:
l'une de ces conditions:
- CDD poursuivi en CDI
- CDD . événements . CDD poursuivi en CDI
- CDD . type = saisonnier
- CDD . type = jeune vacances
- contrat aidé
- Salariat . contrat aidé
formule:
linéaire:
assiette: assiette cotisations sociales
assiette: Salariat . salaire de base
taux: 1%

View File

@ -9,25 +9,25 @@
non applicable si:
l'une de ces conditions:
# Evènements particuliers
- CDD poursuivi en CDI
- refus CDI avantageux
- CDD . événements . CDD poursuivi en CDI
- CDD . événements . refus CDI avantageux
# Rupture
- rupture anticipée salarié
- rupture pour faute grave, lourde, cas de force majeure
- rupture CDD pendant période essai
- CDD . rupture . anticipée salarié
- CDD . rupture . pour faute grave, lourde, cas de force majeure
- CDD . rupture . pendant période essai
- complément formation professionnelle employeur
- CDD . complément formation professionnelle employeur
# types de contrat
- contrat aidé
- Salariat . contrat aidé
- CDD . type = usage
- CDD . type = contrat jeune vacances
- CDD . type = saisonnier
formule:
linéaire:
assiette: assiette cotisations sociales
assiette: Salariat . salaire de base
taux: 10%

View File

@ -13,10 +13,10 @@
logique numérique:
- CDD poursuivi en CDI: 0%
- Contrat . type = accroissement temporaire d'activité:
- CDD . durée ≤ 1 mois: 3%
- contrat de travail durée ≤ 3 mois: 1.5%
- CDD . durée ≤ 1: 3% # TODO 1 mois, pas 1 rien, évidemment
- contrat de travail durée ≤ 3: 1.5%
- Contrat . type = usage:
- CDD . durée ≤ 3 mois: 0.5%
- CDD . durée ≤ 3: 0.5%

View File

@ -0,0 +1,22 @@
L'objectif dans un premier temps est de faire une démonstration d'interface de saisie pour calculer les obligations du CDD. Le CDD est un contrat d'exception, ce qui le rend assez complexe.
Les Variables du système social comportent des entrées particulières (des cléfs de l'objet) que l'on nommera "mécanismes". Elles diffèrent des entrées simples (telle la description d'une variable) car elles sont susceptibles de comporter des variables, et la description de calculs.
Voici une liste des mécanismes qui sont à traverser pour notamment :
- d'extraire les variables utilisées et donc que l'utilisateur devra saisir
- d'attribuer une note à ces variables pour déterminer la prochaine saisie (ou "question")
- de court-circuiter les branches rendues inutiles par la situation courante saisie par l'utilisateur, ce qui influence la note.
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 )
-----------------------------------------

View File

@ -0,0 +1,48 @@
import removeDiacritics from './remove-diacritics'
// TODO: handle dotted variable syntax
// ([\w\s]+(\s\.?\s\w+)+)\s([<?>?]?=?)\s([\w\s]+)
var replace = "regex";
var re = new RegExp(replace,"g");
"mystring".replace(re, "newstring");
// Ces regexp sont trop complexe. Ce n'est que temporaire !
let expressionTests = {
// 'negatedVariable': v => /!((?:[a-z0-9]|\s|_)+)/g.exec(v),
// 'variableIsIncludedIn': v => /((?:[a-z0-9]|\s|_)+)⊂*/g.exec(v),
'variableComparedToNumber': v => /([\w\s]+(?:\s\.\s[\w\s]+)*)\s([<>]=?)\s([0-9]+)/g.exec(v),
'variableEqualsString': v => /([\w\s]+(?:\s\.\s[\w\s]+)*)\s=\s([\w\s]+)/g.exec(v),
'variable': v => /^([\w\s]+(?:\s\.\s[\w\s]+)*)$/g.exec(v)
}
export let recognizeExpression = rawValue => {
let
value = removeDiacritics(rawValue).toLowerCase(),
match
// match = expressionTests['negatedVariable'](value)
// if (match) {
// 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
}
match = expressionTests['variableEqualsString'](value)
if (match) {
let [, variableName, string] = match
return [variableName, situation => situation(variableName) == number]
}
match = expressionTests['variable'](value)
if (match) {
let [variableName] = match
return [variableName, situation => situation(variableName) == 'oui']
}
}

View File

@ -1,82 +1,18 @@
import removeDiacritics from './utils/remove-diacritics'
import R from 'ramda'
import rules from './load-rules'
// import initialSituation from './initialSituation'
import {findRuleByName, extractRuleTypeAndName} from './model'
import removeDiacritics from './remove-diacritics'
import {findRuleByName, extractRuleTypeAndName} from './rules'
import {recognizeExpression} from './recognizeExpression'
/*
L'objectif dans un premier temps est de faire une démonstration d'interface de saisie pour calculer les obligations du CDD. Le CDD est un contrat d'exception, ce qui le rend assez complexe.
// L'objectif de la simulation : quelles règles voulons nous calculer ?
let selectedRules = rules.filter(rule =>
R.contains(
extractRuleTypeAndName(rule).name,
['CIF CDD', 'Indemnité de fin de contrat']
)
)
Les Variables du système social comportent des entrées particulières (des cléfs de l'objet) que l'on nommera "mécanismes". Elles diffèrent des entrées simples (telle la description d'une variable) car elles sont susceptibles de comporter des variables, et la description de calculs.
Voici une liste des mécanismes qui sont à traverser pour notamment :
- d'extraire les variables utilisées et donc que l'utilisateur devra saisir
- d'attribuer une note à ces variables pour déterminer la prochaine saisie (ou "question")
- de court-circuiter les branches rendues inutiles par la situation courante saisie par l'utilisateur, ce qui influence la note.
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)
}
let recognizeExpression = rawValue => {
let
value = removeDiacritics(rawValue).toLowerCase(),
match
match = expressionTests['negatedVariable'](value)
if (match) {
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
}
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
}
match = expressionTests['variableEqualsNumber'](value)
if (match) {
let [, variableName, number] = match
return [variableName, situation => situation(variableName) == number]
}
match = expressionTests['variable'](value)
if (match) {
let [variableName] = match
return [variableName, situation => situation(variableName) == 'oui']
}
}
let knownVariable = (situation, variableName) => (typeof situation(variableName) !== 'undefined')
@ -153,7 +89,7 @@ let deriveRule = situation => R.pipe(
}, [[], null])
)
let analyseVariable = situation =>
let analyseRule = situation =>
R.pipe(
extractRuleTypeAndName, // -> {type, name, rule}
data => R.assoc(
@ -162,17 +98,10 @@ let analyseVariable = situation =>
)(data)
)
// L'objectif de la simulation : quelles règles voulons nous calculer ?
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))
R.map(analyseRule(situation))
)(selectedRules)
export let variableType = name => {
@ -187,6 +116,15 @@ export let variableType = name => {
if (typeof rule.formule['somme'] !== 'undefined') return 'numeric'
}
/*--------------------------------------------------------------------------------
Ce qui suit est la première tentative d'écriture du principe du moteur et de la syntaxe */
// let types = {
/*
(expression):

View File

@ -1,19 +0,0 @@
import R from 'ramda'
import removeDiacritics from './utils/remove-diacritics'
let initialSituation = R.pipe(
R.toPairs,
R.map(([k,v])=>[removeDiacritics(k).toLowerCase(), v]),
R.fromPairs
)({
'durée determinée': true,
// 'refus CDI avantageux': true
'CDD poursuivi en CDI': false,
'CDD type saisonnier': false,
// 'contrat jeune vacances': false,
'contrat aidé': false,
'apprentissage': false,
'assiette cotisations sociales': 2300
})
export default initialSituation