Ir para conteúdo
Fórum Script Brasil
  • 0

Como diluir um valor em campos diferentes - PHP


Marcio Marins

Pergunta

Saudações a todos! 

Estou fazendo um controle de almoxarifado (PHP e MYSQL).

Nele, tenho as tabelas "item" ,  "pedidos", "saidas" e "entradas".

De um determinado item, pode haver apenas uma saída por pedido, porém pode haver varias entradas deste item. 

UM usuário pede 10 resmas de papel mas deste papel eu tenha entradas mais antigas que as outras (um entrada com 3 resmas e outras com 20).

Eu preciso retirar 3 resmas da primeira entrada e 7 da segunda  atualizado seus valores. 

ENTRADAS

 entradas.thumb.png.99307697c8b316b33a266b0b581ea34e.png

SAIDAS

saidas.thumb.png.6f968648e0be283bee245680c5a1700a.png

RESULTADOS DAS PEQUISADOS

pedido.thumb.png.11e64e5bb3dfd3e8c0f97c866a38e14f.png

 

Tentei estes foreach aninhados, mas não sei como diluir o valor da saída em duas entradas diferentes automaticamente.

Como a quantidade solicitada é 4 e eu tenho a primeira entrada com 2 unidades, tinha que aparecer 2 no primeiro e o resto no segundo aproveitando a segunda entrada. 

Quando outro pedido fosse feito deste mesmo item, só apareceria a segunda entrada com 3 unidades disponíveis porque dela teriam sido retiradas duas unidades no pedido anterior. 

Desculpem se me alonguei muito!!

   foreach ($saidas as $s) {
			   $linha = "<div class='linha_item row col-12 input-group text-center  ' >";
			   $linha .= "<input id='item_$s->id' type='hidden' name='id_item[$s->id]' sue='' />";
			   $linha .="<div class='contagem  form-control pl-5'>";
			   $linha .= $numerar++;
			   $linha .="</div>";
			   $linha .="<div class='desc  form-control '>";
			   $linha .= $s->nome;
			   $linha .="</div>";
			   $linha .="<div class='fornecimento  form-control '>";
			   $linha .= $s->fornecimento;
			   $linha .="</div>";
			   $linha .="<div class='fornecimento  form-control '>";
			   $linha .= $s->qtd_solicitada;
			   $linha .="</div>";
			   $linha .="</div>";
			   $linha .= "<div class='linha_item row col-12 input-group text-center  ' >";
			   $linha .="</div>";

			   echo $linha;
			   $ent = NEW Implementa();
			   $ent->setTable("entradas");
			   $ent->setTermos(" WHERE id_item = " . $s->id_item . " AND qtd > qtd_consumida ORDER BY data_entrada ASC ");
			   $exec_ent = NEW ServiceDb($ent);
			   $entradas = $exec_ent->listar();
			   echo "<span class='mt-1 ml-4'>Entradas</span>";
			   foreach ($entradas as $e) {
				  $linha = "<div class=' col-12 input-group text-center ml-3 ' >";
				  $linha .="<div class='contagem  form-control '>";
				  $linha .= "Data:" . $data->Fdb($e->data_entrada);
				  $linha .="</div>";
				  $linha .="<div class='contagem  form-control '>";
				  $linha .= "Quantidade: " . $e->qtd;
				  $linha .="</div>";
				  $linha .="<div class='contagem  form-control '>";
				  $linha .= "Valor: " . $e->valor_unitario;
				  $linha .="</div>";
				  $linha .="<div class='contagem  form-control '>";
				  $linha .= "Sair com: <input id='item_$e->id' type='text' name='id_item[$s->id]' value='$s->qtd_solicitada' />";
				  $linha .="</div>";
				  $linha .="</div>";
				  $linha .="</div>";
				  echo $linha;
			   }
			   echo "<br />";
		    }

 

 

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Eu acho muito difícil passar adiante as resmas mais antigas do que as mais novas, principalmente porque a turma da entrega tem mania de empilhar as novas resmas por cima das mais antigas.

No MySQL, eu não teria a menor ideia de como fazer um controle de saída de acordo com o controle de entrada.

No meu projeto, eu criei duas tabelas para controlar o estoque: o produto e a história do produto.

O produto tem o id e a descrição.

A história do produto tem id, id do produto, lançamento, quantidade, custo.

A quantidade é positiva quando ocorre a entrada.

A quantidade é negativa quando ocorre a saída. O problema é calcular o custo, assim:

