Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

phpando

Tabela de Taxas PAC / Sedex com atualização via Correios

Recommended Posts

Olá pessoal.

 

Procurando uma solução para e-commerce onde fosse possível calcular o frete via PAC e Sedex sem fazer requisições diretas ao site dos correios, encontrei um módulo para OSCommerce que pode servir como base para um banco de dados extremamente útil a todos os desenvolvedores.

 

Topico: http://www.oscommerce.com/community/contributions,6710

 

Nesse script é montada uma base de dados com detalhamento de peso / tarifa para todas as regiões do Brasil (PAC, SEDEX, SEDEX10...), mas como é um módulo para OSC a modelagem (e programação para atualização), na minha visão, é péssima.

 

A idéia seria montar este banco de dados com estas tarifas e criar uma ferramenta de atualização de valores através do site dos correios para atualizar o banco quando houvesse atualização.

 

Gostaria de saber se alguém está interessado em tocar para frente um projeto semelhante, mas aberto para qualquer aplicação PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal.

 

Procurando uma solução para e-commerce onde fosse possível calcular o frete via PAC e Sedex sem fazer requisições diretas ao site dos correios, encontrei um módulo para OSCommerce que pode servir como base para um banco de dados extremamente útil a todos os desenvolvedores.

 

Bom, implementei um pacote utilizando o webservice do correios, as funções de interface ficaram bem simples de utilizar e o método que é utilizado para recuperar os dados foram abstraídos, acho que ficou interessante:

 

Para utilizar:

$calc = new ECTCalcPrecoPrazo();
$calc->setCepOrigem( '14403830' ); //Cep de origem
$calc->setCepDestino( '14400480' ); //Cep de destino
$calc->setCdServico( ECTServicos::PAC ); //Faz a consulta de preço e prazo para o serviço PAC
$calc->setMaoPropria(); //Opcional, define que deve ser calculado o serviço adicional de mão própria
$calc->setAvisoRecebimento(); //Opcional, define que deve ser calculado o serviço adicionao de aviso de recebimento
$calc->nVlComprimento = 65;
$calc->nVlLargura = 30;
$calc->nVlPeso = 10;
$calc->nVlValorDeclarado = 10000; //Opcional, define o valor declarado da encomenda

$precos =& $calc->calcula(); //Faz o cálculo

if ( ECTCalcPrecoPrazo::errno() ){
    printf( 'Erro[ %d ]: %s' , ECTCalcPrecoPrazo::errno() , ECTCalcPrecoPrazo::error() );
} else {
    foreach ( $precos as &$cServico ){
        printf( "Valor para %s: R$ %.02f\nEntrega em %d dias\n\n" , ECTServicos::nome( $cServico->Codigo ) , $cServico->Valor , $cServico->PrazoEntrega );
    }
}

Também é possível fazer o cálculo de vários tipos de serviços ao mesmo tempo, utilizando o operador lógico OR:

 

$calc = new ECTCalcPrecoPrazo();
$calc->setCepOrigem( '14403830' ); //Cep de origem
$calc->setCepDestino( '14400480' ); //Cep de destino
$calc->setCdServico( ECTServicos::PAC | ECTServicos::SEDEX ); //Faz a consulta de preço e prazo para o serviço PAC e SEDEX na mesma consulta
$calc->setMaoPropria(); //Opcional, define que deve ser calculado o serviço adicional de mão própria
$calc->setAvisoRecebimento(); //Opcional, define que deve ser calculado o serviço adicionao de aviso de recebimento
$calc->nVlComprimento = 65;
$calc->nVlLargura = 30;
$calc->nVlPeso = 10;
$calc->nVlValorDeclarado = 10000; //Opcional, define o valor declarado da encomenda

$precos =& $calc->calcula();

if ( ECTCalcPrecoPrazo::errno() ){
    printf( 'Erro[ %d ]: %s' , ECTCalcPrecoPrazo::errno() , ECTCalcPrecoPrazo::error() );
} else {
    foreach ( $precos as &$cServico ){
        printf( "Valor para %s: R$ %.02f\nEntrega em %d dias\n\n" , ECTServicos::nome( $cServico->Codigo ) , $cServico->Valor , $cServico->PrazoEntrega );
    }
}

O código acima deverá imprimir:

Valor para PAC: R$ 123.30

Entrega em 3 dias

 

Valor para Sedex: R$ 127.90

Entrega em 1 dias

 

 

As classes e interfaces estão em:

 

http://joaoneto.com4.com.br/source/ECTCalcPrecoPrazo.php

http://joaoneto.com4.com.br/source/ECTCalcPrecoPrazoResult.php

http://joaoneto.com4.com.br/source/ECTConsultaSOAP.php

http://joaoneto.com4.com.br/source/ECTConsultaXML.php

http://joaoneto.com4.com.br/source/ECTcServico.php

http://joaoneto.com4.com.br/source/ECTFormatos.php

http://joaoneto.com4.com.br/source/ECTHandler.php

http://joaoneto.com4.com.br/source/ECTServicos.php

http://joaoneto.com4.com.br/source/IECTTypes.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, implementei um pacote utilizando o webservice do correios, as funções de interface ficaram bem simples de utilizar e o método que é utilizado para recuperar os dados foram abstraídos, acho que ficou interessante:

 

Para utilizar...

 

João, esta forma de obter os dados é realmente útil, mas ao obter um banco de dados com as informações, agilizam-se os processos e não ficamos dependentes do site deles estar ou não com um funcionamento correto.

 

Imagine se o site deles encontra-se com sobrecarga no momento da sua requisição, o cliente que solicita as formas de frete disponíveis vai se deparar com um erro, isto que não é interessante.

 

Se formularmos um banco de dados com as taxas e uma ferramenta para poder se manter atualizado, não há necessidade de outra conexão junto aos correios além desta para atualização, esta é a idéia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imagine se o site deles encontra-se com sobrecarga no momento da sua requisição, o cliente que solicita as formas de frete disponíveis vai se deparar com um erro, isto que não é interessante.

hehehe, eu realmente acredito que isso é inviável.

Imagina que a qualquer hora esses dados podem mudar, de que pode servir um banco de dados que você nunca poderá confiar ???

Ou então, para ser confiável, serão necessárias tantas atualizações que será muito mais produtivo acessar diretamente o serviço deles.

 

Enfim, é minha opinião pessoal. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Imagine se o site deles encontra-se com sobrecarga no momento da sua requisição, o cliente que solicita as formas de frete disponíveis vai se deparar com um erro, isto que não é interessante.

hehehe, eu realmente acredito que isso é inviável.

Imagina que a qualquer hora esses dados podem mudar, de que pode servir um banco de dados que você nunca poderá confiar ???

Ou então, para ser confiável, serão necessárias tantas atualizações que será muito mais produtivo acessar diretamente o serviço deles.

 

Enfim, é minha opinião pessoal. ;)

 

É talvez você tenha razão.

 

Testei seu sistema mas há inconsistência.

Fiz um teste utilizando mesmos CEPs de Origem e Destino, Peso e dimensões (Comprimento, Largura e Altura) tanto no seu sistema como no site dos correios e a diferença de preço foi de mais de 100,00.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz um teste utilizando mesmos CEPs de Origem e Destino, Peso e dimensões (Comprimento, Largura e Altura) tanto no seu sistema como no site dos correios e a diferença de preço foi de mais de 100,00.

 

Verifique se você declarou valor, serviços adicionais como mão própria e aviso recebimento e declaração de valor, todos esses serviços têm preços adicionais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz um teste utilizando mesmos CEPs de Origem e Destino, Peso e dimensões (Comprimento, Largura e Altura) tanto no seu sistema como no site dos correios e a diferença de preço foi de mais de 100,00.

 

Verifique se você declarou valor, serviços adicionais como mão própria e aviso recebimento e declaração de valor, todos esses serviços têm preços adicionais.

 

Faça o teste:

$calc = new ECTCalcPrecoPrazo();
$calc->setCepOrigem( '14403830' );
$calc->setCepDestino( '14400480' );
$calc->setCdServico( ECTServicos::PAC );
$calc->setMaoPropria();
$calc->setAvisoRecebimento();
$calc->nVlComprimento = 60;
$calc->nVlLargura = 30;
$calc->nVlAltura = 5;
$calc->nVlPeso = 10;
$calc->nVlValorDeclarado = 10000;

$precos =& $calc->calcula();

if ( ECTCalcPrecoPrazo::errno() ){
    printf( 'Erro[ %d ]: %s' , ECTCalcPrecoPrazo::errno() , ECTCalcPrecoPrazo::error() );
} else {
    foreach ( $precos as &$cServico ){
        printf( "Serviço.................: %s\n"       , ECTServicos::nome( $cServico->Codigo ) );
        printf( "Valor Mão Própria.......: R$ %.02f\n" , $cServico->ValorMaoPropria );
        printf( "Valor Aviso Recebimento.: R$ %.02f\n" , $cServico->ValorAvisoRecebimento );
        printf( "Valor Valor Declarado...: R$ %.02f\n" , $cServico->ValorValorDeclarado );
        printf( "Prazo de entrega........: %d dia(s)\n", $cServico->PrazoEntrega );
        printf( "Entrega Domiciliar......: %s\n"       , $cServico->EntregaDomiciliar ? 'sim' : 'não' );
        printf( "Entrega aos sábados.....: %s\n"       , $cServico->EntregaSabado ? 'sim' : 'não' );
        printf( "Valor do frete..........: R$ %.02f\n" , $cServico->Valor );
    }
}

Deverá imprimir:

Serviço.................: PAC
Valor Mão Própria.......: R$ 3.30
Valor Aviso Recebimento.: R$ 2.60
Valor Valor Declarado...: R$ 99.50
Prazo de entrega........: 3 dia(s)
Entrega Domiciliar......: sim
Entrega aos sábados.....: não
Valor do frete..........: R$ 123.30

Compartilhar este post


Link para o post
Compartilhar em outros sites

João

 

Utilizei o seguinte:

$calc = new ECTCalcPrecoPrazo();
$calc->setCepOrigem( '14403830' ); //Cep de origem
$calc->setCepDestino( '90160007' ); //Cep de destino
$calc->setCdServico( ECTServicos::PAC | ECTServicos::SEDEX );
$calc->nVlComprimento = 60;
$calc->nVlLargura = 60;
$calc->nVlAltura = 30;
$calc->nVlPeso = 1;

E o retorno que tive foi:

Serviço.................: PAC
Valor Mão Própria.......: R$ 0.00
Valor Aviso Recebimento.: R$ 0.00
Valor Valor Declarado...: R$ 0.00
Prazo de entrega........: 6 dia(s)
Entrega Domiciliar......: sim
Entrega aos sábados.....: não
Valor do frete..........: R$ 13.90

Serviço.................: Sedex
Valor Mão Própria.......: R$ 0.00
Valor Aviso Recebimento.: R$ 0.00
Valor Valor Declarado...: R$ 0.00
Prazo de entrega........: 1 dia(s)
Entrega Domiciliar......: sim
Entrega aos sábados.....: sim
Valor do frete..........: R$ 34.10

Realizando a consulta no site dos correios com os mesmos dados o valor informado foi de R$ 65,60 para o PAC.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realizando a consulta no site dos correios com os mesmos dados o valor informado foi de R$ 65,60 para o PAC.

 

De fato, existe uma falha no sistema do Correios; Já entrei em contato com eles informando o bug e estou aguardando um retorno.

Porém, na consulta feita pelo site do Correios aparece a seguinte mensagem: "O preço desta pesquisa é meramente informativo, devendo ser confirmado no ato da postagem"

Eu acredito, que o valor que você deve confiar é no retornado pela classe ECTCalcPrecoPrazo, porém, vamos aguardar um posicionamento por parte da ECT.

 

Abaixo o retorno da consulta XML para os dados do seu teste (a consulta SOAP retorna os mesmos valores uma vez q o serviço é o mesmo)

consulta XML

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Realizando a consulta no site dos correios com os mesmos dados o valor informado foi de R$ 65,60 para o PAC.

 

De fato, existe uma falha no sistema do Correios; Já entrei em contato com eles informando o bug e estou aguardando um retorno.

Porém, na consulta feita pelo site do Correios aparece a seguinte mensagem: "O preço desta pesquisa é meramente informativo, devendo ser confirmado no ato da postagem"

Eu acredito, que o valor que você deve confiar é no retornado pela classe ECTCalcPrecoPrazo, porém, vamos aguardar um posicionamento por parte da ECT.

 

Abaixo o retorno da consulta XML para os dados do seu teste (a consulta SOAP retorna os mesmos valores uma vez q o serviço é o mesmo)

consulta XML

 

Ok João.

Aguardo por notícias.

 

Outra coisa, não há forma de consulta somente pelo peso (sabendo que o limite que os correios transportam de 30kg) ?

Vamos supor que um cliente adquiriu 5 produtos de dimensões diferentes que totalizam 10 kg, como fazer para calcular o frete?

Obrigar o cadastro das dimensoes de cada produto e realizar uma consulta para cada um dos selecionados no momento da compra?

 

Testando através do link: http://www.correios.com.br/encomendas/precos/calculo.cfm?resposta=&servico=41106&cepOrigem=14403830&cepDestino=90160007&peso=1&MaoPropria=N&valorDeclarado=&avisoRecebimento=N

 

O resultado para o PAC e SEDEX é o mesmo, R$ 13,90 e R$ 34,10, acho que as dimensões são irrelevantes ou o erro está neste item quando utilizamos o seu sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra coisa, não há forma de consulta somente pelo peso (sabendo que o limite que os correios transportam de 30kg) ?

Vamos supor que um cliente adquiriu 5 produtos de dimensões diferentes que totalizam 10 kg, como fazer para calcular o frete?

Obrigar o cadastro das dimensoes de cada produto e realizar uma consulta para cada um dos selecionados no momento da compra?

 

$calc = new ECTCalcPrecoPrazo();
$calc->setCepOrigem( '14403830' );
$calc->setCepDestino( '90160007' );
$calc->setCdServico( ECTServicos::PAC | ECTServicos::SEDEX );
$calc->nVlPeso = 30;

Saída:

Serviço.................: PAC
Valor Mão Própria.......: R$ 0.00
Valor Aviso Recebimento.: R$ 0.00
Valor Valor Declarado...: R$ 0.00
Prazo de entrega........: 6 dia(s)
Entrega Domiciliar......: sim
Entrega aos sábados.....: não
Valor do frete..........: R$ 81.30

Serviço.................: Sedex
Valor Mão Própria.......: R$ 0.00
Valor Aviso Recebimento.: R$ 0.00
Valor Valor Declarado...: R$ 0.00
Prazo de entrega........: 1 dia(s)
Entrega Domiciliar......: sim
Entrega aos sábados.....: sim
Valor do frete..........: R$ 196.40

Como pode ver, o cálculo é feito com base em um valor padrão do Correios. Para evitar isso, seu cliente pode padronizar a embalagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como pode ver, o cálculo é feito com base em um valor padrão do Correios. Para evitar isso, seu cliente pode padronizar a embalagem.

 

João, estava funcionando normalmente.

O servidor deles caiu agora a tarde ou é algo comigo?

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

João, estava funcionando normalmente.

O servidor deles caiu agora a tarde ou é algo comigo?

 

Bom amigão, para mim não só está funcionando, mas também a diferença dos preços foi corrigida:

 

$calc = new ECTCalcPrecoPrazo();
$calc->setCepOrigem( '14403830' ); //Cep de origem
$calc->setCepDestino( '90160007' ); //Cep de destino
$calc->setCdServico( ECTServicos::PAC | ECTServicos::SEDEX );
$calc->nVlComprimento = 60;
$calc->nVlLargura = 60;
$calc->nVlAltura = 30;
$calc->nVlPeso = 1;

Agora retorna:

 

Serviço.................: PAC
Valor Mão Própria.......: R$ 0.00
Valor Aviso Recebimento.: R$ 0.00
Valor Valor Declarado...: R$ 0.00
Prazo de entrega........: 6 dia(s)
Entrega Domiciliar......: sim
Entrega aos sábados.....: não
Valor do frete..........: R$ 65.60

Serviço.................: Sedex
Valor Mão Própria.......: R$ 0.00
Valor Aviso Recebimento.: R$ 0.00
Valor Valor Declarado...: R$ 0.00
Prazo de entrega........: 1 dia(s)
Entrega Domiciliar......: sim
Entrega aos sábados.....: sim
Valor do frete..........: R$ 34.10

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.