From 328f438fe9a7dd400d1cdb059a27b64bc364eba7 Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 11:17:49 +0200 Subject: [PATCH 01/11] :white_check_mark: Ajout d'exemples : CIF, taxe salaires --- règles/rémunération-travail/cdd/CIF.yaml | 9 +++++++++ .../cotisations/ok/taxe-salaires.yaml | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/règles/rémunération-travail/cdd/CIF.yaml b/règles/rémunération-travail/cdd/CIF.yaml index 97843aa33..086dd2f83 100644 --- a/règles/rémunération-travail/cdd/CIF.yaml +++ b/règles/rémunération-travail/cdd/CIF.yaml @@ -23,8 +23,17 @@ Code du travail - Article L6322-37 : https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000022234996&cidTexte=LEGITEXT000006072050 exemples: + - nom: Non applicable si CDI + situation: + type de contrat: CDI + assiette cotisations sociales: 1480 + valeur attendue: 0 - nom: SMIC situation: + type de contrat: CDD + événement: aucun + motif: accroissement activité + contrat jeune vacances: non assiette cotisations sociales: 1480 valeur attendue: 14.8 diff --git a/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml b/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml index b3d14a397..4e9568861 100644 --- a/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml +++ b/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml @@ -33,5 +33,15 @@ - espace: contrat salarié nom: taxe sur les salaires + description: La taxe sur les salaires en France est un impôt progressif créé en 1948 que certains employeurs doivent acquitter sur les salaires qu'ils distribuent. non applicable si: ≠ assujettie à la taxe sur les salaires formule: taxe sur les salaires annuelle / 12 + exemples: + - nom: non applicable par défaut + situation: + salaire brut: 2300 + valeur attendue: 0 + - nom: association non lucrative + situation: + salaire brut: 2300 + valeur attendue: 219.93 # calcul annuel : 7721×4.25%+(15417−7721)×8.5%+(27600−15417)×13.6% From 99702f1b54c07d764a1805479b932cb4b5eaa2ec Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 11:44:03 +0200 Subject: [PATCH 02/11] Extraction de RuleValueVignette de Results.js --- package.json | 2 +- source/components/Results.css | 79 +-------------------- source/components/Results.js | 51 ++------------ source/components/RuleValueVignette.css | 94 +++++++++++++++++++++++++ source/components/RuleValueVignette.js | 54 ++++++++++++++ 5 files changed, 155 insertions(+), 125 deletions(-) create mode 100644 source/components/RuleValueVignette.css create mode 100644 source/components/RuleValueVignette.js diff --git a/package.json b/package.json index b80e0864f..d07bcc146 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "css-loader": "^0.28.1", "csv-loader": "^2.1.1", "daggy": "^1.1.0", - "eslint": "^4.4.1", + "eslint": "^4.8.0", "eslint-plugin-react": "^7.0.1", "express": "^4.15.3", "fantasy-combinators": "0.0.1", diff --git a/source/components/Results.css b/source/components/Results.css index 80ba36482..926314f9b 100644 --- a/source/components/Results.css +++ b/source/components/Results.css @@ -78,6 +78,7 @@ + #results ul { display: inline-flex; justify-content: space-around; @@ -89,78 +90,6 @@ } -#results li { - margin: 0 1em 0; - text-align: center; - width: 25%; -} - -#results li a { - text-decoration: none; -} - -#results .rule-type { - color: white; - border: none; - font-size: 85%; - line-height: 2em; - font-weight: 600; - margin: .6em 0 .1em; -} - -#results .rule-box { - padding: .6em 1em; - color: #333350; - background: white; - border-radius: 3px; - white-space: nowrap; - color: #333350; - height: 6em; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; -} - -#results .rule-name { - font-size: 175%; - font-weight: 600; -} - -#results li p { - margin: 0; - padding: 0 0; - font-size: 120%; - color: inherit; - width: 100%; -} - -#results li.number p { - color: #4A89DC; - font-weight: bold; -} - - - -#results li.irrelevant .rule-type { - color: rgba(255, 255, 255, 0.35); -} - -#results li.irrelevant .rule-name { - text-decoration: line-through; -} - - -#results li.unsatisfied p { - font-style: italic; -} -#results li.irrelevant p { - font-weight: 600; -} -#results li p .figure { - font-size: 250%; -} - @media (max-width: 1280px) { @@ -201,12 +130,6 @@ width: 100%; font-size: 90%; } - #results ul li .rule-box p { - padding: 0.6em; - } - #results .rule-name { - font-size: 150%; - } } diff --git a/source/components/Results.js b/source/components/Results.js index 2e8a85234..3ae8f546b 100644 --- a/source/components/Results.js +++ b/source/components/Results.js @@ -4,16 +4,12 @@ import classNames from 'classnames' import {Link} from 'react-router-dom' import {connect} from 'react-redux' import { withRouter } from 'react-router' -import {formValueSelector} from 'redux-form' import './Results.css' -import {capitalise0} from '../utils' -import {computeRuleValue, clearDict} from 'Engine/traverse' +import {clearDict} from 'Engine/traverse' import {encodeRuleName} from 'Engine/rules' import {getObjectives} from 'Engine/generateQuestions' - -let fmt = new Intl.NumberFormat('fr-FR').format -let humanFigure = decimalDigits => value => fmt(value.toFixed(decimalDigits)) +import RuleValueVignette from './RuleValueVignette' @withRouter @connect( @@ -49,54 +45,17 @@ export default class Results extends Component { Reprendre la simulation - :
+ :

