Objetivo
Este documento tem como objetivo mostrar como deve ser criado uma nova classe que será colocada dentro de um fluxo do PDV, durante as customizações e desenvolvimento de novas funcionalidades.
Arquitetura
Para uma classe ser aceita dentro de um fluxo do PDV, ela precisa seguir algumas regras.
A primeira regra é que ela obrigatoriamente precisa herdar de com.csi.statemachine.ExecutableFlowObject ou herdar de alguma outra classe que já possua essa herança. Por convenção, as classes que recebem essa herança, devem ser nomeadas com o prefixo EFO, um exemplo de nomenclatura seria EFOMinhaClasse.java.
ExecutableFlowObject é uma classe abstrata, onde quem herda precisa implementar o método execute(). Essa é a segunda regra, cujo método execute precisa retornar um ExecutionResult. Este será utilizado para determinar qual o caminho deve ser seguido no fluxo da operação que está sendo executada pelo PDV.
Mais abaixo vamos demonstrar com exemplos de código, como essas classes devem ser criadas.
Exemplo Prático
Abaixo veremos como devemos criar uma nova EFO que será utilizada dentro de um fluxo de uma operação no PDV.
Criação da classeAo lado temos um exemplo de como uma EFO deve ser criada. Essa classe terá a função de processar um pagamento de fatura. Logo, vamos definir um nome que deixe claro o objetivo dela. Não podemos esquecer o prefixo EFO. Ela herda de ExecutableFlowObject e, além disso, já criamos a classe com uma implementação mínima do método execute(). | Criando uma nova EFO package com.linx.storex.custom.negocio.executavel; import java.util.Map; import com.csi.statemachine.ExecutableFlowObject; import com.csi.statemachine.ExecutionResult; import com.csi.statemachine.State; import com.csi.statemachine.StateChangeRequest; public class EFOPagamentoFatura extends ExecutableFlowObject { @Override public ExecutionResult execute(StateChangeRequest arg0, State arg1, Map arg2) { // TODO Auto-generated method stub return null; } } |
Definição das saídas (ExecutionResult)Vamos agora definir as saídas dessa EFO, ou seja, os resultados possíveis que o método execute poderá retornar. Esses resultados serão referenciados no diagrama de fluxo da operação (isso será demonstrado mais para frente). Ao lado podemos ver duas constantes, que representam as saídas possíveis para a execução do método execute() da classe EFOPagamentoFatura. São elas:
| Definindo saídas package com.linx.storex.custom.negocio.executavel; import java.util.Map; import com.csi.statemachine.ExecutableFlowObject; import com.csi.statemachine.ExecutionResult; import com.csi.statemachine.State; import com.csi.statemachine.StateChangeRequest; public class EFOPagamentoFatura extends ExecutableFlowObject { private static ExecutionResult PAGAMENTO_REALIZADO = new ExecutionResult("PAGAMENTO_REALIZADO"); private static ExecutionResult PAGAMENTO_NAO_REALIZADO = new ExecutionResult("PAGAMENTO_NAO_REALIZADO"); @Override public ExecutionResult execute(StateChangeRequest stateChangeRequest , State state, Map map) { // TODO Auto-generated method stub return null; } } |
Método execute()
O método execute() recebe alguns parâmetros, que são passados entre as EFOs executadas em um fluxo. São eles:
Na imagem ao lado, podemos ver a representação gráfica da EFOPagamentoFatura com as duas saídas implementadas no exemplo acima: PAGAMENTO_REALIZADO e PAGAMENTO_NAO_REALIZADO. | Implementando método execute() private static ExecutionResult PAGAMENTO_REALIZADO = new ExecutionResult("PAGAMENTO_REALIZADO"); private static ExecutionResult PAGAMENTO_NAO_REALIZADO = new ExecutionResult("PAGAMENTO_NAO_REALIZADO"); @Override public ExecutionResult execute(StateChangeRequest stateChangeRequest, State state, Map map) { GerenciadorCMOS cmos = (GerenciadorCMOS) Componente.getInstance().getPerifericos().getCmos(); // Para ser possível fazer um pagamento de fatura, é preciso existir um cliente na CMOS. // Caso não exista, a execução do método é interrompida e retorna PAGAMENTO_NAO_REALIZADO. if(cmos.getClienteProprio() == null) { return PAGAMENTO_NAO_REALIZADO; } // Pega o cliente da CMOS e converte para o objeto que será utilizado na tela de pagamento de fatura. ClienteProprio clienteProprio = cmos.getClienteProprio(); ClienteProprioVO clienteVO = montaClienteProprioVO(clienteProprio); if(clienteVO == null) { return PAGAMENTO_NAO_REALIZADO; } try { exibeTelaEProcessaPagamentoFatura(clienteVO, map); } catch(Exception e) { return PAGAMENTO_NAO_REALIZADO; } // Após o processamento da EFO, o método retorna PAGAMENTO_REALIZADO. return PAGAMENTO_REALIZADO; } private void exibeTelaEProcessaPagamentoFatura(ClienteProprioVO clienteVO, Map map) { // implementação do método } private ClienteProprioVO montaClienteProprioVO(ClienteProprio clienteProprio) { // implementação do método } |