Aller au contenu

Le registre

tilttek/points

Comptes

Chaque mouvement va d'un Account à un autre. Le type du compte dit ce qu'il représente :

TypeNommé parÉcritSon solde
Memberla référence du membremember:member:44Les points du membre
Issuancela règle ou la source qui émetissuance:games, issuance:manualNégatif de ce qu'il a donné
Redemptionce que les points paientredemption:reward:12Ce qui y a été dépensé
Expiry—expiry:expiredCe qui a expiré
Erased—erased:memberCe que les membres effacés ont donné à d'autres ou reçu d'eux

Account::fromString() relit ce que toString() a écrit. Un nom autre que celui d'un membre compte 1 à 255 lettres minuscules, chiffres, _, ., : ou -, et commence par une lettre ou un chiffre.

Mouvements

Un Movement déplace de 1 à 10^15 points d'une devise de son compte débité vers son compte crédité, qui sont différents. Outre sa clé et son genre, il porte :

  • occurredAt, le moment où il compte : le moment de l'activité pour les points gagnés et renversés, la fin de la durée de vie d'un crédit pour les points expirés, et sinon le moment où il a été demandé ;
  • cause, la clé d'idempotence de l'activité qui a rapporté ou renversé les points ;
  • reverses, la clé du mouvement qu'il défait (le gain qu'un renversement annule, la dépense qu'un remboursement rend), ou du crédit qu'il fait expirer.
GenreDeVersÉcrit par
Earnedle compte d'émission de la règlele membrePointsProjection
Reversedle membrele compte d'émission de la règlePointsProjection, lors d'une annulation
Expiredle membreexpiry:expiredPoints::expire()
Grantedle compte d'émission d'une sourcele membrePoints::grant()
Revokedle membrele compte d'émission d'une sourcePoints::revoke()
Spentle membreun compte de récompensePoints::spend()
Refundedle compte de récompensele membrePoints::refund()
Transferredun membreun autre membrePoints::transfer()

Les trois premiers sont dérivés : ils découlent de l'activité et des soldes, et une reconstruction les recalcule. Les autres sont décidés, et rien ne les recalcule.

Clés

Une MovementKey fait qu'un mouvement n'est écrit qu'une fois : le même mouvement écrit de nouveau sous sa clé retourne l'entrée déjà présente, et la même clé pour un autre mouvement (autre genre, devise, compte ou montant) lève MovementConflict. Le moment est exclu de la comparaison : une opération demandée de nouveau plus tard reste un doublon.

L'application donne la clé de chaque opération qu'elle décide, construite à partir de ce qui rend l'opération unique (order:2026-0193:redeem, gift:2026-11-07:44:12), jamais à partir du moment où elle s'exécute. Les clés que la bibliothèque dérive commencent par #, par quoi les clés de l'application ne peuvent pas commencer : #earn:<rule>:<activity key>, #reverse:<earning key>, #expire:<credit key>, #refund:<spending key>. Une clé compte de 1 à 400 octets, sans espace blanc ni caractère de contrôle.

Soldes et historiques

$points->balance($member);            // in the default currency
$points->balance($member, 'stars');
$points->history($member);            // the 50 first movements, oldest first
$points->history($member, 'stars', after: 120, limit: 100);

Un solde est la somme des mouvements du compte dans la devise : ce qui lui a été crédité moins ce qui lui a été débité. Un historique se lit par position, au plus 1 000 mouvements à la fois ; LedgerEntry::toArray() donne chaque ligne en valeurs simples, et Movement::amountFor($account) le montant signé pour le membre.