reversing the average cost of a product

Asked

Viewed 42 times

0

I’m calculating the average cost of a product using php. I can calculate the average cost smoothly, the error occurs when I try to reverse the calculation.

My code returns this:

Novo cuto médio é: 36,56 

O custo médio antigo é: 38,35

When that would be right:

Novo cuto médio é: 36,56 

O custo médio antigo é: 35,24

Can anyone help me locate the problem? Follow my code:

    $custo_antigo = 35.24;
    $estoque_antigo = 100;

    $custo_compra = 36.23;
    $estoque_compra = 133;
    $encargos_compra = 1.33;


    // Calcula custo médio do produto
    $total_em_estoque = $estoque_antigo * $custo_antigo;
    $total_do_estoque = $estoque_antigo;

    $total_em_compra = $estoque_compra * ($custo_compra + $encargos_compra);
    $calculo_valor = $total_em_estoque + $total_em_compra;

    $calculo_estoque = $estoque_compra + $total_do_estoque;
    $custo_medio_final = $calculo_valor / $calculo_estoque;

    // Formata numero
    $custo_formatado = number_format($custo_medio_final, 2, ',', '.');

    echo "Novo cuto médio é: $custo_formatado <br><br>";


    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    $custo_antigo = 35.81;
    $estoque_antigo = 233;

    $custo_compra = 36.23;
    $estoque_compra = 133;
    $encargos_compra = 1.33;

    // 1º Pega valor do estoque antigo
    $qtd_antiga = $estoque_antigo - $estoque_compra;

    // 2º Total atual
    $total_geral = (($custo_antigo + $encargos_compra) * $estoque_antigo);

    // 3º total da compra 
    $total_compra = ($estoque_compra * $custo_compra);

    // 4º pega custo antigo
    $custo_antigo = ($total_geral - $total_compra) / $qtd_antiga;


    // Formata numero
    $custo_formatado = number_format($custo_antigo, 2, ',', '.');

    echo "O custo médio antigo é: $custo_formatado";
  • I don’t understand why revert if you already have the original up there.

  • this is an example, in real situation I do not have the original, which is lost according to the stock entries.

1 answer

2


To be able to reverse you need to store the $calculo_valor and the $calculo_estoque of the first block of calculation. For that reason, I will call $valor_antigo_2 and $estoque_antigo_2 the variables in the second block that refer to them.

To reverse the calculation you need to reverse each of the values, and this can be done as follows:

$estoque_antigo = $estoque_antigo_2 - $estoque_compra;

$custo_antigo = ($valor_antigo_2 - ($estoque_compra * ($custo_compra + $encargos_compra))) / 
                ($estoque_antigo_2 - $estoque_compra);

That is, the code starts to work like this:

$custo_antigo = 35.24;
$estoque_antigo = 100;

$custo_compra = 36.23;
$estoque_compra = 133;
$encargos_compra = 1.33;

$total_em_estoque = $estoque_antigo * $custo_antigo; // 3524
$total_do_estoque = $estoque_antigo; // 100

$total_em_compra = $estoque_compra * ($custo_compra + $encargos_compra); // 4995,48
$calculo_valor = $total_em_estoque + $total_em_compra; // 8519,48

$calculo_estoque = $estoque_compra + $total_do_estoque; // 233
$custo_medio_final = $calculo_valor / $calculo_estoque; // 36,56429...

Reversing:

$estoque_antigo_2 = $calculo_estoque; // 233
$valor_antigo_2 = $calculo_valor; // 8519,48

$estoque_antigo = $estoque_antigo_2 - $estoque_compra; // 100

$custo_antigo = ($valor_antigo_2 - ($estoque_compra * ($custo_compra + $encargos_compra))) /
                ($estoque_antigo_2 - $estoque_compra); // 35.24
  • very good, but it doesn’t work if I feed the product several times, and cancel everything. In other words, the price never goes back to what it was before. What should I do?

  • As I said at the beginning of the answer, you need to keep the value and stock resulting from each of the calculations. If you perform the calculation several times without reversing, you need to save the data for each of them and use it when reversing. If you need to reverse many calculations I recommend not to use this "process and rewind", simply store the data in a history table and search for this data when you need it.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.