domingo, 28 de junho de 2020

Contas Pagar/Receber - Parte IX - Retoques Finais Lançamento

Introdução
Nesse nono post vou mostrar alguns recursos pra dar um toque final nos lançamentos de conta pagar e receber. Primeiro vou ajustar a tela de dados pra ficar com os campos bloqueados quando for acionado via ação dinâmica. Segundo vou ajustar os menus de acões Alterar e Excluir para ficar bloqueados caso a conta esteja baixado. Terceiro vou ajustar o atributo aberto do LancamentoEntity para true quando um conta for clonada. E pra finalizar vou adicionar os card's no dashboard de Contas Pagar, Contas Pago, Contas Receber, Contas Recebido.

Bloquear Tela Dados 
Quando a tela de dados for acionado via ação dinâmica vou mostrar como bloquear os campos, porque não faz sentido alterar alguma informação sendo que a tela foi acessada pra confirmar o cancelamento da baixa. Pra isso vou executar o método blockedMaster() na construção da action caso a ação seja dinâmica:
LancamentoDataAction.java:

@PostConstruct
private void init() {
tipoLancamento = TipoLancamentoType.abbreviationToEnum(JsfUtils.getParameterRequest("tipo"));
if (isStateInsert()) {
getEntity().setTipoLancamento(tipoLancamento);
} else if (isStateDynamic()) {
blockedMaster();
}
}

Executando a ação dinâmica:
No print acima podemos verificar que as ações de Alterar e Excluir estão desabilitadas porque a conta está baixado.

Bloquear Ação CRUD 
Quando uma conta estiver baixado vou bloquear as ações de Alterar e Excluir. Porque não faz sentido alterar ou apagar uma conta quando a mesma já foi baixado. Para isso vou adicionar as propriedades elChangeDisabled e elDeleteDisabled no e:divListaDatatable no lancamentoList.xhtml. Segue a implementação:
<e:divListDatatable id="listEntityDataTableLancamento"
title="#{e:bundle('label.lista')} - #{lancamentoListAction.tipoLancamento.description}"
actionList="#{lancamentoListAction}" showColumnsTotalizer="true"
varRowDataTable="lancamento"
elChangeDisabled="#{(l -> not l.aberto)(lancamento)}"
elDeleteDisabled="#{(l -> not l.aberto)(lancamento)}"/>
E o resultado no menu:

@JArchEventCloneEntity 
Quando uma conta for clonada vou alterar o atributo aberto do LancamentoEntity para true. Então mesmo que a clonagem de conta baixada a nova conta gerada ficara aberta. Pra essa solução vou utilizar a anotação @JArchEventCloneEntity para inteceptar o momento da clonagem e alterar o atributo. Segue o excmplo:
LancamentoObserver.java: 

private void clonaLancamento(@Observes @JArchEventCloneEntity LancamentoEntity lancamento) {
lancamento.setAberto(true);
}


Card's Lançamentos
Agora vou mostrar com adicionar 4 novos card's no dashboad: Contas Pagar, Contas Pago, Contas Receber e Contas Recebido. Vou começar adicionando os card's no dashboard da tela de Bem Vindo. bemVindo.xhtml
<e:dashboardUnity icon="fa fa-money fa-5x"
classMinHeight="h100"
styleIcon="color: red"
title="#{bemVindoAction.quantidadeContaPagar}"
labelButtonLink="#{e:bundle('label.acessar')}"
link="../lancamento/lancamentoList.jsf?tipo=PAG"
descriptionLink="#{e:bundle('message.acessarPagina')}"/>

<e:dashboardUnity icon="fa fa-money fa-5x"
classMinHeight="h100"
styleIcon="color: orange"
title="#{bemVindoAction.quantidadeContaPago}"
labelButtonLink="#{e:bundle('label.acessar')}"
link="../lancamento/lancamentoList.jsf?tipo=PAG"
descriptionLink="#{e:bundle('message.acessarPagina')}"/>

<e:dashboardUnity icon="fa fa-money fa-5x"
classMinHeight="h100"
styleIcon="color: blue"
title="#{bemVindoAction.quantidadeContaReceber}"
labelButtonLink="#{e:bundle('label.acessar')}"
link="../lancamento/lancamentoList.jsf?tipo=REC"
descriptionLink="#{e:bundle('message.acessarPagina')}"/>

<e:dashboardUnity icon="fa fa-money fa-5x"
classMinHeight="h100"
styleIcon="color: green"
title="#{bemVindoAction.quantidadeContaRecebido}"
labelButtonLink="#{e:bundle('label.acessar')}"
link="../lancamento/lancamentoList.jsf?tipo=REC"
descriptionLink="#{e:bundle('message.acessarPagina')}"/>
A novidade em relação ao post de dashboard está por conta da propriedade styleIcon, que para cada card está sendo estilizado com uma cor diferente. Agora segue a implementação na action de bem vindo.
BemVindoAction.java

@Inject
public LancamentoFacade lancamentoFacade;
public
String getQuantidadeContaPagar() {
return BundleUtils.messageBundle("label.contaPagar") + " " +
lancamentoFacade
.clientJpaql()
.where()
.equalsTo(LancamentoEntity_.tipoLancamento, TipoLancamentoType.PAGAR)
.and()
.equalsTo(LancamentoEntity_.aberto, true)
.collect()
.count();
}

public String getQuantidadeContaPago() {
return BundleUtils.messageBundle("label.contaPago") + " " +
lancamentoFacade
.clientJpaql()
.where()
.equalsTo(LancamentoEntity_.tipoLancamento, TipoLancamentoType.PAGAR)
.and()
.equalsTo(LancamentoEntity_.aberto, false)
.collect()
.count();
}

public String getQuantidadeContaReceber() {
return BundleUtils.messageBundle("label.contaReceber") + " " +
lancamentoFacade
.clientJpaql()
.where()
.equalsTo(LancamentoEntity_.tipoLancamento, TipoLancamentoType.RECEBER)
.and()
.equalsTo(LancamentoEntity_.aberto, true)
.collect()
.count();
}

public String getQuantidadeContaRecebido() {
return BundleUtils.messageBundle("label.contaRecebido") + " " +
lancamentoFacade
.clientJpaql()
.where()
.equalsTo(LancamentoEntity_.tipoLancamento, TipoLancamentoType.RECEBER)
.and()
.equalsTo(LancamentoEntity_.aberto, false)
.collect()
.count();
}

As quantidades acima está usando a JPQL do JARCH através da Fachada. Para maiores informações sobre a JPQL do JARCH ver os posts: 
https://jarchframe.blogspot.com/2018/08/biblioteca-jpql-jarch.html 
Adicionar as seguintes chaves no bundle:
label.contaPago=Conta Pago
label.contaRecebido=Conta Recebido
E um pequeno ajuste no tamanho da fonte do card, adicionando o seguinte seletor css.
bemVindo.css:

.jarch__dashboard-conteiner h3 {
font-size: 20px;
}
O resultado do dashboard:


Conclusão
Nesse post mostrei mais alguns recursos, como desabilitar os componentes na tela de dados quando for ação dinâmica, como inteceptar o evento de clone, desabilitação dos menus de CRUD e adição de card's estilizados. No próximo post vou mostrar outros recursos do JARCH. 

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

Até mais,

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...