mirror of
https://github.com/betagouv/mon-entreprise
synced 2025-02-11 00:25:02 +00:00
Ce commit parachève la sortie de l'ensemble des functions "evaluate" de l'AST et ajoute un "nodeKind" sur chaque nœud afin de les associer à la bonne function d'évaluation. L'API pour les mécanismes pourra être améliorée afin de ne pas appeler `registerEvaluationFunction` sur chaque mécanisme mais en standardisant l'interface exportée par les mécanismes, par exemple export { name, parse, evaluate, render } Par ailleurs il devrait être facile de sortir les fonctions `jsx` en se basant sur les mêmes "nodeKind". Enfin, il faudra nettoyer l'AST pour supprimer les attributs inutilisés et ajouter du typage fort.
75 lines
1.8 KiB
TypeScript
75 lines
1.8 KiB
TypeScript
import { Leaf } from './components/mecanisms/common'
|
|
import parseRule from './parseRule'
|
|
import { disambiguateRuleReference } from './ruleUtils'
|
|
|
|
export const parseReference = (
|
|
rules,
|
|
rule,
|
|
parsedRules,
|
|
filter
|
|
) => partialReference => {
|
|
const dottedName = disambiguateRuleReference(
|
|
rules,
|
|
rule.dottedName,
|
|
partialReference
|
|
)
|
|
|
|
const inInversionFormula = rule.formule?.['inversion numérique']
|
|
|
|
const parsedRule =
|
|
parsedRules[dottedName] ||
|
|
// the 'inversion numérique' formula should not exist. The instructions to the evaluation should be enough to infer that an inversion is necessary (assuming it is possible, the client decides this)
|
|
(!inInversionFormula && parseRule(rules, dottedName, parsedRules))
|
|
const unit = parsedRule.unit
|
|
return {
|
|
nodeKind: 'reference',
|
|
jsx: Leaf,
|
|
name: partialReference,
|
|
category: 'reference',
|
|
partialReference,
|
|
dottedName,
|
|
explanation: { ...parsedRule, filter, contextRuleName: rule.dottedName },
|
|
unit
|
|
}
|
|
}
|
|
|
|
type parseReferenceTransformsParameters = {
|
|
variable: { fragments: Array<string> }
|
|
filter?: string
|
|
unit?: string
|
|
}
|
|
|
|
export const parseReferenceTransforms = (rules, rule, parsedRules) => ({
|
|
variable,
|
|
filter,
|
|
unit
|
|
}: parseReferenceTransformsParameters) => {
|
|
const referenceName = variable.fragments.join(' . ')
|
|
const originalNode = parseReference(
|
|
rules,
|
|
rule,
|
|
parsedRules,
|
|
filter
|
|
)(referenceName)
|
|
|
|
return {
|
|
...originalNode,
|
|
nodeKind: 'referenceWithTransforms',
|
|
explanation: {
|
|
originalNode,
|
|
filter,
|
|
unit
|
|
},
|
|
// Decorate node with the composante filter (either who is paying, either tax free)
|
|
...(filter
|
|
? {
|
|
cotisation: {
|
|
...(originalNode as any).cotisation,
|
|
'dû par': filter,
|
|
'impôt sur le revenu': filter
|
|
}
|
|
}
|
|
: {}),
|
|
unit: unit || originalNode.unit
|
|
}
|
|
}
|