public MemoryStream Gerar(int projetoDigitalId)
        {
            UnidadeProducaoRelatorio dataSource = _da.Obter(projetoDigitalId);

            ArquivoDocCaminho = @"~/Content/_pdfAspose/Ficha_Inscricao_UP.docx";

            ObterArquivoTemplate();

            #region Configurar Assinantes

            ConfiguracaoDefault.TextoTagAssinante   = "«Assinante.Nome»";
            ConfiguracaoDefault.TextoTagAssinantes1 = "«TableStart:Assinantes1»";
            ConfiguracaoDefault.TextoTagAssinantes2 = "«TableStart:Assinantes2»";

            #endregion

            ConfiguracaoDefault.ExibirSimplesConferencia = (dataSource.Situacao == eProjetoDigitalSituacao.EmElaboracao);
            ConfigurarCabecarioRodape(0, true);

            #region Configurar Tabelas

            ConfiguracaoDefault.AddLoadAcao((doc, dataSrc) =>
            {
            });

            #endregion

            #region Assinantes

            AssinanteDefault assinante = null;

            foreach (PessoaRelatorio item in dataSource.Produtores)
            {
                assinante           = new AssinanteDefault();
                assinante.Nome      = item.NomeRazaoSocial;
                assinante.TipoTexto = "Produtor";
                ConfiguracaoDefault.Assinantes.Add(assinante);
            }

            foreach (ResponsavelRelatorio item in dataSource.Empreendimento.Responsaveis)
            {
                assinante           = new AssinanteDefault();
                assinante.Nome      = item.NomeRazao;
                assinante.TipoTexto = "Representante Legal";
                ConfiguracaoDefault.Assinantes.Add(assinante);
            }

            foreach (ResponsavelTecnicoRelatorio item in dataSource.Responsaveis)
            {
                assinante           = new AssinanteDefault();
                assinante.Nome      = item.NomeRazao;
                assinante.TipoTexto = "Responsável Técnico";
                ConfiguracaoDefault.Assinantes.Add(assinante);
            }

            #endregion

            return(GerarPdf(dataSource));
        }
        internal UnidadeProducaoRelatorio Obter(int projetoDigitalId)
        {
            UnidadeProducaoRelatorio unidade = null;

            using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(EsquemaBancoCredenciado))
            {
                Comando comando = bancoDeDados.CriarComando(@"select c.id, c.propriedade_codigo, c.local_livro, e.denominador, e.cnpj, ee.cep, ee.logradouro, ee.bairro,  ee.distrito,
				ee.numero, lm.texto municipio_texto, le.sigla estado_sigla,  ee.corrego,  ee.complemento, tp.situacao projeto_situacao from crt_unidade_producao c, tab_empreendimento e,
				tab_empreendimento_endereco ee, lov_municipio lm, lov_estado le, tab_projeto_digital tp where e.id = tp.empreendimento and c.empreendimento = e.id and e.id = 
				ee.empreendimento  and ee.correspondencia = 0 and le.id = ee.estado and lm.id = ee.municipio and tp.id = :id"                , EsquemaBancoCredenciado);

                comando.AdicionarParametroEntrada("id", projetoDigitalId, DbType.Int32);

                using (IDataReader reader = bancoDeDados.ExecutarReader(comando))
                {
                    while (reader.Read())
                    {
                        unidade    = new UnidadeProducaoRelatorio();
                        unidade.Id = reader.GetValue <int>("id");
                        unidade.CodigoPropriedade          = reader.GetValue <Int64>("propriedade_codigo").ToString("D4");
                        unidade.LocalLivro                 = reader.GetValue <string>("local_livro");
                        unidade.Empreendimento.Denominador = reader.GetValue <string>("denominador");
                        unidade.Empreendimento.CNPJ        = reader.GetValue <string>("cnpj");
                        unidade.Situacao = (eProjetoDigitalSituacao)reader.GetValue <int>("projeto_situacao");
                        unidade.Empreendimento.Enderecos.Add(new EnderecoRelatorio()
                        {
                            Cep             = reader.GetValue <string>("cep"),
                            Logradouro      = reader.GetValue <string>("logradouro"),
                            Bairro          = reader.GetValue <string>("bairro"),
                            Distrito        = reader.GetValue <string>("distrito"),
                            Numero          = reader.GetValue <string>("numero"),
                            MunicipioTexto  = reader.GetValue <string>("municipio_texto"),
                            EstadoSigla     = reader.GetValue <string>("estado_sigla"),
                            Corrego         = reader.GetValue <string>("corrego"),
                            Complemento     = reader.GetValue <string>("complemento"),
                            Correspondencia = 0
                        });
                    }

                    reader.Close();
                }

                #region Unidade de produção

                comando = bancoDeDados.CriarComando(@"select c.id, c.codigo_up, cc.easting_utm, cc.northing_utm, c.area,  cu.cultivar, tc.texto cultura, c.data_plantio_ano_producao,
				 c.estimativa_quant_ano, lc.texto estimativa from crt_unidade_producao_unidade  c, crt_unidade_producao_un_coord cc, tab_cultura_cultivar cu, lov_crt_uni_prod_uni_medida lc,
				 tab_cultura tc where  tc.id(+) = cu.cultura and c.estimativa_unid_medida = lc.id and c.cultivar = cu.id(+) and c.id = cc.unidade_producao_unidade and c.unidade_producao = :unidade"                , EsquemaBancoCredenciado);

                comando.AdicionarParametroEntrada("unidade", unidade.Id, DbType.Int32);

                using (IDataReader reader = bancoDeDados.ExecutarReader(comando))
                {
                    UnidadeProducaoItemRelatorio item;
                    while (reader.Read())
                    {
                        item               = new UnidadeProducaoItemRelatorio();
                        item.Id            = reader.GetValue <int>("id");
                        item.CodigoUP      = reader.GetValue <string>("codigo_up");
                        item.Latitude      = reader.GetValue <string>("easting_utm");
                        item.Longitude     = reader.GetValue <string>("northing_utm");
                        item.AreaHa        = reader.GetValue <string>("area");
                        item.CultivarNome  = reader.GetValue <string>("cultivar");
                        item.CulturaNome   = reader.GetValue <string>("cultura");
                        item.DataPlantio   = reader.GetValue <string>("data_plantio_ano_producao");
                        item.QuantidadeAno = reader.GetValue <string>("estimativa_quant_ano");
                        item.UnidadeMedida = reader.GetValue <string>("estimativa");
                        unidade.UP.Add(item);
                    }

                    reader.Close();
                }

                #endregion

                #region Produtores

                comando = bancoDeDados.CriarComando(@"select nvl(p.nome, p.razao_social) nome, nvl(p.cpf, p.cnpj) cpf_cnpj, e.cep, e.logradouro, e.bairro, e.distrito, e.numero, lm.texto municipio_texto, le.sigla estado_sigla,
					e.complemento, (select m.valor from tab_pessoa_meio_contato m where m.pessoa = p.id and m.meio_contato = 1) tel_residencial, (select m.valor from tab_pessoa_meio_contato m where m.pessoa = p.id and m.meio_contato = 2) tel_celular,
					(select m.valor from tab_pessoa_meio_contato m where m.pessoa = p.id and m.meio_contato = 3) tel_fax, (select m.valor from tab_pessoa_meio_contato m where m.pessoa = p.id and m.meio_contato = 4) tel_comercial,
					(select m.valor from tab_pessoa_meio_contato m where m.pessoa = p.id and m.meio_contato = 5) email from crt_unidade_prod_un_produtor c , tab_pessoa p, tab_pessoa_endereco e, lov_municipio lm, lov_estado le
					where c.produtor = p.id and p.id = e.pessoa and e.municipio = lm.id and e.estado = le.id and c.unidade_producao_unidade in 
					(select id from crt_unidade_producao_unidade where unidade_producao = :unidade)"                    , EsquemaBancoCredenciado);

                comando.AdicionarParametroEntrada("unidade", unidade.Id, DbType.Int32);

                using (IDataReader reader = bancoDeDados.ExecutarReader(comando))
                {
                    PessoaRelatorio produtor = null;
                    while (reader.Read())
                    {
                        if (unidade.Produtores.Exists(x => x.CPFCNPJ == reader.GetValue <string>("cpf_cnpj")))
                        {
                            continue;
                        }

                        produtor = new PessoaRelatorio();
                        produtor.NomeRazaoSocial         = reader.GetValue <string>("nome");
                        produtor.CPFCNPJ                 = reader.GetValue <string>("cpf_cnpj");
                        produtor.Endereco.Cep            = reader.GetValue <string>("cep");
                        produtor.Endereco.Logradouro     = reader.GetValue <string>("logradouro");
                        produtor.Endereco.Bairro         = reader.GetValue <string>("bairro");
                        produtor.Endereco.Distrito       = reader.GetValue <string>("distrito");
                        produtor.Endereco.Numero         = reader.GetValue <string>("numero");
                        produtor.Endereco.MunicipioTexto = reader.GetValue <string>("municipio_texto");
                        produtor.Endereco.EstadoSigla    = reader.GetValue <string>("estado_sigla");
                        produtor.Endereco.Complemento    = reader.GetValue <string>("complemento");
                        produtor.MeiosContatos.Add(new ContatoRelatorio()
                        {
                            Valor = reader.GetValue <string>("tel_residencial"), TipoContato = eTipoContato.TelefoneResidencial
                        });
                        produtor.MeiosContatos.Add(new ContatoRelatorio()
                        {
                            Valor = reader.GetValue <string>("tel_celular"), TipoContato = eTipoContato.TelefoneCelular
                        });
                        produtor.MeiosContatos.Add(new ContatoRelatorio()
                        {
                            Valor = reader.GetValue <string>("tel_fax"), TipoContato = eTipoContato.TelefoneFax
                        });
                        produtor.MeiosContatos.Add(new ContatoRelatorio()
                        {
                            Valor = reader.GetValue <string>("tel_comercial"), TipoContato = eTipoContato.TelefoneComercial
                        });
                        produtor.MeiosContatos.Add(new ContatoRelatorio()
                        {
                            Valor = reader.GetValue <string>("email"), TipoContato = eTipoContato.Email
                        });
                        unidade.Produtores.Add(produtor);
                    }

                    reader.Close();
                }

                #endregion

                #region Responsaveis Tecnicos

                comando = bancoDeDados.CriarComando(@"select r.unidade_producao_unidade, nvl(p.nome, p.razao_social) nome, h.numero_habilitacao, 
				(select t.extensao_habilitacao from {0}tab_hab_emi_cfo_cfoc t where t.responsavel = c.id) extensao_habilitacao 
				from {0}crt_unidade_prod_un_resp_tec r, {0}tab_credenciado c, {0}tab_pessoa p, 
				{1}tab_hab_emi_cfo_cfoc h where  r.responsavel_tecnico = h.responsavel and r.responsavel_tecnico = c.id and c.pessoa = p.id and r.unidade_producao_unidade 
				in (select id from {0}crt_unidade_producao_unidade where unidade_producao = :unidade)"                , EsquemaBancoCredenciado, EsquemaBanco);
                comando.AdicionarParametroEntrada("unidade", unidade.Id, DbType.Int32);

                bool extensao = false;
                using (IDataReader reader = bancoDeDados.ExecutarReader(comando))
                {
                    ResponsavelTecnicoRelatorio item = null;

                    while (reader.Read())
                    {
                        extensao = reader.GetValue <bool>("extensao_habilitacao");

                        item                   = new ResponsavelTecnicoRelatorio();
                        item.NomeRazao         = reader.GetValue <string>("nome");
                        item.NumeroHabilitacao = extensao ? reader.GetValue <string>("numero_habilitacao") + " - ES" : reader.GetValue <string>("numero_habilitacao");
                        unidade.UP.Single(x => x.Id == reader.GetValue <int>("unidade_producao_unidade")).Responsaveis.Add(item);
                    }

                    reader.Close();
                }

                #endregion Responsaveis Tecnicos
            }

            return(unidade);
        }