Merge pull request #416 from betagouv/cas-types

Nouvelle page : quelques exemples de calcul
pull/419/head v0.6.3
Mael 2018-10-29 12:27:17 +01:00 committed by GitHub
commit 9787966b37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 217 additions and 36 deletions

View File

@ -34,7 +34,7 @@ button {
.ui__.container {
width: 100%;
max-width: 750px;
max-width: 800px;
margin: auto;
padding: 0 0.6rem;
}

View File

@ -0,0 +1,33 @@
- nom: CDI au salaire médian
situation:
contrat salarié . salaire . brut de base: 2300
- nom: CDI au SMIC
situation:
contrat salarié . salaire . brut de base: 1500
- nom: CDI au SMIC temps partiel 24h / semaine
situation:
contrat salarié . salaire . brut de base: 1030
contrat salarié . temps partiel: oui
contrat salarié . temps partiel . heures par semaine: 24
- nom: CDI cadre salaire cadre médian
situation:
contrat salarié . salaire . brut de base: 3600
contrat salarié . statut cadre: oui
- nom: CDD usage de 2 mois
situation:
contrat salarié . salaire . brut de base: 2300
contrat salarié . type de contrat: CDD
contrat salarié . CDD . motif: 'classique . usage'
contrat salarié . CDD . durée: 2
- nom: CDD accroissement d'activité de 1 an
situation:
contrat salarié . salaire . brut de base: 2300
contrat salarié . type de contrat: CDD
contrat salarié . CDD . motif: 'classique . accroissement activité'
contrat salarié . CDD . durée: 12

View File

@ -33,11 +33,11 @@ export let flatRulesSelector = createSelector(
(lang, rules) => rules || (lang === 'en' ? baseRulesEn : baseRulesFr)
)
let parsedRulesSelector = createSelector([flatRulesSelector], rules =>
export let parsedRulesSelector = createSelector([flatRulesSelector], rules =>
parseAll(rules)
)
let ruleDefaultsSelector = createSelector([flatRulesSelector], rules =>
export let ruleDefaultsSelector = createSelector([flatRulesSelector], rules =>
collectDefaults(rules)
)

View File

@ -1,5 +1,6 @@
import PageFeedback from 'Components/Feedback/PageFeedback'
import Mecanisms from 'Components/Mecanisms'
import ExampleSituations from './pages/ExampleSituations'
import RulePage from 'Components/RulePage'
import DisableScroll from 'Components/utils/DisableScroll'
import TrackPageView from 'Components/utils/TrackPageView'
@ -19,7 +20,6 @@ import { getIframeOption, inIframe } from '../../utils'
import trackDomainActions from './middlewares/trackDomainActions'
import About from './pages/About'
import Contact from './pages/Contact'
import Contribution from './pages/Contribution'
import Couleur from './pages/Couleur'
import { Header } from './pages/Header'
import Home from './pages/Home'
@ -78,10 +78,10 @@ class EmbaucheRoute extends Component {
<Route path="/règle/:name" component={RulePage} />
<Redirect from="/simu/*" to="/" />
<Route path="/règles" component={RulesList} />
<Route path="/exemples" component={ExampleSituations} />
<Route path="/mecanismes" component={Mecanisms} />
<Route path="/à-propos" component={About} />
<Route path="/intégrer" component={Integration} />
<Route path="/contribuer" component={Contribution} />
<Route path="/couleur" component={Couleur} />
<Route path="/integration-test" component={IntegrationTest} />
<Redirect from="/simulateur" to="/" />

View File

@ -13,5 +13,12 @@
border: none;
height: auto;
background: yellow;
height: 6.5em;
height: 8em;
border-radius: 1em;
}
#about i {
font-size: 1.6em;
margin-left: 0.2em;
vertical-align: middle;
}

View File

@ -11,16 +11,14 @@ export default class About extends Component {
<h1>À propos</h1>
<section>
<p>
<a href="https://beta.gouv.fr">
L'incubateur des services numériques de l'État
</a>{' '}
a lancé en 2014 le développement dune <em>ressource ouverte</em> de
calcul des prélèvements sociaux sur les revenus d'activité en
France, étape incontournable lors d'une embauche.
<a href="https://beta.gouv.fr">BetaGouv</a> a lancé en 2014 le
développement dun moteur ouvert de calcul des cotisations sociales
en France, étape incontournable pour embaucher ou négocier un
salaire.
</p>
<p>
Ce premier service, un{' '}
<em>simulateur des sommes en jeu lors d'une embauche</em>, peut être{' '}
Ce premier service, un simulateur des sommes en jeu lors d'une
embauche, peut être{' '}
<Link to="/intégrer">intégré facilement et gratuitement</Link> par
toute organisation sur son site Web.
</p>
@ -28,9 +26,11 @@ export default class About extends Component {
<p>
Début 2018, l'
<a href="https://acoss.fr">ACOSS</a> (la tête des URSSAF) nous
rejoint pour consolider ce simulateur.
rejoint pour consolider ce simulateur, le traduire en anglais et
lancer{' '}
<a href="https://mycompanyinfrance.fr">mycompanyinfrance.fr</a>, un
guide de création d'entreprise en France.
</p>
<p>
Suivez nos mises à jour sur{' '}
<a href="https://twitter.com/embauchegouv">
@ -38,16 +38,23 @@ export default class About extends Component {
</a>
</p>
</section>
<h1>Contribuez !</h1>
<section>
<p>
Ce travail est fait en commun : venez définir avec nous la feuille
de route du service (implémentation des conventions collectives,
ajout des statuts autres que le travail salarié, ...).
Venez définir avec nous la feuille de route du service
(implémentation des conventions collectives, ajout des statuts
autres que le travail salarié, ...).
</p>
<MailChimp />
<p>
Ou <Link to="/contact">contactez-nous</Link> directement.
</p>
<p>
Le code est ouvert et contributif, rendez-vous sur{' '}
<a href="https://github.com/betagouv/syso/">
GitHub <i className="fa fa-github" aria-hidden="true" />
</a>
</p>
</section>
{/* <p>Notre prochaine rencontre OpenLab aura lieu <strong>le mercredi 18 janvier 2017 à 10h</strong>, au 86 allée de Bercy, 75012, salle 381-R</p> */}
<h1>Vie privée</h1>

View File

@ -0,0 +1,37 @@
#exampleSituations ul {
margin-top: 1.5em;
}
#exampleSituations .example {
border-bottom: 1px solid #eee;
width: 100%;
display: flex;
justify-items: space-between;
align-items: center;
}
#exampleSituations .example h2 {
width: 25%;
display: inline-block;
font-size: 120%;
text-align: center;
}
#exampleSituations .example ul {
width: 100%;
display: flex;
align-items: center;
justify-content: space-around;
list-style: none;
}
#exampleSituations .example li {
padding-top: 0;
}
#exampleSituations .example h3 {
font-size: 95%;
font-weight: 600;
color: #444;
}
#exampleSituations .example .figure {
font-size: 110%;
text-align: center;
display: inline-block;
width: 100%;
}

