espace-paie-odentas/CALLSHEET_NUMBER_FEATURE.md

251 lines
9 KiB
Markdown

# 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