Jump to content

Archived

This topic is now archived and is closed to further replies.

InterPlanet

Módulo Off-line para cálculo de frete dos Correios

Recommended Posts

Olá Pessoal,

 

É com muito prazer que, e até um pouco de orgulho (ninguém é perfeito, huahuaa), que compartilho com vocês meu último feito.

 

Como usuário e desenvolvedor de sistema e-commerce, depois de muito, mas muito mesmo, penar com as falhas e a recorrente indisponibilidade do webservice dos correios, o que ´rejudicava muito a mimnha loja e meus clientes, tomei a iniciativa de construir uma base de dados com todos os CEP's do pais e o respectivo valor das encomendas, para os serviços PAC e Sedex, com cobertura nacional, resumindo:

 

"Montei uma base de consulta, off-line, 100% local (Mysql), com o valor das encomendas de todas as origens para todos os destinos do país!"

 

Claro, você deve estar pensando, "deu muito trabalho", sim! Mas, em protesto a privatização desta informação pública, por parte da ECT, gostaria de compartihar essas informações com vocês, claro, também preciso de ajuda em alguns pontos das consultas [que já estou desenvolvendo, neste momento], por exemplo, falta desenvolver um script para calcular o peso cúbico, necessário para o serviço PAC.

 

Assim, os motivos deste tópico são:

 

- Somar interessados em ajudar no desenvolvimento do que falta na consultas e, principalmente, em testar o serviço;

- Avaliar falhas e/ou erros;

- Formar parcerias para disponibilizar a consulta publicamente, pois claro, isto tem custos, como a locação de um servidor dedicado;

- Divulgar a base de dados;

- Entre outros.

 

O que está pronto?

 

1) Base de dados de CEP's nacional (atualizada em 02/04/2010 - Fonte: GPBe 2010):

 

Imagem Postada

 

2) Base de dados do Sedex (atualizada em 03/09/2010 - Fonte: Correios):

 

Imagem Postada

 

Imagem Postada

 

2) Base de dados do PAC (atualizada em 03/09/2010 - Fonte: Correios):

 

Imagem Postada

 

Imagem Postada

 

É isso ai, por hora, peço aos interessados em se increver para testar/usar o banco de dados ou ajudar, me mandar mp ou email para fernando@ipis.com.br com nome, email, msn/skype e telefone de contato.

 

Em breve começarei a postar aqui o que esta faltando, a distribuição de tarefas aos interessado e vamos discutindo como melhorar. Também postarei o primeiro link para consulta e testes em meu servidor.

 

Att.

Fernando Lima!

:)

Share this post


Link to post
Share on other sites

Interessados, favor assinar o tópico pra se manter atualizado!

 

Começei a fazer a consulta de cep, pra validar a o cep antes de retornar o valor, assim que eu terminar eu posto aqui as estruturas do db e as funções! Abraços.

 

Link de consulta disponível!

 

https://www.ipis.com.br/sistemas/correio/frete.php?Origem=59010660&Destino=03510000&Servico=2&Peso=3.500&Valor=150.00

 

Devem ser passadas as variáveis:

- Origem: (string, 8) CEP de Origem

- Destino: (string, 8) CEP de Destino

- Peso: (decimal [5,3], separador decimal -> .) Peso da Encomenda (entre 0 e 30.000)

- Valor: (decimal [7,2], separador decimal -> .) Valor da Encomenda (entre 0 e 99999.99) - usado para calcular o seguro

- Servico (valores aceitos):

* Para PAC: (integer) 1 ou 41106 [código do serviço nos correios] ou (string) PAC

* Para Sedex: (integer) 2 ou 40010 [código do serviço nos correios] ou (string) Sedex

* Para todos os serviços disponíveis [padrão]: (integer) 0 ou vazio

 

O retorno, por hora, somente em XML, a quem precisar, tenho uma classe que converte o xml em array para PHP, mande mp.

