SEI

De Wiki - Prefeitura do Município de São Paulo
Ir para: navegação, pesquisa

O Sistema Eletrônico de Informações ou simplesmente SEI, é o sistema responsável pelo gerenciamento dos processos administrativos eletrônicos da Prefeitura do Município de São Paulo e que serve de base para a implantação do Processo Eletrônico. Foi desenvolvido pelo Tribunal Regional Federal da 4ª Região (TRF4).

Instalação do SEI/SIP com vagrant

A instalação do SEI/SIP com vagrant provê uma máquina Linux “enxuta” e virtualizada capaz de provisionar ambientes docker modularizados para cada componente do sistema. As instruções abaixo foram baseadas no manual constante no Portal do Software Público[1] e devem ser seguidas para obter esse ambiente.

Pré-requisitos para instalação no windows

Instalar:

Na instalação do git no Windows, recomenda-se que se instale o “git bash”, e todos os comandos sejam realizados neste ambiente.

Configuração do proxy

Antes de baixar o box do vagrant, certifique-se de que as variáveis de ambiente http_proxy e https_proxy estejam devidamente configurados para o servidor proxy. Para configurá-las, utilize os seguintes comandos:

export http_proxy=username:senha@ip_do_proxy:porta_do_proxy
export https_proxy=username:senha@ip_do_proxy:porta_do_proxy

Inicializando o ambiente

No diretório do código do SEI, rode o seguinte comando:

vagrant init processoeletronico/sei-3.0.0

O comando acima cria um arquivo de configuração “Vagrantfile” no diretório do código do SEI. Esse arquivo define que a box processoeletronico/sei-3.0.0 será baixada em https://atlas.hashicorp.com/processoeletronico/boxes/sei-3.0.0 e utilizada para prover a máquina virtual. Em seguida basta subir a máquina pelo comando:

vagrant up

Se o vagrant indicar que não subiu a máquina virtual devido a possíveis conflitos de redirecionamento de porta, basta utilizar o comando:

vagrant reload

Configuração do proxy do apt

Outro problema pode ocorrer nesta última etapa. Nesta fase final, alguns pacotes devem ser instalados dentro da máquina virtual, entretanto, pode ser que não os sejam devido a problemas de configuração de proxy no "apt":

Reading package lists...
Building dependency tree...
Reading state information...
dkms is already the newest version.
The following packages were automatically installed and are no longer required:
  acl at-spi2-core colord dconf-gsettings-backend dconf-service fontconfig
  fontconfig-config fonts-dejavu-core hicolor-icon-theme libasound2
  libasound2-data libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatspi2.0-0
  libavahi-client3 libavahi-common-data libavahi-common3 libcairo-gobject2
  libcairo2 libcanberra-gtk3-0 libcanberra-gtk3-module libcanberra0 libcolord1
  libcolorhug1 libcups2 libdatrie1 libdconf1 libdrm-intel1 libdrm-nouveau2
  libdrm-radeon1 libexif12 libfontconfig1 libfontenc1 libgd3
  libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-common libgl1-mesa-dri libgl1-mesa-glx
  libglapi-mesa libgphoto2-6 libgphoto2-l10n libgphoto2-port10 libgraphite2-3
  libgtk-3-0 libgtk-3-bin libgtk-3-common libgudev-1.0-0 libgusb2
  libharfbuzz0b libice6 libieee1284-3 libjasper1 libjbig0 libjpeg-turbo8
  libjpeg8 liblcms2-2 libllvm3.4 libnotify-bin libnotify4 libogg0
  libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpciaccess0
  libpixman-1-0 libsane libsane-common libsm6 libtdb1 libthai-data libthai0
  libtiff5 libtxc-dxtn-s2tc0 libv4l-0 libv4lconvert0 libvorbis0a
  libvorbisfile3 libvpx1 libwayland-client0 libwayland-cursor0 libx11-xcb1
  libxaw7 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0
  libxcb-render0 libxcb-shm0 libxcb-sync1 libxcomposite1 libxcursor1
  libxdamage1 libxfixes3 libxfont1 libxi6 libxinerama1 libxkbcommon0
  libxkbfile1 libxmu6 libxpm4 libxrandr2 libxrender1 libxshmfence1 libxt6
  libxtst6 libxxf86vm1 notification-daemon sound-theme-freedesktop x11-common
  x11-xkb-utils xfonts-base xfonts-encodings xfonts-utils xserver-common
  xserver-xorg-core
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
  linux-headers-3.13.0-105 linux-headers-3.13.0-105-generic

