Sur une plateforme de location de véhicules, j'ai mis en place un programme de fidélité. La règle tient en une ligne : toutes les 5 locations, un jour offert, automatiquement.
Sur le papier, c'est simple. En pratique, ça se complique dès qu'il y a une annulation, une location qui ne se termine pas, ou deux demandes en même temps.
Pour ce genre de calcul, je pars d'un principe : ne jamais stocker un compteur à la main. Le déduire de l'historique.
// le solde est calculé, jamais modifié directement
const terminees = locations.filter((l) => l.statut === "terminee").length;
const joursGagnes = Math.floor(terminees / 5);
const joursUtilises = recompenses.length;
const solde = joursGagnes - joursUtilises;
Un compteur stocké peut se désynchroniser : une location annulée après coup, une mise à jour qui échoue à moitié. Un solde calculé depuis les locations réelles reste cohérent avec elles par construction.
Trois cas à traiter explicitement.
- Une location annulée ne compte pas. On ne compte que celles dont le statut est « terminée ».
- Un jour offert ne se consomme qu'une fois. Chaque utilisation est enregistrée, et le solde en tient compte.
- Deux demandes en même temps. L'enregistrement de l'utilisation doit être atomique, dans une transaction ou avec une contrainte d'unicité. Sinon le même jour offert peut être accordé deux fois.
Le résultat visible pour le client : le programme s'applique tout seul, sans qu'il ait rien à demander.
Amine Affif, développeur full-stack à Paris. amineaffif.com
Top comments (0)