Jump to content
Fórum Script Brasil
  • 0

como fazer a divisao da taxa de entrega quando é um numero impar


adrsublimacao

Question

exemplo tenho um foreach de produtos

 

 

$vTotalBC = 0;
$vTotalICMS = 0;
$vTotalvICMSDesonv = 0;
$vTotalvFCP = 0.00; //incluso no layout 4.00
$vTotalvBCST = 0.00;
$vTotalvST = 0.00;
$vTotalvFCPST = 0.00; //incluso no layout 4.00
$vTotalvFCPSTRet = 0.00; //incluso no layout 4.00
$vtotalIPI  = 0.00;
$vtotalPIS  = 0.00;
$vtotalCOFINS = 0.00;
$impostototal = 0.00;
$valortotal = 0.00;
$descontototal = 0.00;
$pesototal = 0.00;
$fretetotal = 0.00;
$outrototal = 0.00;
$x = 0;
$y = 0;

 

foreach($_REQUEST['produtos'] as $prod){
$y++;
}

foreach($_REQUEST['produtos'] as $prod ){    
$item = $x + 1;
    
$codigo = RmvString($_REQUEST['produtos'][$x]['item'], 2);    // CODIGO DO PRODUTO

$nomeproduto = RmvString($_REQUEST['produtos'][$x]['nome'], 2);    // CODIGO DO PRODUTO

$ncm = RmvString($_REQUEST['produtos'][$x]['ncm'], 2);      // NOME DO PRODUTO

$cfop = RmvString($_REQUEST['produtos'][$x]['cfop']);      // NOME DO PRODUTO

$un = RmvString($_REQUEST['produtos'][$x]['unidade']);      // NOME DO PRODUTO

$quantidade = RmvString($_REQUEST['produtos'][$x]['quantidade']);      // NOME DO PRODUTO

$valor = RmvString($_REQUEST['produtos'][$x]['subtotal']);      // NOME DO PRODUTO

$cst = RmvString($_REQUEST['produtos'][$x]['cst']);      // NOME DO PRODUTO

$pis = RmvString($_REQUEST['produtos'][$x]['pis']);      // NOME DO PRODUTO

$cofins = RmvString($_REQUEST['produtos'][$x]['cofins']);      // NOME DO PRODUTO

$origem = RmvString($_REQUEST['produtos'][$x]['origem']);      // NOME DO PRODUTO

$ean = RmvString($_REQUEST['produtos'][$x]['ean']);               // Cdigo EAN

$peso = ($_REQUEST['produtos'][$x]['peso']);           // Peso em KG. Ex: 800 gramas = 0.800 KG   // NOME DO PRODUTO


$total = ($quantidade * $valor );
 

 

//dentro do foreach tem a taxa vamos dizer q tenho 3 items no pedido e a taxa é 5 reais ao dividir 5 / 3 = 1.67 ai no final daria 5,01 em vez de  5 tem como eu pegar essa taxa e no final //acertar essa diferenca quando a divisao não é inteira

//a variavel $y armazena a quantidade de itens no caso a baixo to pegando a taxa / pela quantidade de itens

if(RmvString($_REQUEST['pedido']['frete'])!="" && $_REQUEST['pedido']['frete']>0){    
    $frete = $_REQUEST['pedido']['frete'] / $y;

}else{
    $frete = "";    
    $frete_total = "";
}

 

$fretetotal = $fretetotal + $frete;

//acima do armazenando o total do frete na variavel $fretetotal

 

}

}

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Mas 5 / 3, deveria ser igual a 1.666666666666667, que multiplicado por 3, é igual a 5
por quê a sua divisão está arredondando para 1.67?

Edited by lowys
Link to comment
Share on other sites

  • 0

Eu sempre jogo a diferença no útlimo item na hora de ratear o frete:

<?php
function dec($valor){return number_format($valor,2,",",".");}
$frete=5;
$produtos=['maçã'=>10,"pera"=>20,"laranja"=>30];
$pesoTotal=0;
foreach($produtos as $produto=>$peso){$pesoTotal+=$peso;}
$ultimoItem=end($produtos);
$ultimaChave=key($produtos);
$verificador=0;
echo "<table><th>Produto<th>Peso<th>Frete";
foreach($produtos as $produto=>$peso){
  $fretePorItem=intval($frete*$peso/$pesoTotal*100)/100;
  $verificador+=$fretePorItem;
  if($produto==$ultimaChave){$fretePorItem+=$frete-$verificador;}
  echo "<tr><td>$produto<td>$peso<td align=right>".dec($fretePorItem);}
echo "<tr><td><th>Total<th align=right>".dec($frete)."</table>";

 

 

