Как автоматически отменить отложенные ордера по истечении заданного промежутка времени?


Мы обнаружили, что у нас иногда заканчиваются запасы/запасы из-за заказов, ожидающих оплаты. В нашем случае, когда клиент отменяет платеж PayPal или не платит через банковский депозит.

Есть ли способ "освободить" эти запасы/запасы через определенное время автоматически, без необходимости регулярно проверять наличие заказов, ожидающих оплаты, и отменять их вручную?

Мы понимаем, что существуют расширения, которые делают это, но нам было интересно, есть ли встроенный способ в Magento для этого.

Author: Obay, 2014-01-09

3 answers

Я бы не стал удалять заказ, а просто отменил его, и с помощью cronjob (либо скрипта, либо расширения Magento) вы можете это сделать. Запускайте его ежедневно, чтобы убирать заказы. Результаты регистрируются в var/logs/cancelorders.log для справки.

$collection = Mage::getModel('sales/order')->getCollection()
    ->addFieldToFilter('updated_at', Mage::getModel('core/date')->gmtDate(null, time()-86400)) // only clean yesterdays orders so user has time to restart transaction
    ->addFieldToFilter('state', 'pending_payment');

foreach ($collection as $order)
{
   $order->cancel();
   $order->setStatus('canceled');
   try {
      $order->save();
      Mage::log("Canceled {$order->getIncrementId()}", Zend_Log::INFO, 'cancelorders.log', true);
   } catch(Exception $e){
      Mage::log("Could not cancel order {$order->getIncrementId()}: {$e}", Zend_Log::WARN, 'cancelorders.log', true);
   }
}
 5
Author: Sander Mangel, 2014-01-09 08:32:31

Для этого нет встроенного способа. Вы можете просто создать cron, который вызывает следующий код (или что-то подобное).

$olderThan = 21;//21 days
$date = date('Y-m-d', mktime(0,0,0, date('m'), date('d') - $olderThan, date('Y')));
//get orders with no update in the last 21 days
$orders = Mage::getModel('sales/order')->getCollection()
    ->addFieldToFilter('state', 'pending_payment')
    ->addFieldToFilter('updated_at', array('lt'=>$date)); //you can use created_at instead of updated_at.
foreach ($orders as $order){
    $order->cancel();
    $order->save();
}
 2
Author: Marius, 2014-01-09 08:36:46

Я также прочитал учебник по Magento об этой проблеме на Inchoo.net

Вы можете получить от него некоторые полезные инструкции:

Http://inchoo.net/magento/cancel-pending-orders/

 0
Author: Jameslj, 2016-06-17 04:44:20