Skip to content

Lot de codes d'activation (ActivationCodeBatch)

En une phrase : l'unité de commande des codes d'activation — le lot que Travelise émet pour un revendeur, qu'un admin pilote d'un seul geste (notes internes, date d'expiration) sans jamais toucher aux milliers de codes qu'il contient.

Rôle métier

Un lot peut contenir des milliers de codes : la liste paginée des codes est impraticable à cette échelle. Le lot est donc une entité de première classe, avec son propre état modifiable :

  • batch_number — le numéro métier lisible (« rappeler le lot 1234 »), strictement croissant, tiré de la séquence PostgreSQL. C'est un identifiant d'usage (comme un numéro de facture), jamais une clé : les PK/FK restent des UUIDv7.
  • internal_notes — le contexte d'équipe au niveau du lot (campagne, accord commercial, ticket). Réservé à l'équipe : jamais exposé aux voyageurs, visible des seuls super-admins dans l'API.
  • expires_at — la date limite du lot, obligatoire et éditable. C'est elle que suivent les codes du lot (voir ci-dessous).

Toute génération crée un lot, même pour un seul code. Les codes hérités de l'ancien système n'en ont jamais : ils vivent seuls, avec leur propre date.

Expiration — le lot expire, les grâces s'accumulent

L'invariant « chaque code généré expire » devient « chaque lot expire » :

  • À la génération, les codes naissent sans date propre et suivent celle du lot — dans les deux sens : avancer ou reculer la date du lot déplace tout le stock d'un coup.
  • Un renouvellement individuel pose une date sur le code : un plancher personnel. La date effective d'un code est GREATEST(code, lot) — la plus tardive des deux. Aucun mécanisme d'expiration ne raccourcit jamais une grâce accordée individuellement ; pour tuer un code précis, c'est l'annulation (cancelled) qui prime de toute façon sur l'expiration.
  • Un renouvellement pur dont la date ne dépasse pas la date effective courante est refusé avec une raison (il serait un no-op silencieux).

Relations métier

RelationSens métier
Organisation émettriceLe revendeur pour qui le lot a été émis ; le lot (et ses codes) meurt avec elle
Codes d'activationLes codes générés du lot ; supprimer le lot supprime ses codes
Journal d'auditLa création du lot et chaque édition (notes, date) sont tracées — un déplacement de date change le statut de milliers de codes, il doit être imputable

Règles métier

  • Visibilité : comme les codes — le super-admin voit tous les lots, une organisation les siens, un voyageur aucun.
  • Édition : super-admins uniquement (aligné sur l'émission des codes).
  • Les endpoints de lot agrègent les compteurs de codes par statut en SQL (un seul GROUP BY sur la vue de statut), jamais code par code en PHP.

Détail technique (colonnes, contrainte CHECK, vue, GREATEST) : Base de données — activation_code_batches.

Contributors

No contributors

Changelog

No recent changes