View File

@ -0,0 +1,96 @@
// Page listing the engine's currently implemented mecanisms and their tests
import React, { Component } from 'react'
import './ExampleSituations.css'
import examples from 'Règles/cas-types.yaml'
import { analyseMany } from 'Engine/traverse'
import { connect } from 'react-redux'
import {
ruleDefaultsSelector,
parsedRulesSelector
} from 'Selectors/analyseSelectors'
import withColours from 'Components/utils/withColours'
import emoji from 'react-easy-emoji'
class ExampleSituations extends Component {
render() {
return (
<div className="ui__ container" id="exampleSituations">
<h1>
{emoji('💡 ')}
Quelques exemples
</h1>
<ul>
{examples.map(ex => (
<Example ex={ex} key={ex.nom} />
))}
</ul>
</div>
)
}
}
@connect(state => ({
defaults: ruleDefaultsSelector(state),
parsedRules: parsedRulesSelector(state)
}))
@withColours
class Example extends Component {
render() {
let {
ex: { nom, situation },
parsedRules,
defaults,
colours
} = this.props,
[total, net, netAprèsImpôts] = analyseMany(parsedRules, [
'total',
'net',
'net après impôt'
])(dottedName => ({ ...defaults, ...situation }[dottedName])).targets,
figures = [
total,
do {
let dottedName = 'contrat salarié . salaire . brut de base'
;({
dottedName,
nodeValue: situation[dottedName],
title: 'Salaire brut'
})
},
net,
{ ...netAprèsImpôts, title: 'Après impôt' }
]
return (
<li className="example">
<h2>{nom}</h2>
<ul>
{figures.map(t => (
<li key={t.dottedName}>
<h3>{t.title}</h3>
<span
style={{ color: colours.textColourOnWhite }}
className="figure">
{Math.round(t.nodeValue)}
</span>
</li>
))}{' '}
<li key="%">
<h3>Prélèvements</h3>
<span
style={{ color: colours.textColourOnWhite }}
className="figure">
{do {
let de = figures[0].nodeValue,
à = figures[3].nodeValue
Math.round(((de - à) / de) * 100)
}}{' '}
%
</span>
</li>
</ul>
</li>
)
}
}
export default ExampleSituations

