8 KiB
8 KiB
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_urlavec l'URL S3
Payload PDFMonkey :
{
"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'organisationperiod_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_labelbasé surperiod_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 modalcreateForm: état du formulaire de créationcreating: indicateur de création en coursgeneratingPdfForId: ID du transfert en cours de génération PDF- Fonctions
handleCreateTransfer()ethandleGeneratePdf()
Architecture technique
Flux de création
- Utilisateur Staff clique sur "Créer un virement"
- Modal s'ouvre avec formulaire
- Utilisateur remplit les champs obligatoires
- Soumission du formulaire → POST
/api/staff/virements-salaires/create - API valide et insère dans
salary_transfers - Mise à jour temps réel via Supabase Realtime
- Modal se ferme, nouvel enregistrement visible dans le tableau
Flux de génération PDF
- Utilisateur Staff clique sur "Générer PDF" pour un virement
- Confirmation demandée
- POST
/api/staff/virements-salaires/generate-pdfavecsalary_transfer_id - API récupère les contrats de la période
- Construction du payload PDFMonkey
- Appel à l'API PDFMonkey pour créer le document
- Polling du statut (max 15 tentatives, 3s entre chaque)
- Téléchargement du PDF généré
- Upload sur S3
- Mise à jour de
salary_transfers.callsheet_url - 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
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_iddu virement) - Contrats ayant une
payment_datenon nulle - Le mois de
payment_datedoit correspondre au mois deperiod_month
Exemple :
period_month= "2025-01" (Janvier 2025)- Contrats inclus : ceux avec
payment_dateentre "2025-01-01" et "2025-01-31"
Format des données
Structure salary_transfers
{
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)
{
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
-
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_labelfonctionne
-
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)
-
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
-
Calcul automatique du total_net
- Lors de la création, proposer un calcul automatique basé sur les contrats de la période
-
Aperçu des contrats
- Afficher le nombre de contrats qui seront inclus dans le PDF avant génération
-
Notifications
- Intégrer l'envoi de notifications après génération du PDF
-
Historique
- Garder l'historique des générations (versions multiples du PDF)
-
Validation des IBANs
- Vérifier que tous les contrats de la période ont des IBANs valides avant génération
-
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