Customização de Workflow no Lumis Portal

Objetivos

  • Apresentação da funcionalidade de Workflow do Lumis Portal
  • Criação de um novo Workflow
  • Apresentação de um cenário de criação de Workflow customizado

Referências complementares

  • Workflow padrão

Introdução

O Lumis Portal provê uma infraestrutura para utilização de Workflows em serviços do tipo 'content' que necessitem de um fluxo de aprovação de conteúdos. Para tal, o Lumis Portal disponibiliza um workflow padrão, sendo também possível definir um ou mais Workflows customizados conforme as necessidades de cada serviço.

Todo Workflow no Lumis é baseado nos seguintes conceitos:

  • Estado, que indica em qual estado de publicação o conteúdo se encontra
  • Ação, que consiste em uma alteração de estado realizada pelo usuário
  • Papel, que consiste na permissão para acesso a um conteúdo em determinado estado, ou permissão para execução de uma ação do Workflow
  • Responsável, que indica quem é o responsável atual pelo conteúdo

Workflow padrão do Lumis

O Lumis Portal conta com um workflow padrão para publicação e aprovação de conteúdo.

Criando um novo Workflow

Caso seja necessária a criação de um Workflow diferente do provido nativamente pelo Lumis Portal, deve-se primeiramente realizar uma análise para definir os estados, as permissões para cada estado, as transições entre cada estado, e as permissões para cada transição.

Uma vez especificado o Workflow, seu arquivo de definição (em formato XML), deve ser criado.

Recomenda-se que, caso o Workflow seja específico para um determinado serviço, o arquivo xml seja salvo no diretório do serviço. Por outro lado, tratando-se de um Workflow utilizado por mais de um serviço, seu arquivo xml de definição deve ser salvo em um diretório referente a customizações de Workflow.

Para todo serviço que utilizar Workflow, deve-se colocar explicitamente no arquivo servicedefinition.xml do serviço a tag de Workflow habilitado, conforme mostrado a seguir.

<?xml version="1.0" encoding="UTF-8"?>
<serviceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/servicedefinition.xsd">
      <service id="laboratorio" name="STR_SERVICE_NAME" type="lum_content">
              <description>STR_SERVICE_DESCRIPTION</description>
              <workflow enabled="true" />
      </service>
<interfaces>
..........
</interfaces>
</serviceDefinition>

No arquivo douidefinition.xml, caso seja necessário que a interface apresente o formulário de aprovação de conteúdo, deve-se habilitar o metadado <workflow/> na definição do source referenciado pela interface.

Para configuração dos papéis utilizados no workflow, usa-se a tag <roles /> conforme exemplo abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<workflowDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/ workflowdefinition.xsd">
     <workflow id="projeto.customWorkflow" name="STR_CUSTOM_WORKFLOW">
            <description>STR_CUSTOM_WORKFLOW_DESCRIPTION</description>
            <roles>
                 <role id="author" name="STR_AUTHOR"/>
                 <role id="editor" name="STR_EDITOR"/>
                 <role id="chiefEditor" name="STR_CHIEF_EDITOR"/>
           </roles>
      </workflow>
</workflowDefinition>

Para configuração dos estados do workflow, utiliza-se a tag <states /> conforme exemplo abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<workflowDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/ workflowdefinition.xsd">
<workflowDefinition>
..........
       <states>
             <state id="authoring" name="STR_AUTHORING" isStart="true">
              <description>STR_AUTHORING_DESCRIPTION</description>
             <permissions>
                     <permission id="author" scope="assignedTo" />
                     <permission id="editor" scope="assignedTo" />
                     <permission id="chiefEditor scope="all" />
             </permissions>
             </state>
      </states>
</workflowDefinition>

Cada tag <state> corresponde a um estado do Workflow, sendo que o valor true no atributo isStart o define como estado inicial do fluxo.

Para especificar que um papel tem acesso ao conteúdo em determinado estado, deve-se colocar a tag <permission> abaixo da tag <permissions> com o atributo id exatamente igual ao identificador do papel. Caso o papel apenas possa ver os documentos pelos quais seja responsável, o atributo scope deve ser igual a assignedTo. Caso o papel possa ver todos os documentos, o atributo scope deve ser igual a all.

Para definir as transições de estado, especificando todos os estados seguintes, deve-se colocar a tag <transitions>. Para cada transição, deve-se criar uma tag <transition>. Para especificar o estado subsequente de cada transição, deve-se colocar a tag <finalState> com o atributo id igual ao identificador do estado. Segue abaixo um exemplo:

