public static List<Bloqueio> ObterBloqueioPorData(DateTime Data)
        {
            List<Bloqueio> bloqueios = new List<Bloqueio>();

            OracleConnection conexao = PersistenciaOracle.ObterConexao();
            conexao.Open();

            OracleCommand comando = new OracleCommand("SELECT CODIGO,NOMEATENDENTE,DATA,HORAINICIO,HORAFIM,TIPOBLOQUEIO FROM BLOQUEIO WHERE TRUNC(DATA) = TRUNC(:DATA) and nomeatendente in (select nome from atendente where dtinativacao is null)");
            comando.Parameters.Add("DATA", Data);
            comando.Connection = conexao;

            OracleDataReader leitor = comando.ExecuteReader();
            while(leitor.Read())
            {
                Bloqueio blq = new Bloqueio();
                blq.Codigo = UtilidadePersistencia.ObterValorTratado<int>(leitor["CODIGO"]);
                blq.NomeAtendente = UtilidadePersistencia.ObterValorTratado<String>(leitor["NOMEATENDENTE"]);
                blq.Data = UtilidadePersistencia.ObterValorDateTimeTratado<DateTime>(leitor["DATA"]);
                blq.HoraInicio = UtilidadePersistencia.ObterValorTratado<String>(leitor["HORAINICIO"]);
                blq.HoraFim = UtilidadePersistencia.ObterValorTratado<String>(leitor["HORAFIM"]);
                blq.TipoDoBloqueio = (TipoBloqueio)UtilidadePersistencia.ObterValorTratado<int>(leitor["TIPOBLOQUEIO"]);

                bloqueios.Add(blq);
            }
            conexao.Close();

            return bloqueios;
        }
        public static void ExcluirBloqueio(Bloqueio BloqueioAtendente)
        {
            String comandoSql = @"DELETE FROM BLOQUEIO WHERE CODIGO = :CODIGO";
            OracleConnection conexao = PersistenciaOracle.ObterConexao();
            conexao.Open();
            OracleCommand comando = new OracleCommand(comandoSql);
            comando.Connection = conexao;

            comando.Parameters.Add("CODIGO", BloqueioAtendente.Codigo);
            comando.Prepare();
            comando.ExecuteNonQuery();

            conexao.Close();
        }
        public static void AtualizarBloqueio(Bloqueio BloqueioAtendente)
        {
            String comandoSql = @"UPDATE BLOQUEIO SET HORAFIM = :HORAFIM, TIPOBLOQUEIO = :TIPOBLOQUEIO WHERE CODIGO = :CODIGO";
            OracleConnection conexao = PersistenciaOracle.ObterConexao();
            conexao.Open();
            OracleCommand comando = new OracleCommand(comandoSql);
            comando.Connection = conexao;

            comando.Parameters.Add("HORAFIM", BloqueioAtendente.HoraFim);
            comando.Parameters.Add("TIPOBLOQUEIO", (int)BloqueioAtendente.TipoDoBloqueio);
            comando.Parameters.Add("CODIGO", BloqueioAtendente.Codigo);
            comando.Prepare();
            comando.ExecuteNonQuery();

            conexao.Close();
        }
        public static void GravarBloqueio(Bloqueio BloqueioAtendente)
        {
            int codigo = PersistenciaOracle.ObterProximoCodigo("BLOQUEIO");

            OracleConnection conexao = PersistenciaOracle.ObterConexao();
            conexao.Open();
            OracleCommand comando = new OracleCommand(
                @"INSERT INTO BLOQUEIO(CODIGO,NOMEATENDENTE,DATA,HORAINICIO,HORAFIM,TIPOBLOQUEIO) VALUES(:CODIGO,:NOMEATENDENTE,:DATA,:HORAINICIO,:HORAFIM,:TIPOBLOQUEIO)");
            comando.Connection = conexao;

            comando.Parameters.Add("CODIGO", codigo);
            comando.Parameters.Add("NOMEATENDENTE", BloqueioAtendente.NomeAtendente);
            comando.Parameters.Add("DATA", BloqueioAtendente.Data);
            comando.Parameters.Add("HORAINICIO", BloqueioAtendente.HoraInicio);
            comando.Parameters.Add("HORAFIM", BloqueioAtendente.HoraFim);
            comando.Parameters.Add("TIPOBLOQUEIO", (int)BloqueioAtendente.TipoDoBloqueio);

            comando.ExecuteNonQuery();

            conexao.Close();
        }
        private void btnGravar_Click(object sender, RoutedEventArgs e)
        {
            if(!this.mskHoraFim.IsMaskCompleted)
            {
                Mensagens.ExibirMensagemAlerta(this, "É necessário informar a hora do fim do período!");
                return;
            }

            Regex reg = new Regex("^(?:0?[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$");
            if(!reg.IsMatch(this.mskHoraFim.Text))
            {
                Mensagens.ExibirMensagemAlerta(this, "A hora do fim do período está errada!");
                return;
            }

            String horaFimJornadaTrabalho = "23:00";

            DateTime DtHrBloqueioInicio = DateTime.Parse(this.DataDoBloqueio.ToShortDateString() + " " + HoraInicio);
            DateTime DtHrBloqueioFim = DateTime.Parse(this.DataDoBloqueio.ToShortDateString() + " " + mskHoraFim.Text);
            DateTime DtHrBloqueioFimReal = DtHrBloqueioFim.AddMinutes(-10); //ajustar de acordo com a grid, que sempre mostra o inicio do intervalo de 10min
            DateTime DtHrBloqueioFimJornadaTrab = DateTime.Parse(this.DataDoBloqueio.ToShortDateString() + " " + horaFimJornadaTrabalho);

            if (DtHrBloqueioInicio >= DtHrBloqueioFim)
            {
                Mensagens.ExibirMensagemAlerta(this, "A hora final deve ser maior que a hora inicial!");
                return;
            }

            if(DtHrBloqueioFim > DtHrBloqueioFimJornadaTrab)
            {
                Mensagens.ExibirMensagemAlerta(this, string.Format("A hora final deve ser menor do que as {0} !",horaFimJornadaTrabalho));
                return;
            }

            if(this.Atendimentos != null && this.Atendimentos.Count > 0)
            {
                Atendimento atd = this.Atendimentos.Where(a =>
                            a.DataHoraInicialAtendimento >= DtHrBloqueioInicio &&
                            a.DataHoraInicialAtendimento <= DtHrBloqueioFimReal &&
                            a.NomeAtendente == this.NomeAtendente)
                            .FirstOrDefault();

                if(atd != null && atd != default(Atendimento))
                {
                    Mensagens.ExibirMensagemAlerta(this, "Existe um atendimento agendado dentro do intervalo de bloqueio informado! Por favor informe outro intervalo!");
                    return;
                }
            }

            if(this.Bloqueios != null && this.Bloqueios.Count > 0)
            {
                if(this.ExisteBloqueioNoIntervalo(this.HoraInicio,this.mskHoraFim.Text, this.NomeAtendente))
                {
                    Mensagens.ExibirMensagemAlerta(this, "Já existe um bloqueio dentro do intervalo informado!");
                    return;
                }
            }

            WindowIdentificacao windowIdentificacao = new WindowIdentificacao();
            if (PersistenciaParametrizacao.ObterValorParametro("IDENTOPERADORAGENDAMENTO").Equals("S"))
            {
                windowIdentificacao.ShowDialog();
                if (!windowIdentificacao.AutenticadoComSucesso)
                {
                    return;
                }
            }

            Bloqueio blq = new Bloqueio();
            blq.NomeAtendente = this.NomeAtendente;
            blq.HoraInicio = this.HoraInicio;
            blq.HoraFim = this.mskHoraFim.Text;
            blq.Data = this.DataDoBloqueio;
            blq.TipoDoBloqueio = this.checkBox.IsChecked.GetValueOrDefault() ? TipoBloqueio.Encaixe : TipoBloqueio.Bloqueio;

            if(this.BloqueioSelecionado != null && this.BloqueioSelecionado != default(Bloqueio))
            {
                blq.Codigo = this.BloqueioSelecionado.Codigo;
                PersistenciaBloqueio.AtualizarBloqueio(blq);
            }
            else
            {
                PersistenciaBloqueio.GravarBloqueio(blq);
            }

            if (PersistenciaParametrizacao.ObterValorParametro("IDENTOPERADORAGENDAMENTO").Equals("S"))
            {
                HistoricoAlteracaoAtendimento hist = new HistoricoAlteracaoAtendimento();
                hist.CodigoOperador = windowIdentificacao.OperadorIdentificado.Codigo;
                hist.DataOperacao = DateTime.Now;
                hist.NomeCliente = "BLOQUEIO";
                hist.DescricaoOperacao = "BLOQUEIO DE HORÁRIO DE ATENDIMENTO";
                hist.NomeAtendente = this.NomeAtendente;

                hist.NomeOperador = windowIdentificacao.OperadorIdentificado.Nome;
                hist.DtHoraInicial = DateTime.ParseExact(this.DataDoBloqueio.ToShortDateString() + " " + this.HoraInicio, "dd/MM/yyyy HH:mm", new CultureInfo("pt-BR"));
                Persistencia.PersistenciaHistoricoAlteracao.Gravar(hist);
            }
            Mensagens.ExibirMensagemAlerta(this, "Dados gravados com sucesso!");
        }