terça-feira, 24 de junho de 2014

[OpenCart] Erro no Módulo Correios (prazo diferenciado)

Pessoal, algumas áreas no Brasil estão com problemas de entrega pelos Correios. Isso prejudica o funcionamento do módulo dos correios do OpenCart. O Webservice dos Correios envia a mensagem de que a entrega será diferenciada, mas isso vem no campo de erro. Embora o frete seja calculado, o OpenCart ignora e mostra apenas o erro.

Erro no site: "Atenção: Não há opções de entrega disponíveis. Por favor, contate-nos para assistência!"
Erro ao investigar o webservice dos correios: "Área com entrega temporariamente sujeita a prazo diferenciado".

Esse erro ocorre apenas para alguns CEPs, nem sempre aparece,
E vamos lá aos códigos...

No "catalog/model/shipping/correios.php" altere
if($servico['Erro'] == 0 && $valor_frete_sem_adicionais > 0)
substitua por
if(($servico['Erro'] == 0 || $servico['Erro'] == 10 ) && $valor_frete_sem_adicionais > 0)
(cuidado para não comer a chave "{" do if )

Porém eu acho importante esse erro aparecer para o comprador pois ele deve saber que o produto vai ter problemas na entrega. Então testo se o erro é o 10 e incluo a mensagem no título do tipo da entrega.
Procure os seguintes códigos abaixo no mesmo arquivo e adicione as linhas em laranja:

// texto a ser exibido para Sedex a Cobrar
if($servico['Codigo'] == $this->correios['Sedex a Cobrar']){
 $title = sprintf($this->language->get('text_'.$servico['Codigo']), $servico['PrazoEntrega'], $this->currency->format($cost));
 if($servico['Erro'] == 10) $title .= ' ('.$servico['MsgErro'].')';
 $text = $this->currency->format($this->tax->calculate($cost, $this->config->get('correios_tax_class_id'), $this->config->get('config_tax')));
}
else{
 $title = sprintf($this->language->get('text_'.$servico['Codigo']), $servico['PrazoEntrega']);
 if($servico['Erro'] == 10) $title .= ' ('.$servico['MsgErro'].')';
 $text = $this->currency->format($this->tax->calculate($cost, $this->config->get('correios_tax_class_id'), $this->config->get('config_tax')));
}

Galera, gostaria de contar com a colaboração de vocês para melhorar isso ou até checar se a solução é realmente adequada. Fiz essa alteração a poucos minutos e já estou publicando pois vejo que ela é bem emergencial, mas é sempre bom construir soluções de maneira colaborativa.

Abraços !


13 comentários:

  1. Obrigado, amigo. De muitissima ajuda

    ResponderExcluir
  2. Parabéns Marcos!
    Como deixar a mensagem de alerta abaixo do nome Correios?

    ResponderExcluir
    Respostas
    1. Olá Jano !
      O método de envio "Correios" tem subtipos "Sedex" e "PAC". Os erros enviados pelo webservice são para cada subtipo.Deve-se estar ciente que será unificado o erro para todos os subtipos retornados.
      Na prática, teria que arrumar um jeito de colocar o erro numa variável e ela poder ser lida na função getQuote($address) do arquivo correios.php, aí ela ser concatenada na linha
      'title' => $this->language->get('text_title')."
      Erro tal, exemplo",
      (linha da função getQuote)

      Boa sorte !

      Excluir
  3. Obrigado, Marcos!

    Suas dicas foram magníficas. Parabéns pelo trabalho e pela boa vontade em repartir conosco os seus conhecimentos.

    Que Deus lhe abençoe!

    ResponderExcluir
  4. Marcos, com esta modificação que tu nos passou a mensagem irá continuar aparecendo mas disponibilizando a escolha dos fretes ao cliente?? Pois assim, eu quero que a mensagem apareça mas que o cliente possa selecionar uma opção de frete. É possível? Como posso proceder? Gratidão. T+

    ResponderExcluir
    Respostas
    1. Essa alteração faz exatamente isso.
      Mantém as opções de frete, porém avisa da restrição de entrega dos correios.
      Faça um backup do arquivo e, posteriormente, aplique as alterações, creio que chegará ao resultado esperado!
      Abs

      Excluir
    2. Grata Marcos :) :)
      Muito obrigada! Irei fazer esta mudança.
      Sucesso.

      Excluir
  5. Oi Marcos,

    Primeiramente, muito obrigado pela informação.

    Estou usando o módulo dos correios do Júlio César, versão modulocorreios3.4.5oc151 e notei que a primeira linha que você sugeriu modificar (if($servico['Erro'] == 0 && $valor_frete_sem_adicionais > 0) está comentada // na versão acima. No seu lugar tem if($valor_frete_sem_adicionais > 0). Será que posso substituí-la pela sua recomendação? Já fiz um teste e parece que deu certo mas tenho algumas dúvidas em relação a possíveis efeitos colaterais. ;-)

    Mais uma vez muito obrigado por partilhar as suas dicas.

    --Fausto

    ResponderExcluir
  6. Obrigado pela dica, muito útil, funcionou certinho.

    Só continua o problema ao simular o frete, vc pode me dar uma dica de como resolver na simulação do frete esse erro tbm?

    desde já obrigado.

    ResponderExcluir
  7. Fantástico. Estamos com este problema há bastante tempo e agora foi resolvido com 2 minutos. Agradeço imensamente por compartilhar. Grande abraço!

    ResponderExcluir
  8. Exclui o outro comentário pois descobri que o erro era algo simples que esqueci de preencher no formulário.

    Porem gostaria de saber se sabe como colocar no formulário do o campo dimensões e peso, assim o vendedor já preenche e não da erro no modulo dos correios.

    Outro erro que tenho, no cadastro de vendedor da erro quando a pagina puxa os estados e por consequência não consigo salvar nada do cadastro.

    Agradeço

    ResponderExcluir