public void Finalizar(ProjetoGeografico projetoGeo, int projetoDigitalID, DesassociarDependencias desassociarDependencias)
        {
            try
            {
                if (_validar.Finalizar(projetoGeo))
                {
                    GerenciadorTransacao.ObterIDAtual();

                    using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(EsquemaBancoCredenciado))
                    {
                        bancoDeDados.IniciarTransacao();

                        _da.Finalizar(projetoGeo);

                        //Gerencia as dependências da caracterização
                        _caracterizacaoBus.Dependencias(new Caracterizacao()
                        {
                            Id             = projetoGeo.Id,
                            Tipo           = (eCaracterizacao)projetoGeo.CaracterizacaoId,
                            DependenteTipo = eCaracterizacaoDependenciaTipo.ProjetoGeografico,
                            Dependencias   = projetoGeo.Dependencias
                        }, bancoDeDados);

                        #region Alterar Projeto Digital

                        ProjetoDigital projetoDigital = new ProjetoDigital();
                        projetoDigital.Id = projetoDigitalID;
                        projetoDigital.EmpreendimentoId = projetoGeo.EmpreendimentoId;
                        projetoDigital.Dependencias.Add(new Dependencia()
                        {
                            DependenciaCaracterizacao = (int)projetoGeo.CaracterizacaoId
                        });
                        desassociarDependencias(projetoDigital, bancoDeDados);

                        #endregion

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

                        Validacao.Add(Mensagem.ProjetoGeografico.FinalizadoSucesso);
                        bancoDeDados.Commit();
                    }
                }
            }
            catch (Exception exc)
            {
                Validacao.AddErro(exc);
            }
        }
        public void CopiarDadosInstitucional(int empreendimentoID, eCaracterizacao caracterizacaoTipo, int projetoDigitalID, DesassociarDependencias desassociarDependencias)
        {
            try
            {
                EmpreendimentoCaracterizacao empreendimento       = ObterEmpreendimentoSimplificado(empreendimentoID);
                ProjetoGeograficoBus         projetoGeograficoBus = new ProjetoGeograficoBus();

                GerenciadorTransacao.ObterIDAtual();

                using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(UsuarioCredenciado))
                {
                    bancoDeDados.IniciarTransacao();

                    if (caracterizacaoTipo != eCaracterizacao.UnidadeProducao && caracterizacaoTipo != eCaracterizacao.UnidadeConsolidacao && caracterizacaoTipo != eCaracterizacao.BarragemDispensaLicenca)
                    {
                        projetoGeograficoBus.CopiarDadosInstitucional(empreendimentoID, empreendimento.InternoID, (eCaracterizacao)caracterizacaoTipo, bancoDeDados);
                    }

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

                    ICaracterizacaoBus caracterizacaoBus = CaracterizacaoBusFactory.Criar(caracterizacaoTipo);
                    if (caracterizacaoBus == null)
                    {
                        Validacao.Add(eTipoMensagem.Erro, "Caracterizacao Bus não criada");
                    }

                    caracterizacaoBus.CopiarDadosInstitucional(empreendimentoID, empreendimento.InternoID, bancoDeDados);

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

                    #region Alterar Projeto Digital

                    ProjetoDigital projetoDigital = new ProjetoDigital();
                    projetoDigital.Id = projetoDigitalID;
                    projetoDigital.EmpreendimentoId = empreendimentoID;
                    projetoDigital.Dependencias.Add(new Dependencia()
                    {
                        DependenciaCaracterizacao = (int)caracterizacaoTipo
                    });
                    desassociarDependencias(projetoDigital, bancoDeDados);

                    #endregion

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

                    Validacao.Erros.Clear();
                    Validacao.Add(Mensagem.ProjetoDigital.CopiarCaracterizacao);
                    bancoDeDados.Commit();
                }
            }
            catch (Exception exc)
            {
                Validacao.AddErro(exc);
            }
        }
        public bool Salvar(Dominialidade caracterizacao, int projetoDigitalID, DesassociarDependencias desassociarDependencias)
        {
            try
            {
                bool isEditar = caracterizacao.Id > 0;

                if (caracterizacao.PossuiAreaExcedenteMatricula < 0)
                {
                    caracterizacao.PossuiAreaExcedenteMatricula = null;
                }

                caracterizacao.Dominios.SelectMany(dom => dom.ReservasLegais).ToList().ForEach(reserva =>
                {
                    if (reserva.Coordenada == null || reserva.Coordenada.EastingUtm <= 0 || reserva.Coordenada.Tipo.Id <= 0)
                    {
                        reserva.Coordenada = new Blocos.Entities.Etx.ModuloGeo.Coordenada();

                        if (reserva.CompensacaoTipo == eCompensacaoTipo.Receptora && reserva.EmpreendimentoCompensacao.Id > 0)
                        {
                            reserva.Coordenada = _da.ObterCoordenada(reserva.IdentificacaoARLCedente);
                        }

                        if (reserva.CompensacaoTipo == eCompensacaoTipo.Cedente && reserva.SituacaoId == (int)eReservaLegalSituacao.Proposta)
                        {
                            reserva.Coordenada = _da.ObterCoordenada(reserva.Id);
                        }
                    }
                });

                if (_validar.Salvar(caracterizacao))
                {
                    GerenciadorTransacao.ObterIDAtual();

                    using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(EsquemaCredenciadoBanco))
                    {
                        bancoDeDados.IniciarTransacao();

                        _da.Salvar(caracterizacao, bancoDeDados);

                        //Gerencia as dependências da caracterização
                        _busCaracterizacao.Dependencias(new Caracterizacao()
                        {
                            Id             = caracterizacao.Id,
                            Tipo           = eCaracterizacao.Dominialidade,
                            DependenteTipo = eCaracterizacaoDependenciaTipo.Caracterizacao,
                            Dependencias   = caracterizacao.Dependencias
                        }, bancoDeDados);

                        if (isEditar)
                        {
                            ProjetoDigital projetoDigital = new ProjetoDigital();
                            projetoDigital.Id = projetoDigitalID;
                            projetoDigital.EmpreendimentoId = caracterizacao.EmpreendimentoId;
                            projetoDigital.Dependencias.Add(new Dependencia()
                            {
                                DependenciaCaracterizacao = (int)eCaracterizacao.Dominialidade
                            });
                            desassociarDependencias(projetoDigital, bancoDeDados);
                        }

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

                        Validacao.Erros.Clear();
                        Validacao.Add(Mensagem.Dominialidade.Salvar);
                        bancoDeDados.Commit();
                    }
                }
            }
            catch (Exception e)
            {
                Validacao.AddErro(e);
            }
            return(Validacao.EhValido);
        }