Skip to main content

Status de Pedido Personalizado

Uma ação que achei interessante depois de ver algumas pessoas procurando, é a opção de alterar o status do pedido para um valor personalizado. Isso é interessante se você deseja ter um controle maior dos processos ou até se você possui ações personalizadas.

No caso você poderia querer alterar o status do seu pedido para “Em Desenvolvimento“, ou “Aguardando Estoque“, “Em Trânsito“, “Em Produção“, “Aguardando Retirada“, enfim, inúmeras as possibilidades de status. Vejamos então como ativar este recurso na sua loja.

Atenção: Os procedimentos abaixo envolvem programação e alteração de arquivos do Core do sistema. Faça backup dos arquivos antes de executar qualquer alteração, e faça as alterações em um ambiente de testes antes de aplicar na loja em produção.

Neste exemplo iremos alterar 4 arquivos. Os testes foram feitos na versão 1.4.0.1 do Magento, podendo haver pequenas diferenças em outras versões.

Para começar vamos alterar o arquivo Grid.php que fica em app -> code -> core -> Mage -> Adminhtml -> Block -> Sales -> Order, responsável por carregar as opções de status na tela de Pedidos.

Dentro da função _prepareMassaction() lá pela linha 215 você deve ver um código comentado com //. Apenas retire as barras:

