Numérotation des factures en chiffre sous Prestashop

Dans les dernières versions de Prestashop, la numérotation des factures / commandes est proposée sous la forme d’une référence avec une combinaison de lettre… Mais finalement pour le marchand il est préférable d’avoir la numérotation avec des chiffres.

Les avantages de la numérotation en lettre

Assez simple à deviner je pense, la numérotation de factures / commandes en lettre, ne permet pas à l’acheteur de juger la taille de votre entreprise (petit ou gros volume de commandes). Si je vous dis votre numéro de facture est le « JYMNZRQMG » impossible de savoir si vous êtes depuis longtemps sur le marché du e-commerce… contrairement à si vous donnez la référence de commande 16 à votre client…

Le client ne peut pas savoir qu’il s’agit de la commande 16… une de vos premières commande.

L’inconvénient majeur

Concrètement, au quotidien cette référence n’est pas du tout pratique… cela présente le risque de facilement se tromper dans la saisie (par exemple pour un virement bancaire). Mais le pire c’est surtout lors d’entretien téléphonique, si vous demandez la référence au client… essayez de lui faire épeler « JYMNZRQMG »… ça énerve le client, il faudra lui demander de répéter 3x … la communication n’est pas aisée… Concrètement il est plus facile à dicter un nombre qu’une suite de lettres.

Seul un russe est capable de vous lire ça d’une traite !

Revenons à l’ère des chiffres

Comme on dit toujours « c’était mieux avant », on va donc revenir en arrière et apporter la modification nécessaire pour que Prestashop travaille à nouveau avec l’identifiant de la commande. Pour cela vous pouvez créer un fichier « Order.php » dans le dossier « /override/classes/order/ » avec le contenu suivant :

<?php

class Order extends OrderCore
{
	/**
	 * Return a unique reference like : GWJTHMZUN#2
	 *
	 * With multishipping, order reference are the same for all orders made with the same cart
	 * in this case this method suffix the order reference by a # and the order number
	 *
	 * @since 1.5.0.14
	 */
	public static function generateReference()
	{
            $Context = Context::getContext();
            $id_order_max = Db::getInstance()->getValue('SELECT max(`id_order`) FROM `'._DB_PREFIX_.'orders` WHERE `id_shop`="'.pSQL($Context->shop->id).'"');
            return $id_order_max+1;
	}

}

A présent si on repasse une nouvelle commande, la référence sera équivalente au numéro de la commande du coup vous pourrez identifier rapidement la commande. La modification ensuite se répercutera partout dans le site, emails etc… (pour les prochaines commandes).

L’identifiant de commande est à présent identique à la référence.

A noter aussi que lije-creative, propose quasiment la même manipulation sur son article avec un numéro généré en aléatoire indépendamment de la commande.

Mais ça ne marche pas !

Il est important pour que l’override ajouté puisse fonctionner, de supprimer le fichier « class_index.php » dans le répertoire « cache ». Si le fichier n’existe pas.. le comportement devrait déjà fonctionner. Pour information, ce fichier regroupe déjà la liste des controllers / classes que Prestashop doit charger pour éviter qu’il doive parcourir les répertoires à chaque fois.

N’oubliez pas de supprimer ce fichier, afin d’actualiser le comportement de Prestashop !

Bilan

Difficile de vous dire pourquoi précisément les références ont été ajoutées dans Prestashop, c’est le genre de truc qui vient complexifier le système pour pas grand chose… Finalement j’aurai préféré qu’ils mettent un champ pour gérer la numérotation de facture (numéro de départ). Si votre numéro de facture est trop petit… je vous renvoie à cet article, qui est toujours d’actualité.

