# Chantier « espace famille / annuaire » - EN PAUSE (06/09/2026)

Rien n'est déployé. La production tourne sans ces fichiers : ils sont inertes
tant que les routes ne sont pas déclarées et la migration pas exécutée.

## Déjà écrit (local)
- `database/migrations/2026_09_06_000001_create_annuaire_tables.php`
  (profiles, profile_links, profile_photos + users.password_set_at/last_login_at)
- `app/Models/Profile.php` (avec `calculerBranche()` : remontée vers l'un des 9 enfants),
  `app/Models/ProfileLink.php` (9 réseaux), `app/Models/ProfilePhoto.php`
- `config/filesystems.php` : disque `prive` = storage/app/prive, HORS docroot
- `app/Support/ImageResizer.php` : réduction GD native, l'original n'est jamais gardé
- `app/Http/Controllers/Annuaire/MaFicheController.php` : édition par le SEUL
  propriétaire (aucune exception admin), charte + consentement horodaté,
  refus = suppression du compte, suppression à la demande
- `app/Http/Controllers/Annuaire/AnnuaireController.php` : liste groupée par branche,
  n'affiche que is_listed + consent_at, champs cochés uniquement
- `app/Http/Controllers/Annuaire/MediaController.php` : distribution des fichiers
  privés derrière `auth`
- `app/Http/Controllers/Admin/AnnuaireAdminController.php` : invitations + lien signé 7 j
- `app/Http/Controllers/Auth/PasswordSetupController.php` : lien GRILLÉ après usage
- `app/Http/Controllers/Auth/LoginController.php` : last_login_at + atterrissage fiche
- `app/Models/User.php` : relation `profile()` + casts des deux dates

## Reste à faire pour livrer la Phase 1
1. Routes (actions de contrôleur uniquement, jamais de closure) :
   - `auth` : GET /annuaire, GET|PUT /annuaire/ma-fiche, POST avatar,
     GET /annuaire/charte, POST accepter|refuser, POST /annuaire/supprimer,
     GET /media/avatar/{profile}, GET /media/photo/{photo}
   - `auth`+`can:admin` : GET /admin/annuaire, POST inviter, POST regenerer/{user}
2. Vues : `annuaire/index`, `annuaire/ma-fiche`, `annuaire/charte`, `admin/annuaire`
3. Nav `layout.blade.php` : entrée « Annuaire » sous @auth
4. `robots.txt` : Disallow /annuaire, /media
5. `deploy.sh` : exclure `storage/app/prive`
6. `php artisan migrate` en local, tests, puis déploiement + migrate --force
7. AVANT toute invitation : changer le mot de passe du compte seedé
   admin@famille-letzelter.fr documenté dans DEPLOY.md

## Points de vigilance (issus des critiques)
- Prod = SQLite (vérifié dans le .env OVH), malgré .env.production.example
- Ne jamais servir une photo de vivant depuis public/storage
- Opt-in par champ, tout fermé par défaut ; pas de compte pour un mineur
