# 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