<?php
//
$bUtilizaEstoque = False;
$RowT_CadDir = MYSQL_QUERY("SELECT * FROM cad_direitos WHERE DIR_CODIGO=0 ;") or die(MYSQL_ERROR());
If ($RowT_CadDir = MYSQL_FETCH_OBJECT($RowT_CadDir)) {
   $bUtilizaEstoque = STRPOS(";".$RowT_CadDir->DIR_ACESSO.";",";ESTMOV;")>0;
}
//
// Puxa o ultimo balanço da tabela est_movimento referente ao item
Function Puxar_UltBal($n_CodIte, $bEfetuado=True) {
    Global $aSessao;
    $sSQLQuery =
	    "SELECT * FROM est_movimento WHERE ETM_CODEMP=".$aSessao['CODIGO_EMPRESA'].
	                                 " AND ETM_CODITE=".$n_CodIte.
									 " AND ETM_DIGBAL".
									 ($bEfetuado ? " AND ETM_BALEFE=1" : " AND ETM_BALEFE=0").
	    " ORDER BY ETM_DTAMOV DESC LIMIT 1;";
    $a_Retorno = MYSQL_QUERY( $sSQLQuery ) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
    If ( ! $a_Retorno = MYSQL_FETCH_ARRAY($a_Retorno) ) {
	   $a_Retorno = ARRAY();
	}
	Return $a_Retorno;
}

// Ler e gravar saldo no estoque do produto
//
Function Produto_Estoque($n_CodIte, $bGravacao=False, $n_Saldo=0, $s_DtaBal='', $n_SalBal=-1) {
    Global $aSessao, $bUtilizaEstoque ;
    $sSQLQuery = "SELECT * FROM cad_produto_estoque WHERE EST_CODEMP=".$aSessao['CODIGO_EMPRESA']." AND EST_CODITE=".$n_CodIte.";";
    $aProd_Est = MYSQL_QUERY( $sSQLQuery ) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
	// Gravar na tabela
    If ($bGravacao) {
	   If ( $bUtilizaEstoque ) {
          If ( ! $aProd_Est = MYSQL_FETCH_ARRAY($aProd_Est) ) {
		     $sSQLQuery = 
                 "INSERT INTO cad_produto_estoque (EST_CODEMP, EST_CODITE, EST_ESTMIN".
		   	     ") VALUES (".
		   		    $aSessao['CODIGO_EMPRESA'].",".
		   		    $n_CodIte.",".
		   		    "1".
		   	     ");";
		   	 MYSQL_QUERY( $sSQLQuery ) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
	      }
          $sSQLQuery = 
             "UPDATE cad_produto_estoque SET ".
               ( (STRLEN($s_DtaBal)>0) ? 'EST_DTABAL="'.$s_DtaBal.'",' : '').
		   	   ( ($n_SalBal>=0)        ? 'EST_SALBAL="'.$n_SalBal.'",' : '').
               'EST_SALDOS='.$n_Saldo." ".
		     "WHERE EST_CODEMP=".$aSessao['CODIGO_EMPRESA']." AND EST_CODITE=".$n_CodIte.";";
	      MYSQL_QUERY( $sSQLQuery ) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
	   }
	// Ler da tabela
	} Else {
       If ( ! $a_Retorno = MYSQL_FETCH_ARRAY($aProd_Est) ) {
	      $a_Retorno = ARRAY();
	   }
	   Return $a_Retorno;
	}
}

//
// Baixa o estoque pelo codigo do faturamento
// Opção: 0 = Baixa (Subtraí)    1 = Cancela (Soma)
Function Baixa_Estoque( $nFat_CodigoI, $nOpcao=0 ) {
    Global $R_CadFuncionario, $aSessao;
	// Puxar todos os produtos que tem ficha técnica
    $sSQLQuery =
	   "SELECT pro.ITE_CODIGOI,".
          "COALESCE(fpi.FPI_QUANT_N,0) AS FPI_QUANT_N,".
          "COALESCE(fpi.FPI_QUANT_M,0) AS FPI_QUANT_M,".
          "COALESCE(fpi.FPI_QUANT_1,0) AS FPI_QUANT_1,".
          "COALESCE(fpi.FPI_QUANT_2,0) AS FPI_QUANT_2,".
          "COALESCE(fpi.FPI_QUANT_3,0) AS FPI_QUANT_3,".
          "COALESCE(fpi.FPI_QUANT_4,0) AS FPI_QUANT_4,".
          "fpi.FPI_COD_ITE ".
       "FROM       cad_produto               AS pro ".
       "INNER JOIN cad_produto_classificacao AS cls ON cls.CLS_IDN_CLS=pro.ITE_COD_CLS ".
       "INNER JOIN cad_ficha_producao_itens  AS fpi ON fpi.FPI_COD_FPG=pro.ITE_CODIGOI ".
       "WHERE cls.CLS_HAB_FCP;";
    $Rows_FatItem = MYSQL_QUERY( $sSQLQuery ) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
	$aFpi_Itens = ARRAY();
	While ( $Row_FatItem = MYSQL_FETCH_ARRAY($Rows_FatItem,MYSQL_ASSOC) ) {
	   If ( ! ISSET($aFpi_Itens[$Row_FatItem['ITE_CODIGOI']]) ) {
	      $aFpi_Itens[$Row_FatItem['ITE_CODIGOI']] = ARRAY();
	   }
	   $aFpi_Itens[$Row_FatItem['ITE_CODIGOI']][] = $Row_FatItem;
	}
	//
    $sSQLQuery = "SELECT * FROM fat_item WHERE FAT_CFATGER=".$nFat_CodigoI.";";
    $Rows_FatItem = MYSQL_QUERY( $sSQLQuery ) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
	While ( $Row_FatItem = MYSQL_FETCH_ARRAY($Rows_FatItem,MYSQL_ASSOC) ) {
	   $nQuanti = $Row_FatItem['FAT_QTD_ITE'];
	   $nPartes = 0;
	   // Contagem
	   For ($nContar=1; $nContar<=4; $nContar++) {
	       $nIte_CodigoI = $Row_FatItem['FAT_CODITE'.$nContar];
		   If ($nIte_CodigoI>0) {
		      $nPartes++;
		   }
	   }
	   // Calculo
	   $nQtdPar = ROUND( $nQuanti / $nPartes , 3);
	   For ($nContar=1; $nContar<=$nPartes; $nContar++) {
	       // Baixar item normalmente
	       $nIte_CodigoI = $Row_FatItem['FAT_CODITE'.$nContar];
		   If ($nOpcao==0) {
		      $nQtdPar = -$nQtdPar;
		   }
		   SQLIns_Est_Movimento( $nIte_CodigoI, $nQtdPar, $Row_FatItem['FAT_CODIGOI'], 0, 
		                         'Baixa referente a venda (Código interno: '.$nFat_CodigoI.')' );
		   // Baixar itens da ficha técnica de produção
		   If ( $nOpcao==0 && ISSET( $aFpi_Itens[$nIte_CodigoI] ) ) {
		      $aItens_Ficha = $aFpi_Itens[$nIte_CodigoI];
			  $sTipo_Preco_ = $Row_FatItem['FAT_PRE_TIP'];
			  ForEach ( $aItens_Ficha As $aItem_Ficha ) {
			     $nQuantidade = @$aItem_Ficha['FPI_QUANT_'.STRTOUPPER($sTipo_Preco_)]+0;
				 If ( $nQuantidade==0 ) { CONTINUE; }
				 $nQuantidade = $nQuantidade * $nQtdPar;
		         SQLIns_Est_Movimento(
				     $aItem_Ficha['FPI_COD_ITE'], $nQuantidade , $Row_FatItem['FAT_CODIGOI'], 0, 
		             'Baixa referente a ficha técnica de produção (Código interno: '.$Row_FatItem['FAT_CODIGOI'].')'
				 );
			  }
		   }
		   //
	   }
	   //
	}
    //
}

//
//
//
Function SQLIns_Est_Movimento( $nIte_CodigoI=0, $nIte_Quantid=0, $nFat_CodigoI=0, $nEtd_Idn_Etd=0, $sEtm_Descric='', $nTme_CodigoI=0, $bDigito_Balanco=False ) {
   Global $aSessao, $R_CadFuncionario;
   $sData_Trabalho = SQLVarConfig('DATA_DE_TRABALHO');
   // Conferir informações
   If ( $nIte_CodigoI<=0 Or $nIte_Quantid==0 ) { Return -1; }   // Erro
   // Calcular e gravar saldo em estoque
   $nSaldo_Anterior = Produto_Estoque($nIte_CodigoI);
   $nSaldo_Anterior = @$nSaldo_Anterior['EST_SALDOS']+0;
   $nSaldo_Atualiza = $nSaldo_Anterior + $nIte_Quantid;  // Somar o saldo
   Produto_Estoque($nIte_CodigoI, True, $nSaldo_Atualiza);
   // Ultimo balanço
   $aEtm_UltBal = Puxar_UltBal( $nIte_CodigoI );         // Puxar o ultimo balanço efetuado
   $nSal_UltBal = @$aEtm_UltBal['ETM_QTDMOV']+0;
   $nDta_UltBal = ConvertDtHrSTR(@$aEtm_UltBal['ETM_DTAMOV']);
   $sDta_UltBal = '';
   If ( $nDta_UltBal>0 ) { $sDta_UltBal = DATE("Y-m-d H:i:s",$nDta_UltBal); }
   // Preparar tipo de movimento (Entrada ou Saída)
   $bEtm_EntSai  = ($nIte_Quantid<0);
   $nIte_Quantid = Somente_Numeros($nIte_Quantid,'.')+0;
   // Puxar o próximo numero sequencial
   $sSQLQuery = "SELECT ETM_SEQUEN FROM est_movimento ORDER BY ETM_SEQUEN DESC LIMIT 1;";
   $nEtm_Sequen = MYSQL_QUERY( $sSQLQuery ) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
   $nEtm_Sequen = MYSQL_FETCH_ARRAY($nEtm_Sequen);
   $nEtm_Sequen = @$nEtm_Sequen[0]+1;
   // Inserir movimento no banco de dados SQL (EST_MOVIMENTO)
   $sSQLQuery = 
      "INSERT INTO est_movimento(".
         "ETM_SEQUEN, ETM_CODEMP, ETM_CODITE, ETM_DTAMOV, ETM_DTAFIC, ETM_FUNINC, ETM_TIPMOV, ETM_DIGBAL, ETM_ENTSAI,".
   	     "ETM_QTDMOV, ETM_SALDOC, ETM_FATITM, ETM_IDNETD, ETM_HISTOR, ETM_ULTBAL, ETM_ULTSAL, ETM_BALEFE".
      ") VALUES (".
         $nEtm_Sequen.",".                      // Identificador sequencial
   	     $aSessao['CODIGO_EMPRESA'].",".        // Código da empresa
   	     $nIte_CodigoI.",".                     // Código do produto
   	     "'".DATE("Y-m-d H:i:s")."',".          // Data e hora do movimento
		 "'".$sData_Trabalho."',".              // Data de trabalho
   	     $R_CadFuncionario->FUN_CODIGO.",".     // Código do funcionário
   	     $nTme_CodigoI.",".                     // Codigo do tipo do movimento (tabela CAD_TIPO_MOVEST)
   	     ($bDigito_Balanco+0).",".              // É digito de balanço? (Não)
   	     ($bEtm_EntSai+0).",".                  // Tipo de movimento: 0=Entrada, 1=Saída
   	     $nIte_Quantid.",".                     // Quantidade do movimento
   	     $nSaldo_Atualiza.",".                  // Saldo calculado
   	     $nFat_CodigoI.",".                     // Identificador de referência da tabela FAT_ITEM
   	     $nEtd_Idn_Etd.",".                     // Identificador de referência da tabela EST_ENTRADA_ITENS
   	     SQL_Bin($sEtm_Descric).",".            // Descritivo
   	     "'".$sDta_UltBal."',".                 // Data do ultimo balanço
   	     $nSal_UltBal.",".                      // Saldo do ultimo balanço
		 "0".                                   // Balanço efetuado?
      ");";
   MYSQL_QUERY( $sSQLQuery ) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
   //
   Return $nEtm_Sequen;
}
?>