Checkpoint: Refonte complète du système de rappels pour permettre une gestion granulaire par séquence

Fonctionnalités ajoutées :
- Table de liaison rappelSequences pour associer rappels et séquences
- Composant SequenceMultiSelect avec recherche et multi-sélection
- Gestion des associations dans les procédures create/update
- Modification du scheduler pour filtrer les séquences selon les associations
- Si aucune séquence n'est sélectionnée, le rappel s'applique à toutes les séquences (comportement par défaut)

Le système permet maintenant de configurer des rappels spécifiques pour certaines dates/séquences particulières, offrant une flexibilité complète dans la gestion des rappels automatiques.
This commit is contained in:
Manus
2026-01-08 08:27:20 -05:00
parent 5de295a18c
commit 6ee87f9b22
12 changed files with 2462 additions and 15 deletions

View File

@@ -29,7 +29,8 @@ import {
Formateur,
rappels,
InsertRappel,
Rappel
Rappel,
rappelSequences
} from "../drizzle/schema";
import { ENV } from './_core/env';
@@ -969,7 +970,20 @@ export async function getRappels() {
const db = await getDb();
if (!db) return [];
return await db.select().from(rappels).orderBy(rappels.joursAvant);
const allRappels = await db.select().from(rappels).orderBy(rappels.joursAvant);
// Pour chaque rappel, récupérer les séquences associées
const rappelsWithSequences = await Promise.all(
allRappels.map(async (rappel) => {
const sequenceIds = await getRappelSequences(rappel.id);
return {
...rappel,
sequenceIds,
};
})
);
return rappelsWithSequences;
}
export async function getRappelById(id: number): Promise<Rappel | undefined> {
@@ -1022,9 +1036,43 @@ export async function deleteRappel(id: number) {
const db = await getDb();
if (!db) throw new Error("Database not available");
// Supprimer d'abord les associations
await db.delete(rappelSequences).where(eq(rappelSequences.rappelId, id));
// Puis le rappel
await db.delete(rappels).where(eq(rappels.id, id));
}
// ==================== RAPPEL SEQUENCES ====================
export async function createRappelSequences(rappelId: number, sequenceIds: number[]) {
const db = await getDb();
if (!db) throw new Error("Database not available");
if (sequenceIds.length === 0) return;
const values = sequenceIds.map(sequenceId => ({
rappelId,
sequenceId,
}));
await db.insert(rappelSequences).values(values);
}
export async function deleteRappelSequences(rappelId: number) {
const db = await getDb();
if (!db) throw new Error("Database not available");
await db.delete(rappelSequences).where(eq(rappelSequences.rappelId, rappelId));
}
export async function getRappelSequences(rappelId: number): Promise<number[]> {
const db = await getDb();
if (!db) return [];
const results = await db.select().from(rappelSequences).where(eq(rappelSequences.rappelId, rappelId));
return results.map(r => r.sequenceId);
}
export async function updateRappelExecution(id: number) {
const db = await getDb();
if (!db) return;