# Workflow manuel GPT du GenerationBundle

## Configuration

L’URL est résolue dans cet ordre : paramètre de la société active, valeur globale `CAPSULE_GENERATION_GPT_URL`, puis aucune URL. Les URL doivent être absolues, en HTTPS et appartenir à un hôte autorisé (`chatgpt.com` par défaut).

Exemple d’environnement :

```dotenv
CAPSULE_GENERATION_GPT_URL=https://chatgpt.com/g/identifiant-du-gpt
```

Les paramètres société permettent aussi de définir le nom affiché, la consigne, l’ouverture automatique du GPT, le téléchargement automatique du JSON et la présence de l’import CSV dans la modale.

## Parcours

La création asynchrone ouvre immédiatement une fenêtre `about:blank`, crée le batch par POST, télécharge le JSON figé, redirige la fenêtre vers le GPT validé et conserve une modale Bootstrap ouverte dans Capsule. L’utilisateur joint lui-même le JSON à ChatGPT, envoie la consigne, récupère le CSV, puis l’importe pour prévisualisation.

Capsule n’intègre pas ChatGPT dans une iframe, ne joint aucun fichier automatiquement, ne place aucune donnée métier dans l’URL et n’accède jamais au contenu de la fenêtre externe.

Si JavaScript est désactivé, le POST HTML redirige vers la fiche du batch. Celle-ci expose les mêmes actions manuelles : téléchargement, lien GPT, consigne et import CSV.

## Routes et sécurité

- `generation_batch_new` : création HTML ou JSON (`201`, erreurs `422`) ;
- `generation_batch_download_request` : téléchargement du payload figé avec en-têtes anti-cache ;
- `generation_batch_show` : fiche et parcours de secours ;
- `generation_batch_mark_gpt_opened` : trace CSRF d’une tentative d’ouverture, réponse `204` ;
- `generation_result_upload` : analyse du CSV et redirection vers la prévisualisation.

Toutes les recherches utilisent la société active et les Voters du bundle. Les traces distinguent la création, le téléchargement réel et la tentative d’ouverture du GPT. Elles ne prouvent pas que ChatGPT a été effectivement consulté.

## Scénarios manuels navigateur

Vérifier avec une société autorisée :

1. popup autorisée : une seule fenêtre temporaire puis ChatGPT, un seul JSON, modale ouverte ;
2. popup bloquée : batch et téléchargement créés, avertissement et bouton manuel visibles ;
3. téléchargement bloqué : lien « Télécharger à nouveau » utilisable ;
4. validation invalide : popup fermée, aucun téléchargement, erreurs par champ, valeurs conservées ;
5. erreur réseau ou serveur : popup fermée, alerte globale et bouton réactivé ;
6. URL GPT absente : création et téléchargement possibles, bouton GPT désactivé ;
7. double clic et réseau lent : un seul POST grâce au verrou de soumission ;
8. copie : retour accessible « Consigne copiée » ;
9. upload CSV : création d’un résultat et prévisualisation, aucune création métier immédiate ;
10. JavaScript désactivé : redirection vers la fiche et parcours manuel complet.

Le bloc SQL additif requis est présent dans `update.sql`. Il doit être relu et exécuté selon la procédure habituelle de déploiement ; aucune migration n’est lancée automatiquement.