<?xml version="1.0" encoding="UTF-8"?>
<workflowDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/ workflowdefinition.xsd">
<workflowDefinition>
..........
          <transitions>
                 <transition id="submit_for_approval" name="STR_SUBMIT_FOR_APPROVAL">
                        <description>STR_SUBMIT_FOR_APPROVAL_DESCRIPTION</description>
                        <finalState id="waitingForApproval"/>
                </transition>
               <transition id="approve" name="STR_APPROVE">
                          <description>STR_APPROVE_DESCRIPTION</description>
                         <finalState id="approved"/>
                          <permissions>
                                  <permission id="editor" scope="assignedTo"/>
                                  <permission id="chiefEditor" scope="all"/>
                         </permissions>
                </transition>
          </transitions>
</workflowDefinition>

Para registrar o workflow customizado, deve-se acessar a área administrativa de Workflows do Gestor de Conteúdos e acionar Adicionar, conforme figura a seguir.

imagem1.jpg

Ao acionar *Adicionar* será aberta a janela para preenchimento do caminho físico do arquivo de definição do Workflow, workflowdefinition.xml, relativo ao diretório lumisdata/def.

imagem2.jpg

Dada uma instância de serviço do tipo Content, é possível alterar o workflow utilizado. Para isso, em F12, deve-se selecionar a interface, clicar com o botão direito do mouse e selecionar Workflow, conforme figura a seguir.

imagem3.jpg

Ao selecionar Workflow, será aberta uma janela de seleção do Workflow desejado, conforme figura a seguir.

imagem4.jpg

Não será possível trocar o workflow para uma instância de serviço caso esta possua conteúdo cadastrado. Para fazê-lo, devem ser removidos, antes, todos os seus conteúdos.

Cenário de criação de Workflow customizado

Um cenário em que seria possível aplicar um workflow customizado seria um sistema de ordem de serviço.

Nesse sistema, os colaboradores criam ordens de serviço. Uma ordem de serviço criada inicia com status 'em aprovação'. Somente os aprovadores podem aprovar a ordem de serviço. Uma vez aprovada a ordem de serviço, um operador pode colocá-la em andamento ou finalizá-la.

Nesse caso, os papéis são 'colaborador', 'aprovador' e 'operador'. Os estados do fluxo são: 'Em autoria', 'Em aprovação', 'Em andamento' e 'Finalizado'.

Para o workflow especificado, o arquivo workflowdefinition.xml ficaria conforme ilustrado a seguir.

<?xml version="1.0" encoding="UTF-8"?>
<workflowDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="workflowdefinition.xsd">
  <workflow id="osWorkflow" name="Workflow de Ordem de Serviços">
    <description>Workflow de Ordem de Serviços</description>
    <roles>
      <role id="colaborador" name="Colaborador"/>
      <role id="aprovador" name="Aprovador"/>
      <role id="operador" name="Operador"/>
    </roles>
    <states>
      <state id="em_autoria" name="Em autoria" isStart="true">
        <description>Em autoria</description>        
        <permissions>
          <permission id="colaborador" scope="assignedTo"/>
        </permissions>
        <transitions>
          <transition id="enviar_para_aprovacao" name="Enviar para aprovação">
            <description>Enviar para aprovação</description>
            <finalState id="esperando_aprovacao"/>
          </transition>          
        </transitions>
      </state>
      <state id="esperando_aprovacao" name="Esperando por aprovação">
        <description>Esperando por aprovação</description>        
        <permissions>
          <permission id="aprovador" scope="all"/>          
        </permissions>
        <transitions>
          <transition id="aprovar" name="Aprovar">
            <description>Aprovar</description>
            <finalState id="aprovado"/>
          </transition>
          <transition id="reprovar" name="Reprovar">
            <description>Reprovar</description>
            <finalState id="em_autoria"/>
          </transition>
        </transitions>
      </state>
      <state id="aprovado" name="Aprovado">
        <description>Aprovado</description>        
        <permissions>
          <permission id="operador" scope="all"/>          
        </permissions>
        <transitions>
          <transition id="enviar_para_em_andamento" name="Colocar em andamento">
            <description>Colocar em andamento</description>
            <finalState id="em_andamento"/>
          </transition>          
          <transition id="finalizar" name="Finalizar">
            <description>Finalizar</description>
            <finalState id="finalizado"/>
          </transition>
        </transitions>
      </state>
      <state id="em_andamento" name="Em andamento">
        <description>Em andamento</description>
        <permissions>
          <permission id="operador" scope="all"/>
        </permissions>
        <transitions>          
          <transition id="finalizar" name="Finalizar">
            <description>Finalizar</description>
            <finalState id="finalizado"/>
          </transition>
        </transitions>
      </state>      
      <state id="finalizado" name="Finalizado">
        <description>Finalizado</description>
        <permissions>
          <permission id="operador" scope="all"/>
        </permissions>        
      </state>      
    </states>
  </workflow>
</workflowdefinition>

Autor: Sergio Fernandes