diff --git a/source/engine/evaluation.js b/source/engine/evaluation.js index 23aec5a93..df457a620 100644 --- a/source/engine/evaluation.js +++ b/source/engine/evaluation.js @@ -44,15 +44,18 @@ export let evaluateNode = (cache, situationGate, parsedRules, node) => { } const sameUnitValues = (explanation, contextRule, mecanismName) => { const firstNodeWithUnit = explanation.find(node => !!node.unit) + if (!firstNodeWithUnit) { + return [undefined, explanation.map(({ nodeValue }) => nodeValue)] + } const values = explanation.map(node => { try { - return convertNodeToUnit(firstNodeWithUnit.unit, node).nodeValue + return convertNodeToUnit(firstNodeWithUnit?.unit, node).nodeValue } catch (e) { typeWarning( contextRule, - `Dans le mécanisme ${mecanismName}, les unités des éléments suivants sont incompatibles entre elles : \n\t\t${node.name || - node.rawNode}\n\t\t${firstNodeWithUnit.name || - firstNodeWithUnit.rawNode}'`, + `Dans le mécanisme ${mecanismName}, les unités des éléments suivants sont incompatibles entre elles : \n\t\t${node?.name || + node?.rawNode}\n\t\t${firstNodeWithUnit?.name || + firstNodeWithUnit?.rawNode}'`, e ) return node.nodeValue diff --git a/source/engine/mecanismViews/colors.ts b/source/engine/mecanismViews/colors.ts index f1278d3a4..b491b7c30 100644 --- a/source/engine/mecanismViews/colors.ts +++ b/source/engine/mecanismViews/colors.ts @@ -7,7 +7,7 @@ const colors = { 'toutes ces conditions': '#3498db', composantes: '#3498db', variations: '#FF9800', - complément: '#795548', + 'taux progressif': '#795548', barème: '#607D8B', grille: '#AD1457' } diff --git a/source/locales/rules-en.yaml b/source/locales/rules-en.yaml index 2b77a60ff..06f4b33a5 100644 --- a/source/locales/rules-en.yaml +++ b/source/locales/rules-en.yaml @@ -328,7 +328,7 @@ contrat salarié . CDD . contrat jeune vacances: description.fr: >- Aussi appelé CDD vendanges. Contrat conclu avec un jeune pendant ses vacances scolaires ou universitaires. - note.en: '[automatic] That''s not a reason for a fixed-term contract.' + note.en: "[automatic] That's not a reason for a fixed-term contract." note.fr: Ce n'est pas un motif de CDD. question.en: Is it a young holiday contract? question.fr: Est-ce un contrat jeune vacances ? @@ -706,7 +706,7 @@ contrat salarié . aides employeur: France. Découvrez-les sur le [portail officiel](http://www.aides-entreprises.fr). résumé.en: Deferred aids available to the employer. - résumé.fr: 'Pour l''employeur, différées dans le temps' + résumé.fr: "Pour l'employeur, différées dans le temps" titre.en: deferred employer aids titre.fr: aides à l'embauche contrat salarié . aides employeur . aide à l'embauche d'apprentis: @@ -798,7 +798,7 @@ contrat salarié . apprentissage . diplôme préparé . niveau supérieur au bac titre.fr: Diplôme d'un niveau supérieur au bac contrat salarié . assiette CSG et CRDS: note.en: '[automatic] This plate is complex, this version is only a simplification.' - note.fr: 'Cette assiette est complexe, cette version n''est qu''une simplification.' + note.fr: "Cette assiette est complexe, cette version n'est qu'une simplification." titre.en: CSG and CRDS base titre.fr: assiette CSG et CRDS contrat salarié . assiette CSG et CRDS . assiette abattue: @@ -993,12 +993,12 @@ contrat salarié . convention collective: Néanmoins, cela permet d'obtenir une première estimation, plus précise que le régime général. question.en: 'Which "convention collective" is applicable to the company ? [beta] ' - question.fr: 'Quelle convention collective est applicable à l''entreprise ? [beta] ' + question.fr: "Quelle convention collective est applicable à l'entreprise ? [beta] " titre.en: convention collective titre.fr: convention collective contrat salarié . convention collective . HCR: description.en: 'The company is a hotel, café, restaurant or similar.' - description.fr: 'L''entreprise est un hôtel, café, restaurant ou assimilé.' + description.fr: "L'entreprise est un hôtel, café, restaurant ou assimilé." titre.en: 'hotels, cafés restaurants HCR (beta)' titre.fr: 'hôtels, cafés restaurants HCR (beta)' contrat salarié . convention collective . HCR . majoration heures supplémentaires: @@ -1566,7 +1566,7 @@ contrat salarié . frais professionnels . titres-restaurant . taux participation description.fr: >- Part du titre-restaurant payée par l'employeur. Doit être de 50% minimum et de 60% maximum. - question.en: '[automatic] What is the employer''s paid portion?' + question.en: "[automatic] What is the employer's paid portion?" question.fr: Quelle est la participation de l'employeur ? suggestions.50%.en: '[automatic] 50%' suggestions.50%.fr: 50% @@ -1972,7 +1972,7 @@ contrat salarié . réduction générale . assiette: titre.fr: Assiette de la réduction générale contrat salarié . réduction générale . assiette . part de la cotisation ATMP: note.en: '[automatic] In practice, the ATMP is always higher than 0.78%.' - note.fr: 'En pratique, l''ATMP est toujours supérieure à 0.78%' + note.fr: "En pratique, l'ATMP est toujours supérieure à 0.78%" titre.en: share of ATMP contribution titre.fr: part de la cotisation ATMP contrat salarié . réduction générale . multiplicateur: @@ -3692,7 +3692,7 @@ dirigeant . rattachement CIPAV: note.en: >- [automatic] for the time being, we have only retained the CIPAV for the calculations. - note.fr: 'pour l''instant, nous n''avons retenu que la CIPAV pour les calculs' + note.fr: "pour l'instant, nous n'avons retenu que la CIPAV pour les calculs" titre.en: CIPAV attachment titre.fr: rattachement CIPAV dirigeant . rattachement CIPAV . retraite complémentaire: @@ -4022,7 +4022,7 @@ entreprise . catégorie d'activité . restauration ou hébergement: titre.fr: restauration ou hébergement entreprise . catégorie d'activité . service ou vente: question.en: 'Is it a service activity, or the purchase and sale of goods?' - question.fr: 'Est-ce une activité de prestation de service, ou de l''achat-vente de biens ?' + question.fr: "Est-ce une activité de prestation de service, ou de l'achat-vente de biens ?" titre.en: service or sale titre.fr: service ou vente entreprise . catégorie d'activité . service ou vente . service: @@ -4141,7 +4141,7 @@ entreprise . chiffre d'affaires minimum: titre.en: Minimum turnover titre.fr: chiffre d'affaires minimum entreprise . date de création: - contrôles.0.en: '[automatic] We can''t see that far into the future' + contrôles.0.en: "[automatic] We can't see that far into the future" contrôles.0.fr: Nous ne pouvons voir aussi loin dans le futur contrôles.1.en: >- [automatic] This is a very old company! Are you sure you didn't make a @@ -4358,7 +4358,7 @@ entreprise . établissement bancaire: L'entreprise est un établissement bancaire, financier ou d'assurance. Elle est non assujettie à la TVA. question.en: 'Is it a banking, financial or insurance institution?' - question.fr: 'S''agit-il d''un établissement bancaire, financier, d''assurance ?' + question.fr: "S'agit-il d'un établissement bancaire, financier, d'assurance ?" titre.en: banking institution titre.fr: établissement bancaire impôt: diff --git a/test/conversation.test.js b/test/conversation.test.js index b2476c558..a39684f27 100644 --- a/test/conversation.test.js +++ b/test/conversation.test.js @@ -18,8 +18,8 @@ describe('conversation', function() { { nom: 'top . startHere', formule: { somme: ['a', 'b'] } }, { nom: 'top . a', formule: 'aa' }, { nom: 'top . b', formule: 'bb' }, - { nom: 'top . aa', question: '?', titre: 'a' }, - { nom: 'top . bb', question: '?', titre: 'b' } + { nom: 'top . aa', question: '?', titre: 'a', unité: '€' }, + { nom: 'top . bb', question: '?', titre: 'b', unité: '€' } ], rules = rawRules.map(enrichRule), state = merge(baseState, { @@ -40,9 +40,9 @@ describe('conversation', function() { { nom: 'top . a', formule: 'aa' }, { nom: 'top . b', formule: 'bb' }, { nom: 'top . c', formule: 'cc' }, - { nom: 'top . aa', question: '?', titre: 'a' }, - { nom: 'top . bb', question: '?', titre: 'b' }, - { nom: 'top . cc', question: '?', titre: 'c' } + { nom: 'top . aa', question: '?', titre: 'a', unité: '€' }, + { nom: 'top . bb', question: '?', titre: 'b', unité: '€' }, + { nom: 'top . cc', question: '?', titre: 'c', unité: '€' } ], rules = rawRules.map(enrichRule) diff --git a/test/mécanismes/complément.yaml b/test/mécanismes/complément.yaml deleted file mode 100644 index 613155a99..000000000 --- a/test/mécanismes/complément.yaml +++ /dev/null @@ -1,35 +0,0 @@ -ma cotisation: - unité: € - -Complément: - formule: - complément: - cible: ma cotisation - montant: 100 - - exemples: - - nom: - situation: - ma cotisation: 33 - valeur attendue: 67 - -autre cotisation: - unité: € - -Complément à composantes: - formule: - complément: - composantes: - - nom: A - cible: ma cotisation - montant: 100 - - nom: B - cible: autre cotisation - montant: 200 - - exemples: - - nom: - situation: - ma cotisation: 33 - autre cotisation: 133 - valeur attendue: 134 diff --git a/test/traverse.test.js b/test/traverse.test.js index 5c103a87a..4bd223b1a 100644 --- a/test/traverse.test.js +++ b/test/traverse.test.js @@ -294,41 +294,6 @@ describe('analyse with mecanisms', function() { ).to.have.property('nodeValue', 3200) }) - it('should handle complements', function() { - let rawRules = [ - { nom: 'top' }, - { - nom: 'top . startHere', - formule: { complément: { cible: 'dix', montant: 93 } } - }, - { nom: 'top . dix', formule: 17 } - ], - rules = parseAll(rawRules.map(enrichRule)) - expect( - analyse(rules, 'startHere')(stateSelector).targets[0] - ).to.have.property('nodeValue', 93 - 17) - }) - - it('should handle components in complements', function() { - let rawRules = [ - { nom: 'top' }, - { - nom: 'top . startHere', - formule: { - complément: { - cible: 'dix', - composantes: [{ montant: 93 }, { montant: 93 }] - } - } - }, - { nom: 'top . dix', formule: 17 } - ], - rules = parseAll(rawRules.map(enrichRule)) - expect( - analyse(rules, 'startHere')(stateSelector).targets[0] - ).to.have.property('nodeValue', 2 * (93 - 17)) - }) - it('should handle filtering on components', function() { let rawRules = [ { nom: 'top' },