claudiosanches / woocommerce-correios

Correios shipping to the WooCommerce WordPress plugin
http://wordpress.org/plugins/woocommerce-correios/
GNU General Public License v2.0
155 stars 96 forks source link

Possível melhoria no Calculo de Cubagem #262

Open sebosfato opened 1 year ago

sebosfato commented 1 year ago

Notei que as medidas do pacote não ficam como deveriam…

`

O economic so mostra com poucas gramas acima de 150 gramas ja não mostra

Neste exemplo abaixo não mostra e as medidas está errado era pra ser 6 x 21 x 27
ta retornando assim no log….
10-30-2023 @ 12:49:06 - Weight and cubage of the order: Array
(
[weight] => 362
[height] => 11.4
[width] => 11.4
[length] => 27
)

As medidas não esta pegando do produto tmb exatamente na vdd.. neste log deveria ser tipo 6 x 21 x 27… mas ficou 11x11x27

///

no caso o produto tem um valor de 170 dolares… então deveria talvez aumentar com o seguro o frete ta dando uns 35 dolares 38 .. dá o mesmo preço para um produto de 1 dolar… !!

////

o economic aparece só se forem poucas gramas como neste log aqui
(
[weight] => 10
[height] => 3.2
[width] => 11
[length] => 16
)

Se quiser dar uma olhada nele funcionando ta ativo la no site da gardentoy…

Acredito que a forma de somar as cubagens pode estar causando isso…

Neste exemplo abaixo micro aspersor com 30 unidades ja não aparece o economic… 150gr
10-30-2023 @ 13:08:46 - Weight and cubage of the order: Array
(
[weight] => 150
[height] => 12.5
[width] => 12.5
[length] => 16
)

as medidas dele

Weight 0.005kg
4 × 3.5 × 1.5 cm  

como pode ver o 16 ficou constante então deve ter algo estranho no código

No caso de cima tmb o comprimento é a unica medida correta..

mesmo o peso cubado de 12,5x12,5x16 daria 0,5kg

Desculpe se talvez este não for o local adequado para a discussão me avisa.. só achei que talvez com esses feedbacks fique mais facil corrigir os bugs talvez..

`
sebosfato commented 1 year ago

Acredito que a forma que a cubagem esta calculando esta mantendo um dos lados da caixa fixo e dividindo os outros lados para dar o outro valor isso da um volume diferente até…

parece que esta tentando manter um dos lados maiores e multiplicando e depois tirando a raiz dos outros dois lados…

eu to tentando desenvolver um algoritimo aqui pra calcular para um outro plugin de integração que estou fazendo aqui talvez possa ser util e talvez ajude a melhorar a forma que os fretes são caulados…

a ideia é ele ir somando os volumes de cada item com base no volume de algumas caixas padrão, que pode definir dai ele vai enchendo as caixas lendo todos os itens do carrinho um por um …

dai da pra definir nas classes de entrega qual tipo de caixa cada item deve ir na pagina de cada produto… e fazer de modo que se houverem caixas maiores no pedido os outros itens tentem ser colocados junto até completar a caixa… (esvaziando alguma caixa menor por ex para tentar encher a maior )

coisas simples mas que podem ajudar a oferecer talvez um frete mais barato quem sabe…

Se tiver interesse segue o código.. ainda esta meio esqueleto disso que descrevi pois ainda nao terminei mas falta pouco pra ficar como descrevi…

global $boxWeightLimit; global $boxDimensions;

$boxWeightLimit = 30; // kg $boxDimensions = ['length' => 10, 'width' =>10, 'height' => 10]; // in cm

$sumCubageWeight = 0; $totalWeight = 0; global $boxDimensions; // Set the dimensions for each box (adjust as needed) global $boxWeightLimit; // kg

$boxVolume = $boxDimensions['length'] $boxDimensions['width'] $boxDimensions['height'];

