# Rapport final — Site institutionnel Te Litho Tenge Didier

Date de rédaction : 20 juillet 2026 (mis à jour le 21 juillet 2026, voir §12).

## 0. Correctif post-livraison — images non affichées (21 juillet 2026)

Après la livraison initiale, les images ne s'affichaient pas via `http://tlt.test`. Un premier
correctif (URLs relatives dans `config/filesystems.php`) était nécessaire mais **incomplet** : la
cause principale était que le virtual host Apache de Laragon pour `tlt.test` avait un
`DocumentRoot` pointant sur la racine du projet au lieu de `public/`, empêchant Laravel de
s'exécuter à travers ce domaine (le serveur renvoyait un listing brut du dossier projet, exposant
au passage `.env`). Diagnostic complet, preuves de bout en bout (téléchargement et décodage réel
des images) et correctif détaillés dans
[docs/diagnostic-images-2026-07-21.md](diagnostic-images-2026-07-21.md). **Action recommandée :
régénérer `APP_KEY` avant mise en production**, ce fichier `.env` ayant été exposé publiquement
sur le domaine local le temps du bug.

## 1. Stack détectée et retenue

Le projet ne contenait initialement qu'un dossier `images/` (1,6 Go, 5 333 fichiers) et un
dossier `.agents/` vide ; aucun code applicatif n'existait. L'environnement Laragon fournit
PHP 8.3.28, Composer 2.10 et Node 22 (non présents dans le PATH système, utilisés via leurs
chemins complets `D:\laragon\bin\...`).

**Choix retenu : Laravel 12** (Blade + Vite + Tailwind CSS v4, SQLite), pour les raisons
suivantes :
- convention Laragon (`www/<projet>`) ;
- besoin explicite d'une architecture compatible avec un futur espace d'administration ;
- migrations/Eloquent adaptées à un catalogue de plus de 5 000 médias et à une chronologie
  éditable ;
- artisan permet d'implémenter proprement le pipeline d'audit/optimisation d'images demandé.

## 2. Fichiers et répertoires créés (principaux)

- `app/Console/Commands/ScanMedia.php` — scanne `images/`, extrait EXIF, détecte doublons exacts
  (SHA1) et quasi-doublons (hash perceptuel 8×8), déduit les dates avec 3 niveaux de confiance,
  génère `data/media-manifest.json`, `data/documents-manifest.json` et `docs/audit-des-images.md`.
- `app/Console/Commands/ImportMedia.php` — importe les manifestes JSON en base sans écraser les
  fiches retouchées manuellement (`curated = true`).
- `app/Console/Commands/OptimizeMedia.php` — génère des variantes non destructives
  (thumb/medium/large × JPEG/WebP, correction de l'orientation EXIF) dans
  `storage/app/public/media/`, sans jamais modifier les originaux.
- `app/Models/{MediaItem,ChronologyPeriod,ChronologyEvent,ActionDomain,Document,Quote,Video,ContactMessage}.php`
- Migrations correspondantes + `is_admin` sur `users`.
- `database/seeders/{ChronologySeeder,ActionDomainSeeder,QuoteSeeder,VideoSeeder,AdminUserSeeder,MediaCurationSeeder}.php`
  — contenu réel, sourcé, issu de `docs/recherches-et-sources.md`.
- Contrôleurs publics (`Home`, `Page`, `Chronology`, `ActionDomain`, `Gallery`, `Video`, `Press`,
  `Contact`, `Sitemap`) et d'administration (`Admin\Auth`, `Admin\Dashboard`, `Admin\MediaAdmin`,
  `Admin\ChronologyAdmin`).
- Vues Blade pour toutes les pages publiques + espace `/admin` (layout dédié, formulaires de
  gestion de la médiathèque et de la chronologie).
- `resources/css/app.css` — palette et système de composants (voir §4).
- `docs/recherches-et-sources.md`, `docs/audit-des-images.md`, `docs/rapport-final-site-tenge-te-litho.md`.
- `lang/fr/{pagination,validation}.php` — le squelette Laravel 12 ne fournit plus de fichiers de
  langue par défaut ; ajoutés pour un site entièrement en français (pagination et messages de
  validation des formulaires).
- `tests/Feature/{PublicPagesTest,ContactFormTest,AdminAccessTest}.php`,
  `tests/Unit/MediaItemTest.php`.

Le squelette Laravel standard (routes, config, `public/index.php`, etc.) a été généré par
`composer create-project laravel/laravel` puis fusionné à la racine du projet.

## 3. Architecture retenue

- **Données** : SQLite (`database/database.sqlite`), migrations Eloquent. Le fonds photo reste sur
  le disque (`images/`, jamais copié) ; seules des variantes optimisées sont générées et servies
  publiquement via `storage/app/public/media` (lien symbolique `public/storage`).
- **Documents PDF** (`images/doc/*.pdf`) : servis via une route contrôlée
  (`PressController@show`) plutôt qu'exposés directement dans `public/`, pour ne jamais rendre
  parcourable l'arborescence complète des archives photo.
- **Pipeline média** : `media:scan` (vérité issue du système de fichiers) → `media:import`
  (upsert en base, respecte les retouches manuelles) → `db:seed` (chronologie, domaines,
  citations, retouches curées) → `media:optimize` (variantes). Reproductible et rejouable sans
  perte des corrections manuelles.
- **Administration** : authentification Laravel classique (table `users` + colonne `is_admin`),
  middleware `EnsureUserIsAdmin`, CRUD pour la médiathèque et la chronologie (ajout de période,
  ajout/modification/suppression d'évènement, correction de date/lieu/catégorie/confiance sur une
  photo, mise en avant, dépublication).

## 4. Identité visuelle

L'analyse des visuels réels du projet (`images/tenge_images/TLT_2025_web.jpg`,
`slide01tlt.jpg`, `on_ne_lache_rien.png`) a montré une identité fondée sur les couleurs du
**drapeau de la RDC** (bleu, rouge, or, étoile) plutôt que sur le vert suggéré initialement dans le
brief — la palette a été ajustée en conséquence (`resources/css/app.css`, tokens `--color-congo-*`,
`--color-gold-*`, `--color-accent-red`). Typographies : Fraunces (titres, serif institutionnel) et
Instrument Sans (texte).

## 5. Chiffres — fonds photographique

| Indicateur | Valeur |
|---|---|
| Images trouvées | 5 179 |
| Images publiées (hors doublons, hors fichiers corrompus) | 4 099 |
| Doublons / quasi-doublons détectés | 1 078 |
| Fichiers illisibles/corrompus détectés et dépubliés (originaux conservés) | 2 |
| Date confirmée (EXIF, avec garde-fou anti-date-aberrante) | 3 069 |
| Date probable (nom de fichier / dossier mensuel) | 533 |
| Non datées | 499 |
| Documents PDF catalogués | 24 |
| Périodes de chronologie | 5 |
| Évènements de chronologie | 8 (sourcés individuellement) |
| Domaines d'action | 8 |

Détail complet : [docs/audit-des-images.md](audit-des-images.md).

**Point de vigilance corrigé en cours de projet** : le premier passage du scan faisait confiance
aveuglément aux dates EXIF ; une poignée d'appareils avaient une horloge interne déréglée
(années 1002, 1663, 2109...). Un garde-fou de plausibilité (2000 – année courante + 1) a été ajouté
et le scan relancé — détecté via un contrôle du filtre « Année » de la galerie en conditions
réelles.

## 6. Pages livrées

`/` `/parcours` `/chronologie` `/chronologie/{periode}` `/actions` `/actions/{domaine}`
`/galerie` (filtres catégorie/année/recherche + lightbox clavier) `/vision` `/videos` `/presse`
`/presse/{document}` `/mouvement` `/contact` `/mentions-legales` `/confidentialite`
`/credits-photographiques` `/sitemap.xml` + espace `/admin` (login, tableau de bord, médiathèque,
chronologie).

## 7. Sources consultées

Voir le détail complet, avec niveau de fiabilité par information, dans
[docs/recherches-et-sources.md](recherches-et-sources.md). Sources principales : site officiel
telithotenge.cd, LGA'L Society, actualite.cd, foxtime.cd, acp.cd, lebaobab.net, Jeune Afrique
(remaniement Suminwa II), et les archives administratives internes (décisions, rapports
statistiques de la commune de Kintambo).

**Information déterminante vérifiée** : Te Litho Tenge Didier a été écarté du gouvernement lors du
remaniement Suminwa II (7-8 août 2025). Le site ne lui attribue donc aucune fonction
gouvernementale actuelle — toutes ses fonctions (Bourgmestre, ministre provincial, ministre
délégué) sont présentées au passé, avec leurs dates.

## 8. Informations nécessitant validation par le client

1. Date exacte de début du mandat de Bourgmestre (2008 selon la presse vs. archives internes
   datées à partir de 2012-2013).
2. Intitulé exact et dates précises du portefeuille « ministre provincial de l'Environnement ».
3. Statut actuel de la fonction d'interfédéral UNC (information d'août 2023, non reconfirmée).
4. Date de naissance (9 mai 1970) — recoupée par des sources non officielles uniquement.
5. Établissement et intitulé exacts du master obtenu « en Europe ».

## 9. Tests exécutés et résultats

```
php artisan test
25 tests, 66 assertions — 25 passed, 0 failed
```

Couverture : pages publiques (accueil, parcours, chronologie + page 404 sur période inconnue,
actions, galerie + filtres, vision, mouvement, vidéos, presse, pages légales, sitemap XML),
formulaire de contact (soumission valide, consentement obligatoire, piège anti-spam, champs
requis), accès admin (invité redirigé, utilisateur non-admin refusé, admin autorisé, mise à jour
d'une photo, création/suppression d'un évènement de chronologie), modèle `MediaItem` (scope
`published`, URL de variante, route key).

**Vérification visuelle** : les captures d'écran via le navigateur intégré n'ont pas pu être
obtenues dans cet environnement (timeout systématique de l'outil de capture, indépendant de
l'application — navigation, extraction de texte et requêtes réseau fonctionnent normalement). La
vérification a donc été effectuée par extraction du texte rendu, inspection de l'arbre
d'accessibilité (desktop et mobile 375×812), tests de bout en bout via `curl` sur toutes les
routes, et tests automatisés. Une vérification visuelle humaine (capture d'écran classique dans un
navigateur) reste recommandée avant mise en production.

## 10. Recommandations

- Changer le mot de passe administrateur par défaut avant toute mise en ligne.
- Faire valider par Te Litho Tenge Didier ou son équipe les points listés en §8.
- Ajouter des données structurées `VideoObject`/`Article` supplémentaires si de nouvelles pages de
  contenu éditorial sont créées (le schéma `Person` est en place sur la page d'accueil).
- Envisager, une fois le nombre de photographies datées avec certitude plus élevé, d'enrichir
  automatiquement les fiches `featured` par un tri qualitatif plus fin que la simple résolution.
- Faire une revue humaine des ~2 000 photos restées en catégorie générique « Archives de terrain »
  pour en reclassifier une partie dans des catégories plus précises via l'espace `/admin`.

## 11. Lancement et procédure d'ajout de photos

Voir [README.md](../README.md) — sections « Installation locale » et « Ajouter de nouvelles
photos ».

## 12. Correctif post-livraison — images non affichées (21 juillet 2026)

Voir [docs/diagnostic-images-2026-07-21.md](diagnostic-images-2026-07-21.md) pour le diagnostic
complet. Résumé :

- **Cause racine** : `DocumentRoot` du virtual host Apache `tlt.test` pointait sur la racine du
  projet au lieu de `public/` (fichier `D:\laragon\etc\apache2\sites-enabled\auto.tlt.test.conf`,
  hors du dépôt). Laravel ne s'exécutait jamais via ce domaine ; Apache renvoyait un listing brut
  du dossier projet, exposant `.env` publiquement.
- **Correctif** : `DocumentRoot`/`<Directory>` repointés vers `D:/laragon/www/tlt/public`, Apache
  redémarré. Les autres sites hébergés sur la même instance Laragon ont été vérifiés indemnes.
- **Correctif complémentaire déjà en place** : `config/filesystems.php` génère désormais des URLs
  relatives (`/storage/...`) au lieu de dépendre d'`APP_URL`.
- **Preuve** : téléchargement et décodage réel (`getimagesize()`) de plusieurs images via
  `http://tlt.test/storage/media/...` — statut 200, `Content-Type: image/jpeg`, tailles et
  dimensions correctes.
- **Action recommandée avant mise en production** : régénérer `APP_KEY` (`php artisan key:generate`)
  suite à l'exposition temporaire de `.env`.
