Imprimer
Jeudi, 15 Septembre 2011 13:20

Ajout d'un bouton pour dupliquer une commande dans le backend de virtuemart.

Utile quand le site de paiement refuse la transaction et que le paiement a été refusé plusieurs fois, le client n est pas obligé de refaire sa commande, s'il vous appel, vous pourrez dupliquer sa commande et elle sera disponible sur le front end du client pour procéder de nouveau au paiement.

Donc avec ces modifications du code, vous pourrez dupliquer une commande. Cette action, entraînera l'annulation de la commande d'origine et l'enregistrement d'une nouvelle commande identique à la première avec le statut en attente de paiement.

Le stock n'est pas mis à jour puisque l'annulation et la création des commandes ne change pas le stock.

 

Dans  le fichier administrator\components\com_virtuemart\classes\ps_order.php ajouter au début du fichier

function order_duplicate(&$d) {
$record_id = $d["order_id"];
return $this->duplicate_record( $record_id, $d );
}
 
function duplicate_record( $record_id, &$d ) {
global $db;
$record_id = intval( $record_id );
if ($this->validate_duplicate($record_id)) {
 
$dbu = new ps_db();
 
//duplication de commande
$q ="DROP TABLE IF EXISTS jos_vm_orders_duplicate; ";
$dbu->query($q);
 
$q = "CREATE TABLE jos_vm_orders_duplicate LIKE jos_vm_orders;";
$dbu->query($q);
 
$q = "INSERT INTO jos_vm_orders_duplicate SELECT * FROM jos_vm_orders WHERE `order_id`='$record_id';";
$dbu->query($q);
 
$q = "update jos_vm_orders_duplicate set order_id = ''; ";
$dbu->query($q);
 
$q = "INSERT INTO `jos_vm_orders` SELECT * FROM `jos_vm_orders_duplicate`; ";
$dbu->query($q);
 
$q = "DROP TABLE IF EXISTS jos_vm_orders_duplicate; ";
$dbu->query($q);
 
//$q = "SELECT B.order_id from `jos_vm_orders` B WHERE B.order_number=(SELECT A.order_number from `jos_vm_orders` A where A.order_id='$record_id') and B.order_id<>'$record_id' order by B.order_id DESC Limit 0,1;";
$q = "SELECT DISTINCT B.order_id from `jos_vm_orders` B LEFT JOIN jos_vm_orders A ON A.order_number=B.order_number WHERE B.order_number=(SELECT A.order_number from `jos_vm_orders` A where A.order_id='$record_id') and B.order_id<>'$record_id'  order by B.order_id DESC Limit 0,1";
$dbu->query($q);
 
$duplicated_order=$dbu->f("order_id");//numéro de la nouvelle commande
 
//insert une ligne de l'historique de la commande
$g="Commande dupliquee ".$record_id;
$q = "INSERT INTO jos_vm_order_history (`order_status_history_id`, `order_id`, `order_status_code`, `date_added`, `customer_notified`, `comments`, `colissimo`) VALUES ('','$duplicated_order','P',CURRENT_TIMESTAMP,'0','$g','');";
$dbu->query($q);
 
//Duplique les articles de la  commande
$q ="DROP TABLE IF EXISTS jos_vm_order_item_duplicate;";
$dbu->query($q);
 
$q = "CREATE TABLE jos_vm_order_item_duplicate LIKE jos_vm_order_item;";
$dbu->query($q);
 
$q = "ALTER TABLE  `jos_vm_order_item_duplicate` CHANGE  `order_item_id`  `order_item_id` INT( 11 ) NOT NULL;";//enlève l'auto incrément
$dbu->query($q);
 
$q = "ALTER TABLE  `jos_vm_order_item_duplicate` DROP PRIMARY KEY;";//suprime la clé primaire
$dbu->query($q);
 
$q = "INSERT INTO jos_vm_order_item_duplicate SELECT * FROM jos_vm_order_item WHERE `order_id`='$record_id';";
$dbu->query($q);
 
$q = "update jos_vm_order_item_duplicate set order_id = '$duplicated_order', order_item_id='';";
$dbu->query($q);
 
$q = "INSERT INTO `jos_vm_order_item` SELECT * FROM `jos_vm_order_item_duplicate`;";
$dbu->query($q);
 
$q = "DROP TABLE IF EXISTS jos_vm_order_item_duplicate;";
$dbu->query($q);
 
//duplique le mode de paiement
$q="DROP TABLE IF EXISTS jos_vm_order_payment_duplicate;  ";
$dbu->query($q);
 
$q="CREATE TABLE jos_vm_order_payment_duplicate LIKE jos_vm_order_payment; ";
$dbu->query($q);
 
$q="INSERT INTO jos_vm_order_payment_duplicate SELECT * FROM jos_vm_order_payment WHERE `order_id`='$record_id'; ";
$dbu->query($q);
 
$q="UPDATE jos_vm_order_payment_duplicate set order_id = '$duplicated_order'; ";
$dbu->query($q);
 
$q="INSERT INTO `jos_vm_order_payment` SELECT * FROM `jos_vm_order_payment_duplicate`; ";
$dbu->query($q);
 
$q="DROP TABLE IF EXISTS jos_vm_order_payment_duplicate; ";
$dbu->query($q);
 
//duplique les informations de l'utilsiateur
$q="DROP TABLE IF EXISTS jos_vm_order_user_info_duplicate; ";
$dbu->query($q);
 
$q="CREATE TABLE jos_vm_order_user_info_duplicate LIKE jos_vm_order_user_info; ";
$dbu->query($q);
 
$q = "ALTER TABLE  `jos_vm_order_user_info_duplicate` CHANGE  `order_info_id`  `order_info_id` INT( 11 ) NOT NULL;";//enlève l'auto incrément
$dbu->query($q);
 
$q = "ALTER TABLE  `jos_vm_order_user_info_duplicate` DROP PRIMARY KEY;";//suprime la clé primaire
$dbu->query($q);
 
$q="INSERT INTO jos_vm_order_user_info_duplicate SELECT * FROM jos_vm_order_user_info WHERE `order_id`='$record_id'; ";
$dbu->query($q);
 
$q="UPDATE jos_vm_order_user_info_duplicate set order_id = '$duplicated_order',order_info_id=''; ";
$dbu->query($q);
 
$q="INSERT INTO `jos_vm_order_user_info` SELECT * FROM `jos_vm_order_user_info_duplicate`; ";
$dbu->query($q);
 
$q="DROP TABLE IF EXISTS jos_vm_order_user_info_duplicate; ";
$dbu->query($q);
 
//annule la commande d'orgine car le stock n'est pas mis à jour quand on duplique une commande
$q = "UPDATE jos_vm_orders set order_status = 'X' WHERE order_id='$record_id'; ";
$dbu->query($q);
//insert une ligne de l'historique de la commande pour la traçabilité de l'opération.
$g="Commande annulee (duplication cde ".$duplicated_order.")";
$q = "INSERT INTO jos_vm_order_history (`order_status_history_id`, `order_id`, `order_status_code`, `date_added`, `customer_notified`, `comments`, `colissimo`) VALUES ('','$record_id','X',CURRENT_TIMESTAMP,'0','$g','');";
$dbu->query($q);
return True;
}
else {
return False;
}
}
function validate_duplicate($order_id) {
global $VM_LANG;
$db = new ps_DB;
if(empty( $order_id )) {
$GLOBALS['vmLogger']->err($VM_LANG->_('VM_ORDER_DELETE_ERR_ID'));
return False;
}
return True;
}
/////////////fin duplication commande

