Par défaut les increment id des commandes sont spécifiques à chaque store view, mais il arrive parfois qu’on veuille utiliser le même numéro peu importe le store view sur lequel on passe une commande. On veut juste un numéro incrémental sans distinctions. Voyons comment Magento fonctionne nativement et comment on peut arriver à ce résultat.


Génération de l’increment id pour une commande par Magento

La génération s’effectue lorsqu’un client clique sur le bouton « passer la commande »

Réservation de l’increment id:


Dans getReservedOrderId() Magento sélectionne d’abord la table de séquence correspondante basée sur son type d’entité et l’id de son store view (order_sequence_[store_id] dans notre cas), dans le but d’avoir le prochaine valeur de séquence.

Les tables de séquence contiennent uniquement 1 colonne ‘sequence_value‘ gérée par un auto increment

Magento va insérer une valeur nulle dans la table de séquence afin d’obtenir le dernier id inséré


Basé sur cet id, l’increment id complet de la commande est généré selon la configuration paramétrée dans la table sequence_meta_profile.
Pour plus de détails concernant ces configurations consultez ce bon article de Classy Llama

Maintenant que nous avons notre increment id, il est réservé pour la quote et seulement pour celle-ci.
Si le paiement est réussi, l’increment id sera utilisé pour créer la nouvelle commande.
Si le paiement est refusé l’increment id sera perdu et un autre sera généré à nouveau quand le client cliquera une autre fois sur le bouton « passer la commande »


Sachant cela, comment utiliser la même valeur de séquence pour les commandes ?

Vous l’avez deviné, nous avons juste besoin de changer le comportement par défaut pour sélectionner une table spécifique plutôt que d’utiliser la table de séquence basée sur le store view id courant.

On peut même faire en sorte de partager la valeur de séquence entre les websites.

Il y a plusieurs façon pour y parvenir.
Personnellement j’ai décidé d’utiliser la table sequence_order_0 comme table commune, donc la personnalisation est assez simple. Créer un plugin before sur la méthode getSequence() en y forçant le store id à 0 et le tour est joué !


Commencer à partir d’un increment id de commande prédéfini

On a 2 choix :

  • utiliser le champ ‘start’ de la table sequence_meta_profile
  • ou juste insérer une valeur avec le nombre à partir duquel vous voulez commencer, dans la table de séquence de commande que vous aurez choisi.

Comment utiliser la même valeur de séquence pour les autres entités de type ‘sales’

Évidemment on peut appliquer cette procédure pour les autres entités de type ‘sales’. On a juste besoin de définir la table dans laquelle on ira piocher la valeur de séquence.
Par exemple:

  • Invoice: invoice_sequence_0
  • Shipment: shipment_sequence_0
  • Credit Memo: creditmemo_sequence_0
  • RMA: rma_sequence_0

Magento Cloud (Pro kit)

A noter que pour les environnements Cloud on peut observer jusqu’à un bond de 3 entre les valeurs de séquences. Cela est causé par une configuration de Magento Cloud
Plus de détails à propos de cette configuration ici.