251 lines
9 KiB
Markdown
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
|