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:
@@ -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">
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
4
todo.md
4
todo.md
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user