Pouvoir modifier une commande Prestashop déjà livrée

Le système Prestashop est toujours assez stricte concernant l’édition ou la suppression… pour des raisons comptables, légales ou pour l’intégrité du système. Prenons par exemple le cas de la modification de commande déjà livrée…

L’édition de commande

Quand une commande vient d’être passée, vous pouvez la modifier sans problème… cela fonctionne plutôt bien… Le problème c’est lorsque la commande a eu un statut livré, même si le statut courant est re-changé… impossible de pouvoir modifier la commande. Il faudrait procéder à un retour ? Générer un bon de réduction ? Ce n’est pas toujours pratique l’édition de commande permanent permet de contourner cette règle.

L’édition de commande n’est pas toujours possible, ce qui peut-être contraignant à l’utilisation…

Comment y remédier ?

En cherchant j’ai vu la solution chez OPart qui propose justement de faire un changement dans ce sens. J’ai testé la méthode et celle-ci est fonctionnelle sous Prestashop 1.6. Comme il y’avait des commentaires qui demandaient de faire des changements supplémentaires, je profite de refaire un récapitulatif ici.

Dans le fichier « dossier_admin/themes/default/template/controllers/orders/_product_line.tpl vers la ligne 120 remplacez :

{if ((!$order->hasBeenDelivered() OR Configuration::get('PS_ORDER_RETURN')) AND (int)($product['product_quantity_return']) < (int)($product['product_quantity']))}

par

{* Webbax - modification commande produit livré *}
{if ((Configuration::get('PS_ORDER_RETURN')) AND (int)($product['product_quantity_return']) < (int)($product['product_quantity']))}

ensuite vers la ligne 129 remplacez :

{elseif (!$order->hasBeenDelivered() OR Configuration::get('PS_ORDER_RETURN'))}

par

{* Webbax - modification commande produit livré *}
{elseif (Configuration::get('PS_ORDER_RETURN'))}

ensuite vers la ligne 129 remplacez :

{if ($can_edit && !$order->hasBeenDelivered())}

par

{* Webbax - modification commande produit livré *}
{if ($can_edit)}

A présent on change de fichier on s’occupe du controller sous « controllers/admin/AdminOrdersController.php » :

Vers la ligne 1739, le code suivant doit être commenté :

if ($order->hasBeenShipped())
			die(Tools::jsonEncode(array(
				'result' => false,
				'error' => Tools::displayError('You cannot add products to delivered orders. ')
			)));

Et devient donc :

// Webbax - modification commande produit livré 
/*
if ($order->hasBeenShipped())
			die(Tools::jsonEncode(array(
				'result' => false,
				'error' => Tools::displayError('You cannot add products to delivered orders. ')
			)));
 */

On fait la même chose vers la ligne 2363 :

if ($order->hasBeenDelivered())
			die(Tools::jsonEncode(array(
				'result' => false,
				'error' => Tools::displayError('You cannot edit a delivered order.')
			)));

Qui devient :

/*
// Webbax - modification commande produit livré 
if ($order->hasBeenDelivered())
			die(Tools::jsonEncode(array(
				'result' => false,
				'error' => Tools::displayError('You cannot edit a delivered order.')
			)));
*/

Et enfin vers la ligne 2419 :

if ($order->hasBeenDelivered())
			die(Tools::jsonEncode(array(
				'result' => false,
				'error' => Tools::displayError('You cannot edit a delivered order.')
			)));

Qui devient :

/*
// Webbax - modification commande produit livré 
if ($order->hasBeenDelivered())
			die(Tools::jsonEncode(array(
				'result' => false,
				'error' => Tools::displayError('You cannot edit a delivered order.')
			)));
 */
A présent la modification est permise, le bouton modifier s’affiche correctement.

Mention importante

Vous remarquerez que je copie souvent le même commentaire partout exemple avec « modification commande produit livré »… Pourquoi je fais cela ? Cela me permet de retrouver dans un projet toutes les modifications liées à ce changement, j’opte donc toujours pour un commentaire universel répété sur chaque code modifié… cela permet avec le temps de savoir exactement ce qu’on avait changé et ou précisément (en complément du versioning GIT).

Bilan

