<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[insoft-report-gateway]]></title><description><![CDATA[<h1>Insoft Report Gateway</h1>
<p dir="auto">API destina a servir como comunicador entre as aplicações que solicitarem agendamento ou execução de relatórios e os Executores.</p>
<p dir="auto">Deve existir somente uma instância por banco.</p>
<h2>Compatibilidade</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Sistema</th>
<th>Versão</th>
</tr>
</thead>
<tbody>
<tr>
<td>GTSoft</td>
<td>3.0.0.0 &gt; *</td>
</tr>
<tr>
<td>Pontosoft Enterprise</td>
<td>7.0.0.0 &gt; *</td>
</tr>
<tr>
<td>Akitasoft</td>
<td>7.0.0.0 &gt; *</td>
</tr>
<tr>
<td>Pontosoft Express</td>
<td>-</td>
</tr>
</tbody>
</table>
<h2>Informações técnicas</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th></th>
<th>Descrição</th>
</tr>
</thead>
<tbody>
<tr>
<td>Versão</td>
<td>1.0.3</td>
</tr>
<tr>
<td>Deploy</td>
<td>O:\Sistemas_Java\Insoft-Report-Gateway</td>
</tr>
<tr>
<td>Repositório</td>
<td><a href="https://gitlab.insoft4.com.br/apis/insoft-report-gateway" rel="nofollow ugc">https://gitlab.insoft4.com.br/apis/insoft-report-gateway</a></td>
</tr>
</tbody>
</table>
<h2>Tecnologias usadas</h2>
<blockquote>
<p dir="auto">JDK 11<br />
Grails 5.2.2</p>
</blockquote>
<h2>Instalação</h2>
<p dir="auto">Para que o sistema funcione é necessário realizar as configurações descritas abaixo e que as aplicações codependentes (<a href="https://gitlab.insoft4.com.br/apis/insoft-report-executor" rel="nofollow ugc">Executor</a> e aplicação final com os plugins <a href="https://gitlab.insoft4.com.br/plugins/insoft-report-generator" rel="nofollow ugc">Insoft Report Generator</a> e <a href="https://gitlab.insoft4.com.br/insoft4/npm/insoft-report-generator" rel="nofollow ugc">Insoft Report Generator UI</a>) estejam instaladas.</p>
<h3>Configuração externalizada</h3>
<p dir="auto">Para realizar a configuração externalizada basta criar um arquivo com o nome <code>application.yml</code> em uma das seguintes opções:</p>
<ul>
<li><em>home do usuário</em>/.grails/insoft-report-gatewayConfig/application.yml</li>
<li><em>diretório base de configurações</em>/insoft-report-gatewayConfig/application.yml</li>
</ul>
<h3>Configuração</h3>
<p dir="auto">Configurações que são utilizadas para o correto funcionamento da geração dos relatórios. Para o funcionamento correto, todos os itens abaixo devem ser configurados.</p>
<pre><code class="language-yml">insoftReportGateway.clearCron: Recebe uma cron que indicará o tempo em que deve buscaros registros e arquivos antigos para apagá-los.
insoftReportGateway.daysToKeep: Funciona em paralelo com a Cron, servido de data de corte para apagar os registros e arquivos. Por padrão assume 0. Quando zerado não deleta arquivos.
insoftReportGateway.scheduleTime: Valor inteiro que indica o intervalo de tempo, em minutos, que realizará a busca por novos registros de agendamento. Por padrão assume 1.
insoftReportGateway.executeTime: Valor inteiro que indica o intervalo de tempo, em segundos, do disparo da execução para um Executor. Por padrão assume 10.
insoftReportGateway.isAliveTime: Valor inteiro que indica o intervalo de tempo, em minutos, para a verificação de conexão com os Executores e Aplicações registradas. Por padrão assume 2.
insoftReportGateway.directory: Valor em String que indica o diretório que os arquivos gerados serão salvos.
insoftReportGateway.imageAppReport.PONTOSOFT: Valor em String, informando o caminho para a imagem da aplicação Pontosoft. Esta só será usada por Agendamentos realizados através do sistema Pontosoft Enterprise. Imagem localizada no canto direito do cabeçalho dos relatórios PDF.
insoftReportGateway.imageAppReport.AKITASOFT: Valor em String, informando o caminho para a imagem da aplicação Akitasoft. Esta só será usada por Agendamentos realizados através do sistema Akitasoft. Imagem localizada no canto direito do cabeçalho dos relatórios PDF.
insoftReportGateway.imageAppReport.GTSOFT: Valor em String, informando o caminho para a imagem da aplicação GTSoft. Esta só será usada por Agendamentos realizados através do sistema GTSoft. Imagem localizada no canto direito do cabeçalho dos relatórios PDF.
insoftReportGateway.imageAppReport.PSEXPRESS: Valor em String, informando o caminho para a imagem da aplicação Pontosoft Express. Esta só será usada por Agendamentos realizados através do sistema Pontosoft Express. Imagem localizada no canto direito do cabeçalho dos relatórios PDF.
insoftReportGateway.imageReport: Valor em String, informando o caminho para a imagem do cliente. Imagem localizada no canto esquerdo do cabeçalho dos relatórios PDF.
insoftReportGateway.scheduling.enabled: Valor booleano informando se o Gateway está preparado para agendamentos.
insoftReportGateway.execution.enabled: Valor booleano informando se o Gateway está preparado para execuções imediadas de agendamentos.
api.authenticator.url: Valor em String, apontando para o insoft-auth para que o download dos arquivos gerados sejam liberados somente para quem tiver a devida permissão.
</code></pre>
<h3>Banco de Dados</h3>
<p dir="auto">Informar valores para realizar a conexão com o banco no arquivo application.yml.</p>
<p dir="auto">Deve ser o mesmo da Aplicação e Executores conectados.</p>
<pre><code class="language-yml">dataSource:
  url: url.para.banco.de.dados
  username: "usuario"
  password: "senha"
  properties:
    initialSize: 3
    maxActive: 10
    minIdle: 3
    maxIdle: 5
    maxWait: 15000
    maxAge: 3600000
    timeBetweenEvictionRunsMillis: 30000
    minEvictableIdleTimeMillis: 90000
    validationQuery: "SELECT 1 FROM DUAL"
    validationQueryTimeout: 3
    validationInterval: 60000
    testOnBorrow: true
    testWhileIdle: true
    testOnReturn: false
</code></pre>
<p dir="auto">Após isso basta subir o projeto e configurar a URL nas aplicações e Executores, que estes irão iniciar a comunicação.</p>
<h2>Funcionamento</h2>
<p dir="auto">O sistema funciona em conjunto com o <a href="https://gitlab.insoft4.com.br/apis/insoft-report-executor" rel="nofollow ugc">Executor</a> (uma ou mais instâncias) e Aplicação final (uma ou mais instâncias) com os plugins <a href="https://gitlab.insoft4.com.br/plugins/insoft-report-generator" rel="nofollow ugc">Insoft Report Generator</a> e <a href="https://gitlab.insoft4.com.br/insoft4/npm/insoft-report-generator" rel="nofollow ugc">Insoft Report Generator UI</a> instalados.</p>
<p dir="auto">O gateway consistem em uma API que realiza a busca de registros na <code>in4gr_agendamentos</code> para distribuir para os Executores realizarem a execução do relatório agendado, dessa forma não sendo necessário esperar o mesmo gerar durante a utilização da Aplicação Final.</p>
<p dir="auto">O Gateway mantém salvo instâncias das Aplicações e Executores.</p>
<h3>Registro de Aplicações</h3>
<p dir="auto">Nesse passo o Gateway recebe informações sobre a aplicação que está se cadastrando, como URL em que ela está rodando, o nome do sistema e a versão do sistema.</p>
<p dir="auto">Esses valores são armazenados para serem informados aos Executores que se registraram para buscar as mensagens internacionalizadas para os relatórios.</p>
<h3>Registro de Executores</h3>
<p dir="auto">Nesse passo o Gateway recebe informações sobre o Executor, como a URL em que ele está rodando e o total de relatórios que podem ser executados simultaneamente por ele.</p>
<p dir="auto">Com isso é adicionado uma referência interna para esse Executor, que posteriormente receberá os relatórios para executá-los.</p>
<p dir="auto">Aqui é retornado uma lista com todas as aplicações cadastradas no Gateway, caso existam.</p>
<h3>Validação de Conexão</h3>
<h4>ExecutorIsAliveTask</h4>
<p dir="auto">Essa tarefa consiste em realizar uma checagem de conexão com todos os Executores e Aplicações cadastrados no Gateway, caso de erro em alguma requisição esse perderá a conexão.</p>
<p dir="auto">O tempo de intervalo da tarefa é definido conforme valor configurado em <code>insoftReportGateway.isAliveTime</code> (valor em minutos);</p>
<h3>Execução de Agendamentos</h3>
<h4>ScheduleTask</h4>
<p dir="auto">Essa tarefa consiste em realizar a busca dos registros da tabela <code>in4gr_agendamentos</code> onde o status seja PENDENTE, com isso eles são adicionados em uma fila de execução e seu status é atualizado para AGUARDANDO_GERACAO.</p>
<p dir="auto">O tempo de intervalo da tarefa é definido conforme valor configurado em <code>insoftReportGateway.scheduleTime</code> (valor em segundos);</p>
<h4>ExecuteTask</h4>
<p dir="auto">Essa tarefa irá realizar um request para um executor livre passando o <code>id</code> do próximo agendamento da fila.</p>
<p dir="auto">O tempo de intervalo da tarefa é definido conforme valor configurado em <code>insoftReportGateway.executeTime</code> (valor em segundos);</p>
<h3>Limpeza de Agendamentos Antigos</h3>
<h3>ClearTask</h3>
<p dir="auto">Essa tarefa realiza uma varredura nos arquivos e registros antigos, para realizar a limpeza de dados obsoletos, usando o tempo máximo de vida de cada arquivo/registro definido em <code>insoftReportGateway.daysToKeep</code>.</p>
<p dir="auto">O tempo de intervalo da tarefa é definido conforme valor configurado em <code>insoftReportGateway.clearCron</code> (valor é uma CRON).</p>
<p dir="auto">Caso o valor de <code>insoftReportGateway.daysToKeep</code> seja igual a ZERO ou não haja uma cron definida em <code>insoftReportGateway.clearCron</code> não haverá limpeza de Agendamentos Antigos.</p>
<h3>Verificação de Registro</h3>
<h4>Executor</h4>
<p dir="auto">Nessa etapa o Gateway recebe uma requisição do Executor informando a URL e total de relatórios que pode executar simultaneamente para validar se ele ainda continua registrado.</p>
<h4>Aplicação</h4>
<p dir="auto">Nessa etapa o Gateway recebe uma requisição da Aplicação Final informando a URL, nome do sistema e versão para validar se ela ainda continua registrada.</p>
<h3>Busca de Imagens para execução</h3>
<p dir="auto">Possui 2 endpoints direcionados para a utilização do Executor, eles retornam as imagens que devem ser usadas nos arquivos de relatórios gerados em PDF.</p>
<p dir="auto">São disponibilizados em 2 endpoints <code>/v1/reportScheduling/imageAppReport</code> e <code>/v1/reportScheduling/imageReport</code></p>
<h4>imageAppReport</h4>
<p dir="auto">Recebe o nome do sistema do relatório que está sendo executado para retornar a imagem correta, o valor da busca será <code>insoftReportGateway.imageAppReport.NOME_DO_SISTEMA</code>.</p>
<p dir="auto">Essa imagem fica no canto direito do cabeçalho.</p>
<h4>imageReport</h4>
<p dir="auto">Retorno a imagem definida na configuração <code>insoftReportGateway.imageReport</code>.</p>
<p dir="auto">Essa imagem fica no canto esquerdo do cabeçalho.</p>
<h3>Disparo de Scheduling</h3>
<p dir="auto">Nessa etapa a Aplicação Final, após salvar o registro de agendamento no banco, realiza uma requisição para o Gateway, para que seja realizado o disparo da ScheduleTask, evitando tempo de ociosidade.</p>
<h3>Save dos arquivos</h3>
<p dir="auto">Após o fim da execução de um Agendamento pelo Executor, o Gateway recebe uma request do Executor informando a finalização.</p>
<p dir="auto">Aqui o Gateway realiza a limpeza do Executor em questão, tornando disponpível novamente para a execução de novos relatórios e também realiza o save do arquivo recebido pelo Executor.</p>
<p dir="auto">O nome do arquivo se monta da seguinte forma DATA_HORA_DA_GERACAO + _ + ID + EXTENSAO, o resultado fica <em>20230516_163105_123.pdf</em>.</p>
<h3>Download de Arquivos</h3>
<p dir="auto">Possui um endpoint para realizar o download dos arquivos gerados, esse endpoint é protegido via token, o mesmo da aplicação, dessa forma somente quem mandou executar o relatório ou um administrador pode realizar o download do arquivo.</p>
]]></description><link>http://insoft-docker1:4567/topic/230/insoft-report-gateway</link><generator>RSS for Node</generator><lastBuildDate>Fri, 23 Oct 2026 05:33:51 GMT</lastBuildDate><atom:link href="http://insoft-docker1:4567/topic/230.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 May 2023 14:50:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to insoft-report-gateway on Fri, 20 Oct 2023 13:41:01 GMT]]></title><description><![CDATA[<p dir="auto"><img src="http://insoft-docker1:4567/assets/plugins/nodebb-plugin-emoji/emoji/android/1f680.png?v=an5iprggue4" class="not-responsive emoji emoji-android emoji--rocket" title=":rocket:" alt="🚀" /> 1.0.3<br />
<img src="http://insoft-docker1:4567/assets/plugins/nodebb-plugin-emoji/emoji/android/1f41e.png?v=an5iprggue4" class="not-responsive emoji emoji-android emoji--beetle" title=":beetle:" alt="🐞" /> OS10469</p>
<ul>
<li>Aumentar limite de tamanho para relatórios recebidos na request.</li>
<li>Usar logs conforme padrão definido.</li>
</ul>
]]></description><link>http://insoft-docker1:4567/post/375</link><guid isPermaLink="true">http://insoft-docker1:4567/post/375</guid><dc:creator><![CDATA[jhartmann]]></dc:creator><pubDate>Fri, 20 Oct 2023 13:41:01 GMT</pubDate></item><item><title><![CDATA[Reply to insoft-report-gateway on Fri, 15 Sep 2023 13:09:23 GMT]]></title><description><![CDATA[<p dir="auto"><img src="http://insoft-docker1:4567/assets/plugins/nodebb-plugin-emoji/emoji/android/1f680.png?v=an5iprggue4" class="not-responsive emoji emoji-android emoji--rocket" title=":rocket:" alt="🚀" /> v1.0.2</p>
<p dir="auto"><img src="http://insoft-docker1:4567/assets/plugins/nodebb-plugin-emoji/emoji/android/1f41e.png?v=an5iprggue4" class="not-responsive emoji emoji-android emoji--beetle" title=":beetle:" alt="🐞" /> <strong>OS10102</strong></p>
<ul>
<li>Atualizar versão do plugin insoft-gr.</li>
<li>Corrigir README.</li>
<li>Implementar disparo imediato de exeução de agendamentos.</li>
<li>Retornar status correto caso não tenha acesso ao relatório solicitado para download.<br />
Segundo as RFCs dos dois status (401 e 403), para uma solicitação onde as credenciais são insuficientes o status correto para retorno é 403. Isso resolve o problema de deslogar do sistema, quando a request feita pelo frontend.</li>
</ul>
]]></description><link>http://insoft-docker1:4567/post/349</link><guid isPermaLink="true">http://insoft-docker1:4567/post/349</guid><dc:creator><![CDATA[jhartmann]]></dc:creator><pubDate>Fri, 15 Sep 2023 13:09:23 GMT</pubDate></item><item><title><![CDATA[Reply to insoft-report-gateway on Fri, 15 Sep 2023 13:09:12 GMT]]></title><description><![CDATA[<p dir="auto"><img src="http://insoft-docker1:4567/assets/plugins/nodebb-plugin-emoji/emoji/android/1f680.png?v=an5iprggue4" class="not-responsive emoji emoji-android emoji--rocket" title=":rocket:" alt="🚀" /> 1.0.1</p>
<p dir="auto"><img src="http://insoft-docker1:4567/assets/plugins/nodebb-plugin-emoji/emoji/android/1f41e.png?v=an5iprggue4" class="not-responsive emoji emoji-android emoji--beetle" title=":beetle:" alt="🐞" /> <strong>OS10461</strong></p>
<ul>
<li>
<p dir="auto">Adicionar utilização do plugin insoft-fw-domains, para evitar repetição de código.</p>
</li>
<li>
<p dir="auto">Corrigir imports para o plugin correto.</p>
</li>
<li>
<p dir="auto">Atualização dos plugins insoft-core, insoft-api-security e insoft-gr.</p>
</li>
</ul>
]]></description><link>http://insoft-docker1:4567/post/348</link><guid isPermaLink="true">http://insoft-docker1:4567/post/348</guid><dc:creator><![CDATA[jhartmann]]></dc:creator><pubDate>Fri, 15 Sep 2023 13:09:12 GMT</pubDate></item></channel></rss>