Objetivo


Este documento tem como objetivo apresentar, através de exemplos práticos, quais procedimentos devem ser seguidos para alterar um fluxo existente e também o passo a passo para a criação de um novo fluxo que representará uma nova operação no PDV.


Conceitos


Antes de iniciarmos os exemplos, precisamos entender alguns conceitos importantes a respeito do funcionamento do POS Storex.

Máquina de Estados

A máquina de estados é utilizada para definir a forma como o componente deve se comportar, tendo como base o estado atual do mesmo. 

Macro-operação

As macro-operações são compostas por micro-operações. Qualquer macro-operação pode ser considerada como uma sequência de micro-operações, desmembrando da operação global até as operações individuais, com suas entradas (inputs) e saídas (outputs).

Micro-Operação

As micro-operações são executadas seguindo uma sequência definida no fluxo da macro-operação. Cada uma delas é responsável por desempenhar uma determinada função e, ao final da sua execução, gera uma saída que vai indicar qual é o próximo passo a ser executado dentro do fluxo da macro-operação.

Criando um novo Fluxo


Agora vamos mostrar o passo a passo da criação de um novo fluxo, que representará uma macro-operação de emissão de leitura de operador.


Criando o diagrama de fluxo

O primeiro passo é criar um diagrama que será utilizado na construção do fluxo. Usando a IDE eclipse indicada, vamos clicar com o botão direito do mouse no diretório src/main/resources/statemachine do projeto.

Vamos selecionar a opção "New" → "Other". Ao clicar nesse opção, será exibida uma tela para a escolha do tipo de diagrama que será construído.



Selecionando a opção de diagrama

Na imagem ao lado podemos ver a tela onde vamos selecionar o tipo de diagrama que podemos utilizar para a construção de um novo fluxo.


Definindo o nome

Após selecionar o tipo do diagrama, precisamos definir o nome desse novo diagrama.


Indicando início do fluxo

Após a criação do diagrama, vamos colocar o Start Point. Vamos abrir o arquivo meu_diagrama.executionflow_diagram. Ao lado direito da IDE Eclipse, temos as opções que podem ser usadas para a construção do fluxo.

Primeiro devemos inserir o Start Point, clicando uma vez com o botão esquerdo do mouse na opção Start Point (conforme imagem ao lado) e em seguida, novamente com o botão esquerdo, clicamos no diagrama. Um círculo de cor preta vai aparecer. Isso indica o início do fluxo.


Inserindo primeira Micro-operação


Agora vamos inserir a primeira micro-operação no fluxo. Para isso, no menu de opções do lado direito, vamos clicar uma vez na opção Executable Object. Em seguida clicamos uma vez no diagrama, próximo ao círculo de cor preta.


Selecionando uma Micro-operação

Será aberto uma tela para definir qual EFO ou Mic será executada nesse ponto do fluxo. No exemplo ao lado, vamos selecionar a MicAutorizacao. Classe responsável por verificar se o usuário tem permissão de executar o fluxo.


Micro-operação no fluxo

Após selecionar a classe que será executada, vai aparecer um retângulo de cor azul com o nome da classe que definimos no passo anterior. Isso é a representação gráfica de uma micro-operação dentro de uma macro-operação.


A primeira micro-operação executada

O próximo passo é indicar qual a primeira micro-operação será executada, quando a macro-operação for acionada. Para isso vamos estabelecer uma ligação entre o Start Point Link e a MicAutorizacao.

No menu de opções do lado direito, vamos clicar uma vez na opção Start Point Link. Em seguida vamos pressionar e segurar o botão esquerdo do mouse, em cima do círculo preto, arrastar até chegar na caixa da micro-operação e em seguida soltar o botão.

Na imagem ao lado podemos ver a ligação estabelecida entre o Start Point e a MicAutorizacao.



Conectando micro-operações

Agora vamos demonstrar como fazemos a ligação entre as micro-operações. Para isso adicionamos mais duas micro-operações no diagrama.

No menu de opções ao lado direito, clicamos uma vez na opção Flow Link. Em seguida vamos pressionar e segurar o botão esquerdo do mouse em cima da MicAutorizacao e arrastamos o mouse, ainda com o botão pressionado, até a MicVerificaPapelImpressora. Em seguida soltamos o botão.



Definindo a saída

Ao soltarmos o botão do mouse, aparecerá uma caixa de texto para colocarmos o nome da saída que corresponde ao ExecutionResult retornado pelo método execute() da classe executada.


