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
+40
View File
@@ -8,6 +8,7 @@ import type {
BadgeFieldRead,
DayPartRead,
EditionRead,
FeePaymentStatus,
FormFieldType,
FormPaymentOptionRead,
PositionCategory,
@@ -16,6 +17,37 @@ import type {
VolunteerRead,
} from '../schema';
/** Inscription en attente de paiement en ligne (mode démonstration) — voir
* `PendingFormSubmission` côté back-end (CLAUDE.md § 2, Paiement de la
* cotisation). `pollCount` simule le délai de confirmation réel (webhook
* asynchrone) : la première vérification reste `PENDING`, la suivante
* confirme — sans vrai réseau ni vrai SumUp en mode mock. */
export interface MockPendingSubmission {
id: string;
editionId: string;
firstName: string | null;
lastName: string | null;
email: string | null;
phone: string | null;
comment: string | null;
companionWishNote: string | null;
available: boolean;
positionIds: string[];
artistIds: string[];
photo: string | null; // data URL
paymentLabel: string;
paymentAmount: number;
requiresMecenatInfo: boolean;
mecenatAddress: string | null;
mecenatCity: string | null;
mecenatPostalCode: string | null;
mecenatCountry: string | null;
checkoutId: string | null;
status: FeePaymentStatus | null;
promotedVolunteerId: string | null;
pollCount: number;
}
const PART_LABELS: Record<string, string> = { M: 'Matin', A: 'Après-midi', S: 'Soirée', N: 'Nuit' };
const PART_CODES: Record<string, string> = { M: 'MATIN', A: 'APRES_MIDI', S: 'SOIREE', N: 'NUIT' };
const hhmm = (h: number) => `${String(h % 24).padStart(2, '0')}:00:00`;
@@ -61,6 +93,9 @@ export interface MockState {
sumupApiKey: string | null;
};
formPaymentOptions: FormPaymentOptionRead[];
/** Inscriptions en attente de paiement en ligne (voir CLAUDE.md § 2,
* Paiement de la cotisation) — clé : jeton public (id). */
pendingSubmissions: Map<string, MockPendingSubmission>;
/** volunteerId -> photo (formulaire public), data URL. */
photos: Map<string, string>;
seq: number;
@@ -278,6 +313,10 @@ export function buildMockState(): MockState {
willing_to_pay_fee: false,
fee_payment_label: null,
fee_amount: null,
mecenat_address: null,
mecenat_city: null,
mecenat_postal_code: null,
mecenat_country: null,
fee_payment_status: null,
fee_paid_at: null,
created_at: NOW,
@@ -458,6 +497,7 @@ export function buildMockState(): MockState {
sumupMerchantCode: null, sumupApiKey: null,
},
formPaymentOptions: [],
pendingSubmissions: new Map(),
photos: new Map(),
seq,
};