# Plan — Relay Préférences & Offres

## Portée approuvée

Application PHP 8.2+ qui recueille des préférences e-commerce uniquement après information et consentement explicite. Elle comprend les étapes d’attente, véhicule/budget, financement et confirmation, ainsi qu’un panel administrateur authentifié qui affiche les sessions en ligne/hors ligne et demande une prochaine étape via un identifiant aléatoire pseudonyme. Un heartbeat actualise la présence; la redirection s’applique lors de la prochaine vérification du navigateur. Une notification Telegram peut être activée par variables d’environnement, mais reste générique et ne contient ni IP, ni réponses, ni identifiant d’accès. Aucune recherche ou redirection par IP et aucune URL d’administration publique ne sont implémentées.

## Approche technique

- PHP 8.2 natif, PDO SQLite, sans dépendance composer nécessaire.
- Document root `public/`; les sources applicatives `/app`, `/relay`, `/panel`, `/config`, `/storage` restent hors de la racine HTTP. Un routeur public autorise explicitement les routes prévues et transmet les requêtes aux scripts correspondants.
- SQLite contient les comptes administrateurs, sessions pseudonymes, consentements, réponses de préférence et audit minimal; les réponses ne sont enregistrées qu’après consentement offres. Aucune adresse IP ni user-agent détaillé n’est lue ou enregistrée par le code applicatif.
- Cookie visiteur opaque `relay_sid`, jeton CSRF stocké haché côté serveur, expirations/purge configurables. Panel en session PHP distincte, `password_hash`, limitation de tentatives par compte et cookies `HttpOnly`, `Secure` et `SameSite=None` en Preview HTTPS. En développement HTTP local seulement, le paramètre de configuration explicite peut désactiver `Secure`.
- Les visiteurs envoient un heartbeat léger environ toutes les 8 secondes pendant le parcours. Le panel indique en ligne lorsque le dernier heartbeat date de moins de 60 secondes. Les commandes de redirection sont limitées aux étapes `wait`, `vehicle`, `credit`, `thanks` et ne sont lues qu’avec le cookie de session du navigateur concerné.
- Interface responsive en français, sans images décoratives, avec contrastes lisibles, formulaires accessibles et styles locaux. Pas d’outil d’analytics tiers.
- Installation locale et production décrites dans `README.md`; création initiale de l’admin par commande CLI à mot de passe saisi interactivement; données hors racine publique.

## Structure

- `public/`: point d’entrée HTTP, routeur et CSS local; seule racine à exposer.
- `relay/`: scripts des étapes visiteurs (`index`, `wait`, `vehicle`, `credit`, `thanks`) et endpoints de consentement, formulaires, heartbeat, retrait et statut de parcours.
- `panel/`: connexion, dashboard, action de changement d’étape et déconnexion.
- `app/`: bootstrap, base PDO, sécurité, validation, sessions/étapes, vues et notification Telegram générique.
- `config/`: chargement de configuration d’environnement et version du consentement; aucun secret réel.
- `storage/`: base SQLite et données runtime; jamais exposées publiquement.
- `bin/`: commande CLI de création d’administrateur et purge des sessions expirées.
- `.env.example`, `.gitignore`, `README.md`: configuration, exclusions et installation.

## Direction visuelle

Trois pistes visuelles évaluées comme alternatives atypiques : brutaliste éditoriale (0,06), registre suisse/commerce (0,03), solaire modulaire (0,08). Choix : **registre suisse/commerce**.

- **Mouvement** : modernisme suisse, réinterprété comme un carnet de sélection e-commerce.
- **Principes** : lisibilité prioritaire, hiérarchie par typographie, étapes visibles, interface sobre et rassurante.
- **Couleurs** : fond ivoire chaud pour réduire l’effet formulaire institutionnel; encre bleu nuit pour la confiance; vert sauge vif comme signal d’action et de progression.
- **Mise en page** : colonne de lecture asymétrique avec une marge éditoriale, progression en ligne et formulaires à largeur contrôlée; dashboard structuré en liste plutôt qu’en grille de cartes décoratives.
- **Éléments signature** : index d’étape numéroté; trait vert continu de progression; encart de confidentialité au style éditorial.
- **Interactions/animation** : transitions courtes et discrètes, spinner respectueux de `prefers-reduced-motion`; confirmation visible des actions; aucun mouvement automatique agressif.
- **Typographie** : system sans-serif pour l’interface; titres à graisse forte, grands chiffres pour les étapes; tailles relatives et lignes confortables.
- **Essence de marque** : un parcours de préférences clair pour recevoir des offres plus pertinentes — précis, calme, transparent.
- **Voix** : concise, honnête, non pressante. Exemples : « Vos préférences servent à préparer des offres adaptées. » « Vous gardez la main sur vos choix. »
- **Marque** : mot-symbole “relay” en minuscules, accompagné d’un chevron composé de deux traits qui évoquent le passage d’une étape à la suivante.
- **Couleur signature** : vert sauge profond.

## Dépendances et limites

Le Sandbox initial ne contient pas PHP; l’environnement d’aperçu nécessite PHP CLI avec PDO SQLite. Si l’interpréteur ou son extension ne peuvent pas être installés dans le Sandbox, les sources PHP restent livrées mais l’aperçu dynamique devra être signalé comme indisponible. Les données runtime SQLite nécessitent un stockage persistant et des sauvegardes adaptées hors Sandbox. Les textes de confidentialité, durées de conservation et identité du responsable doivent être adaptés par l’exploitant avant une collecte réelle.
