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

  • Par Magentix le 03/08/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
8

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

Hirogens Le 12/09/2010 à 10:40
Comme tout vrai professionnel les numeros de facture et autres ne ressemble pas à ça.

c'est plutôt FC20100912-12345, ce qui complique mes affaires...

si quelqu'un a une idée...

FC => Prefixe
2010=>année
09=>mois
12=>jour
"-"=> séparateur
12345=> numéro de facture pour l'exemple

ce qui permet de se retrouver très très vite, mais si un client vous donnes le numéro de facture au téléphone.
#1
Pedro Le 18/09/2010 à 02:37
Bonjour Hirogens,
Vous avez trouvé la réponse à votre question ?
Je suis également confronté à la même problématique et je voulais connaitre votre retour d'experience.

Par avance merci pour votre retour
#2
Magentix Le 18/09/2010 à 12:08
Pas forcement évident, dans votre cas (FC20100912-12345) le préfixe diffère chaque jour. Or Magento, pour calculer le nouveau increment_id, substitue le préfixe afin d'incrémenter de 1 le chiffre restant.
Il existe tout de même une solution.
Si je reste sur le numéro suivant : "FC20100912-12345", je considère que "FC" est mon préfixe et "12345" l'identifiant
Je définie donc :
prefix = FC
pad_length = 5
last_id = 0

Ici on ne s'occupe pas du store_id.
Le numéro de facture généré par Magento sera donc : FC00001

En surchargeant la classe "Mage_Eav_Model_Entity_Type" je peux insérer entre le préfixe et l'identifiant ce que je veux. La méthode de la classe qui nous intéresse est "fetchNewIncrementId"

A la fin de cette méthode, la variable "$incrementId" est retournée. Il suffit d'y inclure la date. Ce qui donnerait par exemple :

public function fetchNewIncrementId($storeId=null) {

/* ... */

$incrementId = preg_replace('/'.$entityStoreConfig->getIncrementPrefix().'/','',$incrementId);
$incrementId = $entityStoreConfig->getIncrementPrefix().date('Ymd').'-'.$incrementId;

return $incrementId;

}

La valeur de "increment_last_id" de la table ne serait alors pas en concordance avec la valeur généré mais dans le fond peu importe...
#3
Pedro Le 28/09/2010 à 02:40
Bonjour,

Comment puis-je executer le script proposé ?
Par avance merci pour votre retour,
Cdlt,

Pedro
#4
Pedro Le 28/09/2010 à 03:10
J'ai essayé de le mettre à la racine de mon site, puis via le navigateur de l'appeler. Ce qui me donne : www.monsite.com/incrementid.php

Cependant, j'ai un gros bug qui me donne comme retour :

Fatal error: Uncaught exception 'Mage_Core_Model_Store_Exception' in C:\wamp\www\app\code\core\Mage\Core\Model\App.php:1228 Stack trace: #0 C:\wamp\www\app\code\core\Mage\Core\Model\App.php(760): Mage_Core_Model_App->throwStoreException() #1 C:\wamp\www\app\Mage.php(322): Mage_Core_Model_App->getStore(NULL) #2 C:\wamp\www\app\Mage.php(334): Mage::getStoreConfig('web/url/use_sto...', NULL) #3 C:\wamp\www\app\code\core\Mage\Core\Controller\Request\Http.php(196): Mage::getStoreConfigFlag('web/url/use_sto...') #4 C:\wamp\www\app\code\core\Mage\Core\Controller\Request\Http.php(148): Mage_Core_Controller_Request_Http->_canBeStoreCodeInUrl() #5 C:\wamp\www\app\code\core\Mage\Core\Model\App.php(379): Mage_Core_Controller_Request_Http->setPathInfo() #6 C:\wamp\www\app\code\core\Mage\Core\Model\App.php(262): Mage_Core_Model_App->_initRequest() #7 C:\wamp\www\app\Mage.php(570): Mage_Core_Model_App->init('default', 'store', Array) #8 C:\wamp\www\incrementid.php(18): Mage::app('default') #9 {main} thrown in C:\wamp\www\app\code\core\Mage\Core\Model\App.php on line 1228


Pour infos, je suis sous Magento 1.4.0.1
Merci,
#5
Magentix Le 28/09/2010 à 11:08
Il faut en effet placer le script à la racine du site. L'erreur semble avoir été provoquée par Mage::app('default'), plutôt étrange.
Il te faudra sinon effectuer les modifications manuellement dans la base de données (eav_entity_store et eav_entity_type).
#6
yoyo2os Le 29/12/2010 à 13:28
Même erreur que Pedro, si quelqu'un veux bien m'aider à faire fonctionner le script sous magento 1.4.2.0, je suis preneur!!
Aidez moi SVP!!!
#7
Guillaumle Le 26/04/2011 à 17:05
Il suffit juste de mettre Mage::app() au lieu de Mage::app('default')
#8
Rédiger un commentaire

Cliquez pour générer un nouveau code

* champs obligatoires