Checkpoint: V1.20 - Amélioration de l'envoi d'attestations par groupe. Le bouton d'envoi par séquence est maintenant toujours visible dès qu'il y a des attestations disponibles, permettant d'envoyer les nouvelles attestations ou de renvoyer celles déjà envoyées. Message de confirmation adapté selon la situation.
This commit is contained in:
@@ -442,22 +442,37 @@ export default function AdminGestionAttestations() {
|
||||
|
||||
// Envoyer toutes les attestations d'une séquence
|
||||
const handleSendSequence = (sequenceId: number, sequenceApprenants: any[]) => {
|
||||
const attestationsReady = sequenceApprenants.filter(item => {
|
||||
const attestationsWithDocument = sequenceApprenants.filter(item => {
|
||||
const hasDocument = item.attestation && (item.attestation.documentUrl || item.attestation.urlPdf);
|
||||
return hasDocument && !item.attestation.emailEnvoye;
|
||||
return hasDocument;
|
||||
});
|
||||
|
||||
if (attestationsReady.length === 0) {
|
||||
toast.error("Aucune attestation prête à envoyer pour cette séquence");
|
||||
if (attestationsWithDocument.length === 0) {
|
||||
toast.error("Aucune attestation disponible pour cette séquence");
|
||||
return;
|
||||
}
|
||||
|
||||
if (confirm(`Êtes-vous sûr de vouloir envoyer ${attestationsReady.length} attestation(s) pour cette séquence ?`)) {
|
||||
// Envoyer chaque attestation de la séquence
|
||||
let successCount = 0;
|
||||
let errorCount = 0;
|
||||
const attestationsNotSent = attestationsWithDocument.filter(item => !item.attestation.emailEnvoye);
|
||||
const attestationsAlreadySent = attestationsWithDocument.filter(item => item.attestation.emailEnvoye);
|
||||
|
||||
const sendPromises = attestationsReady.map(item => {
|
||||
let confirmMessage = '';
|
||||
if (attestationsNotSent.length > 0 && attestationsAlreadySent.length > 0) {
|
||||
confirmMessage = `Êtes-vous sûr de vouloir envoyer ${attestationsNotSent.length} attestation(s) et renvoyer ${attestationsAlreadySent.length} attestation(s) déjà envoyée(s) ?`;
|
||||
} else if (attestationsNotSent.length > 0) {
|
||||
confirmMessage = `Êtes-vous sûr de vouloir envoyer ${attestationsNotSent.length} attestation(s) pour cette séquence ?`;
|
||||
} else {
|
||||
confirmMessage = `Êtes-vous sûr de vouloir renvoyer ${attestationsAlreadySent.length} attestation(s) déjà envoyée(s) ?`;
|
||||
}
|
||||
|
||||
if (!confirm(confirmMessage)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Envoyer chaque attestation de la séquence
|
||||
let successCount = 0;
|
||||
let errorCount = 0;
|
||||
|
||||
const sendPromises = attestationsWithDocument.map(item => {
|
||||
const pdfUrl = item.attestation.documentUrl || item.attestation.urlPdf;
|
||||
return sendAttestationMutation.mutateAsync({
|
||||
attestationId: item.attestation.id,
|
||||
@@ -475,13 +490,12 @@ export default function AdminGestionAttestations() {
|
||||
});
|
||||
});
|
||||
|
||||
Promise.all(sendPromises).finally(() => {
|
||||
if (successCount > 0) {
|
||||
toast.success(`${successCount} attestation(s) envoyée(s) avec succès${errorCount > 0 ? `, ${errorCount} échec(s)` : ''}`);
|
||||
}
|
||||
refetchApprenants();
|
||||
});
|
||||
}
|
||||
Promise.all(sendPromises).finally(() => {
|
||||
if (successCount > 0) {
|
||||
toast.success(`${successCount} attestation(s) envoyée(s) avec succès${errorCount > 0 ? `, ${errorCount} échec(s)` : ''}`);
|
||||
}
|
||||
refetchApprenants();
|
||||
});
|
||||
};
|
||||
|
||||
// Ouvrir le dialogue d'upload
|
||||
@@ -748,7 +762,7 @@ export default function AdminGestionAttestations() {
|
||||
<Badge variant="outline" className="bg-white">
|
||||
{attestationsEnvoyees} / {sequenceApprenants.length} envoyé(es)
|
||||
</Badge>
|
||||
{modeEnvoi === "manuel" && attestationsPretesNonEnvoyees > 0 && (
|
||||
{modeEnvoi === "manuel" && sequenceApprenants.some(a => a.attestation && (a.attestation.documentUrl || a.attestation.urlPdf)) && (
|
||||
<Button
|
||||
size="sm"
|
||||
onClick={() => handleSendSequence(sequenceId, sequenceApprenants)}
|
||||
@@ -756,7 +770,10 @@ export default function AdminGestionAttestations() {
|
||||
className="bg-green-600 hover:bg-green-700 text-white"
|
||||
>
|
||||
<Send className="h-3 w-3 mr-1" />
|
||||
Envoyer la séquence ({attestationsPretesNonEnvoyees})
|
||||
{attestationsPretesNonEnvoyees > 0
|
||||
? `Envoyer la séquence (${attestationsPretesNonEnvoyees})`
|
||||
: `Renvoyer la séquence (${attestationsEnvoyees})`
|
||||
}
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
|
||||
10
todo.md
10
todo.md
@@ -1646,4 +1646,12 @@
|
||||
- [x] Ajouter l'URL dans le retour de la procédure generateQRCode
|
||||
- [x] Afficher l'URL sous le QR code (texte cliquable)
|
||||
- [x] Déployer sur TEST pour validation
|
||||
- [ ] Déployer sur PROD
|
||||
- [x] Déployer sur PROD
|
||||
|
||||
## Envoi d'attestations par groupe
|
||||
|
||||
- [x] Analyser la page des attestations pour identifier l'emplacement du bouton
|
||||
- [x] Modifier le bouton existant pour permettre l'envoi/renvoi de toutes les attestations du groupe
|
||||
- [x] Adapter la logique pour gérer les attestations déjà envoyées (renvoi)
|
||||
- [x] Déployer sur TEST (recette)
|
||||
- [x] Déployer sur sandbox (dev local) - déjà actif
|
||||
|
||||
Reference in New Issue
Block a user