Para resolver este problema, após a mensagem acima ser impressa e a instalação não progredir, feche o vagrant com Ctrl+C. Neste ponto, a máquina virtual encontra-se em funcionamento, entretanto, a instalação do SEI ainda não está concluída. Acesse a máquina por ssh:

vagrant ssh

Logue como root para alterar arquivos de configuração no diretório de sistema /etc/apt.

sudo su

Altere, ou crie o arquivo apt.conf

vim /etc/apt/apt.conf

Acrescente as seguintes linhas de configuração do proxy:

Acquire::http::Proxy "http://usuário:senha@ip_do_proxy:porta_do_proxy";
Acquire::https::Proxy "https://usuário:senha@ip_do_proxy:porta_do_proxy";

Saia da sessão ssh aberta e carregue novamente a máquina virtual:

vagrant reload

Neste ponto acesse http://localhost/sei, e verifique se o SEI está funcionando devidamente.

Componentes de software auxiliares

O processo de instalação do SEI levanta serviços que podem ou não ser acessados pelo browser. Eles devem estar disponíveis após a conclusão dos passos da seção acima.

==> default: Starting smtp
==> default: Starting jod
==> default: Starting mysql
==> default: Starting solr
==> default: Starting memcached
==> default: Starting httpd

A classe abaixo, contida em "sei/config", define em quais locais os serviços levantados serão acessados. A classe é implementada utilizando o padrão de projeto "Singleton", evitando-se que mais de uma instância exista em um mesmo momento de execução.

class ConfiguracaoSEI extends InfraConfiguracao  {

 	private static $instance = null;

 	public static function getInstance(){
 	  if (ConfiguracaoSEI::$instance == null) {
 	    ConfiguracaoSEI::$instance = new ConfiguracaoSEI();
 	  }
 	  return ConfiguracaoSEI::$instance;
 	}

 	public function getArrConfiguracoes(){
 	  return array(

 	      'SEI' => array(
 	          'URL' => 'http://[Servidor PHP]/sei',
 	          'Producao' => true,
 	          'RepositorioArquivos' => '/dados'),

 	      'PaginaSEI' => array(
 	          'NomeSistema' => 'SEI',
 	          'NomeSistemaComplemento' => '',
 	          'LogoMenu' => ''),
 	       
 	      'SessaoSEI' => array(
 	          'SiglaOrgaoSistema' => 'ABC',
 	          'SiglaSistema' => 'SEI',
 	          'PaginaLogin' => 'http://[Servidor PHP]/sip/login.php',
 	          'SipWsdl' => 'http://[Servidor PHP]/sip/controlador_ws.php?servico=wsdl',
 	          'https' => false),
 	       
 	      'BancoSEI'  => array(
 	          'Servidor' => '[servidor BD]',
 	          'Porta' => '',
 	          'Banco' => '',
 	          'Usuario' => '',
 	          'Senha' => '',
 	          'Tipo' => ''), //MySql, SqlServer ou Oracle

				'CacheSEI' => array('Servidor' => '[Servidor Memcache]',
					                	'Porta' => '11211'),

 	      'JODConverter' => array('Servidor' => 'http://[Servidor JODConverter]:8080/converter/service'),

 	      'Edoc' => array('Servidor' => 'http://[Servidor .NET]'),
 	       
 	      'Solr' => array(
 	          'Servidor' => 'http://[Servidor Solr]:8080/solr',
 	          'CoreProtocolos' => 'sei-protocolos',
 	          'CoreBasesConhecimento' => 'sei-bases-conhecimento',
 	          'CorePublicacoes' => 'sei-publicacoes'),

				'HostWebService' => array(
						'Edoc' => array('[Servidor .NET]'),
						'Sip' => array('[Servidor PHP]'), //Referências (IP e nome na rede) de todas as máquinas que executam o SIP.
						'Publicacao' => array(), //Referências (IP e nome na rede) das máquinas de veículos de publicação externos cadastrados no SEI.
						'Ouvidoria' => array(), //Referências (IP e nome na rede) da máquina que hospeda o formulário de Ouvidoria personalizado. Se utilizar o formulário padrão do SEI, então configurar com as máquinas dos nós de aplicação do SEI.
				),
 	       
 	      'InfraMail' => array(
						'Tipo' => '1', //1 = sendmail (neste caso não é necessário configurar os atributos abaixo), 2 = SMTP
						'Servidor' => '[Servidor E-Mail]',
						'Porta' => '25',
						'Codificacao' => '8bit', //8bit, 7bit, binary, base64, quoted-printable
						'MaxDestinatarios' => 999, //numero maximo de destinatarios por mensagem
						'MaxTamAnexosMb' => 999, //tamanho maximo dos anexos em Mb por mensagem
						'Seguranca' => 'TLS', //TLS, SSL ou vazio
						'Autenticar' => false, //se true então informar Usuario e Senha
						'Usuario' => 'aaa',
						'Senha' => 'aaa',
						'Protegido' => '' //campo usado em desenvolvimento, se tiver um email preenchido entao todos os emails enviados terao o destinatario ignorado e substituído por este valor (evita envio incorreto de email)
				)
 	  );
 	}
}

