Modifier les numéros de commande, facture, expédition et remboursement (increment_id)

  • De le 03 août 2010
  • Difficulté : 2/4

Modifier les numéros de commande, facture, expédition et remboursement (increment_id) Plutôt que de modifier directement dans la base de données la table chargée d'enregistrer le dernier numéro de commande généré (increment_id), voici un petit script permettant de le faire plus rapidement et sereinement...

Magento ne permet pas depuis la configuration de modifier les numéros générés, du type 100000001. Il est tout de même possible de définir des numéros personnalisés pour les commandes, factures, expéditions et remboursements.

Génération des numéros de commande

Un numéro de commande comporte plusieurs éléments : un préfixe, une taille (nombre de caractère), et un identifiant. Par exemple, le numéro de commande 100000005 est constitué de cette façon :

Increment Id

Ces informations sont stockées dans 2 tables de la base de données :

  • eav_entity_store : increment_prefix, increment_last_id
  • eav_entity_type : increment_pad_length

Si le numéro n'a jamais été créé, Magento génère sa configuration lors du premier événement (Ex : création d'une commande). La méthode fetchNewIncrementId de la classe Mage_Eav_Model_Entity_Type se charge de l'ajouter avec les valeurs par défaut :

app/code/core/Mage/Eav/Model/Entity/Type.php

/* ... */
$entityStoreConfig = Mage::getModel('eav/entity_store')
     ->loadByEntityStore($this->getId(), $storeId);

if (!$entityStoreConfig->getId()) {
     $entityStoreConfig
          ->setEntityTypeId($this->getId())
          ->setStoreId($storeId)
          ->setIncrementPrefix($storeId)
          ->save();
}

$incrementInstance = Mage::getModel($this->getIncrementModel())
     ->setPrefix($entityStoreConfig->getIncrementPrefix())
     ->setPadLength($this->getIncrementPadLength())
     ->setPadChar($this->getIncrementPadChar())
     ->setLastId($entityStoreConfig->getIncrementLastId())
     ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
     ->setStoreId($entityStoreConfig->getStoreId());

$incrementId = $incrementInstance->getNextId();
$entityStoreConfig->setIncrementLastId($incrementId);
$entityStoreConfig->save();
/* ... */

Si la configuration associée au type et au store n'existe pas elle est ajoutée. Une configuration peut donc différer selon selon le store depuis lequel la commande est passée. La valeur de increment_id peut ensuite être calculée.

eav_entity_store.png

Nous savons maintenant qu'il nous faut éditer les lignes de la table eav_entity_store afin de définir un numéro personnalisé. La valeur de increment_pad_length de la table eav_entity_type pourra également être modifiée. Plutôt que d'ajouter ou de modifier manuellement ces lignes, nous allons établir un script externe à Magento (une extension ne vaut pas vraiment la peine pour le coup...).

L'idée est d'ajouter une configuration personnalisée si elle n'a jamais été définie, ou de l'écraser dans le cas où une commande a déjà été passée. Nous souhaitons pouvoir configurer le numéro des commandes, factures, expéditions et remboursements.

Le script est disponible ici : Télécharger le script. Il est à placer à la racine du site. Voici quelques explications complémentaires.

Définir des numéros de commande personnalisés

Le début du script nous permet d'établir la configuration souhaitée :

incrementid.php

$entityTypeCodes = array(

'order'=>array('prefix'=>'OR','pad_length'=>6,'last_id'=>'0'),
'invoice'=>array('prefix'=>'IN','pad_length'=>6,'last_id'=>'1000'),
'shipment'=>array('prefix'=>'SH','pad_length'=>6,'last_id'=>'99'),
'creditmemo'=>array('prefix'=>'CR','pad_length'=>6,'last_id'=>'500')

);

Nous indiquons pour chacun des types un préfixe, le nombre de caractère et le numéro depuis lequel nous souhaitons commencer. Avec cette configuration nous obtenons respectivement pour la prochaine commande :

  • OR1000001 pour la commande
  • IN1001001 pour la facture
  • SH1000100 pour l'expédition
  • CR1000501 pour le remboursement

J'ai choisi de conserver l'identifiant du store dans le préfixe du numéro (OR1). Cela peut évidemment être modifié dans le cas ou le site ne dispose que d'une seule boutique. Le script applique la même configuration sur tous les stores. Seul le préfixe sera modifié (OR1XXXX, OR2XXXX).

Nous parcourons ensuite l'ensemble des stores existants pour y appliquer la configuration définie dans le tableau $entityTypeCodes.

incrementid.php

$stores = Mage::getModel('core/store')->getResourceCollection();
        
foreach($stores as $s) {
     $storeId = $s->getStoreId();
                
     foreach($entityTypeCodes as $code => $v) {
          $entityType = Mage::getSingleton('eav/config')->getEntityType($code);
          $entityType->setIncrementPadLength($v['pad_length'])->save();

          $entityTypeId = $entityType->getEntityTypeId();
          $entityStoreConfig = Mage::getModel('eav/entity_store')->loadByEntityStore($entityTypeId,$storeId);
                        
          $incrementLastId = $v['prefix'].$storeId.str_pad($v['last_id'],$v['pad_length'],'0',STR_PAD_LEFT);

          if (!$entityStoreConfig->getId()) {
               $entityStoreConfig
                    ->setEntityTypeId($entityTypeId)
                    ->setStoreId($storeId)
                    ->setIncrementPrefix($v['prefix'].$storeId)
                    ->setIncrementLastId($incrementLastId)
                    ->save();
          }
     }
}

Après exécution, le script final affichera :

Script incrementid.php
commentaires

Commentez cet article : Modifier les numéros de commande, facture, expédition et remboursement (increment_id)