New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Patch de ajustes para uso de relatórios #409

Merged
merged 13 commits into from Sep 28, 2018

Conversation

Projects
None yet
5 participants
@edersoares
Member

edersoares commented Sep 23, 2018

Pacote de relatórios

Com o crescimento da comunidade i-Educar, adesões de novos municípios utilizando a versão community e o comprometimento da Portabilis com a comunidade, este patch visa preparar o i-Educar para receber o pacote de relatórios desenvolvidos pela Portabilis que serão liberados para a comunidade de maneira open source.

Relatórios atuais

Atualmente, o pacote de relatórios apresentam alguns erros na emissão. Desta forma, estes relatórios serão removidos em prol do novo e mais atualizado pacote que irá conter mais de 40 relatórios.

Estes relatórios continuarão existindo neste novo pacote, porém foram atualizados a fim de utilizar uma arquitetura e tecnologia que melhor se adequa aos novos padrões adotados para o i-Educar.

Problemas atuais e motivação

Atualmente, todas as regras de negócio/aplicação estão contidas em enormes queries dentro dos arquivos .jrxml. Sempre que uma regra de negócio é modificada, alterações na query devem ser efetuadas em todos os relatórios que utilizam a regra tornando a manutenção onerosa.

O intuito é utilizar JSON como data source permitindo assim remover estas queries de dentro dos arquivos .jrxml e movendo-as para a aplicação. Isto permitirá usar o JasperReports apenas como camada de visualização e evitar duplicar a regra de negócio.

Também será possível versionar apenas os arquivos .jrxml, pois os arquivos .jasper serão compilados apenas no servidor que irá executar a renderização.

Softwares desatualizados

Atualmente os relatórios atuais do repositório i-educar-reports-package foram construídos utilizando o iReport versão 4.7.0, porém conforme anúncio do seu website o iReport teve seu suporte encerrado em 31 de dezembro de 2015 e o JasperStudio é o official design client for JasperReports desde a versão 5.5.0.

O JasperStudio (IDE para construir os relatórios) se encontra na versão 6.6.0 que é a mesma versão do JasperReports (aplicação Java que gera os relatórios).

Atualização do pacote JasperPHP

O pacote portabilis/jasperphp versão 1.2.0 foi removido em prol do pacote cossou/jasperphp versão 2.7.

Esta atualização permitirá o uso do JasperStarter versão 3, utilizando o JasperReports versão 6.

Modificações a nível técnico (código fonte)

Arquitetura, tecnologia e bibliotecas foram atualizados para utilizar versões atuais e estáveis.

Classes modificadas

As classes Portabilis_Report_ReportCore e Portabilis_Report_ReportFactory agora são classes abstratas.

Atualizar arquivo de configuração

Para atualizações de versão será necessário adicionar no arquivo .ini a seguinte configuração:

report.source_path = /home/portabilis/ieducar/ieducar/modules/Reports/ReportSources

Como migrar os relatórios criados com base no pacote atual

Na classe ReportCore foram adicionados os métodos useJson(), getJsonQuery() e getJsonData().

https://github.com/portabilis/i-educar/blob/reports/ieducar/lib/Portabilis/Report/ReportCore.php#L150-L180

Por default:

  • useJson() irá retornar false.
  • getJsonQuery() retornará uma string vazia.
  • getJsonData() irá retornar um array vazio.

Não alterando estes métodos, o i-Educar permanecerá com o comportamento atual, renderizando relatórios baseados em queries dentro dos arquivos .jrxml.

Para modificar o comportamento do relatório e fazer o mesmo utilizar JSON como data source, deve-se:

  • Sobrescrever o método useJson() para retornar true.
  • Usar o método getJsonQuery() para retornar a chave onde se encontra os dados para o relatório principal.
    • No caso do JSON { "data": [..] } deverá ser retornado data.
    • No caso do JSON { "data": { "main": [..] } } deverá ser retornado data.main.
  • Sobrescrever o método getJsonData() para retornar um array com os dados que serão utilizados pelo relatório principal e seu sub-relatório.
{
    "data": {
        "main": [
            { "id": 1, "name": "Eder Soares" },
            { "id": 2, "name": "Amiguinho do Eder Soares" }
        ],
        "header": {
            "school": {
                "name": "Ulbra"
            }
        }
    }
}

Passar o data source para o sub-relatório

Assim como a conexão com o banco de dados era passada do relatório principal para o sub-relatório na estrutura anterior, agora será necessário passar o arquivo JSON como parâmetro para o sub-relatório.

O relatório principal, quando utilizando JSON como data source, recebe o parâmetro source com a localização do arquivo JSON utilizado como data source. Este arquivo é criado e apagado automaticamente. Adicionar ao relatório principal:

<parameter name="source" class="java.lang.String"/>

Deverá ser adicionado ao relatório principal na tag subreport o subreportParameter chamado source que receberá o parâmetro source do relatório principal.

<subreportParameter name="source">
    <subreportParameterExpression><![CDATA[$P{source}]]></subreportParameterExpression>
</subreportParameter>

E no sub-relatório deverá ser acrescentado:

<parameter name="source" class="java.lang.String"/>
<parameter name="net.sf.jasperreports.json.source" class="java.lang.String">
    <defaultValueExpression><![CDATA[$P{source}]]></defaultValueExpression>
</parameter>
<queryString language="json">
    <![CDATA[header]]>
</queryString>

Melhorias e evolução

A partir desta atualização poderemos avançar mais alguns passos e construir mais soluções para o i-Educar.

  • Utilizar softwares atualizados para o design dos relatórios.
  • Não "parar no tempo" com dependências, softwares e metodologias.
  • Possibilitar o desacoplamento de serviços externos (geração de PDFs) da aplicação.
  • Criar futuramente um serviço em PHP ou qualquer outra linguagem, que receba uma requisição HTTP e retorne o PDF gerado.
    • Poderemos utilizar uma solução como AWS Lambda para a geração dos PDFs.
    • Será possível testar mais facilmente outros softwares geradores de PDF como WkHtmlToPdf, MPDF, DOMPDF entre outros em outras linguagens.
    • Criar uma feature onde o suporte ou o cliente possa customizar/criar seu relatório utilizando um construtor de templates como GrapesJS e então usar uma biblioteca que converte HTML para PDF.

This was referenced Sep 23, 2018

@farribeiro

This comment has been minimized.

Contributor

farribeiro commented Sep 24, 2018

Este movimento é para extinção do projeto i-educar-reports-package?

@edersoares

This comment has been minimized.

Member

edersoares commented Sep 24, 2018

Pelo contrário, @farribeiro, é justamente para torná-lo funcional.

@farribeiro

This comment has been minimized.

Contributor

farribeiro commented Sep 24, 2018

Realmente, estranhei não só este PR como os que foram criados no outro projeto!

E ainda espero que reorganizar a árvore de diretório seria o primeiro passo nesta realização.

Gentileza pingar o Luís a respeito desta modificação

@MarceloCajueiro

This comment has been minimized.

Member

MarceloCajueiro commented Sep 26, 2018

Muito boa a descrição @edersoares! Bem explicativo e vendeu super bem o peixe. Bem alinhado com a sua dedicação nesse projeto. 👏

@Bonot Bonot referenced this pull request Sep 27, 2018

Merged

Registros do diario de classe #39

@edersoares edersoares merged commit fd0142f into master Sep 28, 2018

2 checks passed

Scrutinizer 12 updated code elements
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details

@edersoares edersoares deleted the reports branch Sep 28, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment