Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Serviços por Produto, Validação por Serviço, Grandes Formatos, Carta Registrada, Cache #47

Merged
merged 36 commits into from
Mar 30, 2015

Conversation

jarjar123
Copy link
Contributor

Closes #3, closes #21, closes #43: Validação de Peso e Dimensões.

  1. Valida cada produto do carrinho, sem considerar os limites inferiores.
  2. Valida também o carrinho todo.
  3. Valida considerando limites diferentes para cada serviço de postagem.
  4. Acusa erro somente quando todos os serviços são inválidos.
  5. Envia sempre o peso físico e a dimensão média.

Closes #17: Adicionados os serviços de Carta Comercial e Carta Comercial Registrada.

  1. Também é possível adicionar qualquer outro serviço, bastando cadastrá-lo em config.xml, de acordo com o exemplo a seguir:

    <serv_10138>Carta Registrada,3</serv_10138>
    <add_method_0>
        <code>10138</code>
        <from><zip>00000000</zip><weight>0.0</weight><size>0</size></from>
        <to><zip>99999999</zip><weight>0.1</weight><size>30</size></to>
        <price>4.65</price>
        <days>5</days>
    </add_method_0>
    <add_method_1>
        <code>10138</code>
        <from><zip>00000000</zip><weight>0.1</weight><size>0</size></from>
        <to><zip>99999999</zip><weight>0.2</weight><size>30</size></to>
        <price>5.80</price>
        <days>5</days>
    </add_method_1>
    
  2. Através do modelo acima também é possível corrigir uma cotação equivocada. Apesar de incomum, já me deparei com uma resposta dos Correios, informando 1 dia onde o prazo era 11. Enfim este modelo permite que você substitua os valores de Preço e Prazo, de uma cotação válida.

Closes #32: Fretes de mil reais não são mais exibidos como 1 real.

Closes #39: Permite configurar os serviços de entrega separadamente, para cada produto.

Closes #42: Corrige o cálculo do peso cúbico, para pedidos feitos via backend.

Closes #45: Adicionado serviço de PAC Grandes Formatos, com limite de 150 cm de lado, e 300 cm de soma.

Closes #46: Considera produtos que possam ser encaixados, reajustando as dimensões da encomenda.

Closes #59: Corrige o erro 99Input string was not in a correct format, para valores declarados superiores a mil reais.

Closes #16: Adicionada opção de cache para as cotações de frete dos Correios.

  1. A cache é administrada pelo gerenciador de cache do Magento, em Sistema > Gerenciar Cache. Nas configurações da extensão, é possível escolher entre 3 modos de operação:
    • Consultar os Correios; e, se falhar, o Cache (recomendado)
    • Consultar o Cache; e, se falhar, os Correios
    • Consultar somente o Cache
  2. O Magento pode ser configurado para utilizar diferentes sistemas de cache, entre Files, Memcached, APC, Redis, etc (ver arquivo /app/etc/local.xml).
    Entretanto foi adicionado um algoritmo de aproximação do CEP, para sistemas que aceitam o uso de Tags, como Files e Redis.

Closes #15: Adicionada opção de dividir a entrega em mais de um pacote.

Segue os prints:

  • Novos atributos para os produtos:
    image
  • Novas funcionalidades na configuração do módulo:
    image
  • Novo sistema de cache:
    image

…serviços de postagem por produto."

This reverts commit 0b6384c.
Conflicts:
	app/code/community/PedroTeixeira/Correios/Model/Carrier/CorreiosMethod.php
Adicionada opção de produtos que se encaixam
@pedro-teixeira
Copy link
Owner

@jarjar123, você já está usando essas modificações em produção?

Desculpe pela demora no review, estou realmente sem tempo.

@jarjar123
Copy link
Contributor Author

Bom dia, gostaria de informar que testei esta PR nas seguintes situações:

  • Magento 1.7.0.2: Ok
  • Magento 1.9.1.0: Ok
  • Magento 1.9.1.0 + Redis: Ok
  • Magento 1.7.0.2 + Memcache: Ok
  • Magento 1.9.1.0 + Memcache: Ok

Todos os recursos descritos na PR foram testados.
Coloquei a PR em ambiente de produção, com o Magento 1.9.1.0 + Redis.

@pedro-teixeira
Copy link
Owner

Perfeito @jarjar123, obrigado!

