Inscription en deux temps, emails de confirmation et export Excel des bénévoles
Formulaire public — paiement en ligne : - Le bénévole n'est plus compté en base tant qu'un paiement en ligne choisi n'est pas confirmé (PendingFormSubmission, promu en Volunteer à la confirmation, webhook ou vérification en direct). - Type de paiement « mécénat » : étape d'adresse postale avant le paiement, conservée sur le bénévole pour un reçu fiscal (cerfa) ultérieur. - Page de confirmation au retour de SumUp, avec relance possible après échec/expiration sans ressaisir le formulaire. - « Je paierai sur place » remplace « je ne participe pas » ; tous les champs activés par la coordination sont désormais obligatoires. - La fiche bénévole n'affiche plus l'état des cases à cocher, seulement le résultat réel du paiement (libellé, montant, statut). Emails : - Email de confirmation d'inscription à la création du bénévole (tient lieu de reçu de paiement quand une cotisation est payée en ligne). - Mise en forme HTML au thème de l'application (logo de l'édition en en-tête) pour tous les emails envoyés, texte brut conservé en repli. Export Excel des bénévoles (COORDINATION) : coordonnées, vœux résolus en noms lisibles, cotisation et mécénat. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
68d42ee303
commit
a2b748566b
@@ -28,6 +28,7 @@ import type {
|
||||
FormPaymentOptionUpdate,
|
||||
FormTemplateUpdate,
|
||||
ImportMapping,
|
||||
MecenatInfoSubmit,
|
||||
PlanningNotificationRequest,
|
||||
PositionCreate,
|
||||
PositionSheetsRequest,
|
||||
@@ -384,6 +385,15 @@ export function useDeleteVolunteer() {
|
||||
});
|
||||
}
|
||||
|
||||
/** Export Excel de la liste des bénévoles ; ne fait que retourner le
|
||||
* fichier (le composant appelant déclenche le téléchargement, voir
|
||||
* `useGenerateBadges`). */
|
||||
export function useExportVolunteers() {
|
||||
return useMutation({
|
||||
mutationFn: () => api.volunteers.exportXlsx(edition),
|
||||
});
|
||||
}
|
||||
|
||||
/** Remplace toutes les fenêtres de disponibilité d'un bénévole. */
|
||||
export function useReplaceAvailability() {
|
||||
const invalidate = useInvalidate();
|
||||
@@ -713,3 +723,31 @@ export function useSubmitPublicForm() {
|
||||
mutationFn: (body: PublicFormSubmission) => api.forms.submitPublic(edition, body),
|
||||
});
|
||||
}
|
||||
|
||||
export function useSubmitMecenatInfo() {
|
||||
return useMutation({
|
||||
mutationFn: ({ token, body }: { token: string; body: MecenatInfoSubmit }) =>
|
||||
api.forms.submitMecenatInfo(edition, token, body),
|
||||
});
|
||||
}
|
||||
|
||||
/** Statut d'une inscription en attente de paiement en ligne — interrogé en
|
||||
* direct (voir CLAUDE.md § 2, Paiement de la cotisation) : la page de
|
||||
* confirmation reste en attente tant que `status` vaut `PENDING`. */
|
||||
export function usePendingStatus(token: string | null) {
|
||||
return useQuery({
|
||||
queryKey: ['pendingStatus', edition, token],
|
||||
queryFn: () => api.forms.getPendingStatus(edition, token as string),
|
||||
enabled: token !== null,
|
||||
// Arrête la vérification automatique après ~2 min (40 x 3 s) : au-delà,
|
||||
// un bouton manuel dans PaymentConfirmationView permet de réessayer.
|
||||
refetchInterval: (query) =>
|
||||
query.state.data?.status === 'PENDING' && query.state.dataUpdateCount < 40 ? 3000 : false,
|
||||
});
|
||||
}
|
||||
|
||||
export function useRetryPendingPayment() {
|
||||
return useMutation({
|
||||
mutationFn: (token: string) => api.forms.retryPendingPayment(edition, token),
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user