diff --git a/src/lib/components/budget/BudgetDetailView.svelte b/src/lib/components/budget/BudgetDetailView.svelte index ee274caed125c9e8230a36911fe9dcfa88566b85..312aa697eea59657c113e7ccebc8aaacfa2fb6ed 100644 --- a/src/lib/components/budget/BudgetDetailView.svelte +++ b/src/lib/components/budget/BudgetDetailView.svelte @@ -18,7 +18,9 @@ import type { VariableValueByCalculationName } from "$lib/variables" export let budgetSimulation: BudgetSimulation - export let secu: boolean = false //Si le dispositif concerne la sécurité sociale + // regime? organisme? + // export let regime: "etat" | "securite_sociale" | "agirc_arrco" + export let secu: boolean = false // Si le dispositif concerne la sécurité sociale export let type: "prelevement" | "prestation" | "csg" export let unzoomFactor: number = 1 export let variableLabels: { @@ -905,10 +907,10 @@ /></span >de recettes {#if !secu} - pour l'État + pour l'État. {:else} - pour la Sécurité sociale - {/if}. + pour la Sécurité sociale. + {/if} {:else if (!showAmendment || yFromQuantile(amendmentQuantile) < 0) && (!showBill || yFromQuantile(billQuantile) < 0) && yFromQuantile(lawQuantile) < 0} perçoit <span class="text-xl font-bold" ><ValueChange @@ -989,10 +991,10 @@ /></span >de recettes {#if !secu} - pour l'État + pour l'État. {:else} - pour la Sécurité sociale - {/if}. + pour la Sécurité sociale. + {/if} {/if} {:else} représente <span class="text-xl font-bold" @@ -1018,10 +1020,10 @@ > {variableLabels.of} {#if !secu} - pour l'État + pour l'État. {:else} - pour la Sécurité sociale - {/if}. + pour la Sécurité sociale. + {/if} {/if} </p> <p class="mt-2 text-sm text-gray-600"> diff --git a/src/lib/components/budget/BudgetLayout.svelte b/src/lib/components/budget/BudgetLayout.svelte index 2840dd1bd02e3ba701a88ac31b537810a4ff937d..28ee46a6f8b361a5202cc8c2205da2b9ed95707e 100644 --- a/src/lib/components/budget/BudgetLayout.svelte +++ b/src/lib/components/budget/BudgetLayout.svelte @@ -5,13 +5,33 @@ import Tooltip from "$lib/components/Tooltip.svelte" import type { DisplayMode } from "$lib/displays" import { newSimulationUrl } from "$lib/urls" + import { budgetVariablesNameByGroup } from "$lib/variables" - export let budgetSimulation: BudgetSimulation + export let budgetSimulation: BudgetSimulation | undefined export let displayMode: DisplayMode + + $: budgetVariableGroupByName = Object.fromEntries( + Object.entries(budgetVariablesNameByGroup).reduce( + (arr: [string, string][], curr: [string, Set<string>]) => { + const group = curr[0] + const variables = curr[1] + for (const variable of variables) { + arr.push([variable, group]) + } + return arr + }, + [], + ), + ) + + $: budgetVariable = displayMode.parametersVariableName + ? budgetVariableGroupByName[displayMode.parametersVariableName] ?? + displayMode.parametersVariableName + : undefined </script> -{#if displayMode.parametersVariableName !== undefined} - {#if displayMode.parametersVariableName === "irpp_economique"} +{#if budgetVariable !== undefined} + {#if budgetVariable === "irpp_economique" && budgetSimulation !== undefined} <h3 class="mx-4 mb-2 text-2xl font-bold md:mx-0">Impôt sur le revenu</h3> <BudgetDetailView {budgetSimulation} @@ -22,7 +42,7 @@ ofThe: "de l'IR", the: "l'IR", }} - variableName="irpp_economique" + variableName={budgetVariable} > <span slot="title"> Recettes pour l'État </span> <span slot="description"> @@ -67,7 +87,7 @@ of: "de l'IR", }} /> - {:else if ["csg_deductible_retraite", "csg_imposable_retraite", "csg_retraite"].includes(displayMode.parametersVariableName)} + {:else if budgetVariable === "csg_retraite" && budgetSimulation !== undefined} <h3 class="mx-4 mb-2 text-2xl font-bold md:mx-0"> CSG totale prélevée sur les retraites <br /><span class="text-xl font-normal">Imposable et déductible</span> @@ -82,7 +102,7 @@ ofThe: "de CSG sur les retraites", the: "la CSG", }} - variableName="csg_retraite" + variableName={budgetVariable} > <span slot="title"> Recettes pour la Sécurité sociale </span> <span slot="description"> @@ -138,7 +158,7 @@ of: "de CSG retraites", }} /> - {:else if ["csg_deductible_salaire", "csg_imposable_salaire", "csg_salaire"].includes(displayMode.parametersVariableName)} + {:else if budgetVariable === "csg_salaire" && budgetSimulation !== undefined} <h3 class="mx-4 mb-2 text-2xl font-bold md:mx-0"> CSG totale prélevée sur les salaires <br /><span class="text-xl font-normal">Imposable et déductible</span> @@ -153,7 +173,7 @@ ofThe: "de CSG sur les salaires", the: "la CSG", }} - variableName="csg_salaire" + variableName={budgetVariable} > <span slot="title"> Recettes pour la Sécurité sociale </span> <span slot="description"> @@ -209,7 +229,7 @@ of: "de CSG salaires", }} /> - {:else if ["af", "af_base", "af_majoration", "af_allocation_forfaitaire", "af_complement_degressif", "af_allocation_forfaitaire_complement_degressif"].includes(displayMode.parametersVariableName)} + {:else if budgetVariable === "af" && budgetSimulation !== undefined} <h3 class="mx-4 mb-2 text-2xl font-bold md:mx-0"> Allocations familiales brutes </h3> @@ -224,7 +244,7 @@ ofThe: "des allocations familiales", the: "les allocations familiales", }} - variableName="af" + variableName={budgetVariable} > <span slot="title" >Dépenses des allocations familiales pour la Sécurité sociale</span @@ -281,7 +301,7 @@ of: "d'allocations familiales", }} /> - {:else if displayMode.parametersVariableName === "af_nettes_crds"} + {:else if budgetVariable === "af_nettes_crds"} <div class="w-screen md:w-full mx-4 text-center md:text-left"> <h3 class="mb-2 text-2xl font-bold">Estimer l'impact budgétaire</h3> <p class="text-base text-black max-w-prose"> @@ -300,5 +320,111 @@ </a> </div> </div> + <!-- TODO: modify title, description and variable labels, regime --> + {:else if budgetVariable === "agirc_arrco_salarie" && budgetSimulation !== undefined} + <h3 class="mx-4 mb-2 text-2xl font-bold md:mx-0"> + Cotisations salariales au régime de retraite complémentaire des salariés + du secteur privé + </h3> + <BudgetDetailView + {budgetSimulation} + type="prelevement" + variableLabels={{ + default: "Cotisations salariales", + of: "de cotisations salariales", + ofThe: "des cotisations salariales", + the: "les cotisations salariales", + }} + variableName={budgetVariable} + > + <span slot="title"> Recettes pour l'État </span> + <span slot="description"> Recettes de cotisations salariales </span> + </BudgetDetailView> + <GagnantsPerdantsView + {budgetSimulation} + type="prelevement" + variableLabels={{ + default: "les cotisations salariales", + of: "de cotisations salariales", + }} + /> + {:else if budgetVariable === "contribution_equilibre_general_salarie" && budgetSimulation !== undefined} + <h3 class="mx-4 mb-2 text-2xl font-bold md:mx-0"> + Contribution d'équilibre général (CEG) à la charge du salarié + </h3> + <BudgetDetailView + {budgetSimulation} + type="prelevement" + variableLabels={{ + default: "Cotisations salariales", + of: "de cotisations salariales", + ofThe: "des cotisations salariales", + the: "les cotisations salariales", + }} + variableName={budgetVariable} + > + <span slot="title"> Recettes pour l'État </span> + <span slot="description"> Recettes de cotisations salariales </span> + </BudgetDetailView> + <GagnantsPerdantsView + {budgetSimulation} + type="prelevement" + variableLabels={{ + default: "les cotisations salariales", + of: "de cotisations salariales", + }} + /> + {:else if budgetVariable === "vieillesse_deplafonnee_salarie" && budgetSimulation !== undefined} + <h3 class="mx-4 mb-2 text-2xl font-bold md:mx-0"> + Cotisation salariale d'assurance vieillesse déplafonnée + </h3> + <BudgetDetailView + {budgetSimulation} + type="prelevement" + variableLabels={{ + default: "Cotisations salariales", + of: "de cotisations salariales", + ofThe: "des cotisations salariales", + the: "les cotisations salariales", + }} + variableName={budgetVariable} + > + <span slot="title"> Recettes pour l'État </span> + <span slot="description"> Recettes de cotisations salariales </span> + </BudgetDetailView> + <GagnantsPerdantsView + {budgetSimulation} + type="prelevement" + variableLabels={{ + default: "les cotisations salariales", + of: "de cotisations salariales", + }} + /> + {:else if budgetVariable === "vieillesse_plafonnee_salarie" && budgetSimulation !== undefined} + <h3 class="mx-4 mb-2 text-2xl font-bold md:mx-0"> + Cotisation salariale d'assurance vieillesse plafonnée + </h3> + <BudgetDetailView + {budgetSimulation} + type="prelevement" + variableLabels={{ + default: "Cotisations salariales", + of: "de cotisations salariales", + ofThe: "des cotisations salariales", + the: "les cotisations salariales", + }} + variableName={budgetVariable} + > + <span slot="title"> Recettes pour l'État </span> + <span slot="description"> Recettes de cotisations salariales </span> + </BudgetDetailView> + <GagnantsPerdantsView + {budgetSimulation} + type="prelevement" + variableLabels={{ + default: "les cotisations salariales", + of: "de cotisations salariales", + }} + /> {/if} {/if} diff --git a/src/lib/variables.ts b/src/lib/variables.ts index b05eafbf3a95ce2fc111812c2b42e07f3a573a73..478ce0391c210499d0db58daf68a52d9993b17c8 100644 --- a/src/lib/variables.ts +++ b/src/lib/variables.ts @@ -189,7 +189,13 @@ for (const parametersName of Object.values( } } +// Variables dont l'impact budgétaire peut être calculé +// (pas vraiment, mais pour lesquelles on montre un impact budgétaire) export const budgetVariablesName = new Set([ + "agirc_arrco_salarie", + "contribution_equilibre_general_salarie", + "vieillesse_deplafonnee_salarie", + "vieillesse_plafonnee_salarie", "csg_deductible_retraite", "csg_deductible_salaire", "csg_imposable_retraite", @@ -205,6 +211,32 @@ export const budgetVariablesName = new Set([ "af_allocation_forfaitaire_complement_degressif", ]) +// Variables groupées par l'impact budgétaire commun qu'elles partagent (celle du nom du groupe) : +// l'impact budgétaire des variables "filles" d'un groupe correspond à celui de la variable "parent" de ce groupe +export const budgetVariablesNameByGroup = { + af: new Set([ + "af", + "af_base", + "af_majoration", + "af_allocation_forfaitaire", + "af_complement_degressif", + "af_allocation_forfaitaire_complement_degressif", + ]), + csg_retraite: new Set([ + "csg_retraite", + "csg_deductible_retraite", + "csg_imposable_retraite", + ]), + csg_salaire: new Set([ + "csg_salaire", + "csg_deductible_salaire", + "csg_imposable_salaire", + ]), +} + +// Variables dont l'impact budgétaire ne peut pas être calculé mais qui ont un layout custom +export const budgetVariablesNameRelated = new Set(["af_nettes_crds"]) + export const oilTypes = [ "essence_sp95", "essence_sp95_e10", diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 8e6c17da14e85e50bbd3ea08a3b2835b58033a6a..d3c2221523de8b8b4f106353d23adb83ea177470 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -70,6 +70,7 @@ type ValuesByCalculationNameByVariableName, type VariableValue, type VariableValues, + budgetVariablesNameByGroup, } from "$lib/variables" export let data: LayoutData @@ -328,95 +329,75 @@ $showTutorial = localStorage.getItem("hideTutorial") === null } + function buildBudgetDemandBody( + variableName: string, + outputVariables: string[], + quantileVaseVariable: string[], + quantileCompareVariables: string[], + ) { + const budgetParametricReform = Object.fromEntries( + Object.entries($parametricReform).filter(([parameterName]) => + budgetEditableParametersName.has(parameterName), + ), + ) + return { + amendement: budgetParametricReform, + base: 2024, + displayMode: $displayMode, + metadata, + output_variables: outputVariables, + quantile_base_variable: quantileVaseVariable, + quantile_compare_variables: quantileCompareVariables, + winners_loosers_variable: variableName, + quantile_nb: 10, + plf: $billName === undefined ? undefined : 2024, + } + } + async function calculateBudget( budgetVariableName: string, // budgetCalculationNames: Set<CalculationName>, ): Promise<void> { budgetSimulationAbortController.abort() budgetSimulationAbortController = new AbortController() - const budgetParametricReform = Object.fromEntries( - Object.entries($parametricReform).filter(([parameterName]) => - budgetEditableParametersName.has(parameterName), - ), - ) const body = JSON.stringify( budgetVariableName === "irpp_economique" - ? { - amendement: budgetParametricReform, - base: 2024, - displayMode: $displayMode, - metadata, - output_variables: ["rfr_par_part", "irpp_economique"], - quantile_base_variable: ["rfr_par_part"], - quantile_compare_variables: ["irpp_economique", "rfr"], - winners_loosers_variable: "irpp_economique", - quantile_nb: 10, - plf: $billName === undefined ? undefined : 2024, - } - : [ - "csg_deductible_retraite", - "csg_imposable_retraite", + ? buildBudgetDemandBody( + "irpp_economique", + ["rfr_par_part", "irpp_economique"], + ["rfr_par_part"], + ["irpp_economique", "rfr"], + ) + : [...budgetVariablesNameByGroup["csg_retraite"]].includes( + budgetVariableName, + ) + ? buildBudgetDemandBody( "csg_retraite", - ].includes(budgetVariableName) - ? { - amendement: budgetParametricReform, - base: 2024, - displayMode: $displayMode, - metadata, - output_variables: [ + [ "rfr_par_part", // "assiette_csg_abattue", "csg_deductible_retraite", "csg_imposable_retraite", ], - quantile_base_variable: ["rfr_par_part"], // ["assiette_csg_abattue"], - quantile_compare_variables: [ - "csg_deductible_retraite", - "csg_imposable_retraite", - "rfr", - ], - winners_loosers_variable: "csg_retraite", - quantile_nb: 10, - plf: $billName === undefined ? undefined : 2024, - } - : [ - "csg_deductible_salaire", - "csg_imposable_salaire", + ["rfr_par_part"], // ["assiette_csg_abattue"], + ["csg_deductible_retraite", "csg_imposable_retraite", "rfr"], + ) + : [...budgetVariablesNameByGroup["csg_salaire"]].includes( + budgetVariableName, + ) + ? buildBudgetDemandBody( "csg_salaire", - ].includes(budgetVariableName) - ? { - amendement: budgetParametricReform, - displayMode: $displayMode, - base: 2024, - metadata, - output_variables: [ + [ "rfr_par_part", // "assiette_csg_abattue", "csg_deductible_salaire", "csg_imposable_salaire", ], - quantile_base_variable: ["rfr_par_part"], // ["assiette_csg_abattue"], - quantile_compare_variables: [ - "csg_deductible_salaire", - "csg_imposable_salaire", - "rfr", - ], - winners_loosers_variable: "csg_salaire", - quantile_nb: 10, - plf: $billName === undefined ? undefined : 2024, - } - : [ + ["rfr_par_part"], // ["assiette_csg_abattue"], + ["csg_deductible_salaire", "csg_imposable_salaire", "rfr"], + ) + : [...budgetVariablesNameByGroup["af"]].includes(budgetVariableName) + ? buildBudgetDemandBody( "af", - "af_base", - "af_majoration", - "af_allocation_forfaitaire", - "af_complement_degressif", - "af_allocation_forfaitaire_complement_degressif", - ].includes(budgetVariableName) - ? { - amendement: budgetParametricReform, - displayMode: $displayMode, - base: 2024, - metadata, - output_variables: [ + [ "revenus_menage_par_uc", "af", "af_base", @@ -425,15 +406,44 @@ "af_complement_degressif", "af_allocation_forfaitaire_complement_degressif", ], - quantile_base_variable: ["revenus_menage_par_uc"], - quantile_compare_variables: ["af", "revenus_menage"], - winners_loosers_variable: "af", - quantile_nb: 10, - plf: $billName === undefined ? undefined : 2024, - } - : { - // Should never occur. - }, + ["revenus_menage_par_uc"], + ["af", "revenus_menage"], + ) + : budgetVariableName === "agirc_arrco_salarie" + ? buildBudgetDemandBody( + "agirc_arrco_salarie", + ["rfr_par_part", "agirc_arrco_salarie"], + ["rfr_par_part"], + ["agirc_arrco_salarie", "rfr"], + ) + : budgetVariableName === + "contribution_equilibre_general_salarie" + ? buildBudgetDemandBody( + "contribution_equilibre_general_salarie", + [ + "rfr_par_part", + "contribution_equilibre_general_salarie", + ], + ["rfr_par_part"], + ["contribution_equilibre_general_salarie", "rfr"], + ) + : budgetVariableName === "vieillesse_deplafonnee_salarie" + ? buildBudgetDemandBody( + "vieillesse_deplafonnee_salarie", + ["rfr_par_part", "vieillesse_deplafonnee_salarie"], + ["rfr_par_part"], + ["vieillesse_deplafonnee_salarie", "rfr"], + ) + : budgetVariableName === "vieillesse_plafonnee_salarie" + ? buildBudgetDemandBody( + "vieillesse_plafonnee_salarie", + ["rfr_par_part", "vieillesse_plafonnee_salarie"], + ["rfr_par_part"], + ["vieillesse_plafonnee_salarie", "rfr"], + ) + : { + // Should never occur. + }, null, 2, ) diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 6129f8a5a383b3685e95f8c43e2a153c3fe9209c..0cf5d6599d8ff707f978eb340013d7e56308f65f 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -48,7 +48,6 @@ import TestCaseSummary from "$lib/components/test_cases/TestCaseSummary.svelte" import TestCaseView from "$lib/components/test_cases/TestCaseView.svelte" import TestCaseSimulationSharingModal from "$lib/components/TestCaseSimulationSharingModal.svelte" - import Tooltip from "$lib/components/Tooltip.svelte" import NonVariableReferredParameter from "$lib/components/variables/NonVariableReferredParameter.svelte" import VariableDetail from "$lib/components/variables/VariableDetail.svelte" import VariableReferredInputsPane from "$lib/components/variables/VariableReferredInputsPane.svelte" @@ -83,10 +82,11 @@ import type { TabsConfig } from "$lib/tabs" import { newSimulationUrl, type SelfTargetAProps } from "$lib/urls" import { + budgetEditableParametersName, budgetVariablesName, - variableSummaryByName, + budgetVariablesNameRelated, type ValuesByCalculationNameByVariableName, - budgetEditableParametersName, + variableSummaryByName, variableSummaryByNameByReformName, } from "$lib/variables" @@ -1415,118 +1415,54 @@ --> <!--Affichage du titre "impacts" et onglets de choix cas types ou budget--> - {#if displayMode.parametersVariableName === undefined || (displayMode.parametersVariableName !== undefined && budgetVariablesName.has(displayMode.parametersVariableName)) || displayMode.parametersVariableName === "af_nettes_crds"} - <ul - class="flex items-center justify-between md:justify-start w-screen md:w-full" - > - <li class="w-1/2 md:w-auto flex justify-end"> - <a - class:hover:bg-le-vert-50={displayMode.budget} - class:hover:text-le-bleu={displayMode.budget} - data-sveltekit-noscroll - href={newSimulationUrl({ - ...displayMode, - budget: undefined, - })} - > - <h2 - class="h-12 md:h-14 2xl:h-16 flex items-center border-b-[3px] border-transparent px-3 pt-2 pb-1 text-xl text-black 2xl:border-b-4 2xl:text-2xl justify-center tracking-wide" - class:!border-black={!displayMode.budget} - class:text-black={!displayMode.budget} - class:font-bold={!displayMode.budget} - > - <span class="hidden sm:flex"> Impact cas type </span> - <span class="flex sm:hidden"> Cas type </span> - </h2> - </a> - </li> - <li - class="w-1/2 flex md:w-auto justify-start" - id="situation_budget" + <ul + class="flex items-center justify-between md:justify-start w-screen md:w-full" + > + <li class="w-1/2 md:w-auto flex justify-end"> + <a + class:hover:bg-le-vert-50={displayMode.budget} + class:hover:text-le-bleu={displayMode.budget} + data-sveltekit-noscroll + href={newSimulationUrl({ + ...displayMode, + budget: undefined, + })} > - <a - class:hover:bg-le-vert-50={!displayMode.budget} - class:hover:text-le-bleu={!displayMode.budget} - data-sveltekit-noscroll - href={newSimulationUrl({ - ...displayMode, - budget: true, - })} + <h2 + class="h-12 md:h-14 2xl:h-16 flex items-center border-b-[3px] border-transparent px-3 pt-2 pb-1 text-xl text-black 2xl:border-b-4 2xl:text-2xl justify-center tracking-wide" + class:!border-black={!displayMode.budget} + class:text-black={!displayMode.budget} + class:font-bold={!displayMode.budget} > - <h2 - class="h-12 md:h-14 2xl:h-16 flex items-center border-b-[3px] border-transparent px-3 pt-2 pb-1 text-xl 2xl:border-b-4 2xl:text-2xl justify-center tracking-wide" - class:!border-black={displayMode.budget} - class:font-bold={displayMode.budget} - > - <span class="hidden sm:flex"> Impact budgétaire </span> - <span class="flex sm:hidden"> Budget </span> - </h2> - </a> - </li> - </ul> - {:else} - <ul - class="flex items-center justify-between md:justify-start w-screen md:w-full" + <span class="hidden sm:flex"> Impact cas type </span> + <span class="flex sm:hidden"> Cas type </span> + </h2> + </a> + </li> + <li + class="w-1/2 flex md:w-auto justify-start" + id="situation_budget" > - <li class="w-1/2 md:w-auto flex justify-end"> + <a + class:hover:bg-le-vert-50={!displayMode.budget} + class:hover:text-le-bleu={!displayMode.budget} + data-sveltekit-noscroll + href={newSimulationUrl({ + ...displayMode, + budget: true, + })} + > <h2 - class="h-12 md:h-14 2xl:h-16 flex items-center border-b-[3px] 2xl:border-b-4 border-black px-3 pt-2 pb-1 text-black text-xl 2xl:text-2xl" + class="h-12 md:h-14 2xl:h-16 flex items-center border-b-[3px] border-transparent px-3 pt-2 pb-1 text-xl 2xl:border-b-4 2xl:text-2xl justify-center tracking-wide" + class:!border-black={displayMode.budget} + class:font-bold={displayMode.budget} > - <span class="font-bold tracking-wide"> - <span class="block md:hidden">Cas type</span> - <span class="hidden md:block">Impact cas type</span> - </span> + <span class="hidden sm:flex"> Impact budgétaire </span> + <span class="flex sm:hidden"> Budget </span> </h2> - </li> - <li class="w-1/2 md:w-auto flex justify-start"> - {#if displayMode.parametersVariableName !== undefined} - {@const variable = - $decompositionByName[displayMode.parametersVariableName] ?? - variableSummaryByName[displayMode.parametersVariableName]} - <Tooltip - arrowClass="bg-gray-100" - widthClass="w-80" - initialPlacement="bottom" - > - <h2 - class="h-12 md:h-14 2xl:h-16 flex items-center border-b-[3px] border-transparent px-3 pt-2 pb-1 text-xl text-gray-300 2xl:border-b-4 2xl:text-2xl justify-center tracking-wide" - > - <span class="block md:hidden">Budget</span> - <span class="hidden md:block">Impact budgétaire</span> - </h2> - <!--Tooltip info budget manquant pour ce dispositif--> - <div - slot="tooltip" - class="overflow-hidden bg-white text-sm font-light rounded-lg border border-gray-200 shadow-2xl" - > - <h3 - class="font-semibold text-gray-900 py-2 px-3 bg-gray-100 border-b border-gray-200" - > - Impact budgétaire indisponible - </h3> - - <div class="py-2 px-3"> - <span class="text-black"> - Le calcul des impacts budgétaires du dispositif - « {variable.short_label ?? - variable.label ?? - variable.name} » n'est pas encore disponible. - <span class="font-normal" - >Ce sujet vous intéresse ? Écrivez-nous à - <a - class="lx-link-text" - href="mailto:leximpact@assemblee-nationale.fr" - >leximpact@assemblee-nationale.fr</a - ></span - > - </span> - </div> - </div> - </Tooltip> - {/if} - </li> - </ul> - {/if} + </a> + </li> + </ul> {#if (displayMode.parametersVariableName !== undefined || displayMode.testCasesIndex.length > 0) && (mobileLawTab || !displayMode.budget)} <button class="z-30 absolute -bottom-4 right-2 lg:right-5 xl:right-10 flex items-center gap-2 py-2 px-5 shadow-lg bg-white hover:bg-gray-100 active:bg-gray-200 rounded border border-le-bleu text-le-bleu text-sm font-bold tracking-[0.085em] uppercase transition-all duration-200 ease-out-back disabled:opacity-0 disabled:scale-90" @@ -1577,13 +1513,61 @@ <div class="w-screen md:w-full flex flex-col px-2 xl:px-10 py-5" > - {#if $budgetSimulation === undefined} - {#if displayMode.parametersVariableName !== undefined} - <div class="z-10 bg-le-jaune bg-opacity-20"> - <Spinner /> + {#if !budgetVariablesName.has(displayMode.parametersVariableName) && !budgetVariablesNameRelated.has(displayMode.parametersVariableName)} + {@const variable = + $decompositionByName[ + displayMode.parametersVariableName + ] ?? + variableSummaryByName[ + displayMode.parametersVariableName + ]} + <h3 class="mx-4 mb-2 text-2xl font-bold md:mx-0"> + {variable.short_label ?? + variable.label ?? + variable.name} + </h3> + <div + class="p-2 rounded-lg border border-gray-200 bg-white shadow-md" + > + <div + class="flex flex-col items-center gap-6 px-10 py-28 text-center bg-gray-100 rounded-lg" + > + <span class="text-lg"> + Le calcul des impacts budgétaires du dispositif + « {variable.short_label ?? + variable.label ?? + variable.name} » n'est pas encore + disponible. + </span> + <span> + Ce sujet vous intéresse ? Écrivez-nous à + <a + class="lx-link-text" + href="mailto:leximpact@assemblee-nationale.fr" + > + leximpact@assemblee-nationale.fr + </a> + </span> + <a + class="mt-10 flex items-center gap-1.5 py-1.5 px-3 bg-white hover:bg-neutral-200 active:bg-neutral-300 rounded-lg font-semibold text-le-gris-dispositif-dark hover:text-black text-sm tracking-wider uppercase transition-all duration-200 ease-out-back s-y_bCXRrkrYfP" + href={newSimulationUrl({ + ...displayMode, + budget: false, + })} + > + <!-- <iconify-icon--> + <!-- class="text-lg"--> + <!-- icon="ri-arrow-left-line"--> + <!-- />--> + Voir l'impact sur les cas types + </a> </div> - {/if} - {:else if $budgetSimulation.errors != null && $budgetSimulation.errors.length > 0} + </div> + {:else if $budgetSimulation === undefined && !budgetVariablesNameRelated.has(displayMode.parametersVariableName)} + <div class="z-10 bg-le-jaune bg-opacity-20"> + <Spinner /> + </div> + {:else if $budgetSimulation !== undefined && $budgetSimulation.errors != null && $budgetSimulation.errors.length > 0} <div class="w-fit mx-auto md:mt-32 flex flex-col items-center gap-10 p-10 bg-white rounded-lg border border-gray-200 shadow-md" >