Atenção, retorno xml em desenvolvimento, passível de erros ou retorno incompleto até o fim do dia!

 

É isso, nínguem interessado em participar?

Share this post


Link to post
Share on other sites

Atenção!

 

Vou limitar o acesso apenas aos usuários cadastrados pra evitar demasiado consumo de bando do meu servidor tendo em vista que tenho limite e outros clientes no dedicado, contudo, a princípio, esta limitação perdurará enquanto o sistema estiver em desevolvimento/testes!

 

Continuo esperando que alguém se habilite a fazer a função de peso cúbico dos correios!

 

Para cadastrar o acesso ao sistema, preciso de:

- Nome

- IP (até 3) - será limitado pelo IP, a princípio.

- Email

 

Mande as info para fernando@ipis.com.br ou aqui, por mp.

Share this post


Link to post
Share on other sites

Sobre a Limitação e Retorno:

 

A limitação já está em vigor, contudo, ainda é possível não informar a Origem ou o Usuario.

O retorno, a princípio, apenas em xml e estou com um problema na geração do xml.

 

Opções de Uso/Retorno:

 

1) Informando o CEP de Origem (em breve será desativada)

Link: https://www.ipis.com.br/sistemas/correio/frete.php?Origem=59010660&Destino=57720000&Servico=0&Peso=3.500&Valor=1550.00

 

Retorno:

Imagem Postada

 

2) Informando o Usuário (definitivo)

Link: https://www.ipis.com.br/sistemas/correio/frete.php?Usuario=x&Destino=57720000&Servico=0&Peso=3.500&Valor=1550.00

 

Nesta forma, ganhamos agilidade porque não é necessário identificar e validar o cep (base com 810.000 registros :S) de origem, podemos controlar/limitar [depois devemos discutir estes limites] o uso (e consequentemente o tráfego) por cada usuário através do limite de consultas (recurso já esta ativo) e assim, diferenciar quem contribuiu de usuários free.

 

Retorno:

Imagem Postada

 

É isso ai! Por favor, divulgem a base e os recursos da mesma!.

Share this post


Link to post
Share on other sites

Sedex a cobrar adicionado!

Bloqueio de IP removido!

 

Link para testes usando usuário:

https://www.ipis.com.br/sistemas/correio/frete.php?Usuario=0&Destino=57720000&Servico=0&Peso=3.500&Valor=1550.00

A Origem é Natal/RN - 59010660, para cadastrar seu usuario mande mp ou e-mail com os dados requeridos

Share this post


Link to post
Share on other sites

Bloqueio de IP suspenso!

 

Link para testes usando usuário:

https://www.ipis.com.br/sistemas/correio/frete.php?Usuario=0&Destino=57720000&Servico=0&Peso=3.500&Valor=1550.00

A Origem é Natal/RN - 59010660.

Para cadastrar seu usuario mande mp ou e-mail com os dados:

- Nome

- Email

- CEP (Origem)

- Cidade

- Estado

- IP (opcional, até 3)

 

Retornarei com o codigo a ser usando na variavel Usuario.

Share this post


Link to post
Share on other sites

Adicionando suporte a e-Sedex:

 

Aos interessados, o suporte a e-Sedex está sendo adicionado, contudo, o serviço será disponibilizado somente para as capitais (exceto, AC, AP, RR e RO), por falta de uma informação crucial e atualizada:

 

Quais as cidades e faixas de CEP atendidas pelo e-Sedex, hoje?

 

Se alguém puder responder...

Share this post


Link to post
Share on other sites

Olá pessoal!

 

Sobre o e-Sedex:

 

Tendo em vista a ausência de uma informação precisa sobre as atuais faixas de cep cobertas pelo serviço, pausei (não desisti) o desenvolvimento do retorno do e-sedex, por, claro, não haver precisão nos dados. Se alguém puder ajudar com esta informação crucial, agradeço.

Fonte que achei: http://www.ferormonio.com.br/onde-comprar-feromonio/esedex.html

 

Obrigatoriedade do Usuário:

Atualmente: ativo, para as duas consultas.

 

A fins de teste, podem continuar usando o valor 0 (testes).

 

Sobre o bloqueio por IP:

 

Atualmente: dasativado.

Contudo, conforme exposto anteriormente, vou ativar, pois os dados estão no meu servidor e preciso limitar a banda e o acesso somente aos usuários cadastrados. O serviço suporta acesso por:

- Range de IP's, tipo 192.168.*.*, implementado, pois como eu, muitos podem não dispor de um ip fíxo (local, claro), o que me causou problemas ao testar o serviço localmente.

- Até 3 ip's fixos

 

Consulta de CEP's adicionada:

 

Agora, o sistema já oferece as duas consultas:

 

- CEP:

https://www.ipis.com.br/sistemas/correio/cep.php?Usuario=0&CEP=59010660

- FRETE:

https://www.ipis.com.br/sistemas/correio/frete.php?Usuario=0&Destino=58401528&Servico=0&Peso=2.700&Valor=0

Problema com o retorno XML:

 

Como citado anteriormente, estou com problema no retorno XML, quando informe 1ª linha do arquivo, o retorno não é corretamente lido.

Maiores detalhes, se alguem puder ajudar, vou postar a dúvida aqui no forum e edto aqui com o link para o tópico.

Share this post


Link to post
Share on other sites

Problema com o retorno XML:

 

Como citado anteriormente, estou com problema no retorno XML, quando informe 1ª linha do arquivo, o retorno não é corretamente lido.

Maiores detalhes, se alguem puder ajudar, vou postar a dúvida aqui no forum e edto aqui com o link para o tópico.

 

Problema com o retorno XML resolvido, vide tópico: http://forum.imasters.com.br/index.php?/topic/408113-erro-no-tratamento-de-retorno-xml-com-curl-xmllib/

Share this post


Link to post
Share on other sites

Consultas finalizadas!

 

Retorno CEP:

Imagem Postada

 

Retorno Frete:

Imagem Postada

 

O que falta?

1) Divulgar a base para que possamos montar esta base em um servidor dedicado, pago pelos usuários

2) Desenvolver os módulos para cada plataforma: Oscommerce, Magento, VirtueMart... Alguém se habilita?

3) Desenvolver uma função PHP para cálculo do peso cúbico (necessário para o PAC)

4) Avaliar e testar o sistema.

 

É isso! Aguardo interessados, mp ou fernando@ipis.com.br.

Share this post


Link to post
Share on other sites

Sistema finalizado!

 

Gostaria de informar que o sistema está finalizado, contudo, como o sistema permanece em meu servidor e não há, até o momento, patrocínio ao mesmo, as consultas sem informar um usuário válido estão bem limitadas.

 

Detalhe: como ninguém se habilitou a fazer o cálculo do peso cúbido e estou sem tempo agora, dever ser passado o maior valor entre os dois, do contrário, o PAC pode retornar um valor que, provavelmete, não vai bater na hora de postar encomenda, especialmente se o peso cúbico for superior ao peso real.

 

Sobre futuras atualizações:

 

CEP:

