espace-paie-odentas/DEBUG_PAYSLIPS_GENERATION.md

8.1 KiB

Guide de Débogage - Récupération des Paies (Payslips)

🐛 Problème Observé

Lors de la génération de PDF, le payload envoyé à PDFMonkey contient un tableau lineItems vide :

{
  "nbre_paies": 0,
  "lineItems": []
}

Aucun log de récupération des paies n'apparaît dans la console.

🔍 Logs Ajoutés

Des logs très visibles ont été ajoutés à plusieurs étapes critiques :

1. Récupération des Paies

[generate-pdf] Fetching payslips for period...
[generate-pdf] Period month: 2025-09-01
[generate-pdf] Organization ID: xxx-xxx-xxx
[generate-pdf] Payslips query result: { error: null, count: X, sample: {...} }

2. Construction des Line Items

═══════════════════════════════════════════════════════════
[generate-pdf] 🔍 BUILDING PDFMONKEY PAYLOAD
[generate-pdf] 📊 Payslips count: X
═══════════════════════════════════════════════════════════
[generate-pdf] 👤 Processing payslip: { payslip_id, has_contract, has_salarie, ... }
[generate-pdf] ✅ Line items built: X items
[generate-pdf] 📝 First line item: { employee_name, matricule, ... }

3. Résumé du Payload

═══════════════════════════════════════════════════════════
[generate-pdf] 📋 PAYLOAD SUMMARY:
[generate-pdf] Transfer reference: LOR-00001
[generate-pdf] Total net: 1234.56
[generate-pdf] Number of payslips: X
[generate-pdf] Number of line items: X
═══════════════════════════════════════════════════════════

4. Payload Final

═══════════════════════════════════════════════════════════
[generate-pdf] 🚀 FINAL PAYLOAD TO PDFMONKEY:
[generate-pdf] Payload prepared with X payslips
[generate-pdf] lineItems in payload: X
═══════════════════════════════════════════════════════════
[generate-pdf] ✅ Sample line item in payload: { employee_name, matricule, ... }

🧪 Procédure de Test

1. Relancer le serveur Next.js

npm run dev

2. Déclencher une génération de PDF

  • Aller sur Staff → Virements de Salaires
  • Cliquer sur un virement
  • Cliquer sur "Générer PDF"

3. Observer les logs dans le terminal

Vous devriez maintenant voir beaucoup plus de logs avec des séparateurs visibles (═══...).

📊 Diagnostic selon les Logs

Cas 1 : Aucun log avant PDFMonkey

Symptôme : Vous voyez directement [generate-pdf] PDFMonkey response: sans les logs précédents.

Cause possible :

  • Le code en cache n'est pas à jour
  • Hot reload n'a pas fonctionné
  • Mauvais fichier exécuté

Solution :

  1. Arrêter complètement Next.js (Ctrl+C)
  2. Supprimer le cache :
    rm -rf .next
    
  3. Relancer :
    npm run dev
    

Cas 2 : Logs visibles mais Payslips count: 0

Symptôme :

[generate-pdf] 📊 Payslips count: 0
[generate-pdf] ⚠️ WARNING: Payload has no payslips!

Diagnostic :

[generate-pdf] Payslips query result: { error: null, count: 0, sample: null }
[generate-pdf] No payslips found for this period!
[generate-pdf] Query params: { organization_id: "xxx", period_month: "2025-09-01" }

Causes possibles :

  1. Aucune paie dans la base pour cette période/organisation
  2. Format de date incorrect dans period_month
  3. organization_id ne correspond pas

Vérifications :

-- 1. Vérifier les paies existantes pour cette organisation
SELECT id, period_month, organization_id, net_amount, contract_id
FROM payslips
WHERE organization_id = 'XXX-XXX-XXX'
ORDER BY period_month DESC
LIMIT 10;

-- 2. Vérifier le format de period_month
SELECT DISTINCT period_month
FROM payslips
WHERE organization_id = 'XXX-XXX-XXX';
-- Doit être au format: 2025-09-01 (YYYY-MM-01)

-- 3. Vérifier l'organization_id du virement
SELECT org_id, period_month, num_appel
FROM salary_transfers
WHERE id = 'ID_DU_VIREMENT';