// Initialize variables for box calculations $boxes = []; $currentBox = ['totalWeight' => 0, 'totalVolume' => 0, 'items' => [], 'sumCubageWeight' => 0];

    foreach ($contents as $item) {
        $product = $item['data'];

        // Check if the product is a WC_Product_Simple object
        if ($product instanceof WC_Product_Simple) {
          $dimensions_string = wc_format_dimensions($product->get_dimensions(false));

          // $dimensions_string = $product->get_dimensions();

          // Use regular expression to extract numeric values
          preg_match_all('/(\d+)/', $dimensions_string, $matches);

          // $matches[0] contains all numeric values
          $dimensions = $matches[0];

          // Get the quantity of the current product
          $quantity = $item['quantity'];

          // Calculate cubage weight for the current product
          $cubageWeight = isset($dimensions[0]) && isset($dimensions[1]) && isset($dimensions[2])
              ? ($dimensions[0] * $dimensions[1] * $dimensions[2]) / 5000 // Use the divisor you mentioned
              : 0;

          // Calculate volume for the current product, considering quantity
          $productVolume = isset($dimensions[0]) && isset($dimensions[1]) && isset($dimensions[2])
              ? ($dimensions[0] * $dimensions[1] * $dimensions[2])  // Use the divisor you mentioned
              : 0;

          // Get the weight of the current product
          $weight = $product->get_weight();

          // Accumulate cubage weights based on quantity
          $sumCubageWeight += $cubageWeight;

          // Accumulate total weight based on quantity
          $totalWeight += $weight * $quantity;

          // Check if the current product fits into the current box
          while ($quantity > 0) {
          while (
        $currentBox['totalWeight'] + $weight <= $boxWeightLimit &&
        $currentBox['totalVolume'] + $productVolume <= $boxVolume &&
        $quantity > 0
        ) {
        // Add each item separately based on its quantity
        $currentBox['items'][] = $item;
        $currentBox['totalWeight'] += $weight;
        $currentBox['totalVolume'] += $productVolume;
        $currentBox['sumCubageWeight'] += $cubageWeight;

        // Decrease quantity by 1
        $quantity--;
        }

        // If there's still quantity remaining, start a new box
        if ($quantity > 0) {
        // Start a new box for the current product
        $boxes[] = $currentBox;
        $currentBox = ['totalWeight' => 0, 'totalVolume' => 0, 'items' => [], 'sumCubageWeight' => 0];

        // Add one item to the new box
        $currentBox['items'][] = $item;
        $currentBox['totalWeight'] += $weight;
        $currentBox['totalVolume'] += $productVolume;
        $currentBox['sumCubageWeight'] += $cubageWeight;

        // Decrease quantity by 1
        $quantity--;
        }}
        }

}

// Add the last box to the list if (!empty($currentBox['items'])) { $boxes[] = $currentBox; }

//echo print_r($package); //error_log(print_r($ship_to, true)); // Output the number of boxes and their details echo "\nNumber of Boxes: " . count($boxes) . "\n";

echo $first_name; echo " " . $last_name;

foreach ($boxes as $boxIndex => $box) {

$heavier =$box['sumCubageWeight']; $heavier = ($box['totalWeight'] > $heavier) ? $box['totalWeight'] : $heavier; $boxIndexed= $boxIndex+1;

echo "\n Box $boxIndexed:\n"; echo " Number of Items: " . count($box['items']) . "\n"; echo " Volume of sending box: {$boxVolume} cm3
"; echo " Length {$boxDimensions['length']} cm, Width {$boxDimensions['width']} cm, Height {$boxDimensions['height']} cm\n"; echo " Order Total Volume: {$box['totalVolume']} cm3 \n"; echo " CubageWeight: {$box['sumCubageWeight']} kg
"; echo " Real Weight: {$box['totalWeight']} kg
"; echo " Heaviest Weight: $heavier kg
"; echo $dimensions[0]; // DIMENSAO QUE VEM DO PACKAGE / POR PRODUTO echo $dimensions[1]; echo $dimensions[2]; echo ($boxDimensions['length']); echo ($boxDimensions['width']); echo ($boxDimensions['height']); echo '

';
echo "Loja " . $store_name . '
'; echo $store_address . (isset($address_line_2) ? ', ' . $address_line_2 : '') . ', ' . $store_city . ', ' . $store_postcode . ', ' . $store_country . ', ' . $store_state; echo '
'; echo "Código do Pais de Destino " . $ship_to['country'],'
'; echo "Valor total da Compra " . $contentsCost, '
'; // PREÇO TOTAL DA MERCADORIA

}

usei o gpt pra ir fazendo e aprendendo isso ..

sebosfato commented 1 year ago

No plugin que estou fazendo da U. P. S. , o request para rates retorna ja todos os serviços e preços com uma chamada de api…usando as informações do package carrinho, não sei se o correio tem essa mas seria bacana pois aumenta a velocidade um pouco acho…

no checkout são gerados os checkbox conforme os serviços disponíeis e

ao criar a finalizar a compra ou algum outro trigger para gerar a etiqueta tudo é recalculado mas usando as informações do billing,,,

claudiosanches commented 1 year ago

Por favor, me um Pull Request, assim posso analisar melhor.

sebosfato commented 1 year ago

Vou fazer aqui… por algum motivo united stated não aparece quando uso o site em ingles agora após atualizar… talvez pau do plugin GTranslate de tradução…

no log após a atualização aparece somente isso mesmo ativando debug no wordpress..

11-01-2023 @ 15:55:19 - Weight and cubage of the order: Array ( [weight] => 362 [height] => 11.4 [width] => 11.4 [length] => 27 )

como faço para te passar esse pull request?

sebosfato commented 1 year ago

apos a ultima atualização o log ta saindo só assim : 11-01-2023 @ 16:24:30 - Weight and cubage of the order: Array ( [weight] => 362 [height] => 11.4 [width] => 11.4 [length] => 27 ) mesmo ativando o debug no wordpress..

como faço pra ver a pull request pra vc?