# Amélioration de la page Staff - Virements Salaires

## Résumé des modifications

Cette implémentation ajoute la fonctionnalité complète de création et génération de PDF pour les virements de salaires dans l'interface Staff.

## Fichiers créés

### 1. `/app/api/staff/virements-salaires/generate-pdf/route.ts`
API route pour générer les PDFs de feuilles d'appel via PDFMonkey.

**Fonctionnalités :**
- Authentification Staff requise
- Récupère les détails du virement de salaire (`salary_transfer`)
- Récupère les contrats de la période (filtrés par mois de `payment_date`)
- Construit le payload PDFMonkey selon le format du workflow n8n
- Génère le PDF via l'API PDFMonkey (template F4BCB5FF-1AB1-4CEE-B57F-82A6B9893E9E)
- Polling du statut de génération (15 tentatives max, intervalle 3s)
- Téléchargement du PDF généré
- Upload sur S3 dans `virements-salaires/{org_id}/{transfer_id}-{timestamp}.pdf`
- Mise à jour de `salary_transfers.callsheet_url` avec l'URL S3

**Payload PDFMonkey :**
```json
{
  "document": {
    "document_template_id": "F4BCB5FF-1AB1-4CEE-B57F-82A6B9893E9E",
    "status": "pending",
    "payload": {
      "organisation": "Nom de l'organisation",
      "periode": "Janvier 2025",
      "date_echeance": "15/01/2025",
      "total_net": "1234,56",
      "contrats": [
        {
          "nom": "Dupont",
          "prenom": "Jean",
          "iban": "FR76...",
          "montant_net": "456,78",
          "date_paiement": "20/01/2025"
        }
      ]
    }
  }
}
```

### 2. `/app/api/staff/virements-salaires/create/route.ts`
API route pour créer un nouvel enregistrement de virement de salaire.

**Fonctionnalités :**
- Authentification Staff requise
- Validation des champs obligatoires : `org_id`, `period_month`, `deadline`, `mode`
- Vérification que l'organisation existe
- Insertion dans la table `salary_transfers`
- Retourne le nouvel enregistrement créé

**Champs du formulaire :**
- `org_id` (requis) : ID de l'organisation
- `period_month` (requis) : Mois de la période (format YYYY-MM)
- `period_label` (optionnel) : Libellé de la période (ex: "Janvier 2025")
- `deadline` (requis) : Date d'échéance (format YYYY-MM-DD)
- `mode` (requis) : Mode de virement (SEPA, VIREMENT, odentas_reverse)
- `total_net` (optionnel) : Total net (calculé automatiquement lors de la génération PDF)
- `notes` (optionnel) : Notes internes

## Fichiers modifiés

### 3. `/components/staff/SalaryTransfersGrid.tsx`
Composant client amélioré avec création et génération de PDF.

**Nouvelles fonctionnalités :**

#### A. Bouton de création
- Bouton "Créer un virement" en haut de la page
- Ouvre un modal avec formulaire complet

#### B. Modal de création
- Formulaire avec tous les champs nécessaires
- Validation côté client (champs requis)
- Auto-génération du `period_label` basé sur `period_month`
- Sélection d'organisation via dropdown
- Sélection du mode (SEPA/VIREMENT/odentas_reverse)
- Appel à l'API `/api/staff/virements-salaires/create`
- Mise à jour temps réel de la liste après création

#### C. Colonne Actions
- Nouvelle colonne "Actions" dans le tableau
- Bouton "Générer PDF" pour chaque ligne
  - État "Génération..." pendant le traitement
  - État "Regénérer PDF" si déjà généré
  - Confirmation avant génération
- Appel à l'API `/api/staff/virements-salaires/generate-pdf`
- Mise à jour de l'URL de la feuille d'appel après génération

#### D. États et gestion
- `showCreateModal` : contrôle l'affichage du modal
- `createForm` : état du formulaire de création
- `creating` : indicateur de création en cours
- `generatingPdfForId` : ID du transfert en cours de génération PDF
- Fonctions `handleCreateTransfer()` et `handleGeneratePdf()`

## Architecture technique

### Flux de création
1. Utilisateur Staff clique sur "Créer un virement"
2. Modal s'ouvre avec formulaire
3. Utilisateur remplit les champs obligatoires
4. Soumission du formulaire → POST `/api/staff/virements-salaires/create`
5. API valide et insère dans `salary_transfers`
6. Mise à jour temps réel via Supabase Realtime
7. Modal se ferme, nouvel enregistrement visible dans le tableau

