⚙️🔥 refactor parseReference pour moins de bugs

note: il y a encore du boulot, mais c'est mieux
pull/757/head
Johan Girod 2019-11-05 16:02:08 +01:00
parent 3bb5c1ec67
commit 66c09a8f64
13 changed files with 69 additions and 92 deletions

View File

@ -37,7 +37,7 @@ questions:
situation:
auto-entrepreneur: non
indépendant: non
contrat salarié . assimilé salarié: oui
assimilé salarié: oui
contrat salarié . temps partiel: non
contrat salarié . ATMP . taux réduit: oui
période: année

View File

@ -27,7 +27,7 @@ branches:
auto-entrepreneur: non
indépendant: non
contrat salarié: oui
contrat salarié . assimilé salarié: oui
assimilé salarié: oui
contrat salarié . ATMP . taux réduit: oui
- nom: Indépendant
situation:

View File

@ -29,7 +29,7 @@ questions:
- contrat salarié . complémentaire santé . part employeur
- contrat salarié . régime des impatriés
situation:
contrat salarié . assimilé salarié: non
assimilé salarié: non
indépendant: non
auto-entrepreneur: non
période: mois

View File

@ -40,9 +40,6 @@ export const evaluateApplicability = (
notApplicable?.missingVariables || {},
applicable?.missingVariables || {}
])
// On veut abaisser le score des conséquences par rapport aux conditions,
// mais seulement dans le cas où une condition est effectivement présente
if (node.dottedName === 'x . y') console.log(node, parentDependency)
return {
nodeValue: isApplicable,
missingVariables,

View File

@ -31,7 +31,7 @@ export let getSituationValue = (situationGate, variableName, rule) => {
if (rule.API) return typeof value == 'string' ? JSON.parse(value) : value
if (rule.unit != null) {
return value == undefined ? null : +value
return value == undefined ? value : +value
}
// a leaf variable with an unit attribute is not boolean

View File

@ -24,11 +24,11 @@ const lexer = moo.compile({
'[': '[',
']': ']',
comparison: ['>','<','>=','<=','=','!='],
additionSubstraction: /[\+-]/,
multiplicationDivision: ['*','/'],
words: new RegExp(words),
number: new RegExp(numberRegExp),
string: /'[ \t\.'a-zA-Z\-\u00C0-\u017F0-9 ]+'/,
additionSubstraction: /[\+-]/,
multiplicationDivision: ['*','/'],
'€': '€',
dot: ' . ',
letterOrNumber: new RegExp(letterOrNumber),

View File

@ -7,12 +7,6 @@ import { getSituationValue } from './getSituationValue'
import { Leaf } from './mecanismViews/common'
import { disambiguateRuleReference, findRuleByDottedName } from './rules'
const ruleHasConditions = rule =>
rule['applicable si'] != null ||
rule['non applicable si'] != null ||
rule.isDisabledBy?.length >= 1 ||
rule.parentDependency
let evaluateReference = (filter, contextRuleName) => (
cache,
situation,
@ -65,17 +59,8 @@ let evaluateReference = (filter, contextRuleName) => (
cached = cache[cacheName]
if (cached) return cached
let variableHasFormula = rule.formule != null,
variableHasCond = ruleHasConditions(rule, rules),
situationValue = getSituationValue(situation, dottedName, rule),
needsEvaluation =
situationValue == null && (variableHasCond || variableHasFormula)
let explanation = needsEvaluation
? evaluateNode(cache, situation, rules, rule)
: rule
let cacheAndNode = (nodeValue, missingVariables, customExplanation) => {
let cacheNode = (nodeValue, missingVariables, explanation) => {
// console.log(node.dottedName, nodeValue)
missingVariables = missingVariableList.reduce(
mergeMissing,
missingVariables
@ -83,44 +68,38 @@ let evaluateReference = (filter, contextRuleName) => (
cache[cacheName] = {
...node,
nodeValue,
explanation: customExplanation || explanation,
...(explanation && { explanation }),
missingVariables
}
return cache[cacheName]
}
const variableScore = rule.defaultValue ? 1 : 2
// SITUATION 1 : La variable est directement renseignée
if (situationValue != null) {
return cacheAndNode(
situationValue,
{},
{ ...explanation, nodeValue: situationValue }
const {
nodeValue: isApplicable,
missingVariables: condMissingVariables
} = evaluateApplicability(cache, situation, rules, rule)
if (!isApplicable) {
return cacheNode(isApplicable, condMissingVariables)
}
const situationValue = getSituationValue(situation, dottedName, rule)
if (situationValue !== undefined) {
return cacheNode(situationValue, condMissingVariables, {
...rule,
nodeValue: situationValue
})
}
if (rule.formule != null) {
const evaluation = evaluateNode(cache, situation, rules, rule)
return cacheNode(
evaluation.nodeValue,
evaluation.missingVariables,
evaluation
)
}
// SITUATION 2 : La variable est calculée
if (situationValue == null && variableHasFormula)
return cacheAndNode(explanation.nodeValue, explanation.missingVariables)
// SITUATION 3 : La variable est une question sans condition dont la valeur n'a pas été renseignée
if (situationValue == null && !variableHasFormula && !variableHasCond)
return cacheAndNode(null, { [dottedName]: variableScore })
// SITUATION 4 : La variable est une question avec conditions
if (situationValue == null && !variableHasFormula && variableHasCond) {
// SITUATION 4.1 : La condition est connue et vrai
if (explanation.isApplicable)
return rule.question
? cacheAndNode(null, { [dottedName]: variableScore })
: cacheAndNode(true, {})
// SITUATION 4.2 : La condition est connue et fausse
if (explanation.isApplicable === false) return cacheAndNode(false, {})
// SITUATION 4.3 : La condition n'est pas connue
return cacheAndNode(null, explanation.missingVariables)
}
return cacheNode(null, { [dottedName]: rule.defaultValue ? 1 : 2 })
}
export let parseReference = (
rules,

View File

@ -616,26 +616,28 @@ contrat salarié . CDD . surcoût:
compensation pour congés non pris: 39.6
valeur attendue: 200
contrat salarié . assimilé salarié:
assimilé salarié:
description: |
Certains dirigeants d'entreprise (c'est notamment le cas pour les SASU) sont considérés par la sécurité sociale comme assimilés aux salariés. Ils sont alors au régime général de la sécurité sociale, avec quelques contraintes cependant. Par exemple, ils ne cotisent pas au chômage, et n'y ont donc pas droit.
question: Le salarié est-il considéré comme "assimilé salarié" ?
par défaut: non
remplace:
règle: contrat salarié
par: "'CDI'"
rend non applicable:
- contrat salarié
- chômage
- réduction générale
- allocations familiales . taux réduit
- contrat salarié . chômage
- contrat salarié . réduction générale
- contrat salarié . allocations familiales . taux réduit
- contrat salarié . maladie . taux employeur . taux réduit
- lodeom
- AGS
- APEC
- contribution au dialogue social
- temps de travail . temps partiel
- temps de travail . heures supplémentaires
- statut JEI
- contrat salarié . lodeom
- contrat salarié . AGS
- contrat salarié . APEC
- contrat salarié . contribution au dialogue social
- contrat salarié . temps de travail . temps partiel
- contrat salarié . temps de travail . heures supplémentaires
- contrat salarié . statut JEI
- entreprise . association non lucrative
- régime des impatriés
- contrat salarié . régime des impatriés
références:
Le régime des dirigeants: https://www.urssaf.fr/portail/home/employeur/creer/choisir-une-forme-juridique/le-statut-du-dirigeant/les-dirigeants-rattaches-au-regi.html
@ -886,7 +888,7 @@ contrat salarié . rémunération . primes:
formule: activité
contrat salarié . rémunération . primes . activité:
période: flexible
unité:
unité:
titre: primes d'activité
description: >
Primes et gratifications versées en contrepartie, ou à loccasion du travail, directement liées à lexécution par le salarié de sa prestation de travail. Tel est le cas, par exemple, dune prime de vente exclusivement basée sur les résultats du salarié.
@ -3344,7 +3346,7 @@ entreprise . rémunération totale du dirigeant:
- revenu net après impôt
- entreprise . chiffre d'affaires
- entreprise . chiffre d'affaires minimum
- si: contrat salarié . assimilé salarié
- si: assimilé salarié
alors: contrat salarié . rémunération . total
entreprise . charges:
@ -4993,8 +4995,8 @@ contrat salarié . convention collective . hôtel café restaurant:
formule: convention collective = 'hôtel café restaurant'
description: L'entreprise est un hôtel, café, restaurant ou assimilé.
contrat salarié . convention collective . hôtel café restaurant . montant forfaitaire d'un repas:
période: aucune
? contrat salarié . convention collective . hôtel café restaurant . montant forfaitaire d'un repas
: période: aucune
remplace:
règle: rémunération . avantages en nature . nourriture . montant forfaitaire d'un repas
formule: 3.62 €/repas
@ -5107,8 +5109,7 @@ contrat salarié . convention collective . sportifs . cotisations:
Article 8.6 de la CCNS (IDCC2511): https://www.legifrance.gouv.fr/affichIDCCArticle.do;?idArticle=KALIARTI000034406905&cidTexte=KALITEXT000017577657&dateTexte=29990101&categorieLien=id
? contrat salarié . convention collective . sportifs . cotisations . formation professionnelle . plan de formation
:
période: flexible
: période: flexible
formule:
le maximum de:
- versement minimum
@ -5127,8 +5128,7 @@ contrat salarié . convention collective . sportifs . cotisations:
formule: 30 €/mois
? contrat salarié . convention collective . sportifs . cotisations . formation professionnelle . professionnalisation
:
période: flexible
: période: flexible
formule:
le maximum de:
- versement minimum
@ -5184,8 +5184,7 @@ contrat salarié . convention collective . sportifs . exonération taux AT:
par défaut: non
? contrat salarié . convention collective . sportifs . cotisations . assiette forfaitaire
:
applicable si: assiette franchisée < 115 * SMIC horaire
: applicable si: assiette franchisée < 115 * SMIC horaire
période: mois
remplace: contrat salarié . cotisations . assiette forfaitaire
formule:

View File

@ -545,7 +545,7 @@ contrat salarié . CDD . surcoût:
Certaines sont versées en fin de contrat, d'autres avec chaque salaire
mensuel; elles sont ici ramenées à leur coût mensuel.
contrat salarié . assimilé salarié:
assimilé salarié:
description.en: >
Some company managers (this is particularly the case for SASUs) are
considered by the social security system as equivalent to employees. They

View File

@ -64,7 +64,7 @@ describe('bug-analyse-many', function() {
'contrat salarié . rémunération . net de cotisations': 3500,
'auto-entrepreneur': 'non',
'contrat salarié': 'oui',
'contrat salarié . assimilé salarié': 'oui',
'assimilé salarié': 'oui',
'contrat salarié . ATMP . taux réduit': 'oui',
'contrat salarié . CDD': 'non',
'contrat salarié . indemnité kilométrique vélo . indemnité vélo active':

View File

@ -1,11 +1,5 @@
- test: Composantes
formule:
multiplication:
assiette: richesse
composantes:
- taux: 8%
- taux: 2%
formule: impôts
unité attendue: crédits
exemples:
- nom:
@ -15,3 +9,11 @@
- nom: richesse
unité: crédits
formule: 100
- nom: impôts
formule:
multiplication:
assiette: richesse
composantes:
- taux: 8%
- taux: 2%

View File

@ -12,7 +12,7 @@
- nom: evasion fiscale
situation:
exilé fiscal: oui
valeur attendue: 0
valeur attendue: false
- nom: bon citoyen
situation:
exilé fiscal: non

View File

@ -60,12 +60,12 @@ atmp:
contrat salarié . ATMP . taux collectif ATMP: 0.05
assimilé salarié:
- contrat salarié . assimilé salarié: true
- assimilé salarié: true
contrat salarié . rémunération . brut de base: 5000
- contrat salarié . assimilé salarié: true
- assimilé salarié: true
contrat salarié . rémunération . brut de base: 1500
entreprise . ACRE: true
- contrat salarié . assimilé salarié: true
- assimilé salarié: true
contrat salarié . rémunération . brut de base: 3000
entreprise . ACRE: true