private void btnAumentarTempo_Click(object sender, RoutedEventArgs e)
        {
            if (this.lstServicos.SelectedItems.Count == 0)
            {
                return;
            }

            Agendamento agd = (Agendamento)this.lstServicos.SelectedItem;

            if (this.TempoMaxProxAtendimento > -1 && 10 > this.TempoMaxProxAtendimento)
            {
                Mensagens.ExibirMensagemAlerta(this, string.Format("Não é possível aumentar mais o tempo. Existem apenas {0} minutos disponíveis!", this.TempoMaxProxAtendimento));
                return;
            }

            if ((agd.TempoAtendimento + 10) > 30)
            {
                Mensagens.ExibirMensagemAlerta(this, "Não é possível aumentar mais o tempo. O tempo de atendimento máximo é 30min!");
                return;
            }

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

            this.TempoMaxProxAtendimento -= 10;
            agd.TempoAtendimento += 10;
            Persistencia.PersistenciaAtendimento.AtualizarAgendamento(agd);

            Log.RegistrarMensagemLog("Agendamento do serviço " + agd.ServicoAgendado.Nome + " para o clente " + this.AtendimentoCliente.Cliente.Nome + " foi ajustado com um tempo maior!");

            if (PersistenciaParametrizacao.ObterValorParametro("IDENTOPERADORAGENDAMENTO").Equals("S"))
            {
                this.GravarRegistroAlteracao(this.AtendimentoCliente,
                    windowIdentificacao.OperadorIdentificado.Codigo,
                    windowIdentificacao.OperadorIdentificado.Nome,
                    string.Format("AUMENTOU O TEMPO DO SERVIÇO."),
                    agd);
            }

            this.CarregarItensNaLista();
        }
        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!");
        }
        private void btnExcluir_Click(object sender, RoutedEventArgs e)
        {
            if (this.lstServicos.SelectedItems.Count == 0)
            {
                return;
            }

            if (this.lstServicos.Items.Count == 1)
            {
                Mensagens.ExibirMensagemAlerta(this, "Um atendimento deve possuir no mínimo UM serviço.");
                return;
            }

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

            Agendamento agd = (Agendamento)this.lstServicos.SelectedItem;
            Persistencia.PersistenciaAtendimento.ExcluirAgendamento(agd);

            this.AtendimentoCliente.Agendamentos.Remove(agd);

            Log.RegistrarMensagemLog("Agendamento do serviço " + agd.ServicoAgendado.Nome + " para o clente " + this.AtendimentoCliente.Cliente.Nome + " foi removido!");

            if (PersistenciaParametrizacao.ObterValorParametro("IDENTOPERADORAGENDAMENTO").Equals("S"))
            {
                this.GravarRegistroAlteracao(this.AtendimentoCliente,
                    windowIdentificacao.OperadorIdentificado.Codigo,
                    windowIdentificacao.OperadorIdentificado.Nome,
                    string.Format("EXCLUSÃO DO SERVIÇO."),
                    agd);
            }

            this.CarregarItensNaLista();
        }
        private async void btnCadastro_Click(object sender, RoutedEventArgs e)
        {
            if (!this.maskedTextBox.IsMaskCompleted)
            {
                Mensagens.ExibirMensagemAlerta(this, "O telefone do cliente deve ser preenchido!");
            }

            if (String.IsNullOrEmpty(this.txtNome.Text) || String.IsNullOrWhiteSpace(this.txtNome.Text))
            {
                Mensagens.ExibirMensagemAlerta(this, "O nome do cliente deve ser preenchido!", this.txtNome);
                return;
            }

            if (this.lstServicosSelecionados.Items.Count == 0)
            {
                Mensagens.ExibirMensagemAlerta(this, "Pelo menos um serviço deve ser selecionado!");
                return;
            }

            this.Atendimento = ObterAtendimento(); //obtem atendimento a partir dos dados da tela            

            if (this.Atendimento.Agendamentos.Where(agd => agd.TempoAtendimento < 30).Count() > 0)
            {
                int qtTempoTotalAtendimento = this.Atendimento.Agendamentos.Sum(agd => agd.TempoAtendimento);

                MetroWindow wnd = ((MetroWindow)this);

                wnd.MetroDialogOptions.ColorScheme = MetroDialogColorScheme.Accented;

                var ret = await ShowMessage(this, string.Format("O tempo total de atendimento para {0} serviço(s) será de {1} minutos. Deseja continuar?",
                    this.Atendimento.Agendamentos.Count(), qtTempoTotalAtendimento), MessageDialogStyle.AffirmativeAndNegative);
                if (ret != MessageDialogResult.Affirmative)
                {
                    return;
                }
            }

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

            if (this.CarregarEstadoAlteracao)
            {
                Persistencia.PersistenciaAtendimento.AtualizarAtendimento(this.Atendimento);
                this.AtualizarAgendamentos(this.Atendimento);
                this.GravarDadosDoCliente(this.Atendimento.Cliente);
                Mensagens.ExibirMensagemAlerta(this, "Alteração realizada com sucesso!");
                if(IdentificarOperador)
                {
                    this.GravarRegistroAlteracao(this.Atendimento, 
                        wident.OperadorIdentificado.Codigo,
                        wident.OperadorIdentificado.Nome,
                        "ALTERAÇÃO REALIZADA PELA TELA DE AGENDAMENTO.");
                }
                return;
            }

            this.Finalizar();
            if (IdentificarOperador)
            {
                this.GravarRegistroAlteracao(this.Atendimento,
                    wident.OperadorIdentificado.Codigo,
                    wident.OperadorIdentificado.Nome,
                    "INCLUSÃO REALIZADA PELA TELA DE AGENDAMENTO.");
            }
        }