From bd9cb15f44cbc2418cc770b99450f37693b8d818 Mon Sep 17 00:00:00 2001 From: Manus Date: Tue, 13 Jan 2026 03:21:23 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Correction=20des=20erreurs=20tRPC?= =?UTF-8?q?=20qui=20retournaient=20du=20HTML=20au=20lieu=20de=20JSON=20:?= =?UTF-8?q?=20-=20Changement=20du=20champ=20'nom'=20en=20'titre'=20pour=20?= =?UTF-8?q?les=20questionnaires=20(backend=20et=20frontend)=20-=20Suppress?= =?UTF-8?q?ion=20de=20la=20propri=C3=A9t=C3=A9=20'complete'=20inexistante?= =?UTF-8?q?=20dans=20reponsesQuestionnaires=20-=20Correction=20du=20type?= =?UTF-8?q?=20'provider'=20dans=20la=20configuration=20email=20-=20Gestion?= =?UTF-8?q?=20des=20valeurs=20null=20pour=20le=20champ=20'fonction'=20des?= =?UTF-8?q?=20apprenants=20-=20R=C3=A9solution=20de=20l'erreur=20logsRappe?= =?UTF-8?q?ls.email=20apr=C3=A8s=20red=C3=A9marrage=20du=20serveur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .manus/db/db-query-1768292182483.json | 114 ++++++++++++++++++ .../src/pages/AdminQuestionnaireAnalyse.tsx | 2 +- client/src/pages/AdminQuestionnaireEdit.tsx | 18 +-- client/src/pages/AdminQuestionnaires.tsx | 2 +- server/routers.ts | 17 ++- 5 files changed, 133 insertions(+), 20 deletions(-) create mode 100644 .manus/db/db-query-1768292182483.json diff --git a/.manus/db/db-query-1768292182483.json b/.manus/db/db-query-1768292182483.json new file mode 100644 index 0000000..4078f29 --- /dev/null +++ b/.manus/db/db-query-1768292182483.json @@ -0,0 +1,114 @@ +{ + "query": "DESCRIBE logsRappels;", + "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 DESCRIBE logsRappels;", + "rows": [ + { + "Field": "id", + "Type": "int(11)", + "Null": "NO", + "Key": "PRI", + "Default": "NULL", + "Extra": "auto_increment" + }, + { + "Field": "rappelId", + "Type": "int(11)", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "sequenceId", + "Type": "int(11)", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "apprenantId", + "Type": "int(11)", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "emailDestinataire", + "Type": "varchar(320)", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "typeRappel", + "Type": "varchar(50)", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "dateEnvoi", + "Type": "timestamp", + "Null": "NO", + "Key": "", + "Default": "CURRENT_TIMESTAMP", + "Extra": "" + }, + { + "Field": "statut", + "Type": "enum('success','failed')", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "messageErreur", + "Type": "text", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "dateSequence", + "Type": "timestamp", + "Null": "NO", + "Key": "", + "Default": "NULL", + "Extra": "" + }, + { + "Field": "createdAt", + "Type": "timestamp", + "Null": "NO", + "Key": "", + "Default": "CURRENT_TIMESTAMP", + "Extra": "" + }, + { + "Field": "nbTentatives", + "Type": "int(11)", + "Null": "NO", + "Key": "", + "Default": "1", + "Extra": "" + }, + { + "Field": "prochainEssai", + "Type": "timestamp", + "Null": "YES", + "Key": "", + "Default": "NULL", + "Extra": "" + } + ], + "messages": [], + "stdout": "Field\tType\tNull\tKey\tDefault\tExtra\nid\tint(11)\tNO\tPRI\tNULL\tauto_increment\nrappelId\tint(11)\tNO\t\tNULL\t\nsequenceId\tint(11)\tNO\t\tNULL\t\napprenantId\tint(11)\tNO\t\tNULL\t\nemailDestinataire\tvarchar(320)\tNO\t\tNULL\t\ntypeRappel\tvarchar(50)\tNO\t\tNULL\t\ndateEnvoi\ttimestamp\tNO\t\tCURRENT_TIMESTAMP\t\nstatut\tenum('success','failed')\tNO\t\tNULL\t\nmessageErreur\ttext\tYES\t\tNULL\t\ndateSequence\ttimestamp\tNO\t\tNULL\t\ncreatedAt\ttimestamp\tNO\t\tCURRENT_TIMESTAMP\t\nnbTentatives\tint(11)\tNO\t\t1\t\nprochainEssai\ttimestamp\tYES\t\tNULL\t\n", + "stderr": "", + "execution_time_ms": 446 +} \ No newline at end of file diff --git a/client/src/pages/AdminQuestionnaireAnalyse.tsx b/client/src/pages/AdminQuestionnaireAnalyse.tsx index daa8bf5..5b8c285 100644 --- a/client/src/pages/AdminQuestionnaireAnalyse.tsx +++ b/client/src/pages/AdminQuestionnaireAnalyse.tsx @@ -140,7 +140,7 @@ export default function AdminQuestionnaireAnalyse() {
-

{questionnaire.nom}

+

{questionnaire.titre}

Analyse des réponses

