From 8efcb65f0f869e3131932afe6e508a3b6dc7b6fe Mon Sep 17 00:00:00 2001 From: Manus Date: Sun, 25 Jan 2026 11:19:22 -0500 Subject: [PATCH] Rollback to 8e20ac40 --- client/src/pages/AdminGestionAttestations.tsx | 87 +------------------ server/gestionAttestationsDb.ts | 17 ---- todo.md | 15 +--- 3 files changed, 5 insertions(+), 114 deletions(-) diff --git a/client/src/pages/AdminGestionAttestations.tsx b/client/src/pages/AdminGestionAttestations.tsx index 3dc39b4..c3b5bd6 100644 --- a/client/src/pages/AdminGestionAttestations.tsx +++ b/client/src/pages/AdminGestionAttestations.tsx @@ -171,7 +171,6 @@ export default function AdminGestionAttestations() { const [selectedInscriptionId, setSelectedInscriptionId] = useState(null); const [previewUrl, setPreviewUrl] = useState(null); const [previewDialogOpen, setPreviewDialogOpen] = useState(false); - const [filtreStatut, setFiltreStatut] = useState<"toutes" | "terminees" | "a_venir">("toutes"); // Récupérer la liste des formations const { data: formations, isLoading: loadingFormations } = trpc.formations.list.useQuery(); @@ -354,40 +353,6 @@ export default function AdminGestionAttestations() { - {/* Filtre par statut */} - {selectedFormationId && ( - - - Filtrer les séquences - - Afficher uniquement les séquences terminées ou à venir - - - - setFiltreStatut(value)}> -
- - -
-
- - -
-
- - -
-
-
-
- )} - {/* Configuration */} {selectedFormationId && ( @@ -506,64 +471,20 @@ export default function AdminGestionAttestations() { const idB = parseInt(b[0]); return idA - idB; }) - .filter(([sequenceId, sequenceApprenants]) => { - // Filtrer selon le statut sélectionné - if (filtreStatut === "toutes") return true; - const premiereDate = sequenceApprenants[0]?.sequence?.premiereDate; - if (!premiereDate) return true; // Afficher les séquences sans date - const now = new Date(); - const sequenceDate = new Date(premiereDate); - if (filtreStatut === "terminees") { - return sequenceDate < now; - } else if (filtreStatut === "a_venir") { - return sequenceDate >= now; - } - return true; - }) .map(([sequenceId, sequenceApprenants]) => { const sequenceName = sequenceApprenants[0]?.sequence?.nom || 'Séquence inconnue'; - const premiereDate = sequenceApprenants[0]?.sequence?.premiereDate; - const dateFormatted = premiereDate ? new Date(premiereDate).toLocaleDateString('fr-FR') : null; return (
{/* En-tête de séquence */}
-

- {sequenceName} - {dateFormatted && - {dateFormatted}} -

+

{sequenceName}

{sequenceApprenants.length} apprenant(s)

-
- - {sequenceApprenants.filter(a => a.attestation?.emailEnvoye).length} / {sequenceApprenants.length} envoyé(es) - - -
+ + {sequenceApprenants.filter(a => a.attestation?.emailEnvoye).length} / {sequenceApprenants.length} envoyé(es) +
diff --git a/server/gestionAttestationsDb.ts b/server/gestionAttestationsDb.ts index ed71d6e..4f4a471 100644 --- a/server/gestionAttestationsDb.ts +++ b/server/gestionAttestationsDb.ts @@ -159,22 +159,6 @@ export async function getApprenantsWithAttestationStatus(formationId: number) { const db = await getDb(); if (!db) return []; - // Récupérer toutes les dates de formation - const toutesLesDates = await db - .select({ - sequenceId: datesFormation.sequenceId, - date: datesFormation.date, - }) - .from(datesFormation); - - // Calculer la première date de chaque séquence en JavaScript - const datesMap = new Map(); - toutesLesDates.forEach(({ sequenceId, date }) => { - if (!datesMap.has(sequenceId) || date < datesMap.get(sequenceId)!) { - datesMap.set(sequenceId, date); - } - }); - const results = await db .select({ // Apprenant @@ -221,7 +205,6 @@ export async function getApprenantsWithAttestationStatus(formationId: number) { sequence: { id: r.sequenceId, nom: r.sequenceNom, - premiereDate: datesMap.get(r.sequenceId) || null, }, attestation: r.attestationId ? { id: r.attestationId, diff --git a/todo.md b/todo.md index 0eb0b13..5f2803e 100644 --- a/todo.md +++ b/todo.md @@ -1285,17 +1285,4 @@ - [x] Identifier la cause du problème (structure imbriquée Drizzle ORM) - [x] Corriger le code backend (aplatir la structure de la requête) - [x] Corriger le code frontend (utiliser l'ID de séquence pour le tri) -- [x] Déployer sur le VPS - -## Améliorations de la gestion des attestations - -- [x] Modifier le backend pour inclure la première date de chaque séquence -- [x] Afficher la date de début dans l'en-tête de chaque séquence (ex: "Groupe A - 15/01/2026") -- [x] Ajouter un bouton "Envoyer toutes les attestations de cette séquence" dans l'en-tête -- [x] Créer un filtre "Séquences terminées / à venir" -- [x] Déployer sur le VPS - -## Corriger l'erreur SQL MIN() vide dans la récupération de la première date - -- [x] Corriger la requête SQL dans gestionAttestationsDb.ts (remplacé par post-traitement JS) -- [x] Déployer la correction sur le VPS +- [ ] Déployer sur le VPS