Skip to content

Billeteries privées : lien unique + mot de passe, prix et quota au BO - #2392

Merged
Korbeil merged 2 commits into
masterfrom
feat/private-sale
Sep 14, 2026
Merged

Korbeil merged 2 commits into
masterfrom
feat/private-sale

Conversation

@Korbeil

@Korbeil Korbeil commented Sep 12, 2026

Copy link
Copy Markdown
Member

Contexte

Permet aux écoles / entreprises (etc.) de prendre des places pour un évènement via un lien unique protégé par mot de passe, sans création de token sponsor ni manipulation de la part des bénévoles AFUP.

Ce que fait la PR

Back-office

  • Nouvelle page « Billeteries privées » (menu Évènements, rôle ROLE_ADMIN) : liste + création, un objet = une billeterie privée.
  • Champs : nom, type de place (choisi parmi afup_forum_tarif), prix, nombre de places disponibles (quota), fenêtre de vente (dates début/fin), mot de passe (stocké hashé).
  • Token généré aléatoirement à la création (base64_encode(random_bytes(30))), affiché dans la liste avec le lien public copiable.
  • Édition : mot de passe changeable (vide = inchangé) ; protection du quota — impossible de réduire sous le nombre de places déjà prises (comptage à la demande uniquement).
  • Suppression refusée si des places ont déjà été prises.

Public

  • Lien unique : /event/{slug}/tickets/billeterie-privee/{token} — saisie du mot de passe (CSRF + rate limiter 10/h), token + auth mémorisés en session.
  • Tunnel de paiement réutilisé (TicketActionPaymentAction, CB/virement inchangés) : formule unique au prix imposé, nombre de participants limité aux places restantes, re-vérification du quota au submit, page « complet » si quota atteint.
  • Les tickets réutilisent la colonne existante special_price_token (afup_inscription_forum) : aucune migration sur les inscriptions, comptage fiable du quota (annulations exclues).

Technique

  • Migration Phinx : table afup_forum_billeterie_privee.
  • Entités Doctrine (BilleteriePrivee, Inscription minimale en lecture seule sur afup_inscription_forum) conformes aux ADR-001 (code en français) et ADR-002 (ORM Doctrine).
  • Ajustements de TicketType/PurchaseType/PurchaseTypeFactory (option billeterie_privee, max_personnes) sans modifier le comportement des circuits existants (tokens sponsor et prix spéciaux).

Validation

  • phpstan OK (baseline mise à jour pour les seules conventions projet), php-cs-fixer OK, lint:container OK
  • Tests unitaires (121) et d'intégration (8) verts, dont BilleteriePriveeRepositoryTest (quota, token strictement identique, inscriptions annulées exclues)

…) + variable eventSlug dans la porte publique
@Korbeil
Korbeil merged commit 8eee35b into master Sep 14, 2026
14 checks passed
@Korbeil
Korbeil deleted the feat/private-sale branch September 14, 2026 13:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants