pedro-teixeira / correios

Módulo de frete para Magento com tracking
https://pedroteixeira.io
MIT License
110 stars 72 forks source link

Frete muito caro #344

Closed fernandoweb91 closed 5 years ago

fernandoweb91 commented 6 years ago

Olá pessoal!

Quando é adicionado no carrinho muitos produtos por exemplo 1000 o frete está ficando muito alto em relação aos correios.

Percebi que o erro ocorre porque a Magento ou o módulo dos correios não está calculando o peso corretamente quando o produto é do tipo pacote (bundle)

O produto da minha cliente é pequeno e leve pesa 6 gramas, se o cliente comprar 2000 peças, ou seja, um pacote com 1000 produtos A, e 1000 produtos B, o frete fica R$ 144,78, mas se calcular 12kg no site dos correios o frete fica R$ 60,10.

Na magento estou informando o peso dessa forma: 0.0006

Abraço!

fernandoweb91 commented 6 years ago

Olá pessoal!

Realizando novos testes percebi que se eu uso o módulo na versão 4.4 o valor do frete fica mais próximos dos correios.

Segundo a minha cliente tem um produto que o frete deveria ficar dessa forma:

PAC 19.01 - SEDEX 28.10

Mas usando a versão 4.9 o frete ficou:

PAC 18.23 - SEDEX 40.65

Então usei a versão 4.4 e o frete ficou:

PAC 19.60 - SEDEX 36.03

Abaixou mas cliente precisa que ele fique mais barato ainda.

Será que tem como?

Abraços!

rafaelpatro commented 6 years ago

Olá @fernandoplanejar91 Cadastrou as dimensões do produto? Quais são elas? Monitora o arquivo system.log durante uma cotação, e coloca aq o resultado, pra gente analisar.

carlosvolp commented 6 years ago

Meu também acontece mesmo tipo de erro. Meu log: 2018-03-20T15:23:49+00:00 DEBUG (7): pedroteixeira_correios [cache]: mode=0 status=write key=04510x04014_02_30_85905040

rafaelpatro commented 6 years ago

@carlosvolp esse é só o debug, não caracteriza erro. Apenas mostra oq está ocorrendo. Nesse caso foi realizada uma cotação direto com os Correios (mode=0), e o resultado foi armazenado em cache, para consulta futura (status=write).

guittavares commented 6 years ago

Olá @fernandoplanejar91 tudo bem? Já tentou realizar a limpeza do cache do módulo? (Sistema > Gerenciar Cache)

*Marque apenas o item relacionado ao módulo

Espero ter ajudado ;)

fernandoweb91 commented 6 years ago

Olá pessoal,

Obrigado pelo retorno!

Segue os logs (system.log) dos meus testes:

2018-03-21T20:30:32+00:00 DEBUG (7): pedroteixeira_correios [cache]: mode=0 status=write key=40096x41068_03_16_05427000 2018-03-21T20:30:46+00:00 DEBUG (7): pedroteixeira_correios [cache]: mode=0 status=write key=40096x41068_03_16_20260300 2018-03-21T20:30:57+00:00 DEBUG (7): pedroteixeira_correios [cache]: mode=0 status=write key=40096x41068_03_16_23970000

Caso essa informação seja util segue mais um detalhe:

Notei que nos logs aparece 150 linhas com o seguinte erro:

2018-03-21T20:30:57+00:00 ERR (3): Deprecated functionality: iconv_set_encoding(): Use of iconv.internal_encoding is deprecated in /home/host1657/public_html/40_emb/lib/Zend/Locale/Format.php on line 313 2018-03-21T20:30:57+00:00 ERR (3): Deprecated functionality: iconv_set_encoding(): Use of iconv.internal_encoding is deprecated in /home/host1657/public_html/40_emb/lib/Zend/Locale/Format.php on line 474 2018-03-21T20:30:57+00:00 ERR (3): Deprecated functionality: iconv_set_encoding(): Use of iconv.internal_encoding is deprecated in /home/host1657/public_html/40_emb/lib/Zend/Validate/Hostname.php on line 553 2018-03-21T20:30:57+00:00 ERR (3): Deprecated functionality: iconv_set_encoding(): Use of iconv.internal_encoding is deprecated in /home/host1657/public_html/40_emb/lib/Zend/Validate/Hostname.php on line 649

Eu já limpei o cache da magento na opção "Gerencia Cache"

Abraços!

rafaelpatro commented 6 years ago

@fernandoplanejar91 analisando o primeiro log q vc enviou...

Primeira cotação: mode=0 status=write key=40096x41068_03_16_05427000

Sugestões:

  1. Você trabalha com produtos muito leves. Tente aumentar a precisão do cache nesta linha para 2 ou 3 no máximo.
  2. Sugiro verificar os códigos de serviço, junto ao seu representante nos Correios. Acho q os códigos q informou não são mais válidos.
  3. A dimensão q vc informou 0.0006 na primeira mensagem não corresponde a 6 gramas. Precisa corrigir no produto, colocar 0.006 (ignore isto, caso tenha sido apenas um erro de digitação).
fernandoweb91 commented 6 years ago

@rafaelpatro Estou achando que minha loja ou o módulo dos correios está armazenando por muito tempo o cache das alterações porque alterei o config.xml para 3 e abaixou o valor do frete, ai fui alterar para 2, 40, e até mesmo apagar e deixar como 1 como estava antes e não mudou nada no valor.

Mas fiz um comparativo das mudanças após editar esse arquivo:

Módulo 4.4

Frete para SP | 20 peças | Sedex: R$ 1,00 mais barato | Pac: Ficou disponivel, sendo que não deveria segundo a tabela da cliente

Frete para RJ | 20 peças | Sedex: R$ 4,00 mais caro | Pac: R$ 1,00 mais caro

Frete para MG | 20 peças | Sedex: R$ 4,00 mais barato | Pac: R$ 1,00 mais barato

Frete para SP | 100 ou 1000 peças | Sedex: R$ 1,00 mais barato | Pac: Ficou disponivel, sendo que não deveria segundo a tabela da cliente

Frete para RJ | 100 ou 1000 peças | Sedex: R$ 40,00 mais barato | Pac: R$ 10,00 mais barato

Frete para MG | 100 ou 1000 peças | Sedex: R$ 40,00 mais barato | Pac: R$ 10,00 mais barato

Esse módulo usa o código antigo 40096 e 41068

Módulo 4.9

Frete para SP | 20 peças | Sedex: Valor correto | Pac: Valor correto

Frete para RJ | 20 peças | Sedex: Valor correto | Pac: Valor correto

Frete para MG | 20 peças | Sedex: Valor correto | Pac: Valor correto

Frete para SP | 100 ou 1000 peças | Sedex: R$ 50,00 mais caro | Pac: R$ 100,00 mais caro

Frete para RJ | 100 ou 1000 peças | Sedex: R$ 200,00 mais caro | Pac: R$ 500,00 mais caro

Frete para MG | 100 ou 1000 peças | Sedex: R$ 200,00 mais caro | Pac: R$ 500,00 mais caro

Esse módulo usa o código novo 04162 e 04669

Conclusão o calculo do módulo antigo está errado também mas pelo menos não erra muito.

Em relação ao peso informado eu tinha escrito dessa forma porque quando digita 0.006 a loja muda para 0.0060, mas nos meus testes não teve diferença essa quantidade de zero.

OBS:

Nessa loja o produto do tipo pacote está cadastrado como peso dinâmico, e ele está associado a 2 produtos simples, um produto pesa 0.0060 e o outro 0.0012

rafaelpatro commented 6 years ago

Quais as dimensões cadastradas pra esse produto? Altura, largura e comprimento.

Provavelmente são elas q estão influenciando a cotação de qdes maiores.

fernandoweb91 commented 6 years ago

@rafaelpatro

Durante os meus testes estavam no padrão minimo dos correios, ou seja, altura = 2cm / comprimento = 16cm / largura = 11cm

Mas você me deu ideia colocar o tamanho da embalagem na dimensão do produto, que seria:

altura = 2cm / comprimento = 8cm / largura = 3cm

Mas não mudou nada no valor, deixei até tudo como 1cm e não fez diferença.

Só quando deixa algo acima de 15cm ou 20cm começa a fazer diferença no valor, fica mais caro.