View File

@ -8,9 +8,6 @@ import Logo from '../images/logo/logo-simulateur.svg'
import './Header.css'
@withRouter
@connect(state => ({
textColourOnWhite: state.themeColours.textColourOnWhite
}))
@translate()
export class Header extends Component {
state = {
@ -58,14 +55,14 @@ export class Header extends Component {
let Links = ({ toggle }) => (
<div id="links" onClick={toggle}>
<Link className="menu-item" to="/exemples">
Exemples
</Link>
<Link className="menu-item" to="/intégrer">
Intégrer le module
</Link>
<Link className="menu-item" to="/contribuer">
Contribuer
</Link>
<Link className="menu-item" to="/règles">
Toutes nos règles
Nos règles
</Link>
<Link className="menu-item" to="/à-propos">
À propos

View File

@ -85,7 +85,8 @@ module.exports = {
new HTMLPlugin({
template: 'index.html',
chunks: ['infrance'],
title: 'My company in France: A step-by-step guide to start a business in France',
title:
'My company in France: A step-by-step guide to start a business in France',
description:
'Find the type of company that suits you and follow the steps to register your company. Discover the French social security system by simulating your hiring costs. Discover the procedures to hire in France and learn the basics of French labour law.',
filename: 'infrance.html'
@ -101,9 +102,18 @@ module.exports = {
new CopyPlugin([
'./manifest.webmanifest',
'./source/sites/embauche.gouv.fr/images/logo',
{ from: './source/sites/embauche.gouv.fr/robots.txt', to: 'robots.embauche.txt' },
{ from: './source/sites/mycompanyinfrance.fr/robots.txt', to: 'robots.infrance.txt' },
{ from: './source/sites/mycompanyinfrance.fr/sitemap.txt', to: 'sitemap.infrance.txt' },
{
from: './source/sites/embauche.gouv.fr/robots.txt',
to: 'robots.embauche.txt'
},
{
from: './source/sites/mycompanyinfrance.fr/robots.txt',
to: 'robots.infrance.txt'
},
{
from: './source/sites/mycompanyinfrance.fr/sitemap.txt',
to: 'sitemap.infrance.txt'
}
])
]
}

View File

@ -1,9 +1,3 @@
/*
Les mécanismes sont testés dans mécanismes/ comme le sont les variables directement dans la base YAML.
On y créée dans chaque fichier une base YAML autonome, dans laquelle intervient le mécanisme à tester,
puis on teste idéalement tous ses comportements sans en faire intervenir d'autres.
*/
import { AssertionError } from 'chai'
import { rules } from '../source/engine/rules'
import { parseAll } from '../source/engine/traverse'