Congés Spectacles auto déclaration

This commit is contained in:
Renaud 2025-10-17 14:31:43 +02:00
parent 10802e8ccb
commit 01aa804396
4 changed files with 301 additions and 2 deletions

View file

@ -0,0 +1,108 @@
# Fix : Numéro Congés Spectacles - Page Auto-déclaration
## Problème identifié
Le champ "Numéro de Congés Spectacles" n'était **pas présent** dans le formulaire de la page d'auto-déclaration (`/auto-declaration`), alors que :
- ✅ Le champ existe dans la base de données (`salaries.conges_spectacles`)
- ✅ L'API backend gère correctement ce champ (`/api/auto-declaration/route.ts`)
- ✅ Le champ était pré-rempli depuis la base de données
**Conséquence** : Les salariés ne pouvaient pas saisir ou modifier leur numéro de Congés Spectacles via l'auto-déclaration.
## Solution appliquée
### 1. Modification de l'interface FormData
Ajout du champ `conges_spectacles` dans l'interface TypeScript :
```typescript
interface FormData {
// ... autres champs
// État civil
date_naissance: string;
lieu_naissance: string;
numero_secu: string;
conges_spectacles: string; // ← AJOUTÉ
// ...
}
```
### 2. Initialisation de l'état
Ajout de `conges_spectacles: ''` dans l'état initial du formulaire.
### 3. Pré-remplissage depuis la base de données
Ajout de la ligne pour pré-remplir le champ depuis les données du salarié :
```typescript
setFormData(prev => ({
...prev,
// ...
conges_spectacles: data.conges_spectacles || '',
// ...
}));
```
### 4. Envoi vers l'API
Ajout du champ dans les données envoyées lors de la sauvegarde :
```typescript
const updateData = {
// ...
conges_spectacles: formData.conges_spectacles || null,
// ...
};
```
### 5. Ajout du champ HTML dans le formulaire
Nouveau champ ajouté dans la section "État civil", après le numéro de Sécurité Sociale :
```tsx
<div>
<LabelComponent>Votre numéro de Congés Spectacles</LabelComponent>
<input
value={formData.conges_spectacles}
onChange={(e) => setFormData(prev => ({
...prev,
conges_spectacles: e.target.value
}))}
className="w-full px-3 py-2 rounded-lg border bg-white text-sm"
placeholder="Numéro d'objet (si intermittent)"
/>
<p className="text-[11px] text-slate-500 mt-1">
Ce champ est facultatif. Il concerne uniquement les intermittents du spectacle.
</p>
</div>
```
## Fichiers modifiés
- ✅ `/app/auto-declaration/page.tsx` - Ajout du champ dans le formulaire
- `/app/api/auto-declaration/route.ts` - Aucune modification (déjà fonctionnel)
## Emplacement du champ
Le champ a été placé dans la section **"État civil"**, juste après le numéro de Sécurité Sociale, car :
- Il concerne l'état administratif du salarié
- C'est un numéro d'identification professionnel (comme le NIR)
- Position logique pour les intermittents du spectacle
## Caractéristiques du champ
- **Type** : Input texte
- **Obligatoire** : Non (facultatif)
- **Public cible** : Intermittents du spectacle
- **Placeholder** : "Numéro d'objet (si intermittent)"
- **Aide** : Message explicatif précisant que c'est facultatif
## Tests recommandés
1. ✅ Vérifier que le champ s'affiche correctement
2. ✅ Tester la saisie d'un numéro Congés Spectacles
3. ✅ Vérifier la sauvegarde en base de données
4. ✅ Tester le pré-remplissage si un numéro existe déjà
5. ✅ Vérifier que le champ reste facultatif (pas d'erreur si vide)
## Validation
- Le champ n'a pas de validation spécifique (format libre)
- Il n'est pas obligatoire
- Accepte n'importe quel texte/format

View file

@ -0,0 +1,158 @@
# Synchronisation des notes : Auto-déclaration → Staff/Salariés
## Problème résolu
Les notes saisies par les salariés dans le formulaire d'auto-déclaration n'étaient **pas visibles** dans la section "Notes" de la page staff/salaries.
### Situation avant correction
- ✅ Les notes étaient sauvegardées dans `justificatifs_personnels` (format JSON)
- ❌ Les notes n'étaient PAS enregistrées dans le champ `notes`
- ❌ Le staff ne pouvait pas voir ces notes dans l'interface staff/salaries
**Conséquence** : Les informations importantes communiquées par les salariés restaient invisibles pour le staff.
## Solution appliquée
### Modifications dans `/app/api/auto-declaration/route.ts`
La logique d'enregistrement des notes a été améliorée pour :
1. **Récupérer les notes existantes** avant d'ajouter les nouvelles
2. **Ajouter la nouvelle note avec horodatage** au champ `notes` visible par le staff
3. **Préserver l'historique** dans `justificatifs_personnels` (format JSON)
### Code modifié
```typescript
if (updateData.notes) {
// Récupérer les notes existantes pour les préserver
const { data: currentSalarie } = await sb
.from('salaries')
.select('notes, justificatifs_personnels')
.eq('id', tokenData.salarie_id)
.single();
// Préparer la nouvelle note avec horodatage
const currentDate = new Date().toISOString().split('T')[0];
const currentTime = new Date().toLocaleString('fr-FR');
const newNote = `[${currentTime} - Auto-déclaration]\n${updateData.notes}`;
// Ajouter aux notes existantes ou créer une nouvelle note
if (currentSalarie?.notes) {
dataToUpdate.notes = `${currentSalarie.notes}\n\n${newNote}`;
} else {
dataToUpdate.notes = newNote;
}
// Également ajouter aux justificatifs personnels (format JSON) pour historique
const noteEntry = {
date: currentDate,
source: 'auto-declaration',
notes: updateData.notes
};
dataToUpdate.justificatifs_personnels = JSON.stringify([noteEntry]);
}
```
## Fonctionnement
### 1. Horodatage automatique
Chaque note de l'auto-déclaration est précédée de :
```
[17/10/2025 à 14:30:25 - Auto-déclaration]
```
### 2. Préservation des notes existantes
- Si le salarié avait déjà des notes (ajoutées par le staff), elles sont conservées
- La nouvelle note est ajoutée à la suite avec une double ligne de séparation (`\n\n`)
### 3. Double sauvegarde
- **Champ `notes`** : Visible immédiatement par le staff sur staff/salaries
- **Champ `justificatifs_personnels`** : Historique structuré au format JSON
## Format des notes
### Exemple avec première note
```
[17/10/2025 à 14:30:25 - Auto-déclaration]
Je suis disponible pour commencer le contrat dès le 20 octobre.
J'ai déjà travaillé sur des productions similaires.
```
### Exemple avec notes multiples
```
[15/10/2025 à 10:00:00 - Staff]
Candidat intéressant pour le projet XYZ
[17/10/2025 à 14:30:25 - Auto-déclaration]
Je suis disponible pour commencer le contrat dès le 20 octobre.
J'ai déjà travaillé sur des productions similaires.
```
## Avantages
### ✅ Visibilité immédiate
- Les notes des salariés apparaissent instantanément dans l'interface staff
- Pas besoin de chercher dans les justificatifs personnels
### ✅ Traçabilité
- Horodatage précis de chaque note
- Source clairement identifiée (Auto-déclaration vs Staff)
- Historique complet préservé
### ✅ Communication améliorée
- Le staff peut voir les informations importantes des salariés
- Facilite le suivi et la coordination
- Évite les oublis ou pertes d'information
## Interface utilisateur
### Page auto-déclaration
Le salarié voit :
```
Section "Notes"
┌─────────────────────────────────────────────┐
│ Informations complémentaires │
│ ┌─────────────────────────────────────────┐ │
│ │ [Zone de texte libre] │ │
│ │ │ │
│ │ │ │
│ └─────────────────────────────────────────┘ │
│ Utilisez ce champ libre si vous devez │
│ mentionner toutes les informations │
│ complémentaires. │
└─────────────────────────────────────────────┘
```
### Page staff/salaries
Le staff voit la note dans le panneau latéral :
```
Section "Notes"
┌─────────────────────────────────────────────┐
│ [17/10/2025 à 14:30:25 - Auto-déclaration] │
│ Je suis disponible pour commencer le │
│ contrat dès le 20 octobre. │
└─────────────────────────────────────────────┘
```
## Tests recommandés
1. ✅ Saisir une note sur l'auto-déclaration
2. ✅ Vérifier qu'elle apparaît dans staff/salaries
3. ✅ Vérifier l'horodatage et la source
4. ✅ Ajouter une deuxième note et vérifier la concaténation
5. ✅ Vérifier que les notes staff existantes sont préservées
6. ✅ Tester avec un salarié sans note existante
7. ✅ Tester avec un salarié ayant déjà des notes staff
## Fichiers modifiés
- ✅ `/app/api/auto-declaration/route.ts` - Logique d'enregistrement des notes
## Rétrocompatibilité
- ✅ Les anciennes notes (si existantes) sont préservées
- ✅ Le format JSON dans `justificatifs_personnels` reste fonctionnel
- ✅ Aucune migration de données nécessaire

View file

@ -148,8 +148,26 @@ export async function PATCH(request: NextRequest) {
if (updateData.bic !== undefined) dataToUpdate.bic = updateData.bic;
if (updateData.derniere_profession !== undefined) dataToUpdate.derniere_profession = updateData.derniere_profession;
if (updateData.notes) {
// Ajouter les notes aux justificatifs personnels (format JSON)
// Récupérer les notes existantes pour les préserver
const { data: currentSalarie } = await sb
.from('salaries')
.select('notes, justificatifs_personnels')
.eq('id', tokenData.salarie_id)
.single();
// Préparer la nouvelle note avec horodatage
const currentDate = new Date().toISOString().split('T')[0];
const currentTime = new Date().toLocaleString('fr-FR');
const newNote = `[${currentTime} - Auto-déclaration]\n${updateData.notes}`;
// Ajouter aux notes existantes ou créer une nouvelle note
if (currentSalarie?.notes) {
dataToUpdate.notes = `${currentSalarie.notes}\n\n${newNote}`;
} else {
dataToUpdate.notes = newNote;
}
// Également ajouter aux justificatifs personnels (format JSON) pour historique
const noteEntry = {
date: currentDate,
source: 'auto-declaration',

View file

@ -133,6 +133,7 @@ interface FormData {
date_naissance: string;
lieu_naissance: string;
numero_secu: string;
conges_spectacles: string;
// Bancaire
iban: string;
@ -191,6 +192,7 @@ export default function AutoDeclarationPage() {
date_naissance: '',
lieu_naissance: '',
numero_secu: '',
conges_spectacles: '',
// Bancaire
iban: '',
@ -240,6 +242,7 @@ export default function AutoDeclarationPage() {
date_naissance: data.date_naissance || '',
lieu_naissance: data.lieu_de_naissance || '',
numero_secu: data.nir || '',
conges_spectacles: data.conges_spectacles || '',
iban: data.iban || '',
bic: data.bic || '',
employeur: data.organizations?.name || ''
@ -425,6 +428,7 @@ export default function AutoDeclarationPage() {
date_naissance: formData.date_naissance || null,
lieu_de_naissance: formData.lieu_naissance || null,
nir: formData.numero_secu || null,
conges_spectacles: formData.conges_spectacles || null,
iban: formData.iban || null,
bic: formData.bic || null,
notes: formData.notes
@ -840,6 +844,17 @@ export default function AutoDeclarationPage() {
/>
<p className="text-[11px] text-slate-500 mt-1">Indiquez le NIR complet ou provisoire si pas encore définitif.</p>
</div>
<div>
<LabelComponent>Votre numéro de Congés Spectacles</LabelComponent>
<input
value={formData.conges_spectacles}
onChange={(e) => setFormData(prev => ({ ...prev, conges_spectacles: e.target.value }))}
className="w-full px-3 py-2 rounded-lg border bg-white text-sm"
placeholder="Numéro d'objet (si intermittent)"
/>
<p className="text-[11px] text-slate-500 mt-1">Ce champ est facultatif. Il concerne uniquement les intermittents du spectacle.</p>
</div>
</Section>
{/* Section Coordonnées bancaires */}
@ -930,7 +945,7 @@ export default function AutoDeclarationPage() {
<textarea
value={formData.notes}
onChange={(e) => setFormData(prev => ({ ...prev, notes: e.target.value }))}
placeholder="Utilisez ce champ libre si vous devez mentionner toutes les informations complémentaires."
placeholder="Utilisez ce champ libre pour nous communiquer toute information complémentaire que vous jugez utile."
rows={4}
className="w-full px-3 py-2 rounded-lg border bg-white text-sm"
/>