👽 traduction des étapes manquantes en vue du merge sur master

pull/439/head
Johan Girod 2019-01-31 19:30:39 +01:00
parent 06acb487ea
commit 29de00869e
20 changed files with 324 additions and 312 deletions

View File

@ -1,27 +1,20 @@
import { goBackToSimulation } from 'Actions/actions'
import { ScrollToTop } from 'Components/utils/Scroll'
import { encodeRuleName } from 'Engine/rules'
import {
decodeRuleName,
findRuleByDottedName,
findRulesByName
} from 'Engine/rules.js'
import { compose, head, path } from 'ramda'
import React, { Component } from 'react'
import emoji from 'react-easy-emoji'
import { Trans, withNamespaces } from 'react-i18next'
import { connect } from 'react-redux'
import { withRouter } from 'react-router'
import { Link, Redirect } from 'react-router-dom'
import {
flatRulesSelector,
noUserInputSelector,
situationBranchNameSelector
} from 'Selectors/analyseSelectors'
import Namespace from './rule/Namespace'
import Rule from './rule/Rule'
import './RulePage.css'
import SearchButton from './SearchButton'
import { goBackToSimulation } from 'Actions/actions';
import { ScrollToTop } from 'Components/utils/Scroll';
import { encodeRuleName } from 'Engine/rules';
import { decodeRuleName, findRuleByDottedName, findRulesByName } from 'Engine/rules.js';
import { compose, head, path } from 'ramda';
import React, { Component } from 'react';
import emoji from 'react-easy-emoji';
import { Trans, withNamespaces } from 'react-i18next';
import { connect } from 'react-redux';
import { withRouter } from 'react-router';
import { Link, Redirect } from 'react-router-dom';
import { flatRulesSelector, noUserInputSelector, situationBranchNameSelector } from 'Selectors/analyseSelectors';
import { capitalise0 } from "../utils";
import Namespace from './rule/Namespace';
import Rule from './rule/Rule';
import './RulePage.css';
import SearchButton from './SearchButton';
export default compose(
connect(state => ({
@ -50,7 +43,7 @@ export default compose(
if (rules.find(({ ns }) => ns == null))
return this.renderRule(decodedRuleName)
if (rules.length > 1)
return <DisambiguateRuleQuery rules={rules} flatRules={flatRules} />
return <DisambiguateRuleQuery rules={rules} flatRules={flatRules} name={name}/>
let dottedName = head(rules).dottedName
return this.renderRule(dottedName)
}
@ -93,8 +86,9 @@ const BackToSimulation = compose(
}
)
let DisambiguateRuleQuery = ({ rules, flatRules }) => (
<div className="centeredMessage">
let DisambiguateRuleQuery = ({ rules, flatRules, name }) => (
<div className="centeredMessage ui__ container">
<h1>{capitalise0(name)}</h1>
<p>
<Trans i18nKey="ambiguous">
Plusieurs règles de la base ont ce nom. Laquelle voulez-vous afficher ?

View File

@ -1,17 +1,12 @@
import { resetSimulation } from 'Actions/actions'
import { React, T } from 'Components'
import Answers from 'Components/AnswerList'
import Conversation from 'Components/conversation/Conversation'
import withColours from 'Components/utils/withColours'
import { compose } from 'ramda'
import { connect } from 'react-redux'
import {
blockingInputControlsSelector,
nextStepsSelector,
noUserInputSelector,
validInputEnteredSelector
} from 'Selectors/analyseSelectors'
import Animate from 'Ui/animate'
import { resetSimulation } from 'Actions/actions';
import { React, T } from 'Components';
import Answers from 'Components/AnswerList';
import Conversation from 'Components/conversation/Conversation';
import withColours from 'Components/utils/withColours';
import { compose } from 'ramda';
import { connect } from 'react-redux';
import { blockingInputControlsSelector, nextStepsSelector, noUserInputSelector, validInputEnteredSelector } from 'Selectors/analyseSelectors';
import Animate from 'Ui/animate';
export default compose(
withColours,
@ -61,7 +56,7 @@ export default compose(
<button
className="ui__ small button "
onClick={() => this.setState({ displayAnswers: true })}>
Voir mes réponses
<T>Voir mes réponses</T>
</button>
) : (
<span />

View File

@ -1,11 +1,11 @@
import classNames from 'classnames'
import { makeJsx } from 'Engine/evaluation'
import { identity, any, compose, path, values } from 'ramda'
import React from 'react'
import { Trans, withNamespaces } from 'react-i18next'
import './Algorithm.css'
import classNames from 'classnames';
import { makeJsx } from 'Engine/evaluation';
import { any, compose, identity, path } from 'ramda';
import React from 'react';
import { Trans, withNamespaces } from 'react-i18next';
import './Algorithm.css';
// The showValues prop is passed as a context. It used to be delt in CSS (not(.showValues) display: none), both coexist right now
import { ShowValuesProvider } from './ShowValuesContext'
import { ShowValuesProvider } from './ShowValuesContext';
let Conditions = ({
parentDependency,
@ -34,18 +34,19 @@ export default compose(withNamespaces())(
class Algorithm extends React.Component {
render() {
let { rule, showValues } = this.props
let formula =
rule['formule'] ||
(rule.category === 'variable' && rule.explanation.formule),
displayFormula =
formula && !!Object.keys(formula).length &&
!path(['formule', 'explanation', 'une possibilité'], rule)
console.log(rule.dottedName, formula, displayFormula)
return (
<div id="algorithm">
<section id="rule-rules" className={classNames({ showValues })}>
<ShowValuesProvider value={showValues}>
<Conditions {...rule} />
{do {
let formula =
rule['formule'] ||
(rule.category === 'variable' && rule.explanation.formule),
displayFormula =
formula &&
!path(['formule', 'explanation', 'une possibilité'], rule)
{
displayFormula && (
<section id="formule">
<h2>
@ -54,7 +55,7 @@ export default compose(withNamespaces())(
{makeJsx(formula)}
</section>
)
}}
}
</ShowValuesProvider>
</section>
</div>

View File

@ -1,36 +1,28 @@
import withColours from 'Components/utils/withColours'
import withLanguage from 'Components/utils/withLanguage'
import withSitePaths from 'Components/utils/withSitePaths'
import { getInputComponent } from 'Engine/generateQuestions'
import knownMecanisms from 'Engine/known-mecanisms.yaml'
import { createMarkdownDiv } from 'Engine/marked'
import {
encodeRuleName,
findRuleByDottedName,
findRuleByNamespace
} from 'Engine/rules'
import { compose, isEmpty, isNil } from 'ramda'
import React, { Component, Suspense } from 'react'
import emoji from 'react-easy-emoji'
import Helmet from 'react-helmet'
import { Trans, withNamespaces } from 'react-i18next'
import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
import { reduxForm } from 'redux-form'
import {
exampleAnalysisSelector,
flatRulesSelector,
noUserInputSelector,
ruleAnalysisSelector
} from 'Selectors/analyseSelectors'
import Animate from 'Ui/animate'
import Montant from 'Ui/Montant'
import { AttachDictionary } from '../AttachDictionary'
import Algorithm from './Algorithm'
import Examples from './Examples'
import RuleHeader from './Header'
import References from './References'
import './Rule.css'
import { T } from "Components";
import withColours from 'Components/utils/withColours';
import withLanguage from 'Components/utils/withLanguage';
import withSitePaths from 'Components/utils/withSitePaths';
import { getInputComponent } from 'Engine/generateQuestions';
import knownMecanisms from 'Engine/known-mecanisms.yaml';
import { createMarkdownDiv } from 'Engine/marked';
import { encodeRuleName, findRuleByDottedName, findRuleByNamespace } from 'Engine/rules';
import { compose, isEmpty, isNil } from 'ramda';
import React, { Component, Suspense } from 'react';
import emoji from 'react-easy-emoji';
import Helmet from 'react-helmet';
import { Trans, withNamespaces } from 'react-i18next';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
import { reduxForm } from 'redux-form';
import { exampleAnalysisSelector, flatRulesSelector, noUserInputSelector, ruleAnalysisSelector } from 'Selectors/analyseSelectors';
import Animate from 'Ui/animate';
import Montant from 'Ui/Montant';
import { AttachDictionary } from '../AttachDictionary';
import Algorithm from './Algorithm';
import Examples from './Examples';
import RuleHeader from './Header';
import References from './References';
import './Rule.css';
let LazySource = React.lazy(() => import('./RuleSource'))
@ -58,7 +50,6 @@ export default compose(
sitePaths,
analysedExample,
analysedRule,
language
} = this.props,
flatRule = findRuleByDottedName(flatRules, dottedName)
let { type, name, title, description, question, ns, icon } = flatRule,
@ -66,7 +57,6 @@ export default compose(
let displayedRule = analysedExample || analysedRule
let ruleFormat = displayedRule.format || displayedRule.explanation?.format
console.log('ruleFormat', ruleFormat)
return (
<>
{this.state.viewSource ? (
@ -134,7 +124,7 @@ export default compose(
? sitePaths.sécuritéSociale.index
: sitePaths.index
}>
Simuler ma situation
<T>Simuler ma situation</T>
</Link>
</div>
)}

View File

@ -1,6 +1,6 @@
import { resetSimulation, setSimulationConfig } from 'Actions/actions'
import React from 'react'
import { connect } from 'react-redux'
import { resetSimulation, setSimulationConfig } from 'Actions/actions';
import React from 'react';
import { connect } from 'react-redux';
export default config => SimulationComponent =>
connect(
@ -22,7 +22,7 @@ export default config => SimulationComponent =>
}
render() {
if (!this.props.config) return null
return <SimulationComponent />
return <SimulationComponent {...this.props}/>
}
}
)

View File

@ -151,7 +151,6 @@ export let treatVariableTransforms = (rules, rule) => parseResult => {
}
if (!ruleToTransform.période) return filteredNode
let environmentPeriod = situation('période') || 'mois'
console.log(rule.dottedName, environmentPeriod)
let callingPeriod =
inlinePeriodTransform ||
(rule.période === 'flexible' ? environmentPeriod : rule.période)

View File

@ -101,6 +101,7 @@ Part employeur: Employer share
Part salariale: Employee share
Total des retenues: Total withheld
Fiche de paie mensuelle: Monthly payslip
Fiche de paie: Payslip
Détail annuel des cotisations: Annual detail of your contributions
Voir la répartition des cotisations: View contribution breakdown
Cotisations: Contributions
@ -120,7 +121,7 @@ Cadre: '"Cadre" status'
Temps partiel: Part time
Autres: Other situations
Mes réponses: My answers
Modifier mes réponses: Change my answers
Voir mes réponses: See my answers
simulation-end:
title: No more questions left!
text: You have reached the most accurate estimate.
@ -180,10 +181,6 @@ De: From
En-dessous de: Below
Au-dessus de: Above
Taux final: Final rate
Créez votre entreprise: Start your business in France
Créer votre entreprise: Create your company
subtitle: The ultimate how-to guide, from incorporation to hiring.
Commencer: Get started
Passer: Skip
@ -260,16 +257,16 @@ entreprise:
titre: Make a declaration of asset allocation
description: >
<0>
The <1>declaration of asset allocation</1> allows you to separate professional
assets from your personal assets, which then becomes unseizable. This procedure
The <1>declaration of asset allocation</1> allows you to separate professional
assets from your personal assets, which then becomes unseizable. This procedure
is free of charge if it is carried out at the time of the creation
of a company.
</0>
<1>
To do so, simply declare which assets are allocated to the patrimony of your company.
All the contributions necessary for your professional activity must be included
(for example: goodwill, trademark, patent, or professional equipment). You can do
the valuation of the asset yourself if it does not exceed €30,000.
To do so, simply declare which assets are allocated to the patrimony of your company.
All the contributions necessary for your professional activity must be included
(for example: goodwill, trademark, patent, or professional equipment). You can do
the valuation of the asset yourself if it does not exceed €30,000.
</1>
<2>
<0>$t(Plus d'informations)</0>
@ -329,9 +326,9 @@ autoentrepreneur:
titre: Auto-entrepeneur
description: >
<0>
The auto-entrepreneur benefits from a simplified scheme of declaration and payment, for which tax and social contributions
are based on the turnover achieved each month. Available for companies whose annual
turnover does not exceed €70,000 for services providers or €170,000 when the main activity
The auto-entrepreneur benefits from a simplified scheme of declaration and payment, for which tax and social contributions
are based on the turnover achieved each month. Available for companies whose annual
turnover does not exceed €70,000 for services providers or €170,000 when the main activity
is the sale of goods, catering or the provision of housing.
</0>
<1>
@ -344,11 +341,11 @@ autoentrepreneur:
</2>
<3>
<0>Note:</0>
Some activities are excluded from this status (<2>see the list [fr]</2>). Some activities
Some activities are excluded from this status (<2>see the list [fr]</2>). Some activities
are regulated with a qualification or a professional experience (<4>see the list [fr])</4>).
</3>
<4>
For all the other cases, it is advised to choose the standard status, which
For all the other cases, it is advised to choose the standard status, which
is <1>Individual Business.</1>
</4>
associés:
@ -358,12 +355,12 @@ associés:
titre: Number of partners
description: >
<0>
A company with only one partner is easier to create and manage. A shareholder
may be a natural person (an individual) or a legal person (for example,
A company with only one partner is easier to create and manage. A shareholder
may be a natural person (an individual) or a legal person (for example,
another company).
</0>
<1>
Note: this choice is not final. You can start your company on your own,
Note: this choice is not final. You can start your company on your own,
and welcome new partners as your business grows.
</1>
choix1: Only one partner
@ -411,6 +408,7 @@ sécu:
France has chosen to provide its citizens with a high-quality social safety net. This mandatory system is based on solidarity and designed to ensure the <strong>general welfare of its people
</1>
video: Social security explained visually
entrepriseCrée: If you already own a company, we can <2>automatically customize</2> your simulations to your situation. All you have to do is <5>enter the name of your company</5>.
Votre entreprise: Your company
Ce n'est pas mon entreprise: This is not my company
@ -460,7 +458,7 @@ embauche:
titre: Choose a payslip software
description: >
With fewer than 20 employees, payslips and declarations can be
handled online by the <2> Tese (Fr)</2>, a tool developped by the french
handled online by the <2> Tese (Fr)</2>, a tool developped by the french
social administration. You can also use <5>a private payslip software (Fr)</5>
registre:
titre: Keep an updated staff register
@ -486,6 +484,13 @@ embauche:
</1>
<2>Get an example payslip</2>
simulateur-salarié:
page:
titre: Estimate employee hiring cost
description: Simulate an employee's contributions to the social security. Official complete calculation of all contributions. Discover the counterparties guaranteed by social security
titre: Estimate social contributions for an employee
description: As soon as an employee's employment is declared and paid, he or she is covered by the general social security system (health, maternity, invalidity, old age, occupational disease and accidents) and unemployment.
Guide du statut juridique: Legal status guide
Démarches de création: Creation process checklist
@ -494,7 +499,7 @@ path:
index: '/company'
votreEntreprise: '/my-company'
créer: '/create-a-{{companyStatus}}'
autoEntrepreneur: '/become-{{companyStatus}}'
devenirAutoEntrepreneur: '/become-{{autoEntrepreneur}}'
trouver: '/find'
après: '/after-registration'
statutJuridique:
@ -517,13 +522,13 @@ auto-entrepreneur-EIRL: auto-entrepreneur-with-EIRL-option
privacyContent: >
<0>$t(Vie privée)</0>
<1>
We do not store any personal data on our servers. All the information
you provide (salaries, company postal code, SIREN etc.) is saved only
We do not store any personal data on our servers. All the information
you provide (salaries, company postal code, SIREN etc.) is saved only
on your browser. No one else can have access to it but you.
</1>
<2>
However, we do collect anonymous statistics on site usage, which we use
for the sole purpose of improving the service, in accordance with the
However, we do collect anonymous statistics on site usage, which we use
for the sole purpose of improving the service, in accordance with the
<2>recommendations of the CNIL</2> and the DPRG directive.
</2>
<3>You can opt out below.</3>
@ -555,7 +560,24 @@ Année: Year
mois: month
an: year
par: per
Explorez notre base de règles: Explore our rules
Explorez notre documentation: Explore our documentation
maj2019: The simulation is up-to-date in 2019.
siteName: mycompanyinfrance.fr
siteName: My company in France
Simuler ma situation: Simulate my situation
Exemples: Examples
Intégrer le simulateur: Integrate the simulator
# Landing infrance
Que souhaitez vous faire ?: What do you want to do?
Créer votre entreprise: Create your company
subtitle: The official guide for entrepreneurs
Connaître les démarches d'embauche: Know the hiring procedures
Estimer les cotisations et les taxes: Estimate contributions and taxes
Créer une entreprise: Create a company in France
Déclarer mon activité d'économie collaborative: Declare my activity in the sharing economy
prochainement: soon
Estimer les cotisations sociales pour une embauche: Estimate the social security contributions for a hiring
À quoi servent mes cotisations ?: How are my contributions distributed?

View File

@ -4,7 +4,7 @@ import { analyse, analyseMany, parseAll } from 'Engine/traverse';
import { add, contains, difference, equals, head, intersection, isNil, mergeDeepWith, pick } from 'ramda';
import { getFormValues } from 'redux-form';
import { createSelector, createSelectorCreator, defaultMemoize } from 'reselect';
import { softCatch } from '../utils';
import { mapOrApply, softCatch } from '../utils';
// create a "selector creator" that uses deep equal instead of ===
const createDeepEqualSelector = createSelectorCreator(defaultMemoize, equals)
@ -16,7 +16,6 @@ const createDeepEqualSelector = createSelectorCreator(defaultMemoize, equals)
*
* */
const mapOrApply = (fn, x) => (Array.isArray(x) ? x.map(fn) : fn(x))
export let flatRulesSelector = createSelector(
state => state.lang,

View File

@ -1,6 +1,7 @@
import LangSwitcher from 'Components/LangSwitcher'
import React, { Component } from 'react'
import { withRouter } from 'react-router'
import { T } from "Components";
import { Link } from 'react-router-dom'
import { withNamespaces } from 'react-i18next'
import Logo from '../images/logo/logo-simulateur.svg'
@ -58,16 +59,16 @@ export const Header = compose(
let Links = ({ toggle }) => (
<div id="links" onClick={toggle}>
<Link className="menu-item" to="/exemples">
Exemples
<T>Exemples</T>
</Link>
<Link className="menu-item" to="/intégrer">
Intégrer le module
<T>Intégrer le simulateur</T>
</Link>
<Link className="menu-item" to="/règles">
Nos règles
<Link className="menu-item" to="/documentation">
<T>Documentation</T>
</Link>
<Link className="menu-item" to="/à-propos">
À propos
<T>À propos</T>
</Link>
</div>
)

View File

@ -1,9 +1,9 @@
import { Component, React, T } from 'Components'
import SearchBar from 'Components/SearchBar'
import { connect } from 'react-redux'
import 'react-select/dist/react-select.css'
import { flatRulesSelector } from 'Selectors/analyseSelectors'
import './RulesList.css'
import { Component, React, T } from 'Components';
import SearchBar from 'Components/SearchBar';
import { connect } from 'react-redux';
import 'react-select/dist/react-select.css';
import { flatRulesSelector } from 'Selectors/analyseSelectors';
import './RulesList.css';
export default connect(state => ({
flatRules: flatRulesSelector(state)
@ -14,7 +14,7 @@ export default connect(state => ({
return (
<div id="RulesList" className="ui__ container">
<h1>
<T>Explorez notre base de règles</T>
<T>Explorez notre documentation</T>
</h1>
<SearchBar showDefaultList={true} rules={flatRules} />
</div>

View File

@ -1,32 +1,29 @@
import RulePage from 'Components/RulePage'
import TrackPageView from 'Components/utils/TrackPageView'
import withSitePaths from 'Components/utils/withSitePaths'
import { defaultTracker } from 'Components/utils/withTracker'
import { compose } from 'ramda'
import createRavenMiddleware from 'raven-for-redux'
import Raven from 'raven-js'
import React, { Component } from 'react'
import Helmet from 'react-helmet'
import { withNamespaces } from 'react-i18next'
import { Route, Switch } from 'react-router-dom'
import 'Ui/index.css'
import Provider from '../../Provider'
import {
persistEverything,
retrievePersistedState
} from '../../storage/persistEverything'
import ReactPiwik from '../../Tracker'
import './App.css'
import Footer from './layout/Footer/Footer'
import Navigation from './layout/Navigation/Navigation'
import ProgressHeader from './layout/ProgressHeader/ProgressHeader'
import trackSimulatorActions from './middlewares/trackSimulatorActions'
import CompanyIndex from './pages/Company'
import HiringProcess from './pages/HiringProcess'
import Landing from './pages/Landing'
import Sitemap from './pages/Sitemap'
import SocialSecurity from './pages/SocialSecurity'
import sitePaths from './sitePaths'
import RulePage from 'Components/RulePage';
import TrackPageView from 'Components/utils/TrackPageView';
import withSitePaths from 'Components/utils/withSitePaths';
import { defaultTracker } from 'Components/utils/withTracker';
import { compose } from 'ramda';
import createRavenMiddleware from 'raven-for-redux';
import Raven from 'raven-js';
import React, { Component } from 'react';
import Helmet from 'react-helmet';
import { withNamespaces } from 'react-i18next';
import { Route, Switch } from 'react-router-dom';
import 'Ui/index.css';
import Provider from '../../Provider';
import { persistEverything, retrievePersistedState } from '../../storage/persistEverything';
import ReactPiwik from '../../Tracker';
import './App.css';
import Footer from './layout/Footer/Footer';
import Navigation from './layout/Navigation/Navigation';
import ProgressHeader from './layout/ProgressHeader/ProgressHeader';
import trackSimulatorActions from './middlewares/trackSimulatorActions';
import CompanyIndex from './pages/Company';
import HiringProcess from './pages/HiringProcess';
import Landing from './pages/Landing';
import Sitemap from './pages/Sitemap';
import SocialSecurity from './pages/SocialSecurity';
import sitePaths from './sitePaths';
if (process.env.NODE_ENV === 'production') {
Raven.config(
@ -88,7 +85,7 @@ const App = compose(
withNamespaces()
)(({ sitePaths, t }) => (
<div className="app-container">
<Helmet titleTemplate={`%s | ${t(['siteName', 'mon-entreprise.fr'])}`} />
<Helmet titleTemplate={`%s | ${t(['siteName', 'Mon-entreprise.fr'])}`} />
{/* Passing location down to prevent update blocking */}
<Navigation location={location} />
<div className="app-content">

View File

@ -1,22 +1,19 @@
/* @flow */
import {
checkCompanyCreationItem,
initializeCompanyCreationChecklist
} from 'Actions/companyCreationChecklistActions'
import { goToCompanyStatusChoice } from 'Actions/companyStatusActions'
import { React, T } from 'Components'
import Scroll from 'Components/utils/Scroll'
import withSitePaths from 'Components/utils/withSitePaths'
import { compose } from 'ramda'
import Helmet from 'react-helmet'
import { withNamespaces } from 'react-i18next'
import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
import * as Animate from 'Ui/animate'
import { CheckItem, Checklist } from 'Ui/Checklist'
import { LANDING_LEGAL_STATUS_LIST } from '../../sitePaths'
import Page404 from '../404'
import StatusDescription from './StatusDescription'
import { checkCompanyCreationItem, initializeCompanyCreationChecklist } from 'Actions/companyCreationChecklistActions';
import { goToCompanyStatusChoice } from 'Actions/companyStatusActions';
import { React, T } from 'Components';
import Scroll from 'Components/utils/Scroll';
import withSitePaths from 'Components/utils/withSitePaths';
import { compose } from 'ramda';
import Helmet from 'react-helmet';
import { withNamespaces } from 'react-i18next';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
import * as Animate from 'Ui/animate';
import { CheckItem, Checklist } from 'Ui/Checklist';
import { LANDING_LEGAL_STATUS_LIST } from '../../sitePaths';
import Page404 from '../404';
import StatusDescription from './StatusDescription';
import type { Match } from 'react-router'
import type { TFunction } from 'react-i18next'
@ -45,6 +42,7 @@ const CreateCompany = ({
const companyStatus = LANDING_LEGAL_STATUS_LIST.find(
status => t(status) === match.params.status
)
console.log('yopyop', status, companyStatus)
const isAutoentrepreneur = [
'auto-entrepreneur',
'auto-entrepreneur-EIRL'

View File

@ -1,21 +1,21 @@
import withSitePaths from 'Components/utils/withSitePaths'
import { compose } from 'ramda'
import React from 'react'
import { withNamespaces } from 'react-i18next'
import { connect } from 'react-redux'
import { Redirect, Route, Switch } from 'react-router'
import * as Animate from 'Ui/animate'
import AfterRegistration from './AfterRegistration'
import AutoEntrepreneur from './AutoEntrepreneur'
import CreationChecklist from './CreationChecklist'
import DefineDirectorStatus from './DirectorStatus'
import Find from './Find'
import Home from './Home'
import Liability from './Liability'
import MinorityDirector from './MinorityDirector'
import NumberOfAssociate from './NumberOfAssociate'
import PickLegalStatus from './PickLegalStatus'
import YourCompany from './YourCompany'
import withSitePaths from 'Components/utils/withSitePaths';
import { compose } from 'ramda';
import React from 'react';
import { withNamespaces } from 'react-i18next';
import { connect } from 'react-redux';
import { Redirect, Route, Switch } from 'react-router';
import * as Animate from 'Ui/animate';
import AfterRegistration from './AfterRegistration';
import AutoEntrepreneur from './AutoEntrepreneur';
import CreationChecklist from './CreationChecklist';
import DefineDirectorStatus from './DirectorStatus';
import Find from './Find';
import Home from './Home';
import Liability from './Liability';
import MinorityDirector from './MinorityDirector';
import NumberOfAssociate from './NumberOfAssociate';
import PickLegalStatus from './PickLegalStatus';
import YourCompany from './YourCompany';
const withAnimation = Component => {
const AnimateRouteComponent = (...props) => (
<Animate.fromBottom>
@ -32,6 +32,7 @@ const CreateMyCompany = ({
existingCompany,
sitePaths
}) => {
console.log('sitapath', sitePaths.entreprise.créer(':status'))
return (
<>
<Animate.fromBottom>
@ -40,10 +41,7 @@ const CreateMyCompany = ({
path={sitePaths.entreprise.votreEntreprise}
component={YourCompany}
/>
<Route
path={sitePaths.entreprise.créer(':status')}
component={CreationChecklist}
/>
{sitePaths.entreprise.créer(':status').map(path => <Route path={path} key={path} component={CreationChecklist} />)}
<Route path={sitePaths.entreprise.trouver} component={Find} />
<Route
path={sitePaths.entreprise.après}

View File

@ -85,8 +85,7 @@
.landing__choice--soon img {
filter: saturate(0%);
}
.landing__choice--soon::after {
content: 'prochainement';
.landing__choice-label {
position: absolute;
top: 0;
font-size: 66%;

View File

@ -1,34 +1,40 @@
/* @flow */
import withColours from 'Components/utils/withColours'
import withSitePaths from 'Components/utils/withSitePaths'
import marianneSvg from 'Images/marianne.svg'
import urssafSvg from 'Images/urssaf.svg'
import { compose } from 'ramda'
import React from 'react'
import emoji from 'react-easy-emoji'
import { Trans, withNamespaces } from 'react-i18next'
import { Link } from 'react-router-dom'
import Animate from 'Ui/animate'
import Footer from '../layout/Footer/Footer'
import './Landing.css'
import { T } from 'Components';
import withColours from 'Components/utils/withColours';
import withSitePaths from 'Components/utils/withSitePaths';
import marianneSvg from 'Images/marianne.svg';
import urssafSvg from 'Images/urssaf.svg';
import { compose } from 'ramda';
import React from 'react';
import emoji from 'react-easy-emoji';
import { withNamespaces } from 'react-i18next';
import { Link } from 'react-router-dom';
import Animate from 'Ui/animate';
import Footer from '../layout/Footer/Footer';
import './Landing.css';
import type {ThemeColours} from 'Components/utils/withColours'
import type {SitePaths} from 'Components/utils/withSitePaths'
type Props = {
colours: ThemeColours,
sitePaths: SitePaths
}
export default compose(
withNamespaces(),
withSitePaths,
withColours,
withSitePaths
)(({ colours: { colour }, sitePaths }) => (
<>
withNamespaces(),
)(({ colours: { colour }, sitePaths }: Props) => (
<div className="app-content">
<section className="landing__banner" style={{ backgroundColor: colour }}>
<header>
<h1>
<Trans>Mon-entreprise.fr</Trans>
<T k="siteName">Mon-entreprise.fr</T>
</h1>
<p className="ui__ lead" style={{ maxWidth: '35rem' }}>
<Trans i18nKey="subtitle">
Les ressources pour créer et administrer votre activité en toute
simplicité.
</Trans>
<T k="subtitle">
Le guide officiel du créateur d'entreprise
</T>
</p>
<svg
@ -39,36 +45,35 @@ export default compose(
</svg>
</header>
</section>
<section className="ui__ container">
<section className="ui__ container" style={{flex: 1}}>
<div className="landing__header">
<img alt="logo marianne" src={marianneSvg} />
<img alt="logo urssaf" src={urssafSvg} />
</div>
<h2 style={{ textAlign: 'center', marginBottom: '2rem' }}>
Que souhaitez vous faire ?
<T>Que souhaitez vous faire ?</T>
</h2>
<Animate.fromBottom>
<Link className="landing__choice " to={sitePaths.entreprise.index}>
{emoji('💡')} Créer une entreprise
{emoji('💡')} <T>Créer une entreprise</T>
</Link>
<Link className="landing__choice " to={sitePaths.sécuritéSociale.index}>
{emoji('💶')} Estimer les cotisations et les taxes
{emoji('💶')} <T>Estimer les cotisations et les taxes</T>
</Link>
<Link className="landing__choice" to={sitePaths.démarcheEmbauche.index}>
{emoji('🤝')} Connaître les démarches d'embauche
{emoji('🤝')} <T>Connaître les démarches d'embauche</T>
</Link>
<Link className="landing__choice landing__choice--soon" to={'/'}>
{emoji('🏡')} Déclarer mon activité d'économie collaborative
<span className="landing__choice-label"><T>prochainement</T></span>
{emoji('🏡')} <T>Déclarer mon activité d'économie collaborative</T>
</Link>
{/*
<Link className="landing__choice landing__choice--soon" to={'/'}>
{emoji('🌍')} Démarrer une activité en France en tant qu'entrepreneur
étranger
</Link>
</Link> */}
</Animate.fromBottom>
</section>
<Footer />
</>
</div>
))

View File

@ -1,18 +1,18 @@
/* @flow */
import { Component, React, T } from 'Components';
import { ScrollToTop } from 'Components/utils/Scroll';
import withLanguage from 'Components/utils/withLanguage';
import withSitePaths from 'Components/utils/withSitePaths';
import { compose } from 'ramda';
import emoji from 'react-easy-emoji';
import Helmet from 'react-helmet';
import { withNamespaces } from 'react-i18next';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
import { régimeSelector } from 'Selectors/companyStatusSelectors';
import * as Animate from 'Ui/animate';
import Video from './Video';
import { Component, React, T } from 'Components'
import { ScrollToTop } from 'Components/utils/Scroll'
import withLanguage from 'Components/utils/withLanguage'
import withSitePaths from 'Components/utils/withSitePaths'
import { compose } from 'ramda'
import emoji from 'react-easy-emoji'
import Helmet from 'react-helmet'
import { withNamespaces } from 'react-i18next'
import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
import { régimeSelector } from 'Selectors/companyStatusSelectors'
import * as Animate from 'Ui/animate'
import Video from './Video'
import type { Match, Location } from 'react-router'
import type { TFunction } from 'react-i18next'
@ -52,39 +52,48 @@ class SocialSecurity extends Component<Props, {}> {
</T>
{showFindYourCompanyLink && (
<p>
Si vous possédez déjà une entreprise, nous pouvons{' '}
<strong>automatiquement personnaliser</strong> vos simulations à
votre situation. Il vous suffit juste de{' '}
<Link to={sitePaths.entreprise.trouver}>
renseigner le nom de votre entreprise.
</Link>
<T k="sécu.entrepriseCrée">
Si vous possédez déjà une entreprise, nous pouvons{' '}
<strong>automatiquement personnaliser</strong> vos simulations
à votre situation. Il vous suffit juste de{' '}
<Link to={sitePaths.entreprise.trouver}>
renseigner le nom de votre entreprise.
</Link>
</T>
</p>
)}
{!['mycompanyinfrance.fr', 'mon-entreprise.fr'].includes(window.location.hostname) ? <>
<br />
<h2 style={{ textAlign: 'center', marginBottom: '2rem' }}>
Que souhaitez vous estimer ?
</h2>
<Link
className="landing__choice "
to={
régime
? sitePaths.sécuritéSociale[régime]
: sitePaths.sécuritéSociale.comparaison
}>
{emoji('👔')} La rémunération du dirigeant
</Link>
<Link
className="landing__choice "
to={sitePaths.sécuritéSociale.salarié}>
{emoji('👥')} Le salaire d'un employé
</Link>
<br />
</> : <Link
className="landing__choice "
to={sitePaths.sécuritéSociale.salarié}>
{emoji('👥')} Estimer les cotisations sociales pour une embauche
</Link>}
{['mycompanyinfrance.fr', 'mon-entreprise.fr'].includes(
window.location.hostname
) ? (
<>
<br />
<h2 style={{ textAlign: 'center', marginBottom: '2rem' }}>
Que souhaitez vous estimer ?
</h2>
<Link
className="landing__choice "
to={
régime
? sitePaths.sécuritéSociale[régime]
: sitePaths.sécuritéSociale.comparaison
}>
{emoji('👔')} La rémunération du dirigeant
</Link>
<Link
className="landing__choice "
to={sitePaths.sécuritéSociale.salarié}>
{emoji('👥')} Le salaire d'un employé
</Link>
<br />
</>
) : (
<Link
className="landing__choice "
to={sitePaths.sécuritéSociale.salarié}>
{emoji('👥')}{' '}
<T>Estimer les cotisations sociales pour une embauche</T>
</Link>
)}
<Video />
</Animate.fromBottom>

View File

@ -1,12 +1,14 @@
import { React, T } from 'Components'
import SalaryExplanation from 'Components/SalaryExplanation'
import Simulation from 'Components/Simulation'
import salariéConfig from 'Components/simulationConfigs/salarié.yaml'
import withSimulationConfig from 'Components/simulationConfigs/withSimulationConfig'
import TargetSelection from 'Components/TargetSelection'
import withSitePaths from 'Components/utils/withSitePaths'
import { Helmet } from 'react-helmet'
import { Link } from 'react-router-dom'
import { React, T } from 'Components';
import SalaryExplanation from 'Components/SalaryExplanation';
import Simulation from 'Components/Simulation';
import salariéConfig from 'Components/simulationConfigs/salarié.yaml';
import withSimulationConfig from 'Components/simulationConfigs/withSimulationConfig';
import TargetSelection from 'Components/TargetSelection';
import withSitePaths from 'Components/utils/withSitePaths';
import { compose } from 'ramda';
import { Helmet } from 'react-helmet';
import { withNamespaces } from 'react-i18next';
import { Link } from 'react-router-dom';
export let SalarySimulation = withSitePaths(({ sitePaths }) => (
<Simulation
@ -30,24 +32,25 @@ export let SalarySimulation = withSitePaths(({ sitePaths }) => (
/>
))
const Salarié = () => (
const Salarié = ({t}) => (
<>
<Helmet>
<title>
Salarié au régime général : cotisations et protection sociale{' '}
{t(['simulateur-salarié.page.titre', 'Salarié au régime général : cotisations et protection sociale'])}
</title>
<meta
name="description"
content="Simulez les cotisations d'un salarié au régime général. Calcul complet de toutes les cotisations. Découvrez les contreparties garanties par sécurité sociale"
content={t(['simulateur-salarié.page.description', "Simulez les cotisations d'un salarié au régime général. Calcul complet de toutes les cotisations. Découvrez les contreparties garanties par sécurité sociale"])}
/>
</Helmet>
<h1>Salarié au régime général</h1>
<p>
<h1><T k="simulateur-salarié.titre">Salarié au régime général</T></h1>
<p><T k="simulateur-salarié.description">
Dès que l'embauche d'un salarié est déclarée et qu'il est payé, il est
couvert par le régime général de la Sécurité sociale (santé, maternité,
invalidité, vieillesse, maladie professionnelle et accidents) et chômage.
</T>
</p>
<SalarySimulation />
</>
)
export default withSimulationConfig(salariéConfig)(Salarié)
export default compose(withNamespaces(), withSimulationConfig(salariéConfig))(Salarié)

View File

@ -1,7 +1,7 @@
/* @flow */
import { reduce, toPairs, zipObj } from 'ramda'
import i18n from '../../i18n'
import { constructSitePaths } from '../../utils'
import { reduce, toPairs, zipObj } from 'ramda';
import i18n from '../../i18n';
import { constructSitePaths } from '../../utils';
import type { LegalStatus } from 'Selectors/companyStatusSelectors'
export const LANDING_LEGAL_STATUS_LIST: Array<LegalStatus> = [
@ -34,15 +34,15 @@ const constructLocalizedSitePath = language => {
),
créer: (companyStatus: LegalStatus | ':status') =>
companyStatus === ':status'
? `(${t('path.entreprise.créer', '/créer-une-{{companyStatus}}', {
? [t('path.entreprise.créer', '/créer-une-{{companyStatus}}',{
companyStatus: ':status'
})}|${t(
}), t(
'path.entreprise.devenirAutoEntrepreneur',
'/devenir-{{autoEntrepreneur}}',
{
autoEntrepreneur: ':status'
}
)})`
)]
: companyStatus.includes('auto-entrepreneur')
? t(
'path.entreprise.devenirAutoEntrepreneur',
@ -52,7 +52,7 @@ const constructLocalizedSitePath = language => {
}
)
: t('path.entreprise.créer', '/créer-une-{{companyStatus}}', {
companyStatus: ':status'
companyStatus
}),
trouver: t('path.entreprise.trouver', '/retrouver-votre-entreprise'),

View File

@ -82,6 +82,8 @@ export function softCatch<ArgType: any, ReturnType: any>(
}
}
}
export const mapOrApply = (fn, x) => (Array.isArray(x) ? x.map(fn) : fn(x))
export const constructSitePaths = (
root: string,
@ -93,7 +95,7 @@ export const constructSitePaths = (
typeof value === 'string'
? root + index + value
: typeof value === 'function'
? (...args) => root + index + value(...args)
? (...args) => mapOrApply(x => root + index + x, value(...args))
: constructSitePaths(root + index, value),
sitePaths
)

View File

@ -59,12 +59,12 @@ module.exports = {
template: 'index.html',
chunks: ['mon-entreprise'],
title:
'Mon-entreprise.fr : Le guide officiel pour créer et administrer votre activité',
"Mon-entreprise.fr : Le guide officiel du créateur d'entreprise",
description:
'Du statut juridique à la première embauche, en passant par la simulation des cotisations, vous trouverez ici toutes les ressources pour démarrer votre activité.',
filename: 'mon-entreprise.html'
}),
new CopyPlugin([
'./manifest.webmanifest',
'./source/sites/embauche.gouv.fr/images/logo',