Introdução
Nesse vigésimo segundo post vou continuar com a implementação para interação com o BPM modelado nos posts anteriores.
Acionando BPM
Agora vou implementar no LancamentoObserver para criar uma instância do fluxo BPM quando o lancamento for efetuado pelo Operador:
LancamentoObserver.java:
private void instanciaFluxoLancamentoOperador(@Observes @JArchEventInsert(momentPersist = MomentType.AFTER)
LancamentoEntity lancamento, UserInformation userInformation,
RuntimeService runtimeService) {
if (userInformation.get(UsuarioEntity.class).getCargo() != CargoType.OPERADOR) {
return;
}
if (!parametroUtilizaBpmAutorizacaoLancamento.getValue()) {
return;
}
runtimeService
.createProcessInstanceByKey("process-avaliacao-conta")
.businessKey(lancamento.getId().toString())
.setVariable("descricao", lancamento.getDescricao())
.setVariable("valor", lancamento.getValor().doubleValue())
.setVariable("vencimento", lancamento.getVencimento())
.execute();
}
Agora vou gerar as classes para listar as tarefas dentro da aplicação. Vou criar o pacote bpm dentro do contas-client e adicionar a classe AutorizacaoTaskBean para configurar os atributos que serão mostrados no card da tarefa. Segue a implementação:
AutorizacaoTaskBean.java:
public class AutorizacaoTaskBean extends BaseTaskBean {
private String descricao;
private Double valor;
private LocalDate vencimento;
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Double getValor() {
return valor;
}
public void setValor(Double valor) {
this.valor = valor;
}
public LocalDate getVencimento() {
return vencimento;
}
public void setVencimento(LocalDate vencimento) {
this.vencimento = vencimento;
}
}
Vou implementar também o Search que implementa a classe anterior:
AutorizacaoTaskBeanSearch.java:
@Dependent
public class AutorizacaoTaskBeanSearch extends Search<AutorizacaoTaskBean> {
}
Agora vou criar o Delegate de apagar a conta:
ApagaLancamentoDelegate.java:
@Named
public class ApagaLancamentoDelegate implements JavaDelegate {
@Inject
private LancamentoFacade lancamentoFacade;
@Override
public void execute(DelegateExecution execution) {
Long idLancamento = Long.valueOf(execution.getBusinessKey());
lancamentoFacade.delete(idLancamento);
}
}
Agora vou criar o Delegate de aprovar a conta:
AprovacaoLancamentoDelegate.java:
@Named
public class AprovacaoLancamentoDelegate implements JavaDelegate {
@Inject
private LancamentoFacade lancamentoFacade;
@Override
public void execute(DelegateExecution execution) {
Long idLancamento = Long.valueOf(execution.getBusinessKey());
lancamentoFacade.autorizaConta(idLancamento);
}
}
Agora vou criar a Action da lista de Aprovação de Contas da lista de tarefas:
AutorizacaoLancamentoListTaskAction.java:
@JArchViewScoped
public class AutorizacaoLancamentoListTaskAction extends BaseListTaskAction<AutorizacaoTaskBean> {
@Inject
private UserInformation userInformation;
@Inject
private ProcessEngine processEngine;
private List<AutorizacaoTaskBean> listaTarefa = new ArrayList<>();
private UsuarioEntity usuarioLogado;
@Override
public List<AutorizacaoTaskBean> getListTask() {
return listaTarefa;
}
@Override
public String getName() {
return BundleUtils.messageBundle("label.autorizacaoConta");
}
@Override
public Integer getOrderTab() {
return 1;
}
@Override
public void executeSearch() {
usuarioLogado = userInformation.get(UsuarioEntity.class);
listaTarefa.clear();
TaskQuery taskQuery = processEngine
.getTaskService()
.createTaskQuery()
.processDefinitionKey("process-avaliacao-conta")
.active()
.initializeFormKeys()
.withCandidateGroups()
.taskCandidateGroup(usuarioLogado.getCargo().name())
.includeAssignedTasks();
if (getFieldSearch("dataInicial").get().isAddedValue()) {
taskQuery.processVariableValueGreaterThanOrEquals("vencimento", getFieldSearch("dataInicial").get().getValueReadyFilter());
}
if (getFieldSearch("dataFinal").get().isAddedValue()) {
taskQuery.processVariableValueLessThanOrEquals("vencimento", getFieldSearch("dataFinal").get().getValueReadyFilter());
}
if (getFieldSearch("valorInicial").get().isAddedValue()) {
taskQuery.processVariableValueGreaterThanOrEquals("valor", getFieldSearch("valorInicial").get().getValueReadyFilter());
}
if (getFieldSearch("valorFinal").get().isAddedValue()) {
taskQuery.processVariableValueLessThanOrEquals("valor", getFieldSearch("valorFinal").get().getValueReadyFilter());
}
taskQuery
.list()
.stream()
.forEach(t -> adicionaListaTarefa(t));
}
private void adicionaListaTarefa(Task task) {
Map<String, Object> variaveis = processEngine.getRuntimeService().getVariables(task.getProcessInstanceId());
AutorizacaoTaskBean taskBean = new AutorizacaoTaskBean();
taskBean.addDetail(new BaseTaskDetailBean(BundleUtils.messageBundle("label.descricao"),
(String) variaveis.get("descricao")));
taskBean.addDetail(new BaseTaskDetailBean(BundleUtils.messageBundle("label.vencimento"),
DateUtils.formatddMMyyyy((LocalDate) variaveis.get("vencimento"))));
taskBean.addDetail(new BaseTaskDetailBean(BundleUtils.messageBundle("label.valor"),
NumberUtils.formatMoney((Double) variaveis.get("valor"))));
taskBean.setTask(new TaskBean(task.getId(), task.getExecutionId(),
task.getProcessInstanceId(), task.getFormKey(), task.getName(),
task.getAssignee(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(),
DateUtils.toLocalDateTime(task.getCreateTime()), task.getPriority()));
listaTarefa.add(taskBean);
} }
Agora vou implementar a Action principal onde será adicionado todas as Action's de tarefas:
BpmListAction.java:
@JArchViewScoped
public class BpmListAction extends BaseCollectionTaskListAction {
@Inject
private void addActions(AutorizacaoLancamentoListTaskAction autorizacaoListTaskAction) {
addListTaskAction(autorizacaoListTaskAction);
}
}
E preciso configurar o package-info do search anterior:
package-info.java:
@JArchSearchField(clazzEntity = AutorizacaoTaskBean.class, id = "valorInicial", attribute = "valor",
label = "label.valor", type = FieldType.MONEY, row = 1, column = 1, span = 3,
condition = ConditionSearchType.LARGER_EQUAL, disableCondition = true)
@JArchSearchField(clazzEntity = AutorizacaoTaskBean.class, id = "valorFinal", attribute = "valor",
label = "label.valor", type = FieldType.MONEY, row = 1, column = 2, span = 3,
condition = ConditionSearchType.LESS_EQUAL, disableCondition = true)
@JArchSearchField(clazzEntity = AutorizacaoTaskBean.class, id = "dataInicial", attribute = "vencimento",
label = "label.vencimento", type = FieldType.DATE, row = 1, column = 3, span = 3,
condition = ConditionSearchType.LARGER_EQUAL, disableCondition = true)
@JArchSearchField(clazzEntity = AutorizacaoTaskBean.class, id = "dataFinal", attribute = "vencimento",
label = "label.vencimento", type = FieldType.DATE, row = 1, column = 4, span = 3,
condition = ConditionSearchType.LESS_EQUAL, disableCondition = true)
package br.com.jarch.contas.client.bpm;
import br.com.jarch.annotation.JArchSearchField;
import br.com.jarch.util.type.ConditionSearchType;
import br.com.jarch.util.type.FieldType;
Agora vou criar a pasta bpm dentro de paginas no contas-web e adicionar o seguinte arquivo:
tarefaList.xhtml:
<!DOCTYPE html>
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:w="http://arch.com/jsf/ui"
>
<ui:composition template="/paginas/templates/templatePrincipalV2.xhtml">
<ui:define name="panelBodyTemplatePrincipal">
<w:form>
<ui:include src="../bpmn/listTask.xhtml">
<ui:param name="actionList" value="#{bpmListAction}"/>
</ui:include>
</w:form>
</ui:define>
</ui:composition>
</html>
Agora vou adicionar o item de menu Lista Tarefa logo abaixo de Aterar Senha:
MenuAction.java:
@JArchViewScoped
public class MenuAction extends BaseMenuAction {
@JArchParameter
@Inject
private ParametroUtilizaBpmAutorizacaoLancamento parametroUtilizaBpmAutorizacaoLancamento;
@Override
public List<IMenu> createMenu() {
List<IMenu> menu = new ArrayList<>();
menu.add(MenuBuilder
.newInstance()
.name(BundleUtils.messageBundle("label.alterarSenha"))
.action("../login/alterarSenha.jsf")
.build());
if (parametroUtilizaBpmAutorizacaoLancamento.getValue()) {
menu.add(MenuBuilder
.newInstance()
.name(BundleUtils.messageBundle("label.listaTarefa"))
.action("../bpm/tarefaList.jsf")
.build());
}
/* CODIGO POSTERIOR OCULTADO */
E a criação da chave no bundle.
bundle_pt_BR.properties:
label.autorizacaoConta=Autoriza\u00E7\u00E3o Conta
A estrutura para listagem das tarefas e delegates está totalmente concluída com os passos acima. Agora falta somente ajustar a tela de lançamento para interceptar o acesso via Task, onde será acionado uma ação dinâmica de aprovação. Mas vou deixar isso pro próximo post.
Conclusão
Nesse post eu adicionei mais implementações necessárias para a automatização do fluxo. Nos próximos posts vou continuar com as demais implementações.
Nenhum comentário:
Postar um comentário