Esigenza: cambiare lo stato di un ordine in Magento.
Caso specifico: cambiare lo stato di un ordine da “canceled” a “processing“.
Dal pannello di amministrazione non è possbile in quanto per un ordine in stato canceled non esiste l’azione per un cambio di stato “processing”.
L’idea è quella di fare questo cambio di stato da codice.
Ovviamente non è possibile cambiare il valore dell’attributo status sul model Sales. Questo perchè il cambio di stato di un ordine implica anche altre operazioni. Per fare questo quindi occorre
- individuare l’ordine su cui modificare lo stato;
- se l’ordine esiste ed è nello stato che ci si aspetta possiamo procedere con la modifica
- per la modifica utilizzare il metodo setState e NON setStatus.
Ecco il codice
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once(dirname(__FILE__) . '/../app/Mage.php');
Mage::app(0);
ini_set('display_errors', 1);
error_reporting(E_ALL);
//configurazione
define("_LOG_TARGET", 1); // 0 disabilitato, 1 echo, 2 log di magento;
define("_LOG_FILE", "updateOrder.log"); // file di log;
/*
* stati disponibili
* Mage_Sales_Model_Order::STATE_NEW = 'new';
* Mage_Sales_Model_Order::STATE_PROCESSING = 'processing';
* Mage_Sales_Model_Order::STATE_COMPLETE = 'complete';
* Mage_Sales_Model_Order::STATE_CLOSED = 'closed';
* Mage_Sales_Model_Order::STATE_CANCELED = 'canceled';
* Mage_Sales_Model_Order::STATE_HOLDED = 'holded';
*/
define("_STATUS_FROM", Mage_Sales_Model_Order::STATE_CANCELED); // stato
define("_STATUS_TO", Mage_Sales_Model_Order::STATE_PROCESSING); // stato target
define("_REALLY_UPDATE", false); // stato di parenza
$idOrdine = "123456";
function mylog($message) {
if (_LOG_TARGET == 1) {
echo "$message\n";
} else if (_LOG_TARGET == 2) {
Mage::log($message, null, _LOG_FILE);
}
}
mylog("Inizio");
mylog("Carico ID ORDINE:".$idOrdine);
try {
$ordine = Mage::getModel('sales/order')->load($idOrdine);
if ($ordine && $ordine->getIncrementId() != "") {
mylog("Caricato ORDINE :".$ordine->getIncrementId());
mylog(" STATO :".$ordine->getStatus());
mylog(" CREATO :".$ordine->getCreatedAt());
mylog("CONTROLLI STATO :");
mylog(" CHECK :controllo se stato è uguale a :"._STATUS_FROM);
if ($ordine->getStatus() == _STATUS_FROM) {
mylog(" CHECK :stato ordine (".$ordine->getStatus().") uguale a ". _STATUS_FROM);
if (_REALLY_UPDATE) {
mylog("MODIFICA ORDINE :");
mylog(" UPDATE :Procedo alla modifica. Stato destinazione: ". _STATUS_TO);
$ordine->setState(_STATUS_TO, true)->save();
} else {
mylog("MODIFICA ORDINE :non effettuata per via della configurazione _REALLY_UPDATE");
}
} else {
mylog("stato ordine (".$ordine->getStatus().") DIVERSO da ". _STATUS_FROM);
}
} else {
mylog("Ordine non trovato");
}
} catch (Exception $e) {
myLog("Errore, ".$e->getMessage());
}
mylog("Fine");
?>
"Mi piace":
"Mi piace" Caricamento...