RESOLVIDO !- Devolução de Mercadoria de nota de entrada (industrialização)

Ola Amigos, estou emitindo a nfe porem quando estou fazendo uma nota de devolução eu preciso dar baixa desse produto do estoque de material para industrialização.

ex: Eu recebo uma nota com 1000 parafusos. Eu guardo em uma tabela o numero da nota + produto + saldo.

Problema: Quando eu vou emitir uma nota de devolução de mercadoria (Produto Acabado após industrialização) nessa nota eu preciso baixar o estoque de produtos que vieram para industrialização (parafusos). para isso eu fiz o código abaixo que verifica:

  • Se existe saldo suficiente do produto acabado para devolução;
  • Verifica se existe saldo suficiente do produto para devolução para (parafuso), caso tenha subtraia do saldo o valor necessário para devolução a partir das primeiras notas que entraram (por data que ainda existem saldo).
    É justamente aqui que esta o problema, fiz o código que acha todas as notas de entrada do produto (parafuso) e subtrai a quantidade necessária, porem ele esta fazendo isso em todas as notas de entrada do produto (parafuso) eu gostaria que no memento que atingir o saldo necessário para devolução ele saisse do loop, pois ele esta continuando no loop fazendo a subtração do saldo até o fim dos registros.

Bom é isso, espero ter conseguido me explicar.

Segue código:

// ================================================================== // Busca produto para saber se tem saldo para nota

sc_lookup(prod, “SELECT prod_id, prod_cod_produto, prod_saldo FROM tb_produtos WHERE (prod_cod_produto = ‘{nf_soli_produto}’)”);

$id_prod = {prod[0][0]};
$saldo = {prod[0][2]};

if({nf_soli_quantidade} > $saldo){
{Avisos} = “Estoque Insuficiente”;
} else {
{Avisos} = “<a href=…//xml_nf/xml_nf.php?id={nf_soli_id}>Transmitir”;
}

// Teste abaixo =======================================================

$saldo_necessario = {nf_soli_quantidade};

// ===========================================================================================================================
// Verifica se tem saldo a devolver nas entradas de nota dos produtos para industrialização
sc_lookup(compo," SELECT prod_comp_prod_id, prod_comp_cod_produto, prod_comp_quantidade FROM tb_produtos_componentes WHERE (prod_comp_prod_id = ‘$id_prod’)");