@pedro-teixeira pedro-teixeira added this to the v4.4.0 milestone Mar 25, 2015
@pedro-teixeira pedro-teixeira self-assigned this Mar 25, 2015
$this->_loadMidSize();
$tmpMethods = $this->_postMethodsExplode;
foreach ($tmpMethods as $key => $method) {
$isOverSize = ($this->_midSize > $this->getConfigData("validate/serv_{$method}/max/size"));
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Não estou conseguindo entender o que você está fazendo aqui e na _loadMidSize(), pode me explicar?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Criei a _loadMidSize para calcular a dimensão média (ou lado médio, ou média dos lados).

Ao invés de percorrer todos os produtos novamente, e somar cada altura, largura, etc, usei o peso cúbico total _volumeWeight, previamente calculado em _generateVolumeWeight.

Com o peso cúbico em mãos, apenas removi o coeficiente dos Correios, e extraí a raiz cúbica. O resultado foi a média dos lados.
Antes de guardar o resultado, ajustei para que superasse os limites inferiores dos Correios...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Já a função _removeInvalidServices remove os serviços inválidos para o carrinho, baseando-se no peso e soma dos lados.

  • Ex.: 10cm + 20cm + 30cm = 60cm
  • Ex.: 20cm * 3 = 60cm (usando o lado médio)
    Ao término, apenas com o serviços válidos serão cotados.
    Mas se todos os serviços forem removidos, é necessário dividir o pacote, para não perder a venda. Nesse caso chamamos o método _splitPack.
    O que ele faz é apenas dividir os pesos do carrinho, e reiniciar a validação em _removeInvalidServices.

Então _loadMidSize é novamente chamada, pois o tamanho da encomenda agora é menor, e a dimensão média precisa ser recalculada.

E devido a recursividade...
Criei a _loadMidSize para calcular a dimensão média (ou lado médio, ou média dos lados).

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mas tem uma chance de pegar algumas das dimensões padrões e usar para todas as dimensões:

        $pow = round(pow((int) $volumeTotal, (1/3)));
        $x1 = $this->getConfigData('altura_padrao');
        $x2 = $this->getConfigData('largura_padrao');
        $x3 = $this->getConfigData('comprimento_padrao');
        $this->_midSize = max($pow, $x1, $x2, $x3);

Isso significa que em alguns casos pode ter um peso volumétrico completamente diferente, não?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Considerando as medidas padrão nulas (ou mínimas 2 x 16 x 11), não haverá qualquer variação no resultado.
Até 39cm de lado (ou 117cm de soma) não há qualquer mudança na cotação, pois os Correios consideram somente o peso físico.

Particularmente preferiria descartar altura_padrao, larg... e comp....
É tão simples setar esses atributos em massa, que creio serem desnecessários.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Só pra esclarecer melhor...

        $client->setParameterGet('nVlComprimento', $this->_midSize);
        $client->setParameterGet('nVlAltura', $this->_midSize);
        $client->setParameterGet('nVlLargura', $this->_midSize);

Com midSize até 39cm, não faz diferença. Os Correios só vão considerar o peso.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O único ajuste que midSize realmente precisaria é "ser maior que 16cm".
Enviar um valor menor q 16cm geraria erro.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sim, um máximo de 105 também seria bom, não?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Na verdade não.
Essa validação é aplicável somente aos serviços 41068, 81019, etc. E já foi aplicada pelo logista. Além disso não é válida para 10065, 10138, 41300.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Saquei, então só a 16cm.

@jarjar123 jarjar123 mentioned this pull request Mar 27, 2015
@jonatanrdsantos
Copy link
Contributor

E aew galera, tem previsão para a versão 4.4?
Estou precisando da feature de separar as encomendas em vários pacotes quando atinge o limite dos correios.

@pedro-teixeira
Copy link
Owner

Sem previsão @joridos

@pedro-teixeira
Copy link
Owner

@jarjar123, assim que der vou dar uma olhada nas modificações, obrigado!

pedro-teixeira added a commit that referenced this pull request Mar 30, 2015
Serviços por Produto, Validação por Serviço, Grandes Formatos, Carta Registrada, Cache
@pedro-teixeira pedro-teixeira merged commit 03ed7c5 into pedro-teixeira:master Mar 30, 2015
@pedro-teixeira
Copy link
Owner

@jarjar123, muito obrigado por todas as contribuições, fiz algumas modificações, então faz um merge no seu branch.

Fiz um agradecimento especial aqui: https://pedroteixeira.io/modulo-de-frete-para-magento-com-tracking-v4-4-0/

@jarjar123
Copy link
Contributor Author

Segue uma pequena ilustração, pro pessoal entender o comportamento da Cache.
Lembrando que o algoritmo de aproximação é ignorado no memcached, apc, ou outro sistema sem tags.

  • Opção 1: Consultar Correios, e se falhar, a Cache
    opcao 1 - consultar cache se correios falhar
  • Opção 2: Consultar Cache, e se falhar, os Correios
    opcao 2 -consultar correios se cache falhar
  • Opção 3: Consultar somente a Cache
    opcao 3 - consultar somente cache

@pedro-teixeira
Copy link
Owner

Perfeito @jarjar123, vou adicionar esse gráfico na #70.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment