Ruby on Rails + JasperReports (IReport)
Autor: Rafael Felix | Publicado: 2010-12-28T04:47:00-08:00

Atualmente aqui na Serhmática, usávamos um sistema interno, uma aplicação "Cobaia" feita em Swing para gerencia de projetos, estávamos a algum tempo estudando o desenvolvimento de uma nova ferramenta WEB, onde nossos clientes pudessem acessar, diminuindo o fluxo de email, e tornando o contato com o cliente mais transparente. Como estamos com muito tempo de sobra, não conseguimos progredir com a aplicação, e procuramos uma solução que pudesse nos atender, eis que encontramos o Redmine, uma aplicação escrita em Ruby on Rails, nossa intenção inicial, era rodar no Glassfish que já tinhamos configurado, porém houve inconsistências, BUGS não explicados pela internet, e partimos a rodar via Mongrel mesmo.
Testamos e gostamos da ferramenta, ainda não está pública para os clientes, mas aos poucos vamos liberando, surgiu um outro problema, precisávamos de alguns relatórios no nosso estilo, que pudesse ser encaminhado aos clientes, a primeira coisa que pensei foi FODEU.


Pesquisei na net e cheguei até um blog brazuca, que tinha um projeto parecido com o que eu queria, testei os códigos desse cara, infelizmente ele não lista os jars que vc precisa, mas vou listar aqui:

commons-beanutils
commons-collections
commons-digester
commons-logging
commons-logging-api
iText
jasperreports
postgresql


&nbsp;e tive o primeiro sucesso, e veio o primeiro problema, precisava parametrizar as buscas, não como no modelo do cara, dai resolvi fazer diferente:

1) Criar no relatorio_controller uma action e mapeei ela no routes.rb
2) Criei a tela com form_tag e adicionei os parametros
3) no retorno da action fiz a busca e mandei pro&nbsp;relatório.

Eis que vem o primeiro erro, o JasperReports não conseguiu processar o modelo do Ruby.
Matutei uma solução e encontrei, criei um projeto bem simples, coloquei uma classe la dentro, e adicionei os campos, no IReport criei o&nbsp;relatório&nbsp;com base naqueles campos. A classe ficou mais ou menos como a classe abaixo:

public class Relatorio{
  private Integer issue_id;
  private String issue_subject;
  private String issue_description;
}
criei assim mesmo fora do padrão com os underlines (_) para ser mais facil pro ruby reconhecer.
depois da busca efetuada, percorri o resultado e fui criando novos objetos desse relatorio, passei esse objeto para o model Relatorio e no final converti o Ruby Array em um ArrayList e depois em um JRBeanCollection

@dataSource = JRBeanCollectionDataSource.new(ArrayList.new(dados))

editei tbm o metodo to_pdf e ficou assim:
def to_pdf
    fill = JasperFillManager.fill_report(@modelo, @params, @dataSource)
    pdf = JasperExportManager.export_report_to_pdf(fill)
    return String.from_java_bytes(pdf)
end

e pronto, agora estou com o Redmine rodando no mongrel e gerando relatório em PDF com o JasperReports.

Em tempo: Criei um jasper.rb na pasta config/initializers, ele carrega as libs ao invés de deixar no model.

Tbm alterei os observers e os fiz rodar em um Thread a demora do servidor de email pra responder causava lentidão no sistema, por exemplo o MessageOberver

class MessageObserver &lt; ActiveRecord::Observer
  def after_create(message)
    t = java.lang.Thread.new do
      Mailer.deliver_message_posted(message) if Setting.notified_events.include
    end
    t.start
  end
end

Espero que isso seja util pra mais alguém, qualquer dúvida comenta ai que vejo se posso ajudar.