$total_registros=mysql_num_rows(mysql_query(“SELECT * FROM tb_produtos_componentes WHERE (prod_comp_prod_id = ‘$id_prod’)”));
// echo “==>> Tota de Componentes: “.$total_registros.”
”;

 for($x=0;$x<$total_registros;$x++){
     $quantidade_necessaria = '0';
     $cod_produto	 	= {compo[$x][1]};
     $comp_quantidade  	= {compo[$x][2]};
     $quantidade_necessaria = $comp_quantidade * {nf_soli_quantidade};
// echo  "<br>--------------------------------------------------------------------------------------------<bR>";
    // echo  "====>> cod: " . $cod_produto . " / quant. (in prod): ". $comp_quantidade . 
    " / Quant. Necessaria: " . $quantidade_necessaria ."<br>";		 

// Verifica se tem saldo dos itens para fazer devuloção
	$select1 =  mysql_query("SELECT nota_itens_cod_produto, SUM(nota_itens_saldo) as soma FROM tb_nota_in_itens WHERE nota_itens_cod_produto = '$cod_produto'");
	// total_nota_in= mysql_result($select1,0);
	$total_nota_in = mysql_fetch_object($select1);
	$total_disponivel = $total_nota_in ->soma; 
	
	// echo  "=======> Estoque (nf in) = " . $total_disponivel . "<br>=======> <i> Relação de notas x saldos</i><br>";
	
if($quantidade_necessaria > $total_disponivel){
	$x = $total_registros;
 	        {Avisos} = "Estoque de devolução insuficiente";
} else {
	// Caso exista saldo, ir acessadno registro da nota e subtraindo os valores do campo saldo 
	// até atingir o valor da nota.
	
	$itens_nota = mysql_query("SELECT nota_itens_num_nota, nota_itens_cod_produto, nota_itens_saldo FROM tb_nota_in_itens WHERE nota_itens_cod_produto = '$cod_produto'");
	
	while($resultado = mysql_fetch_array($itens_nota) AND  $saldo_necessario >= 0 ) {

			// echo  "saldo_necessario = " . $saldo_necessario ."<br>";
			$iten_nnota 	= $resultado ['nota_itens_num_nota'];
			$iten_saldo 	= $resultado ['nota_itens_saldo'];
							
			if($iten_saldo >= $saldo_necessario){  // se o saldo da nota for maior que o solicitado calcule e baixa nota
			
				// echo  "¨¨¨¨¨¨¨¨> Num. Nota / saldo atual = " . $iten_nnota . " / " .$iten_saldo . "<br>";
				$saldo_baixado = $quantidade_necessaria - $iten_saldo;
				// echo  "<b>¨¨¨¨¨¨¨¨> Notas ".$iten_nnota." baixada, Saldo Restante = ". abs($saldo_baixado)." </b><br>";				
			
				break;
				//$saldo_necessario = $saldo_necessario + $iten_saldo; // sai do if (sim)
				
			} else { // se for necessario mais de uma nota.
				
					$restante = $saldo_necessario - $iten_saldo;
					$saldo_necessario = $restante;
					
					if ( $restante <= 0){
						$saldo_necessario = 0;						
						// echo  "=======> Num. Nota / saldo atual = " . $iten_nnota . " / " .$iten_saldo . "<br>";
						// echo  "<b>=======> Notas ".$iten_nnota." baixada, Saldo Restante = ". abs($restante)." </b><br>";											
					}
			} //if	
		
	} //while
} // else		

} //for</blockquote>

Se atingir o saldo necessario voce da um break pra sair do laço :-p se é essa sua unica duvida :-p

Cria uma variavel mais externa, $saldo_atingido = false;

quando atingir o saldo necessário voce da um break pra sair do laco e liga $saldo_atingido = true;

pra fora do laço voce poder fazer seu controle …

if($saldo_atingido)
{
//atingiu o saldo … sei la o que voce pode fazer :-p
}else
{
terminou sem atingir o saldo …
}

Ola Diogo, eu tentei usar o break, porem ele para todo meu código, não passando para o próximo registro.
Onde eu colocaria esse if($saldo_atingido) no meu código de maneira que a qualquer momento que o saldo for atingido ele pare a execução (somente da busca dos produtos de entrada) e não de todo.

Esse if($saldo_atingido) funcionada em qualquer momento digo, assim que a variável saldo_atingido for alterada o loop para??? é como um while?

Obrigado

na realidade ele nao para o codigo, break sai do laço … for, while, do while, foreach …

se voce nao quer q saia do loop, mas apenas nao faca seu codigo …

no loop verifica o saldo … se ainda nao atingiu o saldo … faz o teu codigo, se nao …

n to entendendo sua duvida, se a logica ai ta bem programa … foi vc qm fez?

pq ja tem no seu codigo os ifs da vida

if($iten_saldo >= $saldo_necessario) … quer dizer, mais itens que o saldo …

se nao voce faz outra coisa logo em baixo…

Sim, foi em quem fez, e já coloquei essa linha do while (***********), justamente pensando nisso juntamente com o if da linha ($$$$$$$$$$$).
Mas ele não para, continua tirando o valor total de todas as notas.

while($resultado = mysql_fetch_array($itens_nota) AND $saldo_necessario >= 0 ) { ********

        // echo  "saldo_necessario = " . $saldo_necessario ."<br>";
        $iten_nnota    = $resultado ['nota_itens_num_nota'];
        $iten_saldo    = $resultado ['nota_itens_saldo'];
                    
        if($iten_saldo >= $saldo_necessario){  // se o saldo da nota for maior que o solicitado calcule e baixa nota
        
           // echo  "¨¨¨¨¨¨¨¨> Num. Nota / saldo atual = " . $iten_nnota . " / " .$iten_saldo . "<br>";
           $saldo_baixado = $quantidade_necessaria - $iten_saldo;
           // echo  "<b>¨¨¨¨¨¨¨¨> Notas ".$iten_nnota." baixada, Saldo Restante = ". abs($saldo_baixado)." </b><br>";            
        
           break;
           //$saldo_necessario = $saldo_necessario + $iten_saldo; // sai do if (sim)
           
        } else { // se for necessario mais de uma nota.
           
              $restante = $saldo_necessario - $iten_saldo;
              $saldo_necessario = $restante;
              
              if ( $restante <= 0){    $$$$$$$$$$$$$$$
                 $saldo_necessario = 0;

Ola amigo, consegui resolver, dei uma reformulada no código, e tinha um >=0 que estava atrapalhando… era só > 0. :wink:

segue o código abaixo caso possa ajudar outras pessoas.

[code]// ==================================================================
// Busca produto para saber se tem saldo para nota
sc_lookup(prod, “SELECT prod_id, prod_cod_produto, prod_saldo FROM tb_produtos WHERE (prod_cod_produto = ‘{nf_soli_produto}’)”);

$id_prod = {prod[0][0]};
$saldo = {prod[0][2]};

if({nf_soli_quantidade} > $saldo){
{Avisos} = “Estoque Insuficiente”;
} else {
{Avisos} = “<a href=…//xml_nf/xml_nf.php?id={nf_soli_id}>Transmitir”;
}

// ===================================================================
$saldo_necessario = {nf_soli_quantidade};

// ===================================================================
// Verifica se tem saldo a devolver nas entradas de nota dos produtos
sc_lookup(compo," SELECT prod_comp_prod_id, prod_comp_cod_produto, prod_comp_quantidade FROM tb_produtos_componentes WHERE (prod_comp_prod_id = ‘$id_prod’)");

$total_registros=mysql_num_rows(mysql_query(“SELECT * FROM tb_produtos_componentes WHERE (prod_comp_prod_id = ‘$id_prod’)”));

 for($x=0;$x<$total_registros;$x++){

     $cod_produto	 	= {compo[$x][1]};
     $comp_quantidade  	= {compo[$x][2]};
     $saldo_necessario = $comp_quantidade * {nf_soli_quantidade};

// Verifica se tem saldo dos itens para fazer devuloção
$select1 =  mysql_query("SELECT nota_itens_cod_produto, SUM(nota_itens_saldo) as soma FROM tb_nota_in_itens WHERE nota_itens_cod_produto = '$cod_produto'");
$total_nota_in = mysql_fetch_object($select1);
$total_disponivel = $total_nota_in ->soma; 
	
if($saldo_necessario > $total_disponivel){
	$x = $total_registros;
 	        {Avisos} = "Estoque de devolução insuficiente";
} else {
	// Caso exista saldo, ir acessadno registro da nota e subtraindo os valores do campo saldo até atingir o valor da nota.
	
	$itens_nota = mysql_query("SELECT nota_itens_num_nota, nota_itens_cod_produto, nota_itens_saldo FROM tb_nota_in_itens WHERE nota_itens_cod_produto = '$cod_produto'");
	
	while($resultado = mysql_fetch_array($itens_nota) AND  $saldo_necessario > 0 ) {

			$iten_nnota 	= $resultado ['nota_itens_num_nota'];
			$iten_saldo 	= $resultado ['nota_itens_saldo'];

			if($iten_saldo >= $saldo_necessario){  // se o saldo da nota for maior que o solicitado calcule e baixa nota
			
				$saldo_necessario = $saldo_necessario - $iten_saldo;
				
			} else { // se for necessario mais de uma nota.

				$saldo_necessario = $saldo_necessario - $iten_saldo;					

				if ($saldo_necessario > 0){
					$iten_saldo = 0;	
				}
				
			} //if	
		
	} //while
} // else		

} //for

[/code]

So uma dica no html …

{Avisos} = “<a href=…//xml_nf/xml_nf.php?id={nf_soli_id}>Transmitir”;
para ser:
{Avisos} = “Transmitir”;

Tinha 2 barras e as aspas do link …