[php]$statuses = Mage::getSingleton(‘sales/order_config’)->getStatuses();
array_unshift($statuses, array(‘value’=>”, ‘label’=>”));
$this->getMassactionBlock()->addItem(‘change_status’, array(
‘label’=> Mage::helper(‘sales’)->__(‘Change Status’),
‘url’ => $this->getUrl(‘*/*/massStatus’),
‘additional’ => array(
‘visibility’ => array(
‘name’ => ‘status’,
‘type’ => ‘select’,
‘class’ => ‘required-entry’,
‘label’ => Mage::helper(‘sales’)->__(‘New Status’),
‘values’ => $statuses
)
)
));[/php]

Veja que no código acima ele carrega os status do arquivo config: Mage::getSingleton(‘sales/order_config’)->getStatuses();

Então vamos abrir este arquivo config.xml que fica em app -> code -> core -> Mage -> Sales -> etc, para inserirmos os status personalizados. Lá pela linha 544 você deve encontrar as tags <order><statuses> e dentro deste bloco todos os status personalizados disponíveis.

Incluiremos aqui a linha <transito translate=”label”><label>Em Transito</label></transito> ficando o bloco assim:

[xml]





[/xml]Inclua quantos status desejar, sempre cuidando para que sua tag tenha um valor único. Logo abaixo temos a tag <states> com os blocos identificados acima. Vamos inserir nosso bloco personalizado aqui também (logo abaixo de holded como no bloco anterior).

[xml]

[/xml]Lembra do código que descomentamos agora a pouco? Eu realmente espero que você lembre, senão você está com algum problema. :D

Depois de carregar a lista de status, ele chama uma função $this->getMassactionBlock() que fica no arquivo OrderController.php em app -> code -> core -> Mage -> Adminhtml -> controllers -> Sale. Procure pela função que deve estar lá pela linha 395.

Para nossa surpresa o método está em branco, ou seja, ele não faz nada. Será que a equipe do Magento esqueceu de descomentar aquele código e criar as rotinas? Nunca saberemos. hehe. Bom, então vamos colocar nosso próprio código ali dentro, ficando assim:

[php]public function massStatusAction() {
$pedidosIds = $this->getRequest()->getPost(‘order_ids’, array());
$i=0;

foreach ( $pedidosIds as $pedidoId ) {
$order = Mage::getModel(‘sales/order’)->load( $pedidoId );
$order->setNovoStatus( $this->getRequest()->getPost(‘status’) )->save();
$i++;
}

if ( $i>0 ) {
$this->_getSession()->addSuccess( $this->__( ‘%s pedidos(s) com status atualizado(s)’, $i ) );
} else {
$this->_getSession()->addError( $this->__( ‘Nenhum status de pedido foi atualizado’ ) );
}

$this->_redirect(‘*/*/’);
}[/php]

Veja que para cada pedido selecionado eu chamo uma função setNovoStatus passando o valor selecionado na tela por você. Para que isso funcione precisamos criar esse método no arquivo Order.php que fica em app -> code -> core -> Mage -> Sales -> Model, lá pela linha 1157 você deve encontrar um comentário como este:

[php]/*********************** STATUSES ***************************/[/php]

Abaixo dele adicione o seguinte código:

[php]/**
* Altera o status do pedido
*
* @param string $valor
* @return Mage_Sales_Model_Order
*/
public function setNovoStatus( $valor=” ) {
$this->setState( $valor, true );

return $this;
}[/php]

E está pronto! Agora vamos aos testes. No seu backend vá em Vendas -> Pedidos para listar todos seus pedidos. Em seguida selecione os pedidos que deseja alterar o status e na combobox Ações selecione a opção Alterar Status. Uma nova combobox deve aparecer com as opções disponíveis, selecione o status e clique em Executar.

novos status

Os pedidos terão seus status alterados, e você poderá usar o filtro para visualizar apenas os status relacionados.

Sucesso!

WebServices – Compartilhando Recursos

Um recurso avançado e poderoso do Magento é a possibilidade de se trabalhar com WebServices, ou seja, compartilhar recursos do sistema através de API‘s que geram saídas em XML, geralmente utilizando a tecnologia de comunicação SOAP.

Eu sei, uma sopa de letrinhas de confundir qualquer um. Mas leia com atenção para entender do que se trata, pois vale a pena conhecer este recurso avançado da ferramenta.

Imagine que você precise ler informações da sua loja em outro sistema, por exemplo um software de ERP, CRM, SAP, CMS ou até mesmo uma aplicação personalizada criada sob medida para você.

Nestes casos o Magento Ecommerce oferece algumas API’s prontas para dividir informações com outros sistemas. Como informações de clientes, pedidos, endereços, grupos, categorias, produtos, etc, etc, etc. Nos casos em que não existirem você pode criar uma API personalizada também, mas isso é uma outra história.

Vejamos um exemplo simples e rápido de como recuperar uma lista de email dos clientes cadastrados na sua loja usando um “programinha” escrito em php.

Dica: Aqui foi usado PHP, mas na verdade poderia ser em qualquer linguagem que tenha por exemplo suporte a SOAP (todas?!).

Primeiro passo, vá em Sistema -> Compartilhar Recursos -> Nível de Acesso e crie um nível de permissão de acesso, por exemplo, escolhendo apenas API de clientes, assim o sistema externo poderá acessar apenas as informações dos clientes.

criar nivel de acesso

Nota: Quando eu digo acesso, quero dizer “controle total”, ou seja, incluir, alterar, apagar e pesquisar. Mas isso também pode ser configurado.

Depois de criar um nível de acesso, vá em Sistema -> Compartilhar Recursos -> Usuários e crie um usuário para acessar as informações do seu sistema via webservice.

usuario webservice

Basicamente você vai informar o grupo de permissões a que esse usuário tem acesso, informar um login de acesso e a chave de API que na verdade é a senha de acesso.

Essa foi a parte difícil. Agora basta criar no seu sistema uma comunicação do tipo SOAP para acessar os dados do sistema. Veja o exemplo do arquivo abaixo, chamado de teste.php:

[php]<?php
$proxy = new SoapClient(‘http://localhost/magento/api/soap/?wsdl’);
$sessionId = $proxy->login(‘mariosam’, ‘senha123′);

$result = $proxy->call($sessionId, ‘customer.list’, array(‘filters’, ‘*’));

foreach ( $result as $obj ) {
echo $obj[“email”];
}
?>[/php]

Veja como é simples, primeiro você cria a conexão SOAP com seu sistema, logo em seguida informa o login e senha. Depois faz uma consulta na lista de clientes e por último exibe os resultados encontrados.

A url informada em “new SoapClient” deve ser a URL da sua loja, algo como www.seu-site.com.br/api/soap/?wsdl, basta digitar isso no seu navegador, se aparecer um arquivo XML válido então a URL está correta.

O arquivo teste.php deve estar em um servidor web válido, se você colocar no seu diretório root, então vai acessar digitando: www.seu-site.com.br/teste.php

E está feito a conexão, uma lista de emails deve aparecer na tela. Agora use as informações com moderação.

Veja mais informações sobre webservices-api na documentação oficial do Magento em www.magentocommerce.com/wiki/doc/webservices-api/api