public function AtualizaPermissoesUsuario($arrayValores, $Usuario) {
	$trans = parent:: criaTransacao();
	$String = new CString();
	$Usuario = $String->descriptografa($Usuario);
	$erro = false;

	$sql = "DELETE FROM F_REL_USUARIO_ACESSO_MENU WHERE CHAVE_USER = $Usuario";
	if (parent::execute_query_trans($trans, $sql)) {
	    for ($i = 0; $i < count($arrayValores); $i++){
		$sqlInsert = "INSERT INTO F_REL_USUARIO_ACESSO_MENU (CHAVE_USER, F_ACESSO_MENU_ID) VALUES ($Usuario," . $String->descriptografa($arrayValores[$i]) . ")";
		if (!parent::execute_query_trans($trans, $sqlInsert)) {
		    $erro = true;
		    break;
		}
	    }
	} else {
	    $erro = true;
	}
	if (!$erro) {
	    parent::gravaTrasacao($trans);
	    return true;
	} else {
	    parent::rollbackTransacao($trans);
	    return false;
	}
    }
    Public function AtualizaDadosRemessa($transacaoAtiva, $codigoSequencial, $CodConta, $NomeArquivo) {

	$data_atual = date("Y-m-d H:i:s");
	$id_usuario = $_SESSION["id_usuario"];
	//Insere os dados da remessa gerada
	$SequencialRemessa = parent::incrementaGenerator("GEN_F_GERACAO_REMESSA_ID");

	$sql_atualiza_dados_remessa = "
		INSERT INTO F_GERACAO_REMESSA 
		(
			F_GERACAO_REMESSA_ID,
			DATA_GERACAO,
			NOME_ARQUIVO, 
			CODIGO_REMESSA, 
			CHAVE_USER
		)
		VALUES 
		(
		 $SequencialRemessa,
		'$data_atual', "
		. "'$NomeArquivo', "
		. "'$codigoSequencial', "
		. "$id_usuario
		)";
	if (parent::execute_query_trans($transacaoAtiva, $sql_atualiza_dados_remessa)) {
	    if (parent::gravaTrasacao($transacaoAtiva)) {
		return TRUE;
	    } else {
		parent::rollbackTransacao($transacaoAtiva);
		return FALSE;
	    }
	}
    }
    public function DesagrupaLancamentos($CodAgrupamento) {

	$trans = parent::criaTransacao();


	//Verifica se todos os lançamentos contidos no agrupamentos encontram-se em aberto
	$sqlVerificaStatus = ""
		. "SELECT DISTINCT "
		. "F_STATUS_FINANCEIRO_ID  AS STATUS"
		. " FROM F_LANCA_CR"
		. " WHERE F_AGRUPAMENTO_CR_ID = $CodAgrupamento";

	$Result = parent::execute_query_trans($trans, $sqlVerificaStatus);

	$linha = parent::criaObjetoConsulta($Result);

	if ($linha->STATUS != 1)
	    return $this->setMotivoErro("Lançamento não encontra-se aberto");


	$SqlDeletaParcelamento = "DELETE FROM F_AGRUPAMENTO_CR F WHERE F.F_AGRUPAMENTO_CR_ID = $CodAgrupamento";

	if (parent::execute_query_trans($trans, $SqlDeletaParcelamento)) {
	    parent::gravaTrasacao($trans);
	    return true;
	} else {
	    parent::rollbackTransacao($trans);
	    return $this->setMotivoErro("Não foi possível concluir a operação");
	}
    }
    public function GravaAgrupamento($TransacaoCodigoTipoOp, $Cliente, $ValorTotal, $commit = true, $TransacaoFiltro = false) {
	//Parametro $TransacaoCodigoTipoOp = Array
	//0 -> Código do Lançamento
	//1 -> $Transacao



	if (!$TransacaoFiltro) {
	    $this->VerificaListaLancamentos(FALSE);
	} else {
	    $this->VerificaListaLancamentos(FALSE, FALSE, $TransacaoFiltro);
	}


	$this->VerificaCriteriosAgrupamento($ValorTotal);


	$Transacao = $TransacaoCodigoTipoOp[1];
	$CodParcelamento = $TransacaoCodigoTipoOp[3];

	$CodAgrupamento = parent::incrementaGenerator("GEN_F_AGRUPAMENTO_CR_ID");


	$sqlInsert = "INSERT INTO F_AGRUPAMENTO_CR (F_AGRUPAMENTO_CR_ID, EMPRESA_ID, VLR_TOTAL) VALUES ($CodAgrupamento, $Cliente, '$ValorTotal')";

	if (parent::execute_query_trans($Transacao, $sqlInsert)) {

	    //Atualiza o lançamento agrupado, referenciado-o ao agrupamento gerado

	    $SqlAtualizaLancamentoGerado = "UPDATE F_LANCA_CR SET F_REF_LANCAMENTO_AGRUPADO = $CodAgrupamento WHERE COD_PARCELAMENTO = $CodParcelamento";

	    if (!parent::execute_query_trans($Transacao, $SqlAtualizaLancamentoGerado)) {
		return false;
		exit();
	    }

	    $ArrayRegistros = unserialize($_SESSION['ArrayAgrup']);
	    $ArrayRegistros = $ArrayRegistros->getListaLancamentos();
	    foreach ($ArrayRegistros as $contas){
		$sqlUpdate = "UPDATE F_LANCA_CR SET F_AGRUPAMENTO_CR_ID = $CodAgrupamento WHERE F_LANCA_CR_ID = " . $contas->getConta_receber_id();
		if (!parent::execute_query_trans($Transacao, $sqlUpdate)) {
		    parent::rollbackTransacao($Transacao);
		    break;
		    return false;
		}
	    }
	    if ($commit) {
		parent::gravaTrasacao($Transacao);
	    }
	    return true;
	} else {
	    json_encode(array('A' => 0, 'B' => 'Falha ao relizar a opereção, tente novamente!'));
	    exit();
	    parent::rollbackTransacao($Transacao);
	    $this->setMotivoErro("Não foi possível registrar o agrupamento!");
	    return FALSE;
	}
    }
    public function EfetuaSaqueDeposito($dataUsu, $DataOperacao, $Valor, $TipoOp, $idUsuario, $conta, $descricao, $Centro_receita, $Categoria, $Trasacao = false) {

	$CodOperacao = parent::incrementaGenerator("GEN_F_DEPOSITO_SAQUE_ID");

	//Verifica se está realizado saque ou depósito
	if ($TipoOp == "+") {
	    $Operacao = "C";
	    $NomeOperacao = "DEPOSITO";
	} else {
	    $Operacao = "D";
	    $NomeOperacao = "SAQUE";
	}

	$sql = "INSERT INTO F_DEPOSITO_SAQUE 
		(  
		   F_DEPOSITO_SAQUE_ID, 
		   DATA_USUARIO, 
		   DATA_OPERACAO, 
		   VALOR, 
		   TIPO_OPERACAO, 
		   CHAVE_USER,
		   OBSERVACAO,
		   BANCO_ID,
		   GRUPO_CAIXA_ID,
		   SUBCATEGORIA_ID
		) 
		   VALUES 
	       (
		   $CodOperacao, 
		   '$dataUsu', 
		   '$DataOperacao', 
		   '$Valor',
		   '$Operacao', 
		   $idUsuario,
		   '$descricao',
		   $conta,
		   $Centro_receita,
		   $Categoria    	
	       )";
	$trans = parent::criaTransacao();
	if (parent::execute_query_trans($trans, $sql)) {

	    if ($this->AtualizaSaldoConta($Valor, $TipoOp, $conta, $trans, "$NomeOperacao", $CodOperacao)) {
		if ($Trasacao) {
		    return $_POST["CodIdTransacao"] = array($CodOperacao, $trans, "DEPOSITO");
		} else {
		    parent::gravaTrasacao($trans);
		    return true;
		}
	    } else {
		if (!$Trasacao)
		    parent::rollbackTransacao($trans);
		return false;
	    }
	}
    }
    public function RegistraFechamento($FormaPagamento, $Dia, $TransacaoCodigoTipoOp, $CodCaixa = null) {
	//Parametro $TransacaoCodigoTipoOp = Array
	//0 -> Código do Lançamento
	//1 -> $Transacao
	//2 -> Tipo Operação (CR = CONTAS A RECEBER, DEPOSITO = DEPOSITO)

	$Cod = parent::incrementaGenerator("GEN_F_CONSOLIDACAO_DIA_ID");

	$CampoInsert = $TransacaoCodigoTipoOp[2] == "CR" ? "F_LANCA_CR_ID" : "F_DEPOSITO_SAQUE_ID";

	//Caso seja forma de pagamento cheque, atualiza somente o registro referente ao lançamento no caixa

	$StringCheque = $CodCaixa == 0 ? "" : "AND CAIXA.CAIXA_ID = $CodCaixa";

	$SqlInsert = "INSERT INTO F_CONSOLIDACAO_DIA (F_CONSOLIDACAO_DIA_ID, DIA_MOVIMENTACAO, $CampoInsert) "
		. "VALUES ($Cod, '$Dia', $TransacaoCodigoTipoOp[0])";

	if (parent::execute_query_trans($TransacaoCodigoTipoOp[1], $SqlInsert)) {
	    $Update = "UPDATE CAIXA SET F_CONSOLIDACAO_DIA_ID = $Cod WHERE FORMA_PAGAMENTO = '$FormaPagamento' AND (CAST(DATA AS DATE) = '$Dia') $StringCheque";
	    if (parent::execute_query_trans($TransacaoCodigoTipoOp[1], $Update)) {
		parent::gravaTrasacao($TransacaoCodigoTipoOp[1]);
		return true;
	    } else {
		parent::rollbackTransacao($TransacaoCodigoTipoOp[1]);
		return FALSE;
	    }
	} else {
	    parent::rollbackTransacao($TransacaoCodigoTipoOp[1]);
	    return false;
	}
    }
    public function AlteraLancamento($NumeroNF, $idCp, $valor, $vencimento, $codFor, $Resumo, $data, $id_usuario, $id_cc, $filial, $categoria, $centroDespesa, $FormaPagamento, $NumCheque) {

	$idCp2 = parent::incrementaGenerator("GEN_F_LANCA_CP2_ID");

//Recupera o código da parcela
	$NumParcela = parent::RecuperaCampo("NUM_PARCELA", "F_LANCA_CP2", "F_LANCA_CP", $idCp);

//Recupera o código do parcelamento
	$CodParcelamento = parent::RecuperaCampo("COD_PARCELAMENTO_PAI", "F_LANCA_CP2", "F_LANCA_CP", $idCp);

	$sql1 = "UPDATE F_LANCA_CP F SET 
		FORNECEDOR_ID = $codFor, 
		RESUMO = '$Resumo',
		BANCO_ID = $id_cc,
		SUBCATEGORIA_ID = $categoria,
		COD_FILIAL_ID = $filial,
		GRUPO_CAIXA = $centroDespesa,
		F_FORMA_PAGAMENTO_ID = $FormaPagamento,
		NUMERO_NF = '$NumeroNF',
		NUM_CHEQUE = $NumCheque    
		WHERE F_LANCA_CP_ID = $idCp";

	$sql2 = "INSERT INTO F_LANCA_CP2 
		    (
			F_LANCA_CP2_ID, 
			F_LANCA_CP, 
			VALOR, 
			DATA_VENCIMENTO,
			DATA_ALTERACAO,
			ACAO_EDITAR,
			USUARIO_EDICAO,
			NUM_PARCELA,
			COD_PARCELAMENTO_PAI
		    ) 
		    VALUES
		    (
			$idCp2, 
			$idCp, 
			'$valor', 
			'$vencimento',
			'$data',
			'S',
			$id_usuario,
			$NumParcela,
			$CodParcelamento    
		    );";

	$trans = parent::criaTransacao();

	if (parent::execute_query_trans($trans, $sql1)) {
	    if (parent::execute_query_trans($trans, $sql2)) {
		parent::gravaTrasacao($trans);
		return TRUE;
	    } else {
		parent::rollbackTransacao($trans);
		return FALSE;
	    }
	}
    }
    private function GerenciaTransacaoOperacao() {

	$Cfiltro = new ModelFiltro();

	//Grava o filtro anterior
	$Cfiltro->GravaFiltrosUsuario($_SESSION["id_usuario"], "FILTRO_CR", $this->getSqlFiltroAnterior(), $this->getLabelAnterior(), $this->getTransacao());

	if (!$this->getStatusOperacao()) {
	    parent::gravaTrasacao($this->getTransacao());
	    return true;
	}

	parent::rollbackTransacao($this->getTransacao());
	return false;
    }