Checkpoint: Intégration complète des signatures tactiles (matin et après-midi) dans les feuilles de présence PDF. Correction du bug apres-midi vs apres_midi. Logs de debug retirés. Déployé sur VPS.

This commit is contained in:
Manus
2026-01-28 09:44:13 -05:00
parent 700e4956fc
commit 8c6dda473a
4 changed files with 36 additions and 3 deletions

View File

@@ -0,0 +1,9 @@
{
"query": "SELECT id, inscriptionId, dateFormationId, periode, heurePresence, signatureUrl FROM presences WHERE inscriptionId = 83 ORDER BY dateFormationId, periode;",
"command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute SELECT id, inscriptionId, dateFormationId, periode, heurePresence, signatureUrl FROM presences WHERE inscriptionId = 83 ORDER BY dateFormationId, periode;",
"rows": [],
"messages": [],
"stdout": "",
"stderr": "",
"execution_time_ms": 708
}

View File

@@ -34,6 +34,7 @@ interface ApprenantPresence {
fonction: string | null;
presences?: Array<{
dateFormationId: number;
periode: 'matin' | 'apres_midi';
signatureUrl: string | null;
}>;
}
@@ -225,7 +226,8 @@ export function generateFeuillePresence(feuilleInfo: FeuillePresenceInfo): Buffe
// Tableau de présence avec signatures matin et après-midi
const tableData = feuilleInfo.apprenants.map(i => {
// Trouver les présences pour cette date (utiliser l'ID de la date, pas l'ordre)
const presenceMatin = i.presences?.find(p => p.dateFormationId === dateInfo.id);
const presenceMatin = i.presences?.find(p => p.dateFormationId === dateInfo.id && p.periode === 'matin');
const presenceApresMidi = i.presences?.find(p => p.dateFormationId === dateInfo.id && p.periode === 'apres_midi');
return [
i.nom,
@@ -233,7 +235,7 @@ export function generateFeuillePresence(feuilleInfo: FeuillePresenceInfo): Buffe
i.codeEtablissement || '',
i.fonction === 'directeur' ? 'Directeur' : i.fonction === 'chef_service' ? 'Chef de service' : 'Autre',
presenceMatin?.signatureUrl || '', // Signature matin (sera remplacée par l'image)
'', // Signature après-midi (pour l'instant vide, sera implémenté si nécessaire)
presenceApresMidi?.signatureUrl || '', // Signature après-midi (sera remplacée par l'image)
];
});
@@ -262,6 +264,7 @@ export function generateFeuillePresence(feuilleInfo: FeuillePresenceInfo): Buffe
// Insérer les images de signatures dans les colonnes 4 et 5
if (data.section === 'body' && (data.column.index === 4 || data.column.index === 5)) {
const signatureUrl = data.cell.raw as string;
if (signatureUrl && signatureUrl.startsWith('/uploads/signatures/')) {
try {
// Construire le chemin absolu vers le fichier de signature
@@ -282,7 +285,7 @@ export function generateFeuillePresence(feuilleInfo: FeuillePresenceInfo): Buffe
doc.addImage(signatureBase64, 'PNG', cellX, cellY, cellWidth, cellHeight);
}
} catch (error) {
console.warn('Erreur lors du chargement de la signature:', error);
console.error('Erreur lors du chargement de la signature:', error);
}
}
}

View File

@@ -1159,6 +1159,7 @@ export const appRouter = router({
.filter(p => p.inscriptionId === i.inscription.id)
.map(p => ({
dateFormationId: p.dateFormationId,
periode: p.periode as 'matin' | 'apres_midi',
signatureUrl: p.signatureUrl,
}));

20
todo.md
View File

@@ -1374,3 +1374,23 @@
- [x] Corriger la logique de recherche des présences
- [x] Déployer sur VPS
- [ ] Tester la génération PDF avec signatures (test utilisateur requis)
## Bug VPS - Signatures toujours manquantes dans PDF
- [ ] Vérifier l'existence des fichiers de signatures sur le VPS
- [ ] Vérifier les chemins d'accès aux fichiers
- [ ] Ajouter des logs de debug dans exportService.ts
- [ ] Identifier le problème exact (fichiers manquants, chemin incorrect, erreur de lecture)
- [ ] Corriger le problème
- [ ] Redéployer et tester
## Ajout signatures après-midi dans PDF
- [x] Modifier exportService.ts pour chercher les présences après-midi
- [x] Afficher les signatures après-midi dans la colonne correspondante
- [x] Corriger le bug apres-midi vs apres_midi (underscore vs tiret)
- [x] Déployer sur VPS
- [x] Tester avec une séquence ayant des signatures matin et après-midi
- [x] Retirer les logs de debug
- [x] Déployer la version finale sur VPS
- [x] Créer un checkpoint final