Estarei de olho quando forem divulgadas atualizações em faixas de CEP pelos correios e providenciarei as atualizações na base com também quando for lançada uma atualização do DNE (http://www.correios.com.br/servicos/cep/dne_saiba_mais.cfm) e passada ao GPBe.

 

Frete:

O banco de dados de fretes foi populado através de scripts que pegam a informação correta diretamente no webservice dos correios, da mesma forma, através de Cron Jobs, pretento automatizar as atualizações em meu servidor, mensalmente.

 

Lembrando que a base está atualizada em 02/04/2010 (CEP) e 03/09/2010 (PAC, Sedex e Sedex a Cobrar). Estou estudando a implementação do e-Sedex e, aproveitando, ressalto que somente clientes com contrato junto aos Correios podem efetivamente usar o e-Sedex.

 

Abraço a todos.

Share this post


Link to post
Share on other sites

Sobre o e-Sedex:

 

Consegui os dados corretos para implementação do módulo e-Sedex! Estou neste momento, populando as bases de dados para o serviço, posto aqui assim que consluir e atualizo a imagens de retorno (acima) atualizadas.

 

Vale lembrar que para realmente oferecer o e-Sedex (que é muito muito vantajoso em termos finaceiros) é necessário formalizar contrato específico junto aos Correios.

 

Os valores só são passados para os trajetos cobertos atualmente (base de capitais cobertas atualizada em 07.07.2010). E a princípio, como o serviço é extremamente específico e é necessário verificar faixas de CEP, implementarei somente capital -> todos os destinos (incluindo os interiores de cada estado coberto), ainda estou estudando a melhor forma de popular as tabelas quando a origem for um dos interiores cobertos de cada estado.

 

Por hora, é isso, e, por favor, ajudem na divulgação da base! PRECISAMOS DE UM PATROCINADOR! ABraço a todos.

Share this post


Link to post
Share on other sites

Fala velho, tudo tranqüilo?

 

Não querendo te desanimar, mas eu por exemplo não usuária uma base de dados externa para fazer requisições de valores dos correios, isso porque imagine quando eles fizerem os reajustes dos valores... dependerá que você ou outros que possuem uma base que não é a dos correios para repararem um a um os valores, com isso ficará inviável o uso de bases que não sejam do próprio correio.

 

Existem um xml dos próprios correios que faz isso automaticamente pegando diretamente no sevidor deles.

 

Segue o link

 

http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=09641030&sCepDestino=27511300&nVlPeso=10&nCdFormato=1&nVlComprimento=25&nVlAltura=5&nVlLargura=5&sCdMaoPropria=n&nVlValorDeclarado=0&sCdAvisoRecebimento=S&nCdServico=41106&nVlDiametro=5&StrRetorno=xml

Share this post


Link to post
Share on other sites

Fala velho, tudo tranqüilo?

 

Não querendo te desanimar, mas eu por exemplo não usuária uma base de dados externa para fazer requisições de valores dos correios, isso porque imagine quando eles fizerem os reajustes dos valores... dependerá que você ou outros que possuem uma base que não é a dos correios para repararem um a um os valores, com isso ficará inviável o uso de bases que não sejam do próprio correio.

 

Existem um xml dos próprios correios que faz isso automaticamente pegando diretamente no sevidor deles.

 

Segue o link

 

http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=09641030&sCepDestino=27511300&nVlPeso=10&nCdFormato=1&nVlComprimento=25&nVlAltura=5&nVlLargura=5&sCdMaoPropria=n&nVlValorDeclarado=0&sCdAvisoRecebimento=S&nCdServico=41106&nVlDiametro=5&StrRetorno=xml

 

Opa!

 

Mas a intenção é justamente ter uma base atualizada para usar durante as recorrentes instabilidades do webservice da ECT. Montei um esquema de atualização pra rodar via cron mensalmente no servidor e assim, manter a base atualizada.

 

Quanto as atualizações não há problemas... Abraço.

Share this post


Link to post
Share on other sites

Falae!

 

Seguinte, também caí na mesma situação, e acabei por fazer meu próprio webservice, com tabela de frete por cep, para sedex e pac.

 

Quero saber se o seu faz o cálculo do valor adicional por dimensão, no caso do PAC.

 

Eu fiz no meu, mas preciso testar mais pra ver se não vou ter problemas. Se você tiver implementado, gostaria de uma força =]

 

Se alguém estiver interessado em dar uma olhada: http://wp.fredericoleao.com.br/2010/09/16/caculo-de-frete-offline/

 

valeu

Share this post


Link to post
Share on other sites

Opa brother!

 

Assim, não desenvolvi ainda a fórmula do PAC por falta de tempo mesmo, mas aqui estão as intruções e a fórmula a usar:

 

5.1.1. A Encomenda PAC tem peso limite de:

 

a) Cliente sem contrato: – Tabela Código 41106:

30 kg: remessa individual em âmbito nacional.

B) Cliente com contrato: –Tabelas Códigos 41068 e 41211:

30 kg: remessa individual em âmbito nacional;

50 kg: remessa individual para localidades previstas em contrato.

c) Para efeito de tarifação será considerado o maior peso verificado entre:

peso bruto: pesagem na balança; e

peso cúbico: calculado em centímetros, com base no comprimento x largura x altura ÷ 4.800.

 

Fonte: http://www.correios.com.br/encomendas/info/termo_prest_serv.cfm

 

Na prática, é simples, caso o resultado da fórmula supracitada seja superior ao peso informado via url, na query string, usamos o peso cúbico (resultado da fórmula) ao invés do peso real, ou seja, o maior peso, detalhe: se o peso cúbido for inferior, usamos o peso real. Sempre vale o maior peso, ai é so buscar a tarifa na fixa de peso correta, a maior.

 

Vi seu script, muito bom, bem aparecido com o meu. Parabéns! Dentro em breve, finalizarei o meu webservice, aguardo somente a conslusão de alguns sites e sistemas de clientes meus, ainda pendentes. Se fizer fórmula antes de mim, posta ai pra ajudar a todos. Abraço e boa sorte.

Share this post


Link to post
Share on other sites

Caro Fred Ambientebrasil,

 

Desenvolvi a função do PAC para o cálculo do Peso Cúbico:

Levando em consideração que é necessário passar os pârametros [Altura, Largura e Comprimento] a minha funçãoe que somente será usado o formato Caixa/Pacote (código 1 nos correios), temos o seguinte, testado e conferido em vários testes junto aos correios:

 

<?
/*******
 * PAC *
 *******/