Usuário possui permissão

Dentro da caixa de texto, vamos digitar a palavra DEFAULT. Nessa classe MicAutorizacao, quando o usuário tem permissão de executar o fluxo corrente, o método execute() vai retornar conforme o exemplo abaixo.


Usuário com permissão de acesso
public ExecutionResult execute(StateChangeRequest request, State state, Map map) {

   /*
		regra de negócio implementada
   */

	// passou pelas validações de acesso
	return new ExecutionResult("DEFAULT");
}


Usuário não possui permissão

Para a situação onde o usuário não tem permissão, o retorno da MicAutorizacao será diferente. Dessa forma devemos construir outro caminho no fluxo, impossibilitando o usuário seguir em frente na execução.

Para representar essa situação, acrescentamos a MicExibeTelaDisponivel no fluxo. Esta por sua vez fará parte da execução final desse fluxo, levando o usuário para a tela inicial do PDV.

Portanto, quando o usuário não tem permissão para executar o fluxo a MicAutorizacao retornará ALTERNATIVA_1, conforme exemplo de código abaixo.


Usuário sem permissão de acesso
public ExecutionResult execute(StateChangeRequest request, State state, Map map) {

   /*
		regra de negócio implementada
   */

	// não passou pelas validações de acesso
	return new ExecutionResult("ALTERNATIVA_1");
}


Final da execução quando usuário não possui permissão

Após entrar na MicExibeTelaDisponivel, o fluxo deverá ser encerrado, para isso essa micro-operação precisa apontar para um Flow Result. Este indica que o controle volta para a máquina de estados ou para onde o fluxo foi executado.

Isso significa que um fluxo pode ser iniciado a partir da máquina de estados, geralmente por um evento de pressionamento de tecla. Ou pode ter sido iniciado a partir de outro fluxo, nesse caso ele passa a ser um subfluxo. Mais para frente entraremos em mais detalhes de como isso pode ser feito.

Voltando ao nosso exemplo. No menu de opções do lado direito vamos clicar uma vez na opção Flow Result e em seguida clicar no diagrama. Aparecerá uma bandeira de cor verde com uma caixa de texto, onde no nosso caso demos o nome de MicExibeTelaDisponivel (em verde). Essa é a saída que vai ser usada pela máquina de estados para decidir se vai direcionar para mais alguma macro-operação, ou se apenas ficará aguardando ocorrer um próximo evento.


Ligando com Flow Result


Para fazer a ligação entre a micro-operação e o flow result, podemos usar a opção Flow Link. Portanto, conforme dito anteriormente, no menu de opções no lado direito vamos clicar uma vez na opção Flow Link. Em seguida vamos posicionar o mouse em cima da micro-operação MicExibeTelaDisponivel, pressionar e segurar o botão esquerdo do mouse, arrastar o cursor até o Flow Result (com a bandeira verde) e soltar o botão do mouse. Na caixa de texto vamos colocar o nome da saída que a MicExibeTelaDisponivel devolve após sua execução, que é DEFAULT.


Quando o usuário possui permissão

Na situação onde o usuário possui a permissão, o fluxo seguirá pela saída DEFAULT. Fará uma verificação de existência de papel na impressora, caso não exista vai sair pela ALTERNATIVA_2. Ao passar pela verificação de papel, a execução do fluxo segue em frente até chegar na micro-operação EFOImprimeLeituraTotaisOperador.


Final da execução

A EFOImprimeLeituraTotaisOperador é a responsável por fazer a emissão da leitura do movimento do Operador e após realizada a impressão o fluxo deverá ser encerrado.

Após a evolução do fluxo, podemos ver que a EFOImprimeLeituraTotaisOperador possui duas saídas: DEFAULT e ERRO_LEITURA_OPERADOR. Ambas estão apontando para o mesmo destino, que é o final do fluxo.

Algumas observações importantes:

1 - Para uma classe poder ser utilizada dentro de um fluxo, ela precisa herdar de ExecutableFlowObject ou de outra classe que já possua essa herança. Além disso é necessário que o método execute() seja implementado.

2 - O método execute() deve sempre retornar um ExecutionResult, não podendo retornar nulo.

3 - Caso o método execute() retorne um ExecutionResult que não esteja mapeado no fluxo, a execução será interrompida e uma exceção será levantada. Em outras palavras, Sempre que um ExecutableFlowObject (micro-operação) for adicionado a um fluxo, todas as possíveis saídas implementadas no método execute() devem ser mapeadas no diagrama.



Configurando o fluxo

Com o cursor do mouse em cima do fluxo, clique no botão direito do mouse para editar as propriedades desse fluxo. Procure a opção Show Properties View, conforme imagem ao lado.



















Após selecionar a opção indicada acima, aparecerá as propriedades do Execution Flow, conforme imagem ao lado.

Description → Uma breve descrição do fluxo ou objetivo do fluxo.

Id → Identificador único do fluxo. Pode ser formado por letras e números. Por exemplo: MEU_FLUXO_1234

Request Authorization → Usado para ativar o mecanismo de autorização. Os valores podem ser true ou false. O valor false é assumido na criação do fluxo. Mais abaixo, entraremos em mais detalhes.

Title → Um título para o fluxo.



Editando propriedades

Ao lado temos um exemplo após a edição das propriedades do diagrama de fluxo. Precisamos entender a função das propriedades Request Authorization e Id.

Propriedade Request Authorization. Essa é a propriedade usada para ativar a verificação de permissão pelo perfil do operador logado no momento da execução. Isso significa que, para que a verificação de autorização funcione é necessário que a micro-operação de nome MicAutorizacao seja acionada no fluxo e, ao mesmo tempo, essa propriedade esteja configurada com o valor true. Ou seja, caso o valor seja false a verificação de permissão pelo perfil será ignorada.


Propriedade Id. O valor que for preenchido na propriedade Id, corresponde ao identificador da macro-operação. Antes de definir o valor do Id, é importante fazer uma consulta na tabela EVENTO, no banco relacional com o objetivo de verificar se o mesmo Id já está sendo utilizado por alguma macro-operação.


Ao lado, temos o exemplo da consulta a ser executada no banco. Caso ela retorne algum registro, significa que não devemos utilizar o LEITURA_OPERADOR_1234. Se o resultado da consulta for vazio, ou seja nenhuma linha retornada, significa que podemos adotar esse valor como Id da macro-operação.



Portanto, ao criarmos um novo fluxo é necessário inserirmos um registro na tabela EVENTO, conforme exemplo de código ao lado.


Consulta tabela EVENTO

select * from evento where codigo_evento = 'LEITURA_OPERADOR_1234';

Insert na tabela EVENTO
INSERT INTO evento (codigo_evento,tipo_evento,
					status_evento,ind_uso_contr_log,
					numero_versao,data_inic_validade,usuario_incl,
				    data_hora_incl,usuario_altr,data_hora_altr,
					tipo,descricao_evento,cod_elemento_fluxo)
VALUES ('LEITURA_OPERADOR_1234','MCOP',NULL,NULL,'1',trunc(sysdate),'P2K',
        trunc(sysdate),'P2K',trunc(sysdate),'0','Leitura de Operador','leituraOperador');

Acionamento do Fluxo

Um fluxo é acionado a partir de um evento de tecla e é nesse ponto que entra a Máquina de Estados. Ela é responsável por, a partir de um evento ocorrido e considerando o estado atual no qual o componente se encontra, acionar o devido fluxo.

O exemplo acima se trata de uma emissão de leitura de um operador. Para isso é preciso ter um operador logado no caixa e não poderia ser feito no decorrer de uma venda, por exemplo. Portanto o PDV precisa estar no estado DISPONIVEL, para que seja possível fazer a emissão da leitura.

Para isso precisaremos incluir o novo fluxo no digrama de estados. referente ao estado DISPONIVEL. Portanto vamos abrir o arquivo DISPONIVEL.stateflow_diagram para incluirmos a nova macro-operação.

Vamos usar em exemplo de digrama simples, para que seja mais fácil de entender. Na figura ao lado, temos a lista de opções exibidas no lado direito.

Desta lista temos:

  • State (DISPONIVEL), que representa o estado.
  • Flow Object (Impressão Leitura Operador), que representa a macro-operação criada.
  • Event Link (TECLA_EMISSAO_LEITURA), no diagrama é a seta de cor verde. Ela indica qual macro-operação será executada quando um evento da tecla TECLA_EMISSAO_LEITURA for acionado.
  • Result Link (MicExibeTelaDisponivel), no diagrama é a seta de cor azul. Ela indica para qual estado o componente voltará quando a execução do fluxo for concluída.





  • Sem rótulos