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
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user