Inscription en deux temps, emails de confirmation et export Excel des bénévoles
ci-cd / build-backend (push) Successful in 30s
ci-cd / build-frontend (push) Successful in 18s
ci-cd / deploy (push) Successful in 12s

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:
AdamThomas
2026-09-30 07:41:58 +02:00
co-authored by Claude Sonnet 5
parent 68d42ee303
commit a2b748566b
34 changed files with 2318 additions and 291 deletions
+44 -5
View File
@@ -121,6 +121,12 @@ export interface VolunteerRead {
fee_amount: number | null;
fee_payment_status: FeePaymentStatus | null;
fee_paid_at: string | null;
/** Coordonnées pour un reçu fiscal (cerfa) — seulement si payé via un type
* de paiement « mécénat ». */
mecenat_address: string | null;
mecenat_city: string | null;
mecenat_postal_code: string | null;
mecenat_country: string | null;
created_at: string;
updated_at: string;
}
@@ -606,6 +612,9 @@ export interface FormPaymentOptionRead {
label: string;
amount: number;
order: number;
/** Type « mécénat » : le bénévole passe par une étape d'adresse postale
* avant le paiement (reçu fiscal / cerfa). */
requires_mecenat_info: boolean;
created_at: string;
updated_at: string;
}
@@ -614,12 +623,14 @@ export interface FormPaymentOptionCreate {
label: string;
amount: number;
order?: number;
requires_mecenat_info?: boolean;
}
export interface FormPaymentOptionUpdate {
label?: string;
amount?: number;
order?: number;
requires_mecenat_info?: boolean;
}
export interface PublicPositionOption {
@@ -639,6 +650,7 @@ export interface PublicPaymentOption {
id: string;
label: string;
amount: number;
requires_mecenat_info: boolean;
}
/** Tout ce qu'il faut pour afficher le formulaire public — jamais plus. */
@@ -655,12 +667,40 @@ export interface PublicFormConfig {
payment_options: PublicPaymentOption[];
}
/** Trois formes possibles, selon le choix de paiement (voir
* `app/api/forms.py:submit_public_form`) :
* - aucun paiement en ligne (case désactivée, ou « je paierai sur place ») :
* `volunteer_id` seul, le bénévole est déjà en base ;
* - paiement en ligne, type « mécénat » : `pending_token` +
* `requires_mecenat_info=true`, rien en base encore — direction l'étape
* d'adresse (`submitMecenatInfo`) ;
* - paiement en ligne, type simple : `pending_token` + `sumup_checkout_url`,
* direction la page de paiement SumUp. */
export interface FormSubmissionResult {
volunteer_id: string;
/** Lien de paiement hébergé SumUp, si un checkout a pu être créé. */
volunteer_id: string | null;
pending_token: string | null;
requires_mecenat_info: boolean;
sumup_checkout_url: string | null;
}
/** Étape d'adresse postale d'un type de paiement « mécénat » — tous
* obligatoires, nécessaires à l'édition d'un reçu fiscal (cerfa). */
export interface MecenatInfoSubmit {
address: string;
city: string;
postal_code: string;
country: string;
}
/** Réponse de la vérification en direct du paiement (page de confirmation) —
* interrogée jusqu'à ce que le statut ne soit plus `PENDING`. */
export interface PendingSubmissionStatus {
status: FeePaymentStatus;
label: string;
amount: number;
volunteer_id: string | null;
}
/** Champs du formulaire public — envoyés en `multipart/form-data` (photo
* possible). `position_wish_ids`/`artist_wish_ids` : JSON stringifié
* (`'["id1","id2"]'`), pas de tableau natif possible en multipart. */
@@ -673,9 +713,8 @@ export interface PublicFormSubmission {
comment?: string;
companion_wish_note?: string;
available?: boolean;
willing_to_pay_fee?: boolean;
/** Type de paiement choisi (voir `PublicPaymentOption`) — `undefined` =
* aucun (le bénévole ne participe pas à la cotisation). */
/** Type de paiement choisi (voir `PublicPaymentOption`) — absent = « je
* paierai sur place » (aucun paiement en ligne). */
payment_option_id?: string;
position_wish_ids?: string[];
artist_wish_ids?: string[];