9 KiB
Ajout du Numéro d'Appel pour les Virements de Salaires
📋 Vue d'ensemble
Cette fonctionnalité ajoute un champ numéro d'appel (num_appel) personnalisable pour chaque virement de salaire. Ce numéro est saisi manuellement lors de la création/modification d'un virement et est utilisé pour générer la référence du virement.
🎯 Format de la Référence
Format: CODE_EMPLOYEUR-NUMERO_APPEL
Exemple: DEMO-00001
CODE_EMPLOYEUR: Code employeur issu deorganization_details.code_employeurNUMERO_APPEL: Numéro saisi manuellement par l'utilisateur (ex: "00001")
✅ Modifications Apportées
1. Base de Données
La colonne num_appel existe dans la table salary_transfers (type text, nullable).
2. Interface Utilisateur (components/staff/SalaryTransfersGrid.tsx)
Type SalaryTransfer
Ajout du champ :
num_appel?: string | null;
Formulaire de Création
- Nouveau champ "Numéro d'appel" (obligatoire)
- Placeholder: "Ex: 00001"
- Texte d'aide : "Ce numéro sera utilisé pour générer la référence du virement (code_employeur-numéro)"
- Validation : le champ doit être rempli pour créer un virement
Formulaire de Modification
- Champ "Numéro d'appel" modifiable
- Même format et présentation que le formulaire de création
Tableau des Virements
- Nouvelle colonne "N° Appel" affichée entre "Période" et "Mode"
- Affichage en police monospace pour une meilleure lisibilité
Modal de Détails
- Ajout d'une carte "N° d'appel" dans la grille d'informations
- Affichage en police monospace
3. Génération PDF (app/api/staff/virements-salaires/generate-pdf/route.ts)
Référence de Virement
Modification de la logique de génération :
// Ancien format
const transferReference = `${organization.code}-${salaryTransfer.num_appel}-${formatMonthPeriod(period)}`;
// Nouveau format
const codeEmployeur = orgDetails?.code_employeur || organization.code || "ORG";
const transferReference = `${codeEmployeur}-${salaryTransfer.num_appel}`;
Changements :
- Utilise
organization_details.code_employeuren priorité - Fallback sur
organization.codesicode_employeurn'existe pas - Ne contient plus la période dans la référence
- Format simplifié :
CODE-NUMERO
Payload PDFMonkey
Le numéro d'appel est inclus dans le payload :
{
callsheet_number: salaryTransfer.num_appel || "00000",
transfer_reference: transferReference,
// ... autres champs
}
4. Logs de Débogage
Des logs détaillés ont été ajoutés pour faciliter le diagnostic des problèmes de récupération des paies :
console.log("[generate-pdf] Payslips query result:", {
error: payslipsError,
count: payslips?.length || 0,
sample: payslips?.[0] ? {
id: payslips[0].id,
net_amount: payslips[0].net_amount,
has_contract: !!payslips[0].cddu_contracts,
has_salarie: !!payslips[0].cddu_contracts?.salaries
} : null
});
// Log details about contracts
const withContracts = payslips.filter(p => p.cddu_contracts).length;
const withSalaries = payslips.filter(p => p.cddu_contracts?.salaries).length;
console.log("[generate-pdf] Payslips with contracts:", withContracts);
console.log("[generate-pdf] Payslips with salaries:", withSalaries);
Informations loggées :
- Nombre total de paies trouvées
- Exemple de paie avec détails (ID, montant net, présence contrat/salarié)
- Nombre de paies avec contrats liés
- Nombre de paies avec salarié lié
- Paramètres de la requête (org_id, period_month)
- Première paie complète en JSON pour debug approfondi
📝 Exemple d'Utilisation
Création d'un Virement
-
Accéder : Staff → Virements de Salaires → Bouton "Créer"
-
Remplir :
- Organisation : "ACME Productions"
- Période : "2025-01"
- Libellé : "Janvier 2025"
- Date d'échéance : "2025-01-15"
- Mode : "SEPA"
- Numéro d'appel : "00001" ← Nouveau champ
- Total Net : (optionnel)
- Notes : (optionnel)
-
Résultat :
- Un virement est créé avec
num_appel = "00001" - Lors de la génération PDF, la référence sera :
DEMO-00001(sicode_employeurde l'organisation est "DEMO")
- Un virement est créé avec
Modification du Numéro
- Ouvrir : Cliquer sur un virement dans le tableau
- Modifier : Cliquer sur "Modifier"
- Changer : Modifier le champ "Numéro d'appel"
- Enregistrer : Cliquer sur "Enregistrer"
🔍 Points Importants
Validation
- Le numéro d'appel est obligatoire lors de la création
- Pas de contrainte de format (libre saisie)
- Recommandé : utiliser un format numérique avec zéros de tête (ex: "00001", "00042")
Génération PDF
- Le numéro d'appel est utilisé immédiatement lors de la génération
- Si le champ est vide, utilise "00000" par défaut
- La référence est calculée au moment de la génération (pas stockée en base)
Code Employeur
Priorité de recherche pour le code employeur :
organization_details.code_employeur(prioritaire)organization.code(fallback)"ORG"(fallback final si aucun code n'existe)
🎨 Interface Utilisateur
Affichage dans le Tableau
| Période | N° Appel | Mode | ... |
|---------------|----------|------|-----|
| Janvier 2025 | 00001 | SEPA | ... |
| Février 2025 | 00002 | SEPA | ... |
Modal de Détails
┌─────────────────┬─────────────────┐
│ Période │ N° d'appel │
│ Janvier 2025 │ 00001 │
├─────────────────┼─────────────────┤
│ Mode │ Échéance │
│ SEPA │ 15/01/2025 │
└─────────────────┴─────────────────┘
🐛 Dépannage
Le numéro d'appel n'apparaît pas
- Vérifier que la colonne
num_appelexiste dans la tablesalary_transfers - Vérifier que la valeur a bien été enregistrée en base
- Recharger la page
Aucune paie n'apparaît lors de la génération PDF
- Consulter les logs serveur (terminal où Next.js tourne)
- Vérifier les logs :
[generate-pdf] Payslips query result: { error: null, count: 0, ... } [generate-pdf] No payslips found for this period! [generate-pdf] Query params: { organization_id: "...", period_month: "2025-01-01" } - Vérifier dans Supabase :
- Les paies existent pour cette organisation et cette période
- Le champ
period_monthest au formatYYYY-MM-01(ex:2025-01-01) - Le champ
organization_idcorrespond bien à l'organisation du virement
- Vérifier les relations :
- Les paies ont un
contract_idvalide - Les contrats existent dans
cddu_contracts - Les contrats ont un
employee_idvalide - Les salariés existent dans
salaries
- Les paies ont un
Les informations des salariés sont manquantes
Vérifier dans les logs :
[generate-pdf] Payslips with contracts: X
[generate-pdf] Payslips with salaries: Y
- Si X < nombre total de paies : certaines paies n'ont pas de contrat lié
- Si Y < X : certains contrats n'ont pas de salarié lié
- Vérifier les clés étrangères dans la base de données
La référence est incorrecte
- Vérifier que
organization_details.code_employeurexiste - Vérifier la console pour les logs de génération PDF
- Format attendu :
CODE-NUMEROsans espaces
Erreur lors de la création
- Vérifier que le numéro d'appel est rempli
- Le champ ne doit pas être vide (validation côté client)
📚 Fichiers Modifiés
-
components/staff/SalaryTransfersGrid.tsx
- Changement :
callsheet_number→num_appel - Ajout du champ dans le type
SalaryTransfer - Ajout du champ dans
createForm - Ajout du champ dans les formulaires (création/édition)
- Ajout de la colonne dans le tableau
- Ajout de l'affichage dans la modal de détails
- Ajout de la validation
- Changement :
-
app/api/staff/virements-salaires/generate-pdf/route.ts
- Changement :
callsheet_number→num_appel - Modification de la génération de
transfer_reference - Utilisation de
code_employeurau lieu deorganization.code - Simplification du format (suppression de la période)
- Ajout de logs détaillés pour le débogage de la récupération des paies :
- Log du résultat de la requête payslips
- Log du nombre de paies avec contrats/salariés
- Log de la première paie en JSON
- Log des paramètres de requête si aucune paie trouvée
- Log d'avertissement si aucune paie
- Changement :
✨ Améliorations Futures Possibles
- Auto-incrémentation du numéro d'appel par organisation
- Validation du format (ex: uniquement numérique)
- Vérification d'unicité du numéro par organisation
- Import/export avec numéro d'appel
- Recherche/filtre par numéro d'appel
- Historique des modifications du numéro
📅 Date de Mise en Place
13 octobre 2025