Mas o foco aqui é abaixar o valor :)

OBS:

1- Estou achando que o sistema está deixando como padrão: altura = 2cm / comprimento = 16cm / largura = 11cm mesmo se eu informar um tamanho menor 2- Já deixei o tamanho da dimensão direto no Painel > Sistemas > Formas de Entrega > Correios 3- Acho que a solução é abrir o arquivo que determina o minimo e já deixar fixo nele altura = 2cm / comprimento = 8cm / largura = 3cm

Abraços!

rafaelpatro commented 6 years ago

Funciona assim... Os Correios defiriram o padrão mínimo como sendo alt 2cm, larg 11cm, comp 16cm. O webservice não aceita valores menores q esses. Retorna erro.

Para lidar com isso, sempre q o produto era pequeno demais, o módulo enviava os valores mínimos, ignorando a dimensão do produto.

Mas depois percebemos q o Correios é indiferente a pequenas diferenças. Pacotes de 2x11x16 ou 20x25x30 tem o mesmo frete, se tiverem o mesmo peso.

Oq ocorre é q a mensuração da cubagem, segundo os Correios, precisa ser superior a 5kg cubados. Isso significa q a dimensão média precisa ser superior a 31cm.

Ao realizar diversas cotações, e aumentar as quantidades,.vc percebe o preço subindo, conforme o peso. Qdo a dimensão do pacote atinje uma média de 32cm de lado, o Correios provavelmente passa a ignorar o peso real.

Ou seja comparar os preços de frete baseando-se apenas no peso, só é válido até certo ponto. Qdo seu pacote supera o limite da cubagem, a conta muda.

TenSoja commented 6 years ago

Estou passando pelo mesmo problema em ambas as versões, como o produto é muito leve (0.0033) e é vendido a partir mil unidades o frete dos correios via PAC fica em R$ 21,50 enquanto o do site está ficando em R$ 218,60.

Tentei aumentar a precisão do cache para 3 continuando com o mesmo valor.

Colocar as dimensões para o produto individualmente não funciona, extrapola e muito o tamanho da caixa que acomoda todos os itens já que o Correios limita o valor mínimo das dimensões.

rafaelpatro commented 6 years ago

@TenSoja, quais as dimensões cadastradas do seu produto?

TenSoja commented 6 years ago

@rafaelpatro estou usando as medidas mínimas (altura = 2cm, comprimento = 16cm, largura = 11cm) pois não tem como colocar menos.

KARINABORGES commented 6 years ago

@rafaelpatro estou com um problema parecido, no meu caso os produtos possuem tamanhos diferentes porém os clientes compram num mesmo pedido. Nesse caso o módulo deveria considerar a medida do maior produto para poder calcular o frete corretamente, porém parece que ele soma as medidas de todos os produtos, aí o frete fica um valor absurdo. Você sabe como podemos resolver este problema? Mesmo colocando a opção de diferença de encaixe ele não calcula corretamente.

tambourine-man commented 6 years ago

Olá, mesma coisa aqui. Estou achando que o módulo arredonda o peso dos produtos individuais antes de fazer a soma do peso total. Por exemplo, o frete para 12 produtos de 0.35kg cada, custa R$ 95,50 (5kg aproximadamente). O módulo informa R$ 165,30, que é exatamente o valor para 12kg.

Acho que ele arredonda o valor fracionário para cima antes de fazer a soma, quando deveria fazê-lo no último passo.

rafaelpatro commented 6 years ago

@tambourine-man quais são as medidas cadastradas do seu produto?

tambourine-man commented 6 years ago

A 9cm, L 25cm, C 25cm.

Mas usei outras medidas também e não altera o valor final. Por exemplo, 2cm, L 11cm, C 16cm.

rafaelpatro commented 6 years ago

Cálculo da cubagem dos Correios: 9 x 25 x 25 ÷ 6000 = 0.935 kg

No caso de 12 itens: 12 x 0.935 = 11.22kg

Ou seja considerando as dimensões do seu item, e sua cotação, o módulo está funcionando perfeitamente. O valor de 165 reais é o correto.

Masss como vc disse ter alterado as medidas sem causar efeito, sugiro alterar as medidas novamente, reindexar, limpar a cache, e cotar novamente. O valor deve realmente ser menor.

tambourine-man commented 6 years ago

Oi Rafael, o problema é essa simulação no site dos correios dá um valor muito abaixo, como informei anteriormente.

Me parece que esse cálculo que vocês estão fazendo não é o mesmo do correio. Inclusive, alterando o tamanho da embalagem no site deles para esses valores que informei acima não altera o valor.

Esse teste simples com curl, com as dimensões e peso informados, retorna o resultado correto


<?php
 $data['nCdEmpresa'] = '';
 $data['sDsSenha'] = '';
 $data['sCepOrigem'] = '22231901';
 $data['sCepDestino'] = '38406197';
 $data['nVlPeso'] = '5';
 $data['nCdFormato'] = '1';
 $data['nVlComprimento'] = '16';
 $data['nVlAltura'] = '2';
 $data['nVlLargura'] = '11';
 $data['nVlDiametro'] = '0';
 $data['sCdMaoPropria'] = 'n';
 $data['nVlValorDeclarado'] = '0';
 $data['sCdAvisoRecebimento'] = 'n';
 $data['StrRetorno'] = 'xml';
 $data['nCdServico'] = '40010';
//  $data['nCdServico'] = '41106';
 $data = http_build_query($data);

 $url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx';

 $curl = curl_init($url . '?' . $data);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

 $result = curl_exec($curl);
 $result = simplexml_load_string($result);
 foreach($result -> cServico as $row) {
 //Os dados de cada serviço estará aqui
 if($row -> Erro == 0) {
     echo $row -> Codigo . '<br>';
     echo $row -> Valor . '<br>';
     echo $row -> PrazoEntrega . '<br>';
     echo $row -> ValorMaoPropria . '<br>';
     echo $row -> ValorAvisoRecebimento . '<br>';
     echo $row -> ValorValorDeclarado . '<br>';
     echo $row -> EntregaDomiciliar . '<br>';
     echo $row -> EntregaSabado;
 } else {
     echo $row -> MsgErro;
 }
 echo '<hr>';
 }
rafaelpatro commented 6 years ago

Ok. Podemos testar isso no seu código. Consegue fazer um teste enviando as medidas corretas?

41cm x 41cm x 41cm (altura x largura x comp) 4,2kg (peso)

Esse é o tamanho mínimo da caixa com 12 unidades do seu produto.

tambourine-man commented 6 years ago

Com essas dimensões o valor fica igual no site dos correios, no código que postei (desde que arredonde para 5kg) e no módulo.

Só não entendo porque você diz que o tamanho mínimo da caixa com 12 unidades seria 41x41x41.

rafaelpatro commented 6 years ago

Conforme descreveu, as medidas cadastradas do seu produto são 9 x 25 x 25. E o peso é 0.35kg. No exemplo estamos considerando 12 unidades do produto no carrinho de compras. Nesse caso vc precisa multiplicar o peso e as medidas.

O peso é simples: 0.35 x 12 = 4.2kg

As medidas é um pouco mais complexo: Vamos considerar que 9cm é a altura, ok?! Então agora vamos empilhar os 12 itens.

Ok, agora temos uma pacote com 108 x 25 x 25. Essa é a medida correta para vc testar.

Por que falei para enviar 41 x 41 x 41?

Dificilmente o logista irá empilhar os itens dessa forma. A forma como vc vai acomodar seu produto na caixa é provavelmente a mínima possível. Vc não quer espaços vazios, pois vai pagar por cada centímetro desperdiçado. Além disso os Correios possuem limites máximos de comprimento. Então o módulo calcula uma média das dimensões.

Basta multiplicar as 3 dimensões, e em seguida extrair a raiz cúbica. Ex.: 108 x 25 x 25 = 67500 67500 ^ (1/3) = 40.71

Ou seja 108 x 25 x 25 é equivalente a 41 x 41 x 41.

tambourine-man commented 6 years ago

Entendi, muito obrigado pela explicação Rafael. Acho que o cliente precisa ser mais conservador no tamanho da caixa individual então.

rafaelpatro commented 6 years ago

De nada! Qualquer sugestão ou melhoria será muito bem vinda.