# 🔍 Diagnostic Complet - Workflow CSV Booking

**Date**: 5 décembre 2025
**Problème**: Le workflow d'envoi de demande de booking ne fonctionne pas

---

## ✅ Vérifications Effectuées

### 1. Backend ✅
- ✅ Backend en cours d'exécution (port 4000)
- ✅ Configuration SMTP corrigée (variables ajoutées au schéma Joi)
- ✅ Email adapter initialisé correctement avec DNS bypass
- ✅ Module CsvBookingsModule importé dans app.module.ts
- ✅ Controller CsvBookingsController bien configuré
- ✅ Service CsvBookingService bien configuré
- ✅ MinIO container en cours d'exécution
- ✅ Bucket 'xpeditis-documents' existe dans MinIO

### 2. Frontend ✅
- ✅ Page `/dashboard/booking/new` existe
- ✅ Fonction `handleSubmit` bien configurée
- ✅ FormData correctement construit avec tous les champs
- ✅ Documents ajoutés avec le nom 'documents' (pluriel)
- ✅ Appel API via `createCsvBooking()` qui utilise `upload()`
- ✅ Gestion d'erreurs présente (affiche message si échec)

---

## 🔍 Points de Défaillance Possibles

### Scénario 1: Erreur Frontend (Browser Console)
**Symptômes**: Le bouton "Envoyer la demande" ne fait rien, ou affiche un message d'erreur

**Vérification**:
1. Ouvrir les DevTools du navigateur (F12)
2. Aller dans l'onglet Console
3. Cliquer sur "Envoyer la demande"
4. Regarder les erreurs affichées

**Erreurs Possibles**:
- `Failed to fetch` → Problème de connexion au backend
- `401 Unauthorized` → Token JWT expiré
- `400 Bad Request` → Données invalides
- `500 Internal Server Error` → Erreur backend (voir logs)

---

### Scénario 2: Erreur Backend (Logs)
**Symptômes**: La requête arrive au backend mais échoue

**Vérification**:
```bash
# Voir les logs backend en temps réel
tail -f /tmp/backend-startup.log

# Puis créer un booking via le frontend
```

**Erreurs Possibles**:
- **Pas de logs `=== CSV Booking Request Debug ===`** → La requête n'arrive pas au controller
- **`At least one document is required`** → Aucun fichier uploadé
- **`User authentication failed`** → Problème de JWT
- **`Organization ID is required`** → User sans organizationId
- **Erreur S3/MinIO** → Upload de fichiers échoué
- **Erreur Email** → Envoi email échoué (ne devrait plus arriver après le fix)

---

### Scénario 3: Validation Échouée
**Symptômes**: Erreur 400 Bad Request

**Causes Possibles**:
- **Port codes invalides** (origin/destination): Doivent être exactement 5 caractères (ex: NLRTM, USNYC)
- **Email invalide** (carrierEmail): Doit être un email valide
- **Champs numériques** (volumeCBM, weightKG, etc.): Doivent être > 0
- **Currency invalide**: Doit être 'USD' ou 'EUR'
- **Pas de documents**: Au moins 1 fichier requis

---

### Scénario 4: CORS ou Network
**Symptômes**: Erreur CORS ou network error

**Vérification**:
1. Ouvrir DevTools → Network tab
2. Créer un booking
3. Regarder la requête POST vers `/api/v1/csv-bookings`
4. Vérifier:
   - Status code (200/201 = OK, 4xx/5xx = erreur)
   - Response body (message d'erreur)
   - Request headers (Authorization token présent?)

**Solutions**:
- Backend et frontend doivent tourner simultanément
- Frontend: `http://localhost:3000`
- Backend: `http://localhost:4000`

---

## 🧪 Tests à Effectuer

### Test 1: Vérifier que le Backend Reçoit la Requête

1. **Ouvrir un terminal et monitorer les logs**:
   ```bash
   tail -f /tmp/backend-startup.log | grep -i "csv\|booking\|error"
   ```

2. **Dans le navigateur**:
   - Aller sur: http://localhost:3000/dashboard/booking/new?rateData=%7B%22companyName%22%3A%22Test%20Carrier%22%2C%22companyEmail%22%3A%22carrier%40test.com%22%2C%22origin%22%3A%22NLRTM%22%2C%22destination%22%3A%22USNYC%22%2C%22containerType%22%3A%22LCL%22%2C%22priceUSD%22%3A1000%2C%22priceEUR%22%3A900%2C%22primaryCurrency%22%3A%22USD%22%2C%22transitDays%22%3A22%7D&volumeCBM=2.88&weightKG=1500&palletCount=3
   - Ajouter au moins 1 document
   - Cliquer sur "Envoyer la demande"

3. **Dans les logs, vous devriez voir**:
   ```
   === CSV Booking Request Debug ===
   req.user: { id: '...', organizationId: '...' }
   req.body: { carrierName: 'Test Carrier', ... }
   files: 1
   ================================
   Creating CSV booking for user ...
   Uploaded 1 documents for booking ...
   CSV booking created with ID: ...
   Email sent to carrier: carrier@test.com
   Notification created for user ...
   ```

4. **Si vous NE voyez PAS ces logs** → La requête n'arrive pas au backend. Vérifier:
   - Frontend connecté et JWT valide
   - Backend en cours d'exécution
   - Network tab du navigateur pour voir l'erreur exacte

---

### Test 2: Vérifier le Browser Console

1. **Ouvrir DevTools** (F12)
2. **Aller dans Console**
3. **Créer un booking**
4. **Regarder les erreurs**:
   - Si erreur affichée → noter le message exact
   - Si aucune erreur → le problème est silencieux (voir Network tab)

---

### Test 3: Vérifier Network Tab

1. **Ouvrir DevTools** (F12)
2. **Aller dans Network**
3. **Créer un booking**
4. **Trouver la requête** `POST /api/v1/csv-bookings`
5. **Vérifier**:
   - Status: Doit être 200 ou 201
   - Request Payload: Tous les champs présents?
   - Response: Message d'erreur?

---

## 🔧 Solutions par Erreur

### Erreur: "At least one document is required"
**Cause**: Aucun fichier n'a été uploadé

**Solution**:
- Vérifier que vous avez bien sélectionné au moins 1 fichier
- Vérifier que le fichier est dans les formats acceptés (PDF, DOC, DOCX, JPG, PNG)
- Vérifier que le fichier fait moins de 5MB

---

### Erreur: "User authentication failed"
**Cause**: Token JWT invalide ou expiré

**Solution**:
1. Se déconnecter
2. Se reconnecter
3. Réessayer

---

### Erreur: "Organization ID is required"
**Cause**: L'utilisateur n'a pas d'organizationId

**Solution**:
1. Vérifier dans la base de données que l'utilisateur a bien un `organizationId`
2. Si non, assigner une organization à l'utilisateur

---

### Erreur: S3/MinIO Upload Failed
**Cause**: Impossible d'uploader vers MinIO

**Solution**:
```bash
# Vérifier que MinIO tourne
docker ps | grep minio

# Si non, le démarrer
docker-compose up -d

# Vérifier que le bucket existe
cd apps/backend
node setup-minio-bucket.js
```

---

### Erreur: Email Failed (ne devrait plus arriver)
**Cause**: Envoi email échoué

**Solution**:
- Vérifier que les variables SMTP sont dans le schéma Joi (déjà corrigé ✅)
- Tester l'envoi d'email: `node test-smtp-simple.js`

---

## 📊 Checklist de Diagnostic

Cocher au fur et à mesure:

- [ ] Backend en cours d'exécution (port 4000)
- [ ] Frontend en cours d'exécution (port 3000)
- [ ] MinIO en cours d'exécution (port 9000)
- [ ] Bucket 'xpeditis-documents' existe
- [ ] Variables SMTP configurées
- [ ] Email adapter initialisé (logs backend)
- [ ] Utilisateur connecté au frontend
- [ ] Token JWT valide (pas expiré)
- [ ] Browser console sans erreurs
- [ ] Network tab montre requête POST envoyée
- [ ] Logs backend montrent "CSV Booking Request Debug"
- [ ] Documents uploadés (au moins 1)
- [ ] Port codes valides (5 caractères exactement)
- [ ] Email transporteur valide

---

## 🚀 Commandes Utiles

```bash
# Redémarrer backend
cd apps/backend
npm run dev

# Vérifier logs backend
tail -f /tmp/backend-startup.log | grep -i "csv\|booking\|error"

# Tester email
cd apps/backend
node test-smtp-simple.js

# Vérifier MinIO
docker ps | grep minio
node setup-minio-bucket.js

# Voir tous les endpoints
curl http://localhost:4000/api/docs
```

---

## 📝 Prochaines Étapes

1. **Effectuer les tests** ci-dessus dans l'ordre
2. **Noter l'erreur exacte** qui apparaît (console, network, logs)
3. **Appliquer la solution** correspondante
4. **Réessayer**

Si après tous ces tests le problème persiste, partager:
- Le message d'erreur exact (browser console)
- Les logs backend au moment de l'erreur
- Le status code HTTP de la requête (network tab)

---

**Dernière mise à jour**: 5 décembre 2025
**Statut**:
- ✅ Email fix appliqué
- ✅ MinIO bucket vérifié
- ✅ Code analysé
- ⏳ En attente de tests utilisateur