Function Frete_PAC($Origem = 0, $Origem_Regiao = '', $Origem_UF = '', $Destino = 0, $Destino_Regiao = '', $Destino_UF = '', $Peso = 0, $Valor = 0, $Comprimento = 0, $Largura = 0, $Altura = 0)
{
// Validacoes de Variavel
If (empty($Origem) || empty($Origem_Regiao) || empty($Origem_UF))
   { Return Array('Erro' => '21', 'Desc' => 'Parâmetro ausente/incorreto: CEP de Origem ['.$Origem.'].'); }
If (empty($Destino) || empty($Destino_Regiao) || empty($Destino_UF))
   { Return Array('Erro' => '22', 'Desc' => 'Parâmetro ausente/incorreto: CEP de Destino ['.$Destino.'].'); }
If (empty($Peso) || !is_numeric($Peso))
   { Return Array('Erro' => '23', 'Desc' => 'Parâmetro ausente/incorreto: Peso ['.$Peso.'].'); }
If (!is_numeric($Valor))
   { Return Array('Erro' => '24', 'Desc' => 'Parâmetro ausente/incorreto: Valor ['.$Valor.'].'); }
   
// Validacoes de Valor
If ($Peso <= 0 || $Peso > 30)
   { Return Array('Erro' => '25', 'Desc' => 'Peso inválido ['.Geral_FormataNumero($Peso, 3).']: Deve ser entre 0.001g e 30Kg.'); }
If ($Valor < 0 || $Valor > 10000)
   { Return Array('Erro' => '26', 'Desc' => 'Valor inválido ['.Geral_Moeda($Valor).']: não pode exceder R$ 10.000,00.'); }

// PESO CUBICO
$PesoReal                              = $Peso;
$PesoCubico                            = 0;
If (!empty($Comprimento) && is_numeric($Comprimento) && !empty($Largura) && is_numeric($Largura) && !empty($Altura) && is_numeric($Altura))
   {
     // Validacoes
     If($Comprimento < 16 || $Comprimento > 60)
       { Return Array('Erro' => '31', 'Desc' => 'Comprimento deve estar entre 16cm e 60cm.'); }
     If($Largura < 5 || $Largura > 60)
       { Return Array('Erro' => '32', 'Desc' => 'Largura deve estar entre 5cm e 60cm.'); }
     If($Altura < 2 || $Altura > 60)
       { Return Array('Erro' => '33', 'Desc' => 'Altura deve estar entre 2cm e 60cm.'); }
     If($Altura > $Comprimento)
       { Return Array('Erro' => '34', 'Desc' => 'Altura não pode ser superior ao comprimento.'); }
     If(($Altura + $Comprimento + $Largura) > 150)
       { Return Array('Erro' => '35', 'Desc' => 'A soma das medidas (Altura + Comprimento + Largura) não pode exceder 150cm.'); }
       
     $PesoCubico                       = Frete_PesoCubico($Comprimento, $Largura, $Altura);
     If ($PesoCubico > $Peso)
        { $Peso                        = $PesoCubico; }
   }

// COLETA
$Forma                                 = $Origem_Regiao == 'Capital' && $Destino_Regiao == 'Capital' ? 'Capital' : 'Interior';
$Peso                                  = $Peso <= 0.3 ? 0.3 : ceil($Peso);
$_SESSION['SQL']                       = 'SELECT Valor FROM pac_'.strtolower($Origem_UF).' WHERE Destino_Regiao = "'.$Forma.'" AND Destino_Estado = "'.$Destino_UF.'" AND Peso = '.$Peso;
If (MySQL_Linhas())
   { $Frete                            = MySQL_Resultado('Valor');
     $Seguro                           = $Valor < 50 ? $Frete : $Frete + Geral_Porcento($Valor - 50, 1);
     $RT                               = Array('Erro' => 0, 'Valor' => Geral_FormataNumero($Frete), 'ValorSeguro' => Geral_FormataNumero($Seguro), 'Peso' => ($PesoCubico > $PesoReal ? $PesoCubico.' (Cúbico)' : $PesoReal.' (Real)'));
   } Else { $RT                        = Array('Erro' => 28, 'Valor' => 0, 'ValorSeguro' => 0, 'Desc' => 'Tarifa PAC não localizada.'); }

Return $RT;
}

/* PESO CUBICO */
Function Frete_PesoCubico($Comprimento = 0, $Largura = 0, $Altura = 0)
{ $Peso                                  = ($Comprimento * $Largura * $Altura) / 4800;
  Return Geral_FormataNumero($Peso, 3); }
?>

Espero que lhe ajude a desenvolver a sua, abraço.

Share this post


Link to post
Share on other sites

Muito obrigado InterPlanet!

 

Vou corrigir agora mesmo o meu script usando essa fórmula!

 

(altura * comprimento * largua) / 4800 ? E se o peso cúbico for maior, então eu uso ele... interessante

 

agradeço novamente!

 

abraço

Share this post


Link to post
Share on other sites

Olá, achei muito interessante sua iniciativa InterPLanet, e gostaria de saber se o módulo já está pronto, se ainda está precisando de usuários para testar, ou então se precisa de alguma ajuda...

 

Olá Reinaldo, está sim, pronto e ativo, por favor me enviei os dados necessários ao seu cadastro via mp:

- Nome

- CEP de Origem de suas encomendas

- E-mail

- IP's de onde partiram as requisicões (até 3 fixos e/ou um range (tipo 200.150.*.*))

 

Retorno, via mp, com o seu código de usuário assim que te registrar. Abraço.

 

Muito obrigado InterPlanet!

 

Vou corrigir agora mesmo o meu script usando essa fórmula!

 

(altura * comprimento * largua) / 4800 ? E se o peso cúbico for maior, então eu uso ele... interessante

 

agradeço novamente!

 

abraço

 

Flw Fred, boa sorte! Até mais.

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.