Magento: можно ли перевести заказ в состояние обработки без создания счета-фактуры или отгрузки? - PullRequest
1 голос
/ 15 ноября 2011

Маг v1.6

Я хотел бы изменить способ оплаты checkmo, чтобы при переводе заказа переводиться в состояние обработки. Я обнаружил, что, изменив файл /app/code/core/Mage/Payment/etc/system.xml (да, просто возиться с ядром сейчас на тестовом сервере, он изменит его правильно, если он будет работать) здесь:

<checkmo translate="label">
  <fields>
    <order_status translate="label">
      <source_model>adminhtml/system_config_source_order_status_new</source_model>

удалив «new» в source_model, вы можете выбрать статус заказа в конфигурации, которая относится к состоянию обработки.

Однако заказы не действительно в состоянии обработки. Они остаются в новом / ожидающем состоянии, но статус один из состояния обработки. Странный гибрид.

Это не совсем работает, так как моя цель состоит в том, чтобы иметь возможность легко переключать заказ между 4 статусами пользовательских заказов, которые я сделал для состояния обработки. причина в том, чтобы все заказы, чеки или CC были в одинаковом состоянии, чтобы к ним можно было относиться одинаково. модуль Authnet переводит заказы CC в состояние обработки, и я хочу, чтобы заказы checkmo присоединились к ним. (наоборот, если бы я мог заставить заказы CC перейти в новое / ожидающее состояние, я могу назначить свои пользовательские статусы этому состоянию) В любом случае, мне нужно, чтобы все новые заказы находились в одном и том же состоянии при создании независимо от наличия счета-фактуры или отгрузки ,

спасибо

примечание: эти связанные вопросы не совсем решают эту проблему: 6095096, 6415547, 4170628)

1 Ответ

3 голосов
/ 17 января 2012

Важное действие по установке статуса заказа выполняется в Mage_Sales_Model_Order_Payment :: Place ():

...
$orderState = Mage_Sales_Model_Order::STATE_NEW;
...
$orderStatus = $methodInstance->getConfigData('order_status');
...
$order->setState($orderState, $orderStatus, $message, $isCustomerNotified);
...

Однако в Mage_Sales_Model_Order :: setState () он не проверяет связь между состоянием заказа и статусом заказа. Следовательно, странный гибрид .

Есть много способов обойти это, один из них - добавить наблюдателя для события 'checkout_type_onepage_save_order_after' и сбросить там статус. Мой предпочтительный метод - добавить обратный вызов в модель метода оплаты:

class Celera_AaCredit_Model_Payment extends Mage_Payment_Model_Method_Abstract
{
protected $_code  = 'aa_credit'; 
protected $_isInitializeNeeded = true; //Required for the initialize() callback to happen 

/* Workaround to assign the correct order state to the corresponding status set in system config */

/**
 * Invoke in Mage_Sales_Model_Order_Payment
 * Required for the initialize() callback to happen     
 *      
 * @return string
 */                 
public function getConfigPaymentAction()
{
    return 'init'; //set flag to initialize $this after order is created and the payment is placed
}

/**
 * Update order state to system configuration 
 *
 * @return Mage_Payment_Model_Method_Abstract
*/ 
public function initialize($action, $stateObject)
{                          
    if ($status = $this->getConfigData('order_status')) {
        $stateObject->setStatus($status);
        $state = $this->_getAssignedState($status);
        $stateObject->setState($state);
        $stateObject->setIsNotified(true);            
    }
    return $this;
}

/**
 * Get the assigned state of an order status
 *     
 * @param string order_status
 */              
protected function _getAssignedState($status)
{
    $item = Mage::getResourceModel('sales/order_status_collection')
              ->joinStates()
              ->addFieldToFilter('main_table.status', $status)
              ->getFirstItem();
    return $item->getState();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...