# 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 :
```typescript
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 :

```typescript
// 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 :
```typescript
{
  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 :

```typescript
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_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

2. **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_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
