php – Problemas na manutenção de produtos em estoque e erro no cálculo da devolução


A tabela itens_venda registra as vendas.

inserir a descrição da imagem aqui

Depois que um registro é inserido na tabela itens_devolução deve registrar a quantidade de produtos devolvidos.

inserir a descrição da imagem aqui

Só que alguns erros estão acontecendo depois que o registro de inserção de registro de produtos para devolução é inserido:

  • A coluna do campo valor_devolucao da tabela itens_devolução não retorna o valor correto deveria ser 67.47 ao invés de 37.48 (Ex: 22.49 * 3 = 67.47)

  • O registro da tabela itens_venda retorna a quantidade errada, está retornando 3 ao invés de 2 e não está atualizando o valor_total para 44.98 ao invés de 112.45 (na verdade eu esqueci de fazer esse cálculo).

inserir a descrição da imagem aqui

Os erros registrados no navegador são:

// Está sempre caindo no else da condição
A quantidade digitada para devolução é maior que a vendida, não é possível a inserção da devolução.

// Variável indefinida 
Notice: Undefined variable: calculo_reposicao
<form method="POST">
    <p> ID item venda:
        <select onclick="buscaDados()" name="cd_itens_venda">
            <option value=""> </option>
                <?php
                    foreach ($resultado_itens as $v1) {
                        echo "<option value='{$v1('cd_itens_venda')}'>{$v1('cd_itens_venda')}</option>";
                    }
                ?>
        </select>
    </p>
    <p> ID produto:
        <select name="cd_produto" required="">
            <option value=""> </option>
                <?php
                    foreach ($resultado_produto as $v2) {
                        echo "<option value='{$v2('cd_produto')}'>{$v2('nome')}</option>";
                    }
                ?>
        </select>
    </p>
    <p> Quantidade: <input type="number" name="quantidade" size=30 step="0.01" required=""> </p>
    <p> Valor da venda: <input type="text" name="valor_venda" id="valor_venda" size=30 required=""> </p>
    <p> Motivo da devolução:
        <select name="motivo_devolucao" required="" >
            <option value=""></option>
            <option value="Produto danificado">Produto danificado</option>
            <option value="Tamanho errado">Tamanho errado</option>
            <option value="Gênero errado de roupa">Gênero errado de roupa</option>
            <option value="Arrependimento da compra">Arrependimento da compra</option>
        </select>
    </p>
    <button name="Inserir" > Cadastrar itens devolução </button>
</form>
<?php  
    // Inclusão do arquivo conexao.php ao insert_itens_devolucao.php
    require_once '../conexao/conexao.php'; 
    // Se existir o botão de Inserir
    if (isset($_POST('Inserir'))) {
        // Especifica a variável
        $cd_itens_venda = $_POST('cd_itens_venda');
        $cd_produto = $_POST('cd_produto');
        $quantidade = $_POST('quantidade');
        $valor_venda = $_POST('valor_venda');
        $motivo_devolucao = $_POST('motivo_devolucao');
        // Realiza o cálculo do valor de devolução
        $valor_devolucao = $valor_venda / $quantidade;
        // Se a atualização for possível de realizar
        try {

            // Tabela ITENS_VENDA
            // Quantidade inicial na tabela itens_venda
            $procurar_produto = "SELECT quantidade FROM itens_venda WHERE cd_itens_venda = :cd_itens_venda";
            // $busca_registro recebe $procurar_produto que prepara sua operação de busca
            $busca_registro = $conexao->prepare($procurar_produto);
            // Vincula um valor a um parâmetro
            $busca_registro->bindValue(':cd_itens_venda',$cd_itens_venda);
            // Executa a operação
            $busca_registro->execute();
            // Retorna uma matriz contendo todas as linhas do conjunto de resultados
            $linha = $busca_registro->fetch(PDO::FETCH_ASSOC);
            // Variável que recebe a quantidade do registro
            $quantidade_antiga = $linha('quantidade'); 

            // Método que inicializa a(s) transação(ões)
            $conexao->beginTransaction();
            // Query que faz a inserção 
            $insercao = "INSERT INTO itens_devolucao (cd_itens_venda,cd_produto,quantidade,
            valor_venda,valor_devolucao,motivo_devolucao,data_devolucao) 
            VALUES (:cd_itens_venda,:cd_produto,:quantidade,:valor_venda,
            :valor_devolucao,:motivo_devolucao,CURRENT_TIMESTAMP())";
            // $atualiza_dados recebe $conexao que prepare a operação de atualização
            $insere_dados = $conexao->prepare($insercao);
            // Vincula um valor a um parâmetro
            $insere_dados->bindValue(':cd_itens_venda',$cd_itens_venda);
            $insere_dados->bindValue(':cd_produto',$cd_produto);
            $insere_dados->bindValue(':quantidade',$quantidade);
            $insere_dados->bindValue(':valor_venda',$valor_venda);
            $insere_dados->bindValue(':valor_devolucao',$valor_devolucao);
            $insere_dados->bindValue(':motivo_devolucao',$motivo_devolucao);
            // Executa a operação
            $insere_dados->execute();

            // TABELA ITENS_VENDA
            if ($quantidade < $quantidade_antiga) {
                // Haverá retirada da quantidade da tabela itens_venda (caso a nova quantidade seja menor que a antiga)
                $calculo_reposicao = "UPDATE itens_venda SET quantidade = quantidade - ('$quantidade_antiga'-:quantidade) WHERE cd_itens_venda = :cd_itens_venda";
            }else{
                // Caso a quantidade de devolução seja maior que a quantidade vendida
                echo "A quantidade digitada para devolução é maior que a vendida, não é possível a inserção da devolução.";
            }
            // $quantidade_devolucao recebe $conexao que prepara a transação para atualiza o estoque na tabela itens_venda
            $quantidade_devolucao = $conexao->prepare($calculo_reposicao);
            // // Vincula um valor a um parâmetro da tabela itens_venda
            $quantidade_devolucao->bindValue(':cd_itens_venda',$cd_itens_venda);
            $quantidade_devolucao->bindValue(':quantidade',$quantidade);
            // Executa a operação
            $quantidade_devolucao->execute();
            // Confirma a execução das query's em todas as transações  
            $conexao->commit();
        // Se a atualização não for possível de realizar
        } catch (PDOException $falha_insercao) {
            echo "A insercão não foi feita".$falha_insercao->getMessage();
        }
    }
    // Query que seleciona chave da tabela itens_venda
    $seleciona_itens = $conexao->query("SELECT cd_itens_venda FROM itens_venda");
    // Resulta em uma matriz
    $resultado_itens = $seleciona_itens->fetchAll();

    // Query que seleciona chave e nome do produto
    $seleciona_produto = $conexao->query("SELECT cd_produto, nome FROM produto");
    // Resulta em uma matriz
    $resultado_produto = $seleciona_produto->fetchAll();
?>