espace-paie-odentas/VIREMENTS_SALAIRES_STAFF_FEATURE.md

235 lines
8 KiB
Markdown

# 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