Cas 3 : Payslips trouvées mais lineItems vide

Symptôme :

[generate-pdf] 📊 Payslips count: 5
[generate-pdf] ✅ Line items built: 0 items

Diagnostic :

[generate-pdf] 👤 Processing payslip: {
  payslip_id: "xxx",
  has_contract: false,  ← Problème ici
  has_salarie: false,
  employee_name: "",
  net_amount: 1234.56
}

Cause : Les paies n'ont pas de contrats liés (relation cddu_contracts)

Vérifications :

-- Vérifier les relations des paies
SELECT 
  p.id as payslip_id,
  p.contract_id,
  p.net_amount,
  c.id as contract_exists,
  c.employee_id,
  s.nom,
  s.prenom
FROM payslips p
LEFT JOIN cddu_contracts c ON p.contract_id = c.id
LEFT JOIN salaries s ON c.employee_id = s.id
WHERE p.organization_id = 'XXX-XXX-XXX'
  AND p.period_month = '2025-09-01'
LIMIT 10;

Solution : Corriger les relations dans la base de données.

Cas 4 : Line items construites mais vides dans le payload

Symptôme :

[generate-pdf] ✅ Line items built: 5 items
[generate-pdf] 📝 First line item: { employee_name: "", matricule: "", montant: 0, ... }
[generate-pdf] lineItems in payload: 5

Cause : Données manquantes dans les contrats/salariés

Vérifications :

-- Vérifier les données des contrats
SELECT 
  c.id,
  c.employee_matricule,
  c.contract_number,
  c.analytique,
  c.profession,
  s.nom,
  s.prenom
FROM cddu_contracts c
LEFT JOIN salaries s ON c.employee_id = s.id
WHERE c.id IN (
  SELECT contract_id 
  FROM payslips 
  WHERE organization_id = 'XXX-XXX-XXX' 
    AND period_month = '2025-09-01'
)
LIMIT 10;

🔧 Corrections Rapides

Créer des paies de test

-- 1. Trouver un contrat existant
SELECT id, employee_id, employee_matricule
FROM cddu_contracts
WHERE org_id = 'XXX-XXX-XXX'
LIMIT 1;

-- 2. Créer une paie de test
INSERT INTO payslips (
  organization_id,
  contract_id,
  period_month,
  net_amount,
  gross_amount,
  pay_date,
  status
) VALUES (
  'XXX-XXX-XXX',           -- organization_id du virement
  'ID_DU_CONTRAT',         -- contract_id trouvé ci-dessus
  '2025-09-01',            -- period_month (même que le virement)
  1500.00,                 -- net_amount
  2000.00,                 -- gross_amount
  '2025-09-30',            -- pay_date
  'paid'                   -- status
);

Vérifier le format de period_month

-- Corriger le format si nécessaire
UPDATE salary_transfers
SET period_month = DATE_TRUNC('month', period_month::date)
WHERE id = 'ID_DU_VIREMENT';

📝 Checklist de Diagnostic

  • Les nouveaux logs apparaissent dans la console
  • La requête de payslips est exécutée
  • Des payslips sont trouvées (count > 0)
  • Les payslips ont des contrats liés (has_contract: true)
  • Les contrats ont des salariés liés (has_salarie: true)
  • Les line items sont construites (Line items built: X items)
  • Les line items contiennent des données (employee_name non vide)
  • Le payload PDFMonkey contient les line items
  • Le PDF généré contient les lignes de paie

🆘 Si les logs n'apparaissent toujours pas

  1. Vérifier que vous modifiez le bon fichier :

    ls -la app/api/staff/virements-salaires/generate-pdf/route.ts
    
  2. Vérifier qu'il n'y a pas de fichier en double :

    find . -name "route.ts" -path "*/generate-pdf/*"
    
  3. Forcer le rechargement :

    • Arrêter Next.js
    • Supprimer .next/
    • Relancer npm run dev
    • Hard refresh du navigateur (Cmd+Shift+R)
  4. Vérifier la version en production : Si déployé sur Vercel, les logs apparaissent dans le dashboard Vercel sous "Functions Logs"

📅 Date de Mise à Jour

13 octobre 2025