diff --git a/example.env b/example.env index bfbdeedd4dfac3794ba289551f12a5bf0c2a0b2b..95ed0770f804269da76f8fe020457e8a611e36d4 100644 --- a/example.env +++ b/example.env @@ -50,6 +50,9 @@ OPENFISCA_PROJECT="openfisca-france" OPENFISCA_REPOSITORY_RAW_URL_TEMPLATE="https://raw.githubusercontent.com/${group}/${project}/${branch}/${path}" OPENFISCA_REPOSITORY_URL_TEMPLATE="https://github.com/${group}/${project}/blob/${branch}/${path}" +# URL of portal site (used when clicking on left logo in menu bar) +PORTAL_URL="https://leximpact.an.fr/" + # Set to true when application is behind a proxy PROXY=false diff --git a/postcss.config.cjs b/postcss.config.cjs index 3c84d52ceff90ba2f2740a8964c3242983d1b2f1..db2754b09159c228553a17c0abffed1722221453 100644 --- a/postcss.config.cjs +++ b/postcss.config.cjs @@ -5,19 +5,17 @@ const cssnano = require("cssnano") const mode = process.env.NODE_ENV const dev = mode === "development" -module.exports = { +const config = { plugins: [ - // Some plugins, like postcss-nested, need to run before Tailwind - - tailwindcss, - - // But others, like autoprefixer, need to run after - - autoprefixer, - + // Some plugins, like postcss-nested, need to run before Tailwind. + tailwindcss(), + // But others, like autoprefixer, need to run after. + autoprefixer(), !dev && cssnano({ preset: "default", }), ], } + +module.exports = config diff --git a/src/hooks.ts b/src/hooks.ts index b92fcaf32312c23de3402ac324a70650c00c51a8..b1eb8ac8115fceec38c80bae8c95f85e264d9ce3 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -61,6 +61,7 @@ export const getSession: GetSession<{}, Session> = async (request) => { urlTemplate: openfiscaRepository.urlTemplate, }, personEntityKey, + portalUrl: config.portalUrl, rootDecompositionName: config.rootDecompositionName, testCases, title: config.title, diff --git a/src/lib/auditors/config.ts b/src/lib/auditors/config.ts index 252194d7a2edb30aa73719bc8c03f4b936b2ec2c..990cea6ae8d5c59ce152bfb6ca178011acafa2c1 100644 --- a/src/lib/auditors/config.ts +++ b/src/lib/auditors/config.ts @@ -42,7 +42,7 @@ export function auditConfig( auditSetNullish(false), ) } - for (const key of ["apiBaseUrl", "baseUrl"]) { + for (const key of ["apiBaseUrl", "baseUrl", "portalUrl"]) { audit.attribute( data, key, diff --git a/src/lib/calculations.ts b/src/lib/calculations.ts index 6b883943cd00c3255029c7ff3b1fe5f00152565c..f41b7673c5c079493342d885a1d32fe931ff6650 100644 --- a/src/lib/calculations.ts +++ b/src/lib/calculations.ts @@ -41,9 +41,8 @@ export function newCalculationUrl({ pane4, } const queryString = stringifyQuery(query) - return `${dev ? `/dev/calculations` : "/simulation"}${ - queryString ? "?" + queryString : "" - }` + return `${dev ? `/dev/calculations` : "/"}${queryString ? "?" + queryString : "" + }` } export function newSimulationUrl({ @@ -56,5 +55,5 @@ export function newSimulationUrl({ query.action = action } const queryString = stringifyQuery(query) - return `/simulation${queryString ? "?" + queryString : ""}` + return `/${queryString ? "?" + queryString : ""}` } diff --git a/src/lib/components/NavBar.svelte b/src/lib/components/NavBar.svelte index 842701b867fd2bf055a47b209f045b40b08142ba..419ea4223582a0d4793c167d2d8a7d99113d0327 100644 --- a/src/lib/components/NavBar.svelte +++ b/src/lib/components/NavBar.svelte @@ -1,25 +1,33 @@ <script lang="ts"> import { page, session } from "$app/stores" - let open = false + // let open = false + let openAproposMenu = false + let openUserMenu = false + $: authenticationEnabled = $session.authenticationEnabled + $: pageUrlPath = $page.path.replace(/\/+$/, "") || "/" $: title = $session.title - function activeMenuItem(href: string) { - return pageUrlPath === href || pageUrlPath.startsWith(href + "/") - } + $: user = $session.user + + // function activeMenuItem(href: string) { + // return pageUrlPath === href || pageUrlPath.startsWith(href + "/") + // } </script> -<nav class="bg-le-jaune h-14 shadow-md max-w-9xl mx-auto px-2 sm:px-6 lg:px-8"> +<nav + class="fixed bg-le-jaune h-14 shadow-md max-w-9xl mx-auto px-2 sm:px-6 lg:px-8 w-full z-50" +> <!-- Création d'un div sur l'ensemble de la nav bar pour répartir les blocs--> <div class="hidden sm:flex justify-between"> <!-- Premier div pour le logo AN et le menu A propos--> <div class="flex w-64 items-center"> <!-- logo assemblee nationale --> - <a href="/"> + <a href={$session.portalUrl}> <img class="pr-2 pl-2 pb-4 pt-0 w-16 object-scale-down items-start " src="/logo-assemblee-nationale-blanc-blanc.png" @@ -30,18 +38,18 @@ <div class="flex space-x-5 justify-start ml-2 items-center"> <div class=""> <button - aria-expanded={openUserMenu} + aria-expanded={openAproposMenu} aria-haspopup="true" class="text-white uppercase text-sm rounded-sm focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" id="user-menu" - on:click={() => (openUserMenu = !openUserMenu)} + on:click={() => (openAproposMenu = !openAproposMenu)} type="button" > <span class="sr-only">Open user menu</span> À propos </button> </div> - {#if openUserMenu} + {#if openAproposMenu} <!-- Dropdown menu @@ -84,6 +92,24 @@ class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" role="menuitem">Mentions légales</a > + <a + href="/" + class="border-b block px-4 py-3 text-sm bg-gray-200 text-gray-900 hover:bg-gray-400" + role="menuitem" + > + <!-- Material icon: Volunteer Activism--> + <svg + class="fill-current text-gray-700 inline rounded mr-2" + xmlns="http://www.w3.org/2000/svg" + height="18px" + viewBox="0 0 22 22" + width="18px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" + /></svg + >Retour en page d'accueil</a + > </div> {/if} </div> @@ -91,18 +117,150 @@ <!-- Deuxième div pour le logo Contrib. & prestas sociales--> <div class="hidden sm:flex"> - <div - class="space-y-1 flex items-center h-14 gap-2 rounded text-white p-1" - > - <div class="row-span-3 text-4xl font-light uppercase">LexImpact</div> - </div> + <a href="/"> + <div + class="space-y-1 flex items-center h-14 gap-2 rounded text-white p-1" + > + <div class="row-span-3 text-4xl font-light uppercase">LexImpact</div> + <div class="space-y-0"> + <div class="text-xs font-bold uppercase">Cotisations</div> + <div class="text-xs font-bold uppercase"> + & prestations sociales + </div> + </div> + </div> + </a> </div> <!-- Troisième div pour les commandes avancées--> - <!-- À propos dropdown --> - <div - class="flex w-64 justify-end md:justify-between space-x-1 items-center" - /> + <!-- Contribuer et connexion/déconnexion --> + <div class="flex w-64 justify-end md:justify-between items-center"> + <div class="flex"> + <a + href="/contribuer" + class="hidden sm:inline-flex text-white uppercase text-sm rounded-sm focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" + type="button" + > + <div class="flex items-center"> + <!-- Material icon: Volunteer Activism--> + <svg + class="fill-current text-white inline rounded m-3 md:m-0" + xmlns="http://www.w3.org/2000/svg" + enable-background="new 0 0 24 24" + height="18px" + viewBox="0 0 22 22" + width="18px" + ><g><rect fill="none" height="24" width="2" /></g><g + ><g + ><rect height="11" width="4" x="1" y="11" /><path + d="M16,3.25C16.65,2.49,17.66,2,18.7,2C20.55,2,22,3.45,22,5.3c0,2.27-2.91,4.9-6,7.7c-3.09-2.81-6-5.44-6-7.7 C10,3.45,11.45,2,13.3,2C14.34,2,15.35,2.49,16,3.25z" + /><path + d="M20,17h-7l-2.09-0.73l0.33-0.94L13,16h2.82c0.65,0,1.18-0.53,1.18-1.18v0c0-0.49-0.31-0.93-0.77-1.11L8.97,11H7v9.02 L14,22l8.01-3v0C22,17.9,21.11,17,20,17z" + /></g + ></g + ></svg + > + <p class="hidden md:inline-block pl-1">Contribuer</p> + </div> + </a> + </div> + + {#if authenticationEnabled} + {#if user === undefined} + <a + href="/authentication/signin/leximpact?redirect={$page.path}" + class="text-white uppercase text-sm rounded-sm focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" + type="button" + > + <div class="flex items-center"> + <!-- Material icon: VPN key--> + <svg + class="fill-current text-white inline rounded m-3 md:m-0" + xmlns="http://www.w3.org/2000/svg" + height="18px" + viewBox="0 0 22 22" + width="18px" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M12.65 10C11.83 7.67 9.61 6 7 6c-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4H17v4h4v-4h2v-4H12.65zM7 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z" + /></svg + > + <p class="hidden md:inline-block pl-1">Se connecter</p> + </div> + </a> + {:else} + <!-- User profile + se déconnecter --> + <div class="flex"> + <button + aria-expanded={openUserMenu} + aria-haspopup="true" + class="text-white capitalize text-sm rounded focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" + id="user-menu" + on:click={() => (openUserMenu = !openUserMenu)} + type="button" + > + <!-- Material icon: Account circle--> + + <svg + class="fill-current text-white inline rounded m-3 md:m-0" + xmlns="http://www.w3.org/2000/svg" + height="18px" + viewBox="0 0 24 24" + width="18px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z" + /></svg + > + + <span class="sr-only">Open user menu</span> + {user.preferred_username} + </button> + </div> + {#if openUserMenu} + <!-- + Dropdown menu + + Entering: "transition ease-out duration-100" + From: "transform opacity-0 scale-95" + To: "transform opacity-100 scale-100" + Leaving: "transition ease-in duration-75" + From: "transform opacity-100 scale-100" + To: "transform opacity-0 scale-95" + --> + <div + class="absolute mt-14 mr-8 right-0 top-0 w- rounded shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none z-50" + role="menu" + aria-orientation="vertical" + aria-labelledby="user-menu" + > + <a + href="/authentication/signout" + class="uppercase rounded-sm focus:outline-none hover:bg-opacity-20 + border-b block px-4 py-3 text-sm text-black hover:bg-gray-300" + type="button" + > + <div class="flex items-center"> + <!-- Material icon: Power Settings New--> + + <svg + class="fill-current text-black inline rounded m-3 md:m-0" + xmlns="http://www.w3.org/2000/svg" + height="18px" + viewBox="0 0 24 24" + width="18px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z" + /></svg + > + <p class="hidden md:inline-block pl-1">Se déconnecter</p> + </div> + </a> + </div> + {/if} + {/if} + {/if} + </div> </div> <!--Menu écran téléphone--> @@ -121,19 +279,27 @@ </div> <!-- Deuxième div pour le logo Contrib. & prestas sociales--> - - <div class="rounded text-2xl text-white font-light uppercase"> - LexImpact + <div> + <div + class="block object-center text-center rounded text-2xl text-white font-light uppercase h-7" + > + LexImpact + </div> + <div + class="block rounded object-center text-center text-xs text-white font-bold uppercase" + > + Cotis. & presta. sociales + </div> </div> <!-- Troisième div pour le bouton menu--> <div class="w-16 "> <button - aria-expanded={openUserMenu} + aria-expanded={openAproposMenu} aria-haspopup="true" class="text-white uppercase text-sm rounded-sm focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" id="user-menu" - on:click={() => (openUserMenu = !openUserMenu)} + on:click={() => (openAproposMenu = !openAproposMenu)} type="button" > <span class="sr-only">Open user menu</span> @@ -150,7 +316,7 @@ > </button> </div> - {#if openUserMenu} + {#if openAproposMenu} <!-- Dropdown menu @@ -167,6 +333,48 @@ aria-orientation="vertical" aria-labelledby="user-menu" > + {#if authenticationEnabled} + {#if user === undefined} + <a + href="/authentication/signin/leximpact?redirect={$page.path}" + class="border-b block px-4 py-3 text-sm text-gray-700 font-bold hover:bg-gray-100" + role="menuitem" + > + <!-- Material icon: VPN key--> + <svg + class="fill-current text-gray-700 inline rounded mr-2" + xmlns="http://www.w3.org/2000/svg" + height="18px" + viewBox="0 0 22 22" + width="18px" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M12.65 10C11.83 7.67 9.61 6 7 6c-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4H17v4h4v-4h2v-4H12.65zM7 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z" + /></svg + >Se connecter</a + > + {:else} + <a + href="/authentication/signout" + class="border-b-4 block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" + role="menuitem" + > + <!-- Material icon: Power Settings New--> + + <svg + class="fill-current text-gray-700 inline rounded mr-2" + xmlns="http://www.w3.org/2000/svg" + height="18px" + viewBox="0 0 24 24" + width="18px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z" + /></svg + >Se déconnecter ({user.preferred_username})</a + > + {/if} + {/if} + <a href="/a-propos" class="border-b block px-4 py-3 font-bold text-sm text-gray-700 hover:bg-gray-100" @@ -174,25 +382,68 @@ > <a href="/comment-fonctionnent-les-simulateurs" - class="border-b-4 block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" + class=" border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" role="menuitem">Comment fonctionnent les simulateurs LexImpact ?</a > + + <a + href="/contribuer" + class="border-b-4 block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" + role="menuitem" + > + Contribuer</a + > + <a href="/statistiques" - class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" + class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" role="menuitem">Statistiques d'usage</a > <a href="/cgu" - class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" + class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" role="menuitem">Conditions d'utilisation</a > <a href="/mentions-legales" - class="block px-4 border-b py-3 text-sm text-gray-700 hover:bg-gray-100" + class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" role="menuitem">Mentions légales</a > + <a + href="/" + class="border-b block px-4 py-3 text-sm bg-gray-200 text-gray-900 hover:bg-gray-400" + role="menuitem" + > + <!-- Material icon: Volunteer Activism--> + <svg + class="fill-current text-gray-700 inline rounded mr-2" + xmlns="http://www.w3.org/2000/svg" + height="18px" + viewBox="0 0 22 22" + width="18px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" + /></svg + >Retour en page d'accueil</a + > </div> {/if} </div> </nav> +<div + class="fixed mt-14 z-40 flex fond-bandeau-en-construction h-8 w-full items-center justify-center shadow-lg border-b border-t border-black" +> + <div> + <p class="text-center text-black tracking-wider font-base uppercase"> + 🚧 Simulateur en construction + </p> + </div> +</div> + +<style> + .fond-bandeau-en-construction { + background-color: #ffffff; + background-image: url("data:image/svg+xml,%3Csvg width='30' height='30' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ece322' fill-opacity='0.4' fill-rule='evenodd'%3E%3Cpath d='M0 40L40 0H20L0 20M40 40V20L20 40'/%3E%3C/g%3E%3C/svg%3E"); + } +</style> diff --git a/src/lib/components/NavBarAffairesSociales.svelte b/src/lib/components/NavBarAffairesSociales.svelte deleted file mode 100644 index a75021a90723d914d217ac692d8cf246f0c68bef..0000000000000000000000000000000000000000 --- a/src/lib/components/NavBarAffairesSociales.svelte +++ /dev/null @@ -1,449 +0,0 @@ -<script lang="ts"> - import { page, session } from "$app/stores" - - // let open = false - let openAproposMenu = false - - let openUserMenu = false - - $: authenticationEnabled = $session.authenticationEnabled - - $: pageUrlPath = $page.path.replace(/\/+$/, "") || "/" - - $: title = $session.title - - $: user = $session.user - - // function activeMenuItem(href: string) { - // return pageUrlPath === href || pageUrlPath.startsWith(href + "/") - // } -</script> - -<nav - class="fixed bg-le-jaune h-14 shadow-md max-w-9xl mx-auto px-2 sm:px-6 lg:px-8 w-full z-50" -> - <!-- Création d'un div sur l'ensemble de la nav bar pour répartir les blocs--> - <div class="hidden sm:flex justify-between"> - <!-- Premier div pour le logo AN et le menu A propos--> - <div class="flex w-64 items-center"> - <!-- logo assemblee nationale --> - <a href="/"> - <img - class="pr-2 pl-2 pb-4 pt-0 w-16 object-scale-down items-start " - src="/logo-assemblee-nationale-blanc-blanc.png" - alt="Logo de l'Assemblée nationale" - /> - </a> - <!-- À propos dropdown --> - <div class="flex space-x-5 justify-start ml-2 items-center"> - <div class=""> - <button - aria-expanded={openAproposMenu} - aria-haspopup="true" - class="text-white uppercase text-sm rounded-sm focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" - id="user-menu" - on:click={() => (openAproposMenu = !openAproposMenu)} - type="button" - > - <span class="sr-only">Open user menu</span> - À propos - </button> - </div> - {#if openAproposMenu} - <!-- - Dropdown menu - - Entering: "transition ease-out duration-100" - From: "transform opacity-0 scale-95" - To: "transform opacity-100 scale-100" - Leaving: "transition ease-in duration-75" - From: "transform opacity-100 scale-100" - To: "transform opacity-0 scale-95" - --> - <div - class="absolute mt-14 mr-6 left-16 top-0 w-64 rounded shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none z-50" - role="menu" - aria-orientation="vertical" - aria-labelledby="user-menu" - > - <a - href="/a-propos" - class="border-b block px-4 py-3 font-bold text-sm text-gray-700 hover:bg-gray-100" - role="menuitem">À propos de LexImpact</a - > - <a - href="/comment-fonctionnent-les-simulateurs" - class="border-b-4 block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem" - >Comment fonctionnent les simulateurs LexImpact ?</a - > - <a - href="/statistiques" - class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem">Statistiques d'usage</a - > - <a - href="/cgu" - class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem">Conditions d'utilisation</a - > - <a - href="/mentions-legales" - class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem">Mentions légales</a - > - <a - href="/" - class="border-b block px-4 py-3 text-sm bg-gray-200 text-gray-900 hover:bg-gray-400" - role="menuitem" - > - <!-- Material icon: Volunteer Activism--> - <svg - class="fill-current text-gray-700 inline rounded mr-2" - xmlns="http://www.w3.org/2000/svg" - height="18px" - viewBox="0 0 22 22" - width="18px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" - /></svg - >Retour en page d'accueil</a - > - </div> - {/if} - </div> - </div> - - <!-- Deuxième div pour le logo Contrib. & prestas sociales--> - <div class="hidden sm:flex"> - <a href="/simulation"> - <div - class="space-y-1 flex items-center h-14 gap-2 rounded text-white p-1" - > - <div class="row-span-3 text-4xl font-light uppercase">LexImpact</div> - <div class="space-y-0"> - <div class="text-xs font-bold uppercase">Cotisations</div> - <div class="text-xs font-bold uppercase"> - & prestations sociales - </div> - </div> - </div> - </a> - </div> - - <!-- Troisième div pour les commandes avancées--> - <!-- Contribuer et connexion/déconnexion --> - <div class="flex w-64 justify-end md:justify-between items-center"> - <div class="flex"> - <a - href="/contribuer" - class="hidden sm:inline-flex text-white uppercase text-sm rounded-sm focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" - type="button" - > - <div class="flex items-center"> - <!-- Material icon: Volunteer Activism--> - <svg - class="fill-current text-white inline rounded m-3 md:m-0" - xmlns="http://www.w3.org/2000/svg" - enable-background="new 0 0 24 24" - height="18px" - viewBox="0 0 22 22" - width="18px" - ><g><rect fill="none" height="24" width="2" /></g><g - ><g - ><rect height="11" width="4" x="1" y="11" /><path - d="M16,3.25C16.65,2.49,17.66,2,18.7,2C20.55,2,22,3.45,22,5.3c0,2.27-2.91,4.9-6,7.7c-3.09-2.81-6-5.44-6-7.7 C10,3.45,11.45,2,13.3,2C14.34,2,15.35,2.49,16,3.25z" - /><path - d="M20,17h-7l-2.09-0.73l0.33-0.94L13,16h2.82c0.65,0,1.18-0.53,1.18-1.18v0c0-0.49-0.31-0.93-0.77-1.11L8.97,11H7v9.02 L14,22l8.01-3v0C22,17.9,21.11,17,20,17z" - /></g - ></g - ></svg - > - <p class="hidden md:inline-block pl-1">Contribuer</p> - </div> - </a> - </div> - - {#if authenticationEnabled} - {#if user === undefined} - <a - href="/authentication/signin/leximpact?redirect={$page.path}" - class="text-white uppercase text-sm rounded-sm focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" - type="button" - > - <div class="flex items-center"> - <!-- Material icon: VPN key--> - <svg - class="fill-current text-white inline rounded m-3 md:m-0" - xmlns="http://www.w3.org/2000/svg" - height="18px" - viewBox="0 0 22 22" - width="18px" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M12.65 10C11.83 7.67 9.61 6 7 6c-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4H17v4h4v-4h2v-4H12.65zM7 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z" - /></svg - > - <p class="hidden md:inline-block pl-1">Se connecter</p> - </div> - </a> - {:else} - <!-- User profile + se déconnecter --> - <div class="flex"> - <button - aria-expanded={openUserMenu} - aria-haspopup="true" - class="text-white capitalize text-sm rounded focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" - id="user-menu" - on:click={() => (openUserMenu = !openUserMenu)} - type="button" - > - <!-- Material icon: Account circle--> - - <svg - class="fill-current text-white inline rounded m-3 md:m-0" - xmlns="http://www.w3.org/2000/svg" - height="18px" - viewBox="0 0 24 24" - width="18px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z" - /></svg - > - - <span class="sr-only">Open user menu</span> - {user.preferred_username} - </button> - </div> - {#if openUserMenu} - <!-- - Dropdown menu - - Entering: "transition ease-out duration-100" - From: "transform opacity-0 scale-95" - To: "transform opacity-100 scale-100" - Leaving: "transition ease-in duration-75" - From: "transform opacity-100 scale-100" - To: "transform opacity-0 scale-95" - --> - <div - class="absolute mt-14 mr-8 right-0 top-0 w- rounded shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none z-50" - role="menu" - aria-orientation="vertical" - aria-labelledby="user-menu" - > - <a - href="/authentication/signout" - class="uppercase rounded-sm focus:outline-none hover:bg-opacity-20 - border-b block px-4 py-3 text-sm text-black hover:bg-gray-300" - type="button" - > - <div class="flex items-center"> - <!-- Material icon: Power Settings New--> - - <svg - class="fill-current text-black inline rounded m-3 md:m-0" - xmlns="http://www.w3.org/2000/svg" - height="18px" - viewBox="0 0 24 24" - width="18px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z" - /></svg - > - <p class="hidden md:inline-block pl-1">Se déconnecter</p> - </div> - </a> - </div> - {/if} - {/if} - {/if} - </div> - </div> - - <!--Menu écran téléphone--> - - <div class="sm:hidden flex justify-between items-center"> - <!-- Premier div pour le logo AN et le menu A propos--> - <div class="w-16"> - <!-- logo assemblee nationale --> - <a href="/"> - <img - class="pr-2 pl-2 pb-4 pt-0 w-16 object-scale-down items-start " - src="/logo-assemblee-nationale-blanc-blanc.png" - alt="Logo de l'Assemblée nationale" - /> - </a> - </div> - - <!-- Deuxième div pour le logo Contrib. & prestas sociales--> - <div> - <div - class="block object-center text-center rounded text-2xl text-white font-light uppercase h-7" - > - LexImpact - </div> - <div - class="block rounded object-center text-center text-xs text-white font-bold uppercase" - > - Cotis. & presta. sociales - </div> - </div> - - <!-- Troisième div pour le bouton menu--> - <div class="w-16 "> - <button - aria-expanded={openAproposMenu} - aria-haspopup="true" - class="text-white uppercase text-sm rounded-sm focus:outline-none hover:bg-gray-400 hover:bg-opacity-20 hover:text-white p-1" - id="user-menu" - on:click={() => (openAproposMenu = !openAproposMenu)} - type="button" - > - <span class="sr-only">Open user menu</span> - <!-- Material icon : menu --> - <svg - class="sm:hidden fill-current text-white" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" - /></svg - > - </button> - </div> - {#if openAproposMenu} - <!-- - Dropdown menu - - Entering: "transition ease-out duration-100" - From: "transform opacity-0 scale-95" - To: "transform opacity-100 scale-100" - Leaving: "transition ease-in duration-75" - From: "transform opacity-100 scale-100" - To: "transform opacity-0 scale-95" - --> - <div - class="absolute mt-14 right-0 top-0 w-full rounded shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none z-50" - role="menu" - aria-orientation="vertical" - aria-labelledby="user-menu" - > - {#if authenticationEnabled} - {#if user === undefined} - <a - href="/authentication/signin/leximpact?redirect={$page.path}" - class="border-b block px-4 py-3 text-sm text-gray-700 font-bold hover:bg-gray-100" - role="menuitem" - > - <!-- Material icon: VPN key--> - <svg - class="fill-current text-gray-700 inline rounded mr-2" - xmlns="http://www.w3.org/2000/svg" - height="18px" - viewBox="0 0 22 22" - width="18px" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M12.65 10C11.83 7.67 9.61 6 7 6c-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4H17v4h4v-4h2v-4H12.65zM7 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z" - /></svg - >Se connecter</a - > - {:else} - <a - href="/authentication/signout" - class="border-b-4 block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem" - > - <!-- Material icon: Power Settings New--> - - <svg - class="fill-current text-gray-700 inline rounded mr-2" - xmlns="http://www.w3.org/2000/svg" - height="18px" - viewBox="0 0 24 24" - width="18px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z" - /></svg - >Se déconnecter ({user.preferred_username})</a - > - {/if} - {/if} - - <a - href="/a-propos" - class="border-b block px-4 py-3 font-bold text-sm text-gray-700 hover:bg-gray-100" - role="menuitem">À propos de LexImpact</a - > - <a - href="/comment-fonctionnent-les-simulateurs" - class=" border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem">Comment fonctionnent les simulateurs LexImpact ?</a - > - - <a - href="/contribuer" - class="border-b-4 block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem" - > - Contribuer</a - > - - <a - href="/statistiques" - class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem">Statistiques d'usage</a - > - <a - href="/cgu" - class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem">Conditions d'utilisation</a - > - <a - href="/mentions-legales" - class="border-b block px-4 py-3 text-sm text-gray-700 hover:bg-gray-100" - role="menuitem">Mentions légales</a - > - <a - href="/" - class="border-b block px-4 py-3 text-sm bg-gray-200 text-gray-900 hover:bg-gray-400" - role="menuitem" - > - <!-- Material icon: Volunteer Activism--> - <svg - class="fill-current text-gray-700 inline rounded mr-2" - xmlns="http://www.w3.org/2000/svg" - height="18px" - viewBox="0 0 22 22" - width="18px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" - /></svg - >Retour en page d'accueil</a - > - </div> - {/if} - </div> -</nav> -<div - class="fixed mt-14 z-40 flex fond-bandeau-en-construction h-8 w-full items-center justify-center shadow-lg border-b border-t border-black" -> - <div> - <p class="text-center text-black tracking-wider font-base uppercase"> - 🚧 Simulateur en construction - </p> - </div> -</div> - -<style> - .fond-bandeau-en-construction { - background-color: #ffffff; - background-image: url("data:image/svg+xml,%3Csvg width='30' height='30' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ece322' fill-opacity='0.4' fill-rule='evenodd'%3E%3Cpath d='M0 40L40 0H20L0 20M40 40V20L20 40'/%3E%3C/g%3E%3C/svg%3E"); - } -</style> diff --git a/src/lib/server/config.ts b/src/lib/server/config.ts index 685a17c9938538a832925f74d6177c261d02cfa1..31328536fddcb1c3d0b8000a9705286655aa84b5 100644 --- a/src/lib/server/config.ts +++ b/src/lib/server/config.ts @@ -32,6 +32,7 @@ export interface Config { rawUrlTemplate: string urlTemplate: string } + portalUrl: string proxy: boolean rootDecompositionName: string title: string @@ -68,6 +69,7 @@ const [validConfig, error] = validateConfig({ rawUrlTemplate: process.env["OPENFISCA_REPOSITORY_RAW_URL_TEMPLATE"], urlTemplate: process.env["OPENFISCA_REPOSITORY_URL_TEMPLATE"], }, + portalUrl: process.env["PORTAL_URL"], proxy: process.env["PROXY"], rootDecompositionName: process.env["DECOMPOSITION_ROOT"], title: process.env["TITLE"], diff --git a/src/lib/sessions.ts b/src/lib/sessions.ts index c02b11edea565c7f463affae7ac8816e096a759d..75fee124855765af76aed6a4c94fd8661f4770e9 100644 --- a/src/lib/sessions.ts +++ b/src/lib/sessions.ts @@ -24,6 +24,7 @@ export interface Session { metadata: Metadata openfiscaRepository: SessionOpenFiscaRepository personEntityKey: string + portalUrl: string rootDecompositionName: string testCases: Situation[] title: string diff --git a/src/routes/__layout.svelte b/src/routes/__layout.svelte index 78bc7938a802b21d059f8d815d147c88a3bb2fa9..bab05f426ea2d81e3f89af52da0da8912f90c75e 100644 --- a/src/routes/__layout.svelte +++ b/src/routes/__layout.svelte @@ -10,7 +10,6 @@ import { browser } from "$app/env" import { page, session } from "$app/stores" import NavBar from "$lib/components/NavBar.svelte" - import NavBarAffairesSociales from "$lib/components/NavBarAffairesSociales.svelte" import { decompositionByNameFromCore, walkDecompositionsCoreName, @@ -379,10 +378,6 @@ } </script> -{#if $page.path === "/"} - <NavBar /> -{:else} - <NavBarAffairesSociales /> -{/if} +<NavBar /> <slot /> diff --git a/src/routes/a-propos.svelte b/src/routes/a-propos.svelte deleted file mode 100644 index 1dc9d3eb2d3f38bbbcc4c4884055a472c09cd62e..0000000000000000000000000000000000000000 --- a/src/routes/a-propos.svelte +++ /dev/null @@ -1,333 +0,0 @@ -<script lang="ts"> - import { session } from "$app/stores" - import TextUnderconstructionMessage from "$lib/components/transverse_pages/TextUnderconstructionMessage.svelte" -</script> - -<svelte:head> - <title>À propos | {$session.title}</title> -</svelte:head> - -<main class="flex items-center justify-center fond"> - <div class="bg-white max-w-screen-md p-10"> - <div class=""> - <h1 class="font-serif font-bold pt-7 pb-3 text-3xl text-gray-700"> - À propos de LexImpact - </h1> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - Qui sommes-nous ? - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - LexImpact est un service de l'Assemblée nationale depuis 2020, rattaché - à la Direction de l'Évaluation et du Contrôle, spécialisé dans le - chiffrage et la gestion de données. <br /><br />En suivant une méthode - itérative reposant sur l’analyse des besoins des utilisateurs, notamment - les députés, leurs collaborateurs, et les services de l'Assemblée - nationale, LexImpact a pour objectif de mettre à leur disposition - différents outils. Ces outils étant pour la majorité, ouverts (<a - class="underline hover:text-le-bleu" - href="/cgu">consulter nos CGU</a - >). Ils sont donc également à disposition de la société civile. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - Une équipe pluridisciplinaire, <br /> centrée données, analyse et utilisateurs - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Depuis janvier 2021, l’équipe compte 3 ETP en ce qui concerne la partie - développement de simulateurs, et 1 ETP supplémentaire pour le - développement d’un nouveau produit, un tableau de bord de données par - circonscription. <br /> <br />L’équipe agrège plusieurs types de - compétences (science des données, développement et design) permettant de - récupérer des données, de les analyser, et de les rendre accessibles par - des interfaces adaptées. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - L'origine du projet - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - LexImpact est un service de l’Assemblée nationale depuis janvier 2020, - ayant vu le jour en 2019 à la <a - class="underline hover:text-le-bleu" - href="https://www.numerique.gouv.fr/" - > - Direction Interministérielle du Numérique</a - >, sous la forme d’une - <a class="underline hover:text-le-bleu" href="https://beta.gouv.fr/" - >start-up d’État</a - > - et dans le cadre du programme - <a - class="underline hover:text-le-bleu" - href="https://entrepreneur-interet-general.etalab.gouv.fr/defis/2019/leximpact.html" - >Entrepreneur d’Intérêt Général</a - >, financé par les programmes d'investissement d'avenir. Le projet - LexImpact a été créé : - </p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2 text-base text-justify"> - car le moteur de calcul <a - class="underline hover:text-le-bleu" - href="https://fr.openfisca.org/">OpenFisca</a - > (ensemble de la législation traduite en code informatique ouvert) ayant - servi à des évaluations économiques du PLF cherchait à être utile aux acteurs - de la construction de la loi ; - </li> - <li class="leading-normal pb-2 text-base text-justify"> - suite à l’observation d’un besoin du côté du Parlement. Le chiffrage - <span class="italic font-normal">ex ante</span> y est limité notamment - du fait d’un calendrier législatif très court ; - </li> - - <li class="leading-normal pb-2 text-base text-justify"> - enfin car l’Assemblée nationale s’est prêtée à une première - expérimentation en 2019, ce qui a permis aux équipes de rencontrer les - utilisateurs et de co-construire le premier simulateur concernant - l’impôt sur le revenu. - </li> - </ul> - <!--Partie les services proposés--> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - Les services proposés - </h2> - <p class="leading-normal pb-8 text-base text-justify"> - LexImpact met à disposition différents services : - </p> - <!-- Boutons vers les services--> - <div class="inline-block w-full"> - <a - href="https://leximpact.an.fr/ir" - class="flex items-center border-black border bg-white mb-4 p-1 pl-5 text-base rounded-lg text-black shadow-md hover:bg-le-jaune hover:bg-opacity-20" - > - <img - class="mr-2" - width="70" - src="/picto-impot-sur-le-revenu.png" - alt="Pictogramme représentant une feuille d'impôt" - /> - - un simulateur de l'impôt sur le revenu - </a> - </div> - <div class="inline-block w-full"> - <a - href="https://leximpact.an.fr/dotations" - class="flex items-center border-black border bg-white mb-4 p-1 pl-5 text-base rounded-lg text-black shadow-md hover:bg-le-jaune hover:bg-opacity-20" - > - <img - class="mr-2" - width="70" - src="/picto-dotations-communes.png" - alt="Pictogramme représentant un panneau de circulation indiquant commune" - /> - - un simulateur sur les dotations aux communes - </a> - </div> - <div class="inline-block w-full"> - <a - href="/simulation" - class="flex items-center border-black border bg-white mb-4 p-1 pl-5 text-base rounded-lg text-black shadow-md hover:bg-le-jaune hover:bg-opacity-20" - > - <img - class="mr-2" - width="70" - src="/picto-affaires-sociales.png" - alt="Pictogramme représentant une feuille de paie" - /> - <div class="block sm:flex"> - <p class=""> - un simulateur sur les cotisations & prestations sociales - </p> - <p class=" italic">(en développement)</p> - </div> - </a> - </div> - <div class="inline-block w-full"> - <a - href="https://umap.openstreetmap.fr/fr/map/circodata-test-interface_623082" - class="flex items-center border-black border bg-white mb-4 p-1 pl-5 text-base rounded-lg text-black shadow-md hover:bg-le-jaune hover:bg-opacity-20" - > - <img - class="mr-2" - width="70" - src="/picto-circo-data.png" - alt="Pictogramme représentant une feuille de paie" - /> - <div class="block sm:flex"> - <p class=""> - un tableau de bord des données par circonscription - </p> - <p class=" italic">(en développement)</p> - </div> - </a> - </div> - <div class="inline-block w-full "> - <a - href="https://limesurvey.leximpact.dev/index.php/254182?lang=fr - " - class="flex items-center border-black border bg-white mb-4 p-1 pl-5 text-base rounded-lg text-black shadow-md hover:bg-le-jaune hover:bg-opacity-20" - > - <div class="block sm:flex"> - <p class=""> - un formulaire permettant de faire une demande de chiffrage - spécifique* - </p> - </div> - </a> - </div> - <p class="text-sm italic"> - * Ce service s'adresse uniquement aux personnes rattachées à l'Assemblée - nationale (député, collaborateur, administrateur). - </p> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - Un projet open source - </h2> - <p class="leading-normal pb-8 text-base text-justify"> - Le code de LexImpact est libre, sous licence AGPL-3.0, et peut donc être - vérifié et amélioré par toutes et tous. Vous pouvez retrouver l'ensemble - de nos dépôts sur <a - href="https://git.leximpact.dev/" - class="underline hover:text-le-bleu" - > - https://git.leximpact.dev/</a - >, ils sont également regroupés par produit ci-dessous : - </p> - <div class="grid md:grid-cols-2 gap-8 justify-between pt-4 pb-10"> - <div> - <img - class=" w-16" - src="/picto-impot-sur-le-revenu.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold"> - Dépôts du simulateur impôt sur le revenu : - </p> - - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2"> - Interface utilisateur :<br /> - <a - href=" https://git.leximpact.dev/leximpact/leximpact-client" - class="text-gray-500 font-extralight underline hover:text-le-bleu" - > - https://git.leximpact.dev/leximpact/leximpact-client</a - > ; - </li> - <li class="leading-normal pb-2"> - Arrière-plan :<br /> - <a - href="https://git.leximpact.dev/leximpact/leximpact-prepare-data" - class="text-gray-500 font-extralight underline hover:text-le-bleu" - > - https://git.leximpact.dev/leximpact/leximpact-prepare-data</a - > ; - </li> - <li class="leading-normal pb-2"> - Traitement des données :<br /> - <a - href=" https://git.leximpact.dev/leximpact/leximpact-server" - class="text-gray-500 font-extralight underline hover:text-le-bleu" - > - https://git.leximpact.dev/leximpact/leximpact-server</a - >. - </li> - </ul> - </div> - <div> - <img - class=" w-16" - src="/picto-dotations-communes.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold"> - Dépôts du simulateur des dotations aux communes : - </p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2"> - Interface utilisateur :<br /> - <a - href=" https://git.leximpact.dev/leximpact/leximpact-client" - class="text-gray-500 font-extralight underline hover:text-le-bleu" - > - https://git.leximpact.dev/leximpact/leximpact-client</a - > ; - </li> - <li class="leading-normal pb-2"> - Arrière-plan :<br /> - <a - href="https://git.leximpact.dev/leximpact/leximpact-prepare-data" - class="text-gray-500 font-extralight underline hover:text-le-bleu" - > - https://git.leximpact.dev/leximpact/openfisca-france-dotations-locales</a - > - ; - <p class="font-extralight"> - Traitement des données (Package Python appelé par le - leximpact-serveur) : - </p> - <a - href="https://git.leximpact.dev/leximpact/openfisca-france-dotations-locales" - class="text-gray-500 font-extralight underline hover:text-le-bleu" - > - https://git.leximpact.dev/leximpact/openfisca-france-dotations-locales</a - > ; - </li> - </ul> - </div> - <div> - <img - class=" w-16" - src="/picto-affaires-sociales.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold"> - Dépôts du simulateur Cotisations & prestations sociales : - </p> - <div class="pt-3"> - <TextUnderconstructionMessage /> - </div> - </div> - <div> - <img - class=" w-16" - src="/picto-circo-data.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold">Dépôts du produit "Circo Data" :</p> - <div class="pt-3"> - <TextUnderconstructionMessage /> - </div> - </div> - </div> - <div class="mt-10 flex justify-end"> - <a - href="/comment-fonctionnent-les-simulateurs" - class="inline-flex items-center bg-gray-200 mb-5 p-1 pr-2 text-xs rounded - text-black shadow-md hover:bg-gray-400" - > - <!-- material icons - Arrow forward --> - <svg - class="flex mr-2 items-center" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z" - /></svg - > - Comment fonctionnent les simulateurs LexImpact ? - </a> - </div> - </div> - </div> -</main> - -<style> - .fond { - background-color: #ffffff; - /* Polka dots - Heropatterns.com échelle réduite */ - background-image: url("data:image/svg+xml,%3Csvg width='8' height='8' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ded500' fill-opacity='0.4' fill-rule='evenodd'%3E%3Ccircle cx='3' cy='3' r='3'/%3E%3Ccircle cx='13' cy='13' r='3'/%3E%3C/g%3E%3C/svg%3E"); - } -</style> diff --git a/src/routes/cgu-simulateur-acces-libre.svelte b/src/routes/cgu-simulateur-acces-libre.svelte deleted file mode 100644 index d88205450ff2ea395c7302bad7c5d286ab055a36..0000000000000000000000000000000000000000 --- a/src/routes/cgu-simulateur-acces-libre.svelte +++ /dev/null @@ -1,202 +0,0 @@ -<script lang="ts"> - import { session } from "$app/stores" -</script> - -<svelte:head> - <title - >Conditions d'utilisation de la partie en accès libre des simulateurs| {$session.title}</title - > -</svelte:head> - -<main class="flex items-center justify-center fond"> - <div class="bg-white max-w-screen-md p-10"> - <div class=""> - <h1 class="font-serif font-bold pt-7 pb-3 text-3xl text-gray-700"> - Conditions d'utilisation de la partie <br />en accès libre des - simulateurs - </h1> - <a - href="/cgu" - class="inline-flex items-center bg-gray-200 mb-5 p-1 pr-2 text-xs rounded -text-black shadow-md hover:bg-gray-400" - > - <!-- material icons - Arrow Back --> - <svg - class="flex mr-2 items-center" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" - /></svg - > - Conditions d'utilisations générales - </a> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.1. Vocabulaire - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - « Nous » se réfère à l'éditeur des simulateurs LexImpact en accès libre.<br - /> « Vous » se réfère à un usager ou une usagère des simulateurs en accès - libre. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.2. Conditions d'accès au service - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - La partie en accès libre des simulateurs est disponible à l'adresse - <a href="https://leximpact.an.fr/"> leximpact.an.fr </a> - . Son utilisation est gratuite et facultative. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Si vous effectuez une simulation, vous acceptez ces conditions - d'utilisation, comme indiqué dans l'Article L. 112-9 du Code des - relations entre le public et l'administration. - <br /> - <br />L'utilisation du service requiert une connexion internet et un - navigateur récent, les simulateurs LexImpact ne fonctionnent pas sur - Internet Explorer. Vous pouvez installer en autonomie Chrome ou Firefox, - sans droits d'administration sur votre poste. - <br /> - <br />Nous nous réservons le droit de bloquer, sans information - préalable ni compensation financière, les usages mettant en péril - l'utilisation du logiciel par d'autres usagers. Cela nous permet - d'anticiper d'éventuelles attaques par déni de service. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.3. Vos données - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Lors de l'utilisation du service, la partie en accès libre du site - internet LexImpact ne vous demande ni ne stocke d'information nominative - telle que noms, prénoms ou adresses. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Nous nous engageons à ne jamais exploiter les informations que vous nous - transmettrez dans un but commercial ou publicitaire. De manière - générale, LexImpact n'accepte aucune forme de publicité. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Dans le but d'évaluer la performance du service et son utilité, nous - collectons également des données anonymes d'audience, indépendamment des - simulations effectuées. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.4. Cookies pour sauvegarder vos cas types - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Nous utilisons des cookies persistants afin d'améliorer l'expérience - utilisateur. Ils permettent notamment la sauvegarde de vos cas types. - Ces cookies sont conservés sur votre ordinateur même après fermeture de - votre navigateur et réutilisé lors des prochaines visites sur nos sites. - </p> - <p class="leading-normal pb-3 text-base text-justify font-bold"> - Le contenu des simulations que vous effectuez n'est en aucun cas tracé. - C'est à dire que nous n'utilisons pas de cookies qui nous permettraient - de reconstituer les paramètres d'une simulation et de l'associer à un - visiteur. - </p> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.5. Absence de garantie de service - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Nous mettons les simulateurs LexImpact à disposition sans garantie sur - leur disponibilité, avec obligation de moyens et non de résultats. Cela - signifie que d'éventuelles indisponibilités n'ouvriront pas droit à - compensation financière. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.6. Absence de garantie de résultat - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Les résultats calculés par ce simulateur ont une valeur informative et - ne présentent en aucun cas une garantie pour l'usager. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - La simulation d'impact sur cas type dépend à la fois de l’interface des - simulateurs LexImpact mais également des mises à jour régulières d'<a - class="underline hover:text-le-bleu" - href="https://fr.openfisca.org/">OpenFisca</a - >. Dès qu'une loi est modifiée, les équipes contributrices et bénévoles - d’OpenFisca se chargent de faire évoluer le code informatique pour qu'il - fonctionne selon la nouvelle réglementation en vigueur. Nous ne pouvons - garantir le délai de cette mise à jour. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Les simulateurs LexImpact ne sont pas des calculateurs de situation - individuelle, ce sont des outils de chiffrage conçus pour évaluer les - impacts d'une réforme. Les résultats calculés par ce simulateur ont une - valeur informative et ne représentent en aucun cas une décision - d'ouverture de droits. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">8.7. Évolutions</h2> - <p class="leading-normal pb-3 text-base text-justify"> - Nous pouvons faire évoluer les simulateurs LexImpact sans information - préalable. Nous ajoutons régulièrement des variables, raffinons - l'interface et modifions des formulations sur la base de vos retours et - des évolutions règlementaires. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Nous pouvons suspendre l'accès aux simulateurs sans information - préalable, notamment pour des raisons de maintenance. Nous mettons - l'application à jour plusieurs fois par mois. L'indisponibilité ne - dépasse généralement pas une dizaine de secondes. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Nous pouvons aussi amender ces conditions d'utilisation sans préavis. - Les utilisateurs sont tenus de consulter régulièrement les CGU à jour. - </p> - - <div class="flex justify-between mt-16"> - <a - href="/cgu" - class="inline-flex items-center bg-gray-200 mb-5 p-1 pr-2 text-xs rounded - text-black shadow-md hover:bg-gray-400" - > - <!-- material icons - Arrow Back --> - <svg - class="flex mr-2 items-center" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" - /></svg - > - Conditions d'utilisations générales - </a> - <a - href="/cgu-simulateur-acces-restreint" - class="inline-flex items-center bg-gray-200 mb-5 p-1 pr-2 text-xs rounded - text-black shadow-md hover:bg-gray-400" - > - <!-- material icons - Arrow forward --> - <svg - class="flex mr-2 items-center" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z" - /></svg - > - CGU simulateur partie en accès restreint - </a> - </div> - </div> - </div> -</main> - -<style> - .fond { - background-color: #ffffff; - /* Polka dots - Heropatterns.com échelle réduite */ - background-image: url("data:image/svg+xml,%3Csvg width='8' height='8' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ded500' fill-opacity='0.4' fill-rule='evenodd'%3E%3Ccircle cx='3' cy='3' r='3'/%3E%3Ccircle cx='13' cy='13' r='3'/%3E%3C/g%3E%3C/svg%3E"); - } -</style> diff --git a/src/routes/cgu-simulateur-acces-restreint.svelte b/src/routes/cgu-simulateur-acces-restreint.svelte deleted file mode 100644 index c9c8927ea7ad8f4c2198fab5b324b7687a09309f..0000000000000000000000000000000000000000 --- a/src/routes/cgu-simulateur-acces-restreint.svelte +++ /dev/null @@ -1,338 +0,0 @@ -<script lang="ts"> - import { session } from "$app/stores" -</script> - -<svelte:head> - <title - >Conditions d'utilisation de la partie en accès restreint des simulateurs| {$session.title}</title - > -</svelte:head> - -<main class="flex items-center justify-center fond"> - <div class="bg-white max-w-screen-md p-10"> - <div class=" "> - <h1 class="font-serif font-bold pt-7 pb-3 text-3xl text-gray-700"> - Conditions d'utilisation de la partie <br />en accès restreint des - simulateurs - </h1> - <a - href="/cgu" - class="inline-flex items-center bg-gray-200 mb-5 p-1 pr-2 text-xs rounded - text-black shadow-md hover:bg-gray-400" - > - <!-- material icons - Arrow Back --> - <svg - class="flex mr-2 items-center" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" - /></svg - > - Conditions d'utilisations générales - </a> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.1. Vocabulaire - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - « Nous » se réfère à l'éditeur des simulateurs LexImpact en accès - restreint.<br /> « Vous » se réfère à une usagère et un usager des simulateurs - en accès restreint. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.2. Conditions d'accès au service - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Pour fournir les impacts agrégés sur le budget de l’État et leurs effets - sur des déciles de population, LexImpact s’appuie sur différentes bases - de données, dont les services producteurs sont l'INSEE, la DGFIP et - l'URSSAF Caisse nationale. Ces données sont couvertes par des secrets - protégés par la loi, et notamment le secret statistique. - </p> - - <p class="leading-normal pb-3 text-base text-justify"> - Dans le cadre de ces partenariats et afin de préserver le secret - statistique, seules les personnes dûment habilitées ci-dessous sont - autorisées à accéder aux simulateurs en accès restreint - </p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2 text-base text-justify"> - les députés et députées de l’Assemblée nationale, - </li> - <li class="leading-normal pb-2 text-base text-justify"> - leurs collaborateurs et collaboratrices parlementaires, - </li> - <li class="leading-normal pb-2 text-base text-justify"> - les administrateurs et administratrices de l’Assemblée nationale, - </li> - <li class="leading-normal pb-2 text-base text-justify"> - un échantillon restreint d'utilisateurs et utilisatrices au Sénat pour - expérimentation. - </li> - </ul> - <p class="leading-normal pb-3 text-base text-justify font-bold"> - Les habilitations sont accordées et sous le contrôle exclusif des - services de l’Assemblée nationale et des députés et députées. - </p> - - <p class="leading-normal pt-5 pb-3 text-base text-justify font-bold"> - Si vous faites partie des personnes telles que listées au paragraphe - précédent et que vous n'arrivez pas à vous connecter à la partie des - simulateurs en accès restreint : - </p> - <ul class="pl-10 list-outside list-decimal"> - <li class="leading-normal pb-2 text-base text-justify"> - Veuillez vérifier que vous avez bien utilisé votre adresse mail - professionnelle de l'Assemblée nationale ou du Sénat. Les noms de - domaine autorisés sont présents par défaut dans l'interface de - connexion. - </li> - <li class="leading-normal pb-2 text-base text-justify"> - Veuillez vérifier que vous n'avez pas fait une erreur de frappe, ou - que vous n'avez pas écrit votre adresse mail en entier. Seule la - partie précédent le @nom-de-domaine vous est en réalité demandée. - </li> - <li class="leading-normal pb-2 text-base text-justify"> - En dernier recours, n'hésitez pas à nous envoyer une demande par le - biais du formulaire de contact. - </li> - </ul> - <p class="leading-normal pt-5 pb-3 text-base text-justify font-bold"> - Si vous ne faites pas partie des personnes habilitées, que vous - participez professionnellement à l'élaboration de la loi et que vous - souhaitez accéder au service : - </p> - <ul class="pl-10 list-outside list-decimal"> - <li class="leading-normal pb-2 text-base text-justify"> - L'accord des services producteur est indispensable pour étendre - l'accès à la partie restreinte des simulateurs à tout nouvel - organisme. - </li> - <li class="leading-normal pb-2 text-base text-justify"> - Merci de bien vouloir nous écrire à l'adresse mail suivante : - <a - class="underline text-le-bleu hover:text-le-bleu" - href="mailto:leximpact@an.fr">leximpact@an.fr</a - > en indiquant dans l'objet « demande d’accès simulateurs partie restreinte - ». - </li> - <p class="leading-normal pb-3 text-base text-justify font-bold"> - L'envoi de cette demande ne vaut en aucun cas garantie d'une - acceptation d'habilitation. - </p> - </ul> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.3. Vos engagements en utilisant la partie en accès restreint - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Il est absolument nécessaire de préserver la confidentialité des données - auxquelles le service vous donne accès. Toute violation de cette - confidentialité vous expose à des sanctions pénales comme stipulées dans - l’<a - class="underline hover:text-le-bleu" - href="https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000006417945/" - >Article 226-13 du Code pénal</a - >. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.4. Vos données - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Dans le cadre du partenariat avec les services producteurs et afin de - préserver le secret statistique, la liste des personnes ayant accès à - l'outil de simulation est stockée, tenue à jour en permanence et - transmise régulièrement aux services producteurs (INSEE, DGFIP, URSSAF - Caisse nationale). - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Pour accéder au service en accès restreint, LexImpact vous demande votre - adresse mail. Afin d'éviter les usages abusifs, LexImpact conserve - également des données sur le nombre de simulations sur la population - effectuées par usager. Ces informations ne seront en aucun cas utilisées - pour d'autres fins ou revendues à un tiers. - </p> - - <p class="leading-normal pb-3 text-base text-justify"> - Nous nous engageons à ne jamais exploiter les informations que vous nous - transmettrez dans un but commercial ou publicitaire. De manière - générale, LexImpact n'accepte aucune forme de publicité. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Dans le but d'évaluer la performance du service et son utilité, nous - collectons également des données anonymes d'audience, indépendamment des - simulations effectuées. - </p> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">8.5. Cookies</h2> - - <p class="leading-normal pb-3 text-base text-justify"> - Nous utilisons des cookies persistants afin d'améliorer l'expérience - utilisateur. Ils permettent notamment la sauvegarde de vos cas types. - Ces cookies sont conservés sur votre ordinateur même après fermeture de - votre navigateur et réutilisé lors des prochaines visites sur nos sites. - </p> - <p class="leading-normal pb-3 text-base text-justify font-bold"> - Pour éviter toute utilisation abusive du service, LexImpact conserve le - nombre de simulations sur la population effectuées par usager. - </p> - <p class="leading-normal pb-3 text-base text-justify font-bold"> - Le contenu des simulations que vous effectuez n'est en aucun cas tracé. - C'est à dire que nous n'utilisons pas de cookies qui nous permettraient - de reconstituer les paramètres d'une simulation et de l'associer à un - visiteur. - </p> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.6. Absence de garantie de service - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Nous mettons les simulateurs LexImpact à disposition sans garantie sur - leur disponibilité, avec obligation de moyens et non de résultats. Cela - signifie que d'éventuelles indisponibilités n'ouvriront pas droit à - compensation financière. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.7. Absence de garantie de résultat - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Les résultats calculés par ce simulateur ont une valeur informative et - ne présentent en aucun cas une garantie pour l'usager. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - La simulation d'impact sur le budget de l'État ou sur la population - dépendent à la fois : - </p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2 text-base text-justify"> - de la qualité et de la fraicheur des données représentatives de la - population ; - </li> - <li class="leading-normal pb-2 text-base text-justify"> - des mises à jour régulières du moteur de calcul, <a - class="underline hover:text-le-bleu" - href="https://fr.openfisca.org/">OpenFisca</a - >; - </li> - <li class="leading-normal pb-5 text-base text-justify"> - de l’interface des simulateurs LexImpact. - </li> - </ul> - <p class="leading-normal pb-3 text-base text-justify"> - Nous nous basons sur les dernières données disponibles, cependant elles - ont environs 3 ans de décalage. Nous faisons notre possible pour les - rendre cohérente avec l'année passée. De plus, nous n'intégrons pas la - réaction des acteurs aux changements de la loi, par exemple les emplois - supplémentaires que créerait une réduction des cotisations employeur. - Les chiffres communiqués doivent donc être pris comme des ordres de - grandeur plutôt que comme des estimations économiques précises. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Au delà de ce premier éléments, les données représentatives de la - population ont également besoin d'être mises à jour pour rester - représentatives. L'obtention et le traitement des nouveaux millésimes - représentent un travail conséquent. Nous ne pouvons garantir le délai de - cette mise à jour. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Par ailleurs, dès qu'une loi est modifiée, les équipes contributrices et - bénévoles d’OpenFisca se chargent de faire évoluer le code informatique - pour qu'il fonctionne selon la nouvelle réglementation en vigueur. Nous - ne pouvons garantir le délai de cette mise à jour. - </p> - - <p class="leading-normal pb-3 text-base text-justify"> - Les simulateurs LexImpact ne sont pas des calculateurs de situation - individuelle, ce sont des outils de chiffrage conçus pour évaluer les - impacts d'une réforme. Les résultats calculés par ce simulateur ont une - valeur informative et ne représentent en aucun cas une décision - d'ouverture de droits. - </p> - - <a - href="/cgu" - class="inline-flex items-center bg-le-bleu-light mb-5 p-1 pl-2 text-xs rounded -hover:text-white shadow-md hover:bg-le-bleu" - > - Comment fonctionnent les simulateurs LexImpact ? - <!-- material icons - Arrow forward --> - <svg - class="flex items-center text-black hover:text-white fill-current " - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z" - /></svg - > - </a> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">8.8. Évolutions</h2> - <p class="leading-normal pb-3 text-base text-justify"> - Nous pouvons faire évoluer les simulateurs LexImpact sans information - préalable. Nous ajoutons régulièrement des variables, raffinons - l'interface et modifions des formulations sur la base de vos retours et - des évolutions règlementaires. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Nous pouvons suspendre l'accès aux simulateurs sans information - préalable, notamment pour des raisons de maintenance. Nous mettons - l'application à jour plusieurs fois par mois. L'indisponibilité ne - dépasse généralement pas une dizaine de secondes. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Nous pouvons aussi amender ces conditions d'utilisation sans préavis. - Les utilisateurs sont tenus de consulter régulièrement les CGU à jour. - </p> - <div class="flex justify-between mt-16"> - <a - href="/cgu" - class="inline-flex items-center bg-gray-200 mb-5 p-1 pr-2 text-xs rounded - text-black shadow-md hover:bg-gray-400" - > - <!-- material icons - Arrow Back --> - <svg - class="flex mr-2 items-center" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" - /></svg - > - Conditions d'utilisations générales - </a> - <a - href="/cgu-simulateur-acces-libre" - class="inline-flex items-center bg-gray-200 mb-5 p-1 pr-2 text-xs rounded - text-black shadow-md hover:bg-gray-400" - > - <!-- material icons - Arrow forward --> - <svg - class="flex mr-2 items-center" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z" - /></svg - > - CGU simulateur partie en accès libre - </a> - </div> - </div> - </div> -</main> - -<style> - .fond { - background-color: #ffffff; - /* Polka dots - Heropatterns.com échelle réduite */ - background-image: url("data:image/svg+xml,%3Csvg width='8' height='8' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ded500' fill-opacity='0.4' fill-rule='evenodd'%3E%3Ccircle cx='3' cy='3' r='3'/%3E%3Ccircle cx='13' cy='13' r='3'/%3E%3C/g%3E%3C/svg%3E"); - } -</style> diff --git a/src/routes/cgu.svelte b/src/routes/cgu.svelte deleted file mode 100644 index 6eb8527ae5f39906c5ebaa30ec11fb873a70c2d0..0000000000000000000000000000000000000000 --- a/src/routes/cgu.svelte +++ /dev/null @@ -1,410 +0,0 @@ -<script lang="ts"> - import { session } from "$app/stores" - - let openTab = 1 - - function toggleTabs(tabNumber) { - openTab = tabNumber - } -</script> - -<svelte:head> - <title>Conditions d'utilisation | {$session.title}</title> -</svelte:head> - -<main class="flex items-center justify-center fond"> - <div class="bg-white max-w-screen-md p-10"> - <div class=" "> - <h1 class="font-serif font-bold pt-7 pb-3 text-3xl text-gray-700"> - Conditions générales d'utilisation - </h1> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 1. Présentation générale - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Ce site internet est mis en oeuvre par le service LexImpact de - l'Assemblée nationale. Il donne accès à différents services : - </p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2 text-base text-justify"> - des simulateurs permettant d'évaluer, de façon rapide, l'impact de - réformes paramétriques sur différents dispositifs de la loi ; - </li> - <li class="leading-normal pb-2 text-base text-justify"> - des interfaces permettant d'accéder à différentes ressources de - données ; - </li> - <li class="leading-normal pb-2 text-base text-justify"> - des formulaires de contacts pour faire une demande de chiffrage à - l'équipe ou prendre rendez-vous. - </li> - </ul> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">2. Vocabulaire</h2> - <p class="leading-normal pb-3 text-base text-justify"> - « Nous » se réfère à l'éditeur des interfaces LexImpact disponibles sur - leximpact.an.fr. <br />« Vous » se réfère à une usagère ou un usager du - site internet LexImpact. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">3. Utilisation</h2> - <p class="leading-normal pb-3 text-base text-justify"> - Si vous naviguez sur le site internet leximpact.an.fr, vous acceptez ces - conditions d'utilisation, comme indiqué dans l'<a - class="underline hover:text-le-bleu" - href="https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000031367350/" - > - Article L. 112-9 du Code des relations entre le public et - l'administration - </a>. - <br /><br />L'utilisation du site internet est gratuite et facultative. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Certains services de LexImpact, notamment les simulateurs, requièrent - une connexion internet et un navigateur récent, et ne fonctionnent pas - sur Internet Explorer. Vous pouvez installer en autonomie Chrome ou - Firefox, sans droits d'administration sur votre poste. - </p> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">4. Vos données</h2> - <p class="leading-normal pb-3 text-base text-justify"> - Dans le cas où vous auriez une demande ou bien un retour d’expérience à - nous partager, nous vous invitons à nous écrire à l'adresse <a - class="underline hover:text-le-bleu" - href="mailto:leximpact@an.fr">leximpact@an.fr</a - > Dans ce cadre, nous nous engageons à ne conserver que les données anonymisées - de nos échanges. Ces informations nous permettront d'améliorer le service. - Toutes les données directement identifiantes (nom, adresse, …) seront supprimées - dans un délai d’un an. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Certains services LexImpact, notamment la partie en accès restreint des - simulateurs, sont amenés à collecter plus d'informations vous - concernant. L'ensemble des données collectées et leur traitement est - explicité dans les CGU spécifiques de ces services. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Nous nous engageons à ne jamais exploiter les informations que vous nous - transmettrez dans un but commercial ou publicitaire. De manière - générale, LexImpact n'accepte aucune forme de publicité. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Dans le but d'évaluer la performance du service et son utilité, nous - collectons également des données anonymes d'audience. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">5. Cookies</h2> - <h3 class="pb-5 pt-2 text-base text-black font-bold"> - Des cookies de mesure d'audience pour améliorer le service - </h3> - <p class="leading-normal pb-3 text-base text-justify"> - LexImpact dépose des cookies de mesure d’audience (nombre de visites, - pages consultées), respectant les conditions d’exemption du consentement - de l’internaute définies par la recommandation <a - class="underline hover:text-le-bleu" - href="https://www.cnil.fr/fr/cookies-solutions-pour-les-outils-de-mesure-daudience" - >Cookies</a - > de la Commission nationale informatique et libertés (CNIL). - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Il utilise - <a class="underline hover:text-le-bleu" href="https://fr.matomo.org/" - >Matomo</a - > - , un outil libre, paramétré pour ce faire. Cela signifie, notamment, que - ces cookies ne servent qu’à la production de statistiques anonymes et ne - permettent pas de suivre la navigation de l’internaute sur d’autres sites. - </p> - <h3 class="pb-5 pt-2 text-base text-black font-bold"> - D'autres cookies selon les services utilisés - </h3> - <p class="leading-normal pb-3 text-base text-justify"> - Nous utilisons des cookies persistants afin d'améliorer l'expérience - utilisateur, ces cookies persistants varient selon les services, et sont - spécifiés dans les conditions générales d'utilisations spécifiques aux - différents services, disponibles ci-après. - </p> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 6. Absence de garantie de service - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Nous mettons le site internet LexImpact et ses services à disposition, - sans garantie sur leur disponibilité, avec obligation de moyens et non - de résultats. Cela signifie que d'éventuelles indisponibilités - n'ouvriront pas droit à compensation financière. - </p> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">7. Évolutions</h2> - - <p class="leading-normal pb-3 text-base text-justify"> - Nous pouvons faire évoluer le site internet LexImpact sans information - préalable. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Nous pouvons suspendre l'accès au site et à ses services sans - information préalable, notamment pour des raisons de maintenance. Nous - mettons l'application à jour plusieurs fois par mois. L'indisponibilité - ne dépasse généralement pas une dizaine de secondes. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Nous pouvons aussi amender ces conditions d'utilisation sans préavis. - Les utilisateurs sont tenus de consulter régulièrement les CGU à jour. - </p> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8. Conditions d'utilisation spécifiques aux différents services - </h2> - - <div class="flex flex-wrap"> - <div class="w-full"> - <ul class="flex mb-0 list-none flex-wrap pt-3 pb-0 flex-row"> - <li class="-mb-px mr-2 last:mr-0 flex-auto text-center"> - <!-- svelte-ignore a11y-missing-attribute --> - <a - class="text-base font-bold uppercase px-5 py-3 shadow-lg rounded block leading-normal {openTab === - 1 - ? 'text-black bg-white' - : 'text-gray-600 bg-gray-100'}" - on:click={() => toggleTabs(1)} - > - Simulateurs - </a> - </li> - <!-- - <li class="-mb-px mr-2 last:mr-0 flex-auto text-center"> - - <a - class="text-base font-bold uppercase px-5 py-3 shadow-lg rounded block leading-normal {openTab === - 2 - ? 'text-black bg-white' - : 'text-gray-600 bg-gray-100'}" - on:click={() => toggleTabs(2)} - > - Ressources - </a> - </li> - --> - <li class="-mb-px mr-2 last:mr-0 flex-auto text-center"> - <!-- svelte-ignore a11y-missing-attribute --> - <a - class="text-base font-bold uppercase px-5 py-3 shadow-lg rounded block leading-normal {openTab === - 3 - ? 'text-black bg-white' - : 'text-gray-600 bg-gray-100'}" - on:click={() => toggleTabs(3)} - > - Formulaires - </a> - </li> - </ul> - <div - class="relative flex flex-col min-w-0 break-words bg-white w-full mb-6 shadow-lg rounded" - > - <div class="px-8 py-5 flex-auto"> - <div class="tab-content tab-space"> - <div class={openTab === 1 ? "block" : "hidden"}> - <p class="leading-normal pb-3 text-base text-justify"> - Les simulateurs LexImpact se déclinent en deux parties - distinctes qui s'adressent à deux usagers différents : - </p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2 text-base text-justify"> - une partie du service est en accès libre, accessible au - grand public. - </li> - <li class="leading-normal pb-2 text-base text-justify"> - une partie du service est en accès restreint, une - connexion est requise. Seules les personnes dûment - habilitées participant à l'élaboration de la loi. - </li> - </ul> - <div class="flex justify-between space-x-10"> - <div class="w-1/2"> - <h2 class="pb-5 pt-10 text-xl text-black font-bold"> - Partie en accès libre - </h2> - - <p class="leading-normal pb-3 text-base text-justify"> - La partie en accès libre des simulateurs LexImpact - permet à toutes et tous de simuler les impacts d'une - réforme sur des cas types. - <b />Ces estimations permettent d'évaluer l'impact d'une - modification de la loi sur une entité fictive. Elles ne - s'appuient pas sur des données représentatives de la - populations française. - </p> - <p - class="leading-normal pb-3 text-base font-bold text-justify" - > - Les simulateurs LexImpact ne vous permettent pas de - simuler votre situation personnelle. - </p> - - <p class="leading-normal pb-3 text-base text-justify"> - Concernant le simulateur des - <a - class="underline hover:text-le-bleu" - href="https://leximpact.an.fr/dotations" - >dotations aux communes</a - >, les données représentatives de la population - française étant ouvertes, le simulateur est entièrement - en accès libre et permet donc, à toutes et tous, de - simuler les impacts macros d'une réforme sur la - population et les recettes de l'État. - </p> - <p - class="leading-normal pb-3 text-base font-bold text-justify" - > - L'utilisation de cette partie du service est libre, - facultative et gratuite. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Toute utilisation du service est subordonnée à - l'acceptation préalable et au respect intégral des - conditions générales d'utilisation (CGU) de cette page - et de celles disponibles ci-après : - </p> - <a - href="/cgu-simulateur-acces-libre" - class="inline-flex text-center border-2 bg-le-bleu-light mb-5 p-2 text-base rounded-lg - text-black shadow-md hover:bg-le-bleu hover:text-white" - > - Conditions d'utilisation <br /> de la partie en accès libre - </a> - </div> - <div class="w-1/2"> - <h2 class="pb-5 pt-10 text-xl text-black font-bold"> - Partie en accès restreint - </h2> - <p - class="leading-normal pb-3 text-base font-bold text-justify" - > - La version en accès restreint de LexImpact est - uniquement accessible à des personnes habilitées, - parties prenantes de l'élaboration de la loi. - </p> - - <p class="leading-normal pb-3 text-base text-justify"> - Cette partie donne accès aux simulations disponibles sur - la population et le budget de l'État ; calculées à - partir de données représentatives de la population, - couvertes par des secrets protégés par la loi. Ainsi, - seules les personnes dûment habilitées peuvent y avoir - accès. - </p> - <p - class="leading-normal pb-3 text-base font-bold text-justify" - > - L'utilisation de cette partie du service est également - facultative et gratuite. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Toute utilisation du service est subordonnée à - l'acceptation préalable et au respect intégral des - conditions générales d'utilisation (CGU),de cette page - et de celles disponibles ci-après : - </p> - <a - href="/cgu-simulateur-acces-restreint" - class="inline-flex text-center border-2 bg-le-bleu-light mb-5 p-2 text-base rounded-lg - text-black shadow-md hover:bg-le-bleu hover:text-white" - > - Conditions d'utilisation <br /> de la partie en accès restreint - </a> - </div> - </div> - </div> - - <!-- CGU ressources des données --> - <!-- - <div class={openTab === 2 ? "block" : "hidden"}> - <p class="leading-normal pb-3 text-base text-justify"> - Suspendisse potenti. Ut sit amet porta turpis. Pellentesque - habitant morbi tristique senectus et netus et malesuada - fames ac turpis egestas. Nunc posuere ipsum nec ligula - molestie dapibus. In molestie, neque id cursus elementum, - lorem velit interdum enim, non hendrerit quam est in neque. - Duis in tincidunt velit. Nullam a augue eget mi sodales - malesuada. Vestibulum congue massa quam, non tristique orci - vestibulum a. Nam et tortor diam. - <br /> - <br /> - Suspendisse potenti. Ut sit amet porta turpis. Pellentesque habitant - morbi tristique senectus et netus et malesuada fames ac turpis - egestas. Nunc posuere ipsum nec ligula molestie dapibus. - </p> - </div> - --> - <!-- CGU Formulaires --> - <div class={openTab === 3 ? "block" : "hidden"}> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.1. Conditions d'accès au service - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Le formulaire de demande de chiffrage est disponible - <a - class="underline hover:text-le-bleu" - href="https://limesurvey.leximpact.dev/index.php/254182?lang=fr" - > - en suivant ce lien - </a> - . - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Son utilisation est gratuite et facultative. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Comme indiqué sur le site, ce formulaire s'adresse aux - personnes rattachées à l'Assemblée nationale : députés, - collaborateurs et administrateurs. - </p> - - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold"> - 8.2. Vos données - </h2> - <h3 class="pb-2 pt-5 text-base text-black font-bold"> - Vous êtes rattaché à l'Assemblée nationale - </h3> - <p class="leading-normal pb-3 text-base text-justify"> - Nous mettons à disposition un formulaire de contact vous - permettant de décrire une demande spécifique de chiffrage. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Ces informations seront gardées le temps du traitement de - votre demande et pour une durée de trois ans maximum, dans - l'objectif de pouvoir mieux répondre à vos besoins. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Nous nous engageons à ne jamais exploiter les informations - que vous nous transmettrez dans un but commercial ou - publicitaire. - </p> - <p class="leading-normal pb-3 text-base text-justify"> - Vous pouvez à tout moment nous demander de supprimer vos - coordonnées de contact en écrivant à <a - class="hover:text-le-bleu underline" - href="mailto:leximpact@an.fr">leximpact@an.fr</a - >. - </p> - <h3 class="pb-2 pt-5 text-base text-black font-bold"> - Vous n'êtes pas rattaché à l'Assemblée nationale - </h3> - <p class="leading-normal pb-3 text-base text-justify"> - Ce service ne vous étant pas adressé, l'ensemble des données - adressées seront supprimées directement. - </p> - </div> - </div> - </div> - </div> - </div> - </div> - </div> - </div> -</main> - -<style> - .fond { - background-color: #ffffff; - /* Polka dots - Heropatterns.com échelle réduite */ - background-image: url("data:image/svg+xml,%3Csvg width='8' height='8' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ded500' fill-opacity='0.4' fill-rule='evenodd'%3E%3Ccircle cx='3' cy='3' r='3'/%3E%3Ccircle cx='13' cy='13' r='3'/%3E%3C/g%3E%3C/svg%3E"); - } -</style> diff --git a/src/routes/comment-fonctionnent-les-simulateurs.svelte b/src/routes/comment-fonctionnent-les-simulateurs.svelte deleted file mode 100644 index 97d6b49297a901f23d8cb15b99df06aab1c6c20b..0000000000000000000000000000000000000000 --- a/src/routes/comment-fonctionnent-les-simulateurs.svelte +++ /dev/null @@ -1,451 +0,0 @@ -<script lang="ts"> - import { session } from "$app/stores" - import PictoFemme from "$lib/components/pictos/PictoFemme.svelte" - import PictoEtat from "$lib/components/pictos/PictoEtat.svelte" - import PictoEntreprise from "$lib/components/pictos/PictoEntreprise.svelte" - import TextUnderconstructionMessage from "$lib/components/transverse_pages/TextUnderconstructionMessage.svelte" -</script> - -<svelte:head> - <title>Comment fonctionne les simulateurs LexImpact| {$session.title}</title> -</svelte:head> - -<main class="flex items-center justify-center fond"> - <div class="bg-white max-w-screen-md "> - <div class="p-10 text-base"> - <h1 class="font-serif font-bold pt-7 pb-10 text-3xl text-gray-700"> - Comment fonctionne les simulateurs LexImpact ? - </h1> - <h2 class="text-xl text-gray-700 font-bold pb-3"> - 1. Ce que les simulateurs permettent d'estimer - </h2> - <p class="leading-normal pb-3 text-justify "> - LexImpact propose déjà deux simulateurs permettant d’estimer les impacts - d’une <span class="font-bold">réforme paramétrique sur </span> - <a - class="font-bold underline hover:text-le-bleu" - href="https://leximpact.an.fr/ir">l’impôt sur le revenu</a - > - et sur une partie des - <a - class="underline font-bold hover:text-le-bleu" - href="https://leximpact.an.fr/ir">dotations aux communes</a - >. Au travers de ces deux interfaces, l’utilisateur peut estimer, en - moins d’une minute, l’impact sur des cas types qu’il aura configurés, ou - bien sur le budget de l’État et plus généralement sur la population - française. - </p> - <p class="leading-normal pb-3 text-justify "> - En 2021, LexImpact développe un <span class="font-bold" - >nouveau simulateur dans le périmètre des cotisations & prestations - sociales</span - >. - <br /> - Le simulateur permettra, pour le prochain projet de loi de financement de - la sécurité sociale, d’estimer l’effet d’une réforme paramétrique sur des - dispositions relatives aux cotisations sociales, patronales et salariales, - à la CSG, la CRDS et aux exonérations, sur des cas types de salariés du secteur - privé. Il sera aussi possible d’estimer les conséquences de modifications - relatives à la CSG sur le budget de l’État et de la sécurité sociale. - </p> - - <div class="grid md:grid-cols-2 gap-8 justify-between pt-4"> - <div> - <img - class=" w-16" - src="/picto-impot-sur-le-revenu.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold"> - Le simulateur de l'impôt sur le revenu permet d'estimer les impacts - sur : - </p> - - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2"> - des foyers fiscaux types configurables ; - </li> - <li class="leading-normal pb-2">les recettes de l'État ;</li> - <li class="leading-normal pb-2"> - les recettes par décile de population ; - </li> - <li class="leading-normal pb-2"> - le nombre de foyers fiscaux touchés par la réforme. - </li> - </ul> - </div> - <div> - <img - class=" w-16" - src="/picto-dotations-communes.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold"> - Le simulateur des dotations aux communes permet d'estimer les - impacts sur : - </p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2 "> - chaque commune de France ; - </li> - <li class="leading-normal pb-2"> - chaque strate démographique de communes. - </li> - </ul> - </div> - <div> - <img - class=" w-16" - src="/picto-affaires-sociales.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold"> - Le simulateur des cotisations & prestations sociales permet - d'estimer les impacts sur : - </p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2"> - des cas types de salariés du secteur privé ; - </li> - <li class="leading-normal pb-2"> - les recettes de l'État et de la Sécurité sociale concernant la CSG - et la CRDS. - </li> - </ul> - </div> - </div> - - <div class="flex items-center pb-3 pt-10 "> - <h3 class="text-xl text-gray-700 font-light"> - Des impacts sur cas type - </h3> - <div class="mx-2"> - <PictoFemme /> - </div> - <PictoEntreprise /> - </div> - - <p class="leading-normal pb-3 text-justify"> - Les simulateurs LexImpact permettent de configurer des cas types pour - ensuite visualiser les impacts de la loi ou d'une réforme paramétrique - sur ces derniers. Un cas type est un cas simplifié d'une situation - individuelle, par exemple : <span class="italic" - >"un foyer composé de deux adultes et d'un enfant, gagnant un certain - salaire par mois".</span - > - En configurant plusieurs cas types sur les simulateurs LexImpact, l'utilisateur - peut alors se représenter, de façon simplifiée, les impacts sur différents - types de population. - </p> - - <div class="bg-gray-100 p-4 text-sm"> - <h4 class="text-base font-bold pb-2"> - Des situations simplifiées à mettre en perspective - </h4> - <p class=" leading-normal pb-3 text-justify"> - Les estimations sur cas types sont plus précises que les estimations - d'impacts globaux sur la population française, qui eux, dépendent des - données disponibles. En revanche, du fait de leur caractère simplifié, - ils sont à mettre en perspective avec la réalité du terrain : - </p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2 text-justify"> - Premièrement en regard de leur proportion dans la population réelle - difficile à évaluer : Par exemple, - <span class="italic" - >l'utilisateur crée deux cas types très simplifiés, l'un - représentant un salarié du privé gagnant le SMIC, l'autre - représentant un salarié du privé gagnant 6000 euros par mois. Les - deux cas types sont affichés à l'écran, pourtant l'un regroupe une - situation simplifiée représentative de beaucoup de salariés, - l'autre concerne une situation bien moins étendue.</span - > - Plus l'utilisateur configure son cas type en détail, moins il est évident - de savoir combien de personnes réelles peuvent être associées à ce cas - type. - </li> - <li class="leading-normal pb-2 text-justify"> - Deuxièmement, il n'est pas possible de tirer d'une estimation - concernant un cas type, des conclusions sur une situation - individuelle précise. Il faudrait pour cela entrer l'ensemble des - paramètres ayant une influence sur le dispositif à évaluer - concernant une personne réelle, à l'instar des déclarations de - revenus, les simulateurs LexImpact n'ont pas cette vocation. - </li> - </ul> - </div> - <p class="leading-normal pb-3 pt-3 text-justify"> - Dans le cadre des dotations aux communes, le simulateur ne permet pas de - créer un cas type de commune puisque l'ensemble des communes sont - accessibles par le biais de la barre de recherche. La possibilité de - rechercher les communes et de les afficher permet d'effectuer des - comparaisons. - </p> - - <div class="flex items-center pb-3 pt-10 "> - <h3 class="text-xl text-gray-700 font-light">Des impacts globaux</h3> - <div class="mx-2"> - <PictoEtat /> - </div> - </div> - <p class="leading-normal pb-3 text-justify"> - En plus des impacts sur cas types, LexImpact permet d'estimer les effets - globaux (sans être comportementaux) d'une modification de la loi. Pour - cela, les simulateurs s'appuient sur <span class="font-bold" - >des données représentatives de la population française :</span - > - </p> - <div class="grid md:grid-cols-2 gap-8 justify-between pt-4 pb-4"> - <div> - <img - class=" w-16" - src="/picto-impot-sur-le-revenu.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold">Simulateur de l'impôt sur le revenu :</p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2"> - Enquête Revenus Fiscaux et Sociaux (<a - href="https://www.insee.fr/fr/metadonnees/source/serie/s1231/documentation-methodologique" - class="underline hover:text-le-bleu">ERFS-FPR</a - >) de l'Insee <span class="italic">(millésime 2016)</span><span - class="font-extralight">- Données protégées 🔐</span - > ; - </li> - <li class="leading-normal pb-2"> - Déclarations d’impôt sur le revenu des foyers fiscaux (<a - href="https://www.casd.eu/source/declarations-dimpot-sur-le-revenu-des-foyers-fiscaux-formulaire-2042-et-annexes/" - class="underline hover:text-le-bleu">POTE</a - >) du Ministère des Finances (DGFIP) - <span class="italic">(millésime 2019)</span> - <span class="font-extralight">- Données protégées 🔐.</span> - </li> - </ul> - </div> - <div> - <img - class=" w-16" - src="/picto-dotations-communes.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold">Simulateur des dotations aux communes :</p> - <ul class="list-inside list-disc"> - <li class="leading-normal pb-2 "> - <a - href="http://www.dotations-dgcl.interieur.gouv.fr/consultation/criteres_repartition.php" - class="underline hover:text-le-bleu" - >Critères de répartition des dotations par commune</a - > - de la Direction Générale des collectivités locales (DGCL) - <span class="italic">(millésime 2016)</span><span - class="font-extralight">- Données ouvertes 🔓.</span - > - </li> - </ul> - </div> - <div> - <img - class=" w-16" - src="/picto-affaires-sociales.png" - alt="Pictogramme représentant le simulateur impôt sur le revenu" - /> - <p class="pb-3 font-bold"> - Simulateur des cotisations & prestations sociales : - </p> - <TextUnderconstructionMessage /> - </div> - </div> - - <div class="bg-gray-100 p-4 text-sm"> - <h4 class="text-base font-bold pb-2"> - La précision des impacts globaux dépend de la qualité et de la - fraicheur des données - </h4> - - <p class="leading-normal pb-3 text-justify"> - Pour calculer les impacts globaux, LexImpact mène un travail de fond - pour accéder aux données représentatives. Le service a depuis fin 2019 - un centre d'accès sécurisé aux données (CASD) lui permettant de faire - des recherches sur des données fines. Toutefois, la donnée, - essentielle pour permettre de fournir des résultats pertinents reste - un enjeu permanent. Cet enjeu se concrétise déjà dans l’interface de - l’impôt sur le revenu, où les résultats sur le budget de l’État sont à - l'heure actuelle très approximatifs car basés sur des données de 2016. - La crise sanitaire et le changement brusque du contexte économique - rendent ce problème plus conséquent, et le dernier millésime ne - permettra pas d’en tenir compte en 2021 car il date de 2018. - </p> - </div> - <h2 class="text-xl text-gray-700 font-bold pb-3 pt-10"> - 2. Fonctionnement des simulateurs - </h2> - <h3 class="pb-3 pt-5 text-xl text-gray-700 font-light"> - Un fonctionnement possible grâce à plusieurs acteurs - </h3> - <p class="leading-normal pb-5 text-justify"> - LexImpact bénéficie d'un écosystème composé de plusieurs acteurs : - </p> - <ul class="list-inside list-disc pl-4 "> - <li class="leading-normal pb-2 text-justify"> - En amont, <span class="font-bold">les fournisseurs de donnée</span>. - Qu'il s'agisse de données publiques, ou de données protégées, cet - écosystème est indispensable pour permettre d'estimer les impacts - d'une réforme sur la population française et sur le budget de l'État - ou de la Sécurité sociale. - </li> - <li class="leading-normal pb-2 text-justify"> - Autant pour le traitement des données que pour le moteur de calcul, - LexImpact échange régulièrement avec des <span class="font-bold" - >experts techniques et métiers</span - > - dont le domaine de compétence est reconnu. L'ensemble de ces contributions - est visible dans - <a - href="https://git.leximpact.dev/" - class="underline hover:text-le-bleu">notre code source</a - >. <br />Les - <span class="font-bold"> - administrateurs de l'Assemblée nationale</span - >, experts des questions juridiques, financières et économiques nous - apportent leur expertise métier à la fois pour le moteur de calcul et - l'interface. Pour le - <a href="./simulation" class="underline hover:text-le-bleu" - >simulateur Cotisations & prestations sociales</a - >, ils participent à la vérification des paramètres et des formules - directement depuis l'interface. - </li> - <li class="leading-normal pb-2 text-justify"> - Enfin, les services LexImpact reposent sur l'analyse des besoins - utilisateurs et sur la prise en compte des <span class="font-bold" - >retours utilisateurs</span - >, dans une logique d'amélioration continue. - </li> - </ul> - </div> - - <div> - <img - class=" object-center" - src="/schema-explicatif-fonctionnement-simulateurs.png" - alt="montre où cliquer pour amender un dispositif" - /> - <p - class="leading-normal px-10 py-2 text-justify italic text-xs text-gray-500" - > - * Le calcul d’impact sur des cas spécifiques est possible uniquement - pour des entités dont les données sont entièrements publiques. - Actuellement seul le simulateur “Dotations aux communes” est concerné - avec les cas spécifiques des communes de France. Cela n’est pas possible - pour les entreprises et les foyers fiscaux, dont les données sont - protégées. - </p> - </div> - - <div class="p-10 text-base "> - <h3 class="pb-3 pt-5 text-xl text-gray-700 font-light"> - Le traitement des données - </h3> - <TextUnderconstructionMessage /> - <h3 class="pb-3 pt-5 text-xl text-gray-700 font-light"> - Le moteur de calcul - </h3> - <TextUnderconstructionMessage /> - - <h2 class="text-xl text-gray-700 font-bold pb-3 pt-10"> - 3. Fiabilité des résultats - </h2> - <h3 class="pb-3 pt-5 text-xl text-gray-700 font-light"> - Méthodologie de vérification des résultats - </h3> - <TextUnderconstructionMessage /> - - <h3 class="pb-3 pt-5 text-xl text-gray-700 font-light"> - Une marge d'erreur incompressible - </h3> - <p class="leading-normal pb-5 text-justify"> - Les résultats des simulateurs LexImpact ont, comme c'est le cas de tout - simulateur, une certaine imprécision. Ils fournissent des estimations. - Le calcul d'une marge d'erreur est impossible car l'imprécision provient - de l'intrication de - <span class="font-bold" - >différents écarts ayant plusieurs origines :</span - > - </p> - <ul class="list-inside list-disc pl-4 "> - <li class="leading-normal pb-2 text-justify"> - <span class="font-bold" - >La mise à jour du moteur de calcul :</span - > Les simulateurs LexImpact s'appuie sur un calculateur. Celui-ci est codé - en python, et ces formules reflètent la loi existante. La législation, - en matière fiscale et de sécurité sociale, évoluant au moins tous les ans, - il est nécessaire de mettre à jour ce moteur de calcul, en recodant des - formules et des paramètres. Cette mise à jour ne débute qu'après publication - de la loi au Journal officiel, et nécessite un temps plus ou moins long. - LexImpact s'appuie sur le moteur de calcul OpenFisca et, malgré les nombreuses - contributions, la mise à jour est progressive étant donné le périmètre - du modèle. Le service LexImpact commence par les dispositifs qui pèsent - le plus lourd dans les calculs, jusqu'à obtenir des résultats cohérents, - mais un petit écart non significatif peut subsister. - </li> - - <li class="leading-normal pb-2 text-justify"> - <span class="font-bold">La simplification d'une situation :</span - > - Que ce soit pour le calcul des cas types ou pour le calcul d'impacts sur - la population française, les paramètres définissant l'entité pour laquelle - l'impact est calculé sont toujours simplifiés. Dans le cas d'impacts globaux, - les données sont parfois simplement inexistantes ; pour les cas types, - l'entrée de l'ensemble des paramètres serait extrêmement fastidieuse pour - l'utilisateur et représenterait un coût de de développement logiciel très - élevé. Par conséquent, pour limiter les développements, le temps de calcul - et faciliter le parcours utilisateur, LexImpact prend des valeurs moyennes - ou par défaut (souvent zéro) pour toutes les données qui ont un faible - poids dans le résultat final. Par exemple, - <span class="italic" - >dans le cas du calcul de la CSG d'un ménage au SMIC avec deux - enfants, les paramètres tels que les heures supplémentaires, les - intérêts perçus sur un PEL de moins de 12 ans, ou encore les titres - non côtés détenus dans le PEA, sont mis à 0.</span - > - L'utilisation de valeurs par défaut ou moyennes génère donc un écart par - rapport aux situations réelles individuelles. - </li> - <li class="leading-normal pb-2 text-justify"> - <span class="font-bold" - >Les données représentatives de la population française :</span - > Souvent décalées dans le temps car mises à disposition avec un délai - de 1 à 2 ans, les bases de données présentent parfois des erreurs d’entrée, - des doublons, des manques, ou tout simplement des biais dans le cas où - la base de données est construite à partir d'un échantillon de la population. - On parle alors d'erreur de "sample". Comment expliqué dans la partie précédente - (traitement des données), le service LexImpact traite ces informations - pour réduire les écarts, mais ce traitement ne permet pas d'obtenir un - résultat 100% conforme à la réalité. - </li> - </ul> - <p class="leading-normal pb-2 pt-5 text-justify"> - Pour réduire les marges d'erreur, l'équipe LexImpact travaille en - continu à l'amélioration du modèle, échange régulièrement avec des - experts. Compte tenu de ce travail de validation, les résulats présentés - sont cohérents et permettent de mettre en évidence les effets de - différents dispositifs sur des ménages et sur l'État, avec une marge - d'erreur raisonnable, mais qu'il faut garder à l'esprit. - </p> - - <p class="leading-normal pb-3 text-justify"> - Aidez à améliorer LexImpact, n'hésitez pas à <a - href="/contribuer" - class="underline hover:text-le-bleu">contribuer</a - > ! - </p> - </div> - </div> -</main> - -<style> - .fond { - background-color: #ffffff; - /* Circuit board - Heropatterns.com échelle réduite */ - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='120' height='120'%3E%3Cpath fill='%23ded500' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E"); - } -</style> diff --git a/src/routes/contribuer.svelte b/src/routes/contribuer.svelte index e2ba2c1bc5ec9d5d5165d3ab9cf95bfcde08fc1b..1f44bf6663ad3adf4799ad89306ef9b04e8e2249 100644 --- a/src/routes/contribuer.svelte +++ b/src/routes/contribuer.svelte @@ -246,7 +246,7 @@ </p> <a - href="/simulation" + href="/" class="inline-flex items-center bg-gray-200 my-5 p-1 pr-2 text-xs rounded text-black shadow-md hover:bg-gray-400" > diff --git a/src/routes/index.svelte b/src/routes/index.svelte index 264822ab1b3d2a1d1062a472fb9edff284643c15..3477bdbb0d8a034e4a50819bad4d490fb0c5e4bd 100644 --- a/src/routes/index.svelte +++ b/src/routes/index.svelte @@ -1,205 +1,739 @@ <script lang="ts"> - import { session } from "$app/stores" + import type { EntityByKey, GroupEntity } from "@openfisca/ast" + import { getRolePersonsIdKey } from "@openfisca/ast" + import type Sockette from "sockette" + import { getContext, setContext } from "svelte" + import type { Writable } from "svelte/store" + import { writable } from "svelte/store" + import { v4 as uuidv4 } from "uuid" + + import { goto } from "$app/navigation" + import { page, session } from "$app/stores" + import { validateSimulationQuery } from "$lib/auditors/queries" + import type { ValidSimulationQuery } from "$lib/calculations" + import { newSimulationUrl } from "$lib/calculations" + import TestCaseEdit from "$lib/components/test_cases/TestCaseEdit.svelte" + import TestCasesPane from "$lib/components/test_cases/TestCasesPane.svelte" + import VariableReferredInputsPane from "$lib/components/variables/VariableReferredInputsPane.svelte" + import StartTutorial from "$lib/components/tutorial/StartTutorial.svelte" + import VariableReferredParametersPane from "$lib/components/variables/VariableReferredParametersPane.svelte" + import type { DecompositionByName } from "$lib/decompositions" + import { + updateDecompositionEvaluations, + updateVectorIndex, + } from "$lib/decompositions" + import type { ReformChange } from "$lib/reforms" + import type { + Axis, + PopulationWithoutId, + Situation, + SituationWithAxes, + } from "$lib/situations" + import { getPopulationReservedKeys } from "$lib/situations" + import type { SelfTargetAProps } from "$lib/urls" + + type EditionMode = + | { + mode: "variable_parameters" + variableName: string + } + | { + mode: "test_case" + testCaseIndex: number + } + | { + mode: "test_case_with_variable_inputs" + testCaseIndex: number + variableName: string + } + | null + + const action = writable(undefined) + setContext("action", action) + const adaptAmountsScale = writable(true) + setContext("adaptAmountsScale", adaptAmountsScale) + let axes: Axis[][] = [] + const date = new Date().toISOString().split("T")[0] + const decompositionByNameArray = getContext( + "decompositionByNameArray", + ) as Writable<DecompositionByName[]> + const decompositionsName = getContext("decompositionsName") as string[] + const deltaByNameArray = getContext("deltaByNameArray") as Writable< + Array<{ + [name: string]: number[] + }> + > + let editionMode: EditionMode = null + const inputInstantsByVariableName = getContext( + "inputInstantsByVariableName", + ) as Writable<{ + [name: string]: Set<string> + }> + setContext("newSelfTargetAProps", newSelfTargetAProps) + const reform = getContext("reform") as Writable<ReformChange> + const rootDecompositionName = $session.rootDecompositionName + const showNulls = writable(false) + setContext("showNulls", showNulls) + const simulationRequested = getContext( + "simulationRequested", + ) as Writable<boolean> + const testCaseIndex = getContext("testCaseIndex") as Writable<number> + const testCases = getContext("testCases") as Writable<Situation[]> + const calculationToken = getContext("calculationToken") as Writable< + string | undefined + > + const vectorIndexes = getContext("vectorIndexes") as Writable<number[]> + const vectorLength = getContext("vectorLength") as Writable<number> + const webSocket = getContext("webSocket") as Writable<Sockette | undefined> + const webSocketOpen = getContext("webSocketOpen") as Writable<boolean> + const year = getContext("year") as Writable<number> + + $: query = ensureValidQuery($page.query) + + $: $action = query.action + + $: if ($simulationRequested) { + $simulationRequested = false + submit() + } + + $: editionModeFromAction($action) + + function asEditionModeWithTestCase(editionMode: EditionMode): { + testCaseIndex: number + } { + return editionMode as { testCaseIndex: number } + } + + function changeAxes({ detail }) { + axes = detail + + let newVectorLength = 1 + for (const parallelAxes of axes) { + // All the parallel axes have the same count. + const axis = parallelAxes[0] + newVectorLength *= axis.count + } + $vectorLength = newVectorLength + + const situationIndex = $testCaseIndex + const newDecompositionByNameArray = [...$decompositionByNameArray] + newDecompositionByNameArray[situationIndex] = + updateDecompositionEvaluations( + newDecompositionByNameArray[situationIndex], + rootDecompositionName, + $deltaByNameArray[situationIndex], + $vectorIndexes[situationIndex], + newVectorLength, + ) + $decompositionByNameArray = newDecompositionByNameArray + if ($webSocketOpen) { + submit() + } + } + + function changeSituation(situationIndex: number, situation: Situation): void { + const situations = [...$testCases] + situations[situationIndex] = situation + $testCases = situations + // if ($webSocketOpen) { + // submit() + // } + } + + function changeVectorIndex({ detail }) { + const situationIndex = detail.situationIndex + const newVectorIndexes = [...$vectorIndexes] + newVectorIndexes[situationIndex] = detail.vectorIndex + $vectorIndexes = newVectorIndexes + const decompositionByName = $decompositionByNameArray[situationIndex] + const newDecompositionByName = updateVectorIndex( + decompositionByName, + detail.vectorIndex, + ) + if (newDecompositionByName !== decompositionByName) { + const newDecompositionByNameArray = [...$decompositionByNameArray] + newDecompositionByNameArray[situationIndex] = newDecompositionByName + $decompositionByNameArray = newDecompositionByNameArray + } + } + + function closeEditionPane() { + goto( + newSimulationUrl({ + ...query, + action: null, + }), + { noscroll: true }, + ) + } + + function editSituation({ detail: testCaseIndex }: { detail: number }): void { + goto( + newSimulationUrl({ + ...query, + action: `situations/${testCaseIndex}`, + }), + { noscroll: true }, + ) + } + + function editionModeFromAction(action: string | undefined | null) { + if (action != null) { + { + const match = /^situations\/(\d+)$/.exec(action) + if (match !== null) { + editionMode = { + mode: "test_case", + testCaseIndex: parseInt(match[1]), + } + return + } + } + + { + const match = /^situations\/(\d+)\/variables\/([^/]+)\/inputs$/.exec( + action, + ) + if (match !== null) { + editionMode = { + mode: "test_case_with_variable_inputs", + testCaseIndex: parseInt(match[1]), + variableName: match[2], + } + return + } + } + + { + const match = /^variables\/([^/]+)\/parameters$/.exec(action) + if (match !== null) { + editionMode = { + mode: "variable_parameters", + variableName: match[1], + } + return + } + } + } + + editionMode = null + } + + function ensureValidQuery(query: URLSearchParams): ValidSimulationQuery { + const [validQuery, queryError] = validateSimulationQuery(query) + if (queryError !== null) { + console.warn( + `Query error at ${$page.path}: ${JSON.stringify( + queryError, + null, + 2, + )}\n\n${JSON.stringify(validQuery, null, 2)}`, + ) + return {} + } + return validQuery + } + + function newSelfTargetAProps(urlPath: string): SelfTargetAProps { + if ( + urlPath.startsWith("/parameters/") || + urlPath.startsWith("/situations/") || + urlPath.startsWith("/variables/") + ) { + return { + href: newSimulationUrl({ + ...query, + action: urlPath.replace(/^\/+/, ""), + }), + "sveltekit:noscroll": true, + } + } + return { + href: urlPath, + "sveltekit:prefetch": true, + } + } + + function selectSituationVariable({ + detail, + }: { + detail: { testCaseIndex: number; variableName: string } + }): void { + const { testCaseIndex, variableName } = detail + const action = ["test_case", "test_case_with_variable_inputs"].includes( + editionMode?.mode, + ) + ? `situations/${testCaseIndex}/variables/${variableName}/inputs` + : `variables/${variableName}/parameters` + goto( + newSimulationUrl({ + ...query, + action, + }), + { noscroll: true }, + ) + } + + function submit() { + // Aggregate every situations into a single one without calculated variables. + const aggregatedSituation: SituationWithAxes = {} + const entities = Object.values($session.entityByKey as EntityByKey) + for (const [situationIndex, situation] of $testCases.entries()) { + const situationPrefix = `Cas type n°${situationIndex + 1} | ` + for (const entity of entities) { + let entitySituation = situation[entity.key_plural] + if (entitySituation === undefined) { + continue + } + let aggregatedEntitySituation = aggregatedSituation[entity.key_plural] + if (aggregatedEntitySituation === undefined) { + aggregatedEntitySituation = aggregatedSituation[entity.key_plural] = + {} + } + const reservedKeys = getPopulationReservedKeys(entity) + for (const [populationId, population] of Object.entries( + entitySituation, + ).sort(([populationId1], [populationId2]) => + populationId1.localeCompare(populationId2), + )) { + const transformedPopulation: PopulationWithoutId = {} + if (!entity.is_person) { + for (const role of (entity as GroupEntity).roles) { + const personsIdKey = getRolePersonsIdKey(role) + const personsId = population[personsIdKey] as string[] | undefined + if (personsId === undefined) { + continue + } + transformedPopulation[personsIdKey] = personsId.map( + (personId) => situationPrefix + personId, + ) + } + } + for (const [variableName, variableValueByInstant] of Object.entries( + population, + )) { + if (reservedKeys.has(variableName)) { + continue + } + const inputVariableValueByInstant: { + [instant: string]: boolean | number | string | null + } = {} + const inputInstants = + $inputInstantsByVariableName[variableName] ?? new Set<string>() + for (const [instant, variableValue] of Object.entries( + variableValueByInstant, + )) { + if (!inputInstants.has(instant)) { + // Ignore calculated value. + continue + } + inputVariableValueByInstant[instant] = variableValue + } + if (Object.keys(inputVariableValueByInstant).length > 0) { + transformedPopulation[variableName] = inputVariableValueByInstant + } + } + aggregatedEntitySituation[situationPrefix + populationId] = + transformedPopulation + } + } + } + + // // Remove calculated variables from aggregatedSituation. + // for (const entity of Object.values($session.entityByKey as EntityByKey)) { + // const reservedKeys = getPopulationReservedKeys(entity) + // let entitySituation = aggregatedSituation[entity.key_plural] + // if (entitySituation === undefined) { + // continue + // } + // entitySituation = aggregatedSituation[entity.key_plural] = { + // ...entitySituation, + // } + // for (const [populationId, population] of Object.entries(entitySituation)) { + // if (reservedKeys.has(populationId)) { + // continue + // } + // const variableValueByInstantByName = { ...population } + // for (const [variableName, variableValueByInstant] of Object.entries( + // variableValueByInstantByName, + // )) { + // const inputInstants = + // $inputInstantsByVariableName[variableName] + // if (inputInstants === undefined) { + // continue + // } + // const cleanedVariableValueByInstant = { + // ...(variableValueByInstant as { + // [instant: string]: string | number | boolean + // }), + // } + // for (const instant of Object.keys(cleanedVariableValueByInstant)) { + // if (!inputInstants.has(instant)) { + // delete cleanedVariableValueByInstant[instant] + // } + // } + // if (Object.keys(cleanedVariableValueByInstant).length === 0) { + // delete variableValueByInstantByName[variableName] + // } else { + // variableValueByInstantByName[variableName] = + // cleanedVariableValueByInstant + // } + // } + // } + // } + + if (axes.length > 0) { + aggregatedSituation.axes = axes + // Remove variables used as axes from situation (otherwise OpenFisca Core fails). + // for (const parallelAxes of axes) { + // nextAxis: for (const axis of parallelAxes) { + // const { index, name } = axis + + // let individuIndex = 0 + // for (let [individuName, individu] of Object.entries( + // aggregatedSituation.individus, + // )) { + // console.log(individuName) + // if (index === individuIndex && individu[name] !== undefined) { + // individu = { ...individu } + // delete individu[name] + // aggregatedSituation.individus = { + // ...aggregatedSituation.individus, + // } + // aggregatedSituation.individus[individuName] = individu // Preserve order of individu in individus. + // continue nextAxis + // } + // } + + // let familleIndex = 0 + // for (let [familleName, famille] of Object.entries( + // aggregatedSituation.familles, + // )) { + // if (index === familleIndex && famille[name] !== undefined) { + // famille = { ...famille } + // delete famille[name] + // aggregatedSituation.familles = { ...aggregatedSituation.familles } + // aggregatedSituation.familles[familleName] = famille // Preserve order of famille in familles. + // continue nextAxis + // } + // } + + // let foyerFiscalIndex = 0 + // for (let [foyerFiscalName, foyerFiscal] of Object.entries( + // aggregatedSituation.foyers_fiscaux, + // )) { + // if (index === foyerFiscalIndex && foyerFiscal[name] !== undefined) { + // foyerFiscal = { ...foyerFiscal } + // delete foyerFiscal[name] + // aggregatedSituation.foyers_fiscaux = { + // ...aggregatedSituation.foyers_fiscaux, + // } + // aggregatedSituation.foyers_fiscaux[foyerFiscalName] = foyerFiscal // Preserve order of foyerFiscal in foyersFiscaux. + // continue nextAxis + // } + // } + + // let menageIndex = 0 + // for (let [menageName, menage] of Object.entries( + // aggregatedSituation.menages, + // )) { + // if (index === menageIndex && menage[name] !== undefined) { + // menage = { ...menage } + // delete menage[name] + // aggregatedSituation.menages = { ...aggregatedSituation.menages } + // aggregatedSituation.menages[menageName] = menage // Preserve order of menage in menages. + // continue nextAxis + // } + // } + // } + // } + } + + $calculationToken = uuidv4() + $webSocket.send( + JSON.stringify({ + // reform: "PLF LFI", + reform: Object.keys($reform).length > 0 ? $reform : undefined, + situation: aggregatedSituation, + period: $year.toString(), + token: $calculationToken, + variables: decompositionsName, + }), + ) + $webSocket.send( + JSON.stringify({ + calculate: true, + }), + ) + } </script> <svelte:head> - <title>Page d'accueil| {$session.title}</title> + <title>Calculs | {$session.title}</title> </svelte:head> -<main> - <div - class="bg-cover flex items-center justify-center bg-fixed " - style="background-image: url('/image-fond-page-accueil.jpg')" - > - <div class="max-w-prose mb-26 m-16"> - <!-- call to action vers le simulateurs --> - <div> - <h1 class="font-bold pt-7 pb-8 text-3xl text-black"> - Estimer les impacts d'une modification <br />de la loi : - </h1> - <div class="inline-block w-full"> - <a - href="https://leximpact.an.fr/ir" - class="flex items-center border-black border-2 bg-white mb-4 p-1 pl-5 text-lg rounded-lg text-black font-bold shadow-md hover:bg-le-jaune hover:bg-opacity-20" - > - <img - class="mr-2" - width="70" - src="/picto-impot-sur-le-revenu.png" - alt="Pictogramme représentant une feuille d'impôt" - /> +<main class="fond h-screen"> + <div class="h-screen grid grid-cols-3 grid-rows-2 "> + <!-- Panneau de gauche les modifications de l'utilisateur (amendement et cas type)--> + <div + class="row-span-2 col-span-3 lg:col-span-1 bg-white shadow-md h-screen z-30" + > + <div class="bg-white h-full"> + {#if editionMode === null} + <div class="px-5 fixed bg-white pt-20 w-full lg:w-1/3"> + <div class="flex pt-6 justify-end "> + <!-- Bouton de fermeture de l'édition du cas type --> + <div> + <button on:click={closeEditionPane}> + <svg + class="fill-current text-gray-500 hover:text-gray-900" + xmlns="http://www.w3.org/2000/svg" + height="24px" + viewBox="0 0 24 24" + width="24px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" + /></svg + ></button + > + </div> + </div> + </div> + <div class="pt-40"> + <StartTutorial /> + </div> + {:else if editionMode.mode === "test_case"} + <div class="px-5 fixed bg-white mt-20 w-full lg:w-1/3"> + <div class="flex pt-6 justify-end"> + <!-- Bouton de fermeture de l'édition du cas type --> + <button on:click={closeEditionPane}> + <svg + class="fill-current text-gray-500 hover:text-gray-900" + xmlns="http://www.w3.org/2000/svg" + height="24px" + viewBox="0 0 24 24" + width="24px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" + /></svg + ></button + > + </div> - sur l'impôt sur le revenu - </a> - </div> - <div class="inline-block w-full"> - <a - href="https://leximpact.an.fr/dotations" - class="flex items-center border-black border-2 bg-white mb-4 p-1 pl-5 text-lg rounded-lg text-black font-bold shadow-md hover:bg-le-jaune hover:bg-opacity-20" - > - <img - class="mr-2" - width="70" - src="/picto-dotations-communes.png" - alt="Pictogramme représentant un panneau de circulation indiquant commune" - /> + <h1 class="text-3xl font-bold text-gray-600 pb-5 lg:pt-8"> + Configurer le cas type + </h1> + </div> - sur les dotations aux communes - </a> - </div> - <div class="inline-block w-full"> - <a - href="/simulation" - class="flex items-center border-black border-2 bg-white mb-4 p-1 pl-5 text-lg rounded-lg text-black shadow-md hover:bg-le-jaune hover:bg-opacity-20" - > - <img - class="mr-2" - width="70" - src="/picto-affaires-sociales.png" - alt="Pictogramme représentant une feuille de paie" + <div class="px-5 overflow-scroll h-screen pt-44 lg:pt-52 bg-white"> + <p class="text-sm my-4 text-gray-700 rounded bg-le-bleu-light p-2"> + 📌 Par défaut, toutes les caractéristiques du cas type sont + considérées comme étant stables depuis 2 ans. + </p> + + <TestCaseEdit + on:changeSituation={({ detail }) => + changeSituation( + asEditionModeWithTestCase(editionMode).testCaseIndex, + detail, + )} + situation={$testCases[editionMode.testCaseIndex]} + year={$year} /> - <div class="block sm:flex"> - <p class="font-bold"> - sur les cotisations & prestations sociales + + <h2 class="font-bold text-xl pt-3"> + Définir d'autres caractéristiques + </h2> + <div + class="bg-white border-le-bleu-light border-4 shadow-lg rounded-md my-5 mx-2" + > + <h1 + class="bg-le-bleu-light text-2xl font-light text-gray-600 py-3 px-4 " + > + Ajouter d'autres caractéristiques + </h1> + + <p class="py-2 px-4 font-light text-gray-600"> + Depuis les cas type à droite de l'interface, <span + class="font-normal">cliquez sur le nom d'un dispositif</span + > de la colonne de droite pour éditer les variables entrant dans + le calcul de ce dispositif. </p> - <p class=" italic">(en développement)</p> + + <div class="m-4"> + <img + src="/tutoriel-edition-cas-type-variables-supp.png" + alt="Tutoriel indiquant de cliquer sur un dispositif du cas type pour pouvoir ajouter d'autres caractéristiques au cas type." + /> + </div> </div> - </a> - </div> + </div> + {:else if editionMode.mode === "test_case_with_variable_inputs"} + <div class="px-5 fixed bg-white mt-20 w-full lg:w-1/3"> + <div class="flex justify-end pt-6"> + <!-- Bouton de fermeture de l'édition du cas type et des variables d'entrée--> + <button on:click={closeEditionPane}> + <svg + class="fill-current text-gray-500 hover:text-gray-900" + xmlns="http://www.w3.org/2000/svg" + height="24px" + viewBox="0 0 24 24" + width="24px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" + /></svg + ></button + > + </div> + <h1 class="text-3xl font-bold text-gray-600 pb-5 lg:pt-8"> + Configurer le cas type + </h1> + </div> + <div class="px-5 overflow-scroll h-screen pt-44 lg:pt-52 bg-white"> + <p class="text-sm my-4 text-gray-700 rounded bg-le-bleu-light p-2"> + 📌 Par défaut, toutes les caractéristiques du cas type sont + considérées comme étant stables depuis 2 ans. + </p> + + <TestCaseEdit + on:changeSituation={({ detail }) => + changeSituation( + asEditionModeWithTestCase(editionMode).testCaseIndex, + detail, + )} + situation={$testCases[editionMode.testCaseIndex]} + year={$year} + /> + <VariableReferredInputsPane + {date} + name={editionMode.variableName} + on:changeSituation={({ detail }) => + changeSituation( + asEditionModeWithTestCase(editionMode).testCaseIndex, + detail, + )} + situation={$testCases[editionMode.testCaseIndex]} + year={$year} + /> + </div> + {:else if editionMode.mode === "variable_parameters"} + <div class="px-5 fixed bg-white mt-20 w-full lg:w-1/3"> + <div class="flex pt-6 justify-end"> + <!-- Bouton de fermeture de l'édition des paramètres --> + <button on:click={closeEditionPane}> + <svg + class="fill-current text-gray-500 hover:text-gray-900" + xmlns="http://www.w3.org/2000/svg" + height="24px" + viewBox="0 0 24 24" + width="24px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" + /></svg + ></button + > + </div> + <h1 class="text-3xl font-bold text-gray-600 pb-5 lg:pt-8 "> + Amender la loi + </h1> + </div> + <!-- Menu quand on aura la version abrégée + <div class="flex space-x-8 mb-8"> + <div> + <a class="text-le-bleu text-base lg:text-lg " href=""> + L'essentiel abrégé + </a> + </div> + <div> + <a + class="text-le-bleu text-base lg:text-lg font-bold underline" + href="" + > + Ensemble des paramètres + </a> + </div> + </div> + --> + <div class="px-5 overflow-scroll h-screen pt-48 lg:pt-56 bg-white"> + <div class="bg-gray-100 pb-3"> + <VariableReferredParametersPane + {date} + name={editionMode.variableName} + /> + </div> + </div> + {/if} </div> </div> - </div> -</main> -<main class="bg-white"> - <div class="mr-10 ml-10 mt-10"> - <h2 class="m-5 pt-5 text-2xl text-black font-bold"> - Rechercher un chiffrage concernant : - </h2> - <div class="grid md:grid-cols-3"> - <div class="m-5 mb-0"> - <h3 class="pb-2 text-lg text-black font-extrabold"> - Une circonscription - </h3> - <p class="leading-normal font-serif pb-3 text-sm"> - LexImpact effectue une compilation de données INSEE par - circonscription et concernant divers sujets d'intérêt, tels que la - population, les entreprises ... - </p> - <p class="pb-2">🚧<span class="italic"> en développement</span></p> - <a - href="https://umap.openstreetmap.fr/fr/map/circodata-test-interface_623082" - class="inline-flex text-center border-2 bg-le-bleu-light mb-10 p-3 text-base justify-self-end rounded-lg - text-black shadow-md hover:bg-le-bleu hover:text-white" - > - Consulter des données<br />concernant ma circonscription <br /> - </a> - </div> - <div - class="hidden md:flex bg-contain bg-no-repeat .bg-bottom" - style="background-image: url('/image-circo-data.png')" - > - <div class="h-10" /> - </div> - <div class="m-5"> - <h3 class="pb-2 text-lg text-black font-extrabold"> - Un sujet spécifique - </h3> - <p class="leading-normal font-serif pb-3 text-sm "> - Vous êtes rattaché à l'Assemblée nationale (député, collaborateur, - administrateur) et ne trouvez pas votre réponse dans nos simulateurs - ou dans la base de ressources PDF ? - </p> - <p class="leading-normal font-serif pb-3 text-sm"> - Envoyez-nous votre besoin en chiffrage en complétant ce - <a - class="text-le-bleu underline hover:font-extrabold" - href="https://limesurvey.leximpact.dev/index.php/254182?lang=fr" + <!-- Panneau de droite pour les impacts et notamment le waterfall--> + <div class="row-span-2 col-span-3 lg:col-span-2 "> + <div class="fixed pt-24 lg:mt-20 lg:pt-4 fond lg:w-2/3 z-20 px-4 mx-1"> + <div class="flex justify-between mb-4"> + <label + ><input bind:checked={$adaptAmountsScale} type="checkbox" /> + <p class="hidden text-xs lg:inline text-gray-600"> + Échelle identique pour tous les cas types + </p> + <p class="lg:hidden text-xs inline text-gray-600 leading-none "> + Échelle identique cas types + </p></label > - rapide questionnaire - </a> - . - </p> + <div class="flex"> + <button + class="bg-gray-200 text-gray-900 shadow-md hover:bg-gray-400 px-5 mr-2 rounded p-2 uppercase text-sm" + on:click={submit} + > + <div class="flex justify-center"> + <!-- Material Icon Share --><svg + class="fill-current md:mr-2" + xmlns="http://www.w3.org/2000/svg" + height="18px" + viewBox="0 0 24 24" + width="18px" + fill="#000000" + ><path d="M0 0h24v24H0z" fill="none" /><path + d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z" + /></svg + > + <span class="hidden md:flex"> Sauvegarder / partager</span> + </div> + </button> + + <div class="justify-self-end"> + <button + class="bg-le-bleu text-white shadow-md hover:bg-blue-900 px-10 rounded p-2 uppercase text-sm" + on:click={submit}>Estimer</button + > + </div> + </div> + </div> + <h1 class="pt-3 text-3xl font-bold text-gray-600 pb-5 "> + Visualiser les cotis. & presta. sociales d'un cas type + </h1> </div> - </div> - </div> -</main> -<main class="bg-gray-700"> - <div class="mr-10 ml-10 mb-30"> - <h2 class="m-5 mt-0 pt-10 text-xl text-white ">À propos de LexImpact</h2> - <div class="grid md:grid-cols-3"> - <div class="m-5"> - <p class="text-white leading-relaxed font-serif pb-3 text-sm"> - LexImpact est un service de l'Assemblée nationale depuis 2020. Il a - pour objectif de faciliter l'accès au chiffrage des politiques - publiques passées ou à imaginer. - <a - class="text-white underline hover:font-extrabold" - href="/comment-fonctionnent-les-simulateurs">Lire plus.</a - > - </p> - <img - class="mt-5" - width="100" - src="/logo-assemblee-nationale-blanc.png" - alt="Logo de l'Assemblée nationale" + <!-- Cas types avec leur waterfall --> + <div class=" lg:pt-56 px-5 lg:h-screen h-full lg:overflow-scroll z-20"> + <TestCasesPane + on:changeAxes={changeAxes} + on:changeVectorIndex={changeVectorIndex} + on:editSituation={editSituation} + on:selectSituationVariable={selectSituationVariable} + year={$year} /> </div> - <div class="m-5"> - <p class="text-white leading-relaxed font-serif pb-3 text-sm"> - Pour comprendre comment fonctionne les simulateurs LexImpact, vous - pouvez consulter - <a - class="text-white underline hover:font-extrabold" - href="/comment-fonctionnent-les-simulateurs">cette page.</a - > - </p> - </div> - <div class="block m-5 ml-20"> - <h3 class="text-white block text-sm uppercase pb-5 tracking-widest"> - Simulateurs - </h3> - <a - class="text-white block text-sm pb-3 hover:underline" - href="/simulation" - > - Cotisations & prestations sociales - </a> - <a - class="text-white block text-sm pb-3 hover:underline" - href="https://leximpact.an.fr/ir" - > - Impôt sur le revenu - </a> - <a - class="text-white block text-sm pb-6 hover:underline" - href="https://leximpact.an.fr/dotations" - > - Dotations aux communes - </a> - <svg - width="300" - height="10" - viewBox="0 0 300 10" - xmlns="http://www.w3.org/2000/svg" - > - <line x1="200" y1="0" x2="0" y2="0" stroke-width="2" stroke="white" /> - </svg> - <a - class="text-white block text-sm pt-4 pb-3 hover:underline" - href="/stats" - > - Statistiques d'usage - </a> - <a class="text-white block text-sm pb-3 hover:underline" href="/cgu"> - Conditions d'utilisation - </a> - <a - class="text-white block text-sm pb-5 hover:underline" - href="/mentions-legales" - > - Mentions légales - </a> - </div> </div> </div> </main> + +<style> + .fond { + background-color: #ffffff; + /* Graph paper - Heropatterns.com échelle réduite */ + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 100 100'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%23ded500' fill-opacity='0.4'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); + } +</style> diff --git a/src/routes/mentions-legales.svelte b/src/routes/mentions-legales.svelte deleted file mode 100644 index 388f7a2444bf056b1b2418d8b4627787a8a2ff6a..0000000000000000000000000000000000000000 --- a/src/routes/mentions-legales.svelte +++ /dev/null @@ -1,39 +0,0 @@ -<script lang="ts"> - import { session } from "$app/stores" -</script> - -<svelte:head> - <title>Mentions légales | {$session.title}</title> -</svelte:head> - -<main class="flex items-center justify-center fond"> - <div class="bg-white p-10 max-w-screen-md "> - <div class=""> - <h1 class="font-serif font-bold pt-7 pb-3 text-3xl text-gray-700"> - Mentions légales - </h1> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">Éditeur</h2> - <p class="leading-normal pb-3 text-base text-justify"> - Service LexImpact, Direction de l'Évaluation et du Contrôle, Assemblée - nationale, <br />126, rue de l'Université - 75355 Paris 07 SP. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">Site internet</h2> - <p class="leading-normal pb-3 text-base text-justify"> - Directeur de la publication : Secrétaire général de l'Assemblée - nationale, Michel Moreau. - </p> - <h2 class="pb-3 pt-5 text-xl text-gray-700 font-bold">Hébergeur</h2> - <p class="leading-normal pb-3 text-base text-justify"> - Hébergé par Scaleway SAS BP 438 75366 Paris cedex 08 France - </p> - </div> - </div> -</main> - -<style> - .fond { - background-color: #ffffff; - /* Polka dots - Heropatterns.com échelle réduite */ - background-image: url("data:image/svg+xml,%3Csvg width='8' height='8' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ded500' fill-opacity='0.4' fill-rule='evenodd'%3E%3Ccircle cx='3' cy='3' r='3'/%3E%3Ccircle cx='13' cy='13' r='3'/%3E%3C/g%3E%3C/svg%3E"); - } -</style> diff --git a/src/routes/parameters/[parameter]/index.svelte b/src/routes/parameters/[parameter]/index.svelte index 11f8827136091f2d9cf5242b13242fa45b756d49..5db78418ecef9905c0311e0d7cb56e148228465e 100644 --- a/src/routes/parameters/[parameter]/index.svelte +++ b/src/routes/parameters/[parameter]/index.svelte @@ -39,7 +39,7 @@ </svelte:head> <a - href="/simulation" + href="/" class="inline-flex items-center bg-gray-200 my-5 p-1 pr-2 text-xs rounded text-black shadow-md hover:bg-gray-400" > diff --git a/src/routes/simulation.svelte b/src/routes/simulation.svelte index 8a5f3311604318fbba58209483537e244ced08ff..08f6ca5b22f6dfce37fd04b47ce29bec2211db95 100644 --- a/src/routes/simulation.svelte +++ b/src/routes/simulation.svelte @@ -1,739 +1,8 @@ -<script lang="ts"> - import type { EntityByKey, GroupEntity } from "@openfisca/ast" - import { getRolePersonsIdKey } from "@openfisca/ast" - import type Sockette from "sockette" - import { getContext, setContext } from "svelte" - import type { Writable } from "svelte/store" - import { writable } from "svelte/store" - import { v4 as uuidv4 } from "uuid" - - import { goto } from "$app/navigation" - import { page, session } from "$app/stores" - import { validateSimulationQuery } from "$lib/auditors/queries" - import type { ValidSimulationQuery } from "$lib/calculations" - import { newSimulationUrl } from "$lib/calculations" - import TestCaseEdit from "$lib/components/test_cases/TestCaseEdit.svelte" - import TestCasesPane from "$lib/components/test_cases/TestCasesPane.svelte" - import VariableReferredInputsPane from "$lib/components/variables/VariableReferredInputsPane.svelte" - import StartTutorial from "$lib/components/tutorial/StartTutorial.svelte" - import VariableReferredParametersPane from "$lib/components/variables/VariableReferredParametersPane.svelte" - import type { DecompositionByName } from "$lib/decompositions" - import { - updateDecompositionEvaluations, - updateVectorIndex, - } from "$lib/decompositions" - import type { ReformChange } from "$lib/reforms" - import type { - Axis, - PopulationWithoutId, - Situation, - SituationWithAxes, - } from "$lib/situations" - import { getPopulationReservedKeys } from "$lib/situations" - import type { SelfTargetAProps } from "$lib/urls" - - type EditionMode = - | { - mode: "variable_parameters" - variableName: string - } - | { - mode: "test_case" - testCaseIndex: number - } - | { - mode: "test_case_with_variable_inputs" - testCaseIndex: number - variableName: string - } - | null - - const action = writable(undefined) - setContext("action", action) - const adaptAmountsScale = writable(true) - setContext("adaptAmountsScale", adaptAmountsScale) - let axes: Axis[][] = [] - const date = new Date().toISOString().split("T")[0] - const decompositionByNameArray = getContext( - "decompositionByNameArray", - ) as Writable<DecompositionByName[]> - const decompositionsName = getContext("decompositionsName") as string[] - const deltaByNameArray = getContext("deltaByNameArray") as Writable< - Array<{ - [name: string]: number[] - }> - > - let editionMode: EditionMode = null - const inputInstantsByVariableName = getContext( - "inputInstantsByVariableName", - ) as Writable<{ - [name: string]: Set<string> - }> - setContext("newSelfTargetAProps", newSelfTargetAProps) - const reform = getContext("reform") as Writable<ReformChange> - const rootDecompositionName = $session.rootDecompositionName - const showNulls = writable(false) - setContext("showNulls", showNulls) - const simulationRequested = getContext( - "simulationRequested", - ) as Writable<boolean> - const testCaseIndex = getContext("testCaseIndex") as Writable<number> - const testCases = getContext("testCases") as Writable<Situation[]> - const calculationToken = getContext("calculationToken") as Writable< - string | undefined - > - const vectorIndexes = getContext("vectorIndexes") as Writable<number[]> - const vectorLength = getContext("vectorLength") as Writable<number> - const webSocket = getContext("webSocket") as Writable<Sockette | undefined> - const webSocketOpen = getContext("webSocketOpen") as Writable<boolean> - const year = getContext("year") as Writable<number> - - $: query = ensureValidQuery($page.query) - - $: $action = query.action - - $: if ($simulationRequested) { - $simulationRequested = false - submit() - } - - $: editionModeFromAction($action) - - function asEditionModeWithTestCase(editionMode: EditionMode): { - testCaseIndex: number - } { - return editionMode as { testCaseIndex: number } - } - - function changeAxes({ detail }) { - axes = detail - - let newVectorLength = 1 - for (const parallelAxes of axes) { - // All the parallel axes have the same count. - const axis = parallelAxes[0] - newVectorLength *= axis.count - } - $vectorLength = newVectorLength - - const situationIndex = $testCaseIndex - const newDecompositionByNameArray = [...$decompositionByNameArray] - newDecompositionByNameArray[situationIndex] = - updateDecompositionEvaluations( - newDecompositionByNameArray[situationIndex], - rootDecompositionName, - $deltaByNameArray[situationIndex], - $vectorIndexes[situationIndex], - newVectorLength, - ) - $decompositionByNameArray = newDecompositionByNameArray - if ($webSocketOpen) { - submit() - } - } - - function changeSituation(situationIndex: number, situation: Situation): void { - const situations = [...$testCases] - situations[situationIndex] = situation - $testCases = situations - // if ($webSocketOpen) { - // submit() - // } - } - - function changeVectorIndex({ detail }) { - const situationIndex = detail.situationIndex - const newVectorIndexes = [...$vectorIndexes] - newVectorIndexes[situationIndex] = detail.vectorIndex - $vectorIndexes = newVectorIndexes - const decompositionByName = $decompositionByNameArray[situationIndex] - const newDecompositionByName = updateVectorIndex( - decompositionByName, - detail.vectorIndex, - ) - if (newDecompositionByName !== decompositionByName) { - const newDecompositionByNameArray = [...$decompositionByNameArray] - newDecompositionByNameArray[situationIndex] = newDecompositionByName - $decompositionByNameArray = newDecompositionByNameArray - } - } - - function closeEditionPane() { - goto( - newSimulationUrl({ - ...query, - action: null, - }), - { noscroll: true }, - ) - } - - function editSituation({ detail: testCaseIndex }: { detail: number }): void { - goto( - newSimulationUrl({ - ...query, - action: `situations/${testCaseIndex}`, - }), - { noscroll: true }, - ) - } - - function editionModeFromAction(action: string | undefined | null) { - if (action != null) { - { - const match = /^situations\/(\d+)$/.exec(action) - if (match !== null) { - editionMode = { - mode: "test_case", - testCaseIndex: parseInt(match[1]), - } - return - } - } - - { - const match = /^situations\/(\d+)\/variables\/([^/]+)\/inputs$/.exec( - action, - ) - if (match !== null) { - editionMode = { - mode: "test_case_with_variable_inputs", - testCaseIndex: parseInt(match[1]), - variableName: match[2], - } - return - } - } - - { - const match = /^variables\/([^/]+)\/parameters$/.exec(action) - if (match !== null) { - editionMode = { - mode: "variable_parameters", - variableName: match[1], - } - return - } - } - } - - editionMode = null - } - - function ensureValidQuery(query: URLSearchParams): ValidSimulationQuery { - const [validQuery, queryError] = validateSimulationQuery(query) - if (queryError !== null) { - console.warn( - `Query error at ${$page.path}: ${JSON.stringify( - queryError, - null, - 2, - )}\n\n${JSON.stringify(validQuery, null, 2)}`, - ) - return {} - } - return validQuery - } - - function newSelfTargetAProps(urlPath: string): SelfTargetAProps { - if ( - urlPath.startsWith("/parameters/") || - urlPath.startsWith("/situations/") || - urlPath.startsWith("/variables/") - ) { - return { - href: newSimulationUrl({ - ...query, - action: urlPath.replace(/^\/+/, ""), - }), - "sveltekit:noscroll": true, - } - } +<script context="module" lang="ts"> + export async function load() { return { - href: urlPath, - "sveltekit:prefetch": true, + redirect: "/", + status: 301, // Moved Permanently } } - - function selectSituationVariable({ - detail, - }: { - detail: { testCaseIndex: number; variableName: string } - }): void { - const { testCaseIndex, variableName } = detail - const action = ["test_case", "test_case_with_variable_inputs"].includes( - editionMode?.mode, - ) - ? `situations/${testCaseIndex}/variables/${variableName}/inputs` - : `variables/${variableName}/parameters` - goto( - newSimulationUrl({ - ...query, - action, - }), - { noscroll: true }, - ) - } - - function submit() { - // Aggregate every situations into a single one without calculated variables. - const aggregatedSituation: SituationWithAxes = {} - const entities = Object.values($session.entityByKey as EntityByKey) - for (const [situationIndex, situation] of $testCases.entries()) { - const situationPrefix = `Cas type n°${situationIndex + 1} | ` - for (const entity of entities) { - let entitySituation = situation[entity.key_plural] - if (entitySituation === undefined) { - continue - } - let aggregatedEntitySituation = aggregatedSituation[entity.key_plural] - if (aggregatedEntitySituation === undefined) { - aggregatedEntitySituation = aggregatedSituation[entity.key_plural] = - {} - } - const reservedKeys = getPopulationReservedKeys(entity) - for (const [populationId, population] of Object.entries( - entitySituation, - ).sort(([populationId1], [populationId2]) => - populationId1.localeCompare(populationId2), - )) { - const transformedPopulation: PopulationWithoutId = {} - if (!entity.is_person) { - for (const role of (entity as GroupEntity).roles) { - const personsIdKey = getRolePersonsIdKey(role) - const personsId = population[personsIdKey] as string[] | undefined - if (personsId === undefined) { - continue - } - transformedPopulation[personsIdKey] = personsId.map( - (personId) => situationPrefix + personId, - ) - } - } - for (const [variableName, variableValueByInstant] of Object.entries( - population, - )) { - if (reservedKeys.has(variableName)) { - continue - } - const inputVariableValueByInstant: { - [instant: string]: boolean | number | string | null - } = {} - const inputInstants = - $inputInstantsByVariableName[variableName] ?? new Set<string>() - for (const [instant, variableValue] of Object.entries( - variableValueByInstant, - )) { - if (!inputInstants.has(instant)) { - // Ignore calculated value. - continue - } - inputVariableValueByInstant[instant] = variableValue - } - if (Object.keys(inputVariableValueByInstant).length > 0) { - transformedPopulation[variableName] = inputVariableValueByInstant - } - } - aggregatedEntitySituation[situationPrefix + populationId] = - transformedPopulation - } - } - } - - // // Remove calculated variables from aggregatedSituation. - // for (const entity of Object.values($session.entityByKey as EntityByKey)) { - // const reservedKeys = getPopulationReservedKeys(entity) - // let entitySituation = aggregatedSituation[entity.key_plural] - // if (entitySituation === undefined) { - // continue - // } - // entitySituation = aggregatedSituation[entity.key_plural] = { - // ...entitySituation, - // } - // for (const [populationId, population] of Object.entries(entitySituation)) { - // if (reservedKeys.has(populationId)) { - // continue - // } - // const variableValueByInstantByName = { ...population } - // for (const [variableName, variableValueByInstant] of Object.entries( - // variableValueByInstantByName, - // )) { - // const inputInstants = - // $inputInstantsByVariableName[variableName] - // if (inputInstants === undefined) { - // continue - // } - // const cleanedVariableValueByInstant = { - // ...(variableValueByInstant as { - // [instant: string]: string | number | boolean - // }), - // } - // for (const instant of Object.keys(cleanedVariableValueByInstant)) { - // if (!inputInstants.has(instant)) { - // delete cleanedVariableValueByInstant[instant] - // } - // } - // if (Object.keys(cleanedVariableValueByInstant).length === 0) { - // delete variableValueByInstantByName[variableName] - // } else { - // variableValueByInstantByName[variableName] = - // cleanedVariableValueByInstant - // } - // } - // } - // } - - if (axes.length > 0) { - aggregatedSituation.axes = axes - // Remove variables used as axes from situation (otherwise OpenFisca Core fails). - // for (const parallelAxes of axes) { - // nextAxis: for (const axis of parallelAxes) { - // const { index, name } = axis - - // let individuIndex = 0 - // for (let [individuName, individu] of Object.entries( - // aggregatedSituation.individus, - // )) { - // console.log(individuName) - // if (index === individuIndex && individu[name] !== undefined) { - // individu = { ...individu } - // delete individu[name] - // aggregatedSituation.individus = { - // ...aggregatedSituation.individus, - // } - // aggregatedSituation.individus[individuName] = individu // Preserve order of individu in individus. - // continue nextAxis - // } - // } - - // let familleIndex = 0 - // for (let [familleName, famille] of Object.entries( - // aggregatedSituation.familles, - // )) { - // if (index === familleIndex && famille[name] !== undefined) { - // famille = { ...famille } - // delete famille[name] - // aggregatedSituation.familles = { ...aggregatedSituation.familles } - // aggregatedSituation.familles[familleName] = famille // Preserve order of famille in familles. - // continue nextAxis - // } - // } - - // let foyerFiscalIndex = 0 - // for (let [foyerFiscalName, foyerFiscal] of Object.entries( - // aggregatedSituation.foyers_fiscaux, - // )) { - // if (index === foyerFiscalIndex && foyerFiscal[name] !== undefined) { - // foyerFiscal = { ...foyerFiscal } - // delete foyerFiscal[name] - // aggregatedSituation.foyers_fiscaux = { - // ...aggregatedSituation.foyers_fiscaux, - // } - // aggregatedSituation.foyers_fiscaux[foyerFiscalName] = foyerFiscal // Preserve order of foyerFiscal in foyersFiscaux. - // continue nextAxis - // } - // } - - // let menageIndex = 0 - // for (let [menageName, menage] of Object.entries( - // aggregatedSituation.menages, - // )) { - // if (index === menageIndex && menage[name] !== undefined) { - // menage = { ...menage } - // delete menage[name] - // aggregatedSituation.menages = { ...aggregatedSituation.menages } - // aggregatedSituation.menages[menageName] = menage // Preserve order of menage in menages. - // continue nextAxis - // } - // } - // } - // } - } - - $calculationToken = uuidv4() - $webSocket.send( - JSON.stringify({ - // reform: "PLF LFI", - reform: Object.keys($reform).length > 0 ? $reform : undefined, - situation: aggregatedSituation, - period: $year.toString(), - token: $calculationToken, - variables: decompositionsName, - }), - ) - $webSocket.send( - JSON.stringify({ - calculate: true, - }), - ) - } </script> - -<svelte:head> - <title>Calculs | {$session.title}</title> -</svelte:head> - -<main class="fond h-screen"> - <div class="h-screen grid grid-cols-3 grid-rows-2 "> - <!-- Panneau de gauche les modifications de l'utilisateur (amendement et cas type)--> - <div - class="row-span-2 col-span-3 lg:col-span-1 bg-white shadow-md h-screen z-30" - > - <div class="bg-white h-full"> - {#if editionMode === null} - <div class="px-5 fixed bg-white pt-20 w-full lg:w-1/3"> - <div class="flex pt-6 justify-end "> - <!-- Bouton de fermeture de l'édition du cas type --> - <div> - <button on:click={closeEditionPane}> - <svg - class="fill-current text-gray-500 hover:text-gray-900" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" - /></svg - ></button - > - </div> - </div> - </div> - <div class="pt-40"> - <StartTutorial /> - </div> - {:else if editionMode.mode === "test_case"} - <div class="px-5 fixed bg-white mt-20 w-full lg:w-1/3"> - <div class="flex pt-6 justify-end"> - <!-- Bouton de fermeture de l'édition du cas type --> - <button on:click={closeEditionPane}> - <svg - class="fill-current text-gray-500 hover:text-gray-900" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" - /></svg - ></button - > - </div> - - <h1 class="text-3xl font-bold text-gray-600 pb-5 lg:pt-8"> - Configurer le cas type - </h1> - </div> - - <div class="px-5 overflow-scroll h-screen pt-44 lg:pt-52 bg-white"> - <p class="text-sm my-4 text-gray-700 rounded bg-le-bleu-light p-2"> - 📌 Par défaut, toutes les caractéristiques du cas type sont - considérées comme étant stables depuis 2 ans. - </p> - - <TestCaseEdit - on:changeSituation={({ detail }) => - changeSituation( - asEditionModeWithTestCase(editionMode).testCaseIndex, - detail, - )} - situation={$testCases[editionMode.testCaseIndex]} - year={$year} - /> - - <h2 class="font-bold text-xl pt-3"> - Définir d'autres caractéristiques - </h2> - <div - class="bg-white border-le-bleu-light border-4 shadow-lg rounded-md my-5 mx-2" - > - <h1 - class="bg-le-bleu-light text-2xl font-light text-gray-600 py-3 px-4 " - > - Ajouter d'autres caractéristiques - </h1> - - <p class="py-2 px-4 font-light text-gray-600"> - Depuis les cas type à droite de l'interface, <span - class="font-normal">cliquez sur le nom d'un dispositif</span - > de la colonne de droite pour éditer les variables entrant dans - le calcul de ce dispositif. - </p> - - <div class="m-4"> - <img - src="/tutoriel-edition-cas-type-variables-supp.png" - alt="Tutoriel indiquant de cliquer sur un dispositif du cas type pour pouvoir ajouter d'autres caractéristiques au cas type." - /> - </div> - </div> - </div> - {:else if editionMode.mode === "test_case_with_variable_inputs"} - <div class="px-5 fixed bg-white mt-20 w-full lg:w-1/3"> - <div class="flex justify-end pt-6"> - <!-- Bouton de fermeture de l'édition du cas type et des variables d'entrée--> - <button on:click={closeEditionPane}> - <svg - class="fill-current text-gray-500 hover:text-gray-900" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" - /></svg - ></button - > - </div> - <h1 class="text-3xl font-bold text-gray-600 pb-5 lg:pt-8"> - Configurer le cas type - </h1> - </div> - <div class="px-5 overflow-scroll h-screen pt-44 lg:pt-52 bg-white"> - <p class="text-sm my-4 text-gray-700 rounded bg-le-bleu-light p-2"> - 📌 Par défaut, toutes les caractéristiques du cas type sont - considérées comme étant stables depuis 2 ans. - </p> - - <TestCaseEdit - on:changeSituation={({ detail }) => - changeSituation( - asEditionModeWithTestCase(editionMode).testCaseIndex, - detail, - )} - situation={$testCases[editionMode.testCaseIndex]} - year={$year} - /> - <VariableReferredInputsPane - {date} - name={editionMode.variableName} - on:changeSituation={({ detail }) => - changeSituation( - asEditionModeWithTestCase(editionMode).testCaseIndex, - detail, - )} - situation={$testCases[editionMode.testCaseIndex]} - year={$year} - /> - </div> - {:else if editionMode.mode === "variable_parameters"} - <div class="px-5 fixed bg-white mt-20 w-full lg:w-1/3"> - <div class="flex pt-6 justify-end"> - <!-- Bouton de fermeture de l'édition des paramètres --> - <button on:click={closeEditionPane}> - <svg - class="fill-current text-gray-500 hover:text-gray-900" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" - /></svg - ></button - > - </div> - <h1 class="text-3xl font-bold text-gray-600 pb-5 lg:pt-8 "> - Amender la loi - </h1> - </div> - <!-- Menu quand on aura la version abrégée - <div class="flex space-x-8 mb-8"> - <div> - <a class="text-le-bleu text-base lg:text-lg " href=""> - L'essentiel abrégé - </a> - </div> - <div> - <a - class="text-le-bleu text-base lg:text-lg font-bold underline" - href="" - > - Ensemble des paramètres - </a> - </div> - </div> - --> - <div class="px-5 overflow-scroll h-screen pt-48 lg:pt-56 bg-white"> - <div class="bg-gray-100 pb-3"> - <VariableReferredParametersPane - {date} - name={editionMode.variableName} - /> - </div> - </div> - {/if} - </div> - </div> - <!-- Panneau de droite pour les impacts et notamment le waterfall--> - <div class="row-span-2 col-span-3 lg:col-span-2 "> - <div class="fixed pt-24 lg:mt-20 lg:pt-4 fond lg:w-2/3 z-20 px-4 mx-1"> - <div class="flex justify-between mb-4"> - <label - ><input bind:checked={$adaptAmountsScale} type="checkbox" /> - <p class="hidden text-xs lg:inline text-gray-600"> - Échelle identique pour tous les cas types - </p> - <p class="lg:hidden text-xs inline text-gray-600 leading-none "> - Échelle identique cas types - </p></label - > - <div class="flex"> - <button - class="bg-gray-200 text-gray-900 shadow-md hover:bg-gray-400 px-5 mr-2 rounded p-2 uppercase text-sm" - on:click={submit} - > - <div class="flex justify-center"> - <!-- Material Icon Share --><svg - class="fill-current md:mr-2" - xmlns="http://www.w3.org/2000/svg" - height="18px" - viewBox="0 0 24 24" - width="18px" - fill="#000000" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z" - /></svg - > - <span class="hidden md:flex"> Sauvegarder / partager</span> - </div> - </button> - - <div class="justify-self-end"> - <button - class="bg-le-bleu text-white shadow-md hover:bg-blue-900 px-10 rounded p-2 uppercase text-sm" - on:click={submit}>Estimer</button - > - </div> - </div> - </div> - <h1 class="pt-3 text-3xl font-bold text-gray-600 pb-5 "> - Visualiser les cotis. & presta. sociales d'un cas type - </h1> - </div> - <!-- Cas types avec leur waterfall --> - <div class=" lg:pt-56 px-5 lg:h-screen h-full lg:overflow-scroll z-20"> - <TestCasesPane - on:changeAxes={changeAxes} - on:changeVectorIndex={changeVectorIndex} - on:editSituation={editSituation} - on:selectSituationVariable={selectSituationVariable} - year={$year} - /> - </div> - </div> - </div> -</main> - -<style> - .fond { - background-color: #ffffff; - /* Graph paper - Heropatterns.com échelle réduite */ - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 100 100'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%23ded500' fill-opacity='0.4'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - } -</style> diff --git a/src/routes/statistiques.svelte b/src/routes/statistiques.svelte deleted file mode 100644 index 42a2eb80b22c295f4d8571f0fc8facb608cbf06e..0000000000000000000000000000000000000000 --- a/src/routes/statistiques.svelte +++ /dev/null @@ -1,210 +0,0 @@ -<script lang="ts"> - import { session } from "$app/stores" - import { slide } from "svelte/transition" - - export let name = "" - export let group = "Item 1" - $: active = group === name -</script> - -<svelte:head> - <title>Statistiques d'usage | {$session.title}</title> -</svelte:head> - -<main class="flex items-center justify-center fond"> - <div class="bg-white max-w-screen-md p-10"> - <div class=" "> - <h1 class="font-serif font-bold pt-7 pb-10 text-3xl text-gray-700"> - Statistiques d'usage - </h1> - <p class="leading-normal pb-3 text-xl text-justify text-gray-800"> - Les données retenues ici témoignent du comportement général des usagers - sur le site et de leur engagement auprès du service. - </p> - <a - href="/a-propos" - class="inline-flex items-center bg-gray-200 mb-5 p-1 pr-2 text-base rounded - text-black shadow-md hover:bg-gray-400" - > - <!-- material icons - Arrow forward --> - <svg - class="flex mr-2 items-center" - xmlns="http://www.w3.org/2000/svg" - height="24px" - viewBox="0 0 24 24" - width="24px" - ><path d="M0 0h24v24H0z" fill="none" /><path - d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z" - /></svg - > - À propos de LexImpact - </a> - <div class="flex-col pt-10 items-center"> - <a - href="https://www.assemblee-nationale.fr/dyn/15/amendements?recherche_textuelle=leximpact" - > - <h2 class="pb-3 pt-10 text-8xl text-gray-700 font-bold text-center "> - <span - class="bg-le-jaune bg-opacity-40 hover:text-le-bleu hover:bg-transparent" - > - 40 - </span> - </h2> - </a> - <p - class="leading-normal font-bold pb-3 text-xl text-center text-gray-700" - > - amendements<br /> citent "LexImpact"* - </p> - <p class="leading-normal pb-3 text-sm text-center text-gray-400"> - *Ce groupe d'amendements peut contenir des doublons. - </p> - </div> - - <h2 class="pb-3 pt-10 text-xl text-black font-bold"> - LexImpact, employé dans le débat public - </h2> - <p class="leading-normal pb-3 text-base text-justify"> - Les calculs du simulateur de l'Impôt sur le revenu ont été repris en - commission au débat de loi de finances pour 2021 comme en témoignent, - par exemple, <a - class="hover:text-le-bleu underline " - href="https://www.assemblee-nationale.fr/dyn/15/comptes-rendus/seance/session-ordinaire-de-2020-2021/deuxieme-seance-du-lundi-12-octobre-2020#P2220670" - >ces échanges en séance du lundi 12 octobre 2020</a - >. - </p> - - <div class="bg-gray-100 py-5 my-2 rounded"> - <p class="italic text-justify px-10 pt-2">M. Jean-Noël Barrot :</p> - <p - class="font-serif font-light text-gray-700 italic text-justify px-10 " - > - « Nous éprouvons de la sympathie pour les amendements de ce genre, - même si nous n’avons pas souhaité en déposer en séance publique. Pour - la clarté des débats, <span class="bg-le-jaune bg-opacity-40" - >je tiens à signaler que le simulateur LexImpact, dont nous - disposons désormais, permet d’évaluer précisément le coût pour les - finances publiques de l’amendement de Mme Pires Beaune, qui - s’établit à 800 millions d’euros. - </span> (Exclamations sur les bancs du groupe SOC.) » - </p> - <p class="italic text-justify px-10 pt-2"> - Mme Christine Pires Beaune : - </p> - <p - class="font-serif font-light text-gray-700 italic text-justify px-10 " - > - « Ce sont 800 millions d’euros qui sont payés par les Français ! » - </p> - - <p class="italic text-justify px-10 pt-2">M. le président :</p> - <p - class="font-serif font-light text-gray-700 italic text-justify px-10 " - > - « La parole est à Mme Véronique Louwagie. » - </p> - <p class="italic text-justify px-10 pt-2">Mme Véronique Louwagie :</p> - <p - class="font-serif font-light text-gray-700 italic text-justify px-10 " - > - « Notre collègue vient de développer un argument en faveur de cet - amendement (« Eh oui ! » sur les bancs du groupe SOC), en exprimant - clairement qu’au titre de l’article 2, ce sont 800 millions d’euros - supplémentaires qui vont être prélevés sur les revenus des Français ! - » - </p> - <p class="italic text-justify px-10 pt-2">Mme Valérie Rabault :</p> - <p - class="font-serif font-light text-gray-700 italic text-justify px-10 " - > - « Exactement ! » - </p> - <p class="italic text-justify px-10 pt-2"> - M. Laurent Saint-Martin, rapporteur général : - </p> - <p - class="font-serif font-light text-gray-700 italic text-justify px-10 " - > - « Quant à cette série d’amendements sur le quotient familial, faites - attention. <span class="bg-le-jaune bg-opacity-40" - >J’ai fait quelques simulations avec LexImpact pour évaluer leurs - effets</span - > - – cela fera plaisir à notre collègue Jean-Noël Barrot. - <span class="bg-le-jaune bg-opacity-40" - >Seules les familles avec trois enfants et un revenu mensuel d’au - moins 7 000 euros bénéficieraient du dispositif, qui ne concernerait - donc que les catégories plutôt aisées de la population.</span - > Ce n’est pas la priorité, durant cette crise. » - </p> - </div> - - <h2 class="pb-3 pt-10 text-xl text-black font-bold"> - Un périmètre qui s'agrandit progressivement - </h2> - <p> - Le périmètre des lois traité par les simulateurs LexImpact est composé - de l'impôt sur le revenu et du quotien familial ainsi que du calcul de - certaines des dotations aux communes (dotation forfaitaire, dotation de - solidarité rural et dotation de solidarité urbaine). - </p> - - <div class="flex items-center gap-16"> - <div class="w-1/2"> - <h2 class="pb-3 pt-10 text-7xl text-gray-700 font-bold text-center "> - <span class="bg-le-jaune bg-opacity-40"> 1040 </span> - </h2> - <p - class="leading-normal font-bold pb-3 text-xl text-center text-gray-700" - > - Nombre de visites de la page d'accueil LexImpact* - </p> - <p class="leading-normal pb-3 text-sm text-center text-gray-400"> - * Entre le 1er octobre 2020 et le 07 décembre 2020 - </p> - </div> - <div class="w-1/2"> - <h2 class="pb-3 pt-10 text-5xl text-gray-700 font-bold text-center "> - 100 - </h2> - <p - class="leading-normal font-bold pb-3 text-base text-center text-gray-700" - > - Nombre de clics** <br />sur le bouton "Estimer" <br />du - <a - class="underline hover:text-le-bleu" - href="https://leximpact.an.fr/ir" - >simulateur Impôt sur le revenu</a - >. - </p> - - <h2 class="pb-3 pt-10 text-5xl text-gray-700 font-bold text-center "> - 140 - </h2> - <p - class="leading-normal font-bold pb-3 text-base text-center text-gray-700" - > - Nombre de clics** <br /> sur le bouton "Estimer" <br />du - <a - class="underline hover:text-le-bleu" - href="https://leximpact.an.fr/dotations" - > - simulateur Dotations aux communes</a - >. - </p> - <p class="leading-normal pb-3 pt-5 text-sm text-center text-gray-400"> - **Entre le 27 octobre 2020 et le 07 décembre 2020 - </p> - </div> - </div> - </div> - </div> -</main> - -<style> - .fond { - background-color: #ffffff; - /* Polka dots - Heropatterns.com échelle réduite */ - background-image: url("data:image/svg+xml,%3Csvg width='8' height='8' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ded500' fill-opacity='0.4' fill-rule='evenodd'%3E%3Ccircle cx='3' cy='3' r='3'/%3E%3Ccircle cx='13' cy='13' r='3'/%3E%3C/g%3E%3C/svg%3E"); - } -</style> diff --git a/src/routes/variables/[variable]/index.svelte b/src/routes/variables/[variable]/index.svelte index 0f1b80a41c23280d3ff3019a6fe20a290ddc9bb5..299d8c1656841647c92a2e99c5773645a89a6913 100644 --- a/src/routes/variables/[variable]/index.svelte +++ b/src/routes/variables/[variable]/index.svelte @@ -51,7 +51,7 @@ <main class="flex items-center justify-center fond"> <div class="bg-white max-w-screen-md p-10 "> <a - href="/simulation" + href="/" class="inline-flex items-center bg-gray-200 my-5 p-1 pr-2 text-xs rounded text-black shadow-md hover:bg-gray-400" > diff --git a/static/image-circo-data.png b/static/image-circo-data.png deleted file mode 100644 index 1bf2a493f939ad0714545e8829971279aeb07105..0000000000000000000000000000000000000000 Binary files a/static/image-circo-data.png and /dev/null differ diff --git a/static/image-fond-page-accueil.jpg b/static/image-fond-page-accueil.jpg deleted file mode 100644 index 8e755a74c56d58e5cc4ec86863e2a7681bc19134..0000000000000000000000000000000000000000 Binary files a/static/image-fond-page-accueil.jpg and /dev/null differ diff --git a/static/logo-assemblee-nationale-blanc.png b/static/logo-assemblee-nationale-blanc.png deleted file mode 100644 index 280c5b433f7ec3d452948a2f44728217241ae539..0000000000000000000000000000000000000000 Binary files a/static/logo-assemblee-nationale-blanc.png and /dev/null differ diff --git a/static/logo-assemblee-nationale.png b/static/logo-assemblee-nationale.png deleted file mode 100644 index 207989ae03c96bcab5f6157f4c3a0c5ae1e2dace..0000000000000000000000000000000000000000 Binary files a/static/logo-assemblee-nationale.png and /dev/null differ diff --git a/static/logo_100x100.png b/static/logo_100x100.png deleted file mode 100644 index 45894c80057e252c83291f05d27492933374fca6..0000000000000000000000000000000000000000 Binary files a/static/logo_100x100.png and /dev/null differ diff --git a/static/picto-affaires-sociales.png b/static/picto-affaires-sociales.png deleted file mode 100644 index 6872b1bb1b496ac7b01a98763145767a64e31648..0000000000000000000000000000000000000000 Binary files a/static/picto-affaires-sociales.png and /dev/null differ diff --git a/static/picto-circo-data.png b/static/picto-circo-data.png deleted file mode 100644 index 411461708a9d8772881cb35dee1b5b28eac5480f..0000000000000000000000000000000000000000 Binary files a/static/picto-circo-data.png and /dev/null differ diff --git a/static/picto-dotations-communes.png b/static/picto-dotations-communes.png deleted file mode 100644 index 7212604782728b3db572582551e2c562aaf377df..0000000000000000000000000000000000000000 Binary files a/static/picto-dotations-communes.png and /dev/null differ diff --git a/static/picto-impot-sur-le-revenu.png b/static/picto-impot-sur-le-revenu.png deleted file mode 100644 index 75f07056b0462a7c31601a110df03f207c1451dd..0000000000000000000000000000000000000000 Binary files a/static/picto-impot-sur-le-revenu.png and /dev/null differ diff --git a/static/schema-explicatif-fonctionnement-simulateurs.png b/static/schema-explicatif-fonctionnement-simulateurs.png deleted file mode 100644 index aa2942dde7e0251192c3cde99f0e63855c6e2617..0000000000000000000000000000000000000000 Binary files a/static/schema-explicatif-fonctionnement-simulateurs.png and /dev/null differ diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 8840129671d18214ff0c678d232bc07125087e51..646706ba10876433f76a2816dcb1a311f668ee49 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -1,23 +1,9 @@ const colors = require("tailwindcss/colors") -const { tailwindExtractor } = require("tailwindcss/lib/lib/purgeUnusedStyles") -module.exports = { +const config = { mode: "jit", plugins: [require("@tailwindcss/forms")], - purge: { - content: ["./src/**/*.{html,js,svelte,ts}"], - options: { - defaultExtractor: (content) => [ - // If this stops working, please open an issue at https://github.com/svelte-add/tailwindcss/issues rather than bothering Tailwind Labs about it - ...tailwindExtractor(content), - // Match Svelte class: directives (https://github.com/tailwindlabs/tailwindcss/discussions/1731) - ...[...content.matchAll(/(?:class:)*([\w\d-/:%.]+)/gm)].map( - ([_match, group, ..._rest]) => group, - ), - ], - keyframes: true, - }, - }, + purge: ["./src/**/*.{html,js,svelte,ts}"], theme: { extend: { colors: { @@ -46,3 +32,5 @@ module.exports = { extend: {}, }, } + +module.exports = config