From e3dffb85f4703a5580ed5f538fb5952fe60a043c Mon Sep 17 00:00:00 2001 From: Manus Date: Thu, 22 Jan 2026 08:50:00 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20=E2=9C=85=20Am=C3=A9lioration=20d?= =?UTF-8?q?u=20test=20de=20rappels=20avec=20envoi=20multiple=20et=20indica?= =?UTF-8?q?teur=20de=20progression=20-=20Modification=20du=20backend=20pou?= =?UTF-8?q?r=20envoyer=20un=20email=20par=20inscrit=20confirm=C3=A9=20(tou?= =?UTF-8?q?s=20=C3=A0=20l'adresse=20de=20test)=20-=20Ajout=20d'un=20indica?= =?UTF-8?q?teur=20de=20progression=20moderne=20avec=20animation=20(spinner?= =?UTF-8?q?=20+=20effet=20ping)=20-=20Message=20de=20succ=C3=A8s=20afficha?= =?UTF-8?q?nt=20le=20nombre=20d'emails=20envoy=C3=A9s=20-=20Validation=20a?= =?UTF-8?q?vec=20s=C3=A9quence=20"test=203"=20:=203=20emails=20envoy=C3=A9?= =?UTF-8?q?s=20correctement=20(4=C3=A8me=20inscrit=20sans=20email=20ignor?= =?UTF-8?q?=C3=A9)=20-=20Synchronisation=20compl=C3=A8te=20de=20la=20struc?= =?UTF-8?q?ture=20de=20la=20table=20logsrappels=20avec=20le=20VPS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .manus/db/db-query-1769089721346.json | 9 ++++ .manus/db/db-query-1769089734156.json | 73 +++++++++++++++++++++++++++ client/src/pages/AdminSequences.tsx | 28 +++++++++- server/routers.ts | 6 +-- todo.md | 1 + 5 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 .manus/db/db-query-1769089721346.json create mode 100644 .manus/db/db-query-1769089734156.json diff --git a/.manus/db/db-query-1769089721346.json b/.manus/db/db-query-1769089721346.json new file mode 100644 index 0000000..f35924d --- /dev/null +++ b/.manus/db/db-query-1769089721346.json @@ -0,0 +1,9 @@ +{ + "query": "SELECT i.id, i.apprenantId, i.statut, a.nom, a.prenom, a.email \nFROM inscriptions i \nLEFT JOIN apprenants a ON i.apprenantId = a.id \nWHERE i.sequenceId = 330001 AND i.statut = 'confirme';", + "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 i.id, i.apprenantId, i.statut, a.nom, a.prenom, a.email \nFROM inscriptions i \nLEFT JOIN apprenants a ON i.apprenantId = a.id \nWHERE i.sequenceId = 330001 AND i.statut = 'confirme';", + "rows": [], + "messages": [], + "stdout": "", + "stderr": "", + "execution_time_ms": 80 +} \ No newline at end of file diff --git a/.manus/db/db-query-1769089734156.json b/.manus/db/db-query-1769089734156.json new file mode 100644 index 0000000..3b047f2 --- /dev/null +++ b/.manus/db/db-query-1769089734156.json @@ -0,0 +1,73 @@ +{ + "query": "SELECT i.id, i.apprenantId, i.statut, i.dateInscription, a.nom, a.prenom, a.email \nFROM inscriptions i \nLEFT JOIN apprenants a ON i.apprenantId = a.id \nWHERE i.sequenceId = 330001;", + "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 i.id, i.apprenantId, i.statut, i.dateInscription, a.nom, a.prenom, a.email \nFROM inscriptions i \nLEFT JOIN apprenants a ON i.apprenantId = a.id \nWHERE i.sequenceId = 330001;", + "rows": [ + { + "id": "300001", + "apprenantId": "1", + "statut": "confirmee", + "dateInscription": "2025-11-30 21:54:11", + "nom": "JOHANSSON ", + "prenom": "Scarlett", + "email": "opareige@gmail.com" + }, + { + "id": "450001", + "apprenantId": "60001", + "statut": "confirmee", + "dateInscription": "2026-01-22 12:39:20", + "nom": "PITT", + "prenom": "Brad", + "email": "test2@gmail.com" + }, + { + "id": "420003", + "apprenantId": "240001", + "statut": "confirmee", + "dateInscription": "2025-12-03 09:32:09", + "nom": "monroe", + "prenom": "marylin", + "email": "o.pareige@itinova.org" + }, + { + "id": "420002", + "apprenantId": "240001", + "statut": "annulee", + "dateInscription": "2025-12-03 09:23:59", + "nom": "monroe", + "prenom": "marylin", + "email": "o.pareige@itinova.org" + }, + { + "id": "330001", + "apprenantId": "180001", + "statut": "annulee", + "dateInscription": "2025-12-01 08:40:38", + "nom": "NULL", + "prenom": "NULL", + "email": "NULL" + }, + { + "id": "360001", + "apprenantId": "180001", + "statut": "annulee", + "dateInscription": "2025-12-01 09:47:25", + "nom": "NULL", + "prenom": "NULL", + "email": "NULL" + }, + { + "id": "360002", + "apprenantId": "180001", + "statut": "confirmee", + "dateInscription": "2025-12-01 09:48:55", + "nom": "NULL", + "prenom": "NULL", + "email": "NULL" + } + ], + "messages": [], + "stdout": "id\tapprenantId\tstatut\tdateInscription\tnom\tprenom\temail\n300001\t1\tconfirmee\t2025-11-30 21:54:11\tJOHANSSON \tScarlett\topareige@gmail.com\n450001\t60001\tconfirmee\t2026-01-22 12:39:20\tPITT\tBrad\ttest2@gmail.com\n420003\t240001\tconfirmee\t2025-12-03 09:32:09\tmonroe\tmarylin\to.pareige@itinova.org\n420002\t240001\tannulee\t2025-12-03 09:23:59\tmonroe\tmarylin\to.pareige@itinova.org\n330001\t180001\tannulee\t2025-12-01 08:40:38\tNULL\tNULL\tNULL\n360001\t180001\tannulee\t2025-12-01 09:47:25\tNULL\tNULL\tNULL\n360002\t180001\tconfirmee\t2025-12-01 09:48:55\tNULL\tNULL\tNULL\n", + "stderr": "", + "execution_time_ms": 54 +} \ No newline at end of file diff --git a/client/src/pages/AdminSequences.tsx b/client/src/pages/AdminSequences.tsx index ef5a935..ca67dc3 100644 --- a/client/src/pages/AdminSequences.tsx +++ b/client/src/pages/AdminSequences.tsx @@ -36,6 +36,7 @@ export default function AdminSequences() { const [isConfirmTestOpen, setIsConfirmTestOpen] = useState(false); const [sequenceToTest, setSequenceToTest] = useState(null); const [testEmail, setTestEmail] = useState(""); + const [sendingProgress, setSendingProgress] = useState<{ current: number; total: number } | null>(null); const [formData, setFormData] = useState({ formationId: "", @@ -91,13 +92,15 @@ export default function AdminSequences() { }); const testerRappelMutation = trpc.rappels.testerRappel.useMutation({ - onSuccess: () => { - toast.success("Email de test envoyé avec succès"); + onSuccess: (data) => { + setSendingProgress(null); + toast.success(`${data.nbEnvoyes} email(s) de test envoyé(s) avec succès`); setIsConfirmTestOpen(false); setSequenceToTest(null); setTestEmail(""); }, onError: (error) => { + setSendingProgress(null); toast.error(`Erreur lors de l'envoi du test : ${error.message}`); setIsConfirmTestOpen(false); setSequenceToTest(null); @@ -1104,6 +1107,27 @@ export default function AdminSequences() { disabled={testerRappelMutation.isPending} /> + + {/* Indicateur de progression */} + {testerRappelMutation.isPending && ( +
+
+
+ + + + + + + +
+
+

Envoi en cours...

+

Veuillez patienter pendant l'envoi des emails de test

+
+
+
+ )}