### Flux de génération PDF
1. Utilisateur Staff clique sur "Générer PDF" pour un virement
2. Confirmation demandée
3. POST `/api/staff/virements-salaires/generate-pdf` avec `salary_transfer_id`
4. API récupère les contrats de la période
5. Construction du payload PDFMonkey
6. Appel à l'API PDFMonkey pour créer le document
7. Polling du statut (max 15 tentatives, 3s entre chaque)
8. Téléchargement du PDF généré
9. Upload sur S3
10. Mise à jour de `salary_transfers.callsheet_url`
11. Mise à jour de l'interface (URL du PDF visible, bouton devient "Regénérer PDF")

### Sécurité
- Toutes les routes API vérifient l'authentification Supabase
- Vérification du statut Staff via `users.is_staff`
- Utilisation du Service Role Key pour les opérations côté serveur
- Bearer token requis dans les headers

### Variables d'environnement requises
```env
NEXT_PUBLIC_SUPABASE_URL=...
SUPABASE_SERVICE_ROLE_KEY=...
PDFMONKEY_URL=https://api.pdfmonkey.io/api/v1/documents
PDFMONKEY_API_KEY=...
AWS_REGION=eu-west-3
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_S3_BUCKET=nouvel-espace-paie
```

## Filtrage des contrats

Les contrats sont filtrés selon la logique suivante :
- Contrats de l'organisation (`org_id` du virement)
- Contrats ayant une `payment_date` non nulle
- Le **mois** de `payment_date` doit correspondre au **mois** de `period_month`

Exemple :
- `period_month` = "2025-01" (Janvier 2025)
- Contrats inclus : ceux avec `payment_date` entre "2025-01-01" et "2025-01-31"

## Format des données

### Structure `salary_transfers`
```typescript
{
  id: string;
  org_id: string;
  period_month: string; // Format YYYY-MM-DD
  period_label: string | null;
  mode: string; // SEPA, VIREMENT, odentas_reverse
  deadline: string; // Format YYYY-MM-DD
  total_net: string | number | null;
  callsheet_url: string | null; // URL S3 du PDF
  notification_sent: boolean | null;
  notification_ok: boolean | null;
  client_wire_received_at: string | null;
  notes: string | null;
  created_at: string;
  updated_at: string;
}
```

### Structure `cddu_contracts` (champs utilisés)
```typescript
{
  id: string;
  org_id: string;
  employee_first_name: string;
  employee_last_name: string;
  employee_iban: string;
  payment_date: string; // Format YYYY-MM-DD
  net_amount: string | number;
}
```

## Tests recommandés

1. **Création d'un virement**
   - Vérifier que tous les champs obligatoires sont validés
   - Vérifier que le nouvel enregistrement apparaît dans la liste
   - Vérifier que l'auto-génération du `period_label` fonctionne

2. **Génération de PDF**
   - Créer un virement pour une période avec des contrats
   - Cliquer sur "Générer PDF"
   - Vérifier que le PDF est créé sur S3
   - Vérifier que l'URL est mise à jour dans `callsheet_url`
   - Vérifier le contenu du PDF (organisation, période, contrats)

3. **Cas limites**
   - Virement pour une période sans contrats (doit générer un PDF vide ou avec 0 contrats)
   - Regénération d'un PDF existant
   - Erreurs réseau (timeout PDFMonkey, erreur S3)

## Améliorations futures possibles

1. **Calcul automatique du total_net**
   - Lors de la création, proposer un calcul automatique basé sur les contrats de la période

2. **Aperçu des contrats**
   - Afficher le nombre de contrats qui seront inclus dans le PDF avant génération

3. **Notifications**
   - Intégrer l'envoi de notifications après génération du PDF

4. **Historique**
   - Garder l'historique des générations (versions multiples du PDF)

5. **Validation des IBANs**
   - Vérifier que tous les contrats de la période ont des IBANs valides avant génération

6. **Export Excel**
   - Proposer un export Excel en plus du PDF

## Notes de compatibilité

- Compatible avec Next.js 14+ (App Router)
- Utilise Supabase Realtime pour les mises à jour en temps réel
- Compatible avec le workflow n8n existant (même format de payload)
- Template PDFMonkey : F4BCB5FF-1AB1-4CEE-B57F-82A6B9893E9E
