diff --git a/api/source/openapi.yaml b/api/source/openapi.yaml index c0fe31bd3..649febba6 100644 --- a/api/source/openapi.yaml +++ b/api/source/openapi.yaml @@ -6,6 +6,6 @@ info: description: Cet API expose les règles Publicodes de [mon-entreprise](https://mon-entreprise.urssaf.fr/). servers: - - url: https://test-api.osc-fr1.scalingo.io/api/v1/ + - url: https://mon-entreprise-api.osc-fr1.scalingo.io/api/v1/ paths: {} diff --git a/site/netlify.toml b/site/netlify.toml index 9c29a86f9..31aedbba1 100644 --- a/site/netlify.toml +++ b/site/netlify.toml @@ -3,11 +3,10 @@ for = "/*" [headers.values] Content-Security-Policy = "default-src 'self' mon-entreprise.fr; style-src 'self' 'unsafe-inline' mon-entreprise.zammad.com; connect-src 'self' *.incubateur.net raw.githubusercontent.com tm.urssaf.fr mon-entreprise.zammad.com api.recherche-entreprises.fabrique.social.gouv.fr geo.api.gouv.fr *.algolia.net *.algolianet.com; form-action 'self' *.sibforms.com *.incubateur.net mon-entreprise.zammad.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' tm.urssaf.fr *.incubateur.net stonly.com code.jquery.com mon-entreprise.zammad.com polyfill.io; img-src 'self' data: tm.urssaf.fr user-images.githubusercontent.com; frame-src 'self' https://www.youtube-nocookie.com https://codesandbox.io https://place-des-entreprises.beta.gouv.fr https://reso-staging.osc-fr1.scalingo.io" - -## API proxy +## Scalingo proxy for API [[redirects]] from = "/api/*" - to = "https://test-api.osc-fr1.scalingo.io/api/:splat" + to = "https://mon-entreprise-api.osc-fr1.scalingo.io/api/:splat" status = 200 ## Twemoji proxy for client privacy #1219 @@ -76,10 +75,21 @@ Content-Security-Policy = "default-src 'self' mon-entreprise.fr; style-src 'self # EN | sasu-chairman -> sasu [[redirects]] - from=":SITE_FR/simulateurs/sasu-chairman" - to=":SITE_FR/simulateurs/sasu" + from=":SITE_EN/simulateurs/sasu-chairman" + to=":SITE_EN/simulateurs/sasu" status = 301 +# FR | intégration -> développeur +[[redirects]] + from=":SITE_FR/intégration/*" + to=":SITE_FR/développeur/:splat" + status = 301 + +# EN | integration -> developer +[[redirects]] + from=":SITE_EN/integration/*" + to=":SITE_EN/developer/:splat" + status = 301 ############ diff --git a/site/scripts/preCommit/index.ts b/site/scripts/preCommit/index.ts index 64aa68269..d0574abdd 100644 --- a/site/scripts/preCommit/index.ts +++ b/site/scripts/preCommit/index.ts @@ -1,7 +1,6 @@ import { execOnFileChange } from './execOnFileChange.js' -console.log('Search for changed file.') -console.time('Done in') +console.log('Search for changed file...') const results = await execOnFileChange({ basePath: './', @@ -30,5 +29,3 @@ results console.error(result.stderr) } }) - -console.timeEnd('Done in') diff --git a/site/source/App.tsx b/site/source/App.tsx index 2c9480278..3c3c49068 100644 --- a/site/source/App.tsx +++ b/site/source/App.tsx @@ -130,7 +130,7 @@ const App = () => { path={sitePaths.documentation.index} component={Documentation} /> - + diff --git a/site/source/components/layout/Footer/Footer.tsx b/site/source/components/layout/Footer/Footer.tsx index 763d70ed4..8ca65ecc1 100644 --- a/site/source/components/layout/Footer/Footer.tsx +++ b/site/source/components/layout/Footer/Footer.tsx @@ -88,7 +88,7 @@ export default function Footer() {
  • - + Intégrer nos simulateurs
  • diff --git a/site/source/pages/Simulateurs/Home.tsx b/site/source/pages/Simulateurs/Home.tsx index ea309cc15..c9907179e 100644 --- a/site/source/pages/Simulateurs/Home.tsx +++ b/site/source/pages/Simulateurs/Home.tsx @@ -131,7 +131,7 @@ export default function Simulateurs() {
  • Intégrables facilement et gratuitement sur n'importe quel site internet.{' '} - En savoir plus. + En savoir plus.
diff --git a/site/source/pages/integration/API.tsx b/site/source/pages/integration/API.tsx new file mode 100644 index 000000000..a749f90fa --- /dev/null +++ b/site/source/pages/integration/API.tsx @@ -0,0 +1,142 @@ +import Emoji from '@/components/utils/Emoji' +import { ScrollToTop } from '@/components/utils/Scroll' +import { H1, H2, H3 } from '@/design-system/typography/heading' +import { Link } from '@/design-system/typography/link' +import { Body } from '@/design-system/typography/paragraphs' +import { Trans } from 'react-i18next' + +const js = ` +async function salaireNetEnBrutMensuel(net) { + const body = { + situation: { + "contrat salarié . rémunération . net": net + " €", + }, + expressions: [ + "contrat salarié . rémunération . brut de base", + "contrat salarié . prix du travail", + ], + }; + + const response = await fetch( + "https://2138--mon-entreprise.netlify.app/api/v1/evaluate", + { + method: "post", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + } + ); + + console.log(response); + + const json = await response.json(); + + console.log(response.status); + console.log(json); + + return json.evaluate.map(({ nodeValue }) => nodeValue); +} + +const [brut, superBrut] = await salaireNetEnBrutMensuel(3500); + +console.log(brut, superBrut); +` + +export default function API() { + return ( +
+ + +

Utiliser notre API REST

+ + Si votre site ou service requiert de faire des calculs de salaire, par + exemple passer du salaire brut au salaire net, bonne nouvelle : tous + les calculs de cotisations et impôts qui sont derrière mon-entreprise + sont libres et utilisé via notre{' '} + API REST. + + Google Sheets + + +

Comment utiliser cette API ?

+ + + Toutes nos règles de calculs sont écrites en `publicodes`, un language + déclaratif développé par beta.gouv.fr et l'Urssaf pour encoder des + algorithmes d'intérêt public.{' '} + En savoir plus sur publicodes + + + + {/*

Installation

*/} +
+					{js}
+				
+ +
+ +
+ +

Lancer le calcul

+ + Il ne vous reste plus qu'à paramétrer le moteur avec les règles du + paquet `modele-social` et à appeler la fonction `evaluate` sur la + règle que dont vous souhaitez la valeur. Voici un exemple pour le + calcul brut / net + +

Paramétrer le calcul

+ + Vous l'aurez constaté dans l'exemple précédent, la recette d'un calcul + est simple : des variables d'entrée (le salaire brut), une ou + plusieurs variables de sorties (le salaire net). + + + Le calcul est cependant paramétrable avec toutes les possibilités + permise dans la legislation. + + + Toutes ces variables sont listées et expliquées sur la{' '} + + documentation en ligne + + . Cette documentation est auto-générée depuis les fichiers de règles + publicodes, elle est donc constamment à jour. + + + Lançons un calcul plus proche d'une fiche de paie : voici une + description de la situation d'entrée annotée de liens vers les pages + correspondantes de la documentation : + +
+ + {' '} + Un{' '} + + cadre + {' '} + gagnant{' '} + + 3 400€ bruts + {' '} + , qui bénéficie de{' '} + + titres-restaurant + {' '} + et qui travaille dans une entreprise de{' '} + + 22 salariés + + . + +
+
+
+ ) +} diff --git a/site/source/pages/integration/Library.tsx b/site/source/pages/integration/Library.tsx index 0d3f9b0ec..14468cfdf 100644 --- a/site/source/pages/integration/Library.tsx +++ b/site/source/pages/integration/Library.tsx @@ -26,7 +26,7 @@ export default function Library() { Toutes nos règles de calculs sont écrites en `publicodes`, un language déclaratif développé par beta.gouv.fr et l'Urssaf pour encoder des - algorithme d'intérêt public.{' '} + algorithmes d'intérêt public.{' '} En savoir plus sur publicodes diff --git a/site/source/pages/integration/Options.tsx b/site/source/pages/integration/Options.tsx index 49fe72b51..34e964217 100644 --- a/site/source/pages/integration/Options.tsx +++ b/site/source/pages/integration/Options.tsx @@ -40,14 +40,14 @@ export default function Options() { - + } title={t( 'pages.développeurs.home.choice.iframe.title', 'Intégrer un simulateur' )} - to={sitePaths.integration.iframe} + to={sitePaths.développeur.iframe} ctaLabel={t( 'pages.développeurs.home.choice.iframe.cta', 'Commencer' @@ -61,24 +61,27 @@ export default function Options() { - + + } + icon={} title={t( - 'pages.développeurs.choice.library.title', - 'Libraire de calcul' + 'pages.développeurs.home.choice.api.title', + 'Utiliser notre API REST' )} - to={sitePaths.integration.library} - ctaLabel={t('pages.développeurs.choice.library.cta', 'Commencer')} + to={sitePaths.développeur.api} + ctaLabel={t('pages.développeurs.home.choice.api.cta', 'Commencer')} > - - L'intégralité du moteur de calcul socio-fiscal développé par - l'Urssaf, mis à disposition librement sous forme de bibliothèque - NPM. - + + + Utiliser nos simulateurs via notre API ouverte aussi bien sur + votre serveur que dans vos fichier Excel/GSheets. + + - + + - + + } + title={t( + 'pages.développeurs.choice.library.title', + 'Libraire de calcul' + )} + to={sitePaths.développeur.library} + ctaLabel={t('pages.développeurs.choice.library.cta', 'Commencer')} + > + + L'intégralité du moteur de calcul socio-fiscal développé par + l'Urssaf, mis à disposition librement sous forme de bibliothèque + NPM. + + + + + } title={t( diff --git a/site/source/pages/integration/index.tsx b/site/source/pages/integration/index.tsx index c76242258..5556a32f8 100644 --- a/site/source/pages/integration/index.tsx +++ b/site/source/pages/integration/index.tsx @@ -1,16 +1,17 @@ import Emoji from '@/components/utils/Emoji' import { ScrollToTop } from '@/components/utils/Scroll' import { SitePathsContext } from '@/components/utils/SitePathsContext' +import jobOffers from '@/data/job-offers.json' +import { Banner, InnerBanner } from '@/design-system/banner' import { Link } from '@/design-system/typography/link' import { useContext } from 'react' import { Trans } from 'react-i18next' import { Route, Switch, useLocation } from 'react-router-dom' import { TrackChapter } from '../../ATInternetTracking' +import API from './API' import Iframe from './Iframe' import Library from './Library' import Options from './Options' -import jobOffers from '@/data/job-offers.json' -import { Banner, InnerBanner } from '@/design-system/banner' type JobOffer = { title: string @@ -27,10 +28,10 @@ export default function Integration() { - {pathname !== sitePaths.integration.index && ( + {pathname !== sitePaths.développeur.index && ( Outils pour les développeurs @@ -49,9 +50,10 @@ export default function Integration() { )} - - - + + + + ) diff --git a/site/source/sitePaths.ts b/site/source/sitePaths.ts index 11542bc12..356b11c60 100644 --- a/site/source/sitePaths.ts +++ b/site/source/sitePaths.ts @@ -83,10 +83,11 @@ const rawSitePathsFr = { stats: '/stats', accessibilité: '/accessibilité', budget: '/budget', - integration: { - index: '/intégration', + développeur: { + index: '/développeur', iframe: '/iframe', library: '/bibliothèque-de-calcul', + api: '/api', }, documentation: { index: '/documentation', @@ -159,11 +160,11 @@ const rawSitePathsEn = { }, nouveautés: '/news', accessibilité: '/accessibility', - - integration: { - ...rawSitePathsFr.integration, - index: '/integration', + développeur: { + ...rawSitePathsFr.développeur, + index: '/developer', library: '/library', + api: '/api', }, } as const diff --git a/site/vite.config.ts b/site/vite.config.ts index 3faaa9729..8faaec666 100644 --- a/site/vite.config.ts +++ b/site/vite.config.ts @@ -76,6 +76,9 @@ export default defineConfig(({ command }) => ({ '!**/node_modules/publicodes-react/**', ], }, + proxy: { + '/api': 'http://localhost:3004', + }, }, optimizeDeps: { entries: ['./source/entry-fr.tsx', './source/entry-en.tsx'],