Vos résultats

{do {let text = R.path(['simulateur', 'résultats'])(analysedSituation.root) text &&

{text}

}}

Cliquez pour comprendre chaque calcul

-
+
} ) diff --git a/source/components/RuleValueVignette.css b/source/components/RuleValueVignette.css new file mode 100644 index 000000000..e3ba6ff88 --- /dev/null +++ b/source/components/RuleValueVignette.css @@ -0,0 +1,94 @@ + +.RuleValueVignette { + margin: 0 1em 0; + text-align: center; + width: 25%; +} + +.RuleValueVignette li a { + text-decoration: none; +} +.RuleValueVignette .rule-type { + color: white; + border: none; + font-size: 85%; + line-height: 2em; + font-weight: 600; + margin: .6em 0 .1em; +} + +.RuleValueVignette .rule-box { + padding: .6em 1em; + color: #333350; + background: white; + border-radius: 3px; + white-space: nowrap; + height: 6em; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; +} + +.RuleValueVignette .rule-name { + font-size: 175%; + font-weight: 600; +} + +.RuleValueVignette p { + margin: 0; + padding: 0 0; + font-size: 120%; + color: inherit; + width: 100%; +} +.RuleValueVignette.number p { + color: #4A89DC; + font-weight: bold; +} +.RuleValueVignette.unsatisfied p { + font-style: italic; +} +.RuleValueVignette.irrelevant p { + font-weight: 600; +} +.RuleValueVignette p .figure { + font-size: 250%; +} + + +.RuleValueVignette:not(.unsatisfied):not(.irrelevant) .rule-box { + border-bottom: .8em solid #4A89DC; +} + +.RuleValueVignette:hover .rule-box { + background: #ddd; +} +.RuleValueVignette.irrelevant .rule-box { + background: rgba(255, 255, 255, 0.35); +} + + + +.RuleValueVignette.irrelevant .rule-type { + color: rgba(255, 255, 255, 0.35); +} + +.RuleValueVignette.irrelevant .rule-name { + text-decoration: line-through; +} + + + + +@media (max-width: 1280px) { + + + .RuleValueVignette .rule-box p { + padding: 0.6em; + } + + .RuleValueVignette .rule-name { + font-size: 150%; + } +} diff --git a/source/components/RuleValueVignette.js b/source/components/RuleValueVignette.js new file mode 100644 index 000000000..fae1c0895 --- /dev/null +++ b/source/components/RuleValueVignette.js @@ -0,0 +1,54 @@ +import React from "react" +import {Link} from 'react-router-dom' +import {computeRuleValue} from 'Engine/traverse' +import {encodeRuleName} from 'Engine/rules' +import classNames from 'classnames' +import {capitalise0} from '../utils' +let fmt = new Intl.NumberFormat('fr-FR').format +let humanFigure = decimalDigits => value => fmt(value.toFixed(decimalDigits)) +import './RuleValueVignette.css' + +export default ({ + name, + type, + "non applicable si": nonApplicable, + formule: { nodeValue: formuleValue }, + conversationStarted +}) => + do { + //TODO quel bordel, à revoir + let ruleValue = computeRuleValue( + formuleValue, + nonApplicable && nonApplicable.nodeValue + ), + unsatisfied = ruleValue == null, + nonApplicableValue = nonApplicable ? nonApplicable.nodeValue : false, + irrelevant = nonApplicableValue === true || formuleValue == 0, + number = nonApplicableValue == false && formuleValue != null + + ; + +
+ {type} +
+
+
+ {capitalise0(name)} +
+

+ {conversationStarted && + (irrelevant + ? "Vous n'êtes pas concerné" + : unsatisfied + ? "En attente de vos réponses..." + : + {humanFigure(2)(formuleValue) + "€"} + )} +

+
+ +
+ } From 156bbda400c9ff13d6bb884091ffff2e3e297f15 Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 14:35:18 +0200 Subject: [PATCH 03/11] =?UTF-8?q?Simplification=20des=20calculs=20de=20la?= =?UTF-8?q?=20vignette=20de=20r=C3=A9sultat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/components/RuleValueVignette.js | 18 ++++++------------ source/engine/traverse.js | 13 +++++-------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/source/components/RuleValueVignette.js b/source/components/RuleValueVignette.js index fae1c0895..812b96d2c 100644 --- a/source/components/RuleValueVignette.js +++ b/source/components/RuleValueVignette.js @@ -11,20 +11,14 @@ import './RuleValueVignette.css' export default ({ name, type, - "non applicable si": nonApplicable, - formule: { nodeValue: formuleValue }, - conversationStarted + conversationStarted, + nodeValue: ruleValue }) => do { - //TODO quel bordel, à revoir - let ruleValue = computeRuleValue( - formuleValue, - nonApplicable && nonApplicable.nodeValue - ), + let unsatisfied = ruleValue == null, - nonApplicableValue = nonApplicable ? nonApplicable.nodeValue : false, - irrelevant = nonApplicableValue === true || formuleValue == 0, - number = nonApplicableValue == false && formuleValue != null + irrelevant = ruleValue == 0, + number = typeof ruleValue == 'number' && ruleValue > 0 ; - {humanFigure(2)(formuleValue) + "€"} + {humanFigure(2)(ruleValue) + "€"} )}

diff --git a/source/engine/traverse.js b/source/engine/traverse.js index 88762e651..d4e9454ab 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -328,20 +328,17 @@ let treat = (rules, rule) => rawNode => { let parsedNode = onNodeType(rawNode) return parsedNode.evaluate ? parsedNode : - {...parsedNode, evaluate: defaultEvaluate} + {...parsedNode, evaluate: defaultEvaluate} } //TODO c'est moche : export let computeRuleValue = (formuleValue, condValue) => condValue === undefined - ? formuleValue - : formuleValue === 0 - ? 0 - : condValue === null - ? null - : condValue === true + ? formuleValue + : formuleValue === 0 ? 0 - : formuleValue + : condValue === null ? null : condValue === true ? 0 : formuleValue + export let treatRuleRoot = (rules, rule) => { let evaluate = (situationGate, parsedRules, r) => { From b65fc719824dee291485800a51ebd284e50d8347 Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 15:04:41 +0200 Subject: [PATCH 04/11] =?UTF-8?q?Affichage=20du=20r=C3=A9sultat=20de=20cal?= =?UTF-8?q?cul=20sur=20/regle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/components/Results.js | 2 +- source/components/rule/Rule.css | 11 ++++- source/components/rule/Rule.js | 46 +++++++++++++------ .../{ => rule}/RuleValueVignette.css | 0 .../{ => rule}/RuleValueVignette.js | 5 +- 5 files changed, 44 insertions(+), 20 deletions(-) rename source/components/{ => rule}/RuleValueVignette.css (100%) rename source/components/{ => rule}/RuleValueVignette.js (86%) diff --git a/source/components/Results.js b/source/components/Results.js index 3ae8f546b..9ef6b4c91 100644 --- a/source/components/Results.js +++ b/source/components/Results.js @@ -9,7 +9,7 @@ import './Results.css' import {clearDict} from 'Engine/traverse' import {encodeRuleName} from 'Engine/rules' import {getObjectives} from 'Engine/generateQuestions' -import RuleValueVignette from './RuleValueVignette' +import RuleValueVignette from './rule/RuleValueVignette' @withRouter @connect( diff --git a/source/components/rule/Rule.css b/source/components/rule/Rule.css index bb169b599..6990cac65 100644 --- a/source/components/rule/Rule.css +++ b/source/components/rule/Rule.css @@ -96,6 +96,16 @@ text-align: center; } +#ruleValue { + margin-left: 3em; + font-weight: 600; +} + + +/* + Règles CSS d'affichage des algorithmes +*/ + #rule-rules { display: inline-flex; justify-content: start; @@ -114,7 +124,6 @@ } #algorithm { - margin-top: 3em; margin-right: 10em; } .dictionaryPanelWrapper { diff --git a/source/components/rule/Rule.js b/source/components/rule/Rule.js index ffe286451..e31eb1da3 100644 --- a/source/components/rule/Rule.js +++ b/source/components/rule/Rule.js @@ -14,6 +14,7 @@ import References from './References' import Algorithm from './Algorithm' import Examples from './Examples' import Helmet from 'react-helmet' +import {humanFigure} from './RuleValueVignette' @connect( state => ({ @@ -54,12 +55,15 @@ export default class Rule extends Component { // } let - situationExists = !R.isEmpty(this.props.form) + conversationStarted = !R.isEmpty(this.props.form), + situationExists = conversationStarted || this.state.example != null let {type, name, description} = this.rule, destinataire = R.path([type, 'destinataire'])(this.rule), - destinataireData = possiblesDestinataires[destinataire] + destinataireData = possiblesDestinataires[destinataire], + situationOrExampleRule = R.path(['example', 'rule'])(this.state) || this.rule, + ruleValue = situationOrExampleRule.nodeValue return (
@@ -80,17 +84,18 @@ export default class Rule extends Component {

Destinataire

{!destinataireData ? -

Non renseigné

- : +

Non renseigné

+ : + }
@@ -99,10 +104,21 @@ export default class Rule extends Component { {this.renderReferences(this.rule)}
+
+

Résultat

+

+ {ruleValue == 0 + ? 'Règle non applicable' + : ruleValue == null + ? 'Situation incomplète' + : humanFigure(2)(ruleValue) + ' €'} +

+
+
- + value => fmt(value.toFixed(decimalDigits)) +export let humanFigure = decimalDigits => value => fmt(value.toFixed(decimalDigits)) import './RuleValueVignette.css' export default ({ From d9ec269134acaa888fc6307a9ea41d92b2c37e9e Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 15:08:36 +0200 Subject: [PATCH 05/11] =?UTF-8?q?Utilisation=20de=20la=20v=C3=A9ritable=20?= =?UTF-8?q?valeur=20de=20calcul=20pour=20les=20exemples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On utilisait une valeur qui nous évitait de tester correctement les conditions d'application de la règle --- source/components/rule/Examples.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/source/components/rule/Examples.js b/source/components/rule/Examples.js index 15e11c24d..b4fdbede8 100644 --- a/source/components/rule/Examples.js +++ b/source/components/rule/Examples.js @@ -26,14 +26,11 @@ export default class Examples extends Component { )(ex.situation) let runExemple = analyseSituation(rules, rule.name)(v => exempleSituation[v]), - exempleCalculatedValue = runExemple["non applicable si"] && - runExemple["non applicable si"].nodeValue - ? null - : runExemple.formule.nodeValue + exempleValue = runExemple.nodeValue return { ...ex, - ok: Math.abs( ex['valeur attendue'] - exempleCalculatedValue ) < .1, //TODO on peut sûrement faire mieux... + ok: Math.abs( ex['valeur attendue'] - exempleValue ) < .1, //TODO on peut sûrement faire mieux... rule: runExemple } }) @@ -65,7 +62,7 @@ export default class Examples extends Component {
Ce test ne passe pas {showValues && - : la valeur attendue était {' '} + : le résultat attendu était {' '} {expected} }
From 91b2014b02a878ff1649fe95624b18f4125b09d5 Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 15:12:08 +0200 Subject: [PATCH 06/11] :art: Centrage du bouton de signalement d'erreur --- source/components/rule/Examples.css | 9 --------- source/components/rule/Examples.js | 6 ------ source/components/rule/Rule.css | 11 +++++++++++ source/components/rule/Rule.js | 6 ++++++ 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/source/components/rule/Examples.css b/source/components/rule/Examples.css index 1313372f4..c2a11d134 100644 --- a/source/components/rule/Examples.css +++ b/source/components/rule/Examples.css @@ -65,12 +65,3 @@ #examples .example.ok i { color: #2ecc71 } - -#reportError { - background: #c0392b; - color: white; - border: none; - font-size: 100%; - padding: .3em .6em; - margin-top: 3em; -} diff --git a/source/components/rule/Examples.js b/source/components/rule/Examples.js index b4fdbede8..a994bc29e 100644 --- a/source/components/rule/Examples.js +++ b/source/components/rule/Examples.js @@ -80,12 +80,6 @@ export default class Examples extends Component { } - ) } diff --git a/source/components/rule/Rule.css b/source/components/rule/Rule.css index 6990cac65..644e9a4fe 100644 --- a/source/components/rule/Rule.css +++ b/source/components/rule/Rule.css @@ -357,3 +357,14 @@ justify-content: space-between; align-items: baseline; } + + +#reportError { + background: #c0392b; + color: white; + border: none; + font-size: 100%; + padding: .3em .6em; + margin: 3em auto 0; + display: block; +} diff --git a/source/components/rule/Rule.js b/source/components/rule/Rule.js index e31eb1da3..8c66eb84b 100644 --- a/source/components/rule/Rule.js +++ b/source/components/rule/Rule.js @@ -124,6 +124,12 @@ export default class Rule extends Component { showValues={this.state.showValues} inject={example => this.setState({example, showValues: true})}/>
+ ) } From c560501d0b819f75e59911b259271042b56d0385 Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 15:51:42 +0200 Subject: [PATCH 07/11] Affichage de l'erreur du test au clic seulement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ainsi au clic la valeur calculée est affichée et la comparaison entre attendu et calculé est possible --- source/components/rule/Examples.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/components/rule/Examples.js b/source/components/rule/Examples.js index a994bc29e..c8a8e1a21 100644 --- a/source/components/rule/Examples.js +++ b/source/components/rule/Examples.js @@ -58,7 +58,7 @@ export default class Examples extends Component { : } {nom} - {!ok && + {!ok && focusedExample == nom &&
Ce test ne passe pas {showValues && From 9e1930909c7634a7f08cb9a04afdd636e1d62099 Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 15:52:40 +0200 Subject: [PATCH 08/11] :white_check_mark: Correction des exemples CIF --- règles/rémunération-travail/cdd/CIF.yaml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/règles/rémunération-travail/cdd/CIF.yaml b/règles/rémunération-travail/cdd/CIF.yaml index 086dd2f83..fb0add15a 100644 --- a/règles/rémunération-travail/cdd/CIF.yaml +++ b/règles/rémunération-travail/cdd/CIF.yaml @@ -23,23 +23,30 @@ Code du travail - Article L6322-37 : https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000022234996&cidTexte=LEGITEXT000006072050 exemples: + - nom: Non applicable si CDI situation: type de contrat: CDI assiette cotisations sociales: 1480 valeur attendue: 0 + - nom: SMIC situation: type de contrat: CDD événement: aucun motif: accroissement activité contrat jeune vacances: non + assiette cotisations sociales: 1480 valeur attendue: 14.8 - nom: salaire médian situation: - contrat salarié . CDD . motif: classique . usage + type de contrat: CDD + événement: aucun + motif: accroissement activité + contrat jeune vacances: non + assiette cotisations sociales: 2300 valeur attendue: 23 From 5ae06c7162a9b9fc2302769df79bb46b41952ff5 Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 16:02:06 +0200 Subject: [PATCH 09/11] :hammer: Ajout de la variable "association non lucrative" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Qui déclenche la taxe sur les salaires --- .../cotisations/ok/taxe-salaires.yaml | 20 +++++++++++++++---- .../entités/ok/contrat-salarié.yaml | 6 ++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml b/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml index 4e9568861..ee99ff733 100644 --- a/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml +++ b/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml @@ -4,6 +4,8 @@ description: | Sont assujetties les associations à but non lucratif et les entreprises non soumises à la TVA ou payant la TVA sur moins de 10% de leur chiffre. Les particuliers employeurs, les employeurs agricoles, les établissements d'enseignement supérieur, les auto-entrepreneurs ne sont pas concernés. question: L'entreprise est-elle assujettie à la taxe sur les salaires ? + # variable non utilisée pour l'instant, comme dans le simulateur v1 + # à ajouter quand nous aurons des mécanismes logiques plus évolués (notamment 'applicable si') - espace: contrat salarié nom: taxe sur les salaires annuelle @@ -26,6 +28,13 @@ taux: 13.6% - au-dessus de: 152279 taux: 20% + exemples: + - nom: salaire médian + situation: + assiette taxe sur les salaires: 2300 + valeur attendue: 2639.16 # calcul annuel : 7721×4.25%+(15417−7721)×8.5%+(27600−15417)×13.6% + + - espace: contrat salarié nom: assiette taxe sur les salaires @@ -33,8 +42,9 @@ - espace: contrat salarié nom: taxe sur les salaires - description: La taxe sur les salaires en France est un impôt progressif créé en 1948 que certains employeurs doivent acquitter sur les salaires qu'ils distribuent. - non applicable si: ≠ assujettie à la taxe sur les salaires + description: La taxe sur les salaires en France est un impôt progressif créé en 1948 que certains employeurs doivent acquitter sur les salaires qu'ils distribuent. + non applicable si: ≠ association non lucrative + formule: taxe sur les salaires annuelle / 12 exemples: - nom: non applicable par défaut @@ -42,6 +52,8 @@ salaire brut: 2300 valeur attendue: 0 - nom: association non lucrative + # Ce test ne sert qu'à tester la condition "association non lucrative", tant que nous faisons face à la limitation des calculs temporels situation: - salaire brut: 2300 - valeur attendue: 219.93 # calcul annuel : 7721×4.25%+(15417−7721)×8.5%+(27600−15417)×13.6% + association non lucrative: oui + taxe sur les salaires annuelle: 2639.16 + valeur attendue: 219.93 diff --git a/règles/rémunération-travail/entités/ok/contrat-salarié.yaml b/règles/rémunération-travail/entités/ok/contrat-salarié.yaml index 9e4ae8d82..0f2ca85d7 100644 --- a/règles/rémunération-travail/entités/ok/contrat-salarié.yaml +++ b/règles/rémunération-travail/entités/ok/contrat-salarié.yaml @@ -218,8 +218,10 @@ - - +- espace: contrat salarié + nom: association non lucrative + description: L'entreprise est une association non lucrative + question: S'agit-il d'une association à but non lucratif ? From 9c9cd6e428d005b2e00b23c243b166b6eb04b00d Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 16:15:57 +0200 Subject: [PATCH 10/11] :hammer: Association 1901 -> pas de CICE ni de taxe d'apprentissage --- règles/rémunération-travail/aides/ok/cice.yaml | 17 ++++++++++++++++- .../cotisations/ok/taxe-apprentissage.yaml | 4 +++- .../cotisations/ok/taxe-salaires.yaml | 4 ++-- .../entités/ok/contrat-salarié.yaml | 5 ----- .../entités/ok/entreprise.yaml | 5 +++++ 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/règles/rémunération-travail/aides/ok/cice.yaml b/règles/rémunération-travail/aides/ok/cice.yaml index 7401683a2..1c712233a 100644 --- a/règles/rémunération-travail/aides/ok/cice.yaml +++ b/règles/rémunération-travail/aides/ok/cice.yaml @@ -10,13 +10,28 @@ calcul: https://www.service-public.fr/professionnels-entreprises/vosdroits/F31326 # TODO - exlure stage, apprentissage - non applicable si: salaire brut > plafond cice + non applicable si: + une de ces conditions: + - assiette cotisations sociales > plafond cice + - entreprise . association non lucrative formule: multiplication: assiette: assiette cotisations sociales taux: 7% + exemples: + - nom: SMIC + situation: + assiette cotisations sociales: 2300 + entreprise . association non lucrative: non + valeur attendue: 161 + - nom: Non applicable si association + situation: + assiette cotisations sociales: 2300 + entreprise . association non lucrative: oui + valeur attendue: 0 + - espace: contrat salarié nom: plafond cice # TODO: calcul du smic proratisé diff --git a/règles/rémunération-travail/cotisations/ok/taxe-apprentissage.yaml b/règles/rémunération-travail/cotisations/ok/taxe-apprentissage.yaml index 3c46e7539..27246c331 100644 --- a/règles/rémunération-travail/cotisations/ok/taxe-apprentissage.yaml +++ b/règles/rémunération-travail/cotisations/ok/taxe-apprentissage.yaml @@ -10,7 +10,9 @@ notes: Taxe complexe, comportant notamment des exonérations non prises en compte ici. - # non applicable si: Entreprise . association non lucrative + non applicable si: Entreprise . association non lucrative + # L'association a but non lucratif ne paie pas d'IS de droit commun article 206 du Code général des impôts + # -> pas de taxe ni contribution d'apprentissage formule: somme: - taxe d'apprentissage de base diff --git a/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml b/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml index ee99ff733..fde77fa0a 100644 --- a/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml +++ b/règles/rémunération-travail/cotisations/ok/taxe-salaires.yaml @@ -43,7 +43,7 @@ - espace: contrat salarié nom: taxe sur les salaires description: La taxe sur les salaires en France est un impôt progressif créé en 1948 que certains employeurs doivent acquitter sur les salaires qu'ils distribuent. - non applicable si: ≠ association non lucrative + non applicable si: ≠ Entreprise . association non lucrative formule: taxe sur les salaires annuelle / 12 exemples: @@ -54,6 +54,6 @@ - nom: association non lucrative # Ce test ne sert qu'à tester la condition "association non lucrative", tant que nous faisons face à la limitation des calculs temporels situation: - association non lucrative: oui + Entreprise . association non lucrative: oui taxe sur les salaires annuelle: 2639.16 valeur attendue: 219.93 diff --git a/règles/rémunération-travail/entités/ok/contrat-salarié.yaml b/règles/rémunération-travail/entités/ok/contrat-salarié.yaml index 0f2ca85d7..d94b75043 100644 --- a/règles/rémunération-travail/entités/ok/contrat-salarié.yaml +++ b/règles/rémunération-travail/entités/ok/contrat-salarié.yaml @@ -218,11 +218,6 @@ -- espace: contrat salarié - nom: association non lucrative - description: L'entreprise est une association non lucrative - question: S'agit-il d'une association à but non lucratif ? - diff --git a/règles/rémunération-travail/entités/ok/entreprise.yaml b/règles/rémunération-travail/entités/ok/entreprise.yaml index 46dc7aa0e..fdfbe025c 100644 --- a/règles/rémunération-travail/entités/ok/entreprise.yaml +++ b/règles/rémunération-travail/entités/ok/entreprise.yaml @@ -28,3 +28,8 @@ suggestions: 1: 1 5: 5 + +- espace: entreprise + nom: association non lucrative + description: L'entreprise est une association non lucrative + question: S'agit-il d'une association à but non lucratif ? From ef3b2f19f7925d92b2b25ac6767f8da338c079d7 Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 3 Oct 2017 19:21:56 +0200 Subject: [PATCH 11/11] :hammer: Ajout du CITS, pendant du CICE pour les associations --- .../rémunération-travail/aides/ok/cits.yaml | 42 +++++++++++++++++++ .../entités/ok/contrat-salarié.yaml | 1 + 2 files changed, 43 insertions(+) create mode 100644 règles/rémunération-travail/aides/ok/cits.yaml diff --git a/règles/rémunération-travail/aides/ok/cits.yaml b/règles/rémunération-travail/aides/ok/cits.yaml new file mode 100644 index 000000000..b78399130 --- /dev/null +++ b/règles/rémunération-travail/aides/ok/cits.yaml @@ -0,0 +1,42 @@ +- espace: contrat salarié + nom: CITS + titre: Crédit d'impôt de taxe sur les salaire + aide: + type: avantage fiscal + thème: aide bas salaires + démarches: non + description: | + La loi de finances pour 2017 instaure, au bénéfice des associations et organismes sans but lucratif (OSBL), + un dispositif de crédit d'impôt de taxe sur les salaires (CITS). + références: + fiche: https://www.service-public.fr/associations/actualites/A11012 + + non applicable si: + une de ces conditions: + - assiette cotisations sociales > plafond CITS + - ≠ entreprise . association non lucrative + + formule: + multiplication: + assiette: assiette cotisations sociales + taux: 4% + + exemples: + - nom: SMIC + situation: + assiette cotisations sociales: 2300 + entreprise . association non lucrative: oui + valeur attendue: 92 + - nom: Non applicable si organisme lucratif + situation: + assiette cotisations sociales: 2300 + entreprise . association non lucrative: non + valeur attendue: 0 + +- espace: contrat salarié + nom: plafond CITS + formule: multiplicateur CITS * smic mensuel + +- espace: contrat salarié + nom: multiplicateur CITS + formule: 2.5 diff --git a/règles/rémunération-travail/entités/ok/contrat-salarié.yaml b/règles/rémunération-travail/entités/ok/contrat-salarié.yaml index d94b75043..cd99351e1 100644 --- a/règles/rémunération-travail/entités/ok/contrat-salarié.yaml +++ b/règles/rémunération-travail/entités/ok/contrat-salarié.yaml @@ -196,6 +196,7 @@ formule: somme: - CICE + - CITS - réduction générale - exonération JEI