public int EfetuarResgate(int clienteID, int usuarioID, int assinaturaTipoID)
        {
            try
            {
                string sql = string.Format(
                    @"
                        SELECT
                            DISTINCT bi.ID, bi.ClienteID
                        FROM tAssinaturaBancoIngressoResgate bir (NOLOCK)
                        INNER JOIN tAssinaturaBancoIngresso bi (NOLOCK) ON bi.ID = bir.AssinaturaBancoIngressoID                
                        INNER JOIN tAssinatura asn (NOLOCK) ON asn.ID = bi.AssinaturaID
                        WHERE bir.ClienteID = {0} AND asn.AssinaturaTipoID = {1}", clienteID, assinaturaTipoID
                    );

                List <int> ids        = new List <int>();
                List <int> idsCredito = new List <int>();

                if (!bd.Consulta(sql).Read())
                {
                    throw new Exception("Não existem ingressos a serem resgatados, caso você já tenha efetuado a ação de resgate, por favor, verifique os comprovantes.");
                }

                int clienteID_aux = 0;
                do
                {
                    clienteID_aux = bd.LerInt("ClienteID");

                    if (clienteID_aux != 0)
                    {
                        if (clienteID_aux == clienteID)
                        {
                            throw new Exception("Você já efetuou a ação de resgate dos seus ingressos, por favor, verifique os comprovantes.");
                        }
                        else
                        {
                            throw new Exception("Um dos ingressos a serem resgatados já está vinculado a outro cliente, não será possível continuar, por favor, tente resgatar os ingressos novamente.");
                        }
                    }
                    ids.Add(bd.LerInt("ID"));
                } while (bd.Consulta().Read());

                bd.FecharConsulta();

                sql = "SELECT DISTINCT TOP " + ids.Count + " bic.ID FROM tAssinaturaBancoIngressoCredito bic "
                      + "INNER JOIN tAssinaturaAno ano (NOLOCK) ON ano.ID = bic.AssinaturaAnoID INNER JOIN tAssinatura asn(NOLOCK) ON asn.ID = ano.AssinaturaID "
                      + "WHERE bic.ClienteID = " + clienteID + " AND bic.Utilizado = 'F' AND asn.AssinaturaTipoID = " + assinaturaTipoID;

                if (!bd.Consulta(sql).Read())
                {
                    throw new Exception("Você não possui créditos para finalizar o processo de resgate.");
                }

                do
                {
                    idsCredito.Add(bd.LerInt("ID"));
                } while (bd.Consulta().Read());

                if (idsCredito.Count < ids.Count)
                {
                    throw new Exception("Seu saldo de crédito atual é de: " + idsCredito.Count + ", não será possível efetuar o resgate de: " + ids.Count + " ingresso(s)");
                }

                bd.FecharConsulta();

                bd.IniciarTransacao();

                this.ClienteID.Valor = clienteID;
                this.UsuarioID.Valor = usuarioID;
                this.Timestamp.Valor = DateTime.Now;
                this.Acao.Valor      = ((char)AcaoComprovante.Resgatar).ToString();
                this.Inserir(bd);

                AssinaturaBancoIngressoHistorico oHistorico = new AssinaturaBancoIngressoHistorico();

                foreach (var id in ids)
                {
                    if (bd.Executar(string.Format("UPDATE tAssinaturaBancoIngresso SET ClienteID = {0} WHERE ID = {1} AND ClienteID = 0", clienteID, id)) != 1)
                    {
                        throw new Exception("Um dos ingressos a serem resgatados já está vinculado a outro cliente, não será possível continuar, por favor, tente resgatar os ingressos novamente.");
                    }

                    int creditoID = idsCredito.FirstOrDefault();

                    bd.Executar("UPDATE tAssinaturaBancoIngressoCredito SET Utilizado = 'T' WHERE ID = " + creditoID + " AND ClienteID = " + clienteID + " AND Utilizado = 'F'");

                    oHistorico.Limpar();
                    oHistorico.AssinaturaBancoIngressoID.Valor            = id;
                    oHistorico.AssinaturaBancoIngressoCreditoID.Valor     = creditoID;
                    oHistorico.AssianturaBancoIngressoComprovanteID.Valor = this.Control.ID;
                    oHistorico.Inserir(bd);

                    idsCredito.Remove(creditoID);
                }

                bd.Executar("DELETE bir FROM tAssinaturaBancoIngressoResgate bir(NOLOCK) "
                            + "INNER JOIN tAssinaturaBancoIngresso bic (NOLOCK) ON bir.AssinaturaBancoIngressoID = bic.ID "
                            + "INNER JOIN tAssinatura asn(NOLOCK) ON asn.ID = bic.AssinaturaID "
                            + "WHERE bir.ClienteID = " + clienteID + " AND asn.AssinaturaTipoID = " + assinaturaTipoID);

                bd.FinalizarTransacao();

                return(this.Control.ID);
            }
            catch (Exception ex)
            {
                bd.DesfazerTransacao();
                throw ex;
            }
            finally
            {
                bd.Fechar();
            }
        }
        public int EfetuarDoacao(List <int> ingressos, int clienteID, int usuarioID)
        {
            try
            {
                bd.BulkInsert(ingressos, "#tmpIngressos", false, true);
                List <int> bancoIngressoID = new List <int>();

                bd.Consulta(
                    @"
                            SELECT 
                                bi.ID
                            FROM tAssinaturaBancoIngresso bi (NOLOCK)
                            INNER JOIN #tmpIngressos ti ON ti.ID = bi.IngressoID 
                            WHERE bi.ClienteID = " + clienteID);

                if (!bd.Consulta().Read())
                {
                    throw new Exception("Os ingressos selecionados não estão associados a você, caso já tenha efetuado a ação de doação ou devolução, por favor, verifique os comprovantes.");
                }

                do
                {
                    bancoIngressoID.Add(bd.LerInt("ID"));
                } while (bd.Consulta().Read());
                bd.FecharConsulta();

                if (bancoIngressoID.Count != ingressos.Count)
                {
                    throw new Exception("Um dos ingressos selecionados não está associado a você, caso já tenha efetuado a ação de doação ou devolução, por favor, verifique os comprovantes.");
                }

                bd.IniciarTransacao();



                this.ClienteID.Valor = clienteID;
                this.UsuarioID.Valor = usuarioID;
                this.Timestamp.Valor = DateTime.Now;
                this.Acao.Valor      = ((char)AcaoComprovante.Doar).ToString();
                this.Inserir(bd);

                AssinaturaBancoIngressoHistorico oHistorico = new AssinaturaBancoIngressoHistorico();
                AssinaturaBancoIngressoCredito   oCredito   = new AssinaturaBancoIngressoCredito();

                foreach (var bancoIngresso in bancoIngressoID)
                {
                    if (bd.Executar(string.Format("UPDATE tAssinaturaBancoIngresso SET ClienteID = 0 WHERE ID = {0} AND ClienteID = {1}", bancoIngresso, clienteID)) != 1)
                    {
                        throw new Exception("Não foi possível efetuar a ação de doação de um dos ingressos selecionados, caso já tenha efetuado sua ação de doação ou devolução, por favor, verifique os comprovantes.");
                    }
                    bd.Consulta(string.Format(
                                    @"Select ID FROM tAssinaturaAno where AssinaturaID = (Select TOP 1 AssinaturaID from tAssinaturaBancoIngresso(NOLOCK) where ID = {0})
                          AND Ano = (Select TOP 1 Ano from tAssinaturaBancoIngresso(NOLOCK) where ID = {0})", bancoIngresso));

                    if (!bd.Consulta().Read())
                    {
                        throw new Exception("O item no banco de ingresso não possui uma assinatura ano vinculada");
                    }

                    int assinaturaAnoID = bd.LerInt("ID");
                    bd.FecharConsulta();

                    oHistorico.Limpar();
                    oCredito.Limpar();

                    oCredito.ClienteID.Valor       = clienteID;
                    oCredito.Utilizado.Valor       = false;
                    oCredito.AssinaturaAnoID.Valor = assinaturaAnoID;
                    oCredito.Inserir(bd);



                    oHistorico.AssinaturaBancoIngressoID.Valor            = bancoIngresso;
                    oHistorico.AssinaturaBancoIngressoCreditoID.Valor     = oCredito.Control.ID;
                    oHistorico.AssianturaBancoIngressoComprovanteID.Valor = this.Control.ID;
                    oHistorico.Inserir(bd);
                }

                bd.FinalizarTransacao();

                return(this.Control.ID);
            }
            catch (Exception ex)
            {
                bd.DesfazerTransacao();
                throw ex;
            }
            finally
            {
                bd.Fechar();
            }
        }
 // passar o Usuario logado no sistema
 public AssinaturaBancoIngressoHistoricoLista_B()
 {
     assinaturaBancoIngressoHistorico = new AssinaturaBancoIngressoHistorico();
 }