Remplace le simple lien Yapla statique par une vraie intégration API SumUp : checkout hébergé créé à la soumission du formulaire, statut de paiement (PENDING/PAID/FAILED/EXPIRED) tenu à jour par un webhook SumUp et visible sur la fiche du bénévole. La cotisation n'est plus un montant unique : la coordination configure autant de types de paiement qu'elle veut (libellé + montant, ex. « Cotisation classique », « Mécénat »), et le bénévole en choisit un à l'inscription — le libellé et le montant choisis sont figés sur le bénévole, indépendamment d'une modification ultérieure de la config. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
"""Paiement de la cotisation via l'API SumUp (remplace le lien Yapla)
|
|
|
|
Revision ID: 0016_sumup_payment
|
|
Revises: 0015_form_yapla_url
|
|
Create Date: 2026-09-29
|
|
|
|
`form_template.yapla_url` (simple lien externe statique) est remplacé par un
|
|
vrai suivi via l'API SumUp : identifiants marchand (`sumup_merchant_code`,
|
|
`sumup_api_key`) et montant (`sumup_fee_amount`) configurés par édition, plus
|
|
le statut de paiement par bénévole (`volunteer.fee_checkout_id`,
|
|
`fee_payment_status`, `fee_paid_at`), tenu à jour par le webhook SumUp — voir
|
|
`app/sumup/` et `app/api/forms.py`.
|
|
"""
|
|
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision: str = "0016_sumup_payment"
|
|
down_revision: str | None = "0015_form_yapla_url"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.drop_column("form_template", "yapla_url")
|
|
op.add_column(
|
|
"form_template", sa.Column("sumup_merchant_code", sa.String(), nullable=True)
|
|
)
|
|
op.add_column(
|
|
"form_template", sa.Column("sumup_api_key", sa.String(), nullable=True)
|
|
)
|
|
op.add_column(
|
|
"form_template", sa.Column("sumup_fee_amount", sa.Float(), nullable=True)
|
|
)
|
|
|
|
op.add_column(
|
|
"volunteer", sa.Column("fee_checkout_id", sa.String(), nullable=True)
|
|
)
|
|
op.create_index(
|
|
"ix_volunteer_fee_checkout_id", "volunteer", ["fee_checkout_id"]
|
|
)
|
|
op.add_column(
|
|
"volunteer",
|
|
sa.Column(
|
|
"fee_payment_status",
|
|
sa.Enum(
|
|
"PENDING", "PAID", "FAILED", "EXPIRED",
|
|
name="feepaymentstatus", native_enum=False,
|
|
),
|
|
nullable=True,
|
|
),
|
|
)
|
|
op.add_column(
|
|
"volunteer", sa.Column("fee_paid_at", sa.DateTime(), nullable=True)
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_column("volunteer", "fee_paid_at")
|
|
op.drop_column("volunteer", "fee_payment_status")
|
|
op.drop_index("ix_volunteer_fee_checkout_id", table_name="volunteer")
|
|
op.drop_column("volunteer", "fee_checkout_id")
|
|
|
|
op.drop_column("form_template", "sumup_fee_amount")
|
|
op.drop_column("form_template", "sumup_api_key")
|
|
op.drop_column("form_template", "sumup_merchant_code")
|
|
op.add_column("form_template", sa.Column("yapla_url", sa.String(), nullable=True))
|