Introdução
Nesse vigésimo oitavo post vou fazer algumas refatorações e pequenos ajustes na aplicação.
Correção Aprovação
Nossa aplicação está ocorrendo um erro quando uma conta é aprovada, esse problema está ocorrendo porque utilizei o momento errado de interceptar o evento da ação dinâmica. No LancamentoObserver existe o seguinte método:
LancamentoObserver.java:
LancamentoObserver.java:
private void avaliacao(@Observes@JArchEventDynamicBefore(Constant.ID_AVALIAR_LANCAMENTO) LancamentoEntity lancamento, UserInformation userInformation, TaskService taskService) {
UsuarioEntity usuarioLogado = userInformation.get(UsuarioEntity.class);
String variavelAprovacao;
if (usuarioLogado.getCargo() == CargoType.SUPERVISOR) {
variavelAprovacao = "aprovadoSupervisor";
} else if (usuarioLogado.getCargo() == CargoType.GERENTE) {
variavelAprovacao = "aprovadoGerente";
} else {
variavelAprovacao = "aprovadoDiretor";
}
taskService.complete(lancamento.getTask().get().getId(),
Map.of(variavelAprovacao, lancamento.isAprovado(),
"valorLancamento", lancamento.getValor().doubleValue()));
}
Vou alterar o @JArchEventDynamicBefore para @JArchEventDynamicAfter:
private void avaliacao(@Observes @JArchEventDynamicAfter(Constant.ID_AVALIAR_LANCAMENTO) LancamentoEntity lancamento, UserInformation userInformation, TaskService taskService) {
UsuarioEntity usuarioLogado = userInformation.get(UsuarioEntity.class);
String variavelAprovacao;
if (usuarioLogado.getCargo() == CargoType.SUPERVISOR) {
variavelAprovacao = "aprovadoSupervisor";
} else if (usuarioLogado.getCargo() == CargoType.GERENTE) {
variavelAprovacao = "aprovadoGerente";
} else {
variavelAprovacao = "aprovadoDiretor";
}
taskService.complete(lancamento.getTask().get().getId(),
Map.of(variavelAprovacao, lancamento.isAprovado(),
"valorLancamento", lancamento.getValor().doubleValue()));
}
Ordem Download Comprovante
Na tela de lista de lançamentos o atributo order está setado como 3 conflitando com o a ação dinâmica de avaliar conta, vou alterar o valor para 4:
LancamentoListAction.java:
@JArchDynamicDownload(id = "idDownloadComprovanteBaixa", labelMenu = "label.comprovanteBaixa", order = 4, elDisabled = "#{(l -> l.aberto)(lancamento)}")
public StreamedContent downloadComprovanteBaixa(LancamentoEntity lancamento) {
return getFacade().downloadComprovanteBaixa(lancamento);
}
Refatoração init() do LancamentoListAction
O método init() no LancamentoListAction apesar de bem escrito e legível podemos melhorar usa leitura refatorando em pequenos métodos. Atualmente o método está implementado da seguinte maneira:
LancamentoListAction.java:
@PostConstruct
private void init() {
if (isStartedWorkFlow()) {
Long idLancamento = Long.valueOf(getTask().get().getBusinessKey());
LancamentoEntity lancamento = getFacade().find(idLancamento);
tipoLancamento = lancamento.getTipoLancamento();
callActionDynamic(idLancamento, Constant.ID_AVALIAR_LANCAMENTO);
return;
}
deactiveWhereJpa(LancamentoEntity.FILTRO_VENCIDO);
deactiveWhereJpa(LancamentoEntity.FILTRO_VENCENDO);
deactiveWhereJpa(LancamentoEntity.FILTRO_ID);
tipoLancamento = TipoLancamentoType.valueOf(JsfUtils.getParameterRequest("tipo"));
activeAndAddParamWhereJpa(LancamentoEntity.FILTRO_TIPO_LANCAMENTO, "tipoLancamento", tipoLancamento);
String statusParam = JsfUtils.getParameterRequest("status");
if (statusParam != null) {
StatusLancamentoType status = StatusLancamentoType.valueOf(statusParam);
if (StatusLancamentoType.VENCIDO.equals(status)) {
activeAndAddParamWhereJpa(LancamentoEntity.FILTRO_VENCIDO, "dataSistema", LocalDate.now());
} else if (StatusLancamentoType.VENCENDO.equals(status)) {
activeAndAddParamWhereJpa(LancamentoEntity.FILTRO_VENCENDO, "dataSistema", LocalDate.now());
}
}
String id = JsfUtils.getParameterRequest("id");
if (id != null) {
activeAndAddParamWhereJpa(LancamentoEntity.FILTRO_ID, "id", Long.valueOf(id));
}
if (!parametroUtilizaPessoa.getValue()) {
getColumnDataTable("pessoa.nome").ifPresent(c -> c.hide());
}
getFieldSearch("vencimentoInicio").ifPresent(f -> f.disabledCondition(true));
getFieldSearch("vencimentoFim").ifPresent(f -> f.disabledCondition(true));
getFieldSearch("valorInicio").ifPresent(f -> f.disabledCondition(true));
getFieldSearch("valorFim").ifPresent(f -> f.disabledCondition(true));
}
Vou começar refatorando pelo primeiro IF onde verificar se a chamada foi feito via lista de tarefa (BPM).
@PostConstruct
private void init() {
if (isStartedWorkFlow()) {
chamaAvalicaoConta();
return;
}
private void chamaAvalicaoConta() {
Long idLancamento = Long.valueOf(getTask().get().getBusinessKey());
LancamentoEntity lancamento = getFacade().find(idLancamento);
tipoLancamento = lancamento.getTipoLancamento();
callActionDynamic(idLancamento, Constant.ID_AVALIAR_LANCAMENTO);
}
Agora vou refatorar também onde está limpando os filtros:
@PostConstruct
private void init() {
if (isStartedWorkFlow()) {
chamaAvalicaoConta();
return;
}
limpaFiltros();
private void limpaFiltros() {
deactiveWhereJpa(LancamentoEntity.FILTRO_VENCIDO);
deactiveWhereJpa(LancamentoEntity.FILTRO_VENCENDO);
deactiveWhereJpa(LancamentoEntity.FILTRO_ID);
}
Agora vou ajustar o filtro de tipo de lancamento:
@PostConstruct
private void init() {
if (isStartedWorkFlow()) {
chamaAvalicaoConta();
return;
}
limpaFiltros();
configuraFiltroTipoLancamento();
private void configuraFiltroTipoLancamento() {
tipoLancamento = TipoLancamentoType.valueOf(JsfUtils.getParameterRequest("tipo"));
activeAndAddParamWhereJpa(LancamentoEntity.FILTRO_TIPO_LANCAMENTO, "tipoLancamento", tipoLancamento);
}
Agora vou ajustar o filtro de status:
@PostConstruct
private void init() {
if (isStartedWorkFlow()) {
chamaAvalicaoConta();
return;
}
limpaFiltros();
configuraFiltroTipoLancamento();
configuraFiltroStatus();
private void configuraFiltroStatus() {
String statusParam = JsfUtils.getParameterRequest("status");
if (statusParam != null) {
StatusLancamentoType status = StatusLancamentoType.valueOf(statusParam);
if (StatusLancamentoType.VENCIDO.equals(status)) {
activeAndAddParamWhereJpa(LancamentoEntity.FILTRO_VENCIDO, "dataSistema", LocalDate.now());
} else if (StatusLancamentoType.VENCENDO.equals(status)) {
activeAndAddParamWhereJpa(LancamentoEntity.FILTRO_VENCENDO, "dataSistema", LocalDate.now());
}
}
}
Agora o filtro por ID:
@PostConstruct
private void init() {
if (isStartedWorkFlow()) {
chamaAvalicaoConta();
return;
}
limpaFiltros();
configuraFiltroTipoLancamento();
configuraFiltroStatus();
configuraFiltroId();
private void configuraFiltroId() {
String id = JsfUtils.getParameterRequest("id");
if (id != null) {
activeAndAddParamWhereJpa(LancamentoEntity.FILTRO_ID, "id", Long.valueOf(id));
}
}
Agora configuração de visualização da coluna nome da pessoa no datatable:
@PostConstruct
private void init() {
if (isStartedWorkFlow()) {
chamaAvalicaoConta();
return;
}
limpaFiltros();
configuraFiltroTipoLancamento();
configuraFiltroStatus();
configuraFiltroId();
configuraVisualizacaoColunaPessoa();
private void configuraVisualizacaoColunaPessoa() {
if (!parametroUtilizaPessoa.getValue()) {
getColumnDataTable("pessoa.nome").ifPresent(c -> c.hide());
}
}
E por último o bloqueio das condições de datas e valores na div de pesquisa:
@PostConstruct
private void init() {
if (isStartedWorkFlow()) {
chamaAvalicaoConta();
return;
}
limpaFiltros();
configuraFiltroTipoLancamento();
configuraFiltroStatus();
configuraFiltroId();
configuraVisualizacaoColunaPessoa();
desabilitaCondicaoIntervalo();
}
private void desabilitaCondicaoIntervalo() {
getFieldSearch("vencimentoInicio").ifPresent(f -> f.disabledCondition(true));
getFieldSearch("vencimentoFim").ifPresent(f -> f.disabledCondition(true));
getFieldSearch("valorInicio").ifPresent(f -> f.disabledCondition(true));
getFieldSearch("valorFim").ifPresent(f -> f.disabledCondition(true));
}
Conclusão
Nesse post fiz algumas melhorias no código. Melhorias no código devem ser frequentemente aplicadas, principamente quando o código sofre constantes alterações ou implementações. Uma boa prática de programação é sempre manter o código mais simples possível, ser auto documentado, utilização de boas práticas de programação orientada a objetos, buscando sempre a coesão e desacoplamento.