Ibexa Commerce 4.6 : créer un code promo panier — REX IBEXA15

Ibexa Commerce 4.6 : créer un code promo panier — REX IBEXA15

Ibexa est une Digital Experience Platform (DXP) : elle réunit la gestion de contenu, les sites, les utilisateurs et, avec Ibexa Commerce, les fonctions nécessaires à une boutique en ligne. Après avoir créé nos produits, leurs variantes et une remise catalogue, nous allons tester une autre mécanique commerciale : la promotion appliquée au panier avec un code.

Notre objectif est concret : le code IBEXA15 doit appliquer 15 % de remise à partir de 50 € d’achat, en EUR.

Ce que nous voulons démontrer

  • créer un code promotionnel avec des limites d’utilisation ;
  • créer une remise de type cart ;
  • exiger un montant minimal de 50 € ;
  • limiter la règle à la devise EUR ;
  • appliquer la remise uniquement avec IBEXA15 ;
  • vérifier le résultat dans l’API et dans le storefront.

Code promo et remise : deux objets différents

Dans Ibexa Commerce, le code saisi par le client n’est pas la promotion complète.

  • Le code représente la valeur IBEXA15 et ses limites d’utilisation.
  • La remise contient le pourcentage, le seuil, la devise et la condition exigeant ce code.

Cette séparation permet de faire évoluer les règles commerciales sans mélanger la saisie du client et le calcul du prix.

1. Créer le code et la remise par migration

La démonstration est isolée dans src/Migrations/Demo/13_cart_discount_code.yaml afin de ne pas confondre nos données de formation avec les migrations d’installation d’Ibexa.

- type: discount_code
  mode: create
  code: IBEXA15
  global_usage_limit: 100
  user_usage_limit: 1

- type: discount
  mode: create
  identifier: demo_cart_ibexa15
  discount_type: cart
  priority: 9
  enabled: true
  rule:
    type: percentage
    expressionValues:
      discount_percentage: 15
  conditions:
    - identifier: is_in_currency
      expressionValues:
        currency_code: EUR
    - identifier: minimum_purchase_amount
      expressionValues:
        minimum_purchase_amount: 50
    - identifier: is_valid_discount_code
      expressionValues:
        discount_code: IBEXA15
        usage_count: 1
        global_usage_count: 100

La priorité Ibexa doit être comprise entre 1 et 10. Notre première simulation avec une valeur supérieure a été refusée avant toute modification de la base : une bonne raison d’utiliser --dry-run.

2. Simuler, exécuter et réindexer

php bin/console ibexa:migrations:migrate \
  --file=13_cart_discount_code.yaml \
  --dry-run

php bin/console ibexa:migrations:migrate \
  --file=13_cart_discount_code.yaml

php bin/console ibexa:discounts:reindex

La réindexation rend la promotion disponible pour le moteur de calcul du storefront.

3. Tester les conditions

Nous avons placé deux variantes du T-shirt dans le panier afin de dépasser le seuil de 50 €. Les tests ont ensuite validé trois comportements :

  1. FAUX5 retourne une erreur 404 : le code n’existe pas.
  2. IBEXA15 retourne 200 : le code est accepté.
  3. Le panier expose cart_discount_code: IBEXA15 et un DiscountStamp de type cart avec la valeur -15%.

4. Vérifier le résultat visuel

Panier Ibexa Commerce avec le code promotionnel IBEXA15

Le storefront affiche :

  • deux T-shirts à 29,90 € HT avant remise ;
  • un sous-total remisé de 50,84 € HT ;
  • une réduction totale de 8,96 € ;
  • une TVA de 10,16 € ;
  • un total de 61,00 € TTC ;
  • le code IBEXA15 et le badge -15 %.

Le seuil de 50 € est contrôlé sur le montant du panier avant l’application de la promotion panier. Une fois les conditions validées, Ibexa calcule la réduction et répartit le prix remisé sur les lignes concernées.

Deux promotions peuvent coexister sans se cumuler

Notre T-shirt possède déjà une remise catalogue de 10 %. La nouvelle promotion est une remise panier de 15 %. Les deux règles sont actives dans Ibexa, mais cela ne signifie pas que le moteur applique automatiquement les deux l’une après l’autre.

Dans notre panier, Ibexa retient la promotion panier lorsque le code IBEXA15 et le seuil sont valides :

Prix initial :       2 × 29,90 € = 59,80 € HT
Remise panier 15 % :                 -8,96 €
Sous-total remisé :                  50,84 € HT
TVA 20 % :                           10,16 €
Total :                              61,00 € TTC

Il ne calcule donc pas d’abord -10 %, puis encore -15 %. Si les deux promotions étaient cumulées, le résultat HT serait proche de 45,75 €, ce qui n’est pas le montant affiché.

Cette distinction est essentielle :

  • coexistence : plusieurs promotions sont configurées et actives ;
  • éligibilité : leurs conditions sont vraies pour le panier courant ;
  • cumul : plusieurs remises modifient réellement le même prix ;
  • priorité : elle aide à départager les règles, mais ne garantit pas à elle seule leur cumul.

Sur un projet réel, la stratégie de promotions doit donc être spécifiée puis testée : meilleure remise uniquement, cumul autorisé, exclusions, groupes clients et limites d’usage.

Deux pièges découverts pendant le REX

Une remise fixe peut être calculée par unité

Notre première idée était « 5 € dès 50 € ». Avec une règle fixed_amount et deux unités, Ibexa a appliqué 5 € à chaque unité, soit 10 € au total. Nous avons donc choisi une remise en pourcentage, plus prévisible pour cette démonstration.

Catalogue et panier ne sont pas nécessairement cumulés

Le T-shirt possédait déjà une remise catalogue de 10 %. Lorsqu’une remise panier valide entre en jeu, elle ne s’ajoute pas automatiquement à la première. Une remise panier de seulement 5 % aurait même remplacé une promotion plus avantageuse dans notre scénario. Le taux final de 15 % rend l’avantage client réel et visible.

Ce comportement doit être testé avec les priorités et les règles exactes du projet, plutôt que supposé.

Pourquoi Ibexa Commerce est intéressant ici

Ibexa ne limite pas la promotion à un champ « ancien prix / nouveau prix ». Le moteur combine des règles, des conditions, des devises, des seuils, des codes, des limites d’utilisation et des données de panier. Cette approche convient aux projets B2C et B2B où les prix dépendent du contexte commercial.

La contrepartie est claire : il faut connaître la portée réelle de chaque règle et vérifier le calcul dans le panier. Les migrations versionnées et les tests API rendent ce travail reproductible.

Conclusion

Nous disposons maintenant de deux mécanismes complémentaires dans notre formation :

  • une remise catalogue visible dès la fiche produit ;
  • une remise panier activée par IBEXA15 à partir de 50 €.

La prochaine étape pourra porter sur les limites d’usage par client, les périodes de validité ou une promotion réservée à un groupe de clients.