gigapix / frete-correios

Cálculo de frete em PHP com transbordo de caixas.
MIT License
12 stars 13 forks source link

Bugfix - Situação não considerada no código do transbordo #5

Open mtsalcova opened 7 years ago

mtsalcova commented 7 years ago

Olá,

conforme conversamos na issue #3 , criei um novo método (transbordoDeMedida()) para tratar essa questão.

Nesse novo método, passei o array de produtos para calcular novamente a cubagem, só que dessa vez o cálculo é por cada produto, começando pela quantidade, onde vou verificando se a $medida é menor que 66 e inserindo em novas $caixas.

Fico no aguardo do feedback e espero ter ajudado galera, valeu!

gabsprates commented 7 years ago

Opa, massa @mtsalcova!

Farei farei testes e respondo o mais rápido possível! :smiley:

gabsprates commented 7 years ago

Olá @mtsalcova, primeiramente, desculpe pela demora. Foi um fim de ano corrido.

Vamos lá.

Devemos considerar que não sabemos exatamente a forma que os Correios "montam" suas embalagens, mas baseando no modelo que temos seguido aqui, fiz o seguinte teste com os seguintes produtos:

# Produto 1
  [qtd] => 3
  [peso] => 1.5
  [altura] => 39
  [largura] => 63
  [comprimento] => 25

# Produto 2
  [qtd] => 5
  [peso] => 2
  [altura] => 20
  [largura] => 33
  [comprimento] => 44

# Produto 3
  [qtd] => 2
  [peso] => 0.9
  [altura] => 38
  [largura] => 26
  [comprimento] => 46

O volume total é:

 184275  #1
 145200  #2
+ 90896  #3
-----------
 420371

E a medida para esse volume é 420371 ^ (1/3) = 74.9108. Essa situação faz o programa entrar no seu método (transbordoDeMedida), mas encontrei pelo menos um problema, que quebra a soma total do frete.

Você incrementa o $i, índice do array $caixas, apenas se tiver alguma sobra, mas você está considerando sobra apenas de um conjunto de um mesmo produto, e não do total de produtos.

No exemplo que eu fiz, nenhum conjunto de produto entra nessa condição (apesar da medida total exceder o limite de 66cm), e como não há incremento no índice, ele sempre joga o próximo conjunto de produtos na caixa já existente (nesse caso, $caixas[0]), o que no final das contas, deixa apenas uma caixa com apenas com um conjunto de produtos (o último a ser analisado).

Infelizmente, não sabemos como os Correios fazem, mas se houvesse uma forma de testar o resultado final, seria bom.

Acredito que só incrementar o $i também não resolva.

Tente ver o momento que as medidas de um produto excedem a medida limite, talvez isso ajude.