# Guide de test - Virements Salaires Staff

## Prérequis

1. **Être connecté en tant qu'utilisateur Staff**
   - Votre compte doit avoir `is_staff = true` dans la table `users`

2. **Avoir des données de test**
   - Au moins une organisation dans `organizations`
   - Des contrats CDDU dans `cddu_contracts` avec :
     - `org_id` correspondant à l'organisation
     - `payment_date` définie
     - `employee_first_name`, `employee_last_name`, `employee_iban`, `net_amount` remplis

3. **Variables d'environnement configurées**
   ```env
   PDFMONKEY_URL=https://api.pdfmonkey.io/api/v1/documents
   PDFMONKEY_API_KEY=<votre_clé>
   AWS_REGION=eu-west-3
   AWS_ACCESS_KEY_ID=<votre_clé>
   AWS_SECRET_ACCESS_KEY=<votre_clé>
   AWS_S3_BUCKET=nouvel-espace-paie
   ```

## Étapes de test

### 1. Accéder à la page
- URL : `/staff/virements-salaires`
- Vérifier que la page s'affiche correctement
- Vérifier que le bouton "Créer un virement" est visible en haut à droite

### 2. Créer un nouveau virement

#### 2.1 Ouvrir le modal
- Cliquer sur le bouton "+ Créer un virement"
- Le modal doit s'ouvrir avec le formulaire

#### 2.2 Remplir le formulaire
- **Organisation** : Sélectionner une organisation existante
- **Période (mois)** : Sélectionner un mois (ex: 2025-01)
  - Vérifier que le "Libellé de la période" se remplit automatiquement
- **Date d'échéance** : Sélectionner une date (ex: 2025-01-15)
- **Mode** : Sélectionner SEPA, VIREMENT ou odentas_reverse
- **Total Net** (optionnel) : Laisser vide pour l'instant
- **Notes** (optionnel) : Ajouter une note de test

#### 2.3 Valider la création
- Cliquer sur "Créer"
- Vérifier l'alerte de succès
- Vérifier que le modal se ferme
- Vérifier que le nouveau virement apparaît dans le tableau

### 3. Générer le PDF

#### 3.1 Vérifier les contrats de test
Avant de générer, assurez-vous qu'il existe des contrats pour le mois sélectionné.

**Exemple de requête SQL pour vérifier :**
```sql
SELECT 
  id, 
  employee_first_name, 
  employee_last_name, 
  employee_iban, 
  payment_date, 
  net_amount
FROM cddu_contracts
WHERE org_id = '<votre_org_id>'
  AND DATE_TRUNC('month', payment_date) = '<votre_period_month>'::date;
```

#### 3.2 Générer le PDF
- Dans la colonne "Actions", cliquer sur "Générer PDF"
- Confirmer dans la boîte de dialogue
- Le bouton doit afficher "Génération..."
- Attendre la fin de la génération (peut prendre 10-30 secondes)
- Vérifier l'alerte de succès avec le nombre de contrats

#### 3.3 Vérifier le résultat
- Le bouton doit maintenant afficher "Regénérer PDF"
- Dans la colonne "Feuille d'appel", l'URL du PDF doit être visible
- Cliquer sur l'URL pour ouvrir le PDF dans un nouvel onglet

#### 3.4 Vérifier le contenu du PDF
Le PDF doit contenir :
- Le nom de l'organisation
- La période (ex: "Janvier 2025")
- La date d'échéance formatée
- Le total net de tous les contrats
- Un tableau avec tous les contrats :
  - Nom et prénom de l'employé
  - IBAN
  - Montant net
  - Date de paiement

### 4. Tests de cas limites

#### 4.1 Période sans contrats
- Créer un virement pour un mois sans contrats
- Générer le PDF
- Vérifier que le PDF est créé avec 0 contrats
- Le total net doit être 0,00

#### 4.2 Regénération
- Pour un virement déjà généré, cliquer sur "Regénérer PDF"
- Vérifier qu'un nouveau PDF est créé
- L'URL dans `callsheet_url` doit être mise à jour

#### 4.3 Validation du formulaire
- Ouvrir le modal de création
- Essayer de soumettre sans remplir les champs obligatoires
- Le bouton "Créer" doit être désactivé
- Remplir uniquement certains champs → le bouton doit rester désactivé

### 5. Tests des filtres existants

#### 5.1 Filtrer par organisation
- Utiliser le filtre "Organisation" en haut de la page
- Vérifier que seuls les virements de l'organisation sélectionnée sont affichés

#### 5.2 Recherche textuelle
- Utiliser le champ de recherche
- Taper le nom d'une période ou une note
- Vérifier que les résultats sont filtrés

### 6. Vérifications en base de données

#### 6.1 Vérifier l'enregistrement créé
```sql
SELECT * FROM salary_transfers 
WHERE id = '<id_du_virement_créé>'
ORDER BY created_at DESC;
```

