Sous le capot
La rigueur, en clair
Ce que le « site à 30 francs » ne garantit pas. Trois décisions figées dans le noyau — démontrées ici en direct, avec le vrai code de la boutique qui tourne dans votre navigateur.
Règle ① Le décrément atomique
Un seul dernier exemplaire, deux acheteurs
Deux clients cliquent « commander » sur la même seconde, alors qu'il n'en reste qu'un. Un seul doit passer — jamais de survente.
UPDATE variantes SET stock = stock − 1 WHERE id = … AND stock >= 1 RETURNING id
Règle ② Le total fait foi côté serveur
Le prix venu du navigateur ne compte jamais
Même si le navigateur annonce un total truqué, le serveur recalcule à partir des prix de la base — en centimes entiers, TVA arrondie une seule fois.
| Tablette grand cru × 2 | 15.80 CHF |
| Miel de montagne × 1 | 12.50 CHF |
→ Le navigateur a beau dire « 1.00 CHF », le serveur facture 28.30 CHF (dont TVA 0.72 CHF, arrondie une seule fois).
total = Σ(prix_base × quantité) ; tva = round(total × 260 / 10260) // jamais de float
Règle ③ Le snapshot de ligne
Une commande de 2026 affiche le même total en 2029
À la commande, le prix est figé dans la ligne. Changez le prix du catalogue ensuite : la commande passée ne bouge pas.
Prix au catalogue (vivant)
Ligne de commande (figée)
Passez commande pour figer le prix.
lignes_commande.prix_unitaire_cents = prix figé (jamais relu depuis variantes)