phpando 0 Denunciar post Postado Setembro 14, 2009 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
João Batista Neto 448 Denunciar post Postado Setembro 14, 2009 Em 14/09/2009 at 13:53, 'phpando' disse: 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: Citar 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
phpando 0 Denunciar post Postado Setembro 14, 2009 Em 14/09/2009 at 14:28, 'João Batista Neto' disse: 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
João Batista Neto 448 Denunciar post Postado Setembro 14, 2009 Em 14/09/2009 at 14:42, 'phpando' disse: 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
phpando 0 Denunciar post Postado Setembro 14, 2009 Em 14/09/2009 at 14:51, 'João Batista Neto' disse: Em 14/09/2009 at 14:42, 'phpando' disse: 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
João Batista Neto 448 Denunciar post Postado Setembro 14, 2009 Em 14/09/2009 at 15:08, 'phpando' disse: 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
João Batista Neto 448 Denunciar post Postado Setembro 14, 2009 Em 14/09/2009 at 15:08, 'phpando' disse: 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
phpando 0 Denunciar post Postado Setembro 14, 2009 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
João Batista Neto 448 Denunciar post Postado Setembro 14, 2009 Em 14/09/2009 at 16:50, 'phpando' disse: 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
phpando 0 Denunciar post Postado Setembro 14, 2009 Em 14/09/2009 at 17:24, 'João Batista Neto' disse: Em 14/09/2009 at 16:50, 'phpando' disse: 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
João Batista Neto 448 Denunciar post Postado Setembro 14, 2009 Em 14/09/2009 at 17:33, 'phpando' disse: 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
phpando 0 Denunciar post Postado Setembro 17, 2009 Em 14/09/2009 at 17:44, 'João Batista Neto' disse: 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 Batista Neto 448 Denunciar post Postado Setembro 17, 2009 Em 17/09/2009 at 17:58, 'phpando' disse: 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