Как программно изменить состояние заказа внутри задания 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();? Любой другой способ выполнить сказанное вещь?

Могу ли я также отфильтровать по порядку "время создания", чтобы не изменять состояние для заказа, который был создан несколько секунд назад.[РЕШЕНО]

Спасибо!

Author: Community, 2012-06-18

3 answers

Просто попробуйте поставить $order->setState('pending_payment'); $order->setStatus('pending_payment'); $order->save(); Я думаю, что вы не меняете статус заказа, что может создать проблему.

 0
Author: Mufaddal, 2012-06-20 12:46:56

Наконец-то решил мою проблему. Теперь работа работает точно так, как задумано!

Это рабочая программа -

  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;
  }

Надеюсь, это кому-то поможет.

 0
Author: Vinayak Garg, 2012-06-21 05:04:39

Мне еще предстоит освоить запросы 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)
 0
Author: Chris K, 2012-06-21 17:50:30