Est-ce que c’est aberrant de ne pas pouvoir modifier une commande livrée ? A mon sens oui, car le protocole officiel de retour n’est pas assez pratique… dans ce genre de cas, bien souvent il y’a un arrangement à l’amiable + échange de mails avec le client. Ensuite, cela permet d’avoir une commande qui correspond à la réalité… conserver le processus comptable des allées / venues de toutes ces opérations, n’est pas forcément des plus pratiques.

9 réflexions au sujet de « Pouvoir modifier une commande Prestashop déjà livrée »

  1. bonjour
    ce serait super si on pouvait changer la declinaison : couleur ou la taille
    j’ai fais la modification sur une version 1.5.6.1 on peut modifer la quantité le numéro de facture mais pas la declinaison qui pour moi est le plus important en cas d’échange de taille
    est il possible d’avoir cette option ?
    cdlt

    1. Bonjour,

      A ma connaissance en appliquant ce changement, il ne doit pas être possible de modifier la déclinaison, cela doit-être aussi lié à cause de l’impact sur la gestion du stock, mais je n’ai pas creusé la question dans ce sens.

      Merci pour votre visite !

  2. Bonjour,

    C’est faisable en mode « artisanal » (cf après pour une version 1.4) :

    * relever le stock du nouvel attribut
    * afficher la commande à l’écran
    * ps_product_attribute : relever le code article, l’ancien attribut et le nouveau
    * ps_order_detail : modifier la ligne :
    * vérifier qu’elle comporte bien le code article et l’ancien attribut (être certain que nous sommes dans la bonne ligne de commande !)
    * remplacer l’ancien attribut par le nouveau
    * remplacer les 2 références par les nouvelles
    * modifier le texte de déclinaison dans le descriptif
    * changer l’EAN et l’UPC
    * afficher de nouveau la commande dans un nouvel onglet
    * vérifier que tout est en place et que le stock du nouvel attribut est bien affiché

    Un retour ré-injectera la qté dans le nouvel attribut.

    Je n’utilise pas assez souvent pour décider de coder cela.

    Bonne journée.

  3. merci
    pour la réponse, j’éspère qu’une bonne ame aura le temps de se pencher la dessus un jour 🙂
    On l’utilise régulièrement dans la vente de vêtement lorsque le client se rends compte d’une erreure de taille ou lorsqu’on a un mêm stock pour une boutique en ligne et une boutique physique, il arrive régulièrement qu’un produit soit épuisée après une vente en boutique.

    cdlt

  4. Bonjour,
    J’ai un souci avec la 2ème partie du tuto, en effet l’orsque j’essaie d’isoler
    les ligne 1739, 2363, 2419 je rencontre une erreur (page blanche sur la commande)
    Merci pour votre aide …

    {*
    // We can’t edit a delivered order
    if ($order->hasBeenDelivered()) {
    die(Tools::jsonEncode(array(
    ‘result’ => false,
    ‘error’ => Tools::displayError(‘You cannot edit a delivered order.’)
    )));
    *}

    1. Bonjour,

      Sur un cas comme celui-là, il faut creuser la recherche sur les erreurs générées.
      Je vous invite à activer la gestion des erreurs via votre fichier /config/defines.inc.php

      Merci pour votre visite !

  5. Bonjour webbax,

    J’ai utilisé ta technique pour débloquer l’edition de commande apres la livraison.
    Cela fonctionne, j’ai bien le bouton modifier qui apparais.
    En revanche c’est l’action de mettre à jours qui ne fonctionne pas. Ai je raté une étape?
    As tu une idée à me soumettre.

    Alexis
    ps: Je suis prestashop 1.6.1.4

    1. Bonjour,

      Désolé je ne pourrai répondre précisément sur ce cas.

      Il peut y avoir énormément de facteurs externes qui peuvent influencer le comportement.

      C’est le type de hack que j’ai utilisé seulement peut-être 1 à 2 fois et de mon côté par « chance » cela avait fonctionné du premier coup.

      Merci pour votre visite !

  6. J’ai avancé un petit peu:

    Il s’avère que j’arrive à effectuer des modifications sur les commandes qui on déjà une facture.
    Tant que la facture n’est pas édité, j’ai le même problème : Le bouton d’edition s’affiche, mais l’action de mettre à jours n’a aucun effet.

Laisser un commentaire

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