Uma classe equivalente está contida no diretório "sip/config" para configuração do SIP.

SMTP

Roda na porta 1080 do servidor. Possível acessar pelo endereço http://[Servidor SEI]:1080.

Ao acessar o endereço acima, nota-se que ali um servidor de MailCatcher[2] está em funcionamento. Trata-se de um servidor de e-mail simples que recebe mensagens enviadas a ele, e as disponibiliza em uma interface web.

Seu uso no SEI é destinado apenas a debug dos serviços de e-mail.

JODConverter

Funcionamento do JODConverter

Roda na porta 8080 do servidor. Possível acessar pelo endereço http://[Servidor SEI]:8080 .

A aplicação JODConverter (Java OpenDocument Converter[3]) tem como propósito converter documentos entre diferentes formatos office.

No SEI, esta ferramenta é utilizada para gerar PDF’s de processos tendo arquivos texto como entrada. A figura a direita, extraída da interface web do serviço, exemplifica sua funcionalidade.

MySQL

Configuração do SQuirreL

Roda na porta 3306 do servidor.

Esquema do Banco de Dados pelo SQuirreL

Trata-se do servidor de banco de dados utilizado tanto para o SEI quanto para o SIP. É possível verificar se o servidor está respondendo através da porta 3306 no browser. Essa abordagem, entretanto, é insuficiente uma vez que retorna uma página ininteligível.

Para verificar corretamente a conexão com o servidor de banco de dados do SEI, recomenda-se utilizar um cliente SQL local como o SQuirreL[4]. A figura a esquerda, mostra a tela de configuração de um “alias” do SQuirreL para se conectar ao banco em http://[Servidor SEI]:3396.

Se o servidor estiver funcionando devidamente, os esquemas do banco de dados devem ser listados conforme figura a direita.

Solr

Utilização do Solr

Roda na porta 8983 do servidor. O acesso a tela de administração do Solr pode ser realizado pelo endereço http://[Servidor SEI]:8983.

Solr[5] é uma plataforma de busca e indexação de textos dentro das aplicações escrito em Java.

Na figura ao lado, extraída da tela de administração, nota-se que o Solr é utilizado em três contextos do SEI: busca na base de conhecimento, busca protocolo, e busca de publicação.

De acordo com as considerações gerais do manual do SEI[6], o Solr busca termos tanto em metadados de processos e documentos bem como no teor dos documentos (seja em PDF, DOC, etc).

memcached

Interpretador de comandos do memcached

Roda na porta 11211 do servidor.

De acordo com o artigo "Aplicando o memcached para aumentar o desempenho do site"[7], memcached é um sistema para armazenamento em memória de dados carregados de outros locais. Em aplicações web é comumente utilizado para manter na RAM páginas ou elementos de página que frequentemente são acessados.

O sistema é mantido em um servidor que pode ser acessado por vários clientes. Dessa maneira, a interface para a utilização de seus recursos se dá pela rede.

Não é possível visualizar o funcionamento do Memcached pelo browser. Para tal, deve-se acessar a máquina na qual o SEI está sendo executado e verificar pela linha de comando se há resposta do memcached. No caso da instalação com vagrant, deve-se acessar a máquina virtual por SSH e então fazer a verificação, conforme figura a direita:

