Checkpoint: Retrait des compteurs dynamiques de taux de présence et ajout d'une vérification backend empêchant l'émargement avant la date de formation concernée

This commit is contained in:
Manus
2026-02-02 10:27:19 -05:00
parent 68df39a072
commit b74e575d11
3 changed files with 27 additions and 22 deletions

View File

@@ -316,17 +316,6 @@ export default function FormateurEmargement() {
</p> </p>
</div> </div>
{/* Statistiques Matin */}
<div className="flex items-center justify-between bg-blue-50 dark:bg-blue-950/20 px-3 py-2 rounded">
<span className="text-xs font-medium">🌅 Matin</span>
<Badge variant="secondary" className="text-xs">
{(() => {
const stats = getPresenceStats(date.id, "matin");
return `${stats.present}/${stats.total} présents (${stats.percentage}%)`;
})()}
</Badge>
</div>
{/* Matin */} {/* Matin */}
<div className="flex items-center justify-between pl-4"> <div className="flex items-center justify-between pl-4">
<div className="flex items-center gap-2 flex-1"> <div className="flex items-center gap-2 flex-1">
@@ -387,17 +376,6 @@ export default function FormateurEmargement() {
)} )}
</div> </div>
{/* Statistiques Après-midi */}
<div className="flex items-center justify-between bg-orange-50 dark:bg-orange-950/20 px-3 py-2 rounded mt-2">
<span className="text-xs font-medium">🌆 Après-midi</span>
<Badge variant="secondary" className="text-xs">
{(() => {
const stats = getPresenceStats(date.id, "apres_midi");
return `${stats.present}/${stats.total} présents (${stats.percentage}%)`;
})()}
</Badge>
</div>
{/* Après-midi */} {/* Après-midi */}
<div className="flex items-center justify-between pl-4"> <div className="flex items-center justify-between pl-4">
<div className="flex items-center gap-2 flex-1"> <div className="flex items-center gap-2 flex-1">

View File

@@ -18,6 +18,29 @@ export async function validerPresence(params: {
const db = await getDb(); const db = await getDb();
if (!db) throw new Error("Database not available"); if (!db) throw new Error("Database not available");
// Récupérer la date de formation
const dateFormation = await db
.select()
.from(datesFormation)
.where(eq(datesFormation.id, params.dateFormationId))
.limit(1);
if (dateFormation.length === 0) {
throw new Error("Date de formation introuvable");
}
// Vérifier que la date actuelle est le jour de la formation ou après
const now = new Date();
const dateDebut = new Date(dateFormation[0].dateDebut);
// Réinitialiser les heures pour comparer uniquement les dates
now.setHours(0, 0, 0, 0);
dateDebut.setHours(0, 0, 0, 0);
if (now < dateDebut) {
throw new Error("Vous ne pouvez pas émarger avant la date de formation");
}
// Vérifier si la présence existe déjà pour cette période // Vérifier si la présence existe déjà pour cette période
const presenceExistante = await db const presenceExistante = await db
.select() .select()

View File

@@ -1496,3 +1496,7 @@
- [x] Ajouter un indicateur visuel de rafraîchissement avec badge "Mis à jour il y a X secondes" - [x] Ajouter un indicateur visuel de rafraîchissement avec badge "Mis à jour il y a X secondes"
- [x] Ajouter des statistiques en temps réel du taux de présence par période - [x] Ajouter des statistiques en temps réel du taux de présence par période
- [x] Retirer les compteurs dynamiques de taux de présence de la page d'émargement numérique
- [x] Empêcher l'émargement avant la date de formation concernée (vérification backend)