Modifier les numéros de commande, facture, expédition et remboursement (increment_id)
- Par Magentix le 03/08/2010
- Difficulté : 2/4
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 :
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.
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 :

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.
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
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...
Comment puis-je executer le script proposé ?
Par avance merci pour votre retour,
Cdlt,
Pedro
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,
Il te faudra sinon effectuer les modifications manuellement dans la base de données (eav_entity_store et eav_entity_type).
Aidez moi SVP!!!