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:
9
.manus/db/db-query-1769608551319.json
Normal file
9
.manus/db/db-query-1769608551319.json
Normal 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
|
||||||
|
}
|
||||||
@@ -34,6 +34,7 @@ interface ApprenantPresence {
|
|||||||
fonction: string | null;
|
fonction: string | null;
|
||||||
presences?: Array<{
|
presences?: Array<{
|
||||||
dateFormationId: number;
|
dateFormationId: number;
|
||||||
|
periode: 'matin' | 'apres_midi';
|
||||||
signatureUrl: string | null;
|
signatureUrl: string | null;
|
||||||
}>;
|
}>;
|
||||||
}
|
}
|
||||||
@@ -225,7 +226,8 @@ export function generateFeuillePresence(feuilleInfo: FeuillePresenceInfo): Buffe
|
|||||||
// Tableau de présence avec signatures matin et après-midi
|
// Tableau de présence avec signatures matin et après-midi
|
||||||
const tableData = feuilleInfo.apprenants.map(i => {
|
const tableData = feuilleInfo.apprenants.map(i => {
|
||||||
// Trouver les présences pour cette date (utiliser l'ID de la date, pas l'ordre)
|
// 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 [
|
return [
|
||||||
i.nom,
|
i.nom,
|
||||||
@@ -233,7 +235,7 @@ export function generateFeuillePresence(feuilleInfo: FeuillePresenceInfo): Buffe
|
|||||||
i.codeEtablissement || '',
|
i.codeEtablissement || '',
|
||||||
i.fonction === 'directeur' ? 'Directeur' : i.fonction === 'chef_service' ? 'Chef de service' : 'Autre',
|
i.fonction === 'directeur' ? 'Directeur' : i.fonction === 'chef_service' ? 'Chef de service' : 'Autre',
|
||||||
presenceMatin?.signatureUrl || '', // Signature matin (sera remplacée par l'image)
|
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
|
// Insérer les images de signatures dans les colonnes 4 et 5
|
||||||
if (data.section === 'body' && (data.column.index === 4 || data.column.index === 5)) {
|
if (data.section === 'body' && (data.column.index === 4 || data.column.index === 5)) {
|
||||||
const signatureUrl = data.cell.raw as string;
|
const signatureUrl = data.cell.raw as string;
|
||||||
|
|
||||||
if (signatureUrl && signatureUrl.startsWith('/uploads/signatures/')) {
|
if (signatureUrl && signatureUrl.startsWith('/uploads/signatures/')) {
|
||||||
try {
|
try {
|
||||||
// Construire le chemin absolu vers le fichier de signature
|
// 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);
|
doc.addImage(signatureBase64, 'PNG', cellX, cellY, cellWidth, cellHeight);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.warn('Erreur lors du chargement de la signature:', error);
|
console.error('Erreur lors du chargement de la signature:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1159,6 +1159,7 @@ export const appRouter = router({
|
|||||||
.filter(p => p.inscriptionId === i.inscription.id)
|
.filter(p => p.inscriptionId === i.inscription.id)
|
||||||
.map(p => ({
|
.map(p => ({
|
||||||
dateFormationId: p.dateFormationId,
|
dateFormationId: p.dateFormationId,
|
||||||
|
periode: p.periode as 'matin' | 'apres_midi',
|
||||||
signatureUrl: p.signatureUrl,
|
signatureUrl: p.signatureUrl,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|||||||
20
todo.md
20
todo.md
@@ -1374,3 +1374,23 @@
|
|||||||
- [x] Corriger la logique de recherche des présences
|
- [x] Corriger la logique de recherche des présences
|
||||||
- [x] Déployer sur VPS
|
- [x] Déployer sur VPS
|
||||||
- [ ] Tester la génération PDF avec signatures (test utilisateur requis)
|
- [ ] 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
|
||||||
|
|||||||
Reference in New Issue
Block a user