⚙️🔥 refactor parseReference pour moins de bugs
note: il y a encore du boulot, mais c'est mieuxpull/757/head
parent
3bb5c1ec67
commit
66c09a8f64
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 à l’occasion du travail, directement liées à l’exécution par le salarié de sa prestation de travail. Tel est le cas, par exemple, d’une 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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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':
|
||||
|
|
|
@ -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%
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
- nom: evasion fiscale
|
||||
situation:
|
||||
exilé fiscal: oui
|
||||
valeur attendue: 0
|
||||
valeur attendue: false
|
||||
- nom: bon citoyen
|
||||
situation:
|
||||
exilé fiscal: non
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue