# Validation Coaster World DATA v1.2.0 — 04/10/2026

## Périmètre

Lot 2 : import Excel sur la référence v1.1.0. Développement dans une copie isolée ; la référence complète reste inchangée. Aucune base réelle de l’utilisateur n’a été utilisée. Le schéma, les dépendances, le contrat API et les scripts Windows sont conservés.

## Contrôles exécutés

| Contrôle | Méthode | Résultat réel |
| --- | --- | --- |
| Tests Excel sur SQLite | `php artisan test --compact tests/Feature/ExcelImportTest.php` | Réussi : 16 tests, 122 assertions. |
| Tests avec le pilote MySQL | PHPUnit sur MariaDB 10.11.14 ; dix fichiers de tests ciblés ci-dessous | Réussi : 71 tests, 413 assertions. |
| Installation sur base vide | `php artisan migrate --force` puis `php artisan cw:data:install --no-migrate` sur MariaDB | Réussi. |
| Compilation des vues | `php artisan view:cache` | Réussi. |
| Cache et inventaire des routes | `php artisan route:cache`, `route:list --path=excel-imports` puis `optimize:clear` | Réussi ; quatre routes Excel ajoutées. |
| Syntaxe PHP | `php -l` sur les 31 fichiers PHP/Blade créés ou modifiés | Réussi. |
| Format | `php vendor/bin/pint --dirty --format agent` | Réussi. |
| Traductions | Comparaison des clés des cinq fichiers `excel.php`, comparaison sémantique des fichiers `admin.php` avec la base | Réussi : 82 clés Excel identiques entre langues ; seule la traduction du type Zone est ajoutée aux traductions admin existantes. Pint reformate leur représentation PHP. |
| Parcours réels | Chromium, application reliée à MariaDB par le pilote MySQL | Réussi : huit parcours décrits ci-dessous, aucune erreur JavaScript. |
| Affichage | Import et aperçu, cinq langues × trois largeurs × deux thèmes | Réussi : 60 contrôles, aucun débordement horizontal global ; tableaux avec défilement interne. |
| Relecture visuelle | Captures 375 et 1440 px, clair/sombre et données développées sur mobile | Captures inspectées ; formulaire, historique, aperçu et défilement interne des données conformes. |
| Différences | `git diff --check`, relecture des services, routes, vues et traductions | Réussi. |

### Tests MySQL ciblés

```bash
php vendor/bin/phpunit \
  tests/Feature/ExcelImportTest.php \
  tests/Feature/ControlledIngestionTest.php \
  tests/Feature/MultiEntityIngestionTest.php \
  tests/Feature/ParkContentIngestionTest.php \
  tests/Feature/ThemeParksWikiPilotIngestionTest.php \
  tests/Feature/DataReviewQueueTest.php \
  tests/Feature/AdminInterfaceTest.php \
  tests/Feature/PublicApiV1Test.php \
  tests/Feature/DataReliabilityTest.php \
  tests/Feature/DataOperationsTest.php
```

Exécution avec une base de test dédiée, `DB_CONNECTION=mysql`, PHP 8.3 et MariaDB 10.11.14. La suite API existante suppose `CW_DATA_API_REQUIRE_KEY=false` ; ce réglage est fourni uniquement au banc de test. Un premier passage avec l’API privée a produit quatre réponses 401 attendues pour des requêtes sans clé. La suite a ensuite été relancée avec son réglage attendu et a réussi. Le modèle `.env.example` livré garde l’API protégée par clé et MySQL par défaut.

### Cas Excel couverts

- Lecture réelle de Spirou Provence : préparation sans entités ni observations, puis import avec cinq coasters, zones, attractions et POI ; maintien d’une seule fiche par nom regroupé.
- Réimport du même fichier : même lot, mêmes compteurs d’entités, d’observations, de valeurs finales et d’historique.
- Fichier modifié : nouveau lot, mêmes fiches ; année différente conservée comme proposition, valeur finale précédente préservée.
- Ajout/retrait du pays dans le fichier sans changement d’identité ; parc avec nom local corrigé retrouvé par identifiant vérifié.
- Danse Macabre : parent Efteling sélectionné ou minimal, date du 31/10/2024, correction humaine du constructeur préservée.
- Noms de parc ambigus, collision Attraction / Coaster et identifiant rattaché à un autre parc : import concerné laissé à résoudre.
- Identifiants vérifiés et réimport après nouvelle appellation : fournisseur existant utilisé, fiche conservée ; fournisseur désactivé signalé.
- Dictionnaire existant : règles d’année d’ouverture respectées, y compris quand la proposition avait déjà été observée avant un durcissement de règle.
- Valeurs incertaines conservées comme observations et non intégrées comme valeurs finales.
- Cellules à chaînes partagées et texte enrichi ; dates sérialisées Windows et Mac ; valeurs fausses conservées ; formules ignorées.
- Modèles vides, archive invalide, XML avec entités externes, mauvais parc et confirmation absente : refus sans modification des fiches.
- Consultation non authentifiée bloquée ; rôle lecteur sans droit d’import ; rôle éditeur autorisé à préparer un import.

Les quatre fichiers de test XLSX sont des copies inchangées des modèles et fiches fournis. Les variantes des tests sont créées dans des fichiers temporaires et supprimées après le test.

### Parcours navigateur couverts

1. Chargement depuis l’accueil avec les formulaires et leur protection CSRF.
2. Aperçu de Spirou Provence : base métier encore vide.
3. Confirmation : un parc, 28 attractions dont cinq coasters, 17 POI et 11 zones, soit 57 candidats intégrés.
4. Nouveau chargement du même fichier : lot existant rouvert.
5. Reprise du lot traité : compteurs inchangés.
6. Lien depuis une fiche parc : parc présélectionné.
7. Modèle parc vide : message de validation affiché.
8. Détails et sources développés sur mobile : défilement interne, sans débordement global.

Les écrans import et aperçu ont été contrôlés en FR/EN/DE/ES/IT, en clair/sombre, à 375, 768 et 1440 px. Le navigateur local initial était incomplet ; il a été restauré depuis son archive avant l’exécution réussie. Cette réparation concerne le banc de validation et n’ajoute aucun fichier à l’application.

## Archives

Les ZIP sont contrôlés avant livraison : intégrité, arborescence, version, correspondance des fichiers avec le projet et empreintes SHA-256. L’application du ZIP de mise à jour à la référence v1.1.0 doit reproduire exactement le contenu de l’archive complète v1.2.0. La référence v1.1.0 est contrôlée par son empreinte avant et après préparation.

Les archives excluent `.env`, bases SQLite, données de test exécutées, caches, journaux, métadonnées Git et dépendances du banc de test. L’archive complète inclut les dépendances PHP du socle. Les fixtures XLSX de la suite de tests sont incluses pour rendre les tests reproductibles.

## Limites

- L’exécution native des scripts Windows dans Laragon n’est pas disponible dans cet environnement Linux. La checklist du guide reste à exécuter sur la machine cible.
- Formats pris en charge : XLSX conforme aux modèles ; pas de XLS ancien, classeur arbitraire, exécution de formules ou import des images incorporées.
- Un seul parc parent et 250 fiches par lot. Les tableaux complémentaires sont conservés pour vérification ; leur adaptation aux tables métier spécialisées reste hors de ce lot.
- Les sources externes ne sont pas consultées par l’import. Les tests ne prouvent pas la disponibilité actuelle des services fournisseurs.
- Les nouvelles valeurs exploitables sont retenues après confirmation ; les différences avec les valeurs finales existantes nécessitent une décision. Les rapprochements par simple ressemblance de nom restent manuels.
- Les champs spécifiques sont des champs flexibles `excel.*` ; ils ne créent pas une nouvelle entité Animal, Restaurant ou Boutique distincte des modèles existants.
- La suite complète du dépôt n’a pas été exécutée : les dix fichiers ciblés couvrent l’import, l’ingestion, la revue, la fiabilité, l’administration, l’API et les opérations concernées.
- Le fichier binaire chargé n’est pas conservé par l’application. Les données lues et leur provenance restent conservées dans le lot.

L’ajout IA par nom, la découverte par pays et les autres jalons ne sont pas annoncés comme livrés dans cette version.