Dans administrator\components\com_virtuemart\classes\ps_html.php ligne 590 ajouter

function duplicateButton( $id_fieldname, $id, $func, $keyword="", $limitstart=0, $extra="" ) {
global $page, $sess, $VM_LANG;
$no_menu = vmRequest::getInt('no_menu');
$href = $sess->url($_SERVER['PHP_SELF']. "?page=$page&func=$func&$id_fieldname=$id&keyword=". urlencode($keyword)."&limitstart=$limitstart&no_menu=$no_menu" . $extra );
$code = "<a class=\"toolbar\" href=\"$href\" onclick=\"return confirm('"."Dupliquer la commande et annuler celle-ci ?" ."');\" onmouseout=\"MM_swapImgRestore();\"  onmouseover=\"MM_swapImage('duplicate$id','','". IMAGEURL ."ps_image/copy_f2.gif',1);\">";
$code .= "<img src=\"". IMAGEURL ."ps_image/copy.gif\" alt=\"Duplicate this record\" name=\"duplicate$id\" align=\"middle\" border=\"0\" />";
$code .= "</a>";
 
return $code;
}

//pour ajouter un critère de tri supplémentaire car quand dupplique la commande la date de création de la commande n'est pas modifié, donc comme le tri se faisait par cdate, ce n'était pas évident de retrouver ça commande, làl etri se fait d'abord par la date de création et ensuite par numéro de commande, on pourrait d'ailleurs faire uniquement par numéro de commande.

//Dans administrator\components\com_virtuemart\html\order.order_list.php ligne 47

$q .= "ORDER BY #__{vm}_orders.cdate DESC, #__{vm}_orders.order_id DESC ";

//Dans administrator\components\com_virtuemart\classes\ps_order.php ligne 804

//Modifier

$q .= "ORDER BY o.cdate DESC, o.order_id DESC";

//Dans l'admin virtuemart

Virtuemart/configuration générale/Lister les modules/ sur la ligne "order", cliquez sur "Liste des fonctions"

cliquez sur nouveau

Nom de la fonction:orderDuplicate

Nom de la classe:ps_order

Méthode de la classe:order_duplicate

Autorisations: admin et storeadmin

Puis enregistrez

 

//Dans administrator\components\com_virtuemart\html\order.order_list.php ligne 107, modifier

$VM_LANG->_('E_REMOVE') => "width=\"5%\"",
"Dupliquer" => "width=\"5%\""

 

//Ajouter Ligne 260

//Duplicate order button
$listObj->addCell( $ps_html->duplicateButton( "order_id", $db->f("order_id"), "orderDuplicate", $keyword, $limitstart ));

Mise à jour le Samedi, 17 Septembre 2011 09:40