Bandeau de consentement cookies
frontend/src/components/CookieBanner.vue, affiché globalement sur le site public (hors backoffice).
Vérifié le 2026-08-24 — introduit/corrigé par le commit "Analytics tracking, Cookie consent fix, and UI tweaks" (dd47824, sur main), documenté ici pour la première fois.
Ce bandeau est un consentement cookies/tracking, de type RGPD, affiché à tout visiteur du site public. Il n'a aucun rapport avec consent_data_processing/consent_electronic_signature du formulaire de prêt scolaire, qui concernent le traitement des données d'un dossier de crédit précis et sont stockés en base par demande — voir Consentements légaux pour ce second mécanisme, distinct et plus fort juridiquement (preuve horodatée par dossier, pas une préférence de navigation).
1. Choix proposés
Trois boutons : Tout accepter, Tout refuser, Personnaliser (bascules par catégorie : "strictement nécessaires" toujours actif, "Analytics", "Personnalisation" — cette dernière liée au chatbot).
2. Stockage — localStorage, pas de cookie de consentement lui-même
utb_cookie_consent:'accepted' | 'declined' | 'partial'.utb_cookie_prefs:{ analytics: boolean, marketing: boolean }— utilisé uniquement quandutb_cookie_consent === 'partial'.
3. Bug corrigé le 2026-08-24 : le choix "Personnaliser" n'était pas respecté
Avant ce correctif, router/index.js (router.afterEach, qui déclenche l'envoi de POST /api/analytics/visit — voir Analytics de fréquentation) ne vérifiait que consent === 'accepted'. Un visiteur choisissant "Personnaliser" puis activant uniquement Analytics (consent === 'partial') n'était jamais tracké, alors qu'il avait explicitement autorisé l'analytics — l'inverse de l'intention du bandeau. Corrigé en lisant aussi utb_cookie_prefs.analytics quand consent === 'partial'.
Indépendamment du consentement, router.afterEach exclut aussi systématiquement toute route commençant par /admin — le personnel backoffice n'est jamais tracké par ce mécanisme, quel que soit son choix sur le bandeau (qui ne s'affiche de toute façon que sur le site public).
4. Payload de tracking envoyé (si consenti)
{ page, session_id, referrer: document.referrer, screen_resolution: '{width}x{height}', language: navigator.language } — session_id persisté en sessionStorage (utb_session_id, crypto.randomUUID()). Voir Analytics de fréquentation pour ce que le backend en fait (anonymisation IP incluse).