sábado, 4 de julho de 2020

Contas Pagar/Receber - Parte XI - Mensagens e Alertas

Introdução
Nesse décimo primeiro post vou mostrar como utilizar o recurso de mensagem e alerta. O JARCH  possuí uma biblioteca que permite gerar alertas e mensagens de forma fácil e prática. Vou utilizar o recurso de Alerta para mostrar quantas contas estão vencidas e vencendo. Para o recurso de Mensagem vou utilizar para mostrar essas contas (vencida e vencendo). 

Atualizando Versão
Antes de mais nada vamos atualizar nossa aplicação para utilizar a versão mais atual do JARCH. Nesse momento a versão do JARCH atual do meu projeto é 20.6.0-SNAPSHOT, vou atualizar para a versão 20.7.0-SNAPSHOT. No pom.xml do meu projeto principal vou atualizar o seguinte property <jarch-version> conforme exemplo:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>br.com.jarch.contas</groupId>
<artifactId>contas</artifactId>
<version>1.0.0</version>
<name>contas</name>
<packaging>pom</packaging>

<properties>
<jarch-version>20.7.0-SNAPSHOT</jarch-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Será necessário ajustar também todos os persistence.xml dos 3 módulos (contas-web, contas-job e contas-ws) para:
persistence.xml:
<jar-file>lib/contas-client-1.0.0.jar</jar-file>
<jar-file>lib/jarch-core-20.7.0-SNAPSHOT.jar</jar-file>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
Alerta
Os alertas são mostrados através do ícone no canto superior direito do template da aplicação. Segue o print desse ícone:
                                           
Para alimentar as informações de alertas é necessário dispobilizar via CDI o acesso a uma instância de Alerts. Alerts é uma classe do JARCH do tipo ArrayList<Alert>, estão vou criar itens dessa instância utilizando um Builder do próprio JARCH. Vou alimentar esse objeto com a quantidade de contas a pagar vencido e quantidade contas pagar vencendo. Primeiro vou criar um método na fachada que vai criar essa instância de Alerts:
LancamentoFacade.java:

public Alerts getAlerts() {
Alerts alerts = new Alerts();

long contasPagarVencido = clientJpaql()
.where()
.equalsTo(LancamentoEntity_.tipoLancamento, TipoLancamentoType.PAGAR)
.and()
.lessThan(LancamentoEntity_.vencimento, LocalDate.now())
.collect()
.count();

if (contasPagarVencido > 0) {
alerts.add(AlertBuilder
.newInstance()
.danger()
.title(BundleUtils.messageBundle("label.pagarVencido"))
.description(contasPagarVencido + " " + BundleUtils.messageBundle("label.contaPagar"))
.build());
}

long contasPagarVencendo = clientJpaql()
.where()
.equalsTo(LancamentoEntity_.tipoLancamento, TipoLancamentoType.PAGAR)
.and()
.equalsTo(LancamentoEntity_.vencimento, LocalDate.now())
.collect()
.count();

if (contasPagarVencendo > 0) {
alerts.add(AlertBuilder
.newInstance()
.warning()
.title(BundleUtils.messageBundle("label.pagarVencendo"))
.description(contasPagarVencendo + " " + BundleUtils.messageBundle("label.contaPagar"))
.build());
}

return alerts;
}
No print anterior adicionei os itens em alerts através do builder AlertBuilder.
Agora vou adicionar essa instância na sessão do JARCH assim que o usuário acessar a aplicação:
SessionListener.java:
@WebListener
public class SessionListener implements HttpSessionListener {

@Inject
private SessionInformation sessionInformation;

@Inject
private LancamentoFacade lancamentoFacade;

@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
sessionInformation.put("alerts", lancamentoFacade.getAlerts());
}

@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
//
}
}
E pra finalizar preciso disponibilizar o acesso a informação através de um produtor CDI. Então vou criar a classe AlertsProduces no pacote lancamento:
AlertsProduces.java:

