Открыть полный / закрытый заказ в Magento? - PullRequest
3 голосов
/ 01 декабря 2011

Есть ли способ программно повторно открыть заказ в Magento, который уже достиг полного или закрытого статуса?У меня есть следующий код, который работает для изменения статуса заказа, но я не могу заставить его работать для полных или закрытых заказов.

// connect to magento
require_once('app/Mage.php');
umask(022);
Mage::app();

// check admin credentials
Mage::getSingleton('core/session', array('name' => 'adminhtml'));
$admin = Mage::getSingleton('admin/session');

if ( $admin->isLoggedIn() ) {
    // update order status
    $orderIncrementId = "100000001";
    $order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
    $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true)->save();
}

Я получил текущий код здесь .На этой странице написано, что он был протестирован с Magento 1.3.2.4, но я использую Magento 1.6.x.Может быть, в этом проблема?

Дайте мне знать, если мне нужно предоставить более подробную информацию, и спасибо за любую помощь, которую вы можете предложить.

1 Ответ

2 голосов
/ 04 декабря 2011

Я не думаю, что у вас возникла проблема с версией Magento.

При определенных обстоятельствах Magento просто не позволяет переключить состояние заказа обратно на Mage_Sales_Model_Order::STATE_PROCESSING.

Например, обычно вы не можете сохранить состояние Mage_Sales_Model_Order::STATE_PROCESSING в любом заказе, в котором уже были возвраты (creditmemos).Ни в 1.3.2.4, ни в 1.6.x.

Это не совсем так.

Посмотрите на Mage_Sales_Model_Order::_checkState(), чтобы увидеть, при каких обстоятельствах Magento принудительно сбрасывает состояние заказа до STATE_COMPLETEили STATE_CLOSED, соответственно.

protected function _checkState()
{
    if (!$this->getId()) {
        return $this;
    }

    $userNotification = $this->hasCustomerNoteNotify() ? $this->getCustomerNoteNotify() : null;

    if (!$this->isCanceled()
        && !$this->canUnhold()
        && !$this->canInvoice()
        && !$this->canShip()) {
        if (0 == $this->getBaseGrandTotal() || $this->canCreditmemo()) {
            if ($this->getState() !== self::STATE_COMPLETE) {
                $this->_setState(self::STATE_COMPLETE, true, '', $userNotification);
            }
        }
        /**
         * Order can be closed just in case when we have refunded amount.
         * In case of "0" grand total order checking ForcedCanCreditmemo flag
         */
        elseif (floatval($this->getTotalRefunded()) || (!$this->getTotalRefunded()
            && $this->hasForcedCanCreditmemo())
        ) {
            if ($this->getState() !== self::STATE_CLOSED) {
                $this->_setState(self::STATE_CLOSED, true, '', $userNotification);
            }
        }
    }

    if ($this->getState() == self::STATE_NEW && $this->getIsInProcess()) {
        $this->setState(self::STATE_PROCESSING, true, '', $userNotification);
    }
    return $this;
}

Чтобы ответить на ваш вопрос: вы можете достичь того, что пытаетесь сделать, переопределив метод _checkState() собственным методом, который позволяет установить STATE_PROCESSING.

Знайте, хотя , что это, скорее всего, приведет к созданию новых контекстов состояния, которые Magento не знает, не ожидает и не может обработать.

Если ваши изменения приведут к хаосуне вините меняВы были предупреждены ^^

...