HTTPD

Roda na porta 80 do servidor.

Aplicação daemon encarregada de servir a requisições HTTP da web.

Web services

Algumas funcionalidades do SEI são encapsuladas em webservices e acessadas via SOAP. Parte desses recursos podem ser utilizados por usuários externos sendo necessário autorizá-los através da própria interface do SEI (ver seção abaixo). Outros recursos, só é possível acessar permitindo determinados IP's explicitamente no código fonte.

Web services do SEI

Recursos do SEI acessados via web services são usados internamente no código, como também podem ser acessados externamente.

Para que seja possível utilizar os web services externamente é necessário dar permissão para que o IP do cliente seja autorizado a consumir recursos específicos. Para tanto, siga os passos descritos na documentação de web services que estão resumidos aqui: acessar Administração > Sistemas > Novo, criar um novo cliente cadastrado e depois configurar esse novo cliente incluindo seu IP.

Baixe então o arquivo WSDL: http://[Servidor SEI]/sei/controlador_ws.php?servico=sei (se possuir uma instalação local do SEI, como efetuado acima, substitua "Servidor SEI" por localhost).

O arquivo WSDL define a forma como deve ser realizada a comunicação especificando que campos a mensagem SOAP deve conter. Usando o programa SoapUI é possível listar quais operações estão disponíveis para o web service.

Exemplo de uso

O exemplo desta seção, visa expor uma situação na qual deseja-se fazer uma operação de "Listar contatos". Para tanto, deve-se criar um sistema no SEI que permita essa operação conforme figura abaixo.

Cadastro de serviço

Criado o serviço, cria-se uma operação de "Listar Contato" vinculada a este serviço.

Cadastro operacao.png
Operações disponíveis

