Checkpoint: Ajout de la page de gestion des attestations de formation

Fonctionnalités :
- Configuration par formation (génération auto/manuel, envoi auto/manuel)
- Affichage de la liste des apprenants inscrits
- Upload de documents PDF par apprenant (mode manuel)
- Boutons de prévisualisation et d'envoi manuel
- Gestion complète des attestations

Corrections :
- Ajout des colonnes modeAttestation et modeEnvoi dans la table formations
- Ajout des colonnes documentUrl, documentS3Key, uploadedBy, uploadedAt, emailEnvoye, dateEnvoiEmail dans la table attestations
- Correction de l'erreur SQL en retirant la colonne urlPdf inexistante de la requête
This commit is contained in:
Manus
2026-01-12 15:13:44 -05:00
parent a7602e6740
commit 97aeacab29
12 changed files with 495 additions and 15 deletions

View File

@@ -0,0 +1,70 @@
{
"query": "SELECT \n apprenants.id, apprenants.nom, apprenants.prenom, apprenants.email,\n inscriptions.id as inscriptionId, inscriptions.sequenceId,\n sequences.nom as sequenceNom,\n attestations.id as attestationId, attestations.documentUrl, attestations.emailEnvoye\nFROM inscriptions\nINNER JOIN apprenants ON inscriptions.apprenantId = apprenants.id\nINNER JOIN sequences ON inscriptions.sequenceId = sequences.id\nLEFT JOIN attestations ON attestations.inscriptionId = inscriptions.id\nWHERE sequences.formationId = 1 AND inscriptions.statut = 'confirmee'\nLIMIT 5;",
"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 \n apprenants.id, apprenants.nom, apprenants.prenom, apprenants.email,\n inscriptions.id as inscriptionId, inscriptions.sequenceId,\n sequences.nom as sequenceNom,\n attestations.id as attestationId, attestations.documentUrl, attestations.emailEnvoye\nFROM inscriptions\nINNER JOIN apprenants ON inscriptions.apprenantId = apprenants.id\nINNER JOIN sequences ON inscriptions.sequenceId = sequences.id\nLEFT JOIN attestations ON attestations.inscriptionId = inscriptions.id\nWHERE sequences.formationId = 1 AND inscriptions.statut = 'confirmee'\nLIMIT 5;",
"rows": [
{
"id": "1",
"nom": "JOHANSSON ",
"prenom": "Scarlett",
"email": "opareige@gmail.com",
"inscriptionId": "240001",
"sequenceId": "60001",
"sequenceNom": "Groupe C",
"attestationId": "NULL",
"documentUrl": "NULL",
"emailEnvoye": "NULL"
},
{
"id": "1",
"nom": "JOHANSSON ",
"prenom": "Scarlett",
"email": "opareige@gmail.com",
"inscriptionId": "60001",
"sequenceId": "30001",
"sequenceNom": "Groupe A",
"attestationId": "NULL",
"documentUrl": "NULL",
"emailEnvoye": "NULL"
},
{
"id": "60001",
"nom": "PITT",
"prenom": "Brad",
"email": "test2@gmail.com",
"inscriptionId": "270001",
"sequenceId": "60001",
"sequenceNom": "Groupe C",
"attestationId": "NULL",
"documentUrl": "NULL",
"emailEnvoye": "NULL"
},
{
"id": "90001",
"nom": "TEST",
"prenom": "Fred",
"email": "test.alerte@example.com",
"inscriptionId": "150001",
"sequenceId": "30001",
"sequenceNom": "Groupe A",
"attestationId": "NULL",
"documentUrl": "NULL",
"emailEnvoye": "NULL"
},
{
"id": "90002",
"nom": "AUBOISDORMANT",
"prenom": "Abel",
"email": "alerte2.test@example.com",
"inscriptionId": "150002",
"sequenceId": "30001",
"sequenceNom": "Groupe A",
"attestationId": "NULL",
"documentUrl": "NULL",
"emailEnvoye": "NULL"
}
],
"messages": [],
"stdout": "id\tnom\tprenom\temail\tinscriptionId\tsequenceId\tsequenceNom\tattestationId\tdocumentUrl\temailEnvoye\n1\tJOHANSSON \tScarlett\topareige@gmail.com\t240001\t60001\tGroupe C\tNULL\tNULL\tNULL\n1\tJOHANSSON \tScarlett\topareige@gmail.com\t60001\t30001\tGroupe A\tNULL\tNULL\tNULL\n60001\tPITT\tBrad\ttest2@gmail.com\t270001\t60001\tGroupe C\tNULL\tNULL\tNULL\n90001\tTEST\tFred\ttest.alerte@example.com\t150001\t30001\tGroupe A\tNULL\tNULL\tNULL\n90002\tAUBOISDORMANT\tAbel\talerte2.test@example.com\t150002\t30001\tGroupe A\tNULL\tNULL\tNULL\n",
"stderr": "",
"execution_time_ms": 62
}