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);