Tambem acontece comigo , o algoritmo de empacotamento , quando pega muitos produtos com medida retangulares diferente ele monta multiplas caixas e por isto o preço sobe. No meu caso estou disposto a travar "máximo = uma caixa dimensão maxima" e caso venha a necessitar de 2 caixas ai eu pagaria pelo frete da segunda. So que não estou conseguindo fazer isto. alguem teria alguma dica se seria possivel travar o incremental de caixas do algoritmo =1? copiei ele abaixo .
Sei dos riscos sobre esta açao, mas o perfil de compra dos meus clientes minimizam este risco.
muito obrigado!
Mauricio
// 'empacota' os produtos do carrinho em caixas com dimensões e peso dentro dos limites definidos pelos Correios
// algoritmo desenvolvido por: Thalles Cardoso <
thallescard@gmail.com>
private function organizarEmCaixas($produtos) {
$caixas = array();
foreach ($produtos as $prod) {
$prod_copy = $prod;
// muda-se a quantidade do produto para incrementá-la em cada caixa
$prod_copy['quantity'] = 1;
// todas as dimensões da caixa serão em cm e kg
$prod_copy['width'] = $this->getDimensaoEmCm($prod_copy['length_class_id'], $prod_copy['width']);
$prod_copy['height']= $this->getDimensaoEmCm($prod_copy['length_class_id'], $prod_copy['height']);
$prod_copy['length']= $this->getDimensaoEmCm($prod_copy['length_class_id'], $prod_copy['length']);
// O peso do produto não é unitário como a dimensão. É multiplicado pela quantidade. Se quisermos o peso unitário, teremos que dividir pela quantidade.
$prod_copy['weight']= $this->getPesoEmKg($prod_copy['weight_class_id'], $prod_copy['weight'])/$prod['quantity'];
$prod_copy['length_class_id'] = $this->config->get('config_length_class_id');
$prod_copy['weight_class_id'] = $this->config->get('config_weight_class_id');
$cx_num = 0;
for ($i = 1; $i <= $prod['quantity']; $i++) {
// valida as dimensões do produto com as dos Correios
if ($this->validar($prod_copy)){
// cria-se a caixa caso ela não exista.
isset($caixas[$cx_num]['weight']) ? true : $caixas[$cx_num]['weight'] = 0;
isset($caixas[$cx_num]['height']) ? true : $caixas[$cx_num]['height'] = 0;
isset($caixas[$cx_num]['width']) ? true : $caixas[$cx_num]['width'] = 0;
isset($caixas[$cx_num]['length']) ? true : $caixas[$cx_num]['length'] = 0;
$new_width = $caixas[$cx_num]['width'] + $prod_copy['width'];
$new_height = $caixas[$cx_num]['height'] + $prod_copy['height'];
$new_length = $caixas[$cx_num]['length'] + $prod_copy['length'];
$new_weight = $caixas[$cx_num]['weight'] + $prod_copy['weight'];
$cabe_do_lado = ($new_width <= $this->largura_max) && $this->somaDimDentroLimite($caixas, $prod_copy, $cx_num, 'lado');
$cabe_no_fundo = ($new_length <= $this->comprimento_max) && $this->somaDimDentroLimite($caixas, $prod_copy, $cx_num, 'fundo');
$cabe_em_cima = ($new_height <= $this->altura_max) && $this->somaDimDentroLimite($caixas, $prod_copy, $cx_num, 'cima');
$peso_dentro_limite = ($new_weight <= $this->peso_max);
// o produto cabe na caixa
if (($cabe_do_lado || $cabe_no_fundo || $cabe_em_cima) && $peso_dentro_limite) {
// já existe o mesmo produto na caixa, assim incrementa-se a sua quantidade
if (isset($caixas[$cx_num]['produtos'][$prod_copy['key']])) {
$caixas[$cx_num]['produtos'][$prod_copy['key']]['quantity']++;
}
// adiciona o novo produto
else {
$caixas[$cx_num]['produtos'][$prod_copy['key']] = $prod_copy;
}
// aumenta-se o peso da caixa
$caixas[$cx_num]['weight'] += $prod_copy['weight'];
// ajusta-se as dimensões da nova caixa
if ($cabe_do_lado) {
$caixas[$cx_num]['width'] += $prod_copy['width'];
// a caixa vai ficar com a altura do maior produto que estiver nela
$caixas[$cx_num]['height'] = max($caixas[$cx_num]['height'], $prod_copy['height']);
// a caixa vai ficar com o comprimento do maior produto que estiver nela
$caixas[$cx_num]['length'] = max($caixas[$cx_num]['length'], $prod_copy['length']);
}
else if ($cabe_no_fundo) {
$caixas[$cx_num]['length'] += $prod_copy['length'];
// a caixa vai ficar com a altura do maior produto que estiver nela
$caixas[$cx_num]['height'] = max($caixas[$cx_num]['height'], $prod_copy['height']);
// a caixa vai ficar com a largura do maior produto que estiver nela
$caixas[$cx_num]['width'] = max($caixas[$cx_num]['width'], $prod_copy['width']);
}
else if ($cabe_em_cima) {
$caixas[$cx_num]['height'] += $prod_copy['height'];
//a caixa vai ficar com a altura do maior produto que estiver nela
$caixas[$cx_num]['width'] = max($caixas[$cx_num]['width'], $prod_copy['width']);
//a caixa vai ficar com a largura do maior produto que estiver nela
$caixas[$cx_num]['length'] = max($caixas[$cx_num]['length'], $prod_copy['length']);
}
}
// tenta adicionar o produto que não coube em uma nova caixa
else{
$cx_num++;
$i--;
}
}
// produto não tem as dimensões/peso válidos então abandona sem calcular o frete.
else {
$caixas = array();
break 2; // sai dos dois foreach
}
}
}
return $caixas;
}