Vérifier que :
- Tous les champs sont correctement remplis
- `callsheet_url` est NULL avant génération
- `callsheet_url` contient une URL S3 après génération

#### 6.2 Vérifier le fichier S3
- Se connecter à la console AWS S3
- Naviguer vers le bucket `nouvel-espace-paie`
- Dossier : `virements-salaires/<org_id>/`
- Vérifier que le fichier PDF existe
- Format du nom : `<transfer_id>-<timestamp>.pdf`

### 7. Tests d'erreurs

#### 7.1 Organisation inexistante
Essayer de créer un virement avec un `org_id` invalide via l'API (tests manuels ou Postman) :
```bash
curl -X POST http://localhost:3000/api/staff/virements-salaires/create \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "org_id": "00000000-0000-0000-0000-000000000000",
    "period_month": "2025-01",
    "deadline": "2025-01-15",
    "mode": "SEPA"
  }'
```
Doit retourner une erreur 404 "Organization not found"

#### 7.2 Virement inexistant
Essayer de générer un PDF pour un `salary_transfer_id` invalide :
```bash
curl -X POST http://localhost:3000/api/staff/virements-salaires/generate-pdf \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "salary_transfer_id": "00000000-0000-0000-0000-000000000000"
  }'
```
Doit retourner une erreur 404 "Salary transfer not found"

#### 7.3 Authentification
- Se déconnecter
- Essayer d'accéder à `/staff/virements-salaires`
- Doit afficher "Accès refusé"

#### 7.4 Utilisateur non-staff
- Se connecter avec un compte non-staff (`is_staff = false`)
- Essayer d'accéder à `/staff/virements-salaires`
- Doit afficher "Accès refusé - Cette page est réservée au Staff"

## Checklist finale

- [ ] Création d'un virement réussie
- [ ] Modal se ferme après création
- [ ] Nouveau virement visible dans la liste
- [ ] Génération PDF réussie (avec contrats)
- [ ] URL du PDF correcte dans le tableau
- [ ] PDF téléchargeable et contenu correct
- [ ] Regénération PDF réussie
- [ ] Filtres fonctionnent correctement
- [ ] Cas sans contrats géré
- [ ] Validation du formulaire fonctionne
- [ ] Authentification et autorisation Staff vérifiées
- [ ] Fichiers S3 créés correctement
- [ ] Base de données mise à jour correctement

## Logs à surveiller

### Console navigateur
- Vérifier qu'il n'y a pas d'erreurs JavaScript
- Vérifier les logs de Supabase Realtime

### Logs serveur (Next.js)
```
[staff/virements-salaires] Organizations count: X
[staff/virements-salaires] supabase fetch salary_transfers result count: X
```

### Console réseau (DevTools)
- Vérifier les appels API :
  - `POST /api/staff/virements-salaires/create` → 200
  - `POST /api/staff/virements-salaires/generate-pdf` → 200
- Vérifier les temps de réponse (génération PDF peut prendre 10-30s)

## En cas de problème

### Le PDF ne se génère pas
1. Vérifier les logs serveur pour voir l'erreur PDFMonkey ou S3
2. Vérifier que `PDFMONKEY_API_KEY` est correcte
3. Vérifier que le template ID `F4BCB5FF-1AB1-4CEE-B57F-82A6B9893E9E` existe
4. Vérifier les credentials AWS

### Les contrats ne sont pas inclus
1. Vérifier que les contrats ont une `payment_date` non nulle
2. Vérifier que le mois de `payment_date` correspond à `period_month`
3. Exemple : si `period_month = "2025-01-01"`, les contrats avec `payment_date` entre "2025-01-01" et "2025-01-31" seront inclus

### Le modal ne s'ouvre pas
1. Vérifier la console JavaScript pour des erreurs
2. Vérifier que le composant `SalaryTransfersGrid` est bien chargé (client-side)

### Realtime ne fonctionne pas
1. Vérifier que la table `salary_transfers` est publiée pour Realtime dans Supabase
2. Vérifier les RLS policies
3. Recharger la page manuellement après création/génération

## Résolution de problèmes courants

### "Missing PDFMONKEY_API_KEY"
Ajouter la variable dans `.env.local` :
```env
PDFMONKEY_API_KEY=votre_clé_api
```

### "Failed to update salary_transfers"
Vérifier les RLS policies sur la table `salary_transfers` :
```sql
-- Policy pour permettre aux staff de mettre à jour
CREATE POLICY "Staff can update salary_transfers"
ON salary_transfers FOR UPDATE
USING (
  EXISTS (
    SELECT 1 FROM users
    WHERE users.id = auth.uid()
    AND users.is_staff = true
  )
);
```

### Timeout lors de la génération
- Augmenter le nombre de tentatives de polling dans `generate-pdf/route.ts` (ligne `maxAttempts`)
- Augmenter l'intervalle de polling (paramètre `intervalMs`)

### URL S3 incorrecte
Vérifier que `AWS_REGION` correspond à la région du bucket S3.
