Écran Inscriptions : signale quand les types de paiement sont inactifs
ci-cd / build-backend (push) Successful in 7s
ci-cd / build-frontend (push) Successful in 17s
ci-cd / deploy (push) Successful in 11s

Sans identifiants SumUp (code marchand + clé API) ou sans aucun type de
paiement, le formulaire public n'affiche qu'une simple case « cotisation »
et crée le bénévole directement : ni choix du type de paiement, ni étape
d'adresse mécénat, ni paiement en ligne. Rien ne le signalait, si bien
qu'une option « Mécénat » configurée semblait ne pas fonctionner.
L'écran affiche désormais l'état Actif / Inactif sous « Types de
paiement », avec la raison.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AdamThomas
2026-10-03 15:22:46 +02:00
co-authored by Claude Opus 5.5
parent c49ce520e3
commit 770a12e3aa
3 changed files with 36 additions and 0 deletions
+1
View File
@@ -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 +
+3
View File
@@ -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",
+32
View File
@@ -335,6 +335,12 @@ export function FormBuilderPage() {
<div className="border-t-2 border-ink pt-3">
<FieldLabel>{t('form.customize.paymentOptions.title')}</FieldLabel>
<SumUpStatus
credentialsSet={
Boolean(template.data?.sumup_merchant_code) &&
Boolean(template.data?.sumup_api_key_set)
}
/>
<PaymentOptionsForm />
</div>
</div>
@@ -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 (
<p className="mb-2 font-mono text-[10.5px] font-bold text-green">
{t('form.customize.paymentOptions.active')}
</p>
);
}
return (
<p className="mb-2 border-2 border-orange-dark bg-yellow-soft p-[8px] font-mono text-[10.5px] leading-relaxed">
{t(
credentialsSet
? 'form.customize.paymentOptions.inactive.noOptions'
: 'form.customize.paymentOptions.inactive.noCredentials',
)}
</p>
);
}
/** 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. */