A descrição dos web services que o SEI disponibiliza está contida no arquivo WSDL obtido pelo servidor (http://[Servidor SEI]/s ip/controlador_ws.php?servico=wsdl). Ao baixar o arquivo e importá-lo no SoapUI, é possível visualizar várias operações disponíveis para uso conforme a figura ao lado:

No arquivo WSDL, a operação de "listarContatos" é descrita conforme a figura abaixo:

portType

Nesta figura, nota-se que "portType" é definido (SeiPortType) com várias operações permitidas, dentre elas a operação de listarContatos. Essa operação possui como entrada e saída mensagens do tipo listarContatosRequest e listarContatosResponse, respectivamente. A figura abaixo detalha o formato dessas mensagens.

Descrição das mensagens

É necessário definir também, como as operações serão de fato transmitidas ao servidor. Na figura abaixo, depreende-se que as mensagens SOAP serão transportadas via http, com um "style" so tipo "rpc", além de outras informações relativas a codificação (encoding).

Binding

Por último, a seção "service" do arquivo wsdl define o endereço de onde se acessar o web service.

Service

A partir, portanto, do arquivo wsdl descrito nesta seção, é possível gerar uma mensagem SOAP a ser enviada para o servidor requisitando a operação de listar contatos. A figura abaixo, exemplifica uma mensagem com seus respectivos parâmetros preenchidos.

Mensagem SOAP

Através do SoapUI, é possível estabelecer uma comunicação com o web service hospedado no servidor do SEI através de mensagens SOAP. A resposta, se não houver problemas, será parecida com a mensagem abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="Sei" xmlns:xmlmime="http://www.w3.org/2004/11/xmlmime" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <ns1:listarContatosResponse>
         <parametros SOAP-ENC:arrayType="ns1:Contato[2]" xsi:type="ns1:ArrayOfContato">
            <item xsi:type="ns1:Contato">
               <IdContato xsi:type="xsd:string">100000014</IdContato>
               <IdTipoContato xsi:type="xsd:string">4</IdTipoContato>
               <NomeTipoContato xsi:type="xsd:string">Temporário</NomeTipoContato>
               <Sigla xsi:nil="true" />
               <Nome xsi:type="xsd:string">Frodo Bolseiro</Nome>
               <StaNatureza xsi:type="xsd:string">F</StaNatureza>
               <IdContatoAssociado xsi:nil="true" />
               <SinEnderecoAssociado xsi:type="xsd:string">N</SinEnderecoAssociado>
               <Endereco xsi:type="xsd:string">Bolsão</Endereco>
               <Complemento xsi:nil="true" />
               <Bairro xsi:type="xsd:string">Condado</Bairro>
               <IdCidade xsi:nil="true" />
               <IdEstado xsi:nil="true" />
               <IdPais xsi:nil="true" />
               <Cep xsi:nil="true" />
               <StaGenero xsi:type="xsd:string">M</StaGenero>
               <IdCargo xsi:nil="true" />
               <Cpf xsi:nil="true" />
               <Cnpj xsi:nil="true" />
               <Rg xsi:nil="true" />
               <OrgaoExpedidor xsi:nil="true" />
               <Matricula xsi:nil="true" />
               <MatriculaOab xsi:nil="true" />
               <TelefoneFixo xsi:nil="true" />
               <TelefoneCelular xsi:nil="true" />
               <DataNascimento xsi:nil="true" />
               <Email xsi:nil="true" />
               <SitioInternet xsi:nil="true" />
               <Observacao xsi:nil="true" />
               <SinAtivo xsi:type="xsd:string">S</SinAtivo>
            </item>
            <item xsi:type="ns1:Contato">
               <IdContato xsi:type="xsd:string">100000015</IdContato>
               <IdTipoContato xsi:type="xsd:string">4</IdTipoContato>
               <NomeTipoContato xsi:type="xsd:string">Temporário</NomeTipoContato>
               <Sigla xsi:nil="true" />
               <Nome xsi:type="xsd:string">Samwise Gamgee</Nome>
               <StaNatureza xsi:type="xsd:string">F</StaNatureza>
               <IdContatoAssociado xsi:nil="true" />
               <SinEnderecoAssociado xsi:type="xsd:string">N</SinEnderecoAssociado>
               <Endereco xsi:nil="true" />
               <Complemento xsi:nil="true" />
               <Bairro xsi:type="xsd:string">Condado</Bairro>
               <IdCidade xsi:nil="true" />
               <IdEstado xsi:nil="true" />
               <IdPais xsi:nil="true" />
               <Cep xsi:nil="true" />
               <StaGenero xsi:nil="true" />
               <IdCargo xsi:nil="true" />
               <Cpf xsi:nil="true" />
               <Cnpj xsi:nil="true" />
               <Rg xsi:nil="true" />
               <OrgaoExpedidor xsi:nil="true" />
               <Matricula xsi:nil="true" />
               <MatriculaOab xsi:nil="true" />
               <TelefoneFixo xsi:nil="true" />
               <TelefoneCelular xsi:nil="true" />
               <DataNascimento xsi:nil="true" />
               <Email xsi:nil="true" />
               <SitioInternet xsi:nil="true" />
               <Observacao xsi:nil="true" />
               <SinAtivo xsi:type="xsd:string">S</SinAtivo>
            </item>
         </parametros>
      </ns1:listarContatosResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Web services do SIP

O SIP também disponibiliza web services que são usados internamente, bem como podem ser disponibilizados para uso externo. O procedimento para usá-los e interpretá-los é semelhante ao que está exposto na seção anterior.

Outros web services: Ouvidoria, Assinador, Publicação

Outros web services são utilizados no SEI/SIP, entretanto, seus recursos estão disponíveis apenas para uso interno ao sistema. Para configurar o acesso de outros hosts, deve-se alterar o arquivo ConfiguracoesSEI.php ou ConfiguracoesSIP.php citados na seção Componentes de software auxiliares.

Macro arquitetura do SEI/SIP

As informações expostas a seguir foram baseadas na documentação de desenvolvimento de módulos do SEI[8] e no código fonte do projeto.

SessaoSEI/SessaoSIP

Essas classes são responsáveis por controlar e retornar informações sobre a sessão de cada usuário logado no SEI e/ou SIP. Tanto a classe SessaoSEI e SessaoSIP seguem o padrão de projeto Singleton, além de ambas implementarem a classe abstrata InfraSessao.

CacheSEI/CacheSIP

Essas classes são responsáveis por acessar e alterar valores presentes no servidor de memcache já descrito na seção acima. Para isso implementam a classe abstrata comum InfraCache. Para garantir uma única instância durante a execução, implementam o padrão singleton.

Na construção do objeto correspondente ao CacheSEI/CacheSIP, as configurações de ip/porta do servidor memcache são passadas como parâmetro pelo arquivo ConfiguracaoSEI.php e ConfiguracaoSIP.php como já mencionado.

Autenticação Interna

O SIP provê autenticação interna através do protocolo LDAP. Na tela abaixo, são configurado os parâmetros para acesso ao servidor de autenticação:

Autenticação por LDAP

As entradas do formulário da tela acima são utilizadas como atributos para a classe InfraLDAP. Após terem seus atributos inicializados a classe tenta abrir conexão com o servidor e realizar um bind com a conexão aberta. Essas operações são realizadas através das ldap_* do próprio PHP.

Ressalta-se que a autenticação via LDAP é possível apenas por servidores Active Directory e OpenLDAP.

Framework InfraPHP

A seguinte seção apresenta informações acerca da arquitetura do framework InfraPHP.

DTO

O SEI/SIP implementa o padrão de projeto DTO (Data Transfer Object). De acordo com Martin Fowler[9], trata-se de uma abordagem para encapsulamento de dados em uma camada com o intuito de serem enviados a uma camada subjacente. A intenção dessa abordagem é reduzir o número de chamadas para a transferência de dados entre camadas, uma vez que, em se tratando de objetos remotos, cada chamada pode custar caro ao processamento.

Arquitetura em Camadas

De acordo com a documentação oficial, as três camadas que compõem o sistema são:

Cliente

  • Interação com o usuário ou outros sistemas
  • Validações simples que não necessitem acesso à dados

RN

  • Controle de transação
  • Validação de permissões
  • Auditoria

Validação das regras de negócio

BD

  • Persistência
  • Recuperação de dados

As três camadas são implementadas por classes abstratas, quais são: InfraPagina, InfraRN, InfraBD. Abaixo segue-se uma tabela com uma breve definição de cada uma:

InfraPagina InfraRN InfraBD
Monta o esqueleto da página com seus elementos gráficos. Empacota um conjunto de funcionalidades que devem estar contidas em várias atividades do sistema, como: validação de permissões, validação de regras etc. Realiza o acesso as bases de dados.

Para cada nova funcionalidade em que se deve acessar/recuperar páginas, acessar o banco, validar permissões, etc, deve-se implementar cada uma dessas classes abstratas para o contexto específico.

Comunicação inter-camadas

Conforme preconizado pelo DTO, a comunicação entre as camadas dessa arquitetura deve ocorrer por intermédio de um objeto que encapsula todos os dados de interesse do destinatário. O objeto em questão, deve ser uma instância de uma classe que implementa a classe abstrata InfraDTO.

Exemplo: Impressão de documentos de processo

A situação a seguir exemplifica a arquitetura definida nesta seção.

Na tela de acompanhamento do processo, selecione um documento:

Tela de acompanhamento do processo

Depois, requisite a impressão.

Requisição da impressão

O diagrama de objetos correspondente a essa situação é representada abaixo:

Diagrama de objetos

De acordo com o código executado, no arquivo "documento_imprimir.php", inicialmente um objeto DocumentoDTO é instanciado para que seja verificado se o documento a ser impresso existe. A verificação é realizada dentro da classe DocumentoDB instanciada pela classe DocumentoRN (que também realiza outras verificações).

Caso o documento não tenha sido gerado externamente ao SEI, mas internamente, um objeto EditorDTO será instanciado e passado a uma instância de EditorRN. Em seguida, uma versão html deste documento é retornada e disponibilizada para impressão.

Referências:

Predefinição:Reflist
  1. https://softwarepublico.gov.br/social/sei/manuais/vagrant/sumario SEI com Vagrant
  2. https://mailcatcher.me/ MailCatcher
  3. https://webbygram.com/opensource/jodconverter/ JODConverter
  4. http://squirrel-sql.sourceforge.net/ SQuirreL
  5. http://lucene.apache.org/solr/ Solr
  6. https://softwarepublico.gov.br/social/sei/manuais/manual-de-instalacao/1.-consideracoes-gerais Considerações gerais - Manual do SEI
  7. https://www.ibm.com/developerworks/br/opensource/library/os-memcached/index.html Memcached
  8. Módulos - Versão 3.0
  9. https://martinfowler.com/eaaCatalog/dataTransferObject.html Data Transfer Object, Martin Fowler