Beispiel #1
0
        public MemoryStream GerarPdf(Titulo titulo, BancoDeDados banco = null)
        {
            if ((titulo.Modelo.Arquivo.Id ?? 0) <= 0)
            {
                return(null);
            }

            ArquivoBus busArquivo  = new ArquivoBus(eExecutorTipo.Interno);
            Arquivo    templatePdf = busArquivo.Obter(titulo.Modelo.Arquivo.Id.Value);

            //Carrega as atividades para o ObterDadosPdf;
            if (titulo.Atividades == null || titulo.Atividades.Count == 0)
            {
                titulo.Atividades = _da.ObterAtividades(titulo.Id);
            }

            IEspecificidadeBus busEspecificiade = EspecificiadadeBusFactory.Criar(titulo.Modelo.Codigo.Value);

            titulo.Especificidade = busEspecificiade.Obter(titulo.Id) as Especificidade;
            titulo.ToEspecificidade();
            IConfiguradorPdf configurador = busEspecificiade.ObterConfiguradorPdf(titulo.Especificidade) ?? new ConfiguracaoDefault();

            configurador.ExibirSimplesConferencia = (titulo.Situacao.Id == (int)eTituloSituacao.Cadastrado) || (titulo.Situacao.Id == (int)eTituloSituacao.EmCadastro);

            Object dataSource = busEspecificiade.ObterDadosPdf(titulo.Especificidade, banco);

            GeradorAspose gerador = new GeradorAspose(configurador);

            #region Assinantes

            List <TituloAssinante> assinantes = _da.ObterAssinantes(titulo.Id);

            if (busEspecificiade.CargosOrdenar != null && busEspecificiade.CargosOrdenar.Count > 0)
            {
                assinantes = assinantes.OrderByDescending(assinante => busEspecificiade.CargosOrdenar.IndexOf((eCargo)assinante.FuncionarioCargoCodigo)).ToList();
            }

            configurador.Assinantes = assinantes.Select(x =>
                                                        (IAssinante) new AssinanteDefault()
            {
                Nome = x.FuncionarioNome, Cargo = x.FuncionarioCargoNome
            }
                                                        ).ToList();

            //Adiciona os assinantes da Especificidade
            configurador.Assinantes.AddRange((((dynamic)dataSource).Titulo as IAssinanteDataSource).AssinanteSource);

            #endregion

            MemoryStream msPdf = gerador.Pdf(templatePdf, dataSource);

            if (dataSource is Tecnomapas.Blocos.Entities.Etx.ModuloRelatorio.IAnexoPdf)
            {
                Tecnomapas.Blocos.Entities.Etx.ModuloRelatorio.IAnexoPdf dataAnexos = dataSource as Tecnomapas.Blocos.Entities.Etx.ModuloRelatorio.IAnexoPdf;
                msPdf = GeradorAspose.AnexarPdf(msPdf, dataAnexos.AnexosPdfs);
            }

            return(msPdf);
        }
        public bool AlterarSituacao(Titulo titulo, int acao, bool gerouPdf = true)
        {
            Titulo tituloAux = _da.ObterSimplificado(titulo.Id);

            if (tituloAux == null)
            {
                return(false);
            }

            #region ValidarPermissao

            List <ePermissao> acaoPermissao = new List <ePermissao>();
            switch (titulo.Situacao.Id)
            {
                #region Cadastrado

            case 1:
                acaoPermissao.Add(ePermissao.TituloCriar);
                acaoPermissao.Add(ePermissao.TituloCancelarEmissao);
                break;

                #endregion

                #region Emitido para assinatura

            case 2:
                acaoPermissao.Add(ePermissao.TituloEmitir);
                break;

                #endregion

                #region Concluído

            case 3:
                acaoPermissao.Add(ePermissao.TituloEmitir);
                acaoPermissao.Add(ePermissao.TituloAssinar);
                break;

                #endregion

                #region Assinado

            case 4:
                acaoPermissao.Add(ePermissao.TituloAssinar);
                break;

                #endregion

                #region Cancelado

            case 5:
                acaoPermissao.Add(ePermissao.TituloEncerrar);
                acaoPermissao.Add(ePermissao.DocumentoEncerrarOficioPendencia);
                break;

                #endregion

                #region Suspenso

            case 11:
                acaoPermissao.Add(ePermissao.TituloEncerrar);
                acaoPermissao.Add(ePermissao.DocumentoEncerrarOficioPendencia);
                break;

                #endregion

                #region Prorrogado

            case 6:
                acaoPermissao.Add(ePermissao.TituloProrrogar);
                break;

                #endregion
            }

            if (!_permissaoValdiar.ValidarAny(acaoPermissao.ToArray()))
            {
                return(false);
            }

            #endregion

            //Validar Titulo
            if ((eAlterarSituacaoAcao)acao == eAlterarSituacaoAcao.EmitirParaAssinatura)
            {
                _validarTitulo.Titulo(titulo);

                if (EspecificiadadeBusFactory.Possui(titulo.Modelo.Codigo.Value))
                {
                    IEspecificidadeBus busEsp = EspecificiadadeBusFactory.Criar(titulo.Modelo.Codigo.Value);
                    titulo.Especificidade = busEsp.Obter(titulo.Id) as Especificidade;
                    titulo.Especificidade = titulo.ToEspecificidade();
                    busEsp.Validar.Emitir(titulo.Especificidade);
                }
            }
            else if (
                (eAlterarSituacaoAcao)acao == eAlterarSituacaoAcao.Assinar ||
                (eAlterarSituacaoAcao)acao == eAlterarSituacaoAcao.Entregar ||
                (eAlterarSituacaoAcao)acao == eAlterarSituacaoAcao.Prorrogar ||
                (eAlterarSituacaoAcao)acao == eAlterarSituacaoAcao.Concluir)
            {
                if (titulo.Atividades != null)
                {
                    foreach (var item in titulo.Atividades)
                    {
                        if (!item.Ativada)
                        {
                            Validacao.Add(Mensagem.AtividadeEspecificidade.AtividadeDesativada(item.NomeAtividade));
                        }
                    }
                }
            }

            if (!Validacao.EhValido)
            {
                return(false);
            }

            switch (titulo.Situacao.Id)
            {
                #region Cadastrado

            case 1:
                if (tituloAux.Situacao.Id != 2)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Cadastrado", "Emitido para assinatura"));
                }
                break;

                #endregion

                #region Emitido para assinatura

            case 2:
                if (!gerouPdf)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.GerarPdfObrigatorio);
                }

                if (tituloAux.Situacao.Id != 1)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Emitido para assinatura", "Cadastrado"));
                }

                if (ValidarDatas(titulo.DataEmissao, "DataEmissao", "emissão"))
                {
                    if (!titulo.Modelo.Regra(eRegra.NumeracaoAutomatica))
                    {
                        if (titulo.Numero.Ano != titulo.DataEmissao.Data.Value.Year)
                        {
                            Validacao.Add(Mensagem.TituloAlterarSituacao.NumeroAnoEmissaoAno);
                        }
                    }
                }

                if (titulo.Modelo.Regra(eRegra.Prazo) && titulo.Prazo.GetValueOrDefault() <= 0)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.PrazoObrigatorio);
                }

                if (titulo.Modelo.Regra(eRegra.Prazo) && (titulo.Prazo.GetValueOrDefault() + DateTime.Now.Year) > DateTime.MaxValue.Year)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.PrazoInvalido);
                }

                break;

                #endregion

                #region Concluído

            case 3:
                if (tituloAux.Situacao.Id == 1 && !gerouPdf)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.GerarPdfObrigatorio);
                }

                if (tituloAux.Situacao.Id != 1 && tituloAux.Situacao.Id != 2 && tituloAux.Situacao.Id != 4 && tituloAux.Situacao.Id != 11)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Concluído", "Cadastrado, Suspenso, Emitido para assinatura ou Assinado"));
                }

                if (tituloAux.Situacao.Id == 1 || tituloAux.Situacao.Id == 11)
                {
                    if (ValidarDatas(titulo.DataEmissao, "DataEmissao", "emissão"))
                    {
                        if (Validacao.EhValido && !titulo.Modelo.Regra(eRegra.NumeracaoAutomatica))
                        {
                            if (titulo.Numero.Ano != titulo.DataEmissao.Data.Value.Year)
                            {
                                Validacao.Add(Mensagem.TituloAlterarSituacao.NumeroAnoEmissaoAno);
                            }
                        }
                    }
                }

                if (titulo.Modelo.Regra(eRegra.Prazo) && titulo.Prazo.GetValueOrDefault() <= 0)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.PrazoObrigatorio);
                }

                if (titulo.Modelo.Regra(eRegra.Prazo) && (titulo.Prazo.GetValueOrDefault() + DateTime.Now.Year) > DateTime.MaxValue.Year)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.PrazoInvalido);
                }

                if (titulo.Modelo.Codigo == (int)eTituloModeloCodigo.AutorizacaoExploracaoFlorestal)
                {
                    var associados = _da.ObterAssociados(titulo.Id);
                    if (associados.Exists(x => x.DataVencimento.Data < titulo.DataEmissao.Data.Value.AddDays(titulo.Prazo.Value)))
                    {
                        Validacao.Add(Mensagem.TituloAlterarSituacao.PrazoSuperiorAoLaudo);
                    }
                }

                #region [ Cadastro Ambiental Rural ]
                if (LstCadastroAmbientalRuralTituloCodigo.Any(x => x == titulo.Modelo.Codigo))
                {
                    var busCARSolicitacao = new CARSolicitacaoBus();
                    if (!busCARSolicitacao.VerificarSeEmpreendimentoPossuiSolicitacaoValidaEEnviada(titulo.EmpreendimentoId.GetValueOrDefault()))
                    {
                        Validacao.Add(Mensagem.TituloAlterarSituacao.TituloNaoPossuiSolicitacaoDeInscricao);
                    }
                }
                #endregion

                break;

                #endregion

                #region Assinado

            case 4:
                if (tituloAux.Situacao.Id != 2)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Assinado", "Emitido para assinatura"));
                }

                if (ValidarDatas(titulo.DataAssinatura, "DataAssinatura", "assinatura"))
                {
                    if (titulo.DataAssinatura.Data < tituloAux.DataEmissao.Data)
                    {
                        Validacao.Add(Mensagem.TituloAlterarSituacao.DataDeveSerSuperior("DataAssinatura", "assinatura", "emissão"));
                    }
                }
                break;

                #endregion

                #region Encerrado

            case 5:
                if (tituloAux.Situacao.Id != 3 && tituloAux.Situacao.Id != 6)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Encerrado", "Concluído ou Prorrogado"));
                }

                if (ValidarDatas(titulo.DataEncerramento, "DataEncerramento", "encerramento"))
                {
                    if (titulo.Modelo.Regra(eRegra.Prazo))
                    {
                        switch (Convert.ToInt32(titulo.Modelo.Resposta(eRegra.Prazo, eResposta.InicioPrazo).Valor))
                        {
                        case 1:
                            if (titulo.DataEncerramento.Data < tituloAux.DataEmissao.Data)
                            {
                                Validacao.Add(Mensagem.TituloAlterarSituacao.DataDeveSerSuperior("DataEncerramento", "encerramento", "emissão"));
                            }
                            break;

                        case 2:
                            if (titulo.DataEncerramento.Data < tituloAux.DataAssinatura.Data)
                            {
                                Validacao.Add(Mensagem.TituloAlterarSituacao.DataDeveSerSuperior("DataEncerramento", "encerramento", "assinatura"));
                            }
                            break;

                        case 3:
                            if (titulo.DataEncerramento.Data < tituloAux.DataEntrega.Data)
                            {
                                Validacao.Add(Mensagem.TituloAlterarSituacao.DataDeveSerSuperior("DataEncerramento", "encerramento", "entrega"));
                            }
                            break;
                        }
                    }
                }

                if (titulo.MotivoEncerramentoId.GetValueOrDefault() <= 0)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.MotivoEncerramentoObrigatorio);
                }

                if (titulo.Modelo.Codigo == (int)eTituloModeloCodigo.LaudoVistoriaFlorestal)
                {
                    if (_da.ExistsTituloAssociadoNaoEncerrado(titulo.Id))
                    {
                        Validacao.Add(Mensagem.TituloAlterarSituacao.TituloPossuiAssociadoNaoEncerrado("encerrado"));
                    }
                }

                break;

                #endregion

                #region Suspenso

            case 11:
                if (tituloAux.Situacao.Id != 3 && tituloAux.Situacao.Id != 6)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Suspenso", "Concluído ou Prorrogado"));
                }

                if (ValidarDatas(titulo.DataEncerramento, "DataEncerramento", "suspensão"))
                {
                    if (titulo.Modelo.Regra(eRegra.Prazo))
                    {
                        switch (Convert.ToInt32(titulo.Modelo.Resposta(eRegra.Prazo, eResposta.InicioPrazo).Valor))
                        {
                        case 1:
                            if (titulo.DataEncerramento.Data < tituloAux.DataEmissao.Data)
                            {
                                Validacao.Add(Mensagem.TituloAlterarSituacao.DataDeveSerSuperior("DataEncerramento", "suspensão", "emissão"));
                            }
                            break;

                        case 2:
                            if (titulo.DataEncerramento.Data < tituloAux.DataAssinatura.Data)
                            {
                                Validacao.Add(Mensagem.TituloAlterarSituacao.DataDeveSerSuperior("DataEncerramento", "suspensão", "assinatura"));
                            }
                            break;

                        case 3:
                            if (titulo.DataEncerramento.Data < tituloAux.DataEntrega.Data)
                            {
                                Validacao.Add(Mensagem.TituloAlterarSituacao.DataDeveSerSuperior("DataEncerramento", "suspensão", "entrega"));
                            }
                            break;
                        }
                    }
                }

                if (titulo.Modelo.Codigo == (int)eTituloModeloCodigo.LaudoVistoriaFlorestal)
                {
                    if (_da.ExistsTituloAssociadoNaoEncerrado(titulo.Id))
                    {
                        Validacao.Add(Mensagem.TituloAlterarSituacao.TituloPossuiAssociadoNaoEncerrado("suspenso"));
                    }
                }

                break;

                #endregion

                #region Prorrogado

            case 6:
                if (tituloAux.Situacao.Id != 3 && tituloAux.Situacao.Id != 6)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Prorrogado", "Concluído ou Prorrogado"));
                }

                if (titulo.DiasProrrogados.GetValueOrDefault() <= 0)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.DiasProrrogadosObrigatorio);
                }
                break;

                #endregion
            }

            AtivarCondicionantes(titulo);

            return(Validacao.EhValido);
        }
        public void AlterarSituacao(Titulo titulo, int acao, BancoDeDados banco, bool gerouPdf = true)
        {
            Titulo atualTitulo = _da.ObterSimplificado(titulo.Id);

            if (titulo.Modelo.Regras == null || titulo.Modelo.Regras.Count == 0)
            {
                titulo.Modelo = _busModelo.Obter(titulo.Modelo.Id);
            }

            titulo.Situacao = ObterNovaSituacao(titulo, acao);

            bool isLimparPdfENumero        = false;
            bool isGerarNumero             = false;
            bool isGerarPdf                = false;
            int  novaSituacaoCondicionante = 0;

            if (titulo.Modelo.Codigo == (int)eTituloModeloCodigo.CertificadoRegistroAtividadeFlorestal)
            {
                if (titulo.Atividades.Any(x => x.Codigo == (int)eAtividadeCodigo.FabricanteMotosserra) || titulo.Atividades.Any(x => x.Codigo == (int)eAtividadeCodigo.ComercianteMotosserra))
                {
                    titulo.Prazo = 365;
                }
                else
                {
                    titulo.Prazo = new DateTime(DateTime.Now.Year, 12, 31).DayOfYear - titulo.DataEmissao.Data.Value.DayOfYear;
                }
            }

            if (!_validar.AlterarSituacao(titulo, acao, gerouPdf))
            {
                return;
            }

            #region Configurar Nova Situacao

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

            case eTituloSituacao.Cadastrado:

                if (atualTitulo.Situacao.Id == (int)eTituloSituacao.Emitido)
                {
                    if (titulo.Modelo.Regra(eRegra.NumeracaoAutomatica))
                    {
                        titulo.Numero.Inteiro = null;
                        titulo.Numero.Ano     = null;
                    }
                }

                titulo.DataEmissao.Data      = null;
                titulo.DataInicioPrazo.Data  = null;
                titulo.DataAssinatura.Data   = null;
                titulo.DataVencimento.Data   = null;
                titulo.DataEncerramento.Data = null;
                titulo.Prazo = null;

                isLimparPdfENumero = true;
                break;

                #endregion

                #region 2 - Emitido

            case eTituloSituacao.Emitido:
                isGerarNumero = true;
                isGerarPdf    = true;
                //titulo.DataEmissao info na tela

                if (titulo.Modelo.Regra(eRegra.Prazo))
                {
                    int prazoId = Convert.ToInt32(titulo.Modelo.Resposta(eRegra.Prazo, eResposta.TipoPrazo).Valor);
                    titulo.PrazoUnidade = _busLista.TituloModeloTiposPrazos.Single(x => x.Id == prazoId).Texto;
                }
                break;

                #endregion

                #region 3 - Concluído

            case eTituloSituacao.Concluido:
                if (titulo.Modelo.Regra(eRegra.Condicionantes))
                {
                    novaSituacaoCondicionante = 2;
                }

                if (atualTitulo.Situacao.Id == (int)eTituloSituacao.Cadastrado)
                {
                    isGerarNumero = true;
                    isGerarPdf    = true;
                }
                //titulo.DataAssinatura info na tela

                if (titulo.Modelo.Regra(eRegra.Prazo))
                {
                    int prazoId = Convert.ToInt32(titulo.Modelo.Resposta(eRegra.Prazo, eResposta.TipoPrazo).Valor);

                    titulo.PrazoUnidade = _busLista.TituloModeloTiposPrazos.Single(x => x.Id == prazoId).Texto;

                    switch ((eAlterarSituacaoAcao)acao)
                    {
                    case eAlterarSituacaoAcao.EmitirParaAssinatura:
                        titulo.DataInicioPrazo.Data = titulo.DataEmissao.Data.GetValueOrDefault();
                        break;

                    case eAlterarSituacaoAcao.Assinar:
                        titulo.DataInicioPrazo.Data = titulo.DataAssinatura.Data.GetValueOrDefault();
                        break;

                    case eAlterarSituacaoAcao.Entregar:
                    case eAlterarSituacaoAcao.Concluir:
                        if (titulo.Modelo.Resposta(eRegra.Prazo, eResposta.InicioPrazo).Valor.ToString() == "2")                                        //data da assinatura
                        {
                            titulo.DataInicioPrazo.Data = titulo.DataAssinatura.Data.GetValueOrDefault();
                        }
                        else
                        {
                            titulo.DataInicioPrazo.Data = titulo.DataEmissao.Data.GetValueOrDefault();
                        }
                        break;

                    default:
                        titulo.DataInicioPrazo.Data = DateTime.Now;
                        break;
                    }

                    if (prazoId == 1)                            //Dias
                    {
                        titulo.DataVencimento.Data = titulo.DataInicioPrazo.Data.Value.AddDays(titulo.Prazo.GetValueOrDefault());
                    }
                    else
                    {
                        titulo.DataVencimento.Data = titulo.DataInicioPrazo.Data.Value.AddYears(titulo.Prazo.GetValueOrDefault());
                    }
                }
                break;

                #endregion

                #region 4 - Assinado

            case eTituloSituacao.Assinado:
                //titulo.DataAssinatura info na tela
                break;

                #endregion

                #region 5 - Encerrado

            case eTituloSituacao.Encerrado:
                if (titulo.Modelo.Regra(eRegra.Condicionantes))
                {
                    novaSituacaoCondicionante = 5;
                }
                break;

                #endregion

                #region 6 - Prorrogado

            case eTituloSituacao.Prorrogado:
                if (titulo.Modelo.Regra(eRegra.Prazo))
                {
                    titulo.DataVencimento.Data = titulo.DataVencimento.Data.Value.AddDays(titulo.DiasProrrogados.GetValueOrDefault());
                }
                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;
                        }
                    }
                }

                if (titulo.DataEmissao.IsValido)
                {
                    titulo.Numero.Ano = titulo.DataEmissao.Data.Value.Year;
                }
            }

            //Limpar numero
            if (isLimparPdfENumero)
            {
                if (titulo.Modelo.Regra(eRegra.NumeracaoAutomatica))
                {
                    titulo.Numero = null;
                }
            }

            #endregion

            if (isLimparPdfENumero)
            {
                titulo.ArquivoPdf.Id = null;
            }

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

                if (novaSituacaoCondicionante > 0)
                {
                    foreach (var item in titulo.Condicionantes)
                    {
                        TituloCondicionante condicionanteAtual = _daCondicionante.Obter(item.Id, bancoDeDados);

                        //Filtro para não alterar as 4 - atendida
                        if (novaSituacaoCondicionante == 5 && condicionanteAtual.Situacao.Id == 4)                        //5 - encerrada | 4 - atendida
                        {
                            continue;
                        }

                        //Ativa a condicionante
                        if (novaSituacaoCondicionante == 2 && condicionanteAtual.Situacao.Id != 2)
                        {
                            if (condicionanteAtual.PossuiPrazo)
                            {
                                //Regras do Modelo Sem Prazo em Condicionantes com Prazo
                                if (!titulo.Modelo.Regra(eRegra.Prazo))
                                {
                                    condicionanteAtual.DataInicioPrazo.Data = titulo.DataEmissao.Data;
                                    condicionanteAtual.DataVencimento.Data  = titulo.DataEmissao.Data.Value.AddDays(condicionanteAtual.Prazo.GetValueOrDefault());
                                }
                                else
                                {
                                    condicionanteAtual.DataInicioPrazo     = titulo.DataInicioPrazo;
                                    condicionanteAtual.DataVencimento.Data = titulo.DataInicioPrazo.Data.Value.AddDays(condicionanteAtual.Prazo.GetValueOrDefault());
                                }
                            }

                            //Periodicidade
                            if (!item.PossuiPeriodicidade && item.Periodicidades != null)
                            {
                                item.Periodicidades.Clear();
                            }

                            TituloCondicionantePeriodicidade periodicidade = null;

                            if (item.PossuiPeriodicidade)
                            {
                                int diasTotais = item.PeriodicidadeValor.GetValueOrDefault();

                                switch (item.PeriodicidadeTipo.Id)
                                {
                                case 1:                                        //dia
                                    break;

                                case 2:                                        //Mes
                                    diasTotais *= 30;
                                    break;

                                case 3:                                        //Ano
                                    diasTotais *= 365;
                                    break;

                                default:
                                    break;
                                }

                                if (item.Prazo.GetValueOrDefault() > 0 && item.Prazo.GetValueOrDefault() <= diasTotais)
                                {
                                    int qtdPeriodo = Math.Abs((diasTotais / (item.Prazo.GetValueOrDefault())));
                                    for (int i = 0; i < qtdPeriodo; i++)
                                    {
                                        periodicidade             = new TituloCondicionantePeriodicidade();
                                        periodicidade.Situacao.Id = 2;                                        //Ativa

                                        //Regras do Modelo Sem Prazo em Condicionantes com Prazo
                                        if (!titulo.Modelo.Regra(eRegra.Prazo))
                                        {
                                            periodicidade.DataInicioPrazo.Data = titulo.DataEmissao.Data.Value.AddDays(i * item.Prazo.GetValueOrDefault());
                                            periodicidade.DataVencimento.Data  = titulo.DataEmissao.Data.Value.AddDays((i + 1) * item.Prazo.GetValueOrDefault());
                                        }
                                        else
                                        {
                                            periodicidade.DataInicioPrazo.Data = titulo.DataInicioPrazo.Data.Value.AddDays(i * item.Prazo.GetValueOrDefault());
                                            periodicidade.DataVencimento.Data  = titulo.DataInicioPrazo.Data.Value.AddDays((i + 1) * item.Prazo.GetValueOrDefault());
                                        }

                                        item.Periodicidades.Add(periodicidade);
                                    }
                                }
                            }

                            condicionanteAtual.Periodicidades = item.Periodicidades;
                            condicionanteAtual.Situacao.Id    = novaSituacaoCondicionante;
                            _daCondicionante.Ativar(condicionanteAtual, bancoDeDados);
                        }
                        else
                        {
                            condicionanteAtual.Situacao.Id = novaSituacaoCondicionante;
                            _daCondicionante.AlterarSituacao(condicionanteAtual, banco: bancoDeDados);
                        }
                    }
                }

                #endregion

                _da.AlterarSituacao(titulo, bancoDeDados);

                #region Atividades

                TituloBus        tituloBus           = new TituloBus();
                AtividadeBus     atividadeBus        = new AtividadeBus();
                List <Atividade> lstTituloAtividades = null;

                #region Título Concluido

                if (titulo.Situacao.Id == (int)eTituloSituacao.Concluido)                //3 - Concluido
                {
                    lstTituloAtividades = tituloBus.ObterAtividades(titulo.Id);

                    if (lstTituloAtividades != null && lstTituloAtividades.Count > 0)
                    {
                        int?situacao = null;
                        if (EspecificiadadeBusFactory.Possui(titulo.Modelo.Codigo.GetValueOrDefault()))
                        {
                            IEspecificidadeBus busEsp = EspecificiadadeBusFactory.Criar(titulo.Modelo.Codigo.GetValueOrDefault());
                            situacao = busEsp.ObterSituacaoAtividade(titulo.Id);
                        }

                        if (situacao != null ||
                            LstModeloCodigoPendencia.Any(x => x == titulo.Modelo.Codigo.GetValueOrDefault()) ||
                            LstModeloCodigoIndeferido.Any(x => x == titulo.Modelo.Codigo.GetValueOrDefault()))
                        {
                            eAtividadeSituacao atividadeSituacao =
                                (LstModeloCodigoPendencia.Any(x => x == titulo.Modelo.Codigo.GetValueOrDefault())) ? eAtividadeSituacao.ComPendencia : eAtividadeSituacao.Indeferida;

                            if (situacao != null)
                            {
                                atividadeSituacao = (eAtividadeSituacao)situacao;
                            }

                            atividadeBus.AlterarSituacao(lstTituloAtividades, atividadeSituacao, bancoDeDados);
                        }
                        else
                        {
                            foreach (Atividade atividade in lstTituloAtividades)
                            {
                                if (atividadeBus.VerificarDeferir(atividade, bancoDeDados))
                                {
                                    atividade.SituacaoId = (int)eAtividadeSituacao.Deferida;
                                    atividadeBus.AlterarSituacao(atividade, bancoDeDados);
                                }
                            }
                        }
                    }
                }

                #endregion

                #region Título Encerrado

                if (titulo.Situacao.Id == (int)eTituloSituacao.Encerrado)                //Encerrado
                {
                    lstTituloAtividades = tituloBus.ObterAtividades(titulo.Id);
                    eAtividadeSituacao situacaoAtual = eAtividadeSituacao.EmAndamento;

                    if (lstTituloAtividades != null && lstTituloAtividades.Count > 0)
                    {
                        foreach (Atividade atividade in lstTituloAtividades)
                        {
                            situacaoAtual = (eAtividadeSituacao)atividadeBus.ObterAtividadeSituacao(atividade, bancoDeDados).SituacaoId;

                            if (situacaoAtual == eAtividadeSituacao.Indeferida || situacaoAtual == eAtividadeSituacao.ComPendencia)
                            {
                                atividade.SituacaoId = (int)eAtividadeSituacao.EmAndamento;
                                atividadeBus.AlterarSituacao(atividade, bancoDeDados);
                            }
                            else
                            {
                                if (titulo.MotivoEncerramentoId == 1 || titulo.MotivoEncerramentoId == 4)
                                {
                                    atividade.SituacaoId = (int)eAtividadeSituacao.EmAndamento;
                                    atividadeBus.AlterarSituacao(atividade, bancoDeDados);
                                }
                                else if (atividadeBus.VerificarEncerrar(atividade, bancoDeDados))
                                {
                                    atividade.SituacaoId = (int)eAtividadeSituacao.Encerrada;
                                    atividadeBus.AlterarSituacao(atividade, bancoDeDados);
                                }
                            }
                        }
                    }
                }

                #endregion

                #region Título Prorrogado

                if (titulo.Situacao.Id == (int)eTituloSituacao.Prorrogado)                //6 - Prorrogar
                {
                    lstTituloAtividades = tituloBus.ObterAtividades(titulo.Id);

                    if (lstTituloAtividades != null && lstTituloAtividades.Count > 0)
                    {
                        if (LstModeloCodigoPendencia.Any(x => x == titulo.Modelo.Codigo) ||
                            LstModeloCodigoIndeferido.Any(x => x == titulo.Modelo.Codigo))
                        {
                            eAtividadeSituacao atividadeSituacao =
                                (LstModeloCodigoPendencia.Any(x => x == titulo.Modelo.Codigo)) ? eAtividadeSituacao.ComPendencia : eAtividadeSituacao.Indeferida;

                            atividadeBus.AlterarSituacao(lstTituloAtividades, atividadeSituacao, bancoDeDados);
                        }
                        else
                        {
                            int finalidade = _da.VerificarEhTituloAnterior(titulo);
                            if (finalidade > 0)
                            {
                                eAtividadeSituacao atividadeSituacao = (finalidade == 1) ? eAtividadeSituacao.NovaFase : eAtividadeSituacao.EmRenovacao;
                                atividadeBus.AlterarSituacao(lstTituloAtividades, atividadeSituacao, bancoDeDados);
                            }
                            else
                            {
                                foreach (Atividade atividade in lstTituloAtividades)
                                {
                                    if (atividadeBus.VerificarDeferir(atividade, bancoDeDados))
                                    {
                                        atividade.SituacaoId = (int)eAtividadeSituacao.Deferida;
                                        atividadeBus.AlterarSituacao(atividade, bancoDeDados);
                                        continue;
                                    }

                                    //Voltar a situação default de andamento
                                    atividade.SituacaoId = (int)eAtividadeSituacao.EmAndamento;
                                    atividadeBus.AlterarSituacao(atividade, bancoDeDados);
                                }
                            }
                        }
                    }
                }

                #endregion

                #endregion

                #region Gerar Pdf de Titulo

                ArquivoBus arqBus = new ArquivoBus(eExecutorTipo.Interno);

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

                    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.EtramiteIdentity.FuncionarioId, User.EtramiteIdentity.Name,
                                          User.EtramiteIdentity.Login, (int)eExecutorTipo.Interno, User.EtramiteIdentity.FuncionarioTid, bancoDeDados);

                        _da.SalvarPdfTitulo(titulo, bancoDeDados);
                    }
                }

                #endregion

                #region Análise de Item

                //Trava a Análise de item de processo/documento caso o titulo que está sendo alterado seja um de pendência
                if (titulo.Atividades != null && titulo.Atividades.Count > 0)
                {
                    Protocolo   protocolo = titulo.Atividades.First().Protocolo;
                    AnaliseItem analise   = _busAnalise.Obter(protocolo);

                    if (analise != null && analise.Id > 0)
                    {
                        if (_busTitulo.ExisteTituloPendencia(protocolo, bancoDeDados))
                        {
                            if (analise.Situacao == 1)                            // 1 - Em andamento
                            {
                                analise.Situacao = 2;                             // 2 - Com Pendência
                                _busAnalise.AlterarSituacao(analise, bancoDeDados);
                            }
                        }
                        else if (analise.Situacao == 2)
                        {
                            analise.Situacao = 1;
                            _busAnalise.AlterarSituacao(analise, bancoDeDados);
                        }
                    }
                }

                #endregion

                #region Gerar/Enviar Email

                #region Gerar Email

                Email email = null;
                if (titulo.Situacao.Id == (int)eTituloSituacao.Concluido && titulo.Modelo.Regra(eRegra.EnviarEmail))                //3 - Concluido
                {
                    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

                #region [ Solicitação CAR ]

                if (LstCadastroAmbientalRuralTituloCodigo.Any(x => x == titulo.Modelo.Codigo))
                {
                    if (titulo.Situacao.Id == (int)eTituloSituacao.Concluido)
                    {
                        //Interno
                        List <int> situacoes = new List <int>()
                        {
                            (int)eCARSolicitacaoSituacao.EmCadastro, (int)eCARSolicitacaoSituacao.Pendente, (int)eCARSolicitacaoSituacao.Valido, (int)eCARSolicitacaoSituacao.Suspenso
                        };
                        CARSolicitacao solicitacao = _busCARSolicitacao.ObterPorEmpreendimento(titulo.EmpreendimentoId.GetValueOrDefault(0), situacoes, false, bancoDeDados) ?? new CARSolicitacao();

                        if (solicitacao != null && solicitacao.Id > 0)
                        {
                            solicitacao.SituacaoId        = (int)eCARSolicitacaoSituacao.SubstituidoPeloTituloCAR;
                            solicitacao.DataSituacao.Data = DateTime.Now;

                            _busCARSolicitacao.AlterarSituacao(solicitacao, bancoDeDados, mostrarMsg: false);
                        }
                        else
                        {
                            //Credenciado
                            _busCARSolicitacao.SubstituirPorTituloCARCredenciado(titulo.EmpreendimentoId.GetValueOrDefault(0), bancoDeDados);
                        }
                    }

                    if (titulo.Situacao.Id == (int)eTituloSituacao.Encerrado)
                    {
                        List <int> situacoes = new List <int>()
                        {
                            (int)eCARSolicitacaoSituacao.SubstituidoPeloTituloCAR
                        };
                        CARSolicitacao solicitacao = _busCARSolicitacao.ObterPorEmpreendimento(titulo.EmpreendimentoId.GetValueOrDefault(0), situacoes, false, bancoDeDados) ?? new CARSolicitacao();

                        if (solicitacao != null && solicitacao.Id > 0)
                        {
                            solicitacao.SituacaoAnteriorId   = solicitacao.SituacaoId;
                            solicitacao.DataSituacaoAnterior = solicitacao.DataSituacao;

                            solicitacao.SituacaoId        = (int)eCARSolicitacaoSituacao.Valido;
                            solicitacao.DataSituacao.Data = DateTime.Now;

                            _busCARSolicitacao.AlterarSituacao(solicitacao, bancoDeDados, mostrarMsg: false);
                        }
                        else
                        {
                            //Credenciado
                            Empreendimento empreendimento = new EmpreendimentoBus().ObterSimplificado(titulo.EmpreendimentoId.GetValueOrDefault(0));

                            CARSolicitacaoCredenciadoBus carSolicitacaoCredBus = new CARSolicitacaoCredenciadoBus();
                            CARSolicitacao carSolicitacaoCred = new CARSolicitacao();
                            carSolicitacaoCred.Empreendimento.Codigo = empreendimento.Codigo;
                            carSolicitacaoCredBus.AlterarSituacao(carSolicitacaoCred, new CARSolicitacao()
                            {
                                SituacaoId = (int)eCARSolicitacaoSituacao.Valido
                            });
                        }
                    }

                    //SE situacao == Encerrado
                    //TODO:Mudar Situação para Válido
                }

                #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

                eHistoricoAcao eAcao;

                switch ((eAlterarSituacaoAcao)acao)
                {
                case eAlterarSituacaoAcao.EmitirParaAssinatura:
                    eAcao = eHistoricoAcao.emitir;
                    break;

                case eAlterarSituacaoAcao.CancelarEmissao:
                    eAcao = eHistoricoAcao.cancelaremissao;
                    break;

                case eAlterarSituacaoAcao.Assinar:
                    eAcao = eHistoricoAcao.assinar;
                    break;

                case eAlterarSituacaoAcao.Prorrogar:
                    eAcao = eHistoricoAcao.prorrogar;
                    break;

                case eAlterarSituacaoAcao.Encerrar:
                    eAcao = eHistoricoAcao.encerrar;
                    break;

                case eAlterarSituacaoAcao.Entregar:
                    eAcao = eHistoricoAcao.entregar;
                    break;

                default:
                    eAcao = eHistoricoAcao.emitir;
                    break;
                }

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

                #region Solicitacao CAR

                if (LstCadastroAmbientalRuralTituloCodigo.Any(x => x == titulo.Modelo.Codigo.GetValueOrDefault()))
                {
                    if (titulo.Situacao.Id != (int)eTituloSituacao.Concluido)
                    {
                        _da.Consulta.Deletar(titulo.Id, eHistoricoArtefato.carsolicitacaotitulo, bancoDeDados);
                    }
                    else
                    {
                        _da.Consulta.Gerar(titulo.Id, eHistoricoArtefato.carsolicitacaotitulo, bancoDeDados);
                    }
                }

                #endregion

                #endregion

                bancoDeDados.Commit();

                Validacao.Add(Mensagem.TituloAlterarSituacao.TituloAltSituacaoSucesso);
            }
        }
Beispiel #4
0
        public MemoryStream GerarPdf(Titulo titulo, BancoDeDados banco = null)
        {
            if ((titulo.Modelo.Arquivo.Id ?? 0) <= 0)
            {
                return(null);
            }

            ArquivoBus busArquivo  = new ArquivoBus(eExecutorTipo.Interno);
            Arquivo    templatePdf = busArquivo.Obter(titulo.Modelo.Arquivo.Id.Value);

            //Carrega as atividades para o ObterDadosPdf;
            if (titulo.Atividades == null || titulo.Atividades.Count == 0)
            {
                titulo.Atividades = _da.ObterAtividades(titulo.Id);
            }

            IEspecificidadeBus busEspecificiade = EspecificiadadeBusFactory.Criar(titulo.Modelo.Codigo.Value);

            titulo.Especificidade = busEspecificiade.Obter(titulo.Id) as Especificidade;
            titulo.ToEspecificidade();
            IConfiguradorPdf configurador = busEspecificiade.ObterConfiguradorPdf(titulo.Especificidade) ?? new ConfiguracaoDefault();

            configurador.ExibirSimplesConferencia = (titulo.Situacao.Id == (int)eTituloSituacao.Cadastrado) || (titulo.Situacao.Id == (int)eTituloSituacao.EmCadastro) || (titulo.Situacao.Id == (int)eTituloSituacao.AguardandoPagamento);

            Object dataSource = busEspecificiade.ObterDadosPdf(titulo.Especificidade, banco);

            #region Condicionantes

            var dataSourceTitulo = (((dynamic)dataSource).Titulo as DataSourceBase);

            if (titulo.Modelo.Regra(eRegra.Condicionantes))
            {
                if (dataSourceTitulo.Condicionantes == null || dataSourceTitulo.Condicionantes.Count == 0)
                {
                    EspecificidadeDa daEsp = new EspecificidadeDa();
                    dataSourceTitulo.Condicionantes = daEsp.ObterCondicionantes(titulo.Id);
                }
            }

            IConfiguracaoEvent cnfEvent = configurador as IConfiguracaoEvent;

            if (cnfEvent != null)
            {
                if (!titulo.Modelo.Regra(eRegra.Condicionantes) || dataSourceTitulo.Condicionantes == null || dataSourceTitulo.Condicionantes.Count == 0)
                {
                    cnfEvent.AddLoadAcao((doc, dataSourceCnf) =>
                    {
                        Table tabela = doc.FindTable("«TableStart:Titulo.Condicionantes»");
                        if (tabela != null)
                        {
                            if (configurador.CondicionanteRemovePageBreakAnterior)
                            {
                                tabela.RemovePageBreakAnterior();
                            }

                            AsposeExtensoes.RemoveTables(new List <Table>()
                            {
                                tabela
                            });
                        }
                    });
                }
                else
                {
                    cnfEvent.AddExecutedAcao((doc, dataSourceCnf) =>
                    {
                        Table tabela = doc.LastTable("«remover»");

                        while (tabela != null)
                        {
                            AsposeExtensoes.RemoveTables(new List <Table> {
                                tabela
                            });
                            tabela = doc.LastTable("«remover»");
                        }
                    });
                }
            }

            #endregion

            GeradorAspose gerador = new GeradorAspose(configurador);

            #region Assinantes

            List <TituloAssinante> assinantes = _da.ObterAssinantes(titulo.Id);

            if (busEspecificiade.CargosOrdenar != null && busEspecificiade.CargosOrdenar.Count > 0)
            {
                assinantes = assinantes.OrderByDescending(assinante => busEspecificiade.CargosOrdenar.IndexOf((eCargo)assinante.FuncionarioCargoCodigo)).ToList();
            }

            configurador.Assinantes = assinantes.Select(x =>
                                                        (IAssinante) new AssinanteDefault()
            {
                Nome = x.FuncionarioNome, Cargo = x.FuncionarioCargoNome
            }
                                                        ).ToList();

            //Adiciona os assinantes da Especificidade
            configurador.Assinantes.AddRange((((dynamic)dataSource).Titulo as IAssinanteDataSource).AssinanteSource);

            #endregion

            MemoryStream msPdf = gerador.Pdf(templatePdf, dataSource);

            if (dataSource is Tecnomapas.Blocos.Entities.Etx.ModuloRelatorio.IAnexoPdf)
            {
                Tecnomapas.Blocos.Entities.Etx.ModuloRelatorio.IAnexoPdf dataAnexos = dataSource as Tecnomapas.Blocos.Entities.Etx.ModuloRelatorio.IAnexoPdf;
                msPdf = GeradorAspose.AnexarPdf(msPdf, dataAnexos.AnexosPdfs);
            }

            return(msPdf);
        }
        internal bool AlterarSituacao(Titulo titulo, bool validarTitulo)
        {
            if (titulo.Situacao.Id <= 0)
            {
                Validacao.Add(Mensagem.Titulo.SituacaoObrigatoria);
            }

            Titulo tituloAux = _da.ObterSimplificado(titulo.Id);

            if (tituloAux == null)
            {
                return(false);
            }

            switch ((eTituloSituacao)titulo.Situacao.Id)
            {
                #region Valido

            case eTituloSituacao.Valido:
                if (tituloAux.Situacao.Id != (int)eTituloSituacao.EmCadastro && tituloAux.Situacao.Id != (int)eTituloSituacao.Suspenso)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Válido", "Em cadastro ou Suspenso"));
                }
                break;

                #endregion

                #region Suspenso

            case eTituloSituacao.Suspenso:
                if (tituloAux.Situacao.Id != (int)eTituloSituacao.Valido)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Suspenso", "Válido"));
                }

                if (string.IsNullOrWhiteSpace(titulo.MotivoSuspensao))
                {
                    Validacao.Add(Mensagem.Titulo.MotivoObrigatorio);
                }
                break;

                #endregion

                #region Encerrado

            case eTituloSituacao.EncerradoDeclaratorio:
                if (tituloAux.Situacao.Id != (int)eTituloSituacao.Valido && tituloAux.Situacao.Id != (int)eTituloSituacao.Suspenso)
                {
                    Validacao.Add(Mensagem.TituloAlterarSituacao.SituacaoInvalida("Encerrado", "Válido ou Suspenso"));
                }

                if (titulo.MotivoEncerramentoId <= 0)
                {
                    Validacao.Add(Mensagem.Titulo.MotivoEncerramentoObrigatorio);
                }
                break;

                #endregion
            }

            if (!Validacao.EhValido)
            {
                return(false);
            }

            //Validar Titulo
            if (validarTitulo)
            {
                Titulo(titulo);

                if (EspecificiadadeBusFactory.Possui(titulo.Modelo.Codigo.Value))
                {
                    IEspecificidadeBus busEsp = EspecificiadadeBusFactory.Criar(titulo.Modelo.Codigo.Value);
                    titulo.Especificidade = busEsp.Obter(titulo.Id) as Especificidade;
                    titulo.Especificidade = titulo.ToEspecificidade();
                    busEsp.Validar.Emitir(titulo.Especificidade);
                }
            }
            else if (titulo.Situacao.Id != (int)eTituloSituacao.EncerradoDeclaratorio)
            {
                if (titulo.Atividades != null)
                {
                    foreach (var item in titulo.Atividades)
                    {
                        if (!item.Ativada)
                        {
                            Validacao.Add(Mensagem.AtividadeEspecificidade.AtividadeDesativada(item.NomeAtividade));
                        }
                    }
                }
            }

            return(Validacao.EhValido);
        }
        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);
            }
        }