public class AlertsProduces {

@Produces
public Alerts alerts(SessionInformation sessionInformation) {
return (Alerts) sessionInformation.get("alerts");
}
}
Agora vou adicionar as 2 chaves novas no bundle.
bundle_pt_BR.properties:

label.pagarVencido=Pagar Vencido
label.pagarVencendo=Pagar Vencendo
Após compilar e publicar a aplicação o resultado:

E clicando nele vejo os alertas:

Mensagem
As mensagens são mostradas através do ícone no canto superior direito do template da aplicação. Segue o print desse ícone:
Para alimentar as informações de mensagens é necessário dispobilizar via CDI o acesso a uma instância de Messages. Messages é uma classe do JARCH do tipo ArrayList<Message>, estão vou criar itens dessa instância utilizando um Builder do próprio JARCH. Vou alimentar esse objeto com o valor e descrição de contas a pagar vencido, valor e descrição de contas pagar vencendo. Primeiro vou criar um método na fachada que vai criar essa instância de Messages:
LancamentoFacade.java:

public Messages getMessages() {
Messages messages = new Messages();

Collection<LancamentoEntity> contasPagar = clientJpaql()
.where()
.equalsTo(LancamentoEntity_.tipoLancamento, TipoLancamentoType.PAGAR)
.and()
.lessOrEqualsThan(LancamentoEntity_.vencimento, LocalDate.now())
.and()
.equalsTo(LancamentoEntity_.aberto, true)
.collect()
.list();

contasPagar
.stream()
.filter(l -> l.getVencimento().isBefore(LocalDate.now())) // Somente Vencido
.sorted(Comparator.comparing(LancamentoEntity::getVencimento).reversed())
.forEach(l ->
messages
.add(MessageBuilder
.newInstance()
.code(l.getId())
.danger()
.title(BundleUtils.messageBundle("label.pagarVencido"))
.description(DateUtils.formatddMMyyyy(l.getVencimento()) + " " + l.getDescricao())
.build()));

contasPagar
.stream()
.filter(l -> l.getVencimento().isEqual(LocalDate.now())) // Somente Vencendo
.sorted(Comparator.comparing(LancamentoEntity::getVencimento).reversed())
.forEach(l ->
messages
.add(MessageBuilder
.newInstance()
.code(l.getId())
.warning()
.title(BundleUtils.messageBundle("label.pagarVencendo"))
.description(DateUtils.formatddMMyyyy(l.getVencimento()) + " " + l.getDescricao())
.build()));

return messages;
}
Observe que o messages acima está sendo alimentado através do builder MessageBuilder.
Agora vou adicionar essa instância na sessão do JARCH assim que o usuário acessar a aplicação:
SessionListener.java:

@WebListener
public class SessionListener implements HttpSessionListener {

@Inject
private SessionInformation sessionInformation;

@Inject
private LancamentoFacade lancamentoFacade;

@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
sessionInformation.put("alerts", lancamentoFacade.getAlerts());
sessionInformation.put("messages", lancamentoFacade.getMessages());
}

@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
//
}
}
E pra finalizar preciso disponibilizar o acesso a informação através de um produtor CDI. Então vou criar a classe MessagesProduces no pacote lancamento:
MessagesProduces.java:

public class MessagesProduces {

@Produces
public Messages messages(SessionInformation sessionInformation) {
return (Messages) sessionInformation.get("messages");
}
}
Após compilar e publicar a aplicação o resultado:
E clicando nele vejo as mensagens:

Conclusão
Nesse post mostrei como utilizar um recurso interessante que são os Alerts e Messages. Com alguns passos consegui adicionar alertas e mensagens usandos os recursos do JARCH. No próximo post vou fazer algumas melhorias na aplicação, dentre elas criar um link a partir dos alertas e mensagens para carregar os dados.

Segue o link dessa video aula: https://youtu.be/zTzcIdOfKyg

Até mais,

Nenhum comentário:

Postar um comentário

Versão 23.3.0-Final

      Introdução Nesse post vou mostrar as principais novidades da versão 23.3.0, algumas correções e pequenas alterações. Alterações Além d...