diff --git a/CLAUDE.md b/CLAUDE.md index b9bfec3..f549657 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -850,6 +850,7 @@ Aucune dépendance locale requise hors Docker. | 33 | Cerfa mécénat rempli envoyé en pièce jointe de l'email de confirmation une fois le paiement confirmé (`build_message(attachments=…)`, `app/mecenat/receipts.py`) ; modèle cerfa pré-rempli avec l'association et sa signature | à valider | | 34 | Numéro d'ordre unique sur chaque reçu fiscal mécénat (`Volunteer.mecenat_receipt_number`, `202600001`…, migration `0020`), attribué au paiement ou au premier export puis figé | à valider | | 35 | Type de paiement à montant libre (`FormPaymentOption.free_amount`, migration `0021`) : case « Montant libre » sur l'écran Inscriptions, montant configuré = minimum, saisie du montant sur le formulaire public (validée côté client et serveur, 10 000 € max) — pensé pour le mécénat | à valider | +| 36 | Écran Inscriptions : état « Actif / Inactif » des types de paiement (`SumUpStatus`, `FormBuilderPage.tsx`) — sans identifiants SumUp ou sans type de paiement, le formulaire public n'affiche qu'une case « cotisation » (ni choix du type, ni étape mécénat, ni paiement en ligne), ce que rien ne signalait | à valider | **Reste hors périmètre** (modèle prêt à les accueillir) : SMS, constructeur de formulaire, pointage sur site, IA. Frontend : squelette + 6 écrans + diff --git a/frontend/src/i18n/locales/fr.json b/frontend/src/i18n/locales/fr.json index 58b5163..85efa0f 100644 --- a/frontend/src/i18n/locales/fr.json +++ b/frontend/src/i18n/locales/fr.json @@ -421,6 +421,9 @@ "form.customize.sumup.apiKey.placeholder": "sup_sk_...", "form.customize.paymentOptions.title": "Types de paiement", "form.customize.paymentOptions.label": "Libellé (ex. Cotisation classique, Mécénat…)", + "form.customize.paymentOptions.active": "✓ Actif : le formulaire propose ces types de paiement (paiement en ligne SumUp, étape d'adresse pour le mécénat).", + "form.customize.paymentOptions.inactive.noCredentials": "⚠ Inactif : renseignez le code marchand et la clé API SumUp ci-dessus. En attendant, le formulaire n'affiche qu'une case « cotisation » à cocher : pas de choix du type de paiement, pas d'étape mécénat, pas de paiement en ligne.", + "form.customize.paymentOptions.inactive.noOptions": "⚠ Inactif : ajoutez au moins un type de paiement ci-dessous. En attendant, le formulaire n'affiche qu'une case « cotisation » à cocher.", "form.customize.paymentOptions.add": "Ajouter", "form.customize.paymentOptions.mecenat": "Mécénat", "form.customize.paymentOptions.free": "Montant libre", diff --git a/frontend/src/pages/FormBuilderPage.tsx b/frontend/src/pages/FormBuilderPage.tsx index 774fbee..8359101 100644 --- a/frontend/src/pages/FormBuilderPage.tsx +++ b/frontend/src/pages/FormBuilderPage.tsx @@ -335,6 +335,12 @@ export function FormBuilderPage() {
{t('form.customize.paymentOptions.title')} +
@@ -343,6 +349,32 @@ export function FormBuilderPage() { ); } +/** Le formulaire public ne propose les types de paiement (et donc l'étape + * mécénat puis SumUp) qu'avec des identifiants SumUp **et** au moins un + * type — sinon il n'affiche qu'une simple case « cotisation » et crée le + * bénévole directement (`PublicFormConfig.sumup_enabled`). Le dire ici, sans + * quoi une option « Mécénat » configurée semble simplement ne pas marcher. */ +function SumUpStatus({ credentialsSet }: { credentialsSet: boolean }) { + const options = useFormPaymentOptions(); + const hasOptions = (options.data?.length ?? 0) > 0; + if (credentialsSet && hasOptions) { + return ( +

+ {t('form.customize.paymentOptions.active')} +

+ ); + } + return ( +

+ {t( + credentialsSet + ? 'form.customize.paymentOptions.inactive.noOptions' + : 'form.customize.paymentOptions.inactive.noCredentials', + )} +

+ ); +} + /** Types de paiement (libellé + montant fixe) — liste libre, même principe * que `DayPartsForm` (`ConfigRules.tsx`) : édition en ligne (au blur), * ajout en bas, suppression immédiate. */