espace-paie-odentas/CALLSHEET_NUMBER_FEATURE.md

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 de organization_details.code_employeur
  • NUMERO_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_employeur en priorité
  • Fallback sur organization.code si code_employeur n'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

  1. Accéder : Staff → Virements de Salaires → Bouton "Créer"

  2. 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)
  3. Résultat :

    • Un virement est créé avec num_appel = "00001"
    • Lors de la génération PDF, la référence sera : DEMO-00001 (si code_employeur de l'organisation est "DEMO")

Modification du Numéro

  1. Ouvrir : Cliquer sur un virement dans le tableau
  2. Modifier : Cliquer sur "Modifier"
  3. Changer : Modifier le champ "Numéro d'appel"
  4. 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 :

  1. organization_details.code_employeur (prioritaire)
  2. organization.code (fallback)
  3. "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_appel existe dans la table salary_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

  1. Consulter les logs serveur (terminal où Next.js tourne)
  2. 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" }
    
  3. Vérifier dans Supabase :
    • Les paies existent pour cette organisation et cette période
    • Le champ period_month est au format YYYY-MM-01 (ex: 2025-01-01)
    • Le champ organization_id correspond bien à l'organisation du virement
  4. Vérifier les relations :
    • Les paies ont un contract_id valide
    • Les contrats existent dans cddu_contracts
    • Les contrats ont un employee_id valide
    • Les salariés existent dans salaries

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_employeur existe
  • Vérifier la console pour les logs de génération PDF
  • Format attendu : CODE-NUMERO sans 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

  1. components/staff/SalaryTransfersGrid.tsx

    • Changement : callsheet_numbernum_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
  2. app/api/staff/virements-salaires/generate-pdf/route.ts

    • Changement : callsheet_numbernum_appel
    • Modification de la génération de transfer_reference
    • Utilisation de code_employeur au lieu de organization.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

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