Vou tentar. Vamos levá-los um de cada vez:
Método 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converteracima é carregado da classe Mage_Sales_Model_Convert_Order, que usa um auxiliar central chamado copyFieldsetpara 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 $ordere gerar um $shipmentobjeto 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 prepareShipmente 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 prepareShipmentargumento, 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 $shipmentobjeto, 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 $orderIdvariá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.