Protocole
Unités et formats
Centimes TTC, instants avec fuseau, identifiants stables, et ce que vaut un champ absent.
Une seule table, appliquée à chaque champ de chaque événement et de chaque réponse.
| Type | Règle |
|---|---|
| Montant | entier en centimes, TTC. Un montant HT porte un nom en *ExclVatCents. Sur un remboursement, négatif |
| Entier | tient dans ±2 147 483 647, sinon too_large. La quantité d'une ligne de commande est gardée en millièmes, donc ±2 147 483 |
| Texte | plus long que sa colonne : too_long, le texte n'est pas coupé |
| Devise | l'euro seulement |
| Quantité | entière. Pour le stock, ce qui peut se vendre maintenant (sur Sylius : onHand − onHold). Sur un remboursement, négative |
| Instant | RFC 3339 avec un fuseau, microsecondes recommandées : 2026-10-30T14:02:11.482913+01:00. Sans fuseau, refusé ; plus de 5 minutes dans le futur, in_the_future |
| Date | AAAA-MM-JJ |
| Identifiant | ^[A-Za-z0-9._-]{1,64}$, stable pour toujours. Les deux-points sont refusés |
| Identifiant d'événement | un UUID neuf à chaque émission (Événements) |
| tel quel ; Kult Lab le normalise | |
| Téléphone | E.164 de préférence ; un numéro national est lu avec le pays du commerce, un numéro illisible est écarté et signalé dans warnings[], l'événement passe |
Absent ou null
Dans un événement, un champ absent et un champ à null veulent dire la même chose. Ce que cela veut
dire dépend de l'événement :
- Une déclaration complète dit tout de son objet, donc ce qu'elle omet n'existe pas. C'est le cas
du bonjour, de
order.upserted(sanscustomerId, une commande au nom de personne ; sanscarrier, rien à expédier) et decategory.upserted(sansparentId, une catégorie racine ; sansposition, 0). - Tous les autres événements laissent la valeur connue en place : un champ absent veut dire « je ne le dis pas ». Vider une valeur enregistrée n'est pas possible dans cette version.
Deux valeurs par défaut sont écrites sur product.upserted : kind absent vaut simple,
stockManaged absent vaut true.