Captura de tela 2023-12-05 110907.png

Edited by Frank K Hosaka
Link to comment
Share on other sites

  • 0
58 minutos atrás, lowys disse:

Mas 5 / 3, deveria ser igual a 1.666666666666667, que multiplicado por 3, é igual a 5
por quê a sua divisão está arredondando para 1.67?

porque pra parte fiscal vai redondo se for 1.66 x 3 daria 4,98

e se fosse aredondar pra mais 1,67 * 3 = 5,01

o que queria é o seguinte quando chegasse no ultimo item no casso no item 3 que no exemplo q dei seria 3 itens o valor de $Y quando chegasse no ultimo item somava todos os item anterios e diminuia pelo 5 ai o ultimo item ficaria com a diferenca pra fechar os 5

exemplo

taxa tem 1 = 5 reais / 3 =  1,67

taxa item 2 = 5 reais / 3 = 1,67 

ai no ultimo taxa item 3 serai  o valor da taxa - a soma das duas taxas anteriores

ou seja 5 reais - 1,67 - 1,67 = 1,66

queria uma regra pra fazer isso indiferente quantos item tiver sem o ultimo item soma tudo antes de taxa e pega somente o q faltar pra fechar

 

 

Link to comment
Share on other sites

  • 0
$vTotalBC = 0;
$vTotalICMS = 0;
$vTotalvICMSDesonv = 0;
$vTotalvFCP = 0.00; //incluso no layout 4.00
$vTotalvBCST = 0.00;
$vTotalvST = 0.00;
$vTotalvFCPST = 0.00; //incluso no layout 4.00
$vTotalvFCPSTRet = 0.00; //incluso no layout 4.00
$vtotalIPI  = 0.00;
$vtotalPIS  = 0.00;
$vtotalCOFINS = 0.00;
$impostototal = 0.00;
$valortotal = 0.00;
$descontototal = 0.00;
$pesototal = 0.00;
$fretetotal = 0.00;
$outrototal = 0.00;
$x = 0;
$y = 0;

foreach($_REQUEST['produtos'] as $prod){
    $y++;
}

foreach($_REQUEST['produtos'] as $prod ){    
    $item = $x + 1;
    
    $codigo = RmvString($_REQUEST['produtos'][$x]['item'], 2);    // CODIGO DO PRODUTO
    $nomeproduto = RmvString($_REQUEST['produtos'][$x]['nome'], 2);    // NOME DO PRODUTO
    $ncm = RmvString($_REQUEST['produtos'][$x]['ncm'], 2);      // NOME DO PRODUTO
    $cfop = RmvString($_REQUEST['produtos'][$x]['cfop']);      // NOME DO PRODUTO
    $un = RmvString($_REQUEST['produtos'][$x]['unidade']);      // NOME DO PRODUTO
    $quantidade = RmvString($_REQUEST['produtos'][$x]['quantidade']);      // NOME DO PRODUTO
    $valor = RmvString($_REQUEST['produtos'][$x]['subtotal']);      // NOME DO PRODUTO
    $cst = RmvString($_REQUEST['produtos'][$x]['cst']);      // NOME DO PRODUTO
    $pis = RmvString($_REQUEST['produtos'][$x]['pis']);      // NOME DO PRODUTO
    $cofins = RmvString($_REQUEST['produtos'][$x]['cofins']);      // NOME DO PRODUTO
    $origem = RmvString($_REQUEST['produtos'][$x]['origem']);      // NOME DO PRODUTO
    $ean = RmvString($_REQUEST['produtos'][$x]['ean']);               // Cdigo EAN
    $peso = ($_REQUEST['produtos'][$x]['peso']);           // Peso em KG. Ex: 800 gramas = 0.800 KG   // NOME DO PRODUTO
    $total = ($quantidade * $valor );
    
    // Calcula o frete por item
    if (isset($_REQUEST['pedido']['frete']) && $_REQUEST['pedido']['frete'] > 0) {
        $frete_por_item = $_REQUEST['pedido']['frete'] / $y;
    } else {
        $frete_por_item = 0;
    }
    
    // Adiciona o frete por item ao total do frete
    $fretetotal += $frete_por_item;

    $x++;
}

// Ajusta o total do frete para ser o mesmo que o total pago
$total_frete_ajustado = $_REQUEST['pedido']['frete'] - ($frete_por_item * ($y - 1));
$fretetotal += $total_frete_ajustado;

Calculamos o valor do frete por item dividindo o valor total do frete pelo número total de itens no pedido.
Adicionamos o valor do frete por item ao total do frete.
No final, ajustamos o total do frete para garantir que a soma de todos os valores de frete por item seja igual ao total do frete original.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...