diff --git a/app/locales/IllustratedHeader.tsx b/app/locales/IllustratedHeader.tsx index d9fcf8ae..5e7e8aa3 100644 --- a/app/locales/IllustratedHeader.tsx +++ b/app/locales/IllustratedHeader.tsx @@ -1,6 +1,6 @@ import useWikidata from '@/components/wikidata/useWikidata' -export default function IllustratedHeader({ placeTitle, imageTitle }) { +export default function IllustratedHeader({ placeTitle, imageTitle, imageLink }) { const wikidataImage = useWikidata(imageTitle), wikidataImageUrl = wikidataImage?.pictureUrl @@ -14,14 +14,11 @@ export default function IllustratedHeader({ placeTitle, imageTitle }) { `} > {`Photo {' '} - + { console.log('instantiating new publicodes engine for evaluation') @@ -140,7 +141,11 @@ export default function LocalePlace({ place }) { return (
- +

Découvrez ci-dessous les aides locales {capitalise0(place)}. Vous pouvez changer la situation de votre ménage pour voir l'évolution du diff --git "a/app/r\303\250gles/aides-locales.publicodes" "b/app/r\303\250gles/aides-locales.publicodes" index 80ed2173..7fbff353 100644 --- "a/app/r\303\250gles/aides-locales.publicodes" +++ "b/app/r\303\250gles/aides-locales.publicodes" @@ -8,7 +8,10 @@ # TODO pour activer d'autres aides qu'Angers et Besançon, il faut utiliser le mécanisme de remplacement, et respecter le format [localité] . montant: pour qu'on puisse facilement les lister et déduire leur nom '': + + titre: Aides Locales marque: Aides locales + icône: 'hexagone-contour.svg' description: | Chaque collectivité française (commune, communauté de communes, métropole, département) est libre d'ajouter sa part aux subventions publiques pour la rénovation energétique. avec: @@ -462,6 +465,166 @@ essonne . gros travaux . montant: essonne . gros travaux . travaux plafonnés: valeur: projet . travaux plafond: 20000 € + +########################## +# Narbonne +# Toutes ces aides ne sont pas implémentées +########################## +grand narbonne: + image wikidata: Le Grand Narbonne + image: le-grand-narbonne.png + titre: Grand Narbonne Communauté d'agglomération - Prime Energie +grand narbonne . conditions géo: ménage . EPCI = '241100593' +grand narbonne . aides: + applicable si: conditions + remplace: intercommunalité + valeur: prime énergie . montant +grand narbonne . aides . conditions: + toutes ces conditions: + - conditions géo + - prime énergie . statut bénéficiaire = oui + - pig . bénéficiaire = non +grand narbonne . montant: 0 € # pour l'instant on ne souhaite pas afficher de montant + # somme: + # - mon coach éco-logis + # - aide département + # - aide grand narbonne + # - aide acv narbonne + +grand narbonne . prime énergie: +# grand narbonne . prime énergie . conditions: + # toutes ces conditions: + # - ménage . EPCI = '241100593' + # - statut bénéficiaire + # - logement . résidence principale + # - logement . construit avant 2013 + # - mon coach éco-logis . bénéficiaire = non + # - pig . bénéficiaire = non +grand narbonne . prime énergie . montant: 0 € # On ne communique pas de chiffre pour l'instant + +grand narbonne . prime énergie . statut bénéficiaire: + titre: Propriétaire éligible + question: Etes-vous proprietaire (occupant, bailleur, SCI) ou accédant à la propriété qui occupera le logement dans les 6 mois suivant l'achèvement des travaux? + par défaut: oui + description: | + Sont également éligibles : + - les propriétaires qui réhabilitent des logements vacants en vue de les louer (à condition que le logement soit loué au moment de la demande de paiement). + - les propriétaires dans le cadre de transformation d'usage, dont l'usage final est de l'habitation +grand narbonne . pig: +grand narbonne . pig . bénéficiaire: + titre: Bénéficiaire du PIG Grand Narbonne + question: Etes-vous bénéficiaire du Programme d'Intérêt Général du Grand Narbonne? + par défaut: oui + sous-titre: A l'exception de la Prime Energie Innovation Solidaire + description: | + A l'exception de la Prime Energie Innovation Solidaire qui est cumulable avec l'ensemble des PIG et dispositifs existants + +grand narbonne . prime énergie . logement: +grand narbonne . prime énergie . logement . résidence principale: + question: Le logement est-il occupé à titre de résidence principale + par défaut: oui + description: Sont exclus du dispositif, les résidences secondaires et les logements saisonniers. +grand narbonne . prime énergie . logement . construit avant 2013: + question: Le permis de construire du logement a été déposé avant le 1er janvier 2013 + par défaut: oui +# TODO: Pour l'instant, cette aide n'est pas implémentée côté UI +grand narbonne . prime énergie . innovation solidaire: +grand narbonne . prime énergie . innovation solidaire . conditions: + toutes ces conditions: + - ménage . revenu < 2 x catégorie bleue + +# # TODO: Pour l'instant, cette aide n'est pas implémentée côté UI +# grand narbonne . aide département: +# grand narbonne . aide département . montant: + # valeur: 200 € +# grand narbonne . aide grand narbonne: + # applicable si: ménage . EPCI = '241100593' +# grand narbonne . aide grand narbonne . montant: + # valeur: 300 € + +# # TODO: Pour l'instant, cette aide n'est pas implémentée côté UI +# grand narbonne . aide acv narbonne: + # question: Etes-vous concerné par le dispositif "Action coeur de ville" Narbonne? + # par défaut: non +# grand narbonne . aide acv narbonne . montant: + # valeur: 200 € + +# # TODO: Pour l'instant, cette aide n'est pas implémentée côté UI +# grand narbonne . mon coach éco-logis: + # lien: https://www.aude.fr/je-renove-mon-logement-avec-mon-coach-eco-logis + # description: | + # Pour bénéficier de ce programme: + # - Vous devez être propriétaire de votre logement et avoir des ressources modestes + # - Votre logement doit avoir été construit il y a plus de 15 ans + # - Vous vous engagez à y vivre à titre de résidence principale pendant trois ans + # - Vous ne devez pas avoir eu recours à un prêt à taux zéro pour l’acquisition du logement dans les cinq dernières années + # Pour savoir si vous pouvez bénéficier de Mon Coach Éco-Logis, appelez le 04 68 11 81 30. Du lundi au vendredi de 9h à 12h et de 14h à 17h. Prix d’un appel local. +# grand narbonne . mon coach éco-logis . bénéficiaire: + # question: "Etes-vous bénéficiaire du Programme d'Intérêt Général du Département de l'Aude (Mon Coach EcoLogis)?" + # par défaut: non + # lien: https://www.aude.fr/je-renove-mon-logement-avec-mon-coach-eco-logis + # description: | + # Pour bénéficier de ce programme: + # - Vous devez être propriétaire de votre logement et avoir des ressources modestes + # - Votre logement doit avoir été construit il y a plus de 15 ans + # - Vous vous engagez à y vivre à titre de résidence principale pendant trois ans + # - Vous ne devez pas avoir eu recours à un prêt à taux zéro pour l’acquisition du logement dans les cinq dernières années + # Pour savoir si vous pouvez bénéficier de Mon Coach Éco-Logis, appelez le 04 68 11 81 30. Du lundi au vendredi de 9h à 12h et de 14h à 17h. Prix d’un appel local. +# grand narbonne . mon coach éco-logis . conditions: + # toutes ces conditions: + # - conditions géo + # - logement . résidence principale propriétaire + # - logement . période de construction = 'au moins 15 ans' + # - conditions de revenu + # - projet . gain energétique >= 35 % + # - vivre trois ans + # - pas de PTZ + # - travaux recevables +# grand narbonne . mon coach éco-logis . conditions de revenu: + # une de ces conditions: + # - ménage . revenu . classe = 'modeste' + # - ménage . revenu . classe = 'très modeste' +# grand narbonne . mon coach éco-logis . vivre trois ans: + # question: Vous vous engagez à vivre à titre de résidence principale pendant trois ans dans le logement + # par défaut: oui +# grand narbonne . mon coach éco-logis . pas de PTZ: + # question: Avez-vous eu recours à un prêt à taux zéro pour l’acquisition du logement dans les cinq dernières années + # par défaut: non +# grand narbonne . mon coach éco-logis . travaux recevables: + # question: Les travaux envisagés sont-ils éligibles à la prime éco-logis? + # par défaut: oui + # description: | + # La fourniture des matériaux et les travaux doivent impérativement être réalisés par des artisans reconnu garant de l’environnement (RGE) et figurer parmi la liste suivante : + # - Changement de chauffage + # - Isolation des combles, des murs, du plancher + # - Mise en place d’une ventilation + # - Changement de menuiseries, etc. +# grand narbonne . mon coach éco-logis . montant: + # applicable si: conditions + # somme: + # - bonus bâtiment basse consommation + # - bonus sortie passoire thermique + # - 10 % * projet . travaux + # plafond: 30000 € +# grand narbonne . mon coach éco-logis . bonus bâtiment basse consommation: +# grand narbonne . mon coach éco-logis . bonus bâtiment basse consommation . conditions: + # toutes ces conditions: + # - projet . DPE visé <= 2 + # - DPE . actuel >= 2 +# grand narbonne . mon coach éco-logis . bonus bâtiment basse consommation . montant: + # titre: Bonus "Bâtiment basse consommation" + # applicable si: conditions + # valeur: 1500 € +# grand narbonne . mon coach éco-logis . bonus sortie passoire thermique: +# grand narbonne . mon coach éco-logis . bonus sortie passoire thermique . conditions: + # toutes ces conditions: + # - projet . DPE visé < 6 + # - DPE . actuel >= 6 +# grand narbonne . mon coach éco-logis . bonus sortie passoire thermique . montant: + # titre: Bonus "Sortie de passoire énergétique" + # applicable si: conditions + # valeur: 1500 € + ############ # Collectivités pour lesquelles nous sommes certains qu'il n'y a pas d'aide diff --git a/app/simulation/Answers.tsx b/app/simulation/Answers.tsx index 3bb88a09..f3f00315 100644 --- a/app/simulation/Answers.tsx +++ b/app/simulation/Answers.tsx @@ -31,9 +31,11 @@ export const categoryData = ( const category = firstLevelCategory(currentQuestion) const categoryTitle = currentQuestion && rules[category]?.titre + const aideLocale = rules[currentQuestion.split(' . ').slice(0, 2).join(' . ').trim()] const isLastCategory = currentQuestion == nextQuestions.slice(-1) return { categoryTitle, + aideLocale, isLastCategory, allCategories, pastCategories, diff --git a/app/simulation/QuestionHeader.tsx b/app/simulation/QuestionHeader.tsx index c05cb0d6..a066bab5 100644 --- a/app/simulation/QuestionHeader.tsx +++ b/app/simulation/QuestionHeader.tsx @@ -5,6 +5,8 @@ export const QuestionHeader = styled.header` flex-wrap: wrap; align-items: start; flex-direction: column; + flex: 1; + min-width: 80%; margin: 0.4rem 0.2rem 0.4rem 0.2rem; > small { color: var(--color); diff --git a/app/simulation/simulationConfig.yaml b/app/simulation/simulationConfig.yaml index d61eca16..511a4bf5 100644 --- a/app/simulation/simulationConfig.yaml +++ b/app/simulation/simulationConfig.yaml @@ -11,6 +11,8 @@ prioritaires: - ménage . revenu - DPE . actuel - logement . commune + - aides locales . grand narbonne . prime énergie . statut bénéficiaire + - aides locales . grand narbonne . pig . bénéficiaire - parcours d'aide # Le reste est non-linéaire, en fonction du choix non prioritaires: diff --git a/components/ClassicQuestionWrapper.tsx b/components/ClassicQuestionWrapper.tsx index 9bf06dd4..1909ca43 100644 --- a/components/ClassicQuestionWrapper.tsx +++ b/components/ClassicQuestionWrapper.tsx @@ -4,7 +4,6 @@ import Suggestions from '@/app/simulation/Suggestions' import { AnswerWrapper } from './InputUI' import Notifications from './Notifications' import { encodeSituation } from './publicodes/situationUtils' - import { isMosaicQuestion } from './BooleanMosaic' import { gestesMosaicQuestionText } from './GestesMosaic' import QuestionDescription from './QuestionDescription' @@ -37,7 +36,7 @@ export default function ClassicQuestionWrapper({ nextQuestions, }) { const isCompact = useIsCompact() - const { categoryTitle } = categoryData( + const { categoryTitle, aideLocale } = categoryData( nextQuestions, currentQuestion, answeredQuestions, @@ -46,23 +45,54 @@ export default function ClassicQuestionWrapper({ return (

- {(!rule.type || !rule.type === 'question rhétorique') && ( - - {categoryTitle} -

- -

- {rule['sous-titre'] && ( -
+
+ {(!rule.type || !rule.type === 'question rhétorique') && ( +
+ { aideLocale?.image && () + } + + {categoryTitle}{ aideLocale?.image ? " - " + aideLocale?.titre : "" } +

+ +

+ {rule['sous-titre'] && ( +
+ )} +
+
+ )} + + {!noSuggestions && ( + + setSearchParams( + encodeSituation( + { + ...situation, + [currentQuestion]: value, + }, + false, + answeredQuestions, + ), + 'url', + false, + ) + } + /> + )} )} diff --git a/components/InputSwitch.tsx b/components/InputSwitch.tsx index a0dc2094..10b47155 100644 --- a/components/InputSwitch.tsx +++ b/components/InputSwitch.tsx @@ -160,6 +160,7 @@ export default function InputSwitch({ questionsToSubmit: [ 'ménage . code région', 'ménage . code département', + 'ménage . EPCI', 'ménage . commune', ], currentValue, diff --git a/components/locale/BlocLocale.tsx b/components/locale/BlocLocale.tsx new file mode 100644 index 00000000..b3a53dd2 --- /dev/null +++ b/components/locale/BlocLocale.tsx @@ -0,0 +1,71 @@ +import React from 'react' +import Image from 'next/image' +import GesteQuestion from './../GesteQuestion' +import mprImage from '@/public/maprimerenov.svg' +import { BlocAide, PrimeStyle } from '../UI' +import { getAnsweredQuestions } from '../publicodes/situationUtils' +import { useSearchParams } from 'next/navigation' + +export const BlocAideLocale = ({ info, rules, engine, situation, setSearchParams }) => { + + const rawSearchParams = useSearchParams(), + situationSearchParams = Object.fromEntries(rawSearchParams.entries()) + + // On affiche les questions répondues, mais pas celles validées (sinon elles s'affichent lors du parcours par geste) + const questionsAnswered = Object.keys(situation) + .filter(q => info.questions.includes(q) && + !getAnsweredQuestions(situationSearchParams, rules).includes(q)) + + let lastQuestionAnswered = -1; + for (let i = info.questions.length - 1; i >= 0; i--) { + if (questionsAnswered.includes(info.questions[i])) { + lastQuestionAnswered = i; + break; + } + } + + const currentQuestion = info.questions[lastQuestionAnswered+1]; + + const isExactTotal = Array.isArray(info.questions) && info.questions.every(question => question in situation) + const isEligible = info.montant !== "Non applicable" + + return ( + +
+

Calculateur des aides à la rénovation énergétique du Grand Narbonne

+
+
+ {info.questions.slice(0, lastQuestionAnswered+1).map((question, index) => ( + + ))} + {currentQuestion && ( + + )} +
+ + {isEligible ? + (<>Prime de {isExactTotal ? info.montant : "..."}) : + (Non Éligible) + } + +
+
+
+ ) +} \ No newline at end of file diff --git a/components/locale/PageLocale.tsx b/components/locale/PageLocale.tsx new file mode 100644 index 00000000..43e651ff --- /dev/null +++ b/components/locale/PageLocale.tsx @@ -0,0 +1,82 @@ +'use client' +import { getSituation } from '@/components/publicodes/situationUtils' +import { CTA, CTAWrapper, ExternalLink, Main, MiseEnAvant, Section } from '@/components/UI' +import rules from '@/app/règles/rules' +import Publicodes, { formatValue } from 'publicodes' +import getNextQuestions from '@/components/publicodes/getNextQuestions' +import { useSearchParams } from 'next/navigation' +import Link from 'next/link' +import css from '@/components/css/convertToJs' +import useSetSearchParams from '../useSetSearchParams' +import useIsInIframe from '@/components/useIsInIframe' +import Breadcrumb from '../Breadcrumb' +import { BlocAideLocale } from './BlocLocale' + +export default function PageLocale({ params }: { params: { place: string } }) { + + const isInIframe = useIsInIframe() + const engine = new Publicodes(rules) + const rawSearchParams = useSearchParams(), + situationSearchParams = Object.fromEntries(rawSearchParams.entries()) + const rule = Object.keys(rules).find((rule) => rule == "aides locales . "+decodeURIComponent(params.place)) + const situation = { + ...getSituation(situationSearchParams, rules), + } + + const info = { + montant: formatValue(engine.setSituation(situation).evaluate(rule + ' . montant'), { precision: 0 }), + titre: rules[rule].titre, + questions: rules[rule].questions.valeurs, + } + + console.log("missingVariables", engine.setSituation(situation).evaluate(rule + ' . montant').missingVariables) + + const setSearchParams = useSetSearchParams() + + return ( +
+
+ { !isInIframe && ( + <> + + + + ⬅ Retour à la liste des aides Locales + + + + )} +

{info.titre}

+ +

Informations sur les conditions d'obtention:

+
    +
  • Recours à un professionnel RGE
  • +
  • Le dépôt du dossier de demande d'aide s'effectue avant le démarrage des travaux.
  • +
  • Vous pouvez déposer votre dossier en ligne sur [site grand narbonne].
  • +
+
+ +
+
+ ) +} diff --git a/public/logo-locale/le-grand-narbonne.png b/public/logo-locale/le-grand-narbonne.png new file mode 100644 index 00000000..9336763a Binary files /dev/null and b/public/logo-locale/le-grand-narbonne.png differ