Как программно изменить состояние заказа внутри задания cron?
Я использую задание cron для изменения всех "ожидающих" сетевых банковских заказов на "ожидающие оплаты"
(это должно решить мою проблему: Почему государство не переходит на "payment_pending" для заказов, отмененных на шлюзе?)
Это мой код - [ОТРЕДАКТИРОВАНО]
const MINUTES_DELAY = 15; //Orders younger than this are not changed
public function run() {
// date_default_timezone_set('Asia/Kolkata');
$old_time = time() - (self::MINUTES_DELAY*60);
$out = date('d.m.y h:i:s A', $old_time)."\n";
$out .= date('d.m.y h:i:s A')."\n";
file_put_contents('/home/vinayak/cron.txt', '1'.$out, FILE_APPEND); //Out1
$orders = Mage::getModel('sales/order')->getCollection()
->addFieldToFilter('status', 'pending')
->addFieldToFilter('cod_fee', array('null' => true))
->addAttributeToSelect('customer_email')
->addAttributeToSelect('created_at')
;
foreach ($orders as $order) {
if (strtotime($order->getCreatedAt()) < $old_time){
$order->setState('pending_payment', true)->save();
$out .= $order->getCustomerEmail()." @ ".$order->getCreatedAt()."\n";
}
}
file_put_contents('/home/vinayak/cron.txt', '2'.$out, FILE_APPEND); //Out2
return true;
}
Я проверил, что cron работает. Но состояние/статус не меняется. Я не получаю ошибку сейчас.
[ ОТРЕДАКТИРОВАНО] Проблема сейчас - Я получаю вывод, помеченный как "out1" в коде, но не "out2"
После изменения кода я увидел, что всякий раз, когда условие if
выполняется, возникает проблема (выше). Это указывает на проблему со строкой $order->setState('pending_payment', true)->save();
(я закомментировал другую строку в if
, и проблема сохраняется, но если я закомментирую эту строку, выводится 2). Кажется, что выполнение застревает на этой строке (бесконечный цикл? или какая-то внутренняя проблема?)
Что не так с $order->setState('pending_payment', true)->save();
? Любой другой способ выполнить сказанное вещь?
Могу ли я также отфильтровать по порядку "время создания", чтобы не изменять состояние для заказа, который был создан несколько секунд назад.[РЕШЕНО]
Спасибо!
3 answers
Просто попробуйте поставить $order->setState('pending_payment');
$order->setStatus('pending_payment');
$order->save();
Я думаю, что вы не меняете статус заказа, что может создать проблему.
Наконец-то решил мою проблему. Теперь работа работает точно так, как задумано!
Это рабочая программа -
const MINUTES_DELAY = 15; //Orders younger than this are not changed
const OUT_FILE = '/home/vinayak/cron.txt';
public function run() {
$old_time = time() - (self::MINUTES_DELAY*60);
$out = "-------------------------------------------\n";
$out .= date('d.m.y h:i:s A')."\n";
$orders = Mage::getModel('sales/order')->getCollection()
->addFieldToFilter('status', 'pending')
->addFieldToFilter('cod_fee', array('null' => true))
;
foreach ($orders as $order) {
if (strtotime($order->getCreatedAt()) < $old_time) {
try{
$id = $order->getIncrementId();
Mage::getModel('sales/order')
->loadByIncrementId($id)
->setState('pending_payment', true)
->save();
$out .= $id."\n";
} catch (Exception $e) {
$out .= "Caught exception : ".$e->getMessage()."\n";
}
}
}
file_put_contents(self::OUT_FILE, $out, FILE_APPEND);
return true;
}
Надеюсь, это кому-то поможет.
Мне еще предстоит освоить запросы Zend, поэтому я всегда пишу правильные запросы MySQL при непосредственном взаимодействии с базой данных. Имейте в виду, статус заказа не является гибким до новых версий Magento (если вы не купите расширение).
mysql> select status from sales_flat_order group by status;
+-----------------+
| status |
+-----------------+
| canceled |
| closed |
| complete |
| pending |
| pending_payment |
| processing |
+-----------------+
6 rows in set (0.00 sec)
mysql> select state from sales_flat_order group by state;
+-----------------+
| state |
+-----------------+
| canceled |
| closed |
| complete |
| new |
| pending_payment |
| processing |
+-----------------+
6 rows in set (1.03 sec)
Чтобы помочь себе понять структуру таблиц, я написал php-скрипт для создания CSV-файла всех таблиц с полями. Таким образом, вы могли бы получить первый бит с помощью SELECT entity_id, state, status, created_at, increment_id FROM sales_flat_order WHERE status="pending"
. Я посмотрел и не увидел "cod_fee" ни в одном из имен полей, присутствующих в моем 1.4.2 установка. Обратите внимание на формат вывода приведенного выше запроса:
SELECT entity_id, state, status, created_at, increment_id FROM sales_flat_order WHERE status="pending";
+-----------+------------+---------+---------------------+--------------+
| entity_id | state | status | created_at | increment_id |
+-----------+------------+---------+---------------------+--------------+
| 2493 | new | pending | 2011-09-14 18:09:47 | 200025332 |
| 2683 | complete | pending | 2011-10-04 17:19:07 | 200025523 |
| 2686 | new | pending | 2011-10-04 20:43:52 | 200025526 |
| 3022 | processing | pending | 2011-11-15 01:11:34 | 200025849 |
| 3428 | complete | pending | 2012-01-12 17:56:57 | 200026236 |
| 4493 | processing | pending | 2012-04-11 16:16:55 | 200027230 |
| 5071 | new | pending | 2012-05-21 18:05:43 | 200027759 |
| 5091 | new | pending | 2012-05-22 17:48:11 | 200027779 |
...
| 5399 | new | pending | 2012-06-14 17:46:46 | 200028069 |
| 5443 | new | pending | 2012-06-18 18:50:55 | 200028111 |
| 5486 | new | pending | 2012-06-20 21:18:24 | 200028152 |
| 5491 | new | pending | 2012-06-20 23:54:53 | 200028157 |
+-----------+------------+---------+---------------------+--------------+
23 rows in set (0.79 sec)