public void AlterarSituacao(Titulo titulo, BancoDeDados banco = null, bool validar = true)
        {
            Titulo atualTitulo = _da.ObterSimplificado(titulo.Id);

            bool isGerarNumero = false;
            bool isGerarPdf    = false;

            if (validar)
            {
                if (!_validar.AlterarSituacao(titulo, atualTitulo.Situacao.Id == (int)eTituloSituacao.EmCadastro) || atualTitulo.Situacao.Id == (int)eTituloSituacao.Valido)
                {
                    return;
                }
            }

            #region Configurar Nova Situacao

            //Situação Nova
            switch ((eTituloSituacao)titulo.Situacao.Id)
            {
                #region 3 - Valido

            case eTituloSituacao.Valido:
                if (atualTitulo.Situacao.Id == (int)eTituloSituacao.EmCadastro)
                {
                    isGerarNumero = true;
                    isGerarPdf    = true;
                }
                break;

                #endregion
            }

            #endregion

            #region Numero de Titulo

            if (isGerarNumero)
            {
                titulo.Numero.ReiniciaPorAno = titulo.Modelo.Regra(eRegra.NumeracaoReiniciada);

                if (titulo.Modelo.Regra(eRegra.NumeracaoAutomatica))
                {
                    titulo.Numero.Automatico = true;
                    TituloModeloResposta iniciarEm = titulo.Modelo.Resposta(eRegra.NumeracaoAutomatica, eResposta.InicioNumeracao);
                    titulo.Numero.IniciaEm    = null;
                    titulo.Numero.IniciaEmAno = null;

                    if (iniciarEm != null)
                    {
                        if (iniciarEm.Valor == null || !ValidacoesGenericasBus.ValidarMaskNumeroBarraAno(iniciarEm.Valor.ToString()))
                        {
                            Validacao.Add(Mensagem.Titulo.IniciarEmInvalido);
                            return;
                        }

                        string[] iniciar = iniciarEm.Valor.ToString().Split('/');
                        titulo.Numero.IniciaEm    = Convert.ToInt32(iniciar[0]);
                        titulo.Numero.IniciaEmAno = Convert.ToInt32(iniciar[1]);

                        if (titulo.Numero.IniciaEmAno.GetValueOrDefault() != DateTime.Now.Year)
                        {
                            titulo.Numero.IniciaEm    = null;
                            titulo.Numero.IniciaEmAno = null;
                        }
                    }
                }

                titulo.Numero.Ano = DateTime.Today.Year;
            }

            #endregion

            GerenciadorTransacao.ObterIDAtual();
            using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(banco))
            {
                bancoDeDados.IniciarTransacao();

                _da.DeclaratorioAlterarSituacao(titulo, bancoDeDados);

                #region Atividades

                AtividadeInternoBus atividadeBus = new AtividadeInternoBus();

                #region Título Valido

                if (titulo.Situacao.Id == (int)eTituloSituacao.Valido)
                {
                    if (titulo.Atividades != null && titulo.Atividades.Count > 0)
                    {
                        foreach (Atividade atividade in titulo.Atividades)
                        {
                            if (VerificarDeclaratorioSituacao(atividade, eTituloSituacao.Valido, titulo.EmpreendimentoId.GetValueOrDefault(), bancoDeDados))
                            {
                                atividade.SituacaoId = (int)eAtividadeSituacao.Regular;
                                atividadeBus.AlterarSituacao(atividade, bancoDeDados);
                            }
                        }
                    }
                }

                #endregion

                #region Título Suspenso

                if (titulo.Situacao.Id == (int)eTituloSituacao.SuspensoDeclaratorio)
                {
                    if (titulo.Atividades != null && titulo.Atividades.Count > 0)
                    {
                        foreach (Atividade atividade in titulo.Atividades)
                        {
                            if (VerificarDeclaratorioSituacao(atividade, eTituloSituacao.SuspensoDeclaratorio, titulo.EmpreendimentoId.GetValueOrDefault(), bancoDeDados))
                            {
                                atividade.SituacaoId = (int)eAtividadeSituacao.Suspensa;
                                atividadeBus.AlterarSituacao(atividade, bancoDeDados);
                            }
                        }
                    }
                }

                #endregion

                #region Título Encerrado

                if (titulo.Situacao.Id == (int)eTituloSituacao.EncerradoDeclaratorio)
                {
                    if (titulo.Atividades != null && titulo.Atividades.Count > 0)
                    {
                        foreach (Atividade atividade in titulo.Atividades)
                        {
                            if (VerificarDeclaratorioSituacao(atividade, eTituloSituacao.EncerradoDeclaratorio, titulo.EmpreendimentoId.GetValueOrDefault(), bancoDeDados))
                            {
                                atividade.SituacaoId = (int)eAtividadeSituacao.Irregular;
                                atividadeBus.AlterarSituacao(atividade, bancoDeDados);
                            }
                        }
                    }
                }

                #endregion

                #endregion

                #region Gerar Pdf de Titulo

                ArquivoBus arqBus = new ArquivoBus(eExecutorTipo.Interno);

                if (isGerarPdf && titulo.Modelo.Regra(eRegra.PdfGeradoSistema))
                {
                    TituloInternoBus bus = new TituloInternoBus();

                    titulo.ArquivoPdf.Nome        = "Titulo.pdf";
                    titulo.ArquivoPdf.Extensao    = ".pdf";
                    titulo.ArquivoPdf.ContentType = "application/pdf";
                    titulo.ArquivoPdf.Buffer      = bus.GerarPdf(titulo, bancoDeDados);

                    if (titulo.ArquivoPdf.Buffer != null)
                    {
                        arqBus.Salvar(titulo.ArquivoPdf);

                        ArquivoDa _arquivoDa = new ArquivoDa();
                        _arquivoDa.Salvar(titulo.ArquivoPdf, User.FuncionarioId, User.Name,
                                          User.Login, (int)eExecutorTipo.Interno, User.FuncionarioTid, bancoDeDados);

                        _da.SalvarPdfTitulo(titulo, bancoDeDados);
                    }
                }

                #endregion

                #region Gerar/Enviar Email

                #region Gerar Email

                Email email = null;
                if (titulo.Situacao.Id == (int)eTituloSituacao.Valido && titulo.Modelo.Regra(eRegra.EnviarEmail))
                {
                    if (titulo.Modelo.Resposta(eRegra.EnviarEmail, eResposta.TextoEmail).Valor != null)
                    {
                        string textoEmail = titulo.Modelo.Resposta(eRegra.EnviarEmail, eResposta.TextoEmail).Valor.ToString();

                        if (!String.IsNullOrWhiteSpace(textoEmail))
                        {
                            Dictionary <String, String> emailKeys = new Dictionary <string, string>();

                            emailKeys.Add("[orgão sigla]", _configSys.Obter <String>(ConfiguracaoSistema.KeyOrgaoSigla));
                            emailKeys.Add("[data da conclusão]", titulo.Modelo.Regra(eRegra.Prazo) ? titulo.DataInicioPrazo.DataTexto : titulo.DataEmissao.DataTexto);
                            emailKeys.Add("[nome do modelo]", titulo.Modelo.Nome);
                            emailKeys.Add("[nome do subtipo]", titulo.Modelo.SubTipo);
                            emailKeys.Add("[nº do título]", titulo.Numero.Texto);
                            emailKeys.Add("[nº processo/documento do título]", titulo.Protocolo.Numero);
                            emailKeys.Add("[nome do empreendimento]", titulo.EmpreendimentoTexto);

                            foreach (string key in emailKeys.Keys)
                            {
                                textoEmail = textoEmail.Replace(key, emailKeys[key]);
                            }

                            email         = new Email();
                            email.Assunto = _configSys.Obter <String>(ConfiguracaoSistema.KeyOrgaoSigla);
                            email.Texto   = textoEmail;
                            email.Tipo    = eEmailTipo.TituloConcluir;
                            email.Codigo  = titulo.Id;
                        }
                    }
                }

                #endregion

                if (email != null)
                {
                    List <String> lstEmail = _da.ObterEmails(titulo.Id, bancoDeDados);

                    if (lstEmail != null && lstEmail.Count > 0)
                    {
                        email.Destinatario = String.Join(", ", lstEmail.ToArray());

                        if (titulo.Modelo.Regra(eRegra.AnexarPDFTitulo))
                        {
                            email.Anexos.Add(titulo.ArquivoPdf);
                        }

                        EmailBus emailBus = new EmailBus();
                        emailBus.Enviar(email, bancoDeDados);
                    }
                }

                #endregion

                if (!Validacao.EhValido)
                {
                    bancoDeDados.Rollback();
                    return;
                }

                #region Salvar A especificidade

                if (EspecificiadadeBusFactory.Possui(titulo.Modelo.Codigo.GetValueOrDefault()))
                {
                    IEspecificidadeBus busEsp = EspecificiadadeBusFactory.Criar(titulo.Modelo.Codigo.GetValueOrDefault());
                    titulo.Especificidade = busEsp.Obter(titulo.Id) as Especificidade;
                    titulo.Especificidade = titulo.ToEspecificidade();
                    busEsp.Salvar(titulo.Especificidade, bancoDeDados);

                    List <DependenciaLst> lstDependencias = busEsp.ObterDependencias(titulo.Especificidade);
                    if (isGerarPdf && lstDependencias != null && lstDependencias.Count > 0)
                    {
                        if (!lstDependencias.Exists(x => x.TipoId == (int)eTituloDependenciaTipo.Caracterizacao && x.DependenciaTipo == (int)eCaracterizacao.Dominialidade))
                        {
                            lstDependencias.Add(new DependenciaLst()
                            {
                                TipoId = (int)eTituloDependenciaTipo.Caracterizacao, DependenciaTipo = (int)eCaracterizacao.Dominialidade
                            });
                        }
                        _da.Dependencias(titulo.Id, titulo.Modelo.Id, titulo.EmpreendimentoId.GetValueOrDefault(), lstDependencias);
                    }
                }

                #endregion

                #region Histórico

                _da.Historico.Gerar(titulo.Id, eHistoricoArtefato.titulo, eHistoricoAcao.alterarsituacao, bancoDeDados);
                _da.Consulta.Gerar(titulo.Id, eHistoricoArtefato.titulo, bancoDeDados);

                #endregion

                bancoDeDados.Commit();

                Validacao.Add(Mensagem.TituloAlterarSituacao.TituloAltSituacaoSucesso);
            }
        }
		public TituloCredenciadoBus()
		{
			_busInterno = new TituloInternoBus();
			_busCredenciado = new CredenciadoBus();
			_busPessoa = new PessoaInternoBus();
		}