18 commentaires sur “Numérotation des factures en chiffre sous Prestashop”

  1. Bonjour,
    Perso je cherche une solution pour donner quelque chose comme mon système de numérotation de factures pour mon activité d’installateur : CCCC-###-YYYY avec CCCC les 4 premières lettres du nom du client en majuscules ### un incrément de 001 à 999 en fonction du reste du numéro et YYYY l’année de facture. En gros si Mr TOTO en est à sa 4è facture de l’année il recevra le n° TOTO-004-2015. Bien sure si un Mr TOTORO a commandé 7 fois et que Mr TOTO fait sa 4è commande on en sera à TOTO-011-2015. Chaque année l’incrément se remet à 0. Est-il possible de faire ainsi? (je sais que ce n’est pas facile, j’ai l’avantage que le volume installateur n’est pas de 500 commandes chaque année et que l’incrément est fait manuellement, passer cela en informatique risque de ne pas être aussi simple).
    Merci d’avance pour vos réponses.
    PS : avec un numéro comme celui là on ne risque pas d’avoir des clients qui jugent le niveau de commande sur le site…

    1. Bonjour,

      Il faudrait étudier le comportement dans son intégralité, a première vue cela est « faisable », mais c’est une règle qui pourrait contenir des exceptions à risque.

      Je vous invite à prendre contact avec un développeur Prestashop pour qu’ils puisse approcher en détail le cas avec vous.

      Merci pour votre visite.

  2. Bonjour,

    J’ai développé un module, Numérotation personnalisé, qui vous permet de personnaliser facilement les numéros de commande, les numéros de facture. Vous pouvez combiner des chiffres, lettres et tags (substitués automatiquement).

    Également, le module permet de réinitialiser le compteur à une date donnée, par exemple chaque année au 01 Janvier.

    Voici le lien de la fiche produit :
    https://www.motionseed.com/fr/modules-prestashop/numerotation-personnalisee

  3. Bonjour, merci pour l’astuce.
    Moi je suis sur 1.6.0.14 et ça ne fonctionnait pas. Pour que l’override fonctionne il faut copier tout le contenu du fichier classes/order/order.php dans override/classes/order/order.php et remplacer vers la ligne 1520 :

    	public static function generateReference()
    	{
    		return strtoupper(Tools::passwdGen(9, 'NO_NUMERIC'));
    	}
    

    par (j’ai ajouté un préfixe à la référence) :

    	 public static function generateReference()
        {
                $Context = Context::getContext();
                $id_order_max = Db::getInstance()-&gt;getValue('SELECT max(`id_order`) FROM `'._DB_PREFIX_.'orders` WHERE `id_shop`="'.pSQL($Context-&gt;shop-&gt;id).'"');
    			return 'VOTREPREFIXE'.($id_order_max+1);
        }
    
    1. Bonjour,

      Merci d’avoir contribué à ce billet, cela fait déjà un bon bout de temps qu’il avait été rédigé.

      Merci pour votre participation !

  4. Bonjour
    je relis encore une fois cette histoire de numérotation… que j’ai appliquée sur une de mes boutiques … mais bizarrement ça ne tient pas !
    Celà fonctionne durant quelques semaines puis je ne sais pourquoi ça saute !!! Pourtant rien n’a été touché ou mis a jour!
    il me faut ré-supprimer le fichier class-index.php du cache pour relancer! 🙁
    Vraiment pénible cette histoire !
    Quelqu’un aurait une idée sur ce problème et le résoudre une fois pour toutes
    Merci d’avance pour vos idées !

    1. Bonjour,

      A mon avis, il faut plutôt regarder dans le fichier class_index.php pour vérifier si le lien vers le fichier d’override est bien pris en compte. Quand le problème survient à nouveau, regardez l’état du fichier class_index.php. Assurez-vous aussi que dans le back-office Prestashop les overrides ne sont pas désactivés (sous Paramètres avancés -> Performances / rubrique -> Désactiver toutes les surcharges).

      A bientôt !

  5. Bonjour,
    J’utilise le module, mais celui-ci est en conflit avec un autre que j’ai besoin d’installer (Order Edit).
    J’avoue que si quelqu’un avait la solution pour 1.7, ce serait top !
    Un truc tout simple pour que order_reference = order_id
    Facile, non ? 😉

    1. Bonjour,

      Si le module entre en conflit, vous pouvez toujours demander au développeur s’il peut ajuster l’override « Order.php » en place pour que le déploiement d’Order Edit soit possible. Ou sinon vous laissez Order Edit créer le fichier d’override, puis ensuite vous remettez le code en place.

      A bientôt !

  6. Eh bien finalement j’ai trouvé, l’idée de base fonctionne bien sur 1.7 :
    – Ajouter un fichier /override / classes / order / order.php
    – Supprimer /app/cache/prod/class_index.php

    Dans l’override order.php, mettre :

    class Order extends OrderCore
    {
    	public static function generateReference()
    	{
        	$last_id = Db::getInstance()->getValue('
            SELECT MAX(id_order)
            FROM '._DB_PREFIX_.'orders');
        	return $last_id+1;
    	}
    }
    

    Et c’est tout bon, votre référence commande est égale à votre ID commande 🙂
    (je suis en 1.7.3)

  7. Bonjour malgré l’ouverture du sujet depuis plusieurs années, je me lance sur un problème que j’ai constaté.

    Après modification de Order.php et l’effacement de class_index.php.
    Ca fonctionne.
    MAIS le panier (La fenêtre après ajouter l’article deviens en anglais !) J’ai essayé plusieurs manipulation, est c’est en réinitialisation du module panier que sa reviens en français, et la numérotation aussi en alphanumérique 🙁
    si vous avez une idée , Merci pour votre aide précieuse
    Stéphanie

  8. Bonjour

    juste pour vous dire qu’en collant ce code dans un fichier order.php (dans …/override/classes/order), cela fonctionne en 1.7.5.2 !!

    Le 6 correspond au nombre de chiffres constituant la référence.

    class Order extends OrderCore
    {
      	public static function generateReference()
        {
            return strtoupper(Tools::passwdGen(6, 'NUMERIC'));
        }
    

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *