<?php
//
$aVarsConfig = ARRAY();        // Matriz de configura��es
$Cod_Bal_Ent = 999999;
//
$sURLSimdesk_CallApp   = 'http://simdesk.simsoft.com.br/simsoft/callapp_simdesk.php';
$bLocal_OS_Linux = (STRTOUPPER(PHP_OS)=="LINUX");
//$bURLSimdesk_HTTPS     = True;                        // Forçar HTTPS para a comunicação com o Simdesk
$bURLSimdesk_HTTPS     = False;                         // Incluído para não usar HTTPS ( 17-06-2019 )
$sURLSimdesk           = 'http://simdesk.simsoft.com.br/simsoft/cliente/callapl_simdeskrp.php';
$sChave_Publica_Simsoft =       // Chave publica da Simsoft Oficial : Gerada em 30/01/2019
  '-----BEGIN PUBLIC KEY-----'.                                        CHR(13).CHR(10).
  'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnAdbOioTs5BTAg2MkCn9'.  CHR(13).CHR(10).
  'OO6sNznN5jHQxkR4b+jVR5sBoyjeEydfn2qSZQjGRUvcUjtF+uxS/0gjLxAYtk7O'.  CHR(13).CHR(10).
  'Ha4NzfNxwstJJF7WN3UJC+D2hTV3z2jzxs+/C5Z6WNY07GWC0PNmlFQOZu0NajUf'.  CHR(13).CHR(10).
  'POx3buz0p8Gsfsso2JBQV2ErWwcOIOY5FQOVks5J6WnsB5ciboFJUVOoqma0QKPN'.  CHR(13).CHR(10).
  'SuKn04h0sgo5pq7V1ubJh+3c5Z8Ue8LBLLrf3548XYB/yYKUaPFHkdCCuvpw6Jq1'.  CHR(13).CHR(10).
  'KrLCSAhB7QQ9/iBRHt+jdCCKVdy8VdRIayTuBDuntBGqLB7iJ4tNVCMjtvX7FLUv'.  CHR(13).CHR(10).
  '4QIDAQAB'.                                                          CHR(13).CHR(10).
  '-----END PUBLIC KEY-----'.                                          CHR(13).CHR(10).
  '';
//
// ** Somente para testes locais **
//$bLocal_OS_Linux = True;
//$sURLSimdesk           = "http://localhost/simdesk/www/cliente/callapl_simdesk.php";
//$sChave_Publica_Simsoft =
//  '-----BEGIN PUBLIC KEY-----'.                                        CHR(13).CHR(10).
//  'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMwg/FlQKsNfwgO/U+Bf0HTeEfrrng/m'.  CHR(13).CHR(10).
//  'r4yxllC0bEKFLvsudbDXPI8CRBKj7uE4+a0NxfCBlJQKXA84Zvlq/UsCAwEAAQ=='.  CHR(13).CHR(10).
//  '-----END PUBLIC KEY-----'.                                          CHR(13).CHR(10).
//  '';
// ** Fim do Bloco para testes **
//
//
//
Function CondPrivilegio($sCdPvg_Cnt, $sCdPvg_Modulo, $sCdPvg_Acao) {
  $sCdPvg_ModCon = ExtrTextoEm($sCdPvg_Cnt,"<|".StrToUpper($sCdPvg_Modulo)."|>","</>");
  If (STRPOS(" ".$sCdPvg_ModCon,"[".$sCdPvg_Acao."]")>0) {
     Return True;
  } Else {
     Return False;
  }
}
//
// Esta fun��o alinha o texto. (0=Esquerda, 1=Centralizado, 2=Direita)
// Ex: AlinhaStr( 'AZUL', 2, 10 ) -> '      AZUL'
Function AlinhaStr($sStrP,$nOpc=1, $nComp=40, $sRepetido=' ') {
   $sRet = @SUBSTR($sStrP, 0, $nComp);
   //
   If ($nOpc==0) {            // Alinhado � esquerda
      $sRet = $sRet.STR_REPEAT($sRepetido, $nComp-STRLEN($sRet));
	  //
   } ElseIf ($nOpc==1) {      // Alinhado ao centro
      $sRet = STR_REPEAT($sRepetido, ($nComp/2)-(STRLEN($sRet)/2)).$sRet;
	  //
   } ElseIf ($nOpc==2) {      // Alinhado � direita
      $sRet = STR_REPEAT($sRepetido, $nComp-STRLEN($sRet)).$sRet;
	  //
   } ElseIf ($nOpc==3) {      // Alinhado ao centro completo
      $nQtdSp = ROUND(($nComp/2)-(STRLEN($sRet)/2));
      $sRet = STR_REPEAT($sRepetido, $nQtdSp).$sRet.STR_REPEAT($sRepetido, $nComp-(STRLEN($sRet)+$nQtdSp));
	  //
   }
   Return $sRet;
}
//
// Esta fun��o completa com zero da esquerda para a direita
// Ex: Str_Zero( 15, 5 ) -> '00015'
Function Str_Zero($nStZ_Numero, $nStZ_Digitos, $sChar_Repeat='0') {
  //$sStz_Ret = SUBSTR($nStZ_Numero.'',0,$nStZ_Digitos);
  $sStz_Ret = $nStZ_Numero.'';
  If (STRLEN($sStz_Ret)<$nStZ_Digitos) {
     $sStz_Ret = STR_REPEAT($sChar_Repeat,$nStZ_Digitos-STRLEN($sStz_Ret)).$sStz_Ret;
  }
  Return $sStz_Ret;
}
//
function Somente_Numeros($sStrTexto,$sStrLstChar='') {
  $nCont_Pos = 0;
  $sStr_Retorno = '';
  While (True) {
     $sCharCond = SUBSTR($sStrTexto,$nCont_Pos,1);
	 If (STRLEN($sCharCond)==0) { BREAK; }
	 If (STRPOS( ' 0123456789'.$sStrLstChar, $sCharCond )>0) {
	    $sStr_Retorno .= $sCharCond;
	 }
	 $nCont_Pos++;
  }
  Return $sStr_Retorno;
}
//
Function ExtrTextoEm($strEXTTexto,$strEXTIn1,$strEXTIn2) {
  If (STRPOS(' '.$strEXTTexto,$strEXTIn1) == 0 OR STRPOS(' '.$strEXTTexto,$strEXTIn2) == 0) {
     Return '';
  }
  $intEXTPosIni = STRPOS($strEXTTexto,$strEXTIn1);
  $intEXTPosIni = $intEXTPosIni + STRLEN($strEXTIn1);
  $intEXTPosFim = STRPOS($strEXTTexto,$strEXTIn2,$intEXTPosIni);
  $intEXTPosFim = $intEXTPosFim - $intEXTPosIni;
  $strEXTRetTxt = SUBSTR($strEXTTexto,$intEXTPosIni,$intEXTPosFim);
  Return $strEXTRetTxt;

}
//
Function CodAsciiHTML( $sEntradaH ) {
   $sSaidaCHTML = '';
   $nCont_Pos = 0;
   While ( True ) {
      $sCharAtual = SUBSTR( $sEntradaH, $nCont_Pos, 1 );
	  If ( STRLEN($sCharAtual)==0 OR $nCont_Pos>100000 ) { BREAK; }
	  $nCharAtual = ORD( $sCharAtual );
	  If ( $nCharAtual>47 && $nCharAtual<58 && $nCharAtual>64 && $nCharAtual<91 && $nCharAtual>96 && $nCharAtual<123 ) {
	     $sSaidaCHTML .= $sCharAtual;
	  } ElseIf ( $nCharAtual==32 ) {
	     $sSaidaCHTML .= $sCharAtual;
	  } Else {
	     $sSaidaCHTML .= '&#'.$nCharAtual.';';
	  }
	  $nCont_Pos++;
   }
   Return $sSaidaCHTML;

}
//
Function SAFESTR_ESCAPE($str) {
  $len=strlen($str);
  $escapeCount=0;
  $targetString='';
  FOR ($offset=0;$offset<$len;$offset++) {
      switch($c=$str{$offset}) {
          case "'":
          // Escapes this quote only if its not preceded by an unescaped backslash
                  if($escapeCount % 2 == 0) $targetString.="\\";
                  $escapeCount=0;
                  $targetString.=$c;
                  break;
          case '"':
          // Escapes this quote only if its not preceded by an unescaped backslash
                  if($escapeCount % 2 == 0) $targetString.="\\";
                  $escapeCount=0;
                  $targetString.=$c;
                  break;
          case '\\':
                  $escapeCount++;
                  $targetString.=$c;
                  break;
          default:
                  $escapeCount=0;
                  $targetString.=$c;
      }
  }
  return $targetString;
}
//
function RemoveAcentos($string) {
   // Primeiro na variavel $a coloco todas as letras e os tipos de acentos que quero remover.
   $a = "��������������������������������������������������������������Rr";
   // Depois disso na variavel $b coloco na mesma ordem por qual eu vou substituir.
   $b = "AAAAAAACEEEEIIIIDNOOOOOOUUUUYbsaaaaaaaceeeeiiiidnoooooouuuyybyRr";
   $string = strtr($string, $a, $b); //substitui letras acentuadas por "normais"
   return $string; //finaliza, gerando uma sa�da para a funcao
}
//



function validaCPF($cpf = null) {
    // Verifica se um n�mero foi informado
    if(empty($cpf)) {
        return false;
    }
     // Elimina possivel mascara
    $cpf = @ereg_replace('[^0-9]', '', $cpf);
    $cpf = str_pad($cpf, 11, '0', STR_PAD_LEFT);
     // Verifica se o numero de digitos informados � igual a 11 
    if (strlen($cpf) != 11) {
        return false;
    }
    // Verifica se nenhuma das sequ�ncias invalidas abaixo 
    // foi digitada. Caso afirmativo, retorna falso
    else if ($cpf == '00000000000' || 
        $cpf == '11111111111' || 
        $cpf == '22222222222' || 
        $cpf == '33333333333' || 
        $cpf == '44444444444' || 
        $cpf == '55555555555' || 
        $cpf == '66666666666' || 
        $cpf == '77777777777' || 
        $cpf == '88888888888' || 
        $cpf == '99999999999') {
        return false;
     // Calcula os digitos verificadores para verificar se o
     // CPF � v�lido
     } else {   
        for ($t = 9; $t < 11; $t++) {
            for ($d = 0, $c = 0; $c < $t; $c++) {
                $d += $cpf{$c} * (($t + 1) - $c);
            }
            $d = ((10 * $d) % 11) % 10;
            if ($cpf{$c} != $d) {
                return false;
            }
        }
        return true;
    }
}

function validar_cnpj($cnpj)
{
    if($cnpj==0) {
		return true;
	}
	$cnpj = preg_replace('/[^0-9]/', '', (string) $cnpj);
	// Valida tamanho
	if (strlen($cnpj) != 14){
		return false;
	}
	// Valida primeiro d�gito verificador
	for ($i = 0, $j = 5, $soma = 0; $i < 12; $i++)
	{
		$soma += $cnpj{$i} * $j;
		$j = ($j == 2) ? 9 : $j - 1;
	}
	$resto = $soma % 11;
	if ($cnpj{12} != ($resto < 2 ? 0 : 11 - $resto)){
	   return false;
	}
	// Valida segundo d�gito verificador
	for ($i = 0, $j = 6, $soma = 0; $i < 13; $i++)
	{
		$soma += $cnpj{$i} * $j;
		$j = ($j == 2) ? 9 : $j - 1;
	}
	$resto = $soma % 11;
	return $cnpj{13} == ($resto < 2 ? 0 : 11 - $resto);
}

 

//
Function FormataTelefone( $sForTelefone ) {
  $sForTelRet = $sForTelefone;
  $sForTelRet = STR_REPLACE( ' ' , '', $sForTelRet );
  $sForTelRet = STR_REPLACE( '-' , '', $sForTelRet );
  $sForTelRet = STR_REPLACE( '.' , '', $sForTelRet );
  $sForTelRet = STR_REPLACE( '(' , '', $sForTelRet );
  $sForTelRet = STR_REPLACE( ')' , '', $sForTelRet );
  If (SUBSTR($sForTelRet,0,1)=="0") { $sForTelRet = SUBSTR($sForTelRet,1); }
  If (STRLEN($sForTelRet) == 8) {
	 $sForTelRet = SUBSTR($sForTelRet,0,4).'-'.SUBSTR($sForTelRet,4,4);
  } ElseIf (STRLEN($sForTelRet) == 9) {
	 $sForTelRet = SUBSTR($sForTelRet,0,5).'-'.SUBSTR($sForTelRet,5,4);
  } ElseIf (STRLEN($sForTelRet) == 10) {
	 $sForTelRet = SUBSTR($sForTelRet,0,2).' '.SUBSTR($sForTelRet,2,4).'-'.SUBSTR($sForTelRet,6,4);
  } ElseIf (STRLEN($sForTelRet) == 11) {
	 $sForTelRet = SUBSTR($sForTelRet,0,2).' '.SUBSTR($sForTelRet,2,5).'-'.SUBSTR($sForTelRet,7,4);
  }
  Return $sForTelRet;
}
//
Function FormatoMoeda($nExibNumero) {
  Return NUMBER_FORMAT($nExibNumero, 2, ',','');
}
//
Function FormatoMoeda_Mil($nExibNumero) {
  Return NUMBER_FORMAT($nExibNumero, 2, ',','.');
}
//
Function FormatoCPFouCNPJ( $sNumero ) {
  $sNumero_C = Somente_Numeros($sNumero);
  $sRetornoC = "";
  If ( STRLEN($sNumero_C)==11 ) {
     $sRetornoC = SUBSTR($sNumero_C,0,3).'.'.SUBSTR($sNumero_C,3,3).'.'.SUBSTR($sNumero_C,6,3).'-'.SUBSTR($sNumero_C,9,2);
  } ElseIf ( STRLEN($sNumero_C)==14 ) {
     $sRetornoC = SUBSTR($sNumero_C,0,2).'.'.SUBSTR($sNumero_C,2,3).'.'.SUBSTR($sNumero_C,5,3).'/'.SUBSTR($sNumero_C,8,4).'-'.SUBSTR($sNumero_C,12,2);
  }
  Return $sRetornoC;
}
//
Function ConvertDataBRUS($strDataBR) { // Converte uma data em string no formato BR para US
  //              0123456789
  //$strDatabr = '15/01/2002';
  $strDataUS = '0000-00-00';
  If (0+SUBSTR($strDataBR,3,2)>0 AND 0+SUBSTR($strDataBR,0,2)>0 AND 0+SUBSTR($strDataBR,6,4)>1800 ) {
     $strDataUS = DATE("Y-m-d", MKTIME(0, 0, 0, 0+SUBSTR($strDataBR,3,2), 0+SUBSTR($strDataBR,0,2), 0+SUBSTR($strDataBR,6,4)));
  }
  Return $strDataUS;
}

Function ConvertDataUSBR($strDataUS) { // Converte uma data em string no formato US para BR
  //              0123456789
  //$strDatabr = '2002-01-15';
  $strDataBR = '00/00/0000';
  If (0+SUBSTR($strDataUS,5,2)>0 AND 0+SUBSTR($strDataUS,8,2)>0 AND 0+SUBSTR($strDataUS,0,4)>1800 ) {
     $strDataBR = DATE("d/m/Y", MKTIME(0, 0, 0, 0+SUBSTR($strDataUS,5,2), 0+SUBSTR($strDataUS,8,2), 0+SUBSTR($strDataUS,0,4)));
  }
  Return $strDataBR;
}
//
Function ConvertDataSTR($strDataSTR) { // Converte uma string no formato Data (US) para Timestamp
  //              0123456789
  //$strDatabr = '2002-01-15';
  $strDataLNG = 0;
  If (0+SUBSTR($strDataSTR,5,2)>0 AND 0+SUBSTR($strDataSTR,8,2)>0 AND 0+SUBSTR($strDataSTR,0,4)>1800 ) {
     $strDataLNG = MKTIME(0, 0, 0, 0+SUBSTR($strDataSTR,5,2), 0+SUBSTR($strDataSTR,8,2), 0+SUBSTR($strDataSTR,0,4));
  }
  Return $strDataLNG;
}
//
Function ConvertDtHrSTR($strDataSTR) { // Converte uma string no formato Data (US) e hora para Timestamp
  //              0123456789012345678
  //$strDatabr = '2002-01-15 01:12:25';
  $strDataLNG = 0;
  If (0+SUBSTR($strDataSTR,5,2)>0 AND 0+SUBSTR($strDataSTR,8,2)>0 AND 0+SUBSTR($strDataSTR,0,4)>1800 ) {
     $strDataLNG = MKTIME(0+SUBSTR($strDataSTR,11,2), 0+SUBSTR($strDataSTR,14,2), 0+SUBSTR($strDataSTR,17,2), 0+SUBSTR($strDataSTR,5,2), 0+SUBSTR($strDataSTR,8,2), 0+SUBSTR($strDataSTR,0,4));
  }
  Return $strDataLNG;
}
//
Function ConvertHoraStr($strHora_P) {
  $strHora = Somente_Numeros($strHora_P,':');
  If ( $strHora != $strHora_P OR STRLEN($strHora_P)<>8 ) { Return 0; }
  If ( SUBSTR($strHora,2,1) != ':' OR SUBSTR($strHora,5,1) != ':' ) { Return 0; }
  $nHoras     = SUBSTR($strHora,0,2);
  $nMinutos   = SUBSTR($strHora,3,2);
  $nSegundos  = SUBSTR($strHora,6,2);
  $nTotal_Seg = ($nHoras*60*60) + ($nMinutos*60) + $nSegundos;
  Return $nTotal_Seg;
}
//
//Function ConvertDataHoraSTR($strDataSTR) { // Converte uma string no formato Data e hora (US) para Timestamp
//  //              0123456789012345678
//  //$strDatabr = '2002-01-15 13:59:59';
//  $strDataLNG = 0;
//  If (0+SUBSTR($strDataSTR,5,2)>0 AND 0+SUBSTR($strDataSTR,8,2)>0 AND 0+SUBSTR($strDataSTR,0,4)>1800 ) {
//     $strDataLNG = MKTIME(0+SUBSTR($strDataSTR,11,2), 0+SUBSTR($strDataSTR,14,2), 0+SUBSTR($strDataSTR,17,2), 0+SUBSTR($strDataSTR,5,2), 0+SUBSTR($strDataSTR,8,2), 0+SUBSTR($strDataSTR,0,4));
//  }
//  Return $strDataLNG;
//}
//
Function JAVA_CharCode( $sCharConteudo ) {
  $sRet_Java = '';
  $sChr_Parm = '';
  $nCont_Pos = 0;
  $nCont_Pos2 = 0;
  While ( True ) {
     $sCharAtual = SUBSTR( $sCharConteudo, $nCont_Pos, 1 );
     If ( STRLEN($sCharAtual)==0 OR $nCont_Pos>1000000 ) { BREAK; }
     $nCharAtual = ORD( $sCharAtual );
	 If ( STRLEN($sChr_Parm)>0 ) { $sChr_Parm .= ','; }
     $sChr_Parm .= $nCharAtual;
     $nCont_Pos++;
     $nCont_Pos2++;
	 If ( $nCont_Pos2==10000 ) { 
        $sRet_Java .= 'String.fromCharCode('.$sChr_Parm.')+';
	    $sChr_Parm = '';
		$nCont_Pos2 = 0;
     }
  }
  $sRet_Java .= 'String.fromCharCode('.$sChr_Parm.')';
  Return $sRet_Java;
}
//
Function JAVA_CharCode_Mini( $sCharConteudo ) {
  $sRet_Java = '';
  $sChr_Parm = '';
  $nCont_Pos = 0;
  While ( True ) {
     $sCharAtual = SUBSTR( $sCharConteudo, $nCont_Pos, 1 );
     If ( STRLEN($sCharAtual)==0 OR $nCont_Pos>1000000 ) { BREAK; }
	 If ($sCharAtual=="'" OR $sCharAtual=='"' OR ORD($sCharAtual)==13 OR ORD($sCharAtual)==10 ) {
        $nCharAtual = ORD( $sCharAtual );
		$sCharAtual = "'+String.fromCharCode(".$nCharAtual.")+'";
	 }
     $sChr_Parm .= $sCharAtual;
     $nCont_Pos++;
  }
  $sRet_Java .= "'".$sChr_Parm."'";
  Return $sRet_Java;
}
//
Function ObterIPdoCliente() {
  If (!EMPTY($_SERVER['HTTP_CLIENT_IP'])) {
     $ip=$_SERVER['HTTP_CLIENT_IP'];
  } ElseIf (!EMPTY($_SERVER['HTTP_X_FORWARDED_FOR'])) {
     $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
  } Else {
     $ip=$_SERVER['REMOTE_ADDR'];
  }
 Return $ip;
}
//
Function GeraChave($nCompChave=30) {     // Gera chave aleat�rio em string
  $CaracteresAceitos = 'abcdefghijlkmnopqurtvxyzwABCDEFGHIJLKMNOPQURTVXYZW0123456789';
  $TamanhoAcMax = strlen($CaracteresAceitos)-1;
  $strChaveGerada = '';
  for($i=0; $i < $nCompChave; $i++) {
    $strChaveGerada .= $CaracteresAceitos{mt_rand(0, $TamanhoAcMax)};
  }
  Return $strChaveGerada;
}
//
//
Function HTML_Botao( $nTipoBotao, $sObjId, $sObjOnClk, $sObjTitulo='', $sObjImage='', $nWidthParm=0 ) {
  $sRetHTML_Botao = '';
  $nWidth = STRLEN($sObjTitulo)*10;
  $sNomeClass = 'botao_tp1';
  //
  // ** Bot�o ENTRAR **
  If ( $nTipoBotao==1 ) {
     $sRetHTML_Botao =
       '<style type="text/css" rel="stylesheet">'.
        '#'.$sObjId.' { clear:both; position:relative; display:block; height: 30px; width: 107px; background:url(images/bot_entrarn.png) no-repeat; background-position:0 0; cursor: pointer; } '.
        '#'.$sObjId.' span.hover { position:absolute; display: block; top: 0px; left: 0px; height: 30px; width: 107px; background:url(images/bot_entrars.png) no-repeat; background-position: bottom; }'.
       '</style>'.
       '<a onclick="'.$sObjOnClk.'" id="'.$sObjId.'" class="efeito_fade_botao"></a>';
  //
  // ** Bot�o **
  } ElseIf ( $nTipoBotao==2 ) {
     $sRetHTML_Botao =
       '<input type="button" id="'.$sObjId.'" onclick="'.$sObjOnClk.'" value="'.$sObjTitulo.'" class="'.$sNomeClass.'">';
  //
  // ** Bot�o **
  } ElseIf ( $nTipoBotao==3 ) {
     If ($nWidthParm>0) {
	    $nWidth = $nWidthParm;
     } Else {
        If ($nWidth<90) { $nWidth = 90; }
	 }
	 If ($nWidth<60 ) { $sNomeClass = 'botao_tp1_x1';}
	 If ($nWidth>150) { $sNomeClass = 'botao_tp1_x2';}
     $sRetHTML_Botao =
       '<span style="text-align:center; vertical-align:middle; display:inline-block; height:30px; line-height:30px; width:'.($nWidth+20).'px;" onclick="'.$sObjOnClk.'" id="'.$sObjId.'" class="'.$sNomeClass.'">'.
	    '<img src="'.$sObjImage.'" border="0" style="position:relative; top:-3px;">'.
		( EMPTY($sObjTitulo) ? "" :
		'<span style="position:relative; top:-1px;">'.
	     '&nbsp;&nbsp;'.$sObjTitulo.
		'</span>' ).
	   '</span>';
  }
  Return $sRetHTML_Botao;
}
//
Function PegarPorPausa($sPegarP_Str,$nPegarQtd=1) {
   $aPegar_Temp1 = EXPLODE(' ',$sPegarP_Str);
   $sPegar_Retorna = '';
   For ($nPegar_Cont = 1; $nPegar_Cont<=$nPegarQtd; $nPegar_Cont++) {
       If (! ISSET( $aPegar_Temp1[$nPegar_Cont-1] ) ) { BREAK; }
       If (STRLEN($sPegar_Retorna)>0) { $sPegar_Retorna .= ' '; }
       $sPegar_Retorna .= $aPegar_Temp1[$nPegar_Cont-1];
   }
   Return $sPegar_Retorna;
}
//
// Deixa todas as palavras do em texto com a primeira letra mai�scula
Function StrMaiusculas($sTexto) {
   $aTexto = EXPLODE(' ',$sTexto);
   $sRetorna = '';
   ForEach ( $aTexto as $sPalavra ) {
      $s_Palavra = STRTOUPPER($sPalavra);
      If ( $s_Palavra=="DOS" OR $s_Palavra=="DAS" OR $s_Palavra=="DE" OR
	       $s_Palavra=="DO"  OR $s_Palavra=="DA"  OR $s_Palavra=="E"     ) {
         $s_Palavra = STRTOLOWER($s_Palavra);
	  } Else {
         $s_Palavra = STRTOUPPER(SUBSTR($s_Palavra,0,1)).STRTOLOWER(SUBSTR($s_Palavra,1));
	  }
	  $sRetorna .= (STRLEN($sRetorna)>0 ? ' ' : '').$s_Palavra;
   }
   Return $sRetorna;
}
//
Function SQL_Bin( $sRecebe ) {
  $sRetorno = "''";
  If ( STRLEN($sRecebe)>0 ) {
     $sRetorno = '0x'.BIN2HEX($sRecebe);
  }
  Return $sRetorno;
}
//

//   ***********************************
//   * Objeto Janela Padr�o do sistema *
//   ***********************************
CLASS R_Janela {
  public $sIdObj;                // Identifica��o do objeto da Janela
  public $nTop;                  // Localiza��o na vertical
  public $nLeft;                 // Localiza��o na horizontal
  public $nWidth;                // Largura
  public $nHeight=0;             // Altura
  public $sTitulo;               // Titulo
  public $nIndicePos=0;          // Indice de sobreposi��o
  public $sJavOnClick;           // Onclick da DIV
  public $sJavOnClickF;          // Onclick no bot�o de fechar (X) da DIV
  public $sJavKeyDown;           // OnKeyDown da DIV
  public $sJavKeyUp;             // OnKeyUp da DIV
  public $aIdsObjList=ARRAY();   // Lista de Ids dos objetos contido na janela para organiza��o de focagem
  //
  public Function MontaJanHTML($b_Par1RJan) {
    Global $sModulo, $sSubModulo, $sAcao, $sNomeAcesso;
    //#FFFDDF
    $sGHt_CorFundo = '#6C7D9A';
    If ($b_Par1RJan) {
	   $sTJav_MouseDown =
	     $this->sIdObj."_mov=1;".
		 "nJanMoverX=event.clientX;".
		 "nJanMoverY=event.clientY;".
	     '';
	   $sTJav_MouseUp =
	     $this->sIdObj."_mov=0;".
	     '';
	   $sTJav_MouseMove =
	     "var Jan=document.getElementById('".$this->sIdObj."');".
		 "if ( window.".$this->sIdObj."_mov == undefined || ".$this->sIdObj."_mov==0 ) {".
		 "} else {".
		     "Jan.style.top = (parseInt(Jan.style.top)+(event.clientY-nJanMoverY))+'px';".
		     "Jan.style.left = (parseInt(Jan.style.left)+(event.clientX-nJanMoverX))+'px';".
		     "nJanMoverX=event.clientX;".
		     "nJanMoverY=event.clientY;".
		 "}".
         '';
	   //
	   $sCondJavaIdObj = '';
	   $sOnClickJan = '';
       ForEach ( $this->aIdsObjList as $sIdObjectL ) {
	       If (STRLEN($sCondJavaIdObj)>0) { $sCondJavaIdObj .= ' && '; }
	       $sCondJavaIdObj .= "sIdHasFocus!='".$sIdObjectL."'";
       }
	   If ( STRLEN($sCondJavaIdObj)>0 ) {
          $sOnClickJan =
             "if (".$sCondJavaIdObj.") {".
                 "if ( document.getElementById('".$this->aIdsObjList[0]."') != undefined ) {".
				     "document.getElementById('".$this->aIdsObjList[0]."').focus();".
				 "}".
             "}";
	   }
	   //
	   $_sJavKeyDown = '';
	   If ( STRLEN($this->sJavKeyDown)>0 ) {
	      $_sJavKeyDown =
		    "if (document.getElementById('".$this->sIdObj."_Travar').style.visibility=='hidden') {".
		        $this->sJavKeyDown.
			"}";
	   }
	   //
	   $_sJavKeyUp = '';
	   If ( STRLEN($this->sJavKeyUp)>0 ) {
	      $_sJavKeyUp =
		    "if (document.getElementById('".$this->sIdObj."_Travar').style.visibility=='hidden') {".
		        $this->sJavKeyUp.
			"}";
	   }
	   //
	   $sTextoDetalhes =
	      "M�dulo: "   .STRTOUPPER($sModulo).", ".
		  ( STRLEN($sSubModulo)>0 ? "Submodulo: ".STRTOUPPER($sSubModulo).", " : "" ).
		  ( STRLEN($sAcao)>0      ? "Ac�o: "     .STRTOUPPER($sAcao)     .", " : "" ).
		  "Acesso: "   .$sNomeAcesso.
		  "";
	   //
       $GHtml_Ret =
	     '<div id="'.$this->sIdObj.'" style="position: absolute; top:'.$this->nTop.'px; left:'.$this->nLeft.'px; z-index:'.$this->nIndicePos.';" onmouseup="'.$sOnClickJan.'" onclick="'.$this->sJavOnClick.'" onkeydown="'.$_sJavKeyDown.'" onkeyup="'.$_sJavKeyUp.'">'.
          '<table align="center" valign="top" border="0" cellspacing="0" cellpadding="0">'.
           '<tr onmousedown="'.$sTJav_MouseDown.'" onmouseup="'.$sTJav_MouseUp.'" onmousemove="'.$sTJav_MouseMove.'">'.
		    '<td width="'.$this->nWidth.'">'.
             '<table width="100%" border="0" cellspacing="0" cellpadding="0">'.
              '<tr>'.
               '<td width="11px" height="25px"><img src="./images/jan1_borda1.png" border="0" height="25px" width="100%">'.
			   '</td>'.
               '<td valign="center" style="font-size:12px; color:#FFFFFF; font-weight:bold; background:url(./images/jan1_borda2.png) no-repeat; background-position:0px 0px; background-size: 100% 100%;">'.
                '<span title="'.$sTextoDetalhes.'">'.
			     STR_REPLACE(' ','&nbsp;',$this->sTitulo).
			    '</span>'.
  	           '</td>'.
			   ( STRLEN($this->sJavOnClickF)==0 ? '' :
			   '<td width="25px" align="center" valign="middle" style="background:url(./images/jan1_borda2.png) no-repeat; background-position:0px 0px; background-size: 100% 100%;">'.
			    '<img src="images/btjan_fecha1.png" border="0" onclick="'.$this->sJavOnClickF.'" onmouseover="'."this.src='images/btjan_fecha2.png';".'" onmouseout="'."this.src='images/btjan_fecha1.png';".'" onmousedown="'."this.src='images/btjan_fecha3.png';".'">'.
			   '</td>'
			   ).
               '<td width="11px"><img src="./images/jan1_borda3.png" border="0" height="25px" width="100%">'.
			   '</td>'.
              '</tr>'.
  		     '</table>'.
            '</td>'.
		   '</tr>'.
  		   '<tr>'.
		    '<td style="background-color: #91D8F8;">'.
  		     '<div style="'.( $this->nHeight > 0 ? 'height:'.$this->nHeight.'px;' : '' ).'margin:4px; border-style:solid; border-width:1px; border-color:#45B6E7; background-color: #FAF9F5;" onmousemove="'.$sTJav_MouseUp.'">';
    } Else {
       $GHtml_Ret =
		      '<div id="'.$this->sIdObj.'_Travar" style="visibility:hidden; position:absolute; z-index:90; top:0px; left:0px; width:100%; height:100%; opacity:0.65; -moz-opacity:0.65; filter:alpha(opacity=65); background-color:#000000;">'.
			  '</div>'.
  	         '</div>'.
		    '</td>'.
		   '</tr>'.
		  '</table>'.
		 '</div>'.
         '';
    }
    Return $GHtml_Ret;
  }

}
//   *****************************  FUNCOES DO RETAGUARDA ************************
//

// Informa o ocorrido, tipos: 1=Erro, 0=Alerta
function Info_Evento($sMensagem_Info,$nTipo_Info=0,$sTituloJan='',$nGra_Log=1) {
   GLOBAL $sModulo, $sSubModulo, $sAcao, $R_CadFuncionario;
   //
   $sMensagem_Info = STR_REPLACE(CHR(10),"",$sMensagem_Info);
   $sMensagem_Info = STR_REPLACE(CHR(13),"<br>",$sMensagem_Info);
   $sMensagem_Info = STR_REPLACE(CHR(3),"",$sMensagem_Info);
   //
   $sModuloInfo = $sModulo;
   $sModuloInfo = ((STRLEN($sModuloInfo)>0) ? STRTOUPPER($sModuloInfo).'('.($sSubModulo).','.$sAcao.') -' : '');
   $sTipo_Info = "Alerta";
   If ($nTipo_Info==1) {
      $sTipo_Info    = " ERRO ";
   }
	If($nGra_Log==1) {
      If ( IS_DIR(Url_Site_Path.'log_info') ) {
        $hInfoArq = FOPEN(Url_Site_Path.'log_info/'.DATE("Y_m_d").'_info.txt','a');
        FWRITE($hInfoArq,DATE("H:i:s").' '.ObterIPdoCliente().' '.$sModuloInfo.' '.$sTipo_Info.' : '.PegarPorPausa(@$R_CadFuncionario->FUN_NOMECP,2).' : '.$sMensagem_Info.CHR(13).CHR(10));
        FCLOSE($hInfoArq);
      }
	}
   Return 'parent.Alerta_Simples('.JAVA_CharCode($sMensagem_Info).','.($nTipo_Info+0).",'".$sTituloJan."');";
}
//

//   *****************************
//   * Objeto GRID para consulta *
//   *****************************
CLASS Pad_GridPesq {
  public  $sNomeTabela;     // Nome da tabela no banco de dados e ID
  public  $sTabelas;        // Nome das tabelas no banco
  public  $nQtdCampos;      // Quantidade de campos declarados
  public  $nQtdRegistros;   // Quantidade de registros encontrados desde a ultima consulta com MontaTabelaHTML()
  public  $nWidth;          // Largura da Grid
  public  $nHeight;         // Altura da Grid
  public  $nHeight_Row;     // Altura de cada linha da Grid
  public  $bUsarSoMatriz;   // Usar somente a matriz e n�o ser� executada nenhuma consulta SQL
  public  $aLstItensTab;    // Matriz de itens da tabela
  public  $sBDParametros;   // Parametros de consulta SQL para a montagem da Grid
  public  $sBDQuery;        // Montar consulta SQL completa
  public  $sCampoOnClick;   // Script em java acionado ao clicar do nome do campo
  public  $sLinhaOnClick;   // Script em java acionado ao clicar na linha do registro na Grid
  public  $sLinhaOnDblClk;  // Script em java acionado ao clique duplo na linha do registro na Grid
  public  $sIdObjTabela;    // Identifica��o do objeto aonde a Grid vai ficar instalada
  public  $aLstCampos;      // Lista dos campos em matriz
  private $sLstCampos;      // Lista de campos em string (Ex: FUN_APELID,Apelido,100px;FUN_NOMECP,Nome Completo,300px;... )
  public  $sCampoIndice;    // Campo principal (Codigo)
  public  $sJavSelectReg;   // Script em java acionado ao alterar linha selecionada na Grid
  public  $s_PHP_IniMonta;  // Codigo fonte em PHP � executado no come�o da fun��o MontaTabelaHTML()
  public  $s_PHP_LinhaTb;   // Codigo fonte em PHP � executado a cada linha da tabela
  public  $s_PHP_LinhaTbF;  // Codigo fonte em PHP � executado a cada linha da tabela no final do ciclo
  public  $s_PHP_ColunaTb;  // Codigo fonte em PHP � executado a cada coluna da tabela
  private $sHTMLAguarde;    // HTML da mensagem aguarde
  //
  //
  public function __construct() {
	 $this->nHeight_Row = 21;
  }
  //
  public function Pad_GridPesq() {
     $this->sHTMLAguarde = 
       '<table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">'.
        '<tr><td align="center" valign="middle" style="color:#555555;">'.
        'Aguarde um momento...<br>'.
        '<img src="images/img_load1.gif" border="0">'.
        '</td></tr>'.
       '</table>'.
       '';
  }
  //
  public Function GLstCampos($sLstCamposVar) {
    $this->sLstCampos = $sLstCamposVar;
    $this->aLstCampos = EXPLODE(";",$this->sLstCampos);
	$this->nQtdCampos = COUNT($this->aLstCampos);
  }
  //
  public Function MontaDivHtml() {
     Return '<div id="'.$this->sIdObjTabela.'" style="width:'.$this->nWidth.'px; height:'.$this->nHeight.'px; background:#FFFFFF; overflow:auto;">'.
	         $this->sHTMLAguarde.
	        '</div>';
  }
  //
  public Function MontaTabelaHTML() {
     If (STRLEN($this->s_PHP_IniMonta)>0) { EVAL( $this->s_PHP_IniMonta ); }
     $sBDCamposN = '';  $sBDCamposD = ''; $sBDCamposP = ''; $sBDCamposT = '';
     $nQ_Campos = 1;
     While ( True ) {
        $sTemp1 = @$this->aLstCampos[$nQ_Campos-1];
  	    If ( STRLEN($sTemp1)==0 ) { $nQ_Campos--; BREAK; }
        $aTemp1 = EXPLODE(",",$sTemp1.',');
  	    If ( STRLEN($sBDCamposN)>0 ) { $sBDCamposN .= ','; $sBDCamposD .= ';'; $sBDCamposP .= ';'; $sBDCamposT .= ';'; }
  	    $sBDCamposN .= @$aTemp1[0];
  	    $sBDCamposD .= @$aTemp1[1];
  	    $sBDCamposP .= @$aTemp1[2];
  	    $sBDCamposT .= @$aTemp1[3];
        $nQ_Campos++;
     }
     $aBDCamposN = EXPLODE(",",$sBDCamposN);
     $aBDCamposD = EXPLODE(";",$sBDCamposD);
     $aBDCamposP = EXPLODE(";",$sBDCamposP);
     $aBDCamposT = EXPLODE(";",$sBDCamposT);
	 //$sSQLTempTabela = "SELECT ".$sBDCamposN.(STRLEN($this->sCampoIndice)>0 ? ','.$this->sCampoIndice : '')." FROM ".$this->sNomeTabela." ".$this->sBDParametros.";";
	 If ( STRLEN($this->sBDQuery)==0 ) {
	    $sParmTabDados = ( STRLEN($this->sTabelas)>2 ? $this->sTabelas : $this->sNomeTabela );
	    //$sSQLTempTabela = "SELECT ".$sBDCamposN.(STRLEN($this->sCampoIndice)>0 ? ','.$this->sCampoIndice : '')." FROM ".$sParmTabDados." ".$this->sBDParametros.";";
	    $sSQLTempTabela = "SELECT * FROM ".$sParmTabDados." ".$this->sBDParametros.";";
	} Else {
	    $sSQLTempTabela = $this->sBDQuery;
	}
	$sRet_TabelaHTML = '';
    $nContador = 0;
	$nWidthTotal = 0;
	$bWidthCemPr = False;
    While ( $nContador<$nQ_Campos ) {
       $sTDonclickP = STR_REPLACE("<NUMCAM>",($nContador+1)."",$this->sCampoOnClick);
       $sRet_TabelaHTML .=
  	      '<td id="'.$this->sIdObjTabela.'_Campo'.($nContador+1).'" width="'.$aBDCamposP[$nContador].'" height="23px" class="Tabela1_TD1" onclick="'.$sTDonclickP.'">'.
  	      $aBDCamposD[$nContador].
  	      '</td>';
	   $nWidthCampo = Somente_Numeros($aBDCamposP[$nContador])+0;
	   If ( $nWidthCampo==0 ) {
	      $bWidthCemPr = True;
	   }
	   $nWidthTotal += $nWidthCampo;
       $nContador++;
    }
    $sRet_TabelaHTML =
      '<table class="Tabela1_Tab" width="'.($bWidthCemPr ? '100%' : '').'" border="1" cellspacing="0" cellpadding="0" bordercolor="#AAAAAA" style="'.($bWidthCemPr ? '' : 'table-layout:fixed;').'border-collapse: collapse;">'.
       '<tr class="Degrade1">'.
  	    $sRet_TabelaHTML.
	   '</tr>';
     $aCoresLin = ARRAY( 1, '#EEEEEE', '#FFFFFF' );
     $nContRow = 1;
	 $this->nQtdRegistros = 0;
	 //
	 $aListaTab = ARRAY();
	 If ( $this->bUsarSoMatriz ) {
	    // Sem consulta SQL
		$aListaTab = $this->aLstItensTab;
     } Else {
	    // Com consulta SQL
        $Row_TempTabela = MYSQL_QUERY($sSQLTempTabela) Or Die(MYSQL_ERROR().'<br>'.CHR(13).'  QUERY(( '.$sSQLTempTabela.' ))');
        While ( $Row_Temp2Tabela = MYSQL_FETCH_ARRAY($Row_TempTabela) ) {
	       $aListaTab[] = $Row_Temp2Tabela;
	    }
		$this->aLstItensTab = $aListaTab;
	 }
	 //
     ForEach ( $aListaTab As $Row_Temp2Tabela ) {
	    $this->nQtdRegistros++;
        $sTRonclickP = $this->sLinhaOnClick;
        $sTRonclickP = STR_REPLACE("<QTDCOL>",$nQ_Campos.'',$sTRonclickP);
        $sTRonclickP = STR_REPLACE("<SELLIN>",$nContRow.'' ,$sTRonclickP);
        $sTRonclickP = STR_REPLACE("<INDICE>",$Row_Temp2Tabela[$this->sCampoIndice].'' ,$sTRonclickP);
        $sTRonDblClkP = $this->sLinhaOnDblClk;
        $sTRonDblClkP = STR_REPLACE("<QTDCOL>",$nQ_Campos.'',$sTRonDblClkP);
        $sTRonDblClkP = STR_REPLACE("<SELLIN>",$nContRow.'' ,$sTRonDblClkP);
        $sTRonDblClkP = STR_REPLACE("<INDICE>",$Row_Temp2Tabela[$this->sCampoIndice].'' ,$sTRonDblClkP);
		$s_CorLinha = $aCoresLin[$aCoresLin[0]];
		$b_IncluirL = True;
		$s_BalaoTit = '';
		If ( STRLEN($this->s_PHP_LinhaTb)>3 ) { EVAL($this->s_PHP_LinhaTb); }
        If ( ! $b_IncluirL ) { CONTINUE; }
		$sRet_TabelaHTML .=
		  '<span id="'.$this->sIdObjTabela.'_IndiceRow'.$nContRow.'" style="display:none">'.$Row_Temp2Tabela[$this->sCampoIndice].'</span>'.
          '<tr style="background-color: '.$s_CorLinha.';" onclick="'.$sTRonclickP.'" ondblclick="'.$sTRonDblClkP.'" title="'.$s_BalaoTit.'">';
        $nContador = 0;
        While ( $nContador<$nQ_Campos ) {
           $sConteudoCRow = $Row_Temp2Tabela[$aBDCamposN[$nContador]];
		   $sTd_ParmHTML = '';
           If ( SUBSTR(@$aBDCamposT[$nContador],0,8)=="STRZERO=" ) {       // ** Preenchimento com "0"
		      $nQuant_Zero = SUBSTR(@$aBDCamposT[$nContador],8)+0;
              $sConteudoCRow = Str_Zero($sConteudoCRow, $nQuant_Zero);
           } ElseIf ( SUBSTR(@$aBDCamposT[$nContador],0,8)=="DECIMAL=" ) { // ** Alinhamento decimal
		      $nQuant_Zero = SUBSTR(@$aBDCamposT[$nContador],8)+0;
              $sConteudoCRow = NUMBER_FORMAT($sConteudoCRow, $nQuant_Zero, ',','');
           } ElseIf ( SUBSTR(@$aBDCamposT[$nContador],0,7)=="LIMITE=" ) {  // ** Limitar a quantidade de caracteres
		      $n_Quantidade = SUBSTR(@$aBDCamposT[$nContador],7)+0;
              $sConteudoCRow = SUBSTR($sConteudoCRow,0,$n_Quantidade);
           } ElseIf ( @$aBDCamposT[$nContador]=="TEL" ) {     // ** Telefone
              $sConteudoCRow = FormataTelefone($sConteudoCRow);
           } ElseIf ( @$aBDCamposT[$nContador]=="MOE" ) {     // ** Moeda
              If (($sConteudoCRow+0)==0) {
           	     $sConteudoCRow = '';
           	  } Else {
                 $sConteudoCRow = "R$ ".FormatoMoeda($sConteudoCRow).'&nbsp;&nbsp;';
				 //$sConteudoCRow = "<table width='98%' border='0'><tr><td width='25%'>R$</td><td align='right'> ".FormatoMoeda($sConteudoCRow).'</td></tr></table>';
				 $sTd_ParmHTML = 'align="right"';
           	  }
           } ElseIf ( @$aBDCamposT[$nContador]=="PERC" ) {    // ** Formato percentual
			  $sTd_ParmHTML = 'align="center"';
		      If ($sConteudoCRow==0) {
			     $sConteudoCRow = '0%';
			  } Else {
                 $sConteudoCRow = ($sConteudoCRow+0).'%';
			  }
           } ElseIf ( @$aBDCamposT[$nContador]=="PFJ" ) {     // ** CPF ou CNPJ
              If ( STRLEN($sConteudoCRow)<12 ) {
                 $sConteudoCRow = SUBSTR($sConteudoCRow,0,3).'.'.SUBSTR($sConteudoCRow,3,3).'.'.SUBSTR($sConteudoCRow,6,3).'-'.SUBSTR($sConteudoCRow,9,2);
              } Else {
                 $sConteudoCRow = SUBSTR($sConteudoCRow,0,2).'.'.SUBSTR($sConteudoCRow,2,3).'.'.SUBSTR($sConteudoCRow,5,3).'/'.SUBSTR($sConteudoCRow,8,4).'-'.SUBSTR($sConteudoCRow,12,2);
              }
           } ElseIf ( @$aBDCamposT[$nContador]=="DTH" ) {     // ** Data e Hora
		      $sConteudoCRow = ConvertDtHrSTR($sConteudoCRow);
		      If ($sConteudoCRow==0) {
			     $sConteudoCRow = '';
			  } Else {
                 $sConteudoCRow = DATE("d/m/Y H:i:s", $sConteudoCRow);
			  }
		   } ElseIf ( @$aBDCamposT[$nContador]=="HOR" ) {     // ** Hora
		      If ($sConteudoCRow==0) {
			     $sConteudoCRow = '';
			  }	  

           } ElseIf ( @$aBDCamposT[$nContador]=="DRT" ) {     // ** Campo DateTime s� mostra a Hora
		      $sConteudoCRow = ConvertDtHrSTR($sConteudoCRow);
		      If ($sConteudoCRow==0) {
			     $sConteudoCRow = '';
			  } Else {
                 $sConteudoCRow = DATE("H:i:s", $sConteudoCRow);
			  }
           } ElseIf ( @$aBDCamposT[$nContador]=="DTA" ) {     // ** Campo DateTime s� mostra a Data
		      $sConteudoCRow = ConvertDtHrSTR($sConteudoCRow);
		      If ($sConteudoCRow==0) {
			     $sConteudoCRow = '';
			  } Else {
                 $sConteudoCRow = DATE("d/m/Y", $sConteudoCRow);
			  }
           } ElseIf ( @$aBDCamposT[$nContador]=="SMNDTA" ) {  // ** Campo DateTime s� mostra o dia da semana (3digitos) e a Data
		      $sConteudoCRow = ConvertDtHrSTR($sConteudoCRow);
		      $sTd_ParmHTML = 'align="right"';
		      If ($sConteudoCRow==0) {
			     $sConteudoCRow = '';
			  } Else {
                 $aDias_da_Semana = ARRAY('Dom','Seg','Ter','Qua','Qui','Sex','S�b');
                 $sConteudoCRow = $aDias_da_Semana[DATE("w",$sConteudoCRow)+0]." ".DATE("d/m/Y", $sConteudoCRow)."&nbsp;";
			  }
           } ElseIf ( @$aBDCamposT[$nContador]=="NUMLOC" ) {  // ** Numero do Local (FAT_NUM_MES)
              If ( ($sConteudoCRow+0)==0 OR ($sConteudoCRow+0)==999 ) { $sConteudoCRow = ''; }
		      // dia da semana por extenso
		   } ElseIf ( @$aBDCamposT[$nContador]=="DIADASEMANA" ) {  // ** dia da semana por extenso
              //
              SWITCH ($sConteudoCRow) {
                CASE 1:
		   	      $sConteudoCRow = "Domingo";
                  BREAK;
                CASE 2:
                  $sConteudoCRow = "Segunda";
                  BREAK;
		        CASE 3:
                  $sConteudoCRow = "Ter�a";
                  BREAK;
                CASE 4:
                  $sConteudoCRow = "Quarta";
                  BREAK;
		        CASE 5:
                  $sConteudoCRow = "Quinta";
                  BREAK;
                CASE 6:
                  $sConteudoCRow = "Sexta";
                  BREAK;
                CASE 7:
                  $sConteudoCRow = "S�bado";
                  BREAK;
				DEFAULT:
                  $sConteudoCRow = "";
		      }
		      //
           } ElseIf ( @$aBDCamposT[$nContador]=="LOGICA" ) {  // SIM / N�O
		       If ( ($sConteudoCRow+0)>0 ) {
			      $sConteudoCRow = "Sim";
			   } Else {
			      $sConteudoCRow = "N�o";
			   }
		       //
           } Else {
			   $sConteudoCRow = CodAsciiHTML($sConteudoCRow);
		   }
			
		   If ( STRLEN($this->s_PHP_ColunaTb)>3 ) { EVAL($this->s_PHP_ColunaTb); }		   
           $sRet_TabelaHTML .=
		      '<td id="'.$this->sIdObjTabela.'_tdRow'.$nContRow.'_'.$nContador.'" class="Tabela1_TD2" height="'.$this->nHeight_Row.'px" '.$sTd_ParmHTML.'>'.
			   $sConteudoCRow.
			  '</td>';
           $nContador++;
        }
   		If ( STRLEN($this->s_PHP_LinhaTbF)>3 ) { EVAL($this->s_PHP_LinhaTbF); }
        $sRet_TabelaHTML .= '</tr>';
        $aCoresLin[0]++;
        If ( ! ISSET($aCoresLin[$aCoresLin[0]]) ) { $aCoresLin[0]=1; }
        $nContRow++;
     }
     $sRet_TabelaHTML .=
  	 '</table>';
     Return $sRet_TabelaHTML;
  }
  //
  public Function MontaJavaAgu() {
     Return
	   'parent.document.getElementById("'.$this->sIdObjTabela.'").innerHTML = '."'".$this->sHTMLAguarde."'; ".
	   '';
  }
  //
  public Function MontaJavaPri() {
     Return
       'var nPesq_CampoSel="";'.
       'function P_Sel(nNumCampo) {'.
         'for (i=1; i<40; i++) {'.
		    'if ( parent.document.getElementById("'.$this->sIdObjTabela.'_Campo"+i) != null ) {'.
                'if ( i==nNumCampo ) {'.
                    'parent.document.getElementById("'.$this->sIdObjTabela.'_Campo"+i).style.backgroundColor="#AAEEFF";'.
                '} else {'.
                    'parent.document.getElementById("'.$this->sIdObjTabela.'_Campo"+i).style.backgroundColor="";'.
                '}'.
		    '}'.
         '}'.
         'nPesq_CampoSel = nNumCampo;'.
       '}'.
       'function P_TeclasPress_fm(e) {'.
         'e = e || window.event;'.
         'var keynum = e.which || e.keyCode;'.
         'var AltKey = e.altKey;'.
         'var CtrlKey = e.ctrlKey;'.
	     'var ShiftKey = e.shiftKey;'.
	     'if (CtrlKey) {'.                // CTRL pressionado
            'if (keynum == 13) {'.        // ENTER
	  		 "alert('ok1');".
	  	  '} else if (keynum == 39) {'. // Seta para direita
	           "parent.document.getElementById('".$this->sIdObjTabela."').scrollLeft += 50;".
	  		 "return false;".
            '} else if (keynum == 37) {'. // Seta para esquerda
	           "parent.document.getElementById('".$this->sIdObjTabela."').scrollLeft -= 50;".
	  		 "return false;".
	  	  '}'.
	     '} else if (AltKey) {'.         // ALT pressionado
	     '} else if (ShiftKey) {'.       // SHIFT pressionado
	     '} else {'.
            'if (keynum == 13) {'.
               "P_Atu();".
               'return false;'.
            '} else if (keynum == 38) {'. // Seta para cima
	           //'PRow_Sel('.($this->nQtdCampos-1).','.$this->sIdObjTabela.'_Rowsel-1);'.
	           'PRow_Sel(30,'.$this->sIdObjTabela.'_Rowsel-1);'.
	           "return false;".
            '} else if (keynum == 40) {'. // Seta para baixo
	           //'PRow_Sel('.($this->nQtdCampos-1).','.$this->sIdObjTabela.'_Rowsel+1);'.
	           'PRow_Sel(30,'.$this->sIdObjTabela.'_Rowsel+1);'.
	           "return false;".
            '} else if (keynum == 33) {'. // PageUp
	           //'PRow_Sel('.($this->nQtdCampos-1).',1);'.
	           'PRow_Sel(30,1);'.
	           "return false;".
            '} else if (keynum == 34) {'. // PageDown
	           "return false;".
            '}'.
	      '}'.
       '}'.
	   $this->sIdObjTabela."_Rowsel=1;".
	   //
	   'function PRow_Sel(vQtdColunas,vPosLinha,vPosIndex) { '.
	     //"if ( window.".$this->sIdObjTabela."_Rowsel==undefined) {".
	     //    $this->sIdObjTabela."_Rowsel = 1;".
	     //"}".
         "var iObj = parent.document.getElementById('".$this->sIdObjTabela."_tdRow'+".$this->sIdObjTabela."_Rowsel+'_1');".
	     "var iObj2= parent.document.getElementById('".$this->sIdObjTabela."_tdRow'+vPosLinha+'_1');".
	     "var iObj3= parent.document.getElementById('".$this->sIdObjTabela."_tdRow1_1');".
	     "if ( iObj==null || iObj2==null ) { ".
		     "if (iObj3==null) {".
		         "return false;".
			 "} else {".
			     "if (vPosLinha<3) {".
			         "vPosLinha=1;".
				 "} else {".
		             "return false;".
				 "}".
			 "}".
		 "} ".
	     "var iObj2=null;".
	     "for (i=0; i<vQtdColunas; i++) {".
	       "var iObj = parent.document.getElementById('".$this->sIdObjTabela."_tdRow'+".$this->sIdObjTabela."_Rowsel+'_'+i);".
		   "if (iObj == null) { break; }".
	       "iObj.style.backgroundColor='';".
	       "iObj.style.color='';".
	     "}".
	     $this->sIdObjTabela."_Rowsel=vPosLinha;".
	     "for (i=0; i<vQtdColunas; i++) {".
	         "var iObj = parent.document.getElementById('".$this->sIdObjTabela."_tdRow'+".$this->sIdObjTabela."_Rowsel+'_'+i);".
			 "if (iObj == null) { break; }".
	         "iObj.style.backgroundColor='#4646FF';".
	         "iObj.style.color='#FFFFFF';".
	     "}".
	     "vPosScroll = ((".$this->sIdObjTabela."_Rowsel)*".$this->nHeight_Row.")-parent.document.getElementById('".$this->sIdObjTabela."').scrollTop;".
	     "if (".$this->sIdObjTabela."_Rowsel<2) {".
	        "parent.document.getElementById('".$this->sIdObjTabela."').scrollTop = 0;".
	     "} else if (vPosScroll<1) {".
	        "parent.document.getElementById('".$this->sIdObjTabela."').scrollTop += -(3-vPosScroll);".
	     "} else if (vPosScroll>".($this->nHeight-($this->nHeight_Row*2)).") {".
	        "parent.document.getElementById('".$this->sIdObjTabela."').scrollTop += ".($this->nHeight_Row*2).";".
	     "}".
		 "S_Indice = parent.document.getElementById('".$this->sIdObjTabela."_IndiceRow'+".$this->sIdObjTabela."_Rowsel).innerHTML; ".
	     $this->sJavSelectReg.
	   '}'.
	   '';
  }
}
//
// MONTAR GUIAS (DIVIS�RIAS)
Function MontarGuiasHTML($sIdSufixo, $sParmStyle="width:100%", $sGuias, $sJavChange="", $nSel_Padrao = 0) {
   $sRet_HTML = '';
   $sLer_Guias = $sGuias;
   $aLst_Guias = ARRAY();
   $nQtd_Guias = 0;
   For ($nForLp=0; $nForLp<100; $nForLp++) {
       $nIni_Pos = STRPOS(" ".$sLer_Guias,"** [{");
       $nIni_Cnt = STRPOS(" ".$sLer_Guias,"}] **");
	   If ($nIni_Pos==0 OR $nIni_Cnt==0) { BREAK; }
       $nFim_Pos = STRPOS(" ".$sLer_Guias,"** {[FIM]} **");
	   If ($nFim_Pos==0) { BREAK; }
	   $sLer_Guias = SUBSTR($sLer_Guias, $nIni_Pos-1);
	   $sProc_Guia = SUBSTR($sLer_Guias, 0, $nFim_Pos+12);
	   $sLer_Guias = SUBSTR($sLer_Guias, $nFim_Pos+12);
	   $sGuia_Titulo = SUBSTR($sProc_Guia, 5,$nIni_Cnt-6);
       $aParametros = EXPLODE(";",$sGuia_Titulo.";");
       $sGuia_Titulo = @$aParametros[0];
       $nGuia_Codigo = Somente_Numeros(@$aParametros[1])+0;
	   $sProc_Guia = SUBSTR($sProc_Guia, $nIni_Cnt+4,$nFim_Pos-(5+$nIni_Cnt));
	   //ECHO 'INICIO<br>'.$sGuia_Titulo.'<br>'.$sProc_Guia.'<br>FIM<br>';
	   $nQtd_Guias++;
	   $aLst_Guias[$nForLp][0] = $sGuia_Titulo;   // Titulo da Guia
	   $aLst_Guias[$nForLp][1] = $sProc_Guia;     // Conte�do da Guia
	   $aLst_Guias[$nForLp][2] = $nGuia_Codigo;   // C�digo da Guia
   }
   //
   $aGuia_Imag[0] = 'images/guia_100_nor.png';
   $aCor_Texto[0] = '#666666';
   $aGuia_Imag[1] = 'images/guia_100_sel.png';
   $aCor_Texto[1] = '#000000';
   //
   $sGuias_HTML = '';
   For ($nForLp=0; $nForLp<$nQtd_Guias; $nForLp++) {
      $sGuia_Imag = $aGuia_Imag[0];
	  $sCor_Texto = $aCor_Texto[0];
	  $sQdr_Displ = 'none';
	  $nQdr_Width = 100;
	  If ( STRLEN($aLst_Guias[$nForLp][0])>12 ) {
	     //$nQdr_Width += (STRLEN($aLst_Guias[$nForLp][0])-12)*8;
	     $nQdr_Width += ROUND((STRLEN($aLst_Guias[$nForLp][0])-12)*6.2);
	  }
      //
      $nGuia_Codigo = $aLst_Guias[$nForLp][2];
      If ( $nGuia_Codigo<1 ) {
         $nGuia_Codigo = $nForLp+1;
      }
      If ( $nSel_Padrao<1 ) {
         $nSel_Padrao = ($nGuia_Codigo);
      }
      If ( $nSel_Padrao==($nGuia_Codigo) ) {   // Guia Pr�-Selecionada
         $sGuia_Imag = $aGuia_Imag[1];
	     $sCor_Texto = $aCor_Texto[1];
	     $sQdr_Displ = 'inline-table';
	  }
      //
	  $sJavOnClick =
	     "var tmp_GUIA_Sel = document.getElementById('".$sIdSufixo."_GUIA_Sel');".
		 "var tmp_GuiaG = document.getElementById('".$sIdSufixo."_G'+tmp_GUIA_Sel.innerHTML);".
		 "var tmp_GuiaD = document.getElementById('".$sIdSufixo."_D'+tmp_GUIA_Sel.innerHTML);".
		 "var tmp_GuiaE = document.getElementById('".$sIdSufixo."_D".($nGuia_Codigo)."');".
		 "tmp_GuiaG.style.backgroundImage='url(".$aGuia_Imag[0].")';".
		 "tmp_GuiaG.style.color='".$aCor_Texto[0]."';".
		 "tmp_GuiaD.style.display='none';".
		 "tmp_GuiaE.style.display='inline-table';".
		 "this.style.backgroundImage='url(".$aGuia_Imag[1].")';".
		 "this.style.color='".$aCor_Texto[1]."';".
		 "tmp_GUIA_Sel.innerHTML='".($nGuia_Codigo)."';".
		 $sJavChange.
		 '';
      $sJavOnClick = STR_REPLACE("<COD_GUIA>",($nGuia_Codigo),$sJavOnClick);
      $sGuias_HTML .=
	     //'<span id="'.$sIdSufixo.'_G'.($nForLp+1).'" onclick="'.$sJavOnClick.'" style="background:url('.$sGuia_Imag.') no-repeat; background-position:0 0; cursor: pointer; display:inline-block; width:100px; height:34px; color:'.$sCor_Texto.';" align="left">'.
	     '<span id="'.$sIdSufixo.'_G'.($nGuia_Codigo).'" onclick="'.$sJavOnClick.'" style="background:url('.$sGuia_Imag.') no-repeat;	background-size: '.$nQdr_Width.'px 33px; background-position:0 0; cursor: pointer; display:inline-block; width:'.$nQdr_Width.'px; height:34px; color:'.$sCor_Texto.';" align="left">'.
		  '<span style="font-weight:bold; display:inline-block; position:relative; top:12px; left:15px;">'.
		   $aLst_Guias[$nForLp][0].
		  '</span>'.
		 '</span>'.
		 //'&nbsp;'.
		 '';
	  $sRet_HTML .=
	     //'<div id="'.$sIdSufixo.'_D'.($nForLp+1).'" style="display:'.$sQdr_Displ.'; background-color:#F2F1F0; '.$sParmStyle.'">'.
	     '<div id="'.$sIdSufixo.'_D'.($nGuia_Codigo).'" style="display:'.$sQdr_Displ.'; '.$sParmStyle.'">'.
	     $aLst_Guias[$nForLp][1].
		 '</div>';
   }
   //
   $sRet_HTML =
      '<div align="left" id="'.$sIdSufixo.'_GUIAS" style="position:relative; top:2px;">'.
      $sGuias_HTML.
	  '</div>'.
	  $sRet_HTML.
	  '<span id="'.$sIdSufixo.'_GUIA_Sel" style="display:none;">'.$nSel_Padrao.'</span>'.
	  '';
   Return $sRet_HTML;
}
//
//
Function CSS_Estilos($nCod_Estilo,$idClass) {
   $sRetorno_CSS = "";
   If ( $nCod_Estilo==1 ) {  // ToolTip do Balaozinho
      $sRetorno_CSS .=
        'div > .'.$idClass.', li > .'.$idClass.', a > .'.$idClass.', span > .'.$idClass.' {'.
          'opacity: 0;'.
          'visibility: hidden;'.
          '-webkit-transition: 0.3s;'.
          '-moz-transition: all 0.3s;'.
        '}'.
        'div:hover > .'.$idClass.', li:hover > .'.$idClass.', a:hover > .'.$idClass.', span:hover > .'.$idClass.','.
          'a .'.$idClass.':hover, span .'.$idClass.':hover, li .'.$idClass.':hover, div .'.$idClass.':hover {'.
          'opacity: 1;'.
          'visibility: visible;'.
          'overflow: visible;'.
          'margin-top: -30px;'.
          'display: inline;'.
          'margin-left: 10px;'.
          '-webkit-transition: 0.3s;'.
          '-moz-transition: all 0.3s;'.
        '}'.
        '.'.$idClass.' {'.
          'background: #3378C1;'.
          'color: #fff;'.
          '-webkit-border-radius: 5px;'.
          '-moz-border-radius: 5px;'.
          '-o-border-radius: 5px;'.
          'border-radius: 5px;'.
          'padding: 10px;'.
          'margin-left: 10px;'.
          'position: absolute;'.
          'font-family: Arial;'.
          'font-size: 12px;'.
          'text-decoration: none;'.
          'font-style: normal; '.
          'z-index: 10;'.
        '}'.
        '.'.$idClass.':before {'.
          'content: "";'.
          'background: #3378C1;'.
          'border: 0;'.
          'width: 10px;'.
          'height: 10px;'.
          'margin-left: 5px;'.
          'margin-top: 20px;'.
          'display: block;'.
          'position: absolute;'.
          '-webkit-transform: rotate(-45deg);'.
          '-moz-transform: rotate(-45deg);'.
          '-o-transform: rotate(-45deg);'.
          'transform: rotate(-45deg);'.
          'display /*\**/: none\9;'.
          '*display: none !important;'.
          '*display: none;'.
        '}';
   }
   Return $sRetorno_CSS;
}
//
//
// Gera a impressao para o serial
Function GerarImp_Cupom($nFat_CFatGer, $sCaminho_Impre) {
   $bCupomAIte = SQLVarConfig('IMP_AGRUPAITEM_CUPOM');   //se agrupa os itens no fechamento
   If ( $nFat_CFatGer>0 && STRLEN($sCaminho_Impre)>0 ) {
      $aFat_Geral = GetSQL_Fat_Geral("FAT_CODIGOI=".$nFat_CFatGer, False);
	  $aFat_Geral = @$aFat_Geral[0];
	  If ( (@$aFat_Geral['FAT_CODIGOI']+0)==0 ) { Return False; }
	  //
      $sTxt_Arquivo = '';
      $sExt_Arquivo = '';
      //
      $Tmp1 = SQLVarConfig('GARCOM_IMPC_'.$aFat_Geral['FAT_TIP_LOC']);
      $Tmp1 = EXPLODE(';',$Tmp1);
      If (@$Tmp1[0]+0) {
         $sExt_Arquivo = @$Tmp1[1];
   	     If ( STRLEN($sExt_Arquivo)==0 ) { $sExt_Arquivo = 'IMP'; }
         $sTxt_Arquivo = MontaCupom_Rec('fat_geral.FAT_CODIGOI='.$nFat_CFatGer,False,$bCupomAIte);
      }
      //
      If ( STRLEN($sTxt_Arquivo)>0 ) {
         $sTemporarios = GETCWD().'/temporarios';
         If ( ! IS_DIR( $sTemporarios ) ) {
            MKDIR( $sTemporarios );
         }
   	     $sNomArqExpT = $sTemporarios.'/ECook_'.$nFat_CFatGer.'_TOTAL.tmp';
         $sNomArqExpR = $sCaminho_Impre.'ECook_'.$nFat_CFatGer.'_TOTAL.'.$sExt_Arquivo;
   	     $hArqExp = FOPEN( $sNomArqExpT, "a" );
   	     FWRITE($hArqExp, $sTxt_Arquivo );
   	     FCLOSE( $hArqExp );
   	     If ( FILE_EXISTS($sNomArqExpR) ) { UNLINK($sNomArqExpR); }
   	     RENAME( $sNomArqExpT, $sNomArqExpR );
		 Return True;
      }
   }
   Return False;
}
//
// FUNCAO QUE MONTA O CUPOM
// Ultima modifica��o 20/08/2015
Function MontaCupom_Rec( $sSQLQueryW='', $bPar_Can=False, $bAgruparProdutos=False, $b_RemoverAcentos=True ) {
     Global $R_CadFuncionario;
	 Global $sData_Trabalho;
	 Global $aRel_Excel;
	 //
	 $bImp_Zer  = SQLVarConfig('IMP_PREZER_CUPOM');
	 $bImp_Can  = SQLVarConfig('IMP_PRODCAN_CUPOM');
	 $bImp_Disk_Adc = SQLVarConfig('IMP_DISK_DADOS_ADC');
	 $sMen_Cli = SQLVarConfig('IMP_MEN_PAD');
	 $bImp_Opc_Fec  = SQLVarConfig('IMP_OPCFEC_CONTA')+0;            // imprime os opcionais no fechamento da conta
	 $bImp_ObsPrd_Fec = SQLVarConfig('IMP_OBSERV_PRODUTO_CONTA')+0;  // imprime as observações dos produtos na conta fechada?
	 $bCliente_FatGer = SQLVarConfig('CLIENTE_NO_FAT_GERAL')+0;      // Obrigat�rio identificar cliente na comanda
     $s_Nome_Local = SQLVarConfig('NOME_LOCAIS_SVC');    // Nome do local
	 $aComanda_Expandido = ARRAY();
     FOR ( $nContar=1;$nContar<=14;$nContar++ ) {
        $aComanda_Expandido[$nContar] = ( STRPOS(' '.SQLVarConfig('COMANDA_EXPANDIDO_LINHAS'),'('.$nContar.')')>0 ? 1 : 0);
     }
     $bImprimir_Tx_Svc_Prc = ( SQLVarConfig("MESA_TX_SRV_IMPR_PERCENTUAL") != "NAO" );
     $sTexto_Mesa_Taxa_Svc = SQLVarConfig("MESA_TEXTO_TAXA_SERVICO");
     //
     //$sSQLQueryW .= " AND fat_item.FAT_FTI_CMB=0";
	 //
     $strSQLQuery =
	     "SELECT ".
		    "fat_item.FAT_CODIGOI, fat_item.FAT_CFATGER, fat_item.FAT_COD_FUN, fat_item.FAT_DAT_HOR,".
            "fat_item.FAT_GAR_EST, fat_item.FAT_CODITE1, fat_item.FAT_CODITE2, fat_item.FAT_CODITE3,".
            "fat_item.FAT_CODITE4, fat_item.FAT_UNITARI, ".
			( $bAgruparProdutos ?
			  "sum(fat_item.FAT_QTD_ITE) as FAT_QTD_ITE, sum(fat_item.FAT_PRE_TOT) as FAT_PRE_TOT,"
			:
			  "fat_item.FAT_QTD_ITE, fat_item.FAT_PRE_TOT,"
			).
			"fat_item.FAT_PRE_OPC,".
            "fat_item.FAT_PRE_TIP, fat_item.FAT_OPCINAL, fat_item.FAT_CANITEM, fat_item.FAT_OBSERV1,".
            "fat_item.FAT_OBSERV2, fat_item.FAT_MOTCFT, fat_item.FAT_LISTACOMBO, ".
            "fat_geral.FAT_CODIGOI as FAT_ICODGER, fat_geral.FAT_CANCELA, fat_geral.FAT_RCFORMA, fat_geral.FAT_CAN_DAT,".
			"fat_geral.FAT_DTA_ENC, fat_geral.FAT_HOR_ENC, ".
            "fat_geral.FAT_OBSERV1 as GER_OBSERV1, fat_geral.FAT_OBSERV2 as GER_OBSERV2, fat_geral.FAT_NOMCLIE, fat_geral.FAT_NUM_MES,".
            "fat_geral.FAT_TIP_LOC, fat_geral.FAT_CLIENTE, fat_geral.FAT_DAT_INI, fat_geral.FAT_DAT_FIM, fat_geral.FAT_TOT_VAL, fat_geral.FAT_TOT_CTX,".
            "fat_geral.FAT_TOT_REC, fat_geral.FAT_TAXASVR, fat_geral.FAT_PERTAXASVR, fat_geral.FAT_TAXACVR, fat_geral.FAT_QTD_PES, fat_geral.FAT_SQCAIXA,".
            "fat_geral.FAT_SBTOTAL, fat_geral.FAT_VALDESC, fat_geral.FAT_DESCONT, fat_geral.FAT_LSTRPCL, fat_geral.FAT_SQCOMAN,".
            "fat_geral.FAT_TROCOPA, fat_geral.FAT_COD_ENT, fat_geral.FAT_DATAINI, fat_geral.FAT_ALTERAD, fat_geral.FAT_OPEFECH, fat_geral.FAT_MOTCFG ".
         "FROM fat_item ".
         "LEFT JOIN fat_geral ON fat_item.FAT_CFATGER=fat_geral.FAT_CODIGOI ".
	     "WHERE ".$sSQLQueryW." AND fat_item.FAT_FTI_CMB=0 ".
		 ( $bAgruparProdutos ?
           "GROUP BY fat_item.FAT_GAR_EST, fat_item.FAT_CODITE1,".
                    "fat_item.FAT_CODITE2, fat_item.FAT_CODITE3, fat_item.FAT_CODITE4, fat_item.FAT_PRE_OPC,".
                    "fat_item.FAT_PRE_TIP, fat_item.FAT_OPCINAL, fat_item.FAT_CANITEM"
		 : "" ).
		 ';';
	 //
     $Rows_RegMov = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
	 $sTxt_Imprimir = '';
	 $nPreTotGeral = 0;
	 $sPulaLinha = CHR(13).CHR(10);
	 $nDth_Pedido = TIME();
	 $bTipoBalcao = False;
	 $bTipoEntreg = False;
     $bAlterado = False; 
	 $bParcial = False; 
	 $nFat_SqComan = 0;
	 $nCodLocalW  = 0;
     $sMvg_NomCli = '';
     $sMvg_Obs001 = '';
     $sMvg_Obs002 = '';	 
	 $sTxt_Produtos = '';
	 $sTxt_Prod_Can = '';
	 $sTxt_Prod_Agr = '';
	 $nTot_Prod_Agr = 0;
	 $nFat_CodigoI = 0;
	 $nFat_Tip_Loc = 0;
	 $nFat_Cancela = 0;
	 $nFat_RcForma = 0;
	 $nFat_SqCaixa = 0;
	 $sFat_Can_Dat = '';
     $nFat_Dat_Ini = 0;
     $nFat_Dat_Fim = 0;
	 $nFat_DataIni = 0;
	 $s_NomeEntregador = '';
	 $sCli_NomeCl = '';
	 $nFat_ItemCan = 0;
	 $aRel_RPG_03 = ARRAY();
	 //
	 $sApelido = '';
	 $sNomeOpeFec = '';
	 //
	 While ( $Row_RegMov = MYSQL_FETCH_OBJECT($Rows_RegMov) ) {
	    $nFat_SqComan = $Row_RegMov->FAT_SQCOMAN;
	    $nCodLocalW   = $Row_RegMov->FAT_NUM_MES;
		$bTipoBalcao  = $Row_RegMov->FAT_TIP_LOC==1;
		$bTipoEntreg  = $Row_RegMov->FAT_TIP_LOC==2;
		$bTipoComand  = $Row_RegMov->FAT_TIP_LOC==3;
		$bTipoEncomd  = $Row_RegMov->FAT_TIP_LOC==4;
		$bTipoConsgi  = $Row_RegMov->FAT_TIP_LOC==5;
		$nFat_Tip_Loc = $Row_RegMov->FAT_TIP_LOC;
		$nFat_CodigoI = $Row_RegMov->FAT_ICODGER;
		$nFat_Cancela = $Row_RegMov->FAT_CANCELA;
		$nFat_RcForma = $Row_RegMov->FAT_RCFORMA;
		$nFat_SqCaixa = $Row_RegMov->FAT_SQCAIXA;
	    $sFat_Can_Dat = $Row_RegMov->FAT_CAN_DAT;
		$nFat_Dat_Ini = ConvertDtHrSTR($Row_RegMov->FAT_DAT_INI);
		$nFat_Dat_Fim = ConvertDtHrSTR($Row_RegMov->FAT_DAT_FIM);
		$nFat_DataIni = ConvertDtHrSTR($Row_RegMov->FAT_DATAINI);
		$nFat_Dta_Enc = ConvertDataSTR($Row_RegMov->FAT_DTA_ENC);
		$sFat_Hor_Enc = $Row_RegMov->FAT_HOR_ENC;
		$nFat_CFatGer = $Row_RegMov->FAT_CFATGER;
		$sFat_LstRPcl = $Row_RegMov->FAT_LSTRPCL;
        $bAlterado = $Row_RegMov->FAT_ALTERAD;            // se alterou a comanda 
		$sMot_Can_Com = $Row_RegMov->FAT_MOTCFG;          // MOTIVO CANCELAMENTO DA COMANDA
		$sMot_Can_Pro = $Row_RegMov->FAT_MOTCFT;          // MOTIVO CANCELAMENTO DO PRODUTO
		// Puxar dados da tabela cad_cliente
		If ( STRLEN(@$sCli_Endere)==0 && $Row_RegMov->FAT_CLIENTE>0 ) {
		   $strSQLQuery = 'SELECT * FROM cad_cliente WHERE CLI_CODIGOI='.$Row_RegMov->FAT_CLIENTE.';';
           $Row_CadCli = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
		   $aCad_Telefones = ARRAY();
		   If ( $Row_CadCli = MYSQL_FETCH_ARRAY($Row_CadCli) ) {
	          $sSQLQuery =
	              "SELECT * FROM cad_telefones ".
	              "WHERE ".
		              "TEL_TIPCAD=1 AND TEL_CODCAD='".$Row_CadCli['CLI_CODIGOI']."' AND ".
		              "(TEL_TRAREG=0 OR TEL_TRAREG=2)  ".
		          "ORDER BY TEL_NUMERO ASC LIMIT 6;";
	          $RowsT = MYSQL_QUERY($sSQLQuery) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
              While ($RowT = MYSQL_FETCH_ARRAY($RowsT)) {
		         $aCad_Telefones[] = $RowT['TEL_NUMERO'];
		      }
		   }
		   $sCli_Endere = @$Row_CadCli['CLI_ENDLOG'].', '.@$Row_CadCli['CLI_ENDNUM'].' '.@$Row_CadCli['CLI_ENDCPL'];
		   $sCli_Bairro = @$Row_CadCli['CLI_ENDBAI'];
		   $sCli_Tel001 = @$aCad_Telefones[0];
		   $sCli_Tel002 = @$aCad_Telefones[1];
		   // Pegar o nome do Cliente - Identifica Cliente
		   $sCli_NomeCl = @$Row_CadCli['CLI_NOMECP'];
		}
		//
		$nFat_Tot_Val = $Row_RegMov->FAT_TOT_VAL;
		$nFat_Tot_Ctx = $Row_RegMov->FAT_TOT_CTX;
		$nFat_TaxaSvr = $Row_RegMov->FAT_TAXASVR;
		$nFat_PerTSvr = $Row_RegMov->FAT_PERTAXASVR;
		$nFat_TaxaCvr = $Row_RegMov->FAT_TAXACVR;
		$nFat_Qtd_Pes = $Row_RegMov->FAT_QTD_PES;
		$nFat_SbTotal = $Row_RegMov->FAT_SBTOTAL;
		$nFat_Descont = $Row_RegMov->FAT_DESCONT;
		$nFat_ValDesc = $Row_RegMov->FAT_VALDESC;
		$nFat_Tot_Rec = $Row_RegMov->FAT_TOT_REC;
		$dFat_Dat_Fim = $Row_RegMov->FAT_DAT_FIM;
		$nFat_TrocaPa = $Row_RegMov->FAT_TROCOPA;
		$nFat_Cod_Ent = $Row_RegMov->FAT_COD_ENT;
		// Pegar nome do Entregador
		If ( $bTipoEntreg && STRLEN($s_NomeEntregador)==0 ) {
		    $strSQLQuery = 'SELECT * FROM cad_funcionario WHERE FUN_CODIGO='.$nFat_Cod_Ent.';';
            $Row_T = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
		    If ( $Row_T = MYSQL_FETCH_OBJECT($Row_T) ) {
			   $s_NomeEntregador = SUBSTR($Row_T->FUN_NOMECP,0,25);
			} Else {
			   $s_NomeEntregador = "_________________________";
			}
		}
		// Pegar nome do Operador que mandou fechar
		$nFat_CodFec = $Row_RegMov->FAT_OPEFECH;      // Codigo operador que mandou fechar
		If ( $nFat_CodFec > 0 ) {
	  	   $strSQLQueryF = "SELECT FUN_CODIGO, FUN_NOMECP, FUN_APELID ".
		                  "FROM cad_funcionario ".
				          'WHERE FUN_CODIGO='.$nFat_CodFec.';';
		   $Row_F = MYSQL_QUERY($strSQLQueryF) or die('<br>' .$strSQLQueryF . '<br>' . MYSQL_ERROR()); // Executar comando SQL
		   If ( $Row_F = MYSQL_FETCH_OBJECT($Row_F) ) {
		      $sNomeOpeFec = SUBSTR($Row_F->FUN_NOMECP,0, 6 ); 
              $sApelido = $Row_F->FUN_APELID;
		   }
		
		}
		// Pegar nome do Operador que cancelo o produto
		$nFat_CodFec = $Row_RegMov->FAT_OPEFECH;      // Codigo operador que mandou fechar
		$sNomeOpeFec = '';
		$sApelido = '';
		If ( $nFat_CodFec > 0 ) {
	  	   $strSQLQueryF = "SELECT FUN_CODIGO, FUN_NOMECP, FUN_APELID ".
		                  "FROM cad_funcionario ".
				          'WHERE FUN_CODIGO='.$nFat_CodFec.';';
		   $Row_F = MYSQL_QUERY($strSQLQueryF) or die('<br>' .$strSQLQueryF . '<br>' . MYSQL_ERROR()); // Executar comando SQL
		   If ( $Row_F = MYSQL_FETCH_OBJECT($Row_F) ) {
		      $sNomeOpeFec = SUBSTR($Row_F->FUN_NOMECP,0, 6 ); 
              $sApelido = $Row_F->FUN_APELID;
		   }
		
		}
		
		// Pegar produto ou Pizza montada
	    $sTxt_Monta1 = '';
		$sTxt_Temp1 = SQLVarConfig('DESCRI_PROPRECO'.$Row_RegMov->FAT_PRE_TIP);
		$sTxt_Temp2 = '';
		$sTxt_Temp3 = '';
		// Calcula quantas parte tem
        For ($nPartesPro = 1; $nPartesPro<=4; $nPartesPro++) {
		    $sT_CodPro=0;
		    EVAL('$sT_CodPro=$Row_RegMov->FAT_CODITE'.$nPartesPro.';');
			If ( $sT_CodPro==0 ) { $nPartesPro -= 1; BREAK; }
		}
		If (STRLEN($sTxt_Temp1)>0) {
		   // criado para n�o imprimir inteira quando for produto normal
		   $sTxt_Temp1 = AlinhaStr($sTxt_Temp1,0,7).' ';
		   $sTxt_Temp3 .= $sTxt_Temp1;
		   // 
		   $sTxt_Monta1 .= $sTxt_Temp1;
		   $sTxt_Temp1 = STR_REPEAT(' ',STRLEN($sTxt_Temp1));
		   If ( $nPartesPro==1 ) {
		      //$sTxt_Temp2 = ' 1   ';
		   } ElseIf ( $nPartesPro==2 ) {
		      $sTxt_Temp2 = '1/2 '; 
		   } ElseIf ( $nPartesPro==3 ) {
		      $sTxt_Temp2 = '1/3 ';
		   } ElseIf ( $nPartesPro==4 ) {
		      $sTxt_Temp2 = '1/4 ';
		   }
		}
        If ( ! EMPTY($Row_RegMov->FAT_LISTACOMBO) ) {
           //$sTxt_Temp1 = "   ";
           //$sTxt_Temp2 = "* ";
           $sTxt_Temp1 = " ";
           $sTxt_Temp2 = "";
        }
		//
		$nIte_CodigoI = 0;
        For ($nCountPro = 1; $nCountPro<=4; $nCountPro++) {
		   $sT_CodPro = 0;
		   EVAL('$sT_CodPro=$Row_RegMov->FAT_CODITE'.$nCountPro.';');
		   If ( $sT_CodPro==0 ) { BREAK; }
		   If ( $nIte_CodigoI==0 ) {
			  $nIte_CodigoI = $sT_CodPro+0;
		   }
           //$strSQLQuery = 'SELECT * FROM cad_produto WHERE ITE_CODIGOI='.$sT_CodPro.';';
           $strSQLQuery = 'SELECT ITE_CODIGOI,	ITE_CODIGOL, ITE_DESCRIC, '.
			                      'ITE_COD_GRU, ITE_INGRED1, ITE_INGRED2, '.
			                      'ITE_COD_BAR,	ITE_LOC_IMP1,ITE_LOC_IMP2, '.
		                          'ITE_LOC_IMP3, ITE_PRE_MES_NOR, ITE_PRE_MES_001, '.
			                      'ITE_PRE_MES_002, ITE_PRE_MES_003,	ITE_PRE_MES_004, '.
			                      'ITE_PRE_MES_MEI, ITE_PRE_ENT_NOR, ITE_PRE_ENT_001, '.
			                      'ITE_PRE_ENT_002, ITE_PRE_ENT_003,	ITE_PRE_ENT_004, '.
			                      'ITE_PRE_ENT_MEI, ITE_PRE_BAL_NOR, ITE_PRE_BAL_001, '.
			                      'ITE_PRE_BAL_002, ITE_PRE_BAL_003, ITE_PRE_BAL_004, '.
			                      'ITE_PRE_BAL_MEI, ITE_ACT_OPCIONA, ITE_CALCTAXASVR, '.
			                      'ITE_SIG_UNIDADE, ITE_FISCAL_TRIB, ITE_COD_ORI, '.
			                      'ITE_COD_NCM, ITE_ITEM_ATIVO_, ITE_REG_TRAVADO, '. 
										 'GRU_CODIGO, GRU_DESCRI, GRU_OPCION, GRU_OPCGRU, '.
										 'GRU_ACTSAB, GRU_CODGRU, GRU_NUMORD, GRU_GARVIS, '.
										 'GRU_TRAREG, GRU_ATIVO_ '.
								'FROM cad_produto, cad_grupo_produtos '.
								'WHERE ITE_COD_GRU=GRU_CODIGO AND ITE_REG_TRAVADO=0 AND ITE_CODIGOI='.$sT_CodPro.';';
			
			$Row_CadPro = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
		   //$sT_CodPro = Str_Zero($sT_CodPro+0,4);
			$sT_Descri = '(Produto nao cadastrado)';
			$sT_CodLivre = '';
		   If ( $Row_CadPro=MYSQL_FETCH_OBJECT($Row_CadPro) ) {
			   $sT_Descri = SUBSTR($Row_CadPro->ITE_DESCRIC,0,27);
		       $sT_CodLivre = Str_Zero($Row_CadPro->ITE_CODIGOL,4);
		      //VERIFICA SE EXISTE PRE�O DE MEIA
			   // SE N�O FOR PIZZA ou n�o for grupo varios sabores
				If (!( $Row_CadPro->GRU_ACTSAB )) {
					If ($bTipoBalcao) {
					   If ($Row_CadPro->ITE_PRE_BAL_MEI > 0){
						   $sTxt_Monta1 = $sTxt_Temp3;
						} Else {
						   $sTxt_Monta1 = $sTxt_Temp1;
						}
					} ElseIf($bTipoEntreg) {
					   If ($Row_CadPro->ITE_PRE_ENT_MEI > 0){
						  $sTxt_Monta1 = $sTxt_Temp3;
						} Else {
						  $sTxt_Monta1 = $sTxt_Temp1;
						}
					} Else {
					   If ($Row_CadPro->ITE_PRE_MES_MEI > 0){
						  $sTxt_Monta1 = $sTxt_Temp3; 
						} Else {
						  $sTxt_Monta1 = $sTxt_Temp1;
						}
					}
			   }
			}
			//If (STRLEN($sTxt_Temp2)>0) {
			   //$sT_Descri = SUBSTR($sT_Descri,0,27);
			   $sT_Descri = $sT_Descri.'-'.$sT_CodLivre;
			//} Else {
			//   $sT_Descri = $sT_CodPro.'-'.$sT_Descri;
			//}
		   //
			//$sTxt_Monta1 .= ($nCountPro>1 ? $sTxt_Temp1 : '' ).$sTxt_Temp2.$sT_Descri.($Row_RegMov->FAT_PRE_TIP=='M' ? ' (Meia)' : '').$sPulaLinha ;
			$sTxt_Monta1 .= ($nCountPro>1 ? $sTxt_Temp1 : '' ).$sTxt_Temp2.$sT_Descri.$sPulaLinha ;
		}
		//$sTxt_Monta1 .= $sPulaLinha;
        //
        // Capturar itens da combo e montar lista
		$sTxt_ListaCombo = '';
        If ( ! EMPTY($Row_RegMov->FAT_LISTACOMBO) ) {
           $sSQLQuery =
             'SELECT '.
               'fti.FAT_UNITARI, fti.FAT_QTD_ITE, fti.FAT_PRE_TOT,'.
               'ite.ITE_CODIGOI, ite.ITE_CODIGOL, ite.ITE_DESCRIC, ite.ITE_SIG_UNIDADE '.
             'FROM fat_item          AS fti '.
             'LEFT JOIN cad_produto  AS ite  ON  ite.ITE_CODIGOI = fti.FAT_CODITE1 '.
             'WHERE FAT_FTI_CMB='.$Row_RegMov->FAT_CODIGOI.' '.
             'ORDER BY ITE_DESCRIC ASC '.
             ';';
           $Rows = MYSQL_QUERY($sSQLQuery) or die('<br>' .$sSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
           While ( $Row = MYSQL_FETCH_ARRAY($Rows,MYSQL_ASSOC) ) {
              //
		      $sTxt_ListaCombo .=
                '   + '.
                //Str_Zero( $Row['ITE_CODIGOL']+0,4).
                //'-'.
                //AlinhaStr($Row['ITE_DESCRIC'],2,13).
                AlinhaStr($Row['ITE_DESCRIC'],2,20).
                ' x '.
                $Row['FAT_QTD_ITE'].
                //' = R$ '.
                //AlinhaStr(FormatoMoeda($Row['FAT_PRE_TOT']),2,8).
                $sPulaLinha;
              //
           }
        }
        //
		// Pegar opcionais
		$sTxt_Monta2 = '';
        $aMov_Opcional = EXPLODE(";", $Row_RegMov->FAT_OPCINAL);
        $nContMat = 0;
        While ( $nContMat<100 ) {
           If (STRLEN(@$aMov_Opcional[$nContMat])==0) { BREAK; }
           $aRegOpc = EXPLODE(",",$aMov_Opcional[$nContMat]);
           $sT_CodPro = $aRegOpc[0]+0;
           $nOpcQtd = $aRegOpc[1]+0;
           $strSQLQuery = 'SELECT * FROM cad_produto WHERE ITE_CODIGOI='.$sT_CodPro.';';
           $Row_CadPro = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
		   
		   $sT_CodPro = Str_Zero($sT_CodPro+0,4);
		   $sT_Descri = '(Nao cadastrado)';
	       If ( $Row_CadPro=MYSQL_FETCH_OBJECT($Row_CadPro) ) {
			   $sT_Descri = $Row_CadPro->ITE_DESCRIC;
		   }
		   $sT_Descri = SUBSTR($sT_Descri,0,20);
			// Estava imprimindo o C�digo Interno, mas deve pegar o C�digo Livre
			//		   $sTxt_Monta2 .= '   + '.$sT_CodPro.'-'.$sT_Descri.(STR_REPEAT(' ',20-STRLEN($sT_Descri))).'x '.$nOpcQtd.$sPulaLinha;
		  // Se imprime os opcionais no fechamento da conta 
		   If ( $bImp_Opc_Fec ) { 
		      $sTxt_Monta2 .= '   + '.Str_Zero( $Row_CadPro->ITE_CODIGOL+0,4).'-'.$sT_Descri.(STR_REPEAT(' ',20-STRLEN($sT_Descri))).'x '.$nOpcQtd.$sPulaLinha;
		   }
		   $nContMat++;
		}
		//
		If ( STRLEN($Row_RegMov->FAT_CANITEM)==0 ) {    //S� inclui no total se n�o estiver cancelado
		   $nPreTotGeral += $Row_RegMov->FAT_PRE_TOT;
		}
		//GUSTAVO ESTAVA MOSTRANDO O VALOR TOTAL SEM SOMAR O OPCIONAL - 05/11/13 
		//$sT_PrecoUn = FormatoMoeda(($Row_RegMov->FAT_PRE_TOT-$Row_RegMov->FAT_PRE_OPC)/$Row_RegMov->FAT_QTD_ITE);
		$nT_PrecoUn = $Row_RegMov->FAT_UNITARI;
		If ( $Row_RegMov->FAT_PRE_OPC==0 ) {
		  If ( $nT_PrecoUn==0 ) {
		     $nT_PrecoUn = ($Row_RegMov->FAT_PRE_TOT)/$Row_RegMov->FAT_QTD_ITE;
		  }
		  $sT_PrecoUn = FormatoMoeda($nT_PrecoUn);
		} ElseIf ( $Row_RegMov->FAT_PRE_OPC>0 ) { 
   		  // $sT_PrecoUn = ' + '.FormatoMoeda($Row_RegMov->FAT_PRE_OPC); }
		  // C�cero 29/11/13 - Estava somando o Total do OPC no Total do Item que j� estava somado o Opcional
		  //$sT_PrecoUn = FormatoMoeda($Row_RegMov->FAT_PRE_TOT/$Row_RegMov->FAT_QTD_ITE).' + '.FormatoMoeda($Row_RegMov->FAT_PRE_OPC); 
		  $sT_PrecoUn = FormatoMoeda(($Row_RegMov->FAT_PRE_TOT-$Row_RegMov->FAT_PRE_OPC)/$Row_RegMov->FAT_QTD_ITE).' + '.FormatoMoeda($Row_RegMov->FAT_PRE_OPC); 
		}
		$sT_PrecoUn = SUBSTR($sT_PrecoUn,0,13);
		$sT_PrecoUn = $sT_PrecoUn.STR_REPEAT(' ',13-STRLEN($sT_PrecoUn));
		If ( $Row_RegMov->FAT_PRE_OPC==0 ) {
		   $sT_PrecoTo = FormatoMoeda($Row_RegMov->FAT_PRE_TOT);
		} ElseIf ( $Row_RegMov->FAT_PRE_OPC>0 ) { 
		 // C�cero 29/11/13 - Estava somando o Total do OPC no Total do Item que j� estava somado o Opcional
		 //$sT_PrecoTo = FormatoMoeda($Row_RegMov->FAT_PRE_TOT+$Row_RegMov->FAT_PRE_OPC);

   		   $sT_PrecoTo = FormatoMoeda($Row_RegMov->FAT_PRE_TOT);
		}
		$sT_PrecoTo = STR_REPEAT(' ',9-STRLEN($sT_PrecoTo)).$sT_PrecoTo;
		$sQtd_Ite_E = $Row_RegMov->FAT_QTD_ITE+0;
		If ( STRTOUPPER(@$Row_CadPro->ITE_SIG_UNIDADE)=="KG" ) {
		   $sQtd_Ite_E = NUMBER_FORMAT( $sQtd_Ite_E, 3, '.', '' );
		}
		$sQtd_Ite_E = AlinhaStr($sQtd_Ite_E,2,10);
		
		If ( STRLEN($Row_RegMov->FAT_CANITEM)>0 ) {    //Pega o nome do  operador que cancelou o produto
		   $sTxt_FuncIteCan = '';
		   $nFat_ItemCan = EXPLODE(';',$Row_RegMov->FAT_CANITEM);
		   $strSQLQuery = 'SELECT * FROM cad_funcionario WHERE FUN_CODIGO="'.$nFat_ItemCan[0].'";';
		  
		   $Row_CanCITFun = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
	       If ( $Row_CanCITFun = MYSQL_FETCH_OBJECT($Row_CanCITFun) ) {
              $sTxt_FuncIteCan .=
                ' Func.: '.SUBSTR($Row_CanCITFun->FUN_APELID.' - '.$Row_CanCITFun->FUN_NOMECP,0,32).
				'';
	       }
	   	
		}
		
		$sTxt_ImpWhile = 
		   $sTxt_Monta1.
		   $sTxt_Monta2.
           ( ($nFat_Dat_Fim>0 && (! $bImp_ObsPrd_Fec)) ?
            ''
           :
		    ( STRLEN($Row_RegMov->FAT_OBSERV1)>0 ? 
		        ( $aComanda_Expandido[13] ?
			       '[EXPANDIR]'
			    :
			       ''
			    ).
			    '  '.SUBSTR($Row_RegMov->FAT_OBSERV1,0,38).$sPulaLinha 
			 : 
			    ''
		    ).
		    ( STRLEN($Row_RegMov->FAT_OBSERV2)>0 ? 
		        ( $aComanda_Expandido[13] ?
			       '[EXPANDIR]'
			    :
			       ''
			    ).
			    '  '.SUBSTR($Row_RegMov->FAT_OBSERV2,0,38).$sPulaLinha 
		    : 
		        ''
		    ).
            ''
           ).
		   $sQtd_Ite_E.' x '.$sT_PrecoUn.' = R$'.$sT_PrecoTo.
		   $sPulaLinha.
           $sTxt_ListaCombo.
		   ( STRLEN( $sMot_Can_Pro ) > 1 ?
		    ( STRLEN( $sTxt_FuncIteCan ) > 1 ?
			' Fun.C: '.$sTxt_FuncIteCan.
			$sPulaLinha
			:
			'' ).
			' Mot.C: '.$sMot_Can_Pro.
		      $sPulaLinha
		    :
              ''
            ).			
		    '';
		
		
		/// produtos excel
		ARRAY_PUSH( $aRel_RPG_03,
                    $sTxt_Monta1,
                    //"PULAR_LINHA",					
					$sTxt_Monta2,
					//"PULAR_LINHA",					
					( STRLEN($Row_RegMov->FAT_OBSERV1)>0 ? 
		        	   SUBSTR($Row_RegMov->FAT_OBSERV1,0,38)
			        : 
			           ''
			        ),
					"PULAR_LINHA",
                    "PULAR_COLUNA",
					( STRLEN($Row_RegMov->FAT_OBSERV2)>0 ? 
		               SUBSTR($Row_RegMov->FAT_OBSERV2,0,38)
		            : 
		               ''
		            ),
					"PULAR_LINHA",
					"PULAR_COLUNA",
					$sQtd_Ite_E,
					$sT_PrecoUn,
					$sT_PrecoTo,
					//"PULAR_LINHA",					
			        ( STRLEN( $sMot_Can_Pro ) > 1 ?
		               ( STRLEN( $sTxt_FuncIteCan ) > 1 ?
			              ' Fun.C: '.$sTxt_FuncIteCan
			           :
			              '' 
					   )
					   //' Mot.C: '.$sMot_Can_Pro
		            :
                       ''
                    ),
                    ( STRLEN( $sMot_Can_Pro ) > 1 ?
				      ' Mot.C: '.$sMot_Can_Pro
		            :
                      ''
                    ),					  
				   "PULAR_LINHA"					
			     	
				 );	
		
		//echo "<script>alert('".$Row_RegMov->FAT_OBSERV2."');</script>";
		
		
		//
		
		If ( $Row_RegMov->FAT_PRE_TOT>0 ) {
		   If ( STRLEN($Row_RegMov->FAT_CANITEM)>0 ) {
		      $sTxt_Prod_Can .= $sTxt_ImpWhile;
		   } Else {
			  If ( Puxar_SubT_Promocao( $nIte_CodigoI, $Row_RegMov->FAT_QTD_ITE, $nFat_Tip_Loc, DATE("Y-m-d",$nFat_DataIni) ) ) {
		         $sTxt_Prod_Agr .= $sTxt_ImpWhile;
				 $nTot_Prod_Agr += $Row_RegMov->FAT_PRE_TOT;
			  } Else {
		         $sTxt_Produtos .= $sTxt_ImpWhile;
			  }
		   }
		} Else {
		  If($bImp_Zer) {
		    If ( STRLEN($Row_RegMov->FAT_CANITEM)>0 ) {
		      $sTxt_Prod_Can .= $sTxt_ImpWhile;
		    } Else {
		      $sTxt_Produtos .= $sTxt_ImpWhile;
		    }
		
		  }
		
		}
		
        $sMvg_NomCli = $Row_RegMov->FAT_NOMCLIE;
		If ( (($bTipoBalcao OR $bTipoEntreg OR $bTipoEncomd OR $bTipoConsgi) || ($nFat_Tip_Loc==0 && $bCliente_FatGer)) && STRLEN($sMvg_NomCli)==0 ) {
		   //$sMvg_NomCli = $Row_RegMov->FAT_NOMCLIE;
		   $sMvg_Obs001 = $Row_RegMov->GER_OBSERV1;
		   $sMvg_Obs002 = $Row_RegMov->GER_OBSERV2;
		   If ($nFat_Tip_Loc==0 && $bCliente_FatGer) {
		      If( EMPTY($Row_RegMov->FAT_NOMCLIE) ) {
		         $sMvg_NomCli =  $sCli_NomeCl;
			 }
		   }
		}
	 
	 
	 }
	//If ((STRLEN($sTxt_Produtos.$sTxt_Prod_Can)>0)||($nFat_Qtd_Pes > 0 && $nFat_Tot_Ctx > 0) ) {
	$s_EmpNomeCP = SQLVarConfig('EMPRESA_NOME_FANTASIA');
	$s_EmpNomeCP = STR_REPEAT(' ',20-(STRLEN($s_EmpNomeCP)/2)).$s_EmpNomeCP;
	If (STRLEN($sTxt_Produtos.$sTxt_Prod_Can.$sTxt_Prod_Agr)>0) {	 
	    // Calcular tempo de perman�ncia
	    $s_TempoPer = DATE('H:i:s',$nFat_Dat_Ini);
		$aTemp1 = EXPLODE(':',$s_TempoPer);
		$nHora_Ped = ($aTemp1[0]*60*60)+($aTemp1[1]*60)+$aTemp1[2];
		If ($nFat_Dat_Fim==0) {
		   $aTemp1 = EXPLODE(':',DATE('H:i:s'));
		} Else {
		   $aTemp1 = EXPLODE(':',DATE('H:i:s',$nFat_Dat_Fim));
		}
		$nHora_Atu = ($aTemp1[0]*60*60)+($aTemp1[1]*60)+$aTemp1[2];
		$nHora_Per = $nHora_Atu - $nHora_Ped;
		If ($nHora_Atu < $nHora_Ped) {
		   $nHora_Per += 24*60*60;
		}
		$aTemp1[0]=0; // Hora
		$aTemp1[1]=0; // Minuto
		$aTemp1[2]=0; // Segundo
		While (True) {  // Extrair Hora
		   $nTempCalc = $nHora_Per-(60*60);
		   If ($nTempCalc<0) { BREAK; }
		   $nHora_Per = $nTempCalc;
		   $aTemp1[0] += 1;
		}
		While (True) {  // Extrair Minuto
		   $nTempCalc = $nHora_Per-(60);
		   If ($nTempCalc<0) { BREAK; }
		   $nHora_Per = $nTempCalc;
		   $aTemp1[1] += 1;
		}
		$aTemp1[2] = $nHora_Per;
		//
		$s_TempoPer = Str_Zero($aTemp1[0],2).':'.Str_Zero($aTemp1[1],2).':'.Str_Zero($aTemp1[2],2);
		//If ( $dFat_Dat_Fim==0 ) {             // Conta aberta
		//   $s_PreTotGe = FormatoMoeda($nFat_Tot_Val);
		//   //$s_PreTotGe = FormatoMoeda($nPreTotGeral);  // Barrado no dia 16/05/2013 (Talvez esteje fornecendo valor incorreto)
		//   //
		//   //$s_PorComis = (SQLVarConfig('GARCOM_GAR_COMISSAO')+0);
		//   //$s_PorComis = 0;                              // Altera��o n�:3500
		//   $s_PorComis = $nFat_PerTSvr;
		//   $s_PreComis = $nPreTotGeral*($s_PorComis/100);                         // Calcula a comissao
		//   $s_PreComis = ROUND($nFat_Tot_Ctx*($s_PorComis/100),2);                         // Calcula a comissao com aredondamento normal
		//   //
		//   $s_PreComis = (FLOOR( ($nFat_Tot_Ctx * ($s_PorComis/100))*100 )/100);              // Calcula a comissao com aredondamento para baixo
		//   $n_PreTotGe2 = $nPreTotGeral;
		//   If (!($bTipoBalcao OR $bTipoEntreg)) { $n_PreTotGe2 = $s_PreComis+$nPreTotGeral; }       // Soma a comissao com o total geral
		//   $s_PreComis = FormatoMoeda($s_PreComis);
		//   $s_PorComis = $s_PorComis.' %';
		//   $s_PreTotGe2 = FormatoMoeda($n_PreTotGe2);
		//   $s_PreTaxa2 = '0,00';
		//   $nFat_TaxaCvr = 0;
		//   $s_PreTaxa2P = '';
		//} Else {                              // Conta Fechada
		   $s_PreTotGe = FormatoMoeda($nFat_Tot_Val-$nTot_Prod_Agr);
		   $s_PreComis = FormatoMoeda($nFat_TaxaSvr);
		   If ( $nFat_PerTSvr>0 ) {
		         $s_PorComis = ($nFat_PerTSvr+0).'%';
		   } Else {
		      If ($nFat_Tot_Ctx>0) {
		         $s_PorComis = (NUMBER_FORMAT(($nFat_TaxaSvr / $nFat_Tot_Ctx) * 100, 2, '.','')+0).'%';
		      } Else {
		         $s_PorComis = '0%';
		      }
		   }
		   $s_PreTaxa2 = FormatoMoeda($nFat_TaxaCvr);
		   $s_TaxaDesc = (NUMBER_FORMAT( ($nFat_Descont==0 ? (0) : $nFat_Descont), 2, '.','')+0).'%';
		   //$s_ValorDesc = FormatoMoeda( ($nFat_Tot_Rec>0 ? '-'.($nFat_SbTotal*($nFat_Descont/100)) : $nFat_Tot_Val) );
		   $s_ValorDesc = '-'.FormatoMoeda( $nFat_ValDesc );
		   $n_PreSubTot = ($nFat_Tot_Rec>0 ? $nFat_SbTotal : $nFat_Tot_Val);
		   $s_PreSubTot = FormatoMoeda( $n_PreSubTot );
		   $s_PreTotGe2 = FormatoMoeda( $nFat_Tot_Rec );
		   $s_PreTaxa2P = ($nFat_Qtd_Pes>0 && $nFat_TaxaCvr>0 ? $nFat_Qtd_Pes.' x '.FormatoMoeda($nFat_TaxaCvr / $nFat_Qtd_Pes) : '');
		//}
		$s_PreComis = STR_REPEAT(' ',10-STRLEN($s_PreComis)).$s_PreComis;
		$s_PorComis = AlinhaStr($s_PorComis,2,5);
		$s_PreTotGe = STR_REPEAT(' ',10-STRLEN($s_PreTotGe)).$s_PreTotGe;
		$s_PreTotGe2 = STR_REPEAT(' ',10-STRLEN($s_PreTotGe2)).$s_PreTotGe2;
		$s_PreTaxa2 = STR_REPEAT(' ',10-STRLEN($s_PreTaxa2)).$s_PreTaxa2;
		$s_PreTaxa2P = STR_REPEAT(' ',10-STRLEN($s_PreTaxa2P)).$s_PreTaxa2P;
		//
		// RECEBIMENTOS ANTECIPADOS
	    $aPag_Parcial = Ext_Pag_Parcial($sFat_LstRPcl); // colocado aqui em cima para verificar se tem pagamento parcial
		$bParcial = ($aPag_Parcial['TOTAL']>0) ;
		   		//
		$sTxt_Imprimir .= 
		   $sPulaLinha.
		   $s_EmpNomeCP.$sPulaLinha.
		   ($bTipoBalcao ?
		     '          B A L C A O   W E B' :
			 ( $bTipoEntreg ?
			 '         E N T R E G A   W E B' :
			 ( $bTipoComand ?
		       '            COMANDA.: '.Str_Zero($nCodLocalW,5)
			   :
		       ( $bTipoEncomd ?
			     $sPulaLinha.
		         '           E N C O M E N D A'
		       :
		         ( $bTipoConsgi ?
			       $sPulaLinha.
		           '          C O N S I G N A D O'
                 :
                   AlinhaStr( $s_Nome_Local.': '.Str_Zero($nCodLocalW,3) ,1, 40)
                 )
			   )
			 )
			 )
		   ).$sPulaLinha.
            ( $bAlterado ?
             AlinhaStr('*** A L T E R A D O ***',1 ).$sPulaLinha
            :
             ''
            ).
         ( $nFat_Dat_Fim <= 0 ?
           AlinhaStr('* IMPRESSAO PARCIAL *',1 ).$sPulaLinha.
         '' : '' ).
		   $sPulaLinha.
		   ( $aComanda_Expandido[1] ? '[EXPANDIR]' : '').
		   'Cmd. Dia: '.Str_Zero($nFat_SqComan,6).(!($bTipoBalcao OR $bTipoEntreg OR $bTipoEncomd OR $bTipoConsgi) ? '          Perm: '.$s_TempoPer : '').$sPulaLinha.
		   ( $aComanda_Expandido[2] ? '[EXPANDIR]' : '').
		   'Data....: '.DATE("d/m/Y",$nFat_DataIni).' '.DATE('H:i:s',$nFat_Dat_Ini).$sPulaLinha.
		   ( $aComanda_Expandido[3] ? '[EXPANDIR]' : '').
		   'Operador: '.@$R_CadFuncionario->FUN_APELID.' - '.SUBSTR(PegarPorPausa(@$R_CadFuncionario->FUN_NOMECP,3),0,25).
		   (!($bTipoBalcao OR $bTipoEntreg) ?
		    ( STRLEN($sNomeOpeFec)>0 ?
			  ' Fec.: '. SUBSTR($sApelido,0,3).'-'.$sNomeOpeFec
		     :
			 ''
			 )
		   :
             ''		   
		   ).
		   $sPulaLinha.
		   ( $nFat_Dta_Enc > 0 ?
		     'Entregar: '.DATE("d/m/Y",$nFat_Dta_Enc).
			 ( (EMPTY($sFat_Hor_Enc) OR $sFat_Hor_Enc=="00:00:00") ? "" :
			  ' '.$sFat_Hor_Enc
			 ).
			 $sPulaLinha
		   : '').
		   '----------------------------------------'.$sPulaLinha.
		   ((($bTipoBalcao OR $bTipoEntreg OR $bTipoEncomd OR $bTipoConsgi) || ($nFat_Tip_Loc==0 && $bCliente_FatGer)) ?
             ( $aComanda_Expandido[4] ? '[EXPANDIR]' : '').'Nome....: '.SUBSTR($sMvg_NomCli,0,30).$sPulaLinha
           : '' ).
           ( empty($sMvg_NomCli) ? '' : 'Nome....: '.SUBSTR($sMvg_NomCli,0,30).$sPulaLinha ).
		   ( ($bTipoEntreg OR $bTipoEncomd ) ?
		     ( $aComanda_Expandido[5] ?
			   '[EXPANDIR]End:'.@$Row_CadCli['CLI_ENDLOG'].$sPulaLinha.
			   '[EXPANDIR]Num:'.@$Row_CadCli['CLI_ENDNUM'].$sPulaLinha.
			   ( EMPTY($Row_CadCli['CLI_ENDCPL']) ? '' :
			     '[EXPANDIR]Cmp:'.@$Row_CadCli['CLI_ENDCPL'].$sPulaLinha
			   )
			 :
		       'Endereco: '.SUBSTR($sCli_Endere,0,30).$sPulaLinha.
			   ( STRLEN($sCli_Endere)>30 ?
		         '          '.SUBSTR($sCli_Endere,30,30).$sPulaLinha
			   : '')
			 ).
			 ( $aComanda_Expandido[6] ?
			   '[EXPANDIR]Bai:'.@$sCli_Bairro
			 :
			   'Bairro..: '.SUBSTR(@$sCli_Bairro,0,30)
			 ).
		     $sPulaLinha.
			 ( $aComanda_Expandido[7] ? '[EXPANDIR]' : '').
		     'Telefone: '.FormataTelefone(@$sCli_Tel001).'  '.FormataTelefone(@$sCli_Tel002).$sPulaLinha
		   : 
		     (($nFat_Tip_Loc==0 && $bCliente_FatGer) ?
		      'Telefone: '.FormataTelefone(@$sCli_Tel001).'  '.FormataTelefone(@$sCli_Tel002).$sPulaLinha
		     :
			 ""
			 )
		   ).
		   '========================================'     .$sPulaLinha.
		   'Cod/Qtde. - Descricao  /  Unit.  - Total'     .$sPulaLinha.
		   '========================================'     .$sPulaLinha.
		   ( $bAlterado ?
             AlinhaStr('*** A L T E R A D O ***', 1 ).$sPulaLinha
           :
             ''
            ).
           $sTxt_Prod_Agr.
		   ( EMPTY($sTxt_Prod_Agr) ? '' :
		     '----------------------------------------'.$sPulaLinha.
			 ( $nTot_Prod_Agr>0 ?
		     'Sub-total de produtos..... R$ '.AlinhaStr( FormatoMoeda($nTot_Prod_Agr),2,10).$sPulaLinha.
		     '----------------------------------------'.$sPulaLinha
			 : '')
		   ).
           $sTxt_Produtos.
		   //DISK e Balc�o (feito para Oasis)
         //-Impress�o da COMANDA INTEIRA
         // -N�o imprimir produto que tenha sido CANCELADO na tela 
			( $bImp_Can ?
			  ( $bPar_Can ?
			  ( STRLEN($sTxt_Prod_Can)>2 ?
		     '----------------------------------------'     .$sPulaLinha.
		     '   ****   C A N C E L A D O S   ****'         .$sPulaLinha.
		     $sTxt_Prod_Can.$sPulaLinha: '')
           :
           "" )			  
			: 
			  "" 
			).
		   '----------------------------------------'     .$sPulaLinha.
		   (($bTipoBalcao OR $bTipoEntreg) ?
		     ( ($nTot_Prod_Agr>0 OR $nFat_TaxaSvr>0) ?
			   ( $aComanda_Expandido[8] ? '[EXPANDIR]' : '').
		       'Sub-Total                  R$ '.$s_PreTotGe .$sPulaLinha
			 : '' ).
		     ( $nFat_TaxaSvr>0 ?
			 ( $aComanda_Expandido[9] ? '[EXPANDIR]' : '').
		     'Taxa de entrega..........: R$ '.$s_PreComis .$sPulaLinha.
		     '----------------------------------------'   .$sPulaLinha.
			 '' : '').
		     ''
		   :
			 //( $aComanda_Expandido[8] ? '[EXPANDIR]' : '').
		     //'Sub-Total                  R$ '.$s_PreTotGe .$sPulaLinha.
		     //'----------------------------------------'   .$sPulaLinha.
			 //( $nFat_PerTSvr>0 ?
		     ( ($nTot_Prod_Agr>0 OR $nFat_TaxaSvr>0) ?
			   ( $aComanda_Expandido[8] ? '[EXPANDIR]' : '').
		       'Sub-Total                  R$ '.$s_PreTotGe .$sPulaLinha
			 : '' ).
		     ( $nFat_TaxaSvr>0 ?
			 ( $aComanda_Expandido[10] ? '[EXPANDIR]' : '').
          //
          //'Taxa Serv.        '.$s_PorComis.'    R$ '.$s_PreComis.$sPulaLinha   *** Removido na alteração 10857 - 24/02/2026
          AlinhaStr(
            ( empty($sTexto_Mesa_Taxa_Svc) ? 'Taxa Serv.' : $sTexto_Mesa_Taxa_Svc )
            ,0,20
          ).
          ' '.
          ( $bImprimir_Tx_Svc_Prc ? $s_PorComis : str_repeat( ' ', strlen($s_PorComis) ) ).
          ' R$ '.$s_PreComis.$sPulaLinha.
          //
			 "" : "").
			 ( @$nFat_TaxaCvr+0 > 0 ?
			  'Taxa Couver     '.$s_PreTaxa2P.' R$ '.$s_PreTaxa2.$sPulaLinha
			 : '').
		   '').
		   ( ($n_PreSubTot>0 AND $nFat_ValDesc>0)?
		    'Total acima..............: R$ '.AlinhaStr($s_PreSubTot,2,10).$sPulaLinha.
		   '' : '').
		   ( $nFat_ValDesc>0 ?
		    AlinhaStr('Desconto de '.$s_TaxaDesc,0,25,'.').': R$'.AlinhaStr($s_ValorDesc,2,11).$sPulaLinha.
	        //'----------------------------------------'   .$sPulaLinha.
		   '' : '').
		   ( $nFat_Tot_Rec==0 ?
		    AlinhaStr('Cortesia',1)
		    :
		    //( $bParcial ?  // quando tem valor parcial
			//   ( $dFat_Dat_Fim==0  ?  //aberta
			//      //'Total....................: R$ '.AlinhaStr( FormatoMoeda($n_PreTotGe2),2,10)
			//      'Total....................: R$ '.AlinhaStr( FormatoMoeda($nFat_Tot_Rec) ,2,10)
			//   :
			//      'Total....................: R$ '.$s_PreTotGe2
			//   )
			//:
	        '----------------------------------------'.$sPulaLinha.
			( $aComanda_Expandido[11] ?
              //'[EXPANDIR]Total a receber'.$sPulaLinha.
              //'[EXPANDIR]R$ '.FormatoMoeda($nFat_Tot_Rec)
			  '[EXPANDIR]A Receber R$'.AlinhaStr( FormatoMoeda($nFat_Tot_Rec), 2, 8 ).$sPulaLinha
			:
			  'Total a receber..........: R$ '.$s_PreTotGe2
			)
			//)
		   ).$sPulaLinha.
		   $sPulaLinha.
		   ($nFat_Qtd_Pes>1 ?    // Mostrar valor por pessoa
		    ( $nFat_RcForma==0 ? // Conta n�o recebida
		    'Valor por pessoa: ('.$nFat_Qtd_Pes.')   R$ '.FormatoMoeda( ($nFat_Tot_Rec-$aPag_Parcial['TOTAL']) /$nFat_Qtd_Pes)
		    :                    // Conta recebida
		    'Valor por pessoa: ('.$nFat_Qtd_Pes.')   R$ '.FormatoMoeda( ($nFat_Tot_Rec>0 ? $nFat_Tot_Rec : $nFat_Tot_Val) /$nFat_Qtd_Pes)
		    ).
		    $sPulaLinha
		   : '' ).
		   ( STRLEN($sMvg_Obs001)>0 ? 
		      ( $aComanda_Expandido[14] ?
			      '[EXPANDIR]'
			   :
			      ''
			   ).
		   	   'Obs1:'.substr($sMvg_Obs001,0,35).$sPulaLinha 
		   : 
		       ''
		   ).
		   ( STRLEN($sMvg_Obs002)>0 ? 
		      ( $aComanda_Expandido[14] ?
			      '[EXPANDIR]'
			   :
			      ''
			   ).
		       'Obs2:'.substr($sMvg_Obs002,0,35).$sPulaLinha 
		   : 
		       ''
		   ).
		   ( $bTipoEntreg ?
		     ( $nFat_TrocaPa>0 ?
		       $sPulaLinha.
			   '  Troco para.......: R$ '.AlinhaStr(FormatoMoeda($nFat_TrocaPa),2,10) .$sPulaLinha.
			   '  Valor do Troco...: R$ '.AlinhaStr(FormatoMoeda($nFat_TrocaPa-$nFat_Tot_Rec),2,10).$sPulaLinha.
			   '----------------------------------------'.$sPulaLinha
			 : '').
			 $sPulaLinha.
		     ( $aComanda_Expandido[12] ? '[EXPANDIR]' : '').
			 'Entregador...: '.$s_NomeEntregador.$sPulaLinha.
			 $sPulaLinha.
		     ''
		   : '').
		   '';
	   
	   // dados adicionais
	   If ($nFat_RcForma==0) { // conta nao recebida ainda do disk
	      If ( $bImp_Disk_Adc ) {
	         If ( $bTipoEntreg ) {
	            $sTxt_Imprimir .= 
	               $sPulaLinha.
	               $sPulaLinha.
				   $sPulaLinha.
				   $sPulaLinha.
				   'Data: '.DATE("d/m/Y",$nFat_DataIni).' '.DATE('H:i:s',$nFat_Dat_Ini).
				   ' Comanda: '.Str_Zero($nFat_SqComan,5).$sPulaLinha.
				   $sPulaLinha.
				   FormataTelefone($sCli_Tel001).' - '.
				   'Nome: '.SUBSTR($sMvg_NomCli,0,19).$sPulaLinha.
				   'End.: '.SUBSTR($sCli_Endere,0,30).$sPulaLinha.
				   ( STRLEN($sCli_Endere)>30 ?
			          '          '.SUBSTR($sCli_Endere,30,30).$sPulaLinha
				   :  '').
			       $sPulaLinha.
			       ( $aComanda_Expandido[11] ?
			         '[EXPANDIR]Total a receber......: R$ '.$s_PreTotGe2
			       :
			         'Total a receber..........: R$ '.$s_PreTotGe2
			       ).
                   $sPulaLinha.				 
				   "";
					 
	         }
	      }
	   }
	   //
	   // RECEBIMENTOS ANTECIPADOS
	   //$aPag_Parcial = Ext_Pag_Parcial($sFat_LstRPcl); colocado para cima preciso saber se teve parcial antes de imprimir o total
	   $nTot_Par  = 0;
	   $aRel_TXT_04 = ARRAY();

	   If ($aPag_Parcial['TOTAL']>0) {
	      $s_PartePagPcl = '';
		  $aRel_TXT_03 = ARRAY();
		  ForEach ( $aPag_Parcial as $aPagamento ) {
		     If ( (@$aPagamento[0]+0)>0 ) {
		         // $aPagamento[0]   // Valor
	             // $aPagamento[1]   // Codigo interno da tabela cad_modalidade
	             // $aPagamento[2]   // Descri��o da modalidade
	             // $aPagamento[3]   // Nome do cliente
	             // $aPagamento[4]   // Data e Hora do recebimento YYYY-MM-DD HH:MM:SS
	             // $aPagamento[5]   // Codigo do funcion�rio
				 $s_PartePagPcl .=
		             AlinhaStr( ( STRLEN($aPagamento[3])>0 ? $aPagamento[3] : $aPagamento[2] ) ,0,25,'.').
					 ': R$'.
					 AlinhaStr(FormatoMoeda($aPagamento[0]),2,11).
					 $sPulaLinha.
				     '';
			     $nTot_Par += $aPagamento[0];
			 
			     ARRAY_PUSH( $aRel_TXT_03,
				             ( STRLEN($aPagamento[3])>0 ? 
							    $aPagamento[3] 
							 : 
							    $aPagamento[2] 
							 ),
							 "PULAR_LINHA" 
						   );
			 }
		  }
		  
		  $sTxt_Imprimir .= 
				$sPulaLinha.
		        'RECEBIMENTOS ANTECIPADOS'.$sPulaLinha.
		        $s_PartePagPcl.
	            '----------------------------------------'.$sPulaLinha.
				'Total Recebido Antecipado'.
				': R$'.
				AlinhaStr(FormatoMoeda($nTot_Par),2,11).
				$sPulaLinha.
				'';
		  
		  
		  //
		  $s_PartePagPcl = '';
 		  
		  ForEach ($aRel_TXT_03 as $key => $sRel_TXT_03){
             ARRAY_PUSH( $aRel_TXT_04,
			             "PULAR_LINHA",
						 'RECEBIMENTOS ANTECIPADOS',
						 "PULAR_LINHA",
						 $sRel_TXT_03,
						 'Total Recebido Antecipado',
						 FormatoMoeda($nTot_Par),
						 "PULAR_LINHA"
				       );  
		  }
	   }
	   If( $nTot_Par>0) {
	      If ( $dFat_Dat_Fim==0 ) {             // Conta aberta tem a taxa
		     //$nTmpTot = ($n_PreTotGe2-$nTot_Par);
		     $nTmpTot = ($nFat_Tot_Rec-$nTot_Par);
		  } Else {
		     $nTmpTot = (($nFat_Tot_Rec) - $nTot_Par);
		  }
		  
		  $sTxt_Imprimir .= 
	         $sPulaLinha.
		     'Total a receber..........: R$ '.AlinhaStr( FormatoMoeda( $nTmpTot ),2,10).$sPulaLinha.
		     $sPulaLinha.
		     "";
	      
		  ARRAY_PUSH( $aRel_TXT_04,
		              "PULAR_LINHA",
					  'Total a receber', 
					  FormatoMoeda( $nTmpTot ),
					  "PULAR_LINHA",
					  "PULAR_LINHA"
	                );
	   
	   }
	   
	   //
	   // CONTA RECEBIDA
	   If ($nFat_RcForma>0) {
           $strSQLQuery = 'SELECT * FROM cad_modalidade_pag;';
           $Rows_CadPag = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
		   $aMod_Pag = ARRAY();
		   While ( $Row_CadPag=MYSQL_FETCH_OBJECT($Rows_CadPag) ) {
		      $aMod_Pag[$Row_CadPag->MPG_CODIGOI] = $Row_CadPag->MPG_DESCRIC;
           }
	       //
           $strSQLQuery = 'SELECT * FROM mov_modalidade_pag WHERE MOV_CFATGER="'.$nFat_CodigoI.'" LIMIT 1;';
           $Row_MovPag = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
		   $nDataMovPg = 0;
		   If ( $Row_MovPag=MYSQL_FETCH_OBJECT($Row_MovPag) ) {
		      $nDataMovPg = ConvertDtHrSTR($Row_MovPag->MOV_REGDATA);
		   }
		   //
           $strSQLQuery = 'SELECT * FROM mov_modalidade_pag WHERE MOV_CFATGER="'.$nFat_CodigoI.'" ORDER BY MOV_MPGCODI DESC;';
           $Rows_MovPag = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
           $sTxt_Imprimir .=
              '========================================'.$sPulaLinha.
			  '*  C O N T A   J A   R E C E B I D A   *'.$sPulaLinha.
			  '';
		   $aDadosFun = PuxarDadosCaixa($nFat_SqCaixa);
		   
		   ARRAY_PUSH( $aRel_TXT_04,
		               "PULAR_LINHA",
		               '*  C O N T A   J A   R E C E B I D A   *',
					   "PULAR_LINHA"
					 );
		   
		   If ( ISSET($aDadosFun[6]) ) {
              $sTxt_Imprimir .=
                  AlinhaStr('Caixa.: '.Str_Zero($nFat_SqCaixa,6),0,18).AlinhaStr('Ope.: '.$aDadosFun[6][2],2,22).
				  $sPulaLinha.
				  'Comanda recebida em  '.DATE("d/m/Y",$aDadosFun[7])." ".DATE('H:i:s',$nDataMovPg).
				  $sPulaLinha.
				  '';
				  
				  ARRAY_PUSH( $aRel_TXT_04,
				              'Caixa.: ',
							  Str_Zero($nFat_SqCaixa,6),
							  'Ope.: ',
							  $aDadosFun[6][2],
							  "PULAR_LINHA",
							  'Comanda recebida em',
							  DATE("d/m/Y",$aDadosFun[7]),
							  DATE('H:i:s',$nDataMovPg),
							  "PULAR_LINHA"
				            );
		   }
		   $nValorRec = 0;
		   While ( $Row_MovPag=MYSQL_FETCH_OBJECT($Rows_MovPag) ) {
			  If ($Row_MovPag->MOV_MPGCODI==0) {
			     //
		         $sMPG_Descric = '+ TOTAL RECEBIDO';
			     $sMPG_ValorMV = FormatoMoeda($nValorRec);
			     $sMPG_ValorMV = ".: R$ ".STR_REPEAT(" ",10-STRLEN($sMPG_ValorMV)).$sMPG_ValorMV;
			     $sMPG_Descric = SUBSTR($sMPG_Descric,0,24);
			     $sMPG_Descric = $sMPG_Descric.STR_REPEAT(".",24-STRLEN($sMPG_Descric));				 
                 $sTxt_Imprimir .=
		            '                           -------------'.$sPulaLinha.
				    $sMPG_Descric.$sMPG_ValorMV.$sPulaLinha;
			     
				 ARRAY_PUSH( $aRel_TXT_04,
				             '+ TOTAL RECEBIDO',
							 FormatoMoeda($nValorRec), 
							 "PULAR_LINHA"
						   );
				 
				 
				 //
		         $sMPG_Descric = '- TROCO';
			     $sMPG_ValorMV = FormatoMoeda($Row_MovPag->MOV_VALORMV);
			     $sMPG_ValorMV = ".: R$ ".STR_REPEAT(" ",10-STRLEN($sMPG_ValorMV)).$sMPG_ValorMV;
			     $sMPG_Descric = SUBSTR($sMPG_Descric,0,24);
			     $sMPG_Descric = $sMPG_Descric.STR_REPEAT(".",24-STRLEN($sMPG_Descric));
                 $sTxt_Imprimir .= 
				    $sMPG_Descric.$sMPG_ValorMV.$sPulaLinha;
				 
				 ARRAY_PUSH( $aRel_TXT_04,
				             '- TROCO',
				             FormatoMoeda($Row_MovPag->MOV_VALORMV),
							 "PULAR_LINHA"
				           );
				 
				 //
			  } Else {
			     $sMPG_Descric = @$aMod_Pag[$Row_MovPag->MOV_MPGCODI];
				 If( $Row_MovPag->MOV_MPGCODI==999 )  {
				    $sMPG_Descric = 'Recebimento Antecipado';
				 } ElseIf ( STRLEN($sMPG_Descric)==0 ) {
				    $sMPG_Descric = '(DESCONHECIDO)';
				 }
				 $nValorRec += $Row_MovPag->MOV_VALORMV;
			     $sMPG_ValorMV = FormatoMoeda($Row_MovPag->MOV_VALORMV);
			     $sMPG_ValorMV = "R$ ".STR_REPEAT(" ",10-STRLEN($sMPG_ValorMV)).$sMPG_ValorMV;
				 $sMPG_Descric = $sMPG_Descric;
			     $sMPG_Descric = SUBSTR($sMPG_Descric,0,26);
			     $sMPG_Descric = $sMPG_Descric.STR_REPEAT(" ",26-STRLEN($sMPG_Descric));
                 //
				 $sTxt_Imprimir .=  $sMPG_Descric." ".$sMPG_ValorMV.$sPulaLinha;
				 //
			     ARRAY_PUSH(  $aRel_TXT_04,
			                  $sMPG_Descric,
							  FormatoMoeda($Row_MovPag->MOV_VALORMV),
							  "PULAR_LINHA"
							); 
			  
			  }
		   }
	   }
	   //
	   // COMANDA CANCELADA
	   If ($nFat_Cancela>0) {
          $strSQLQuery = 'SELECT * FROM cad_funcionario WHERE FUN_CODIGO="'.$nFat_Cancela.'";';
		  $sFat_Can_Dat = ConvertDtHrSTR($sFat_Can_Dat);
		  $sFat_Can_Dat = DATE('d/m/Y H:i:s',$sFat_Can_Dat);
          $sTxt_Imprimir .=
             '========================================'.$sPulaLinha.
			 '*  C O M A N D A   C A N C E L A D A   *'.$sPulaLinha.
			 ' Cancelada em '.$sFat_Can_Dat.$sPulaLinha.
			 '';
          
		  ARRAY_PUSH(  $aRel_TXT_04,
		               '*  C O M A N D A   C A N C E L A D A   *',
					   "PULAR_LINHA",
					   'Cancelada em ',
					   $sFat_Can_Dat,
					   "PULAR_LINHA"
					);  
		  
		  $Row_CanCFun = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
	      If ( $Row_CanCFun = MYSQL_FETCH_OBJECT($Row_CanCFun) ) {
             $sTxt_Imprimir .=
                ' Func.: '.SUBSTR($Row_CanCFun->FUN_APELID.' - '.$Row_CanCFun->FUN_NOMECP,0,32).
				$sPulaLinha.
		        ( STRLEN( $sMot_Can_Com ) > 1 ?
				    ' Mot.C: '.$sMot_Can_Com.
				    $sPulaLinha
				:
                    ''
                ).					
				'';
		     ARRAY_PUSH( $aRel_TXT_04,
		                 'Func.:',
						 SUBSTR($Row_CanCFun->FUN_APELID.' - '.$Row_CanCFun->FUN_NOMECP,0,32),   
		                  "PULAR_LINHA"
					   );
			
			( STRLEN( $sMot_Can_Com ) > 1 ?	
			        ARRAY_PUSH( $aRel_TXT_04,
		                        ' Mot.C:',
							    $sMot_Can_Com,
				                "PULAR_LINHA"
							  )
			:
			   ""
            );					   
					   
		  }
	   }
	   //
       $sTxt_Imprimir .=
		   '========================================'     .$sPulaLinha.
		   ( STRLEN( $sMen_Cli ) > 0 ?
		       AlinhaStr($sMen_Cli,1).$sPulaLinha
		   :
		      //'    SIMSOFT COMPUTADORES E SOFTWARE'          .$sPulaLinha.
		      //'           www.simsoft.com.br'                
		      //AlinhaStr('SIMSOFT SOLUCOES EM SOFTWARE',1) .$sPulaLinha.
		      AlinhaStr('Ctr.Int: '.$nFat_CFatGer,1).$sPulaLinha.
		      AlinhaStr('www.simsoft.com.br eCook: '.Aplicativo_Versao,1)                
		   
              
		   ).
		   ///STR_REPEAT($sPulaLinha.' ',10).
		   '';
	    ( STRLEN( $sMen_Cli ) > 0 ?
	       ARRAY_PUSH( $aRel_TXT_04,
	                   $sMen_Cli,
					   "PULAR_LINHA"
				     )
		:
		   ARRAY_PUSH( $aRel_TXT_04,
	       		       'SIMSOFT SOLUCOES EM SOFTWARE',
		   		       "PULAR_LINHA",
				       'www.simsoft.com.br', 
					   'eCook: ',
					   Aplicativo_Versao
		             )
		
		);		 
	 } Else {
        //
        $strSQLQuery =
          "SELECT ".
		    "OpeCan.FUN_APELID AS CAN_APELID, OpeCan.FUN_NOMECP AS CAN_NOMECP, ".
			"MovTrs.MOV_FATGDST, ".
			"FtgDst.FAT_NUM_MES AS DST_NUM_MES, ".
			"fat_geral.* ".
          "FROM fat_geral ".
		  "LEFT JOIN cad_funcionario        AS OpeCan  ON   OpeCan.FUN_CODIGO  = fat_geral.FAT_CANCELA ".
		  "LEFT JOIN mov_transferencia_item AS MovTrs  ON ( MovTrs.MOV_FATGORI = fat_geral.FAT_CODIGOI AND ( MovTrs.MOV_TIPOMOV = 1 OR MovTrs.MOV_TIPOMOV = 2 ) ) ".
		  "LEFT JOIN fat_geral              AS FtgDst  ON ( FtgDst.FAT_CODIGOI = MovTrs.MOV_FATGDST ) ".
          "WHERE ".$sSQLQueryW." ".
		  "LIMIT 1 ".
          ';';
        //
		// Tipo do movimento: 0=Transfer?ia de item, 1=Transfer?ia de mesa, 2=Jun? de mesa
        $aFat_Geral = MYSQL_QUERY($strSQLQuery) or die('<br>' .$strSQLQuery . '<br>' . MYSQL_ERROR()); // Executar comando SQL
		$aFat_Geral = MYSQL_FETCH_ARRAY($aFat_Geral,MYSQL_ASSOC);
		If ( (0+@$aFat_Geral['FAT_CODIGOI'])>0 ) {
           // Calcular tempo de perman�ncia
		   $nFat_Dat_Ini = ConvertDtHrSTR($aFat_Geral['FAT_DAT_INI']);
		   $nFat_Dat_Fim = ConvertDtHrSTR($aFat_Geral['FAT_DAT_FIM']);
		   If ( $nFat_Dat_Fim < MKTIME(0,0,0,1,1,2000) ) {
			  $nFat_Dat_Fim = ConvertDtHrSTR($aFat_Geral['FAT_CAN_DAT']);
		   }
           $s_TempoPer = DATE('H:i:s',$nFat_Dat_Ini);
           $aTemp1 = EXPLODE(':',$s_TempoPer);
           $nHora_Ped = ($aTemp1[0]*60*60)+($aTemp1[1]*60)+$aTemp1[2];
           If ($nFat_Dat_Fim==0) {
              $aTemp1 = EXPLODE(':',DATE('H:i:s'));
           } Else {
              $aTemp1 = EXPLODE(':',DATE('H:i:s',$nFat_Dat_Fim));
           }
           $nHora_Atu = ($aTemp1[0]*60*60)+($aTemp1[1]*60)+$aTemp1[2];
           $nHora_Per = $nHora_Atu - $nHora_Ped;
           If ($nHora_Atu < $nHora_Ped) {
              $nHora_Per += 24*60*60;
           }
           $aTemp1[0]=0; // Hora
           $aTemp1[1]=0; // Minuto
           $aTemp1[2]=0; // Segundo
           While (True) {  // Extrair Hora
              $nTempCalc = $nHora_Per-(60*60);
              If ($nTempCalc<0) { BREAK; }
              $nHora_Per = $nTempCalc;
              $aTemp1[0] += 1;
           }
           While (True) {  // Extrair Minuto
              $nTempCalc = $nHora_Per-(60);
              If ($nTempCalc<0) { BREAK; }
              $nHora_Per = $nTempCalc;
              $aTemp1[1] += 1;
           }
           $aTemp1[2] = $nHora_Per;
           $s_TempoPer = Str_Zero($aTemp1[0],2).':'.Str_Zero($aTemp1[1],2).':'.Str_Zero($aTemp1[2],2);
		   //
           $sTxt_Imprimir .=
             $sPulaLinha.
             $s_EmpNomeCP.$sPulaLinha.
             ( $aFat_Geral['FAT_TIP_LOC']==0 ? '               MESA.: '.Str_Zero($aFat_Geral['FAT_NUM_MES'],3) : '' ).
             ( $aFat_Geral['FAT_TIP_LOC']==1 ? '          B A L C A O   W E B'  : '' ).
             ( $aFat_Geral['FAT_TIP_LOC']==2 ? '         E N T R E G A   W E B' : '' ).
             ( $aFat_Geral['FAT_TIP_LOC']==3 ? '            COMANDA.: '.Str_Zero($aFat_Geral['FAT_NUM_MES'],5) : '' ).
             $sPulaLinha.
             ( $aComanda_Expandido[1] ? '[EXPANDIR]' : '').
             'Comanda.: '.Str_Zero( $aFat_Geral['FAT_SQCOMAN'] ,6).
			 ( ($aFat_Geral['FAT_TIP_LOC']==0 OR $aFat_Geral['FAT_TIP_LOC']==3) ?
			   '          Perm: '.$s_TempoPer
			 : '').$sPulaLinha.
             ( $aComanda_Expandido[2] ? '[EXPANDIR]' : '').
             'Data....: '.
			 DATE("d/m/Y", ConvertDataSTR($aFat_Geral['FAT_DATAINI'])).' '.
			 DATE('H:i:s', $nFat_Dat_Ini ).
			 $sPulaLinha.
             ( $aComanda_Expandido[3] ? '[EXPANDIR]' : '').
             'Operador: '.@$R_CadFuncionario->FUN_APELID.' - '.SUBSTR(PegarPorPausa(@$R_CadFuncionario->FUN_NOMECP,3),0,25).
			 $sPulaLinha.
		     '';
           // COMANDA CANCELADA
           If ($aFat_Geral['FAT_CANCELA']>0) {
              $sFat_Can_Dat = DATE('d/m/Y H:i:s', ConvertDtHrSTR($aFat_Geral['FAT_CAN_DAT']) );
              $sTxt_Imprimir .=
                '========================================'.$sPulaLinha.
				( @$aFat_Geral['DST_NUM_MES']+0==0 ?
                '*  C O M A N D A   C A N C E L A D A   *'.$sPulaLinha.
                ' Cancelada em '.$sFat_Can_Dat
				:
                '* C O M A N D A  T R A N S F E R I D A *'.$sPulaLinha.
				' Mesa de destino : '.Str_Zero($aFat_Geral['DST_NUM_MES'],3).$sPulaLinha.
                ' Transferida em '.$sFat_Can_Dat
				).
				$sPulaLinha.
                ' Func.: '.SUBSTR(@$aFat_Geral['CAN_APELID'].' - '.@$aFat_Geral['CAN_NOMECP'],0,32).
                $sPulaLinha.
                ( EMPTY( $aFat_Geral['FAT_MOTCFG'] ) ?
				 '' :
                 ' Mot.C: '.$aFat_Geral['FAT_MOTCFG'].
                 $sPulaLinha
                ).					
                '';
		      //
           }
		}
		//
	 }
	 //
	 If ( $b_RemoverAcentos ) {
	    $sTxt_Imprimir = RemoveAcentos($sTxt_Imprimir);
	 }
	 //
	 $sNome_Fun = SUBSTR(PegarPorPausa(@$R_CadFuncionario->FUN_NOMECP,3),0,25);
	 $sApelido  =  SUBSTR($sApelido,0,3);
	 //
	 $aRel_TXT_01 = ARRAY();
	 $aRel_TXT_02 = ARRAY();
	 
	 //
	 ARRAY_PUSH( $aRel_TXT_01,
	             'Operador: ', 
	             @$R_CadFuncionario->FUN_APELID,
			     $sNome_Fun	   
			  );	  
	 //
	 ( !($bTipoBalcao OR $bTipoEntreg) ?
	    ( STRLEN($sNomeOpeFec)>0 ?
	       ARRAY_PUSH( $aRel_TXT_01,
			  		   ' Fec.: ',
			  		   $sApelido,
					   $sNomeOpeFec
                     )
		:
           ""
        )		
	 :
	    ""
	 );	
	 
	 
	 ( $bTipoEntreg ?
        ( $aComanda_Expandido[5] ?
		   ARRAY_PUSH( $aRel_TXT_02,
			           'End:',
				       @$Row_CadCli['CLI_ENDLOG'],
			           "PULAR_LINHA",
					   'Num:',
					   @$Row_CadCli['CLI_ENDNUM'],
					   "PULAR_LINHA"
					 )
	    :
  		   ARRAY_PUSH( $aRel_TXT_02,
		               'Endereco: ',
					   SUBSTR($sCli_Endere,0,30),
					   "PULAR_LINHA",	  
		      		   ( STRLEN($sCli_Endere)>30 ?
					      SUBSTR($sCli_Endere,30,30)
					   :
						  ""
					   ),
					   "PULAR_LINHA",	  
					   'Bairro..: ',
					   SUBSTR($sCli_Bairro,0,30),
				   	   "PULAR_LINHA",	  
		               'Telefone: ',
					   FormataTelefone($sCli_Tel001),
					   FormataTelefone($sCli_Tel002),
				   	   "PULAR_LINHA"
					 )
    	
		)
		   
	 :
	   ( ($nFat_Tip_Loc==0 && $bCliente_FatGer) ?
	      ARRAY_PUSH( $aRel_TXT_02,
		              'Telefone: ',
					  FormataTelefone($sCli_Tel001),
					  FormataTelefone($sCli_Tel002),
					  "PULAR_LINHA"	  
			        )
				 
		:
			     ""
	    )
	 );
	 
//
	 $aRel_Excel=
	    ARRAY(
	       ARRAY(
		         $s_EmpNomeCP
	            ),
           ARRAY("PULAR_LINHA"),				
	       ( $bTipoBalcao ?
		     ARRAY( '          B A L C A O   W E B' ) 
		   :
		     ( $bTipoEntreg ?
			   ARRAY( '         E N T R E G A   W E B' )
			 :
	           ""  		 
			 )
		   ),
		   ARRAY("PULAR_LINHA"),				
		   ( $bAlterado ?
              ARRAY( AlinhaStr('*** A L T E R A D O ***',1 ))
		    :
              ''
           ),
		   ARRAY("PULAR_LINHA"),				
           ARRAY("PULAR_LINHA"),				
           ARRAY( 
		           'Comanda.: ',
				   Str_Zero($nFat_SqComan,6),
		           (! ( $bTipoBalcao OR $bTipoEntreg OR STRLEN(@$s_TempoPer)==0 ) ? 
				      '          Perm: '.$s_TempoPer 
				   : 
				      ''
				   )
				),   
		   ARRAY("PULAR_LINHA"),						   
		   ARRAY(
		           'Data....: ', DATE("d/m/Y",$nFat_DataIni).' '.DATE('H:i:s',$nFat_Dat_Ini)
                ),
		   ARRAY("PULAR_LINHA"),						   
           $aRel_TXT_01,
           ARRAY("PULAR_LINHA"),						   				
           
           ARRAY("PULAR_LINHA"),						   				
           ( ( ( $bTipoBalcao OR $bTipoEntreg) || ($nFat_Tip_Loc==0 && $bCliente_FatGer)) ? 
		      ARRAY(       
				      'Nome....: ',SUBSTR($sMvg_NomCli,0,30)
		           )
		   :
			       ''
		   ),
           ARRAY("PULAR_LINHA"),
		   $aRel_TXT_02,
		   ARRAY("PULAR_LINHA"),
		   ARRAY( 
		         'Cod/Qtde', 
				 'Descricao',
				 'Unit�rio',
				 'Total'
		        ),
		   ARRAY("PULAR_LINHA"),
           ARRAY(
		         ( $bAlterado ?
                 	   AlinhaStr('*** A L T E R A D O ***', 1 )
				 :
                   ''
                 ),
				 "PULAR_LINHA"
		        ),
		   $aRel_RPG_03,
		   ( $bImp_Can ?
		      ( $bPar_Can ?
		         ( STRLEN($sTxt_Prod_Can)>2 ?
		            ARRAY(
		                    '   ****   C A N C E L A D O S   ****',
                            "PULAR_LINHA",						  
		                    $sTxt_Prod_Can,
		                    "PULAR_LINHA"
		                  )
		         : 
		            ''
		         )
              :
                 "" 
		      )			  
		   : 
		      "" 
		   ),
          ( ($bTipoBalcao OR $bTipoEntreg) ?
             ( $nFat_TaxaSvr>0 ?
		        ARRAY(
			           'Sub-Total',
			           $s_PreTotGe ,
			           "PULAR_LINHA",
			 	       'Taxa de entrega',
				       $s_PreComis,
				       "PULAR_LINHA"
			 	    )
		     : 
			    ''
		     )
	      :
	         ''
	      ),
		  ( (0+@$nFat_ValDesc)>0 ?
		    ARRAY(
			        'Total acima',
			        $s_PreSubTot,
			        "PULAR_LINHA",
				    'Desconto de ',
					$s_TaxaDesc,
					$s_ValorDesc,
					"PULAR_LINHA"
				  )	
		  : 
		     ''
		  ),
		  ( (0+@$nFat_Tot_Rec)==0 ?
		       ARRAY('Cortesia')
		  :
		       ( $bParcial ?  // quando tem valor parcial
			       ( $dFat_Dat_Fim==0  ?  //aberta
			          ARRAY(
				              'Total',
						      //FormatoMoeda($n_PreTotGe2)
                              $s_PreTotGe2
						   )  
			       :
			          ARRAY(  
				              'Total',
						      $s_PreTotGe2
					  	   )
			       )
			   :
			      ( $aComanda_Expandido[11] ?
			         ARRAY( 
					         'Total a receber',
					         "PULAR_LINHA",
					 		 FormatoMoeda($nFat_Tot_Rec)
						  )	 
			      :
			         ARRAY(  'Total a receber',
					         $s_PreTotGe2
						  )	 
			      )
		   	   )
		   ),
		   ARRAY("PULAR_LINHA"),
		   ARRAY("PULAR_LINHA"),
		   ( (0+@$nFat_Qtd_Pes)>1 ?    // Mostrar valor por pessoa
		      ( $nFat_RcForma==0 ? // Conta n�o recebida
		           ARRAY( 
				          'Valor por pessoa:',
				          $nFat_Qtd_Pes,
				          FormatoMoeda( ($nFat_Tot_Rec-$aPag_Parcial['TOTAL']) /$nFat_Qtd_Pes)
						)  
		      :                    // Conta recebida
		           ARRAY( 'Valor por pessoa:',
				          $nFat_Qtd_Pes,
						  FormatoMoeda( ($nFat_Tot_Rec>0 ? $nFat_Tot_Rec : $nFat_Tot_Val) /$nFat_Qtd_Pes)
						)  
		      )
		    
		   : 
		      '' 
		   ),
		   ARRAY("PULAR_LINHA"),
		   ( STRLEN($sMvg_Obs001)>0 ? 
		      ARRAY(
			         'Obs1:',
			         SUBSTR($sMvg_Obs001,0,35),
					 "PULAR_LINHA"
				  )	 
		   : 
		       ''
		   ),
		   ( STRLEN($sMvg_Obs002)>0 ? 
		      ARRAY(
			          'Obs2:',
					  SUBSTR($sMvg_Obs002,0,35),
					   "PULAR_LINHA"
				   )  
		   : 
		       ''
		   ),
		   ( $bTipoEntreg ?
		     ( $nFat_TrocaPa>0 ?
		       ARRAY(
			           "PULAR_LINHA",
			           'Troco para ',FormatoMoeda($nFat_TrocaPa),
					   "PULAR_LINHA",
			           'Valor do Troco',
					   FormatoMoeda($nFat_TrocaPa-$nFat_Tot_Rec),
					   "PULAR_LINHA"
					)   
			 : 
			   ''
			 )
		   :
		      ''
		   ), 
		   ( $bTipoEntreg ? 
			 ARRAY( 
     			    "PULAR_LINHA",
			        'Entregador',
			        $s_NomeEntregador,
					"PULAR_LINHA",
					"PULAR_LINHA"
		          )
		   :
		      ''
		   ),
		   
		   ( $nFat_RcForma==0 ? // conta nao recebida ainda do disk
	          ( $bImp_Disk_Adc ?
	             ( $bTipoEntreg ?
	                 ARRAY(
					         "PULAR_LINHA",
							 "PULAR_LINHA",
							 'Data: ',
							 DATE("d/m/Y",$nFat_DataIni),
							 DATE('H:i:s',$nFat_Dat_Ini),
							 'Comanda:',
							 Str_Zero($nFat_SqComan,5),
							 "PULAR_LINHA",
							 "PULAR_LINHA",
                             FormataTelefone($sCli_Tel001),
				             'Nome: ',
							 SUBSTR($sMvg_NomCli,0,19),
							 "PULAR_LINHA",
							 'End.: ',
							 SUBSTR($sCli_Endere,0,30),
							 "PULAR_LINHA"
						  ) 
				  :
				    ''
                  )					
			   :
				    ''
              )
		   :
			  ''
		   ),		
           ( $nFat_RcForma==0 ? // conta nao recebida ainda do disk
              ( $bImp_Disk_Adc ?
	             ( $bTipoEntreg ?
			        ( STRLEN($sCli_Endere)>30 ?
			           ARRAY( 
					           SUBSTR($sCli_Endere,30,30),
					           "PULAR_LINHA"
					        )
				    : 
					   ''
					)
			    
				 :
				    ''
                 )					
			   :
				    ''
              )
		   :
			  ''
		   ),
		   ( $nFat_RcForma==0 ? // conta nao recebida ainda do disk
              ( $bImp_Disk_Adc ?
	             ( $bTipoEntreg ?
			        ARRAY( 
		                    'Total a receber',
		                    $s_PreTotGe2,
				            "PULAR_LINHA"
                         )
		         :
				    ''
                 )					
			  :
				    ''
              )
		   :   
			  ''
		   ),
           @$aRel_TXT_04		   
		);          
	 
	 //
	 // 
	 $_SESSION['TXT_EXCEL'] = $aRel_Excel;
	 
	 
	 //	
	 Return $sTxt_Imprimir;
	 //
}
//
//
Function SQLVarConfig($sVarConfNome, $bOpcCarSQL=False) {
  Global $aVarsConfig;
  IF (STRLEN($sVarConfNome)>0) {
     If ( $bOpcCarSQL OR (!ISSET($aVarsConfig[$sVarConfNome])) ) {
        $Row_Configs = MYSQL_QUERY("SELECT * FROM config;") or die(mysql_error());
        While ($Row_Config = MYSQL_FETCH_OBJECT($Row_Configs) ) {
		   $aVarsConfig[$Row_Config->VAR_NOME] = $Row_Config->VAR_CONTEUDO;
		}
	 }
	 Return @$aVarsConfig[$sVarConfNome];
	 //
  } Else {
    Return '';
  }  
}
//
Function SQLVarConfigG($sVarConfNome, $sVarConfValor) {
  Global $aVarsConfig;
  IF (STRLEN($sVarConfNome)>0) {
     $Row_Config = MYSQL_QUERY("SELECT * FROM config WHERE VAR_NOME='".$sVarConfNome."';") or die('ERRO NO SELECT. '.mysql_error());
     If (MYSQL_NUM_ROWS($Row_Config)>0) {
		$aVarsConfig[$sVarConfNome] = $sVarConfValor;
	    //$sVarConfValor = STR_REPLACE(CHR(92),CHR(92).CHR(92),$sVarConfValor);
	    //$sVarConfValor = STR_REPLACE(CHR(47),CHR(47).CHR(47),$sVarConfValor);
        $Row_Config = MYSQL_QUERY("UPDATE config SET VAR_CONTEUDO=".SQL_Bin($sVarConfValor)." WHERE VAR_NOME='".$sVarConfNome."';") or die('ERRO NO UPDATE. '.mysql_error().' : '.$sVarConfValor);
		Return True;
	 } Else {
        $Row_Config = MYSQL_QUERY("INSERT INTO config SET VAR_NOME = '".$sVarConfNome."', VAR_CONTEUDO=".SQL_Bin($sVarConfValor)." ;");
        Return True;
     }
  }
  Return False;
}
//
//
// Func�o de impress�o de ticket de produ��o
Function GerarTicketProducao( $nFat_CodigoI, $aEmt_FatItem, $nFat_Qtd_Ite=0, $sNomArq_Sufixo='', $nNum_Local_Conferencia=0, $bReimpressao=False ) {
   $s_DirDestino = SQLVarConfig('GARCOM_CLIPPER_ARQ_EXPORTA2');    // Pasta de exporta��o para o Serial (Impress�o)
   $aItensNoTicket = [];
   //
   $sTemporarios = GETCWD().'/temporarios';
   If ( ! IS_DIR($sTemporarios) ) {
	  MKDIR($sTemporarios);
   }
   //
   $sSQLQuery = "SELECT * FROM fat_geral WHERE FAT_CODIGOI=".$nFat_CodigoI." ;";
   $aFat_Geral = MYSQL_QUERY($sSQLQuery) OR Die($sSQLQuery.'<br>'.MYSQL_ERROR());
   If ( ! $aFat_Geral=MYSQL_FETCH_ARRAY($aFat_Geral,MYSQL_ASSOC) ) {
	  // ERRO: Registro na tabela FAT_GERAL n�o encontrado.
      Return [-2];
   }
   //
   $aExtencaoAq = SQLVarConfig('GARCOM_IMPC_'.$aFat_Geral['FAT_TIP_LOC']);
   $aExtencaoAq = EXPLODE(";",$aExtencaoAq);
   $b_ImpCupom = False;
   If ( (@$aExtencaoAq[0]+0) && STRLEN(@$aExtencaoAq[1])>0 ) {
      $b_ImpCupom = True;
   }
   $sCupomTicket = '';
   $b_Ticket_Loc = SQLVarConfig('GARCOM_LOCAL_TXT_SERIAL')+0;
   $b_Ticket_Bal = SQLVarConfig('GARCOM_BALCAO_TXT_SERIAL' )+0;
   $b_Ticket_Ent = SQLVarConfig('GARCOM_ENTREGA_TXT_SERIAL')+0;
   //
   If ( STRLEN($s_DirDestino)>0 && ( ($aFat_Geral['FAT_TIP_LOC']==0 && $b_Ticket_Loc) OR ($aFat_Geral['FAT_TIP_LOC']==1 && $b_Ticket_Bal) OR ($aFat_Geral['FAT_TIP_LOC']==2 && $b_Ticket_Ent) ) ) {
      $aItensNoTicket = GerarTexdoTicketP( $nFat_CodigoI, $aEmt_FatItem, $nFat_Qtd_Ite, $nNum_Local_Conferencia, $bReimpressao );
      $sCupomTicket   = $aItensNoTicket[0];
      $aItensNoTicket = $aItensNoTicket[1];
   }
   //
   If ( STRLEN($sCupomTicket)>0 AND (@$aItensNoTicket[0]+0)==0 ) {
      // Gravar arquivo TXT
      $sArqTemp = $sTemporarios."/ticket_".$nFat_CodigoI.'.txt';
      $sArqImpT =  // Montar nome do arquivo do ticket de produção
        $s_DirDestino.
        ($aFat_Geral['FAT_TIP_LOC']==0 ? "LOCAL" : "").
        ($aFat_Geral['FAT_TIP_LOC']==1 ? "BALCAO" : "").
        ($aFat_Geral['FAT_TIP_LOC']==2 ? "DISK" : "").
        "_".DATE("Ymd")."_".DATE("His").
        "_".Str_Zero($aFat_Geral['FAT_SQCOMAN'],6).
        $sNomArq_Sufixo.'.txt';
      //
      $hArqExp = FOPEN( $sArqTemp, "a" );
      FWRITE($hArqExp, $sCupomTicket );
      FCLOSE( $hArqExp );
      If ( IS_DIR($s_DirDestino) AND IS_DIR($sTemporarios) ) {
         COPY( $sArqTemp, $sArqImpT );
         UNLINK( $sArqTemp );
      } Else {
		 // ERRO: Caminho de impress�o para o aplicativo serial n�o configurado ou n�o encontrado.
         Return [-3];
      }
	  //// Sucesso na fun��o
	  //Return 0;
   }
   // Retorno do Erro
   Return $aItensNoTicket;
}
//
// Fun��o que gera texto do Ticket de produ��o
Function GerarTexdoTicketP( $nFat_CodigoI, $aNv_FatIte=ARRAY(), $nFat_Qtd_Ite=0, $nNum_Local_Conferencia=0, $bReimpressao=False ) {
    $aItensNoTicket = ARRAY();
    //
	If ( COUNT($aNv_FatIte)==0 ) {
	   Return ['',[-1]];     // ERRO: Sem itens para imprimir ticket de produ��o
	}
	$bAgruparItens = SQLVarConfig('TICKET_PRODUCAO_AGRUPAR_ITENS')+0;
    $s_Nome_Local = SQLVarConfig('NOME_LOCAIS_SVC');    // Nome do local
    // Puxar Fat_Geral
    $sSQLQuery = "SELECT * FROM fat_geral WHERE FAT_CODIGOI=".$nFat_CodigoI." ;";
    $Row_FatGer = MYSQL_QUERY($sSQLQuery) OR Die($sSQLQuery.'<br>'.MYSQL_ERROR());
	If ( ! $Row_FatGer=MYSQL_FETCH_ARRAY($Row_FatGer,MYSQL_ASSOC) ) {
	   Return ['',[-2]];     // ERRO: N�o existe registro com este codigo interno no FAT_GERAL
	}
	// Puxar Cad_Cliente
	$Row_CadCli = ARRAY();
	If ($Row_FatGer['FAT_CLIENTE']>0) {
       $sSQLRequest = "SELECT * FROM cad_cliente WHERE CLI_CODIGOI='".$Row_FatGer['FAT_CLIENTE']."';";
	   $Row_CadCli = MYSQL_QUERY($sSQLRequest) or die($sSQLRequest.'<br>'.MYSQL_ERROR());
	   If ( $Row_CadCli = MYSQL_FETCH_ARRAY($Row_CadCli,MYSQL_ASSOC) ) {
	      $sSQLRequest = 'TEL_CODCAD=CLI_CODIGOI AND TEL_TIPCAD=1';
	      $Rows_CadTel = MYSQL_QUERY("SELECT * FROM cad_cliente,cad_telefones WHERE ".$sSQLRequest." LIMIT 4;") or die(MYSQL_ERROR());
		  $nContador_ = 0;
          While ($Row_CadTel = MYSQL_FETCH_OBJECT($Rows_CadTel)) {
			 $nContador_++;
		     $Row_CadCli['CLI_TEL'.Str_Zero($nContador_,3)] = $Row_CadTel->TEL_NUMERO;
		  }
	   }
	}
	// Puxar Cad_Produto
    $sSQLRequest =
	  "SELECT pro.*, gru.GRU_ACTSAB ".
	  "FROM cad_produto             AS pro ".
	  "LEFT JOIN cad_grupo_produtos AS gru ON pro.ITE_COD_GRU = gru.GRU_CODIGO ".
	  ";";
    $Rows_Temp = MYSQL_QUERY($sSQLRequest) or die(MYSQL_ERROR().'<br>'.$sSQLRequest);
    $aProdutos = ARRAY();
    While ( $Row_Temp = MYSQL_FETCH_ARRAY($Rows_Temp, MYSQL_ASSOC) ) {
       $aProdutos[$Row_Temp['ITE_CODIGOI']] = $Row_Temp;
    }
	//acrescentado M na matriz, pois quando pedia um produto de meia n�o saia na cozinha
	$aTipProConv = ARRAY( "1" => "G"   ,   "2" => "M"   ,   "3" => "P",
	                      "4" => "H"   ,   "N" => "O"   ,   "I" => "P",
						  "M" => "I"   ,
	               );
	// Puxar FatIte
    $sSQLQuery = "SELECT * FROM fat_item WHERE FAT_CFATGER=".$nFat_CodigoI." AND FAT_FTI_CMB=0;";
    $Rows_FatIte = MYSQL_QUERY($sSQLQuery) OR Die($sSQLQuery.'<br>'.MYSQL_ERROR());
	$sRetornoTexto = '';
    $aImpressoras = ARRAY();
	$nCodFun = 0;
	$sNomFun = '';
	$aLst_FatIte = ARRAY();
	While ( $Row_FatIte=MYSQL_FETCH_ARRAY($Rows_FatIte,MYSQL_ASSOC) ) {
	   If ( ! ISSET($aNv_FatIte[$Row_FatIte['FAT_CODIGOI']]) ) { CONTINUE; }
	   If ( ! EMPTY($Row_FatIte['FAT_CANITEM']) ) { CONTINUE; }
	   If ( $bAgruparItens ) {
	      $sIndice = $Row_FatIte['FAT_CODITE1'].'_'.$Row_FatIte['FAT_CODITE2'].'_'.$Row_FatIte['FAT_CODITE3'].'_'.$Row_FatIte['FAT_CODITE4'].'_'.
		             $Row_FatIte['FAT_OPCINAL'].'_'.$Row_FatIte['FAT_PRE_TIP'].'_'.$Row_FatIte['FAT_OBSERV1'].'_'.$Row_FatIte['FAT_OBSERV2'];
	      // Existe a semelhan�a para agrupar
		  If ( ISSET( $aLst_FatIte[$sIndice] ) ) {
		     // Aceita v�rios sabores
		     If ( @$aProdutos[$Row_FatIte['FAT_CODITE1']]['GRU_ACTSAB'] ) {
			    $sIndice .= "_".$Row_FatIte['FAT_CODIGOI'];
	            $aLst_FatIte[$sIndice] = $Row_FatIte;
		     } Else {
                $aLst_FatIte[$sIndice]['FAT_QTD_ITE'] += $Row_FatIte['FAT_QTD_ITE'];
                $aLst_FatIte[$sIndice]['QTD_REG']++;
			 }
	      } Else {
             $Row_FatIte["QTD_REG"] = 1;
	         $aLst_FatIte[$sIndice] = $Row_FatIte;
	      }
          $aItensNoTicket[$Row_FatIte['FAT_CODIGOI']] = $sIndice;
	   } Else {
	      $aLst_FatIte[] = $Row_FatIte;
          $aItensNoTicket[$Row_FatIte['FAT_CODIGOI']] = '';
	   }
	}
	$bExiste_ProVin = False;
    //
    $nFatItem_Nro_Mes = 0;
	//
	// Gerar texto
	ForEach ($aLst_FatIte As $sIndice => $Row_FatIte) {
       //
       $bNao_Incluir_Item = False;
	   If ( ! ISSET($aNv_FatIte[$Row_FatIte['FAT_CODIGOI']]) ) { $bNao_Incluir_Item = True; }
	   If ( STRLEN($Row_FatIte['FAT_CANITEM'])>0 ) { $bNao_Incluir_Item = True; }
       //
       $sFat_NumLoc = '000';
       $sFat_NumCom = '000000';
       If ( $Row_FatGer['FAT_TIP_LOC']==3 ) {          // Comanda
          $sFat_NumCom = Str_Zero($Row_FatIte['FAT_SQCOMAN'],6);
       } Else {
          $sFat_NumLoc = SUBSTR( Str_Zero($Row_FatGer['FAT_NUM_MES'],6),3,3);
       }
       //
	   $nExp_NumImp = 0;
       If ( $Row_FatGer['FAT_TIP_LOC']==0 ) {          // Local (Mesa)
          If ( $nNum_Local_Conferencia>0 ) {
             $nExp_NumImp = $nNum_Local_Conferencia;
          } Else {
	         $nExp_NumImp = $aProdutos[$Row_FatIte['FAT_CODITE1']]['ITE_LOC_IMP1']+0;
          }
       } ElseIf ( $Row_FatGer['FAT_TIP_LOC']==1 ) {    // Balc�o
	      $nExp_NumImp = $aProdutos[$Row_FatIte['FAT_CODITE1']]['ITE_LOC_IMP2']+0;
	   } ElseIf ( $Row_FatGer['FAT_TIP_LOC']==2 ) {    // Disk Entrega
	      $nExp_NumImp = $aProdutos[$Row_FatIte['FAT_CODITE1']]['ITE_LOC_IMP3']+0;
	   }
	   If ( $nExp_NumImp==0 ) { $bNao_Incluir_Item = True; }
       //
       If ( $bNao_Incluir_Item ) {
          //          $aItensNoTicket[$Row_FatIte['FAT_CODIGOI']] = $sIndice;
          //$aTmp = $aItensNoTicket;
	      //ForEach ($aTmp As $nIndiceItem => $sItem ) {
          //   //If ( $sItem==$sIndice OR $nIndiceItem==@$Row_FatIte['FAT_CODIGOI'] ) {
          //   If ( $nIndiceItem==@$Row_FatIte['FAT_CODIGOI'] ) {
          //      UNSET( $aItensNoTicket[$nIndiceItem] );
          //      break;
          //   }
          //}
          //
          // -- Imprimir itens no combo --
          $a_Cad_Produto = @$aProdutos[$Row_FatIte['FAT_CODITE1']+0];
          If ( STRLEN(@$Row_FatIte['FAT_LISTACOMBO'])>0 ) {
            $aFat_ListaCombo = EXPLODE( ';', $Row_FatIte['FAT_LISTACOMBO'] );
            //
            If ( $nCodFun==0 ) {
	          $nCodFun = $Row_FatIte['FAT_COD_FUN'];
	          $sSQLQueryB = "SELECT FUN_CODIGO,FUN_NOMECP ".
	                        "FROM cad_funcionario ".
	          			     "WHERE FUN_CODIGO=".$nCodFun.";";
              $Row_CodFun = MYSQL_QUERY($sSQLQueryB) OR Die($sSQLQueryB.'<br>'.MYSQL_ERROR());
	          $sNomFun = '';
	          If ( $Row_CodFun=MYSQL_FETCH_ARRAY($Row_CodFun) ) {
	             $sNomFun = $Row_CodFun['FUN_NOMECP'];
	          }
	        }
            //
            ForEach( $aFat_ListaCombo AS $sSub_Item ) {
              $aSub_Item = EXPLODE(',',$sSub_Item);
              $nIte_CodigoI = Somente_Numeros(@$aSub_Item[0])+0;
              $nIte_Quatida = Somente_Numeros(@$aSub_Item[1],'.')+0;
              $nIte_PrecoUn = Somente_Numeros(@$aSub_Item[2],'.')+0;
              If ( $nIte_CodigoI==0 OR $nIte_Quatida==0 ) {
                CONTINUE;
              }
              $a_Cad_Produto = @$aProdutos[$nIte_CodigoI];
              $n_P_Local_Imp = @$a_Cad_Produto['ITE_LOC_IMP'.($Row_FatGer['FAT_TIP_LOC']+1)]+0;
              If ( EMPTY($a_Cad_Produto) || $n_P_Local_Imp==0 ) {
                CONTINUE;
              }
              $bNao_Incluir_Item = False;
              //
              $nIte_Quatida = $nIte_Quatida * $Row_FatIte['FAT_QTD_ITE'];
              $sIte_Quatida = NUMBER_FORMAT( $nIte_Quatida, 3, '','' );
	          $nFat_DatHor = ConvertDataSTR( $Row_FatIte['FAT_DAT_HOR'] );
              $sFat_PdData = DATE("dmY",$nFat_DatHor);
              $sFat_PdHora = DATE("His",$nFat_DatHor);
              $sIte_Descric = UTF8_DECODE( @$a_Cad_Produto['ITE_DESCRIC'] );
              $sExp_TipPre = 'N';
              $sExp_TipPre = @$aTipProConv[$sExp_TipPre];
              //
              $aImpressoras[$n_P_Local_Imp] = $n_P_Local_Imp;
              //
	          $sRetornoTexto .=
                "004".                                                   // Tipo de registro
                $sFat_NumLoc.                                            // Local
                AlinhaStr($Row_FatIte['FAT_COD_FUN'],2, 3).              // Codigo do Operador
                $sFat_PdData.                                            // Data do Pedido
                $sFat_PdHora.                                            // Data do Hora
                AlinhaStr( @$a_Cad_Produto['ITE_CODIGOL'],2, 4, '0').    // Codigos do Produto
                AlinhaStr('',2, 4, '0').
                AlinhaStr('',2, 4, '0').
                AlinhaStr('',2, 4, '0').
                Str_Zero($sIte_Quatida,12).                              // Quantidade dos produtos
                Str_Zero(0,12).
                Str_Zero(0,12).
                Str_Zero(0,12).
                $sExp_TipPre.
                AlinhaStr('',0,50). // Observacoes do pedido
                AlinhaStr('',0,50).
                "N".                                                     // Se e opcional (Nao)
                AlinhaStr($sIte_Descric, 0, 128, ' ').                   // Descricoes dos produtos (32 caracteres cada)
                Str_Zero($n_P_Local_Imp,2).                              // Codigo do local de impressao
                Str_Zero(@$a_Cad_Produto['ITE_COD_GRU'],3).              // Codigo do grupo
                $sFat_NumCom.                                            // Numero da comanda
                Str_Zero(0+@$Row_FatIte['FAT_SENHA_RETIRAR'],4).         // Senha para retirar
                CHR(13).CHR(10);
                //
            }
            //
          }
          //
          If ( $bNao_Incluir_Item ) {
             //          $aItensNoTicket[$Row_FatIte['FAT_CODIGOI']] = $sIndice;
             $aTmp = $aItensNoTicket;
	         ForEach ($aTmp As $nIndiceItem => $sItem ) {
                //If ( $sItem==$sIndice OR $nIndiceItem==@$Row_FatIte['FAT_CODIGOI'] ) {
                If ( $nIndiceItem==@$Row_FatIte['FAT_CODIGOI'] ) {
                   UNSET( $aItensNoTicket[$nIndiceItem] );
                   break;
                }
             }
          }
          //
          CONTINUE;
       }
	   //
       If ( $nFatItem_Nro_Mes == 0 ) {
         $nFatItem_Nro_Mes = $Row_FatIte['FAT_NRO_MES']+0;
       }
       //
       $n_Gravar_Item = 1;
       If ( $nNum_Local_Conferencia>0 ) {
          $nFat_Qtd_Ite = 1;
          $n_Gravar_Item = $Row_FatIte['FAT_QTD_ITE'];
       }
       //
       $nExp_QtdPr1 = ( $nFat_Qtd_Ite > 0 ? $nFat_Qtd_Ite : $Row_FatIte['FAT_QTD_ITE'] );
       $nExp_QtdPr2 = 0;
       $nExp_QtdPr3 = 0;
       $nExp_QtdPr4 = 0;
       $nPartes = 1;
	   $sExp_TipPre = $Row_FatIte['FAT_PRE_TIP'];
       //If ($sExp_TipPre == "M") { 
	   //   $nExp_QtdPr1 = $nExp_QtdPr1/2; 
	   //}
	   // colocado M na matriz, pois quando era um produto de meia nao saia na cozinha
	   $sExp_TipPre = @$aTipProConv[$sExp_TipPre];
	   If ($Row_FatIte['FAT_CODITE2']>0) { $nPartes++; }
       If ($Row_FatIte['FAT_CODITE3']>0) { $nPartes++; }
       If ($Row_FatIte['FAT_CODITE4']>0) { $nPartes++; }
       // Alteração 7230
       //If ( $nPartes==2 ) { $nExp_QtdPr1 = (0.5 *$Row_FatIte['FAT_QTD_ITE']); $nExp_QtdPr2 = (0.5 *$Row_FatIte['FAT_QTD_ITE']); }
       //If ( $nPartes==3 ) { $nExp_QtdPr1 = (0.34*$Row_FatIte['FAT_QTD_ITE']); $nExp_QtdPr2 = (0.33*$Row_FatIte['FAT_QTD_ITE']); $nExp_QtdPr3 = (0.33*$Row_FatIte['FAT_QTD_ITE']); }
       //If ( $nPartes==4 ) { $nExp_QtdPr1 = (0.25*$Row_FatIte['FAT_QTD_ITE']); $nExp_QtdPr2 = (0.25*$Row_FatIte['FAT_QTD_ITE']); $nExp_QtdPr3 = (0.25*$Row_FatIte['FAT_QTD_ITE']); $nExp_QtdPr4 = (0.25*$Row_FatIte['FAT_QTD_ITE']); }
       $sExp_QtdPr1 = NUMBER_FORMAT($nExp_QtdPr1, 3, '','');
       $sExp_QtdPr2 = NUMBER_FORMAT($nExp_QtdPr2, 3, '','');
       $sExp_QtdPr3 = NUMBER_FORMAT($nExp_QtdPr3, 3, '','');
       $sExp_QtdPr4 = NUMBER_FORMAT($nExp_QtdPr4, 3, '','');
	   //
	   $s_TxtDescri = "";
       For ($nContador = 1; $nContador<=4; $nContador++) {
          $n_CodIte = $Row_FatIte['FAT_CODITE'.$nContador];
          If ($n_CodIte>0) {
              $sIte_Descric = UTF8_DECODE( @$aProdutos[$n_CodIte]['ITE_DESCRIC'] );
              $s_TxtDescri .= AlinhaStr($sIte_Descric, 0, 32, ' ');
          }
       }
	   $nFat_DatHor = ConvertDataSTR( $Row_FatIte['FAT_DAT_HOR'] );
       $sFat_PdData = DATE("dmY",$nFat_DatHor);
       $sFat_PdHora = DATE("His",$nFat_DatHor);
	   $nCodFun = $Row_FatIte['FAT_COD_FUN'];
	   $sSQLQueryB = "SELECT FUN_CODIGO,FUN_NOMECP ".
	                 "FROM cad_funcionario ".
	   			     "WHERE FUN_CODIGO=".$nCodFun.";";
       $Row_CodFun = MYSQL_QUERY($sSQLQueryB) OR Die($sSQLQueryB.'<br>'.MYSQL_ERROR());
	   $sNomFun = '';
	   If ( $Row_CodFun=MYSQL_FETCH_ARRAY($Row_CodFun) ) {
	      $sNomFun = $Row_CodFun['FUN_NOMECP'];
	   }
	   //
	   $sFti_Nro_Mes = $Row_FatIte['FAT_NRO_MES']+0;
	   If ( $sFti_Nro_Mes>0 ) {
		  $sFti_Nro_Mes = STR_PAD($sFti_Nro_Mes, 6,' ',STR_PAD_LEFT);
	   } ElseIf ($sFti_Nro_Mes==-1) {
	      $sFti_Nro_Mes = "BALCAO";
	   } Else {
	      $sFti_Nro_Mes = "      ";
	   }
	   //
       While ( $n_Gravar_Item>0 ) {
          //
          $aImpressoras[$nExp_NumImp] = $nExp_NumImp;
          //
	      $sRetornoTexto .=
             "004".                                                   // Tipo de registro
             $sFat_NumLoc.                                            // Local
             AlinhaStr($Row_FatIte['FAT_COD_FUN'],2, 3).              // C�digo do Operador
             $sFat_PdData.                                            // Data do Pedido
             $sFat_PdHora.                                            // Data do Hora
             AlinhaStr(@$aProdutos[$Row_FatIte['FAT_CODITE1']]['ITE_CODIGOL'],2, 4, '0'). // Codigos do Produto
             AlinhaStr(@$aProdutos[$Row_FatIte['FAT_CODITE2']]['ITE_CODIGOL'],2, 4, '0').
             AlinhaStr(@$aProdutos[$Row_FatIte['FAT_CODITE3']]['ITE_CODIGOL'],2, 4, '0').
             AlinhaStr(@$aProdutos[$Row_FatIte['FAT_CODITE4']]['ITE_CODIGOL'],2, 4, '0').
             Str_Zero($sExp_QtdPr1,12).                               // Quantidade dos produtos
             Str_Zero($sExp_QtdPr2,12).
             Str_Zero($sExp_QtdPr3,12).
             Str_Zero($sExp_QtdPr4,12).
             $sExp_TipPre.
             AlinhaStr(UTF8_DECODE($Row_FatIte['FAT_OBSERV1']),0,50). // Observa��es do pedido
             AlinhaStr(UTF8_DECODE($Row_FatIte['FAT_OBSERV2']),0,50).
             "N".                                                     // Se � opcional (N�o)
             AlinhaStr($s_TxtDescri, 0, 128, ' ').                    // Descri��es dos produtos (32 caracteres cada)
             Str_Zero($nExp_NumImp,2).                                // Codigo do local de impressao
             Str_Zero($aProdutos[$Row_FatIte['FAT_CODITE1']]['ITE_COD_GRU'],3). // Codigo do grupo
             $sFat_NumCom.                                            // N�mero da comanda
             //$sFti_Nro_Mes.                                           // Numero da mesa ou balc�o
             Str_Zero(0+@$Row_FatIte['FAT_SENHA_RETIRAR'],4).         // Senha para retirar
             CHR(13).CHR(10);
	      // ---- OPCIONAIS
          $aMov_Opcional = EXPLODE(";", $Row_FatIte['FAT_OPCINAL'].$Row_FatIte['FAT_LISTACOMBO']); //OPCIONAL
          $nContMat = 0;
          While ( $nContMat<100 ) {
            If (STRLEN(@$aMov_Opcional[$nContMat])==0) { BREAK; }
            $aRegOpc = EXPLODE(",",$aMov_Opcional[$nContMat]);
            //$nOpcQtd = $aRegOpc[1]*1000;
            //
            $nRegQtd = @$Row_FatIte['QTD_REG']+0;        //
            $nRegQtd = ( $nRegQtd<1 ? 1 : $nRegQtd );   // Andr� 06/03/2018, Altera��o:5642
            $nOpcQtd = $aRegOpc[1]*$nRegQtd*1000;       //
            //
	        $sRetornoTexto .=
               "004".                                                       // Tipo de registro
               $sFat_NumLoc.                                                // Local
               AlinhaStr($Row_FatIte['FAT_COD_FUN'],2, 3).                  // C�digo do Operador
               $sFat_PdData.                                                // Data do Pedido
               $sFat_PdHora.                                                // Data do Hora
               // 10/12/13
               // CICERO - Aqui opega o Codigo Livre do Opcional, estava exportando o C�digo INTERNO
               //
               //Str_Zero($aRegOpc[0],3).                       			// Codigo do Produto
               //
               Str_Zero( $aProdutos[$aRegOpc[0]]['ITE_CODIGOL']+0, 4 ).     // Codigo 1 do Produto
               STR_REPEAT('0',04).											// Codigo 2 do Produto
               STR_REPEAT('0',04).											// Codigo 3 do Produto
               STR_REPEAT('0',04).											// Codigo 4 do Produto
               STR_REPEAT('0',12-STRLEN($nOpcQtd)).$nOpcQtd.   // Quantidade dos produtos
               STR_REPEAT('0',12).
               STR_REPEAT('0',12).
               STR_REPEAT('0',12).
               "O".
               STR_REPEAT(' ',50).
               STR_REPEAT(' ',50).
               "S".                                                                 // Se � opcional (Sim)
               AlinhaStr( UTF8_DECODE(@$aProdutos[$aRegOpc[0]+0]['ITE_DESCRIC']), 0, 128, ' ').  // Descri��o
               Str_Zero($nExp_NumImp,2).                                            // Codigo do local de impressao
               Str_Zero($aProdutos[$aRegOpc[0]+0]['ITE_COD_GRU'],3).                // Codigo do grupo
               $sFat_NumCom.                                                        // N�mero da comanda                                                        // N�mero da comanda
               //$sFti_Nro_Mes.                                                     // Numero da mesa ou balc�o
               "0000".
               CHR(13).CHR(10);    		
            //
            $nContMat++;
          }
          $n_Gravar_Item--;
       }
       //
	   //PRODUTOS VINCULADOS 
	   If ($aProdutos[$Row_FatIte['FAT_CODITE1']]['ITE_PROVINVEN']+0) {
		   $bExiste_ProVin = True;
	   }
	   //
       //
	}
	//
	$sNomeCliente = RemoveAcentos($Row_FatGer['FAT_NOMCLIE']);
   $sLetrasAceitasTmp = "abcdefghijlkmnopqsrtuvyxzwABCDEFGHIJLKMNOPQSRTUVYXZW";
	//
   //If ( $nFatItem_Nro_Mes > 0 && substr($sNomeCliente,0,7) != 'MESA - ') {
   If ( $nFatItem_Nro_Mes > 0 ) {
     $sNomeClienteTmp1 = 'MESA - '.$nFatItem_Nro_Mes;
     $sNomeClienteTmp2 = Somente_Numeros( $sNomeClienteTmp1, $sLetrasAceitasTmp );
     $sNomeClienteTmp3 = Somente_Numeros( $sNomeCliente    , $sLetrasAceitasTmp );
     //
     if ( strtoupper($sNomeClienteTmp2) != strtoupper($sNomeClienteTmp3) ) {
       $sNomeCliente =
         $sNomeClienteTmp1.
         ( EMPTY($sNomeCliente) ? '' : ', '.$sNomeCliente ).
         '';
     }
     //
   }
   //
   //
	$sRetornoTexto .=
	    ( $Row_FatGer['FAT_TIP_LOC']==2 ?
		'TEL1='.@$Row_CadCli['CLI_TEL001'].CHR(13).CHR(10).
		'TEL2='.@$Row_CadCli['CLI_TEL002'].CHR(13).CHR(10).
		'TEL3='.@$Row_CadCli['CLI_TEL003'].CHR(13).CHR(10).
		'TEL4='.@$Row_CadCli['CLI_TEL004'].CHR(13).CHR(10).
		'ENDE='.RemoveAcentos(@$Row_CadCli['CLI_ENDLOG']).','.@$Row_CadCli['CLI_ENDNUM']." ".@$Row_CadCli['CLI_ENDCPL'].CHR(13).CHR(10).
		'BAIR='.RemoveAcentos(@$Row_CadCli['CLI_ENDBAI']).CHR(13).CHR(10)
		: "").
		'COMANDA='.$Row_FatGer['FAT_SQCOMAN'].CHR(13).CHR(10).
		'NOME='.$sNomeCliente.CHR(13).CHR(10).
        ( $bReimpressao ?
          'OBS1=** REIMPRESSAO **'.CHR(13).CHR(10)
        :
		  'OBS1='.RemoveAcentos($Row_FatGer['FAT_OBSERV1']).CHR(13).CHR(10)
        ).
		'OBS2='.RemoveAcentos($Row_FatGer['FAT_OBSERV2']).CHR(13).CHR(10).
		'HORA='.DATE('H:i:s').CHR(13).CHR(10).
		'VALOR='.$Row_FatGer['FAT_TOT_REC'].CHR(13).CHR(10).
		( $Row_FatGer['FAT_TIP_LOC']==2 ? 'TIPO=DISK'.CHR(13).CHR(10) : '' ).
		( $Row_FatGer['FAT_TIP_LOC']==1 ? 'TIPO=BALCAO'.CHR(13).CHR(10): '' ).
		'GARCOM='.$nCodFun.'-'.$sNomFun.CHR(13).CHR(10). //disk - balcao
        'QTDE_IMPRESSORAS='.Str_Zero( COUNT($aImpressoras) ,4).CHR(13).CHR(10).
        ( ($Row_FatGer['FAT_QTD_PES']+0)>0 ?
        'QTD_PESSOAS='.($Row_FatGer['FAT_QTD_PES']+0).CHR(13).CHR(10)
        : '' ).
		(  $bExiste_ProVin ? 
		   'PRODUTO_VINCULADO=SIM'.CHR(13).CHR(10) //produtos vinculados
	    :
          ''
        ).
        ( $nNum_Local_Conferencia>0 ?
           'CONFERENCIA=SIM'.CHR(13).CHR(10)
        : '' ).
        '';		
	
    //
    If ( COUNT($aItensNoTicket)==0 ) {
	   Return ['',[-1]];     // ERRO: Sem itens para imprimir ticket de produ��o
    }
	//
	Return [$sRetornoTexto,$aItensNoTicket];
    //
}
//
//
Function Ext_Pag_Parcial($sLst_Matriz) {
   $aLst_Matriz = EXPLODE(';',$sLst_Matriz.';');
   $aPag_Parcial = ARRAY( 'TOTAL'=>0 );
   // $aPag_Parcial['TOTAL']          // Total dos pagamentos
   // $aPag_Parcial[0]..[1]..[2]...   // Pagamentos ($aPagamento)
   ForEach ($aLst_Matriz as $sPagamento) {
      If ( STRLEN($sPagamento)==0 ) { BREAK; }
      $aPagamento = EXPLODE('|',$sPagamento.'|');
	  // $aPagamento[0]   // Valor
	  // $aPagamento[1]   // Codigo interno da tabela cad_modalidade
	  // $aPagamento[2]   // Descri��o da modalidade
	  // $aPagamento[3]   // Nome do cliente
	  // $aPagamento[4]   // Data e Hora do recebimento YYYY-MM-DD HH:MM:SS
	  // $aPagamento[5]   // Codigo do funcion�rio
	  //
	  $aPag_Parcial['TOTAL'] += $aPagamento[0]+0;
	  $aPag_Parcial[] = $aPagamento;
   }
   Return $aPag_Parcial;
}
//
Function Adc_Pag_Parcial($sLst_Matriz, $nValor, $nCodMPG, $sDscMPG, $sNomCli) {
   Global $R_CadFuncionario;
   $sRetorno =
      $sLst_Matriz.
      ($nValor+0) .'|'.
      ($nCodMPG+0).'|'.
      ($sDscMPG)  .'|'.
      ($sNomCli)  .'|'.
	  DATE("Y-m-d H:i:s").'|'.
	  $R_CadFuncionario->FUN_CODIGO.
	  ';';
   Return $sRetorno;
}
//
//
Function ExtXML( $sTextoXML, $sNomeTag ) {
   $sRetorno = ExtrTextoEm($sTextoXML,'<'.$sNomeTag.'>','</'.$sNomeTag.'>');
   Return $sRetorno;
}
//
//
//   *****************************
//
//
// ** Porta TCP **
//
class ClientSocket{
    private $hnd;
    private $host;
    private $ip;
    private $port;
    private $type;     // * Socket type.  (SOCK_DGRAM | SOCK_RAW |    SOCK_RDM | SOCK_SEQPACKET | SOCK_STREAM)    @var int
    private $family;   // * Socket Family (AF_INET|AF_INET6|AF_UNIX)  @var int
    private $protocol; // * Socket protocol (SOL_SOCKET | SOL_TCP | SOL_UDP)   @var int
    private $sBuffer;  // @var string
    private $iReadTimeOut  = 2; // * Read TimeOut (seconds)
    private $iWriteTimeOut = 2;
    public  $bShowErros    = false;
    public  $bExceptions = true;
    public  $bConnected;
    /**
     * Show errors if $bShowErrors is enabled
     * If $bExceptions, throws an exception, otherwise prints a message.
     * If $msg is not empty, show $msg;
     *
     * @param string $msg
     */
    public function error($msg=null){
        if(!$this->bShowErros && !$this->bExceptions) return;
        $errCode = socket_last_error($this->hnd);
        if($errCode!=0){
            //Connection reset by peer
            if($errCode==104)
                $this->bConnected = false;
            $errMsg = socket_strerror($errCode);
            if($this->bExceptions){
                throw new Exception("Socket error. Code: $errCode - Message: $errMsg\n");
                }
            else{
                trigger_error("Socket Error. Code: $errCode - Message: $errMsg");
            }
            socket_clear_error($this->hnd);
        } elseif (strlen($msg)){
            if($this->bExceptions){
                throw new Exception("Socket error." . $msg);
            }
            else{
                trigger_error("$msg\n",E_USER_ERROR);
            }
        }
    }
    /**
     * Constructor
     *
     * @param int $family (AF_INET|AF_INET6|AF_UNIX)
     * @param int $type (SOCK_DGRAM | SOCK_RAW |    SOCK_RDM | SOCK_SEQPACKET | SOCK_STREAM)
     * @param int $protocol (SOL_SOCKET | SOL_TCP | SOL_UDP)
     */
    public function __construct($family=AF_INET,$type=SOCK_STREAM ,$protocol=SOL_TCP){
        $this->hnd         = @socket_create($family,$type,$protocol);
        $this->error();
        $this->family     = $family;
        $this->typ         = $type;
        $this->protocol    = $protocol;
        $this->sBuffer     = false;
        $this->port        = null;
        $this->ip        = null;
        $this->host        = null;
    }
    /**
     * Sets a host and tries to resolve IP address. If Ip is valid adds it to List of ip
     * @param string $sHost
     */
    public function setHost($sHost){
        if(!strlen($sHost)) return;
        $this->host[]    = $sHost;
        $ip                = @gethostbyname($sHost);
        if($ip){
            $this->ip[]    = $ip;
        }else{
            $this->error("Hostname $sHost could not be resolved");
        }
    }
    /**
     * Sets Ip addres
     * @param string $sIp (xxx.xxx.xxx.xxx)
     */
    public function setIp($sIp){
        if(!strlen($sIp)) return;
        if(!ip2long($sIp)){
            $this->error("Invalid IP ADDRESS. IP $sIp");
        }
        $this->ip[]        = $sIp;
        $this->host[]    = @gethostbyaddr($sIp);
    }
    /**
     * Set Host port
     * @param int $iPort
     */
    public function setPort($iPort){
        $this->port     = $iPort;
    }
    /**
     * Open socket connection
     *
     * @param string[optional] $sHost
     * @param int[optional] $iPort
     */
    public function open($sHost=null,$iPort=null){
        if(strlen($sHost)){
            $this->setHost($sHost);
        }
        if(strlen($iPort)){
            $this->setPort($iPort);
        }
        $i = 0;
        do{
            if(@socket_connect($this->hnd,$this->ip[$i],$this->port)){
                $this->bConnected     = true;
            }
        }
        while (!$this->bConnected && $i++<count($this->ip));

        if(!$this->bConnected)
            $this->error();
    }
    /**
     * Connect with  host (open alias)
     *
     * @param string[optional] $sHost
     * @param int[optional] $iPort
     */
    public function connect($sHost=null,$iPort=null){
        return $this->open($sHost,$iPort);
    }
    /**
     * Close socket connection
     *
     */
    public function close(){
        if(!$this->bConnected) return;
        @socket_shutdown($this->hnd,2);
        @socket_close($this->hnd);
    }
    /**
     * Close socket connection (close alias)
     *
     * @return void
     */
    public function disconnect(){
        return $this->close();
    }
    /**
     * Send data
     * If $sBuf is not empty try to send $sBuf, else try with $this->sBuffer
     *
     * @param string $sBuf
     * @param int $iTimeOut
     */
    public function send($sBuf,$iTimeOut=null){
        if(!strlen($this->sBuffer) && !strlen($sBuf)) return;
        if(!$this->bConnected){
            $this->error("Socket error. Cannot send data on a closed socket.");
            return;
        }
        $vWrite = array($this->hnd);
        $WriteTimeOut = strlen($iTimeOut) ? $iTimeOut : $this->iWriteTimeOut;
        while(($rr = @socket_select($vRead = null,$vWrite ,$vExcept = null,$WriteTimeOut))===FALSE);
        if($rr==0) return;
        $tmpBuf        = strlen($sBuf) ? $sBuf : $this->sBuffer;
        $iBufLen    = strlen($tmpBuf);
        $res         = @socket_send($this->hnd,$tmpBuf,$iBufLen,0);
        if ($res === FALSE){
            $this->error();
        } elseif ($res < $iBufLen){
            $tmpBuf     = substr($tmpBuf,$res);
            $this->send($tmpBuf);
        }
    }
    /**
     * Send alias
     *
     * @param string $sBuf
     * @param int $iTimeOut
     */
    public function write($sBuf,$iTimeOut=null){
        return $this->send($sBuf,$iTimeOut);
    }
    /**
     * Read data from socket
     *
     * @param int $iTimeOut
     * @return string
     */
    public function recv($iTimeOut=null){
        if(!$this->bConnected){
            $this->error("Socket error. Cannot read any data on a closed socket.");
            return;
        }
        $vSocket        = array($this->hnd);
        $this->sBuffer     = null;
        $buf            = null;
        $iBufLen        = 4096;
        $ReadTimeOut    = strlen($iTimeOut) ? $iTimeOut : $this->iReadTimeOut;
        try {
            while(($rr = @socket_select($vSocket,$vWrite = null,$vExcept = null,$ReadTimeOut))===FALSE);

            if($rr==0) return;

            $res            = @socket_recv($this->hnd,$buf,$iBufLen,0);
            while($res){
                $this->sBuffer     .=    $buf;
                $buf             = null;

                while(($rr = @socket_select($vSocket,$vWrite = null,$vExcept = null,$ReadTimeOut))===FALSE);
                if($rr==0) break;

                $res             = @socket_recv($this->hnd,$buf,$iBufLen,0);
            }
        }catch (Exception $e){
            $this->error();
        }

        return $this->sBuffer;
    }
    /**
     * Recv alias
     *
     * @param int $iTimeOut
     * @return string
     */
    public function read($iTimeOut=null){
        return $this->recv($iTimeOut);
    }
    /**
     * Send data and wait response
     *
     * @param string $sBuf
     * @return string
     */
    public function sendandrecive($sBuf){
        $this->send($sBuf);
        return $this->recv();
    }
}
// VERIFICA PRAZO DE USO DO SISTEMA
//Retorna a quantidade de dias que resta de uso
Function V_Resto($nOpcao) {
  $sChaveS = "(- SIMSOFT -) :: (-SOFTWARE-)";
  
  $_Resto = SQLVarConfig('CFG_T_D_I');
  
  If (STRLEN($_Resto)>10) {
    $_Resto = LibSiS_DEC($_Resto, $sChaveS);
    $_Resto = DATE("Y-m-d", STRTOTIME($_Resto));
	 
  }
  
  $_Dta_Hoj = DATE("Y-m-d");
  //pega a diferen�a em dias de duas datas
  //$_Dif = s_datediff( "d", $_Dta_Hoj,$_Resto);
  //$_Dif = s_datediff( "d", $_Dta_Hoj,$_Resto);
  $_Dif = diasDeDiferenca($_Dta_Hoj,$_Resto);
  $_Resto = $_Dif;
  $_Prazo = SQLVarConfig('CFG_T_D_U');
  
  If (STRLEN($_Prazo)>10) {
     $_Prazo = LibSiS_DEC($_Prazo, $sChaveS);
   }
  If ( $nOpcao == 1 ) {
    
     
	  
	  $_Prazo = intval($_Prazo);
	  $_Resto = intval($_Resto);
	  $_Resto = ($_Prazo-($_Resto*-1));
	  
	 
	  
	  If ($_Resto<0) {
	     $_Resto = 0;
	  }
     
	  Return($_Resto); 
  } Else {
   Return(STR($_Prazo - $_Resto,10,0)); 
  }
  
}
//Gera Chave para Internet
Function G_CHAVEINT( $_Cod_Cli,$_Dta_Hoj,$_Dta_Ven,$_Tam_Cha,$_Opcao,$_Cha_Cli,$_Ret_Dge ) {
  $aDta_Cop = array( "1"=>array( "0","1","2","3","4","5","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","X","Z","W","Y"),
                     "2"=>array("00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"),
                     "3"=>array("2000","2001","2002","2003","2004","2005","2006","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025","2026","2027","2028","2029","2030","2031"));
  
  $aCri_Cli = array( "1"=>array("0","1","2","3","4","5","6","7","8","9"),
		               "2"=>array("Y","W","Z","X","V","U","T","S","R","Q"));
  $sCha_Loc = '';
  $dDta_Ven = Date( 'd/m/Y' , STRTOTIME(""));
  $dDta_Ger = Date( 'd/m/Y' , STRTOTIME(""));
  $nVal_Dta = 0;
  $nVal_Cha = 0;
  $nDia_Lib = 0;
  $sCha_Gua = '';
  $sChaveS  = "(- SIMSOFT -) :: (-SOFTWARE-)";
  $sTmp_Uso = '';
  $sTmp_Ins = '';
  $sTmp_Win = '';
  $sTmp_Gua = ''; 
  //
  If(STRLEN($_Cha_Cli)<=0) {
    Return 'D';
  }
  //Global  $bDta_Atr, $bCha_Exp, $bResult;   
  If (STRLEN( $_Cha_Cli )>0) {
     $sCha_Gua = $_Cha_Cli;
  } Else{
    $sCha_Gua =  '';
  }					 
  // Gera��o da Chave
  // opcao=1 nao vai ter Gerar Chave
  
  //DESENCRYPTOGRAFA CHAVE          
  
  $sCha_Loc = 
     SUBSTR( $_Cha_Cli, 4, 1 ).
     SUBSTR( $_Cha_Cli, 2, 1 ).
     SUBSTR( $_Cha_Cli, 0, 1 ).
     SUBSTR( $_Cha_Cli, 5, 1 ).
     SUBSTR( $_Cha_Cli, 3, 1 ).
     SUBSTR( $_Cha_Cli, 1, 1 ).
	  SUBSTR( $_Cha_Cli, 6, 6 ).
	  '';
  $_Cha_Cli = $sCha_Loc;
  $sCha_Loc = '';
  
  $len = STRLEN(TRIM($_Cha_Cli));
  For ($i=0;$i<$len;$i++) {
 	  //Pega Dia Mes
     If( $i<=1 OR ( $i>=3 AND $i<=4) ) {
		 For ($y = 0; $y < count($aDta_Cop[1]); $y++) {
			If (SUBSTR($_Cha_Cli,$i,1) == $aDta_Cop[1][$y]) {
           	$sCha_Loc.= $aDta_Cop[2][$y];
				If ($i<=1) {
               $nVal_Cha+= Somente_Numeros( $aDta_Cop[2][$y]); 
            }				
				break;
			}
  
       }
      // Pega o Ano
     } ElseIf( $i==2 OR $i==5 ) {
	    For ($y = 0; $y < count($aDta_Cop[1]); $y++) {
	      If (SUBSTR($_Cha_Cli,$i,1) == $aDta_Cop[1][$y]) {
				$sCha_Loc.= $aDta_Cop[3][$y];
				If ($i==2) {
         	  $nVal_Cha+= Somente_Numeros(SUBSTR( $aDta_Cop[2][$y],-2)); 
            }				
				break;
			}
	  
	    }
	  // Pega o Codigo do Cliente
	  } Else {
	    For ($y = 0; $y < count($aCri_Cli[1]); $y++) {
			If (SUBSTR($_Cha_Cli,$i,1) == $aCri_Cli[2][$y]) {
		      $sCha_Loc.= $aCri_Cli[1][$y];
		   	break;
			}
	    }
	  
	  }
    
   }
  
   //Verifica se a chave pertence ao cliente
	$nVal_Dta = Somente_Numeros(TRIM(SUBSTR( $sCha_Loc,16,06)))/Somente_Numeros(TRIM($_Cod_Cli)); 					 
	$nVal_Dta -= $nVal_Cha;
	
	// Chave pertence ao cliente 
	If(!($nVal_Dta==0)){
	  // mensagem "Esta chave n�o Pertence a este Cliente. Verifique'. 
	  Return 'A';
	}
	//Verifica a Data de Validade da Chave
	
	$dDta_Ger = SUBSTR($sCha_Loc,0,02).'/'.SUBSTR($sCha_Loc,2,02).'/'.SUBSTR($sCha_Loc,4,04);
   $dDta_Ger = converteData($dDta_Ger);
	   
	$dDta_Ven = SUBSTR($sCha_Loc,8,02).'/'.SUBSTR($sCha_Loc,10,02).'/'.SUBSTR($sCha_Loc,12,04);
	$dDta_Ven = converteData($dDta_Ven);
	
	If ($_Opcao==3) { 
	   $_Ret_Dge = $dDta_Ger;
	   Return($_Ret_Dge);
	} 
	
	//$bResult = False;
	If (!($_Opcao==3)) { 
	  //Verifica se a Data do computador foi atrasada
	  If( Date("Y-m-d")<$dDta_Ger) {
	  // mensagem "Seu computador esta com a Data Atrazada. A libera��o da chave n�o ser� permitida'. 
	     Return 'B';
	  }
	  
	  //Verifica se a Chave Expirou
	  If(($dDta_Ven<Date("Y-m-d"))){
	    // mensagem "Chave ja expirou'. 
	     Return 'C';
	  }
	  $dDia_Hoj = Date("Y-m-d");
	  
	  //$nDia_Lib = ($dDta_Ven-Date("Y-m-d",STRTOTIME($nDia_Hoj)));
	  //$nDia_Lib = s_datediff( "d",$dDia_Hoj,$dDta_Ven );
	  $nDia_Lib = diasDeDiferenca($dDia_Hoj,$dDta_Ven);
		//
		
		///aqui na hora de gravar verificar  
	  $sTmp_Uso = LibSiS_ENC( $nDia_Lib,$sChaveS);
	  $sTmp_Ins = LibSiS_ENC( Date("Y-m-d"),$sChaveS);
	  
	  SQLVarConfigG('CFG_T_D_U',$sTmp_Uso);
	  SQLVarConfigG('CFG_T_D_I',$sTmp_Ins);
	  $sTmp_Gua = LibSiS_ENC( $sCha_Gua ,$sChaveS);
	  SQLVarConfigG('CFG_CHVINT',$sTmp_Gua);
	    // mensagem "sistema liberado com sucesso'. 
	  Return $sCha_Gua;
	}
	
	
}



Function Instal_Pro($nOpcao) {
  Global $sPar_Imp;
  $bDia_Par = '';
  $nInt_Nor = 0;
  $bPod_Tra = True; 
  If ($nOpcao==NULL){
     $nOpcao=1;
  }
  $sPar_Imp = '';
  $dDta_Hoj = Date( "Y-m-d"); 
  If ( !($nOpcao==3)){
    //sabado e domingo nao pode travar
    $DiaUso = '';
  
    If (DATE("w",STRTOTIME($dDta_Hoj)+0)== 6 OR DATE("w",STRTOTIME($dDta_Hoj)+0)== 0){
     $DiaUso = SQLVarConfig('CFG_T_D_U');
	  If ( STRLEN( $DiaUso)>0 ){
        $bPod_Tra = False;
	  }
    }
    
	 //se for antes das 09:00 n�o trava  
    $sFormat = '%d/%m/%Y %H:%M:%S';
    $_Hora = STRFTIME($sFormat);
    $_Hora = SUBSTR($_Hora,11,02);
    
	 
    If ($_Hora<'09' OR $_Hora>'22'){;
     $bPod_Tra = False;
    } 
    // se n�o for para travar
    If(!($bPod_Tra)) {
	   Return False;
	 }
  }
  // verifica par ou impar
  $nDta_Hoj = (DATE("w",STRTOTIME($dDta_Hoj))+0);
  $nDta_Hoj = Str_Zero($nDta_Hoj,2);
  If ($nDta_Hoj=="01" OR $nDta_Hoj=="03" OR $nDta_Hoj=="05" OR $nDta_Hoj=="07" OR $nDta_Hoj=="09") {
    $bDia_Par = True;
  } Else {
    $bDia_Par = False;
  }
  $sPar_Imp = ($bDia_Par ? '01':'02');
  
  Return $bPod_Tra;
}

function converteData($data){
  return (preg_match('/\//',$data)) ? implode('-', array_reverse(explode('/', $data))) : implode('/', array_reverse(explode('-', $data)));
}

function s_datediff( $str_interval, $dt_menor, $dt_maior, $relative=false){

       if( is_string( $dt_menor)) $dt_menor = date_create( $dt_menor);
       if( is_string( $dt_maior)) $dt_maior = date_create( $dt_maior);

       $diff = date_diff( $dt_menor, $dt_maior, ! $relative);
       
       switch( $str_interval){
           case "y": 
               $total = $diff->y + $diff->m / 12 + $diff->d / 365.25; break;
           case "m":
               $total= $diff->y * 12 + $diff->m + $diff->d/30 + $diff->h / 24;
               break;
           case "d":
               $total = $diff->y * 365.25 + $diff->m * 30 + $diff->d + $diff->h/24 + $diff->i / 60;
               break;
           case "h": 
               $total = ($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h + $diff->i/60;
               break;
           case "i": 
               $total = (($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i + $diff->s/60;
               break;
           case "s": 
               $total = ((($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i)*60 + $diff->s;
               break;
          }
       if( $diff->invert)
               return -1 * $total;
       else    return $total;
   }

Function CRIP_SENHA( $_Opc_Cli,$_Txt_Sen,$_Qtd_Pra,$_Dia_Par) {
  $_sRet_Cri = '';
  $_sPra_Cri = '';
  $_sNum_Mes = '';
  $_dDta_Cai = DATE( "d-m-Y");
   
  If($_Opc_Cli<=2) {
    $_dDta_Cai = DATE( "d-m-Y");
  } Else {
    $_dDta_Cai = DATE( "d-m-Y");
  }  
  
  $_sNum_Ano =  DATE( "Y",STRTOTIME($_dDta_Cai ));
  $_sNum_MMe =  DATE( "m",STRTOTIME($_dDta_Cai ));
  $_sNum_Dia =  DATE( "d",STRTOTIME($_dDta_Cai ));
  
  $_sNum_Mes = (($_sNum_Ano +  $_sNum_MMe + $_sNum_Dia)+0);
  $_sNum_Mes = Str_Zero($_sNum_Mes,4).$_sNum_Dia;
  
  $_sRet_Cri = CRIP_TXT( 1,$_sNum_Mes); 
  
  If($_Opc_Cli==2) {
   
	$_Txt_Sen = CRIP_TXT( 2,$_Txt_Sen);
  
	 If ($_Dia_Par) {
		If(SUBSTR($_Txt_Sen,0,6)== $_sNum_Mes){
		  $_sRet_Cri = SUBSTR($_Txt_Sen,-4);
		
		} Else {
		  $_sRet_Cri = '';
		}
	 } Else {
	   If(SUBSTR($_Txt_Sen,-6)== $_sNum_Mes){
	     $_sRet_Cri = SUBSTR($_Txt_Sen,0,4);
	   } Else {
		  $_sRet_Cri = '';
		}
	
	 }
  
  }
  
  //verifica se nao cai dia sabado ou domingo
  If (STRLEN($_sRet_Cri)>0){
     $_dDta_Cai = Date('d-m-Y', STRTOTIME("+".$_sRet_Cri." days",STRTOTIME($_dDta_Cai)));
     $_dDta_Cai = DATE("w",STRTOTIME($_dDta_Cai)+0);
	  
	  If($_dDta_Cai==6 OR $_dDta_Cai==0 ) {
	    $_sRet_Cri = Str_Zero((($_sRet_Cri + 2)+0),STRLEN($_sRet_Cri));
	  }
  
  }  
  
  RETURN $_sRet_Cri;
}

Function CRIP_TXT( $_Opc_Cri,$_Txt_Cri) {
 $_Cha_Cri = 'TUDOVAIBEM';
 $_Txt_Num = '0123456789';
 $_Txt_Ret = '';
 $s_tmpa = '';
 $s_tmpb = '';
 If($_Opc_Cri==1 ) {
 	For ($y = 0; $y < STRLEN($_Txt_Cri); $y++) {
		$s_tmpa = SUBSTR($_Txt_Cri,$y,1 );
		$s_tmpa = @$_Cha_Cri[$s_tmpa+0];
		$_Txt_Ret .= $s_tmpa;
	
   }
   
	Return $_Txt_Ret;
 }
 
 If($_Opc_Cri==2 ) {
   For ($y = 0; $y < STRLEN($_Txt_Cri); $y++) {
      $s_tmpb = STRPOS($_Cha_Cri, SUBSTR($_Txt_Cri,$y,1 ));
	   $s_tmpb = @$_Txt_Num[$s_tmpb+0];
		$_Txt_Ret .= $s_tmpb;
	}

 Return $_Txt_Ret;
 
 }
 
}

Function SEN_CLIINT( $_Cod_Cri ) {
 //$aCri_Cli = array( "1"=>array("0","1","2","3","4","5","6","7","8","9"),
 //                   "2"=>array("J","I","H","G","F","E","D","C","B","A"));
 $aCri_Cli = array("J","I","H","G","F","E","D","C","B","A");
 
 $_Cod_Tmp = Str_Zero( $_Cod_Cri*3,5); 
 $_Sen_Cli = '';

 For ($y = 0; $y < STRLEN($_Cod_Tmp); $y++) {
   $s_tmp = SUBSTR($_Cod_Tmp,$y,1 );
	$s_tmp = @$aCri_Cli[$s_tmp+0];
	$_Sen_Cli .= $s_tmp;
	
 }
 
 
 Return $_Sen_Cli;
}

//
function diasDeDiferenca($dataInicial,$dataFinal) {
   $time_inicial = strtotime($dataInicial);
   $time_final = strtotime($dataFinal);

   // Calcula a diferen�a de segundos entre as duas datas:
   $diferenca = $time_final - $time_inicial; 
   $dias = (int)floor($diferenca / (60 * 60 * 24));
	
	
   return $dias;
}
//

//
// Comenta uma linha e acrescenta outra linha
Function AlteraConfigInc($sCntLinha, $sNovaLinha, $sNaoPodeConter="", $sLocalArq="") {
   If ( ! FILE_EXISTS($sLocalArq) ) {
      Return False;
   }
   //$sConteudo = FILE_GET_CONTENTS($sLocalArq);
   If ( ! $hArq = FOPEN($sLocalArq, "r") ) {
      ECHO "AlteraConfigInc - Erro: N�o foi poss�vel abrir o arquivo 'config.inc'.";
      EXIT;
      Return False;
   }
   $sConteudo = FREAD($hArq, FILESIZE($sLocalArq));
   FCLOSE($hArq);
   UNLINK( $sLocalArq );
   //
   $sConteudo = STR_REPLACE(CHR(10) , '', $sConteudo );
   $aLinhas_C = EXPLODE(CHR(13),$sConteudo);
   //
   $s_Retorno = "";
   $bEncontro = False;
   ForEach( $aLinhas_C As $s_Linha_C ) {
      If ( SUBSTR(STRTOUPPER($s_Linha_C),0,5)=="<?PHP" OR SUBSTR(STRTOUPPER($s_Linha_C),0,2)=="?>" ) {
	     //
      } ElseIf ( EMPTY($s_Linha_C) ) {
	     //$s_Retorno .= '//'.CHR(13);
      } ElseIf ( STRPOS(" ".STRTOUPPER($s_Linha_C), STRTOUPPER($sCntLinha))>0 && SUBSTR($s_Linha_C,0,2)<>"//" ) {
	     $bEncontro = True;
         $s_Retorno .=
            '//'.$s_Linha_C.'   ** Alterado em '.DATE("d/m/Y H:i:s").CHR(13).CHR(10).
            $sNovaLinha.' //  ** Inserido em '.DATE("d/m/Y H:i:s").CHR(13).CHR(10);
	     //
	  } ElseIf ( ! EMPTY($sNaoPodeConter) && (STRPOS(" ".STRTOUPPER($s_Linha_C), STRTOUPPER($sNaoPodeConter))>0) ) {
	     $bEncontro = True;
	     $s_Retorno .= $s_Linha_C.CHR(13).CHR(10);
	  } Else {
	     $s_Retorno .= $s_Linha_C.CHR(13).CHR(10);
		 //
	  }
   }
   If ( ! $bEncontro ) {
      If ( STRPOS(" ".STRTOUPPER($s_Retorno), STRTOUPPER($sNovaLinha))==0 ) {
         $s_Retorno .= CHR(13).CHR(10).$sNovaLinha.' //  ** Inserido em '.DATE("d/m/Y H:i:s").CHR(13).CHR(10);
	  }
   }
   //
   If ( ! EMPTY($s_Retorno) ) {
      $s_Retorno = "<?php".CHR(13).CHR(10).$s_Retorno.CHR(13).CHR(10)."?>";
      $hArq = FOPEN($sLocalArq, "a");
	  FWRITE($hArq, $s_Retorno);
	  FCLOSE($hArq);
	  Return $bEncontro;
   }
   Return False;
   //
}
//


// FUN��O 
function checaIP($qual,$inicio,$final){
	$sub = explode(".",$qual);
	//rotinas para verificar se � um ip v�lido...
	
	if(count($sub) != 4){
		return array(false,"IP Inv�lido");
	}
	for($i = 0; $i < count($sub); $i++){
		if($sub[$i] < 0 || $sub[$i] > 255 || !is_numeric($sub[$i])){
			return array(false,"IP Inv�lido");
		}
	}
	$ini = explode(".",$inicio);
	//rotinas para verificar se � um ip v�lido...
	if(count($ini) != 4){
		return array(false,"Faixa inicial inv�lida");
	}
	for($i = 0; $i < count($ini); $i++){
		if($ini[$i] < 0 || $ini[$i] > 255 || !is_numeric($ini[$i])){
			return array(false,"Faixa inicial inv�lida");
		}
	}
	$fim = explode(".",$final);
	//rotinas para verificar se � um ip v�lido...
	if(count($fim) != 4){
		return array(false,"Faixa final inv�lida");
	}
	for($i = 0; $i < count($fim); $i++){
		if($fim[$i] < 0 || $fim[$i] > 255 || !is_numeric($fim[$i])){
			return array(false,"Faixa inicial inv�lida");
		}
	}
	// verificar se as faixas estao corretas
	if($ini[0]> $fim[0]){
		return array(false,"Faixa inicial deve ser menor que faixa final");
	}
	if($ini[1]> $fim[1] && $ini[0] == $fim[0]){
		return array(false,"Faixa inicial deve ser menor que faixa final");
	}
	if($ini[2]> $fim[2] && $ini[0] == $fim[0] && $ini[1] == $fim[1]){
		return array(false,"Faixa inicial deve ser menor que faixa final");
	}
	
	if($ini[3]> $fim[3] && $ini[0] == $fim[0] && $ini[1] == $fim[1] && $ini[2] == $fim[2]){
		return array(false,"Faixa inicial deve ser menor que faixa final");
	}
	
	//enfim verifica se o ip passado est� dentro desta faixa...
	if($sub[0] < $ini[0] || $sub[0] > $fim[0]){
		return array(false,"IP fora da faixa");
	}
	if($sub[1] < $ini[1] || $sub[1] > $fim[1]){
		if($sub[0] >! $fim[0] || $sub[0] <! $ini[0]){
			return array(false,"IP Fora da Faixa");
		}
	}
	if($sub[2] < $ini[2] || $sub[2] > $fim[2]){
		if($sub[1] >! $fim[1] || $sub[1] <! $ini[1]){
			if($sub[0] >! $fim[0] || $sub[0] <! $ini[0]){
				return array(false,"FaixaIP Fora da Faixa");
			}
		}
	}
	
	if($sub[3] < $ini[3] || $sub[3] > $fim[3]){
		if($sub[2] >! $fim[2] || $sub[2] <! $ini[2]){
			if($sub[1] >! $fim[1] || $sub[1] <! $ini[1]){
				if($sub[0] >! $fim[0] || $sub[0] <! $ini[0]){
					return array(false,"IP Fora da Faixa");
				}
			}
		}
	}
	return array(true);
}
//
function primeiraLetraMaiuscula($nome){
    $nome_array = explode(" ", $nome);
    $count = 0;
    $indice = count($nome_array);
 
    while ($count < $indice) {
        $preposi��o = $nome_array[$count];
        if ($preposi��o == "da" or $preposi��o == "de" or $preposi��o == "do" or $preposi��o == "das" or $preposi��o == "dos"){
            $nome_array[$count] = $nome_array[$count];
        }else{
            $nome_array[$count] = ucfirst(strtolower($nome_array[$count]));
        }
        $count += 1;
    }
    $resultado = implode(" ",$nome_array);
    return $resultado;
} 

// Fun��o que separa por �ndice somente os que vai na matriz de retorno
Function MatrizSeperaSomente( $aIndices=ARRAY(), $aOrigem=ARRAY() ) {
   $aRetorno = ARRAY();
   ForEach ( $aIndices As $vIndice ) {
	  If ( ISSET($aOrigem[$vIndice]) ) {
		 $aRetorno[$vIndice] = $aOrigem[$vIndice];
	  }
   }
   RETURN $aRetorno;
}

//
// *************************************************************
// *                                                           *
// *    FUNCOES DE MANIPULACAO PADRAO EM BANCO DE DADOS SQL    *
// *                                                           *
// *************************************************************
//
// Puxar registros da tabela FAT_GERAL pedente
Function GetSQL_Fat_Geral_Pendente($nFat_Tip_Loc=0, $bInutilizaveis=False) {
   $aRetorno = ARRAY();
   $sData_Trabalho = SQLVarConfig('DATA_DE_TRABALHO');
   //
   $Rows = Null;
   if ( $nFat_Tip_Loc==0 && (!$bInutilizaveis) ) {
      //
      $sSQLQuery = "SELECT * FROM view_comandas_abertas;";
      $Rows = MYSQL_QUERY($sSQLQuery);
      //
   }
   // Puxar fat_geral
   if ( $Rows == Null ) {
      $sSQLQuery =
         "SELECT ".
	         "FAT_CODIGOI, FAT_NUM_MES, FAT_DAT_FIM, FAT_RCFORMA, FAT_CANCELA, FAT_TOT_REC, FAT_LSTRPCL, FAT_NOMCLIE ".
         "FROM fat_geral ".
	      "WHERE ".
	         "(FAT_TIP_LOC=".$nFat_Tip_Loc.( $bInutilizaveis ? " OR FAT_TIP_LOC=3" : "").") ".
	   	   ( $bInutilizaveis ? "" : "AND FAT_CANCELA=0 AND FAT_RCFORMA=0").
	      ";";
      $Rows = MYSQL_QUERY($sSQLQuery);
   }
   //
   While ( $Row = MYSQL_FETCH_ARRAY($Rows, MYSQL_ASSOC) ) {
     $nFat_Cancelado = ('0'.@$Row['FAT_CANCELA'])+0;
     $nFat_RecbForma = ('0'.@$Row['FAT_RCFORMA'])+0;
     $nFat_Num_Local = ('0'.@$Row['FAT_NUM_MES'])+0;
	  $nEstado = 0;
     if ( $nFat_Num_Local<1 ) {  continue;  }
      If       ( $nFat_Cancelado==0 AND ConvertDtHrSTR($Row['FAT_DAT_FIM'])==0 AND $nFat_RecbForma==0 ) {
	      $nEstado = 1;     // Local ocupado
      } ElseIf ( $nFat_Cancelado==0 AND ConvertDtHrSTR($Row['FAT_DAT_FIM'])> 0 AND $nFat_RecbForma==0 ) {
	      $nEstado = 2;     // Local aguardando recebimento
      } Else {
	      // Alteracao 5124 // $nEstado = 3;     // Local inutilizavel
	  }
      $nIndice = $Row['FAT_CODIGOI'];
      // Tipo do local (0=Mesa, 1=Balcao, 2=Entrega, 3=Comanda)
      If ( $nFat_Tip_Loc==0 ) {          // Locais
         $nIndice = $Row['FAT_NUM_MES'];
      } ElseIf ( $nFat_Tip_Loc==3 ) {    // Comanda
         $nIndice = $Row['FAT_SQCOMAN'];
      }
      $aRetorno[$nIndice] =
	     [ 'CODIGO_INTERNO' => $Row['FAT_CODIGOI'],
		    'CODIGO_ESTADO'  => $nEstado           ,
		    'VALOR_TOTAL_RC' => $Row['FAT_TOT_REC']
        ];
      if ( $nFat_Tip_Loc==1 ) {          // Balcão
         $aRetorno[$nIndice]['NOME_CLIENTE'] = @$Row['FAT_NOMCLIE'];
      }
   }
   //
   If ( $nFat_Tip_Loc==0 OR $nFat_Tip_Loc==3 ) {
     $sSQLQuery = "SELECT MES_NUMERO, MES_DESCRI FROM cad_bloq_mesa;";
     If ( $Rows = MYSQL_QUERY($sSQLQuery) ) {
       While ( $Row = MYSQL_FETCH_ARRAY($Rows, MYSQL_ASSOC) ) {
         $nIndice = (@$Row['MES_NUMERO']+0);
         $aRetorno[$nIndice] =
           [ 'CODIGO_INTERNO' => 0,
             'CODIGO_ESTADO'  => 3,
             'VALOR_TOTAL_RC' => 0,
             'MOTIVO_BLQ'     => (@$Row['MES_DESCRI'].'')
           ];
       }
     }
   }
   //
   Return $aRetorno;
}
//
// Puxar dados das tabelas FAT_GERAL e FAT_ITEM
Function GetSQL_Fat_Geral($sSQLWhere,  $bPuxarItens=True, $bPuxarRegProdutos=True) {
   $aRetorno = ARRAY();
   //
   // Puxar fat_geral
   $sSQLQuery = "SELECT * FROM fat_geral WHERE ".$sSQLWhere.";";
   $Row = MYSQL_QUERY($sSQLQuery);
   If ( $Row = MYSQL_FETCH_ARRAY($Row, MYSQL_ASSOC) ) {
      $aRetorno[0] = $Row;
   } Else {
      Return ARRAY();
   }
   If ( $bPuxarItens ) {
      $aListaItens = ARRAY();
      $sSQLQuery =
	     "SELECT fat_item.*, ".
		         ( $bPuxarRegProdutos ?
		         "cad1.ITE_DESCRIC AS ITE_DESCRIC1, ".
				 "cad1.ITE_SIG_UNIDADE, ".
		         "cad1.ITE_CODIGOL AS ITE_CODIGOL1, ".
		         "cad2.ITE_DESCRIC AS ITE_DESCRIC2, ".
		         "cad2.ITE_CODIGOL AS ITE_CODIGOL2, ".
		         "cad3.ITE_DESCRIC AS ITE_DESCRIC3, ".
		         "cad3.ITE_CODIGOL AS ITE_CODIGOL3, ".
		         "cad4.ITE_DESCRIC AS ITE_DESCRIC4, ".
		         "cad4.ITE_CODIGOL AS ITE_CODIGOL4, "
				 : "").
				 "func.FUN_NOMECP ".
		 "FROM fat_item ".
         ( $bPuxarRegProdutos ?
         "LEFT JOIN cad_produto As cad1 ON FAT_CODITE1=cad1.ITE_CODIGOI ".
         "LEFT JOIN cad_produto As cad2 ON FAT_CODITE2=cad2.ITE_CODIGOI ".
         "LEFT JOIN cad_produto As cad3 ON FAT_CODITE3=cad3.ITE_CODIGOI ".
         "LEFT JOIN cad_produto As cad4 ON FAT_CODITE4=cad4.ITE_CODIGOI "
		 : "").
         "LEFT JOIN cad_funcionario As func ON FAT_COD_FUN=FUN_CODIGO ".
		 "WHERE FAT_CFATGER=".$aRetorno[0]['FAT_CODIGOI'].";";
      $Rows = MYSQL_QUERY($sSQLQuery);
      While ( $Row = MYSQL_FETCH_ARRAY($Rows) ) {
	    $aItem = $Row;
		//
	    $sIte_Descricao = '';
	    For ($nCnt = 1; $nCnt<=4; $nCnt++) {
		    $s_TmpDescri = @$aItem['ITE_DESCRIC'.$nCnt];
			UNSET( $aItem['ITE_DESCRIC'.$nCnt] );
	        If ( EMPTY($s_TmpDescri) ) { CONTINUE; }
	        If ( STRLEN($sIte_Descricao)>0 ) { $sIte_Descricao .= ', '; }
            $sIte_Descricao .= $s_TmpDescri;
	    }
		$aItem['ITE_DESCRIC'] = $sIte_Descricao;
		//
	    $aListaItens[$aItem['FAT_CODIGOI']+2000] = $aItem;
      }
      $aRetorno[1] = $aListaItens;
   }
   Return $aRetorno;
}
//
// Faz todo o calculo de custo de ficha de produ��o apartir de um produto
Function Calcular_Custo_Ficha_Producao( $nIte_CodigoI_Parm ) {
   //
   $aIte_CodigoI = ARRAY($nIte_CodigoI_Parm);
   While ( True ) {
      //
	  If ( COUNT($aIte_CodigoI)>0 ) {
	     $nIte_CodigoI = 0;
		 $aItens = ARRAY();
	     ForEach ( $aIte_CodigoI As $aItem ) {
		    If ( $nIte_CodigoI==0 ) {
	           $nIte_CodigoI = $aItem;
			} Else {
		       $aItens[] = $nItem;
			}
	     }
		 $aIte_CodigoI = $aItens;
	  } Else {
	     Break;
	  }
	  //
      $sSQLQuery =
         "SELECT pro.ITE_CODIGOI,".
	            "pro.ITE_PRE_CUSTO_N,".
	            "pro.ITE_PRE_CUSTO_M,".
	            "pro.ITE_PRE_CUS_001,".
	            "pro.ITE_PRE_CUS_002,".
	            "pro.ITE_PRE_CUS_003,".
	            "pro.ITE_PRE_CUS_004,".
	            "pro.ITE_PRE_CUSTO_E,".
	            "cls.CLS_HAB_FCP, cls.CLS_INC_FCP ".
         "FROM      cad_produto               AS pro ".
         "LEFT JOIN cad_produto_classificacao AS cls ON CLS_IDN_CLS=ITE_COD_CLS ".
         "WHERE ITE_CODIGOI=".$nIte_CodigoI.";";
      $aItem_Atual = MYSQL_QUERY( $sSQLQuery ) Or Die( $sSQLQuery.'<br>'.MYSQL_ERROR() );
      If ( ! $aItem_Atual = MYSQL_FETCH_ARRAY($aItem_Atual, MYSQL_ASSOC) ) {
         Return False;
      }
      //
      If ( $aItem_Atual['CLS_HAB_FCP'] ) {        // Permite ter ficha t�cnica
         $aItem_Atual['ITE_PRE_CUSTO_N'] = 0;
         $aItem_Atual['ITE_PRE_CUSTO_M'] = 0;
         $aItem_Atual['ITE_PRE_CUS_001'] = 0;
         $aItem_Atual['ITE_PRE_CUS_002'] = 0;
         $aItem_Atual['ITE_PRE_CUS_003'] = 0;
         $aItem_Atual['ITE_PRE_CUS_004'] = 0;
         $sSQLQuery =
            "SELECT fpi.*, pro.ITE_PRE_CUSTO_N ".
	   	    "FROM cad_ficha_producao_itens AS fpi ".
            "LEFT JOIN cad_produto         AS pro ON ITE_CODIGOI=FPI_COD_ITE ".
	   	 "WHERE FPI_COD_FPG=".$aItem_Atual['ITE_CODIGOI'].";";
         $aItens = MYSQL_QUERY( $sSQLQuery ) Or Die( $sSQLQuery.'<br>'.MYSQL_ERROR() );
         While ( $aItem = MYSQL_FETCH_ARRAY($aItens, MYSQL_ASSOC) ) {
            $nCusto_Item = @$aItem['ITE_PRE_CUSTO_N']+0;
            $aItem_Atual['ITE_PRE_CUSTO_N'] += (@$aItem['FPI_QUANT_N']+0) * $nCusto_Item;
            $aItem_Atual['ITE_PRE_CUSTO_M'] += (@$aItem['FPI_QUANT_M']+0) * $nCusto_Item;
            $aItem_Atual['ITE_PRE_CUS_001'] += (@$aItem['FPI_QUANT_1']+0) * $nCusto_Item;
            $aItem_Atual['ITE_PRE_CUS_002'] += (@$aItem['FPI_QUANT_2']+0) * $nCusto_Item;
            $aItem_Atual['ITE_PRE_CUS_003'] += (@$aItem['FPI_QUANT_3']+0) * $nCusto_Item;
            $aItem_Atual['ITE_PRE_CUS_004'] += (@$aItem['FPI_QUANT_4']+0) * $nCusto_Item;
	     }
	     // Atualizar dados
         $sSQLQuery = 
            "UPDATE cad_produto SET ".
	          "ITE_PRE_CUSTO_N=".$aItem_Atual['ITE_PRE_CUSTO_N'].",".
	          "ITE_PRE_CUSTO_M=".$aItem_Atual['ITE_PRE_CUSTO_M'].",".
	          "ITE_PRE_CUS_001=".$aItem_Atual['ITE_PRE_CUS_001'].",".
	          "ITE_PRE_CUS_002=".$aItem_Atual['ITE_PRE_CUS_002'].",".
	          "ITE_PRE_CUS_003=".$aItem_Atual['ITE_PRE_CUS_003'].",".
	          "ITE_PRE_CUS_004=".$aItem_Atual['ITE_PRE_CUS_004']." ".
            "WHERE ITE_CODIGOI=".$aItem_Atual['ITE_CODIGOI'].";";
         MYSQL_QUERY($sSQLQuery) Or Die($sSQLQuery.'<br>'.MYSQL_ERROR());
      }
      //
      If ( $aItem_Atual['CLS_INC_FCP'] ) {        // Permite ser inclu�do em uma ficha t�cnica
	     $aItemAdc = ARRAY();
         $sSQLQuery =
            "SELECT * ".
	   	    "FROM cad_ficha_producao_itens ".
	   	 "WHERE FPI_COD_ITE=".$aItem_Atual['ITE_CODIGOI'].";";
         $aItens = MYSQL_QUERY( $sSQLQuery ) Or Die( $sSQLQuery.'<br>'.MYSQL_ERROR() );
         While ( $aItem = MYSQL_FETCH_ARRAY($aItens, MYSQL_ASSOC) ) {
            $aItemAdc[$aItem['FPI_COD_FPG']] = $aItem['FPI_COD_FPG'];
	     }
		 // Adicionar na lista para fazer recalculos
		 ForEach ( $aItemAdc As $nItem ) {
		    $aIte_CodigoI[] = $nItem;
		 }
      }
	  //
   }
   //
   Return True;
}
//
Function CalcularIBPT($nPro_CodigoI,$nValorCalc) {
    $sSQLQuery = 
	    "SELECT ".
		     "IBP_ALIQNAC, IBP_ALIQIMP, ORI_TIPCAL ".
	    "FROM cad_produto, cad_produto_origem, cad_tabela_ibpt ".
		"WHERE ".
		     "ITE_CODIGOI=".$nPro_CodigoI." AND ITE_COD_ORI=ORI_CODIGO AND ITE_COD_NCM=IBP_COD_NCM AND IBP_TIP_NCM=0".
		";";
    $Row = MYSQL_QUERY($sSQLQuery) or die($sSQLQuery.'<br>'.MYSQL_ERROR());
	$nRetornoVal = 0;
    If ( $Row = MYSQL_FETCH_OBJECT($Row) ) {
       If ( $Row->ORI_TIPCAL==0 ) { // Nacional
	      $nRetornoVal = $nValorCalc * ( $Row->IBP_ALIQNAC / 100 );
	   } Else {                     // Importado
	      $nRetornoVal = $nValorCalc * ( $Row->IBP_ALIQIMP / 100 );
	   }
    }
	$nRetornoVal = ROUND($nRetornoVal,2);
	Return $nRetornoVal;
}
//
// Recalcula o Fat_Item com Fat_Geral
Function Recalcular_FatGer( $nFat_CodigoI ) {
    $bTaxaIteIndv = (SQLVarConfig('TODOSITENS_COM_TAXASVR')+0)==0;
	$nPerComissao = SQLVarConfig('GARCOM_GAR_COMISSAO')+0;
    If ( $nPerComissao>0 ) {
	   $nPerComissao = PuxarTaxaPromocional();
    }
	//
    $sSQLRequest =
       "SELECT * ".
	   "FROM fat_geral ".
	   "WHERE FAT_CODIGOI=".$nFat_CodigoI;
    $aFat_Geral_Rg = MYSQL_QUERY($sSQLRequest) or die('<br>' .$sSQLRequest . '<br>' . MYSQL_ERROR()); // Executar comando SQL
	$aFat_Geral_Rg = MYSQL_FETCH_ARRAY($aFat_Geral_Rg, MYSQL_ASSOC);
	//
    $sSQLRequest =
       "SELECT FAT_CODITE1, FAT_CANITEM, FAT_PRE_TOT, FAT_QTD_ITE, ITE_CALCTAXASVR, FAT_DAT_HOR ".
	   "FROM fat_item ".
	   "LEFT JOIN cad_produto ON FAT_CODITE1 = ITE_CODIGOI ".
	   "WHERE FAT_CFATGER=".$nFat_CodigoI." ".
          "AND FAT_FTI_CMB=0 ".
       "ORDER BY FAT_CODITE1 ASC, FAT_DAT_HOR ASC ".
       ";";
    $Rows_FatIte = MYSQL_QUERY($sSQLRequest) or die('<br>' .$sSQLRequest . '<br>' . MYSQL_ERROR()); // Executar comando SQL
	$nFat_ValDesc = 0;
	$nFat_Tot_Val = 0;
	$nFat_Tot_Ctx = 0;
	$nFat_TaxaSvr = 0;
    $nFat_TaxaCvr = 0;
	$a_Lst_Itens = ARRAY();
	$sFat_Observ1 = '';
	While ( $Row_FatIte = MYSQL_FETCH_OBJECT($Rows_FatIte) ) {
	   If ( STRLEN($Row_FatIte->FAT_CANITEM)==0 ) {
          //$sIndice = $Row_FatIte->FAT_CODITE1." ".$Row_FatIte->FAT_DAT_HOR;
          $sIndice = $Row_FatIte->FAT_CODITE1;
	      $nFat_Tot_Val += $Row_FatIte->FAT_PRE_TOT;
	      $bCalcTotCtx = True;
	      If ( $bTaxaIteIndv ) {
	         $bCalcTotCtx   = $Row_FatIte->ITE_CALCTAXASVR;
	      }
	      If ($bCalcTotCtx) {
	         $nFat_Tot_Ctx += $Row_FatIte->FAT_PRE_TOT;
	      }
		  $nIte_Preco = PuxarPrecoPromocional( $Row_FatIte->FAT_CODITE1, $Row_FatIte->FAT_QTD_ITE, False, 0, $Row_FatIte->FAT_DAT_HOR );
          If ( $nIte_Preco >= 0 ) {
		     $nFat_Pre_Tot  = $Row_FatIte->FAT_PRE_TOT - ROUND($nIte_Preco*$Row_FatIte->FAT_QTD_ITE,2);
		     $nFat_ValDesc += $nFat_Pre_Tot;
          } Else {
		     $a_Lst_Itens[$sIndice]["COD"] = $Row_FatIte->FAT_CODITE1;
		     $a_Lst_Itens[$sIndice]["DHR"] = $Row_FatIte->FAT_DAT_HOR;
		     @$a_Lst_Itens[$sIndice]["VAL"] += $Row_FatIte->FAT_PRE_TOT;
		     @$a_Lst_Itens[$sIndice]["QTD"] += $Row_FatIte->FAT_QTD_ITE;
		     //$a_Lst_Itens[$sIndice]["VAL"] = @$a_Lst_Itens[$Row_FatIte->FAT_CODITE1]["VAL"] + $Row_FatIte->FAT_PRE_TOT;
		     //$a_Lst_Itens[$sIndice]["QTD"] = @$a_Lst_Itens[$Row_FatIte->FAT_CODITE1]["QTD"] + $Row_FatIte->FAT_QTD_ITE;
          }
	   }
	}
	//
	ForEach ( $a_Lst_Itens As $sIndice => $a_Fat_Ite ) {
        $nIte_CodigoI = $a_Fat_Ite["COD"]+0;
		$nIte_Preco = PuxarPrecoPromocional( $nIte_CodigoI, $a_Fat_Ite["QTD"], True, ($a_Fat_Ite["VAL"]/$a_Fat_Ite["QTD"]), $a_Fat_Ite["DHR"] );
		$sFat_Observ1 .= $nIte_CodigoI.",".$nIte_Preco." ; ";
		If ( $nIte_Preco >= 0 ) {
		   //$nFat_Pre_Tot  = $a_Fat_Ite["VAL"] - ROUND($a_Fat_Ite["QTD"]*$nIte_Preco,2);
		   $nFat_Pre_Tot  = $a_Fat_Ite["VAL"] - ROUND($nIte_Preco,2);
		   $nFat_ValDesc += $nFat_Pre_Tot;
		}
	}
	$nFat_Tot_Ctx -= $nFat_ValDesc;
	If ( $aFat_Geral_Rg['FAT_TIP_LOC']==0 ) {
	   $nFat_TaxaSvr = ROUND( ($nPerComissao/100)*$nFat_Tot_Ctx, 2 );
       $nFat_TaxaCvr = $aFat_Geral_Rg['FAT_TAXACVR']+0;
    }
	$nFat_Tot_Rec = $nFat_Tot_Val+$nFat_TaxaSvr+$nFat_TaxaCvr;
	$nFat_Descont = ( ($nFat_ValDesc==0 OR $nFat_Tot_Rec==0) ? 0 : ROUND( 100*($nFat_ValDesc / $nFat_Tot_Rec), 1 ) );
    //
    $sSQLRequest =
       "UPDATE fat_geral SET ".
		  //"FAT_OBSERV1=".SQL_Bin($sFat_Observ1).",".
		  "FAT_TAXASVR=".$nFat_TaxaSvr.",".
          "FAT_TAXACVR=".$nFat_TaxaCvr.",".
          "FAT_TOT_VAL=".$nFat_Tot_Val.",".
		  "FAT_VALDESC=".$nFat_ValDesc.",".
		  "FAT_DESCONT=".$nFat_Descont.",".
		  "FAT_TOT_CTX=".$nFat_Tot_Ctx.",".
	      "FAT_PERTAXASVR=".$nPerComissao.", ".
		  "FAT_SBTOTAL=".$nFat_Tot_Rec.",".                    // Total dos Produtos + Taxa Servi�o
		  "FAT_TOT_REC=".($nFat_Tot_Rec-$nFat_ValDesc)." ".    // Total dos Produtos + Taxa Servi�o + Couver
       " WHERE FAT_CODIGOI=".$nFat_CodigoI.";";
    MYSQL_QUERY($sSQLRequest) or die('<br>' .$sSQLRequest . '<br>' . MYSQL_ERROR()); // Executar comando SQL
}
//
//
Function PuxarCaixaAberto($nCodOpe=0) {
  $Row_MovCai = MYSQL_QUERY("SELECT * FROM mov_caixa WHERE MVC_COD_FUN=".$nCodOpe." AND MVC_TIPOMOV=0 ORDER BY MVC_CODIGOI DESC LIMIT 0,1;") or die(MYSQL_ERROR());
  $nCodSqCaixa = 0;
  If ( $Row_MovCai=MYSQL_FETCH_OBJECT($Row_MovCai) ) {
     $nMov_UltCod = $Row_MovCai->MVC_SQCAIXA+0;
     $Row_MovCai = MYSQL_QUERY("SELECT COUNT(*) FROM mov_caixa WHERE MVC_SQCAIXA=".$nMov_UltCod." AND MVC_TIPOMOV IN (0,1);") or die(MYSQL_ERROR());
     $Row_MovCai = MYSQL_FETCH_ARRAY($Row_MovCai);
     If ( $Row_MovCai[0]==1 ) {
        $nCodSqCaixa = $nMov_UltCod;
     }
  }
  Return $nCodSqCaixa;
}
//
Function PuxarDadosCaixa( $nSeqCaixa=0, $bPuxarFatGeral = True) {
  $n_EntTroco = 0;   // Valor do troco da abertura do caixa
  $n_SaldoTot = 0;   // Valor total em caixa at� o momento (menos o troco da abertura)
  $n_DataAber = 0;   // Data de abertura do caixa Timestamp
  $n_DataFech = 0;   // Data de fechamento do caixa Timestamp
  $n_DataFAbr = 0;   // Data de trabalho ficticia da abertura do caixa Timestamp
  $n_DataFFec = 0;   // Data de trabalho ficticia do fechamento do caixa Timestamp
  $a_DadosFun = ARRAY();
  //
  // Calculo na tabela MOV_CAIXA
  $Rows_T = MYSQL_QUERY(
    "SELECT mvc.*, fun.FUN_CODIGO, fun.FUN_NOMECP, fun.FUN_APELID ".
	"FROM      mov_caixa       AS mvc ".
    "LEFT JOIN cad_funcionario AS fun  ON  fun.FUN_CODIGO = mvc.MVC_COD_FUN ".
	"WHERE mvc.MVC_SQCAIXA=".$nSeqCaixa." ".
    "ORDER BY MVC_CODIGOI DESC;"
    ) or die(MYSQL_ERROR());
  //
  While ( $Row_T=MYSQL_FETCH_OBJECT($Rows_T) ) {
     If ($Row_T->MVC_TIPOMOV==0) {          // Caixa foi aberto
	    $n_EntTroco += $Row_T->MVC_VALORMV;
	    $n_DataAber  = ConvertDtHrSTR($Row_T->MVC_DATAMOV);
		$n_DataFAbr  = ConvertDataSTR($Row_T->MVC_DATAFIC);
		$a_DadosFun[0] = $Row_T->FUN_CODIGO;
		$a_DadosFun[1] = $Row_T->FUN_APELID;
		$a_DadosFun[2] = $Row_T->FUN_NOMECP;
		//
     } ElseIf ($Row_T->MVC_TIPOMOV==1) {    // Caixa foi fechado
	    $n_DataFech  = ConvertDtHrSTR($Row_T->MVC_DATAMOV);
		$n_DataFFec  = ConvertDataSTR($Row_T->MVC_DATAFIC);
	    //
     } ElseIf ($Row_T->MVC_TIPOMOV==2) {    // Sagria do caixa  (Retirada)
	    $n_SaldoTot -= $Row_T->MVC_VALORMV;
		//
     } ElseIf ($Row_T->MVC_TIPOMOV==3) {    // Cr�dito no caixa (Mais troco)
	    $n_SaldoTot += $Row_T->MVC_VALORMV;
		//
	 }
  }
  //
  // Calculo na tabela FAT_GERAL com a MOV_MODALIDADE_PAG
  $a_ListaMod = ARRAY();
  If ( $bPuxarFatGeral ) {
     $sSQLQuery = 
       "SELECT ".
         "ftg.FAT_CODIGOI,".
         "mov.MOV_MPGCODI,".
         "mov.MOV_VALORMV ".
       "FROM fat_geral AS ftg ".
       "LEFT JOIN mov_modalidade_pag AS mov  ON  mov.MOV_CFATGER = ftg.FAT_CODIGOI ".
       "WHERE ftg.FAT_SQCAIXA=".$nSeqCaixa." AND ftg.FAT_RCFORMA>0 AND mov.MOV_C_REC_C=0 ".
       "GROUP BY mov.MOV_MPGCODI ".
       "ORDER BY mov.MOV_MPGCODI ASC ".
       //"ORDER BY ftg.FAT_DAT_FIM DESC, mov.MOV_CODIGOI DESC".
       ";";
     $Rows_T = MYSQL_QUERY($sSQLQuery) or die(MYSQL_ERROR().'<br>'.$sSQLQuery);
     While ( $Row_T=MYSQL_FETCH_OBJECT($Rows_T) ) {
       If ($Row_T->MOV_MPGCODI==0) {
         $n_SaldoTot -= $Row_T->MOV_VALORMV;
       } Else {
         $n_SaldoTot += $Row_T->MOV_VALORMV;
       }
       If ( ! ISSET($a_ListaMod[$Row_T->MOV_MPGCODI]) ) { $a_ListaMod[$Row_T->MOV_MPGCODI] = 0; }
       $a_ListaMod[$Row_T->MOV_MPGCODI] += $Row_T->MOV_VALORMV;
     }
  }
  //
  $aRetorno = ARRAY();
  $aRetorno[0] = $n_EntTroco;       // Valor do troco da abertura do caixa
  $aRetorno[1] = $n_SaldoTot;       // Valor total em caixa at� o momento (menos o troco da abertura)
  $aRetorno[2] = $n_DataAber;       // Data de abertura do caixa Timestamp
  $aRetorno[3] = $n_DataFech;       // Data de fechamento do caixa Timestamp
  $aRetorno[5] = $a_ListaMod;       // Lista dos modos de pagamentos totalizados (mov_modalidade_pag)
  $aRetorno[6] = $a_DadosFun;       // Dados do funcion�rio que abriu o caixa
  $aRetorno[7] = $n_DataFAbr;       // Data de trabalho ficticia da abertura do caixa Timestamp
  $aRetorno[8] = $n_DataFFec;       // Data de trabalho ficticia do fechamento do caixa Timestamp
  Return $aRetorno;
}
//
// Retorna o tipo de emissor fiscal do terminal: 0=Nenhum, 1=ECF, 2=SAT
Function Terminal_e_Fiscal($s_IP = '') {
   $sHost_Name = '';
   If ( EMPTY($s_IP) ) {
      $s_IP = ObterIPdoCliente();
   }
   $sHost_Name = gethostbyaddr($_SERVER['REMOTE_ADDR']);
   
   $bE_Fiscal = SQLVarConfig('TRIBUTACAO_FISCAL')+0;
   If ($bE_Fiscal) {
      //CRIADO TABELA IPSPAT
	  //$sLista_Terminais = SQLVarConfig('FISCAL_LISTA_IPS');
	  //If ( STRPOS(' ;'.$sLista_Terminais.';',';'.$s_IP.';')>0 ) {
	  //   Return 1;
	  //}
      //$sLista_Terminais = SQLVarConfig('FISCAL_SAT_LISTA_IPS');
	  //If ( STRPOS(' ;'.$sLista_Terminais.';',';'.$s_IP.';')>0 ) {
	  //   Return 2;
	  //}
	  
       //ECF
	   $sSQLQuery =
           "SELECT ".
		      "IPS_SEQUEN,IPS_NUMERO_IP,IPS_TIPREG ".
		   "FROM cad_ipspat ".
		   "WHERE IPS_TIPREG='ECF';";
         
		 $RowsT = MYSQL_QUERY( $sSQLQuery ) Or Die( $sSQLQuery.'<br>'.MYSQL_ERROR() );
         If (MYSQL_NUM_ROWS($RowsT)>0) {
	          
			While ( $Row = MYSQL_FETCH_OBJECT($RowsT) ) {
			   If ( $Row->IPS_NUMERO_IP==$s_IP) {
			      Return 1;
			   }
			    
			   //pelo nome
			   If ( STRTOUPPER($Row->IPS_NUMERO_IP)==STRTOUPPER($sHost_Name)) {
			      Return 1;
			   }
	        }
		 }
		//SAT 
	    $sSQLQueryS =
           "SELECT ".
		      "IPS_SEQUEN,IPS_NUMERO_IP,IPS_TIPREG ".
		   "FROM cad_ipspat ".
		   "WHERE IPS_TIPREG='SAT';";
         
		 $RowsTS = MYSQL_QUERY( $sSQLQueryS ) Or Die( $sSQLQueryS.'<br>'.MYSQL_ERROR() );
         If (MYSQL_NUM_ROWS($RowsTS)>0) {
	        While ( $RowS = MYSQL_FETCH_OBJECT($RowsTS) ) {
			   If ( $RowS->IPS_NUMERO_IP==$s_IP) {
			      Return 2;
	           }
		       // pelo nome 
			   If ( STRTOUPPER($RowS->IPS_NUMERO_IP)==STRTOUPPER($sHost_Name)) {
			      Return 2;
			   }
			
		    }
		 }
   }
   Return 0;
}
//
// Retorna em matriz os terminais autorizados para Garcom Express aplicativo
// Retorno: ["(MAC)"] = (Numero do terminal)
Function GetSQL_GarApp_Terminais($sLstTerminaisAut="") {
   $aTerminaisAut = ARRAY();
   //
   If ( EMPTY($sLstTerminaisAut) ) {
	  
	  //$sLstTerminaisAut = SQLVarConfig("GARCOMAPP_TRM_AUTORIZADOS");
      
	  $sSQLQuery =
         "SELECT ".
            "APP_CODIGOI    ,".
			"APP_DESCRITIVO ,".
		    "APP_ID_TERMINAL,".
            "APP_N_TERMINAL ,".
			"APP_AUTORIZADO ".
         "FROM cad_terminal_app ".
	     ";";
	    
	     $RowsT = MYSQL_QUERY( $sSQLQuery ) Or Die( $sSQLQuery.'<br>'.MYSQL_ERROR() );
         While ($RowT = MYSQL_FETCH_ARRAY($RowsT,MYSQL_ASSOC)) {
            $aTerminaisAut[$RowT["APP_ID_TERMINAL"]] =
			  ARRAY(
			    "TRM_NUMERO"     => $RowT["APP_N_TERMINAL"]+0,
			    "TRM_DESCRITIVO" => $RowT["APP_DESCRITIVO"]  ,
			    "TRM_AUTORIZADO" => $RowT["APP_AUTORIZADO"]+0,
			  );
         }
		 
   } Else {
     //
     $aTmp_Lista = EXPLODE(";", $sLstTerminaisAut.";");                 // lista de terminais autorizados
     ForEach( $aTmp_Lista As $sItem_Trm ) {
	    
	    $aItem_Trm = EXPLODE("=", $sItem_Trm."=" );
	    $sItem_Trm = $aItem_Trm[0];
	    //$sItem_Trm = Somente_Numeros( STRTOUPPER(@$aItem_Trm[0]), "ABCDEF" );
	    $nNume_Trm = Somente_Numeros(@$aItem_Trm[1])+0;
	    
	    If ( STRLEN($sItem_Trm)>8 && $nNume_Trm>0 ) {
	       $aTerminaisAut[$sItem_Trm]['TRM_NUMERO'] = $nNume_Trm;
	    }
     }
   }
   RETURN $aTerminaisAut;
   //
}
//
// Criar registro na tabela FAT_GERAL
Function InsSQL_Fat_Geral($nFat_Tip_Loc,$nFat_Num_Loc=0) {
   Global $nTerminal_Numero;
   $sData_Trabalho = SQLVarConfig('DATA_DE_TRABALHO');          // Data de trabalho do sistema
   $nTipoFat_Geral = SQLVarConfig('CONTROLE_DO_FAT_GERAL')+0;            // Tipo do controle de trabalho. 0=Por local , 1=Por comanda
   //
   If ( $nTipoFat_Geral==1 && $nFat_Tip_Loc==0 ) {   // Tipo LOCAL (COMANDA)
      $nCodSeq_Comanda = $nFat_Num_Loc;
	  $nFat_Tip_Loc = 3;
   } Else {
      If ($nFat_Tip_Loc==0) {                        // Tipo LOCAL (MESA)
         $nCodSeq_Comanda = SQLVarConfig('COMANDA_L_SEQCOD')+0;
         SQLVarConfigG('COMANDA_L_SEQCOD',$nCodSeq_Comanda+1);
      } ElseIf ($nFat_Tip_Loc==1) {                  // Tipo BALC�O
         $nCodSeq_Comanda = SQLVarConfig('COMANDA_B_SEQCOD')+0;
         SQLVarConfigG('COMANDA_B_SEQCOD',$nCodSeq_Comanda+1);
      } ElseIf ($nFat_Tip_Loc==2) {                  // Tipo DISK ENTREGA
         $nCodSeq_Comanda = SQLVarConfig('COMANDA_E_SEQCOD')+0;
         SQLVarConfigG('COMANDA_E_SEQCOD',$nCodSeq_Comanda+1);
      }
   }
   $nFat_CodigoI = SQLVarConfig('FAT_GERAL_SEQCOD')+0;
   SQLVarConfigG('FAT_GERAL_SEQCOD',$nFat_CodigoI+1);
   $sSQLQuery =
      "INSERT INTO fat_geral(".
         "FAT_CODIGOI, FAT_DAT_INI, FAT_TIP_LOC, FAT_SQCOMAN, FAT_DATAINI, FAT_NUM_MES, FAT_NUM_TRM, FAT_ULTPED".
      ") VALUE (".
         $nFat_CodigoI.",".
         "'".DATE("Y-m-d H:i:s")."',".
         $nFat_Tip_Loc.",".
         $nCodSeq_Comanda.",".
         "'".$sData_Trabalho."',".
         $nFat_Num_Loc.",".
         ($nTerminal_Numero+0).",".
         "'".DATE("Y-m-d H:i:s")."' ".
      ");";
   MYSQL_QUERY( $sSQLQuery ) Or Die( $sSQLQuery.'<br>'.MYSQL_ERROR() );
   Return $nFat_CodigoI;
}
//
// Atualizar registro na tabela FAT_GERAL
Function UpdSQL_Fat_Geral( $nFat_CodigoI=0, $aFat_Geral=ARRAY() ) {
   If ( $nFat_CodigoI==0 Or EMPTY($aFat_Geral) ) {
	  Return False;
   }
   $sSQL_Campos = "";
   ForEach( $aFat_Geral As $s_Campo => $s_Conteudo ) {
	  $n_Conteudo = (Somente_Numeros($s_Conteudo,'.')+0);
      $bCampo_Numerico = STRLEN($s_Conteudo)==STRLEN($n_Conteudo);
	  //$bCampo_Numerico = ( $n_Conteudo>0 && $n_Conteudo==($s_Conteudo+0) );
	  //
	  $sSQL_Campos .=
	     ( EMPTY($sSQL_Campos) ? "" : "," ).
		 ( $bCampo_Numerico ?
	       $s_Campo." = ".$n_Conteudo
		 :
	       $s_Campo." = ".SQL_Bin($s_Conteudo)
		 ).
		 '';
   }
   $sSQL_Query =
      "UPDATE fat_geral SET ".
	     $sSQL_Campos." ".
      "WHERE FAT_CODIGOI=".$nFat_CodigoI.";";
   MYSQL_QUERY($sSQL_Query) Or Die('<br>'.$sSQL_Query.'<br>'.MYSQL_ERROR()); // Executar comando SQL
   Return True;
}
//
// Criar registros na tabela FAT_ITEM
Function InsSQL_Fat_Item( $aItens_Gravar, $nFat_CFatGer, $bCalcula_Custo_SQL=False ) {
   $a_Gravados = ARRAY();
   //
   ForEach ( $aItens_Gravar As $aItem ) {
      $sSQL_Campos = "";
	  $sSQL_Conteu = "";
	  $nFat_CodigoI = SQLVarConfig('FAT_ITEM_SEQCOD');
	  SQLVarConfigG('FAT_ITEM_SEQCOD',$nFat_CodigoI+1);
      $nFat_Senha_Retirar = 0;
      If ( (@$aItem['FAT_SENHA_RETIRAR']+0)>0 ) {
         $nFat_Senha_Retirar = SQLVarConfig('SENHA_RETIRAR_PRODUTO_SEQCOD');
	     SQLVarConfigG('SENHA_RETIRAR_PRODUTO_SEQCOD',$nFat_Senha_Retirar+1);
      }
	  //
	  $aItem_Novo = $aItem;
	  $aItem_Novo['FAT_CODIGOI'] = $nFat_CodigoI;
	  $aItem_Novo['FAT_CFATGER'] = $nFat_CFatGer;
      $aItem_Novo['FAT_SENHA_RETIRAR'] = $nFat_Senha_Retirar;
	  //
      ForEach ( $aItem_Novo As $s_Nome => $s_Conteudo ) {
		 $s_Conteudo_  = Somente_Numeros($s_Conteudo,".");
		 If ( strlen($s_Conteudo)==0 ) {
		    $s_Conteudo_ = "''";
		 } ElseIf (($s_Conteudo_.'')==($s_Conteudo.'')) {
		    $s_Conteudo_ = $s_Conteudo_+0;
		 } Else {
		    $s_Conteudo_ = SQL_Bin($s_Conteudo);
		 }
		 $sSQL_Campos .= ( STRLEN($sSQL_Campos)>0 ? ',' : '').$s_Nome;
		 $sSQL_Conteu .= ( STRLEN($sSQL_Conteu)>0 ? ',' : '').$s_Conteudo_;
	  }
      $sSQLQuery =
        "INSERT INTO fat_item(".$sSQL_Campos.") VALUES (".$sSQL_Conteu."); ".
        ";";
	  MYSQL_QUERY( $sSQLQuery ) Or Die( $sSQLQuery.'<br>'.MYSQL_ERROR() );
      If ( $bCalcula_Custo_SQL ) {
         $sSQLQuery =
           "SELECT FUNC_RETORNA_TOTAL_CUSTO_PRODUTO('U',".$nFat_CodigoI.") ".
           ";";
	     MYSQL_QUERY( $sSQLQuery );
      }
	  $a_Gravados[$nFat_CodigoI]=1;
   }
   //
   Return $a_Gravados;
}
//
// Cancelar registro na tabela FAT_GERAL ou seja a mesa
Function UpdSQL_Fat_Geral_Cancelar($nFat_CodigoI=0) {
   Global $sData_Trabalho, $R_CadFuncionario;
   $sSQLQuery =
      "UPDATE fat_geral SET ".
         "FAT_CAN_DAT='".DATE("Y-m-d H:i:s")."', ".
		 "FAT_CANCELA=".(+@$R_CadFuncionario->FUN_CODIGO)." ".
      " WHERE FAT_CODIGOI=".$nFat_CodigoI.";";
   MYSQL_QUERY( $sSQLQuery ) Or Die( $sSQLQuery.'<br>'.MYSQL_ERROR() );
   Return True;
}
//
DEFINE("SQL_ExArray_Normal"     , 0 );
DEFINE("SQL_ExArray_Sequencial" , 1 );
// Extrai um registro SQL
Function SQL_Extrair( $v_Registros_SQL, $nOpcao_Retorno=SQL_ExArray_Normal ) {
   If ( EMPTY($v_Registros_SQL) || !is_resource($v_Registros_SQL) ) {
	  Return Null;
   }
   $a_Retorno = ARRAY();
   If ( $nOpcao_Retorno       == SQL_ExArray_Normal     ) {   // Retornar as chaves com os nomes dos campos
	  $a_Retorno = MYSQL_FETCH_ARRAY( $v_Registros_SQL, MYSQL_ASSOC );
	  //
   } ElseIf ( $nOpcao_Retorno == SQL_ExArray_Sequencial ) {   // Retornar as chaves com n�meros sequenciais apartir do 0
	  $a_Retorno = MYSQL_FETCH_ARRAY( $v_Registros_SQL, MYSQL_NUM   );
	  //
   }
   Return $a_Retorno;
}
// Extrai cadeia completa com os registros SQL
Function SQL_Extrair_Cmp( $v_Registros_SQL, $vCampo_Indice=Null ,$nOpcao_Retorno=SQL_ExArray_Normal ) {
   $a_Retorno = ARRAY();
   $n_Contador = 0;
   While ( $a_Registro = SQL_Extrair( $v_Registros_SQL, $nOpcao_Retorno ) ) {
	  $n_Contador++;
	  If ( EMPTY($vCampo_Indice) ) {
		 $a_Retorno[] = $a_Registro;
	  } Else {
		 If ( ISSET($a_Registro[$vCampo_Indice]) ) {
		    $a_Retorno[$a_Registro[$vCampo_Indice]] = $a_Registro;
		 } Else {
			BREAK;
		 }
	  }
	  If ( $n_Contador>100000 ) {  // Limitador
		 BREAK;
	  }
   }
   Return $a_Retorno;
}

Function V_Libs(){
   $sLibs = '';
   $a_DLL = 
      ARRAY( "bz2"=>
                ARRAY( extension_loaded("bz2")+0),
             "curl"=>
                ARRAY( extension_loaded("curl")+0),
             "gd"=>
                ARRAY( extension_loaded("gd")+0),
             "mysql"=>
                ARRAY( extension_loaded("mysql")+0), 
             "mysqli"=>
                ARRAY( extension_loaded("mysqli")+0), 
             "openssl"=>
                ARRAY( extension_loaded("openssl")+0), 
             "mssql"=>
                ARRAY( extension_loaded("mssql")+0), 
             "sockets"=>
                ARRAY( extension_loaded("sockets")+0) 	  
           );	
	   
	If ($a_DLL['bz2'][0] == 0  ) {
	 $sLibs .= 'bz2<br> ';	
	} 
	If ($a_DLL['curl'][0] == 0 ) {
	 $sLibs .= ' curl<br> ';
	} 
	If ($a_DLL['gd'][0] == 0 ) {
	 $sLibs .= ' gd2<br> ';
	} 
	If ($a_DLL['mysql'][0] == 0 ) {
	 $sLibs .= ' mysql<br> ';
	} 
	If ($a_DLL['mysqli'][0] == 0 ) {
	 $sLibs .= ' mysqli<br> ';
	} 
	If ($a_DLL['openssl'][0] == 0 ) {
	 $sLibs .= ' openssl<br> ';
	} 
	//If ($a_DLL['mssql'][0] == 0 ) {
	// $sLibs .= ' mssql<br> ';
	//}
	If ($a_DLL['sockets'][0] == 0) {
	 $sLibs .= ' sockets<br> ';
	}
	
	Return $sLibs;	
}	

Function Exporta_Excel( $aConteudo_Rel, $Acesso, $Opcao ) {
   $sHtml = '';
   ForEach ( $aConteudo_Rel as $sConteudo ) {
      If ( ! EMPTY( $sConteudo )) {
	     ForEach ($sConteudo as $key => $sRCont){
	     
		    If ( STRLEN(TRIM($sConteudo[$key]))> 0) { 	    
         
			   $sHtml .= 
			      ( $sConteudo[$key]=='PULAR_COLUNA' ? ';' : "" ).
			      ( ($sConteudo[$key]=='PULAR_LINHA')  || ($sConteudo[$key]=='PULAR_COLUNA') ? "" : @$sConteudo[$key].';').
			      ( $sConteudo[$key]=='PULAR_LINHA' ? CHR(13).CHR(10) : "").
			      "";        		

		    }	
	     }
      }	  
   }
   
   Return $sHtml;
}
//
// ***
Function Login_Atv_Simdesk($nEmp_Codigo, $nTipo_Atv, $sOpe_Apelido='', $sOpe_Senha='') {
   Global $aSessao;
   $aAtv_Simdesk = @$aSessao['Login_Atv_Simdesk'];
   $bSucessoCom = False;
   $aAtv_Empresa = @$aAtv_Simdesk[$nEmp_Codigo];
   $nTipo_AtvAnt = @$aAtv_Empresa['TIPO_ATVANT']+0;
   //
   $aTrv_Simsoft = @$aSessao['Trv_Sft_Lic'];
   If ( (@$aTrv_Simsoft['Last_Get_Number']+120) < TIME() ) {
      $aTrv_Simsoft['Last_Get_Number'] = TIME();
      $sSerial_DiskDrive = Obter_NSerie_Hardware(0);          // Obter número de série físico do HD
      If ( EMPTY($sSerial_DiskDrive) ) {
         $sSerial_DiskDrive = Obter_NSerie_Hardware(90);      // Obter número de série lógico da unidade
      }
      $aTrv_Simsoft['DiskDrive_Serie'] = $sSerial_DiskDrive;
   }
   //
   If ( $nTipo_AtvAnt==2 OR $nTipo_AtvAnt==4 ) {
      $aAtv_Empresa['ATV_CODIGOINT'] = 0;
   }
   //
   If ( (@$aAtv_Empresa['ATV_CODIGOINT']+0)==0 AND ( $nTipo_Atv==1 OR $nTipo_Atv==3 ) ) {
      $aRetornoCom = Reg_Atv_Simdesk( 1, $nEmp_Codigo );       // Atividade 1 = Aplicativo iniciado
      If ( @$aRetornoCom[0]=='OK' ) {
         $aAtv_Empresa['ATV_CODIGOINT'] = @$aRetornoCom['ATV_CODIGOINT']+0;
         $aAtv_Simdesk['AUTO_LICENCA_SFT'] = ( @$aRetornoCom['AUTO_LICENCA']+0>0 );
         SQLVarConfigG('CFG_T_D_P', (@$aRetornoCom['AUTO_LICENCA']+0) );    // Para orientar qual tipo de trava, provis�rio
         If ( $aAtv_Simdesk['AUTO_LICENCA_SFT'] ) {
            Liberacao_Sistema(3);   // Limpar
            Liberacao_Sistema(1);   // Autorizar
         }
         //
         If ( @$aRetornoCom['BLOQUEADO']+0>0 ) {               // Cliente bloqueado
            SQLVarConfigG('CFG_T_D_U',"");
            //
         } ElseIf ( @$aRetornoCom['CHAVE_LIB']=="EXPIRADA" ) { // Chave expirada
            //
         } ElseIf ( ! EMPTY($aRetornoCom['CHAVE_LIB']) ) {     // Atualizar chave
            G_CHAVEINT( $nEmp_Codigo, NULL, NULL, 12, 2, TRIM($aRetornoCom['CHAVE_LIB']), 0 );
            //
         }
         $bSucessoCom = True;
         //
      }
   }
   //
   UNSET( $aSessao['LICENCA_SFT_VALIDA'] );
   $aVd_Licenca = [];
   If ( $bSucessoCom ) {
      If ( $aAtv_Simdesk['AUTO_LICENCA_SFT'] ) {
         $aVd_Licenca = Licenca_Sft_Validar( @$aTrv_Simsoft['DiskDrive_Serie'], $nEmp_Codigo );
         $aSessao['LICENCA_SFT_VALIDA'] = $aVd_Licenca['VALIDA'];
         If ( ! EMPTY($aVd_Licenca['MSG_ERRO']) ) {
            Info_Evento( 'L4855 (Com comunicação) : '.$aVd_Licenca['MSG_ERRO'] , 1);
         }
         If ( @$aSessao['LICENCA_SFT_VALIDA'] ) {
            Info_Evento( 'L4858 (Com comunicação) : Licença válida');
         }
         //$aVd_Licenca['ATUALIZAR'] = True;  // *** Teste: For�ar atualiza��o da licen�a ***
      } Else {
         $sVd_Licenca = SQLVarConfig('LICENCA_SOFTWARES_SIMSOFT');
         If ( ! EMPTY($sVd_Licenca) ) {
            SQLVarConfigG('LICENCA_SOFTWARES_SIMSOFT','');
            Liberacao_Sistema(3);
         }
         $aVd_Licenca = [];
      }
   } Else {
      $sVd_Licenca = SQLVarConfig('LICENCA_SOFTWARES_SIMSOFT');
      If ( ! EMPTY($sVd_Licenca) ) {
         $aVd_Licenca = Licenca_Sft_Validar( @$aTrv_Simsoft['DiskDrive_Serie'], $nEmp_Codigo );
         $aSessao['LICENCA_SFT_VALIDA'] = $aVd_Licenca['VALIDA'];
         If ( ! EMPTY($aVd_Licenca['MSG_ERRO']) ) {
            Info_Evento( 'L4875 (Sem comunicação) : '.$aVd_Licenca['MSG_ERRO'] , 1);
         }
      }
      If ( @$aSessao['LICENCA_SFT_VALIDA'] ) {
         Info_Evento( 'L4879 (Sem comunicação) : Licença válida');
      }
   }
   //
   If ( (@$aAtv_Empresa['ATV_CODIGOINT']+0)>0 AND ( $nTipo_Atv==1 OR $nTipo_Atv==3 ) AND @$aAtv_Simdesk['AUTO_LICENCA_SFT'] ) {
      If ( ( ! @$aVd_Licenca['VALIDA']) OR @$aVd_Licenca['ATUALIZAR'] ) {
         $aRetornoLic = Licenca_Sft_Simdesk( $nEmp_Codigo, (@$aAtv_Empresa['ATV_CODIGOINT']+0), @$aVd_Licenca['NSERIE'], @$aTrv_Simsoft['DiskDrive_Serie'] );
         $aSessao['LICENCA_SFT_COM_ERRO'] = (@$aRetornoLic['Erro']['CODIGO']+0);
         //ECHO VAR_EXPORT($aRetornoLic,True);    // *** Teste ***
         If ( $nTipo_Atv==3 ) {
            $aVd_Licenca = Licenca_Sft_Validar( @$aTrv_Simsoft['DiskDrive_Serie'], $nEmp_Codigo );
            $aSessao['LICENCA_SFT_VALIDA'] = $aVd_Licenca['VALIDA'];
            If ( ! EMPTY($aVd_Licenca['MSG_ERRO']) ) {
               Info_Evento( 'L4885 (Com comunicação - Licenca_Sft_Simdesk) : '.$aVd_Licenca['MSG_ERRO'] , 1);
            }
            If ( @$aSessao['LICENCA_SFT_VALIDA'] ) {
               Info_Evento( 'L4879 (Com comunicação - Licenca_Sft_Simdesk) : Licença válida');
            }
         }
      }
   }
   //
   If ( $nTipo_Atv>1 ) {
      $aRetornoCom = Reg_Atv_Simdesk( $nTipo_Atv, $nEmp_Codigo, (@$aAtv_Empresa['ATV_CODIGOINT']+0), $sOpe_Apelido, $sOpe_Senha );
      If ( @$aRetornoCom[0]=='OK' ) {
         $bSucessoCom = True;
      }
   }
   //
   If       ( $nTipo_Atv==2 ) {                               // Atividade 2 = Falha no login
      //
   } ElseIf ( $nTipo_Atv==3 ) {                               // Atividade 3 = Login no sistema
      //
   } ElseIf ( $nTipo_Atv==4 ) {                               // Atividade 4 = Logoff no sistema
      //
   }
   If ( $bSucessoCom ) {
      $aAtv_Empresa['TIPO_ATVANT'] = $nTipo_Atv;
      UNSET($aSessao['Atualizar_ECook']);
      If ( ! EMPTY($aRetornoCom['ATUALIZAR']) ) {
         $aSessao['Atualizar_ECook'] = $aRetornoCom['ATUALIZAR'];
         $aSessao['Atualizar_ECook']['Emp_Codigo'] = $nEmp_Codigo;
      }
   }
   //
   $aAtv_Simdesk[$nEmp_Codigo] = $aAtv_Empresa;
   If ( ISSET($aAtv_Simdesk) ) {
      $aSessao['Login_Atv_Simdesk'] = $aAtv_Simdesk;
   } Else {
      UNSET($aSessao['Login_Atv_Simdesk']);
   }
   If ( ISSET($aTrv_Simsoft) ) {
      $aSessao['Trv_Sft_Lic'] = $aTrv_Simsoft;
   } Else {
      UNSET($aSessao['Trv_Sft_Lic']);
   }
   Return $bSucessoCom;
}
// ***
Function Reg_Atv_Simdesk( $nTipo_Atv, $nEmp_Codigo, $nAtv_CodigoInt=0, $sOpe_Apelido='', $sOpe_Senha='' ) {
   //Global $sURLSimdesk;
   $sData_Trabalho = SQLVarConfig('DATA_DE_TRABALHO');
   //
   $bHouve_Erro = False;
   $sMensagem_Trava = '';
   $sReferencia = '';
   $nDia_Uso = 0;
   $nDia_Rst = 0;
   $nDta_Ins = 0;
   //
   If ( $nTipo_Atv==1 ) {
      //$Banco = MYSQL_QUERY("SELECT DATABASE()") or DIE(mysql_error());
      //$Bd_Atual = MYSQL_RESULT($Banco,0);
      //$nTamanho = 0;
      //$sScript_SQL = 
      //   "SELECT ".
      //      "table_schema 'Banco', ". 
      //      "round(sum( data_length + index_length ) / 1024 / 1024,2) 'Tamanho' ". 
      //   "FROM information_schema.TABLES ".
      //   'WHERE table_schema = "'.@$Bd_Atual.'" '.
      //   "GROUP BY table_schema".
      //   ";"; 
      //$v_Rows = MYSQL_QUERY($sScript_SQL);
      //If( $a_Row = MYSQL_FETCH_ARRAY($v_Rows,MYSQL_ASSOC) ) {
      //   $nTamanho = $a_Row['Tamanho']; 
      //}
	  //$sReferencia = 'Tamanho da Base de Dados: '.$nTamanho.' MB';
      //
   } ElseIf ( $nTipo_Atv==2 ) {
	  $sReferencia = 'Operador:'.$sOpe_Apelido.' , Senha:'.$sOpe_Senha;
      //
   } Elseif ( $nTipo_Atv==3 ) {
	  //verifica dias restantes
	  $sChaveS = "(- SIMSOFT -) :: (-SOFTWARE-)";
	  $nDia_Uso  = SQLVarConfig('CFG_T_D_U');
      If ( STRLEN($nDia_Uso)>10 ) {
        $nDia_Uso = LibSiS_DEC($nDia_Uso, $sChaveS);
      } 
	  $dDta_Ins = SQLVarConfig('CFG_T_D_I');
      If ( STRLEN($dDta_Ins)>10 ) {
         $nDta_Ins = STRTOTIME(LibSiS_DEC($dDta_Ins, $sChaveS));
         $dDta_Ins = DATE('d/m/Y', $nDta_Ins);
      }
	  $nDta_Exp = $nDta_Ins + ( $nDia_Uso * 24 * 60 * 60 );
	  $dDta_Exp = DATE('d/m/Y', $nDta_Exp);
	  //
	  $nDia_Rst = ($nDta_Exp / (24 * 60 * 60)) - (MKTIME(0,0,0) / (24 * 60 * 60));
	  $sReferencia = 'Data de trabalho: '.ConvertDataUSBR($sData_Trabalho);
      //
   } Elseif ( $nTipo_Atv==4 ) {
	  //
   }
   //
   If ( $nDia_Rst<0 ) {
	  $nDia_Rst = 0;
   }
   //
   $a_Dados_Post = 
      ARRAY(
       'Acao'   => 'REGISTRAR_ATV',
       'CodEmp' => $nEmp_Codigo,
       'CodApl' => 25,
       'CodInt' => $nAtv_CodigoInt,
       'VerApl' => Aplicativo_Versao,
       'DtHr_R' => DATE("Y-m-d H:m:s",TIME()),
       'CodAtv' => $nTipo_Atv,
       'CamExe' => Url_Site_Path,
       'NomOpe' => $sOpe_Apelido,
       'DiaRst' => $nDia_Rst,
       'NomeRd' => GETHOSTBYADDR($_SERVER['REMOTE_ADDR']),
       '_Ip_Rd' => ObterIPdoCliente(),
       'NomeSi' => PHP_UNAME(),
       'NTermi' => 0,
       'Refere' => $sReferencia
      );
   //
   $a_Dados = ComunicaUrl( Obter_URL_Simdesk() , $a_Dados_Post );
   //
   If ($a_Dados[1]>=400) {
      $bHouve_Erro = True;
      $sMensagem_Trava = 'Erro '.$a_Dados[1].': Caminho inv�lido callappl_simdesk ou retorno em branco';
   } ElseIf ( EMPTY($a_Dados[0]) OR SUBSTR($a_Dados[0],0,1)<>"{" ) {
      $bHouve_Erro = True;
      $sMensagem_Trava = 'Erro desconhecido';
   } Else {  
	  $a_DadosR = @JSON_DECODE($a_Dados[0],True);
	  If ( ISSET($a_DadosR["Erro"]) ) {
	     $bHouve_Erro = True;
	     $sMensagem_Trava = 'Erro '.@$a_DadosR["Erro"]["CODIGO"].' : '.@$a_DadosR["Erro"]["DESCRI"];
	  }
   }
   If ($bHouve_Erro) {
       RETURN( HTMLENTITIES( $sMensagem_Trava,ENT_QUOTES,'utf-8' ));
   } Else {
	   RETURN(@$a_DadosR["Retorno"]);
   }
}
// ***
//
// ***
Function Reg_Ntf_Simdesk( $nEmp_Codigo=0, $sTexto='', $sTitulo='' ) {
   //Global $sURLSimdesk;
   $a_Dados_Post = 
     ARRAY(
       'CodEmp' => $nEmp_Codigo,
       'CodApl' => '25',
       'VerApl' => Aplicativo_Versao,
       'Acao'   => 'REGISTRAR_NTF',
       'Titulo' => $sTitulo,
       'Texto'  => $sTexto
     );
   //
   $a_Dados = ComunicaUrl( Obter_URL_Simdesk(), $a_Dados_Post );
   //ECHO VAR_EXPORT($a_Dados,True);
   //
}
//
// ***
Function Licenca_Sft_Simdesk( $nEmp_Codigo=0, $nAtv_CodigoInt=0, $sNSerie='', $sTrv_HD_Serie='' ) {
   //Global $sURLSimdesk;
   Global $bLocal_OS_Linux;
   $a_Dados_Post = 
     ARRAY(
       'Acao'   => 'LICENCA_SFT',
       'CodEmp' => $nEmp_Codigo,
       'CodApl' => 25,
       'CodInt' => $nAtv_CodigoInt,
       'LcNome' => GETHOSTBYADDR($_SERVER['SERVER_ADDR']),
       'TRV_HD' => $sTrv_HD_Serie
     );
   If ( $bLocal_OS_Linux  ) {  $a_Dados_Post['TRV_IP_PUB_LX'] = 1;  $a_Dados_Post['TRV_HD'] = '';  }
   If ( ! EMPTY($sNSerie) ) {  $a_Dados_Post['NSERIE'] = $sNSerie;  }
   //
   $a_Dados = ComunicaUrl( Obter_URL_Simdesk(), $a_Dados_Post );
   $a_DadosR = @JSON_DECODE($a_Dados[0],True);
   //ECHO VAR_EXPORT($a_DadosR);
   //
   If ( EMPTY($a_DadosR['Retorno']) ) {
      If ( ! EMPTY($a_DadosR['Erro']) ) {
         Info_Evento( 'Licenca_Sft_Simdesk - Erro : ('.(@$a_DadosR['Erro']['CODIGO']+0).') '.$a_DadosR['Erro']['DESCRI'], 1);
         If ( (@$a_DadosR['Erro']['CODIGO']+0)==400 ) {
            SQLVarConfigG('LICENCA_SOFTWARES_SIMSOFT','');  // Apagar a licen�a no banco de dados
            Liberacao_Sistema(3);
         }
      }
      //
   } Else {
      //
      $a_Retorno = $a_DadosR['Retorno'];
      $sSerie_Software = @$a_Retorno['SERIE_SOFTWARE'];
      $sTexto_Licenca  = @$a_Retorno['TEXTO_LICENCA']; 
      $sSerie_Licenca  = @$a_Retorno['SERIE_LICENCA'];
      $sIp_Pub_Remoto  = @$a_Retorno['IP_PUB_REMOTO'];
      //$a_Dados['DATA_HORA_LIC']; 
      //$a_Dados['DATA_HORA_SRV'];
      //If ( EMPTY($sSerie_Software) OR EMPTY($sTexto_Licenca) OR EMPTY($sSerie_Licenca) ) {
      If ( EMPTY($sTexto_Licenca) OR EMPTY($sSerie_Licenca) ) {
         // ERRO
         Info_Evento( 'Licenca_Sft_Simdesk - Houve erro.', 0);
      } Else {
         Info_Evento( 'Licenca_Sft_Simdesk - Ok', 0);
         SQLVarConfigG('LICENCA_SOFTWARES_SIMSOFT',$sTexto_Licenca);
         VarConfig_IP_Remoto( True, $sIp_Pub_Remoto );
      }
      //
   }
   //
   Return $a_DadosR;
   //
}
// ***
Function Obter_URL_Simdesk() {
   Global $sURLSimdesk, $bURLSimdesk_HTTPS, $aSessao;
   $aURL_Simdesk = @$aSessao['Simdesk_Comm'];
   If ( (@$aURL_Simdesk['Last_Get_Comm']+180) < TIME() ) {
      $aURL_Simdesk['Last_Get_Comm'] = TIME();
      $aURL_Simdesk['Addr_Get_Comm'] = '';
      $a_Dados = ComunicaUrl( $sURLSimdesk );
      If ( STRTOLOWER(SUBSTR($a_Dados[0],0,4))=='http' ) {
         $sURL_Comm = $a_Dados[0];
         If ( $bURLSimdesk_HTTPS && STRTOLOWER(SUBSTR($a_Dados[0],0,5))=='http:' ) {
            $sURL_Comm = 'https'.SUBSTR($sURL_Comm,4);
         }
         $aURL_Simdesk['Addr_Get_Comm'] = $sURL_Comm;
      } Else {
         $aURL_Simdesk['Addr_Get_Comm'] = $sURLSimdesk;
      }
      $aSessao['Simdesk_Comm'] = $aURL_Simdesk;
   }
   Return @$aURL_Simdesk['Addr_Get_Comm'];
}
//
Function VarConfig_IP_Remoto( $bGravar = False, $sNovo_IP = '' ) {
   $sCfg_Senha_RSA = '';
   $sMethod_Cipher = "AES-256-CBC";
   $sSegredo_Senha = 'RP_Sim_Tecnologia_13347';
   $sRetorno_IP = '';
   //
   If ( $bGravar ) {
      $sVar_IP_Pub = '';
      If ( ! EMPTY($sNovo_IP) ) {
        $aVar_IP_Pub =
           [ 'DATA_HORA'  => DATE("Y-m-d H:i:s"),
             'IP_PUBLICO' => $sNovo_IP
           ];
         $sVar_IP_Pub = @JSON_ENCODE($aVar_IP_Pub);
         $sVar_IP_Pub = @OPENSSL_ENCRYPT( $sVar_IP_Pub, $sMethod_Cipher, $sSegredo_Senha, 0);
      }
      SQLVarConfigG('ECOOK_COM_VAR_IP_PUB',$sVar_IP_Pub);
   } Else {
      $sVar_IP_Pub = SQLVarConfig('ECOOK_COM_VAR_IP_PUB');
      If ( ! EMPTY($sVar_IP_Pub) ) {
         $sVar_IP_Pub = @OPENSSL_DECRYPT( $sVar_IP_Pub, $sMethod_Cipher, $sSegredo_Senha, 0);
         $aVar_IP_Pub = @JSON_DECODE($sVar_IP_Pub,True);
         $sRetorno_IP = @$aVar_IP_Pub['IP_PUBLICO'];
      }
   }
   //
   Return $sRetorno_IP;
}
//
// *** Funcão de validação da licença ***
Function Licenca_Sft_Validar( $sSerie_TravaHD='', $nEmp_Codigo=0 ) {
   Global $sChave_Publica_Simsoft, $aSessao, $bLocal_OS_Linux;
   $nNumero_da_Linha = 5146;
   $a_Retorno =
     [ 'VALIDA'      => False,     // Licença válida para este aplicativo neste terminal?
       'ATUALIZAR'   => False,     // É necessário atualizar esta licença com o Simdesk?
       'NSERIE'      => '',        // Número de série da licença
       'MSG_ERRO'    => '',        // Mensagem precisa do erro
       'Licenca_Inf' => []         // Informações completa da licença
     ];
   $bContinua = True;
   $nApl_CodigoInt = 25;           // Código do aplicativo ECook no Simdesk
   $sIP_Pub_Remoto = VarConfig_IP_Remoto();
   //
   If ( $bContinua ) {
      $bContinua = ( STRLEN(@$sChave_Publica_Simsoft)>0 && $nEmp_Codigo>0 );
      $nNumero_da_Linha += 15;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Chave publica ou codigo da empresa estão vazios ('.$nNumero_da_Linha.')'; }
   }
   //
   If ( $bContinua ) {
      $sRlc_Conteudo_ = SQLVarConfig('LICENCA_SOFTWARES_SIMSOFT', True);
      $sRlc_Conteudo_ = STR_REPLACE(CHR(13),'',$sRlc_Conteudo_);
      $sRlc_Conteudo_ = STR_REPLACE(CHR(10),'',$sRlc_Conteudo_);
      $sRlc_Conteudo_ = STR_REPLACE(CHR(0) ,'',$sRlc_Conteudo_);
      $sRlc_Conteudo_ = STR_REPLACE(CHR(32),'',$sRlc_Conteudo_);
      $sLicenca_Infor  = ExtrTextoEm($sRlc_Conteudo_,   '<---LICENCA_INICIO--->','<---LICENCA_FIM--->'   );
      $sAssinatura_Hex = ExtrTextoEm($sRlc_Conteudo_,'<---ASSINATURA_INICIO--->','<---ASSINATURA_FIM--->');
      $bContinua = ( STRLEN($sLicenca_Infor)+0>10 && STRLEN($sAssinatura_Hex)>10 );
      $nNumero_da_Linha += 13;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Formato da licença ou conteúdo da assinatura são invalidos ('.($nNumero_da_Linha).')'; }
   }
   //
   If ( $bContinua ) {
      $sLicenca_Infor = @BASE64_DECODE($sLicenca_Infor);
      $aLicenca_Infor = @JSON_DECODE($sLicenca_Infor,True);
      $bContinua = ( ( ! EMPTY($aLicenca_Infor) ) && (! EMPTY($sAssinatura_Hex ) ) );
      $nNumero_da_Linha += 8;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Formato base64 da licença é invalido ('.($nNumero_da_Linha).')'; }
   }
   //
   If ( $bContinua ) {
      $bContinua = ( @$aLicenca_Infor['TIPO'] == 'LICENCA - SIMSOFT TECNOLOGIA' && STRLEN(@$aLicenca_Infor['NSERIE'])>4);
      $nNumero_da_Linha += 6;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Formato licença é invalido para a Simsoft ('.($nNumero_da_Linha).')'; }
   }
   If ( $bContinua ) {
      $bContinua = ( (@$aLicenca_Infor['PORTADOR']['CODIGOCLI']+0) == $nEmp_Codigo );
      $a_Retorno['Licenca_Inf'] = @$aLicenca_Infor;
      $nNumero_da_Linha += 6;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Código da empresa é diferente da licença ('.($nNumero_da_Linha).')'; }
   }
   If ( $bContinua ) {
      $nVersao_Lic = Somente_Numeros(@$aLicenca_Infor['VERSAO'],'.')+0;
      $bContinua = ( $nVersao_Lic >= 0.1  &&  1 >= $nVersao_Lic);
      $nNumero_da_Linha += 6;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Versão inválida da licença ('.($nNumero_da_Linha).')'; }
   }
   If ( $bContinua ) {
      $a_Retorno['NSERIE'] = $aLicenca_Infor['NSERIE'];
      $bValidade_Final = True;
      $bAtualizar_Lic  = False;
      $bLic_Revogado   = False;
      If ( (@$aLicenca_Infor['VALIDADE_FINAL']+0)>0 ) {
         $bValidade_Final = ConvertDataSTR($aLicenca_Infor['EMISSAO'])+($aLicenca_Infor['VALIDADE_FINAL']*24*60*60);
         $bValidade_Final = $bValidade_Final >= MKTIME(0,0,0);
      }
      If ( (@$aLicenca_Infor['VALIDADE']+0)>0 ) {
         $n_Dt_Atualizado = ConvertDataSTR($aLicenca_Infor['ATUALIZADO']);
         If ( $n_Dt_Atualizado < MKTIME(0,0,0,1,1,2000) ) {
            $n_Dt_Atualizado = ConvertDataSTR($aLicenca_Infor['EMISSAO']);
         }
         $a_Retorno['ATUALIZAR'] = ( $n_Dt_Atualizado != MKTIME(0,0,0) );
         $bValidade_Final = $n_Dt_Atualizado + ($aLicenca_Infor['VALIDADE']*24*60*60);
         $bValidade_Final = $bValidade_Final >= MKTIME(0,0,0);
      }
      If ( ! EMPTY($aLicenca_Infor['REVOGADO']) ) {
         //$bLic_Revogado = ConvertDataSTR($aLicenca_Infor['REVOGADO']) > MKTIME(0,0,0,1,1,2000);
         $bLic_Revogado = True;
      }
      $bContinua = ( $bValidade_Final && ( ! $bLic_Revogado ) );
      $nNumero_da_Linha += 26;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Licença vencida ou revogada ('.($nNumero_da_Linha).')'; }
   }
   If ( $bContinua ) {
      $sSerie_Software  = '';
      $aLista_Softwares = $aLicenca_Infor['SOFTWARES'];
      ForEach( $aLista_Softwares As $sIndice => $aItem_Software ) {
         If ( ($aItem_Software['CODIGO']+0) == $nApl_CodigoInt ) {
            // Trava por n�mero de S�rie do HD
            If ( ISSET($aItem_Software['TRV_HD']) ) {
               If ( EMPTY($sSerie_TravaHD) ) { CONTINUE; }
               If ( $aItem_Software['TRV_HD']==$sSerie_TravaHD ) {
                  $sSerie_Software  = $sIndice;
                  BREAK;
               }
            // Trava por IP P�blico no sistema Linux
            } ElseIf ( ISSET($aItem_Software['TRV_IP_PUB_LX']) ) {
               If ( (! $bLocal_OS_Linux) OR EMPTY($sIP_Pub_Remoto) ) { CONTINUE; }
               If ( $aItem_Software['TRV_IP_PUB_LX']==$sIP_Pub_Remoto ) {
                  $sSerie_Software  = $sIndice;
                  BREAK;
               }
            //
            } Else {
               //$sSerie_Software  = $sIndice;
               //BREAK;
            }
         }
      }
      $bContinua = (! EMPTY($sSerie_Software) );
      $nNumero_da_Linha += 30;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Licença incompatível com ou software ou estação ('.($nNumero_da_Linha).')'; }
   }
   //
   If ( $bContinua ) {
      $aD_Assinatura = @$aLicenca_Infor['ASSINATURA'];
      $bContinua =
        ! ( EMPTY($aD_Assinatura) OR
          EMPTY($aD_Assinatura['TIPO_CRIPT']) OR
          EMPTY($aD_Assinatura['TIPO_HASH'])  OR
          EMPTY($aD_Assinatura['DATA']) OR
          EMPTY($aD_Assinatura['HORA'])
          );
      $nNumero_da_Linha += 13;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Informações da assinatura inválidos ('.($nNumero_da_Linha).')'; }
   }
   If ( $bContinua ) {
      $nDt_Emissao = ConvertDataSTR($aLicenca_Infor['EMISSAO']);
      $nDt_Assinad = ConvertDataSTR($aD_Assinatura['DATA']);
      $nDt_Atual   = MKTIME(0,0,0);
      $bContinua = ($nDt_Emissao <= $nDt_Atual && $nDt_Assinad <= $nDt_Atual && $nDt_Emissao <= $nDt_Assinad );
      $nNumero_da_Linha += 8;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Informações da assinatura não confere ('.($nNumero_da_Linha).')'; }
   }
   If ( $bContinua ) {
      $vChavePublica_Lib = @OPENSSL_PKEY_GET_PUBLIC($sChave_Publica_Simsoft);
      $aChavePublica_Dat = @OPENSSL_PKEY_GET_DETAILS($vChavePublica_Lib);
      $bContinua = @$aChavePublica_Dat['bits']>0;
      $sTipo_Cript_Padrao = '';
      If ( $bContinua ) {
         $sTipo_Cript_Padrao = 'RSA,'.@$aChavePublica_Dat['bits'];
      }
      $nNumero_da_Linha += 11;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Chaves não confere ('.($nNumero_da_Linha).')'; }
   }
   If ( $bContinua ) {
      $bContinua = ( $aD_Assinatura['TIPO_CRIPT'] == $sTipo_Cript_Padrao );
      $nNumero_da_Linha += 5;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Algoritimo da assinatura não confere com o padrão ('.($nNumero_da_Linha).')'; }
   }
   If ( $bContinua ) {
      $s_Tipo_Hash = @$aD_Assinatura['TIPO_HASH'];
      $n_Tipo_Hash = LicSft_Licenca_Str_Cod_Hash($s_Tipo_Hash);
      $bContinua = ( $n_Tipo_Hash > 0 );
      $nNumero_da_Linha += 7;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Algoritimo hash da assinatura desconhecido ('.($nNumero_da_Linha).')'; }
   }
   If ( $bContinua ) {
      $a_Retorno['TIPO_HASH'] = $s_Tipo_Hash;
      $sAssinatura = HEX2BIN($sAssinatura_Hex);
      $bContinua = OPENSSL_VERIFY($sLicenca_Infor, $sAssinatura, $vChavePublica_Lib, $n_Tipo_Hash );
      @OPENSSL_FREE_KEY($vChavePublica_Lib);
      $nNumero_da_Linha += 8;
      If ( ! $bContinua ) { $a_Retorno['MSG_ERRO'] = 'Assinatura não confere ('.($nNumero_da_Linha).')'; }
   }
   //
   $a_Retorno['VALIDA'] = $bContinua>0;
   //
   Return $a_Retorno;
}
//
Function LicSft_Licenca_Str_Cod_Hash($s_Tipo_Hash) {
   $s_Tipo_Hash = STRTOUPPER($s_Tipo_Hash);
   SWITCH ( $s_Tipo_Hash ) {
     CASE 'SHA512' :
       Return ( OPENSSL_ALGO_SHA512 );
       BREAK;
       //
     CASE 'SHA256' :
       Return ( OPENSSL_ALGO_SHA256 );
       BREAK;
       //
     CASE 'MD5' :
       Return ( OPENSSL_ALGO_MD5 );
       BREAK;
       //
     DEFAULT :
       Return -1;
       //
   }
}
//
function Obter_NSerie_Hardware( $nOpcao=0 ) {
  // wmic memorychip get serialnumber                                            // Serial das memórias
  // wmic baseboard get serialnumber                                             // Serial da Placa mãe
  // wmic DISKDRIVE GET Index, SerialNumber, Model, Size, Status, MediaType      // Serial do HD
  // wmic logicaldisk get name,volumeserialnumber, size, systemname              // Serial do volume da unidade
  $sRetorno = '';
  $sCaminho_WMic = GETENV('SystemRoot').'\System32\wbem\wmic.exe';
  If ( FILE_EXISTS($sCaminho_WMic) ) {
     If ( $nOpcao==0 ) {
        $sNumero_Serie = SHELL_EXEC($sCaminho_WMic.' DISKDRIVE GET Index, SerialNumber');
        $sNumero_Serie = STR_REPLACE(CHR(10),'',$sNumero_Serie);
        $aTmp = EXPLODE(CHR(13) ,$sNumero_Serie);
        If ( EMPTY($aTmp[1]) ) {  Return '';  }
        $sTmp = SUBSTR(@$aTmp[1],5);
        $sTmp = STR_REPLACE(' ','',$sTmp);
        If ( STRLEN($sTmp)>35 ) {
           $sTmp = SUBSTR($sTmp, STRLEN($sTmp)-20 );
        }
        $sRetorno = $sTmp;
        //
     } ElseIf ( $nOpcao==90 ) {
        $sNumero_Serie = SHELL_EXEC($sCaminho_WMic.' logicaldisk get name,size,volumeserialnumber');
        $sNumero_Serie = STR_REPLACE(CHR(10),'',$sNumero_Serie);
        $aLinhas = EXPLODE(CHR(13) ,$sNumero_Serie);
        If ( EMPTY($aLinhas[1]) ) {  Return '';  }
        $sVolumeAtual = STRTOUPPER(SUBSTR($sCaminho_WMic,0,2));
        ForEach( $aLinhas As $nIndice => $sLinha ) {
           $aLinha = preg_split('/ /', @$sLinha, null, PREG_SPLIT_NO_EMPTY);
           If ( $nIndice==0 ) {
              If ( ! ( STRTOUPPER(@$aLinha[0])=='NAME' && STRTOUPPER(@$aLinha[1])=='SIZE' && STRTOUPPER(@$aLinha[2])=='VOLUMESERIALNUMBER' ) ) {
                 Break;
              }
           } Else {
              If ( STRTOUPPER(@$aLinha[0])==$sVolumeAtual && (!EMPTY($aLinha[1])) && (!EMPTY($aLinha[2])) ) {
                 $sRetorno = 'VOL-'.$aLinha[2].'-'.$aLinha[1];
                 Break;
              }
           }
        }
        //
     }
  }
  Return $sRetorno;
}
// ***
//
//
Function C_Sicore_EnviarSMS( $aNumeroD, $s_Mensagem, $s_Rotulo ) {
   $bHouve_Erro = False;
   $sMensagem_Trava = '';
   $bGravarReg  = True;
   $bTrava      = False;
   $sChaveS = "v3X4CGjiOlXdaZUqnHVhHd63lQolLdRlInee";
   $s_Endereco_URL = 'https://seguro.andertec.com.br/Sicore/Sicore_Api.php';
   $sVencimento = '';
   //$s_Mensagem = STR_REPLACE( CHR(13), '<br>', $s_Mensagem);
   //$s_Mensagem = STR_REPLACE( CHR(10), ''    , $s_Mensagem);
   

   $a_Mensagens = ARRAY();
   //
   $nContador = 50;
   ForEach( $aNumeroD As $v_Indice => $sCli_NumCel ) {   
   
      $a_Mensagens[$nContador] = ARRAY( "DST_NUMERO_SIM" => $sCli_NumCel,'SMS_ROTULO_TXT' => $s_Rotulo,'MENSAGEM_TEXTO' => $s_Mensagem ) ;
	  $nContador++;
   }
    $a_Dados_Post = 
      ARRAY(
       'Acm' => 'SMS_ENVIAR',
       'Key' => $sChaveS,
       'Prm' => JSON_ENCODE($a_Mensagens)
	  );

   //echo "<script>alert(".JAVA_CharCode(VAR_EXPORT($a_Dados_Post,True)).");</script>";
   $a_Dados = ComunicaUrl( $s_Endereco_URL, $a_Dados_Post );
   
   If ($a_Dados[1]>=400) {
	  $bHouve_Erro = True;
	    $sMensagem_Trava = 'Erro '.$a_Dados[1].': Caminho inv�lido Sicore_Api ou retorno em branco';
   } ElseIf ( EMPTY($a_Dados[0]) OR SUBSTR($a_Dados[0],0,1)<>"{" ) {
	    $bHouve_Erro = True;
	    $sMensagem_Trava = 'Erro desconhecido';
   } Else {  
	    $a_DadosR = @JSON_DECODE($a_Dados[0],True);
	    //echo "<script>alert(".JAVA_CharCode(VAR_EXPORT($a_DadosR,True)).");</script>";
		//
	    ForEach ($a_DadosR as $nIndice=>$aItem){
           //echo "<script>alert(".JAVA_CharCode(VAR_EXPORT($aItem[$nIndice],True)).");</script>";
		   If ( ISSET($aItem["ERRO"]) ) {
			 $bHouve_Erro = True;
	         $sMensagem_Trava .= $a_Mensagens[$nIndice]['DST_NUMERO_SIM'].';';
		   }	
		
		}	
		
		
		
		//If ( ISSET($a_DadosR["Erro"]) ) {
	    //   $bHouve_Erro = True;
	    //   $sMensagem_Trava = 'Erro '.@$a_DadosR["Erro"]["CODIGO"].' : '.@$a_DadosR["Erro"]["DESCRI"];
	    
		
		
		
		//} Else {
	     //$_SESSION['CodInt']= $sReg_Atv['ATV_CODIGOINT'];
		 
		 
		 //$CodInt = @$a_DadosR["Retorno"];
		 //echo "<script>alert('".$CodInt."');</script>";
	   //}
   }	   

   //if ($bHouve_Erro) {
	// return( HTMLENTITIES( $sMensagem_Trava,ENT_QUOTES,'utf-8' ));
   //} Else {
	//   return(@$a_DadosR);
 	//}
   Return ARRAY( @$a_DadosR , $sMensagem_Trava );

}



?>