Vou tentar. Vamos levá-los um de cada vez:
Método 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
acima é carregado da classe Mage_Sales_Model_Convert_Order
, que usa um auxiliar central chamado copyFieldset
para copiar detalhes do pedido em um objeto de remessa. $ order deve ser do tipo array ou Varien_Object
.
Na verdade, esse método está no centro do método 3, como ele usa Mage::getModel('sales/convert_order')
em sua chamada de construtor.
Diferenciador chave deste método - ele pode pegar uma matriz ou um objeto $order
e gerar um $shipment
objeto básico . É um método de nível inferior usado exclusivamente pelos métodos apresentados no método 2, método 3.
Método 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Essa parece ser a maneira mais popular no Core do Magento de gerar uma remessa, pois é usada nos controladores de remessa e fatura. $order
é usado como um argumento construtor para a instanciação de Mage_Sales_Model_Service_Order
, configurando-o como uma propriedade protegida no objeto.
Você está ligando prepareShipment
e passando uma quantidade. Como esse método usa a classe converter do Método 1, você não precisa especificar mais detalhes, como itens de pedido, que passam os detalhes da quantidade de remessa de itens no prepareShipment
argumento, chamado aqui com $this->_getItemQtys
. Para usar isso em seu próprio contexto, tudo o que você precisa fazer é passar a quantidade de itens em uma matriz com o seguinte formato:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Diferenciador chave deste método - ele devolve um objeto $ shipment, mas com todos os itens convertidos nele. É plug-and-play.
Método 3
Não consegui encontrar evidências do uso desse método no Core. Parece um truque, para ser sincero. Aqui está o método:
$itemQty = $order->getItemsCollection()->count();
$shipment = Mage::getModel('sales/service_order', $order)->prepareShipment($itemQty);
$shipment = new Mage_Sales_Model_Order_Shipment_Api();
$shipmentId = $shipment->create($orderId);
O passo 1 é exatamente o mesmo que o método 2 acima. Não faz diferença. No entanto, você recebe de volta um $shipment
objeto, que é substituído por uma insatiação direta de Mage_Sales_Model_Order_Shipment_Api
. Isso não é padrão. A melhor maneira de obter um objeto Api de remessa seria chamar Mage::getModel('sales/order_shipment_api')
.
Em seguida, ele usa esse novo objeto de API de remessa substituído para criar uma remessa a partir de uma $orderId
variável que não foi definida no seu código. Novamente, isso parece uma solução alternativa.
Observando Mage_Sales_Model_Order_Shipment_Api::create()
, parece um balcão único para gerar uma remessa, pois os detalhes mais básicos necessários para criar a remessa são apenas um pedido increment_id
.
Este é um hack que não deve ser usado por nenhum módulo ou extensão. Essa API deve ser consumida por recursos expostos por meio de solicitações XML RPC / SOAP API e é intencionalmente básica para eliminar solicitações de várias etapas da API.
Eventualmente, o Método 3 chega ao âmago da questão, porém, e por meio de uma chamada para Mage_Sales_Model_Order, ele chama prepareShipment
, que é uma abstração de ordem superior para o familiar Método 2 acima:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
O principal diferencial aqui - se você precisar de uma remessa, não se importe com hacks e tenha apenas um increment_id - use esse método. Informações também úteis, se você preferir lidar com isso por meio da API SOAP.
Espero que ajude.