<?php
$mysqli=new mysqli("localhost","root","","diario");
if(isset($_GET['quantidadeSolicitada']){
	$qt=$_GET['quantidadeSolicitada']*(-1);
	$codProduto=$_GET['codigoProduto'];
	$lancamento=$_GET['lancamento'];
	$query=$mysqli->query("select sum(quantidade) as estoque, 
		sum(custo) as total
 		from tbhistprod where idProduto=$codProduto");
	$rows=$query->fetch_all(MYSQLI_ASSOC);
	$estoque=$rows['estoque'];
	$total=$rows['total'];
	$media=intval($estoque/$total*100)/100;
	$custoSolicitacao=$media*$qt;
	$mysqli->query("insert into tbhistprod 
		(lancamento,idProduto,quantidade,custo) 
		values ($lançamento,$codProduto,$qt,$custoSolicitacao");}

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0

Para testar o seu código, eu fiz as seguintes modificações:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<style> body {width:800;margin:0 auto} </style>
<?php
class Implementa {
    public function setTable(){}
    public function setTermos(){}}
class ServiceDb {
    public function listar(){
        return json_decode(json_encode([['data_entrada'=>'2024-01-25','qtd'=>5,
            'valor'=>10,'valor_unitario'=>2]]));}}
class Config {
    public function Fdb($dia){
        return date('d/m/y',strtotime($dia));}}
$data=new Config();
$saidas=json_decode(json_encode([['nome'=>'Frank','fornecimento'=>'resma',
    'qtd_solicitada'=>10,'id_item'=>1]]));
$numerar=0;
foreach ($saidas as $s): ?>
	<div class='linha_item row col-12 input-group text-center'>
	<input id='item_$s->id' type='hidden' name='id_item[$s->id]' sue='' />
	<div class='contagem form-control pl-5'>
	<?php $numerar++; ?>
	</div>
	<div class='desc form-control'>
	<?=$s->nome?>
	</div>
	<div class='fornecimento form-control'>
	<?=$s->fornecimento?>
	</div>
	<div class='fornecimento form-control'>
	<?=$s->qtd_solicitada?>
	</div>
	</div>
	<div class='linha_item row col-12 input-group text-center'>
	</div>
    <?php
    $ent = NEW Implementa();
    $ent->setTable("entradas");
    $ent->setTermos(" WHERE id_item = " . $s->id_item . " AND qtd > qtd_consumida ORDER BY data_entrada ASC ");
    $exec_ent = NEW ServiceDb($ent);
    $entradas = $exec_ent->listar();
    echo "<span class='mt-1 ml-4'>Entradas</span>";
    foreach($entradas as $e): ?>
	<div class='col-12 input-group text-center ml-3'>
    <div class='contagem form-control'>
	Data: <?=$data->Fdb($e->data_entrada)?>
	</div>
	<div class='contagem form-control'>
	Quantidade: <?=$e->qtd?>
	</div>
	<div class='contagem form-control'>
    Valor: <?=$e->valor_unitario?>
	</div>
	<div class='contagem form-control'>
	Sair com: <input id='item_$e->id' type='text' name='id_item[$s->id]' value=<?=$s->qtd_solicitada?> />
	</div>
	</div>
	</div>
    <?php endforeach; echo "<br>"; endforeach;?>

 

Captura de tela 2024-01-25 232934.png

Link para o comentário
Compartilhar em outros sites

  • 0

Gostei da ideia do campo quantidade consumida na tabela entrada, eu fiz esse código. Espero que ele lhe ajude:

<?php
$mysqli=new mysqli("localhost","root","","diario");
$mysqli->query("drop table if exists entrada");
$mysqli->query("create table entrada ( id int auto_increment, dia date, 
    id_item int, qt int, qtconsumida int, primary key (id) )");
$mysqli->query("insert into entrada (dia,id_item,qt,qtconsumida) values 
    ('2024-01-02',1,10,0), ('2024-01-03',1,10,0)");
$solicitacao=15;
$codigoproduto=1;
$query=$mysqli->query("select * from entrada where qt <> qtconsumida and 
    id_item=$codigoproduto order by dia");
while($row=$query->fetch_assoc()){
    $id=$row['id'];
    $disponivel=$row['qt']-$row['qtconsumida'];
    if($solicitacao>$disponivel){
        $solicitacao-=$disponivel;
        $qtconsumida=$row['qtconsumida']+$disponivel;
        $mysqli->query("update entrada set qtconsumida=$qtconsumida where id=$id");
        $disponivel=0;}
    if($solicitacao<=$disponivel){
        $qtconsumida=$row['qtconsumida']+$solicitacao;
        $mysqli->query("update entrada set qtconsumida=$qtconsumida where id=$id");
        $solicitacao=0;}
    if($solicitacao==0){break;}}
// conferindo:
$query=$mysqli->query("select * from entrada");
var_dump($query->fetch_all(MYSQLI_ASSOC));

 

Link para o comentário
Compartilhar em outros sites

  • 0
11 horas atrás, Frank K Hosaka disse:

Gostei da ideia do campo quantidade consumida na tabela entrada, eu fiz esse código. Espero que ele lhe ajude:

<?php
$mysqli=new mysqli("localhost","root","","diario");
$mysqli->query("drop table if exists entrada");
$mysqli->query("create table entrada ( id int auto_increment, dia date, 
    id_item int, qt int, qtconsumida int, primary key (id) )");
$mysqli->query("insert into entrada (dia,id_item,qt,qtconsumida) values 
    ('2024-01-02',1,10,0), ('2024-01-03',1,10,0)");
$solicitacao=15;
$codigoproduto=1;
$query=$mysqli->query("select * from entrada where qt <> qtconsumida and 
    id_item=$codigoproduto order by dia");
while($row=$query->fetch_assoc()){
    $id=$row['id'];
    $disponivel=$row['qt']-$row['qtconsumida'];
    if($solicitacao>$disponivel){
        $solicitacao-=$disponivel;
        $qtconsumida=$row['qtconsumida']+$disponivel;
        $mysqli->query("update entrada set qtconsumida=$qtconsumida where id=$id");
        $disponivel=0;}
    if($solicitacao<=$disponivel){
        $qtconsumida=$row['qtconsumida']+$solicitacao;
        $mysqli->query("update entrada set qtconsumida=$qtconsumida where id=$id");
        $solicitacao=0;}
    if($solicitacao==0){break;}}
// conferindo:
$query=$mysqli->query("select * from entrada");
var_dump($query->fetch_all(MYSQLI_ASSOC));

 

Oi, bom dia! Sua solução parece bem adequada .. estou tentando implantar. 

Esbarrei aqui:  $row = $query->fetch_assoc()...

Eu utilizo uma classe para fazer o select:

public function Listar() {//LISTAR REGISTROS
         $query = "(SELECT * FROM {$this->entity->getTable()} {$this->entity->getTermos()})";
         //var_dump($query);
         //print_r($query);
         $stmt = $this->db->prepare($query);
         $stmt->execute();
         if ($stmt->rowCount() <= 0) {
            return FALSE;
         }
         else {
            return $stmt->fetchAll(\PDO::FETCH_OBJ);
         }
      }

Então eu não sei como igualar a $row com este retorno.

Mas desde já agradeço muito sua ajuda!

 

12 horas atrás, Frank K Hosaka disse:

Para testar o seu código, eu fiz as seguintes modificações:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<style> body {width:800;margin:0 auto} </style>
<?php
class Implementa {
    public function setTable(){}
    public function setTermos(){}}
class ServiceDb {
    public function listar(){
        return json_decode(json_encode([['data_entrada'=>'2024-01-25','qtd'=>5,
            'valor'=>10,'valor_unitario'=>2]]));}}
class Config {
    public function Fdb($dia){
        return date('d/m/y',strtotime($dia));}}
$data=new Config();
$saidas=json_decode(json_encode([['nome'=>'Frank','fornecimento'=>'resma',
    'qtd_solicitada'=>10,'id_item'=>1]]));
$numerar=0;
foreach ($saidas as $s): ?>
	<div class='linha_item row col-12 input-group text-center'>
	<input id='item_$s->id' type='hidden' name='id_item[$s->id]' sue='' />
	<div class='contagem form-control pl-5'>
	<?php $numerar++; ?>
	</div>
	<div class='desc form-control'>
	<?=$s->nome?>
	</div>
	<div class='fornecimento form-control'>
	<?=$s->fornecimento?>
	</div>
	<div class='fornecimento form-control'>
	<?=$s->qtd_solicitada?>
	</div>
	</div>
	<div class='linha_item row col-12 input-group text-center'>
	</div>
    <?php
    $ent = NEW Implementa();
    $ent->setTable("entradas");
    $ent->setTermos(" WHERE id_item = " . $s->id_item . " AND qtd > qtd_consumida ORDER BY data_entrada ASC ");
    $exec_ent = NEW ServiceDb($ent);
    $entradas = $exec_ent->listar();
    echo "<span class='mt-1 ml-4'>Entradas</span>";
    foreach($entradas as $e): ?>
	<div class='col-12 input-group text-center ml-3'>
    <div class='contagem form-control'>
	Data: <?=$data->Fdb($e->data_entrada)?>
	</div>
	<div class='contagem form-control'>
	Quantidade: <?=$e->qtd?>
	</div>
	<div class='contagem form-control'>
    Valor: <?=$e->valor_unitario?>
	</div>
	<div class='contagem form-control'>
	Sair com: <input id='item_$e->id' type='text' name='id_item[$s->id]' value=<?=$s->qtd_solicitada?> />
	</div>
	</div>
	</div>
    <?php endforeach; echo "<br>"; endforeach;?>

 

Captura de tela 2024-01-25 232934.png

Obrigado Pela força! Estou tentando ajustar aqui.

14 horas atrás, Frank K Hosaka disse:

Eu acho muito difícil passar adiante as resmas mais antigas do que as mais novas, principalmente porque a turma da entrega tem mania de empilhar as novas resmas por cima das mais antigas.

No MySQL, eu não teria a menor ideia de como fazer um controle de saída de acordo com o controle de entrada.

No meu projeto, eu criei duas tabelas para controlar o estoque: o produto e a história do produto.

O produto tem o id e a descrição.

A história do produto tem id, id do produto, lançamento, quantidade, custo.

A quantidade é positiva quando ocorre a entrada.

A quantidade é negativa quando ocorre a saída. O problema é calcular o custo, assim:

<?php
$mysqli=new mysqli("localhost","root","","diario");
if(isset($_GET['quantidadeSolicitada']){
	$qt=$_GET['quantidadeSolicitada']*(-1);
	$codProduto=$_GET['codigoProduto'];
	$lancamento=$_GET['lancamento'];
	$query=$mysqli->query("select sum(quantidade) as estoque, 
		sum(custo) as total
 		from tbhistprod where idProduto=$codProduto");
	$rows=$query->fetch_all(MYSQLI_ASSOC);
	$estoque=$rows['estoque'];
	$total=$rows['total'];
	$media=intval($estoque/$total*100)/100;
	$custoSolicitacao=$media*$qt;
	$mysqli->query("insert into tbhistprod 
		(lancamento,idProduto,quantidade,custo) 
		values ($lançamento,$codProduto,$qt,$custoSolicitacao");}

 

Obrigado por sua contribuição. Vou levar em consideração!

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui está o mesmo código, dessa vez usando o motor PDO. O PDO não usa o ciclo while, mas com a ajuda do Bard, eu consegui emular o ciclo while do motor mysqli:

<?php
class controleEntrada {

    private $pdo, $solicitacao, $codigoProduto;

    public function __construct(){
        $this->pdo=new PDO("mysql:host=localhost;dbname=diario","root","");
        $this->pdo->query("drop table if exists entrada");
        $this->pdo->query("create table entrada (id int auto_increment,dia date,
            id_item int, qt int, qtconsumida int, primary key (id) )");
        $this->pdo->query("insert into entrada (dia,id_item,qt,qtconsumida) values 
            ('2024-01-02',1,10,0), ('2024-01-03',1,10,0)");}
        
    public function inicio(){
        $this->solicitacao=15;
        $this->codigoProduto=1;
        $stmt=$this->pdo->query("select * from entrada where qt <> qtconsumida and 
            id_item=$this->codigoProduto order by dia");
        $result=$stmt->fetchAll(PDO::FETCH_OBJ);
        $i=0;
        while($row=$result[$i]){
            $id=$row->id;
            $disponivel=$row->qt-$row->qtconsumida;
            if($this->solicitacao>$disponivel){
                $this->solicitacao-=$disponivel;
                $qtconsumida=$row->qtconsumida + $disponivel;
                $this->pdo->query("update entrada set 
					qtconsumida=$qtconsumida where id=$id");
                $disponivel=0;}
            if($this->solicitacao<=$disponivel){
                $qtconsumida=$row->qtconsumida + $this->solicitacao;
                $this->pdo->query("update entrada set 
			qtconsumida=$qtconsumida where id=$id");
                $this->solicitacao=0;}
            if($this->solicitacao==0){break;}
            $i++;}
        $this->conferir();}

    public function conferir(){
        $stmt=$this->pdo->query("select * from entrada");
        var_dump($stmt->fetchAll(PDO::FETCH_OBJ));}

    }

$controle=new controleEntrada();
$controle->inicio();

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,7k
×
×
  • Criar Novo...