diff --git a/client/src/pages/AdminQuestionnaireEdit.tsx b/client/src/pages/AdminQuestionnaireEdit.tsx index 9346c0f..35888a5 100644 --- a/client/src/pages/AdminQuestionnaireEdit.tsx +++ b/client/src/pages/AdminQuestionnaireEdit.tsx @@ -35,7 +35,7 @@ export default function AdminQuestionnaireEdit() { const [, navigate] = useLocation(); const questionnaireId = params?.id === "nouveau" ? null : parseInt(params?.id || "0"); - const [nom, setNom] = useState(""); + const [titre, setTitre] = useState(""); const [type, setType] = useState<"satisfaction" | "evaluation_pre" | "evaluation_post">("satisfaction"); const [description, setDescription] = useState(""); const [actif, setActif] = useState(true); @@ -101,7 +101,7 @@ export default function AdminQuestionnaireEdit() { useEffect(() => { if (questionnaire) { - setNom(questionnaire.nom); + setTitre(questionnaire.titre); setType(questionnaire.type); setDescription(questionnaire.description || ""); setActif(questionnaire.actif); @@ -130,8 +130,8 @@ export default function AdminQuestionnaireEdit() { const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - if (!nom.trim()) { - toast.error("Le nom du questionnaire est obligatoire"); + if (!titre.trim()) { + toast.error("Le titre du questionnaire est obligatoire"); return; } @@ -141,7 +141,7 @@ export default function AdminQuestionnaireEdit() { } const data = { - nom, + titre, type, description: description || undefined, actif, @@ -208,11 +208,11 @@ export default function AdminQuestionnaireEdit() {
- + setNom(e.target.value)} + id="titre" + value={titre} + onChange={(e) => setTitre(e.target.value)} placeholder="Ex: Questionnaire de satisfaction Manager Itinova" required /> diff --git a/client/src/pages/AdminQuestionnaires.tsx b/client/src/pages/AdminQuestionnaires.tsx index 21f6356..504b40b 100644 --- a/client/src/pages/AdminQuestionnaires.tsx +++ b/client/src/pages/AdminQuestionnaires.tsx @@ -90,7 +90,7 @@ export default function AdminQuestionnaires() {
- {questionnaire.nom} + {questionnaire.titre} {getTypeBadge(questionnaire.type)} {!questionnaire.actif && ( diff --git a/server/routers.ts b/server/routers.ts index f39784f..edb66da 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -688,7 +688,7 @@ export const appRouter = router({ formateurNom: formateur.nom, apprenantNom: apprenant.nom, apprenantPrenom: apprenant.prenom, - apprenantFonction: apprenant.fonction, + apprenantFonction: apprenant.fonction || '', formationNom: formation.nom, sequenceNom: sequence.nom, nbInscrits: nbInscritsApres, @@ -797,7 +797,7 @@ export const appRouter = router({ formateurNom: formateur.nom, apprenantNom: apprenant.nom, apprenantPrenom: apprenant.prenom, - apprenantFonction: apprenant.fonction, + apprenantFonction: apprenant.fonction || '', formationNom: formation.nom, sequenceNom: sequence.nom, nbInscrits: nbInscritsApres, @@ -1338,7 +1338,7 @@ export const appRouter = router({ apprenantEmail: apprenant.email, apprenantPrenom: apprenant.prenom, apprenantNom: apprenant.nom, - apprenantFonction: apprenant.fonction, + apprenantFonction: apprenant.fonction || '', formationNom: formation.nom, sequenceNom: sequence.nom, dates: dates.map((d: any) => ({ @@ -1354,7 +1354,7 @@ export const appRouter = router({ apprenantEmail: apprenant.email, apprenantPrenom: apprenant.prenom, apprenantNom: apprenant.nom, - apprenantFonction: apprenant.fonction, + apprenantFonction: apprenant.fonction || '', formationNom: formation.nom, sequenceNom: sequence.nom, dates: dates.map((d: any) => ({ @@ -1421,7 +1421,7 @@ export const appRouter = router({ upsert: adminProcedure .input(z.object({ - provider: z.string(), + provider: z.enum(["resend", "smtp", "simulation"]), apiKey: z.string().nullable(), fromEmail: z.string().email(), fromName: z.string(), @@ -1591,7 +1591,7 @@ export const appRouter = router({ create: adminProcedure .input(z.object({ - nom: z.string(), + titre: z.string(), type: z.enum(["satisfaction", "evaluation_pre", "evaluation_post"]), description: z.string().optional(), formationId: z.number().nullable().optional(), @@ -1608,7 +1608,7 @@ export const appRouter = router({ update: adminProcedure .input(z.object({ id: z.number(), - nom: z.string().optional(), + titre: z.string().optional(), type: z.enum(["satisfaction", "evaluation_pre", "evaluation_post"]).optional(), description: z.string().optional(), formationId: z.number().nullable().optional(), @@ -1766,7 +1766,6 @@ export const appRouter = router({ questionnaireId: envoi.questionnaireId, apprenantId: envoi.apprenantId, sequenceId: envoi.sequenceId, - complete: true, }); // Enregistrer chaque réponse @@ -1791,7 +1790,7 @@ export const appRouter = router({ await notifyOwner({ title: 'Nouvelle réponse au questionnaire', - content: `Un apprenant a répondu au questionnaire "${questionnaire?.nom || 'Sans titre'}"`, + content: `Un apprenant a répondu au questionnaire "${questionnaire?.titre || 'Sans titre'}"`, }); } catch (error) { console.error('[Notification] Erreur lors de l\'envoi de la notification:', error);