Histórico da Página
Índice
Índice | ||||||||
---|---|---|---|---|---|---|---|---|
|
Objetivo
...
O objetivo deste guia é orientar como construir um script com a finalidade de resolver os responsáveis por uma tarefa do processo workflow e/ou gestor de processo.
Nota | ||
---|---|---|
| ||
Para que um usuário que não é administrador da empresa possa criar, importar, editar e remover mecanismos, é necessário que ele possua a permissão Configurar Mecanismos. Esta permissão pode ser concedida pelo administrador através do item Permissões disponível no agrupador Pessoas do Painel de Controle do fluig. Saiba como realizar esse procedimento clicando aqui. |
Pré-requisitos
...
- Conhecimento da linguagem JavascriptJavaScript;
- Conhecimento sobre a construção de fluxos de processo Workflow Fluig;
- Conceitos sobre utilização Desenvolvimento de Datasets Fluig;
- Entendimento sobre serviços da Web, WebservicesWeb services, SOAP e XML;
- Familiaridade com a ferramenta de desenvolvimento, TOTVS Developer Studio ou Eclipse;
- Plugin Fluig Designer instalado na ferramenta de desenvolvimentoInstalação do Fluig Studio.
Construindo um Mecanismo Personalizado
...
Em algumas situações é necessário utilizar lógicas mais complexas e específicas sobre quem será(ão) o(s) responsável(is) pela execução da atividade na solicitação de processo workflow. Para isto, existe o "Mecanismo de Atribuição Customizado".
- Para iniciar sua construção, deve-se
...
- em um projeto existente,
...
- acesse a pasta mechanisms
...
- e acesse o
...
- menu Arquivo > Novo > Outros... (acessível pelas teclas de atalho CTRL+N
...
- )
- Expanda o grupo (pasta) Fluig
...
- e selecione a
...
- opção Mecanismo Customizado Fluig
...
- , após isso, clique em Avançar.
- Na tela seguinte,
...
- indique o código no campo respectivo e sua
...
- descrição igualmente,
...
- após isso, clique em Concluir.
...
Painel |
---|
O código é obrigatório e não pode ser alterado posteriormente. |
Informações | ||
---|---|---|
| ||
O código para o mecanismo deve seguir a especificação de padronização conforme o documento : Raíz / VP Plataformas & Cloud / Produto / Projeto Experiencia de Uso TOTVS / Artefatos / Guia de Estilos / Experiencia #2 / 1702869 - Guia de Boas Práticas. |
Com isto, será criada a função básica que deve ser implementada:
Bloco de código | ||||
---|---|---|---|---|
| ||||
function resolve(process,colleague){
var userList = null; /* Para adicionar novos usuários, deve ser um ArrayList, conforme exemplos a seguir */
return userList;
} |
...
A função acima não retorna nenhum usuário. Sua execução não possibilitará escolher ninguém, por isto, esta função deve ser complementada.
A função deve retornar uma listagem, do tipo ArrayList com as matrículas dos usuários. A matrícula não é necessariamente igual ao login deste usuário. A matrícula corresponde ao valor existente no campo de mesmo nome no cadastro deste usuário e à coluna colleaguePK.colleagueId do Dataset colleague.
Nota | ||
---|---|---|
| ||
Se ocorrer qualquer erro de sintaxe ou na execução do mecanismo, este será abortado interrompido e, consequentemente, não devolverá nenhum responsável para próxima tarefa/atividade do processo. É importante que toda a implementação passe por um tratamento de erros e proteção de execução. Uma boa prática é utilizar as cláusulas try catch. |
Informações | ||
---|---|---|
| ||
Nenhuma mensagem de erro pode ser emitida ao usuário durante sua execução, pois estes mecanismos podem ser invocados sem que haja a interação com o usuário, como por exemplo, as chamadas ao webservice ECMWorkflowEngineService por meio das integrações externas. |
Assunto Primário
Explicação. Exemplo para links e anexos.
O fonte do exemplo citado pode ser baixado a partir do seguinte link:
Retornando uma Listagem de Usuários
...
Abaixo temos um exemplo de retorno de uma relação fixa de usuáriosExemplo de macro para bloco de código:
Bloco de código | ||
---|---|---|
| ||
Macro para código.
Em editar é possível selecionar a linguagem. |
Exemplo de Nota
Informações | ||
---|---|---|
| ||
Insere Nota |
Exemplo de Observação
Nota | ||
---|---|---|
| ||
Insere Observação |
Assunto Secundário
Assunto, exemplo com marcadores. A seguir apenas um passo.
- Marcador.
- Marcador.
Figura 1 - Exemplo de imagem (centralizada). Legenda negrito e justificada.
Assunto Secundário
Comentário sobre o assunto. Macro para passo a passo.
Acompanhe os passos a seguir:
Abaixo é utilizado o exemplo de interação passo a passo. Facilita o entendimento.
...
effectDuration | 0.5 |
---|---|
id | samples |
history | false |
effectType | fade |
Card | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
|
Card | ||||
---|---|---|---|---|
| ||||
|
...
id | 3 |
---|---|
label | Passo 3 |
Um espaço anterior, + um marcado, + um epaço ao final.
Figura X - Exemplo de Figuara e legenda (centralizados).
Card | ||||
---|---|---|---|---|
| ||||
|
| |||
function resolve(process,colleague){
var userList = new java.util.ArrayList();
userList.add('matricula_1');
userList.add('matricula_2');
userList.add('matricula_3');
return userList;
} |
Utilizando hAPI
...
Nota | ||
---|---|---|
| ||
A utilização da hAPI só está disponível a partir da Atualização 1.5.12 |
É possível obter informações da API de Workflow utilizando a variável global hAPI. Não utilizar em solicitações que estejam na atividade inicial, indicado utilizar em solicitações já iniciadas, uma vez que a hAPI depende dos dados do formulário gravado na solicitação.
Os seguintes métodos são recomendados para utilização:
Método | Especificação | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
getCardValue("nomeCampo") | Permite acessar o valor de um campo do formulário do processo, onde:
| ||||||||||||||||
getCardData(numProcesso) | Retorna um Mapa com todos os campos e valores do formulário da solicitação.
|
Nota |
---|
A hAPI dispõe de outro métodos, que são abordados na documentação de Desenvolvimento de Workflow. Contudo apenas os métodos mencionados acima são recomendados para o desenvolvimento de Mecanismos de atribuição. |
Exibindo usuários conforme campo selecionado
...
Abaixo temos um exemplo de utilização da hAPI, onde será retornado um usuário considerando o campo selecionado no formulário da solicitação:
Bloco de código | ||||
---|---|---|---|---|
| ||||
function resolve(process, colleague) {
var userList = new java.util.ArrayList();
var setor = hAPI.getCardValue("setor");
//Criando constraints para retornar os usuário do grupo
var cGrupo = DatasetFactory.createConstraint("colleagueGroupPK.groupId",
setor, setor, ConstraintType.MUST);
var constraintsGroup = new Array(cGrupo);
//Chamando dataset "colleagueGroup" para retornar os usuários
var colleagues = DatasetFactory.getDataset("colleagueGroup", null,
constraintsGroup, null);
for (var i = 0; i < colleagues.values.length; i++) {
//Adicionando usuário como opção de responsável
userList.add(colleagues.getValue(i, "colleagueGroupPK.colleagueId"));
}
return userList;
} |
Utilizando parâmetros
...
Nota | ||
---|---|---|
| ||
A utilização dos Parâmetros só estão disponíveis a partir da Atualização 1.6.3 Acesse a documentação de parâmetros para mais detalhes. |
Abaixo temos um exemplo de como exibir diferentes usuários para seleção utilizando a variável "WKIsTransfer", que permite saber se o usuário está ou não transferindo uma tarefa:
Bloco de código | ||
---|---|---|
| ||
function resolve(process, colleague) {
var userList = new java.util.ArrayList();
var isTransfer = getValue("WKIsTransfer");
if (isTransfer !== null) {
if (JSON.parse(isTransfer)) {
userList.add("gestor");
} else {
userList.add("user");
}
} else {
userList.add("gestor");
userList.add("user");
}
return userList;
} |
Utilizando Datasets
...
É possível realizar a consulta a um Dataset da plataforma, a fim de elaborar o resultado final dos usuários que poderão ser listados para escolha da execução da próxima atividade. Este procedimento pode ser realizado conforme o exemplo a seguir:
Bloco de código | ||||
---|---|---|---|---|
| ||||
function resolve(process,colleague){
var userList = new java.util.ArrayList();
//-- CONSULTA A UM DATASET, DE GRUPO DE USUARIOS FLUIG
var dtsGroup = DatasetFactory.getDataset('group',null,null,null);
for(var g = 0; g < dtsGroup.values.length; g++){
userList.add( 'Pool:Group:'+dtsGroup.getValue(g.toString(),"groupPK.groupId") );
}
//-- CONSULTA A UM DATASET, DE PAPEIS DE USUARIOS FLUIG
var dtsRole = DatasetFactory.getDataset('workflowRole',null,null,null);
for each(papel in dtsRole.values){
userList.add( 'Pool:Role:'+papel["workflowRolePK.roleId"] );
}
return userList;
} |
No exemplo acima, para que o(s) Grupo(s) seja(m) listado(s) é necessária a inclusão do prefixo "Pool:Group:" concatenado ao código deste Grupo. Com isto, ao selecionar o grupo, a atividade é atribuída ao Grupo e uma pessoa deste deverá assumi-la. Da mesma forma ocorre para o(s) Papel(éis) Workflow, porém o prefixo deve ser "Pool:Role:" mais o código do Papel.
Utilizando Serviços / Webservices
...
A construção de um mecanismo ainda possibilita a utilização de um Serviço de Integração Fluig, que poderá consumir um webservice do tipo SOAP ou do tipo Progress para obter os responsáveis, de acordo com uma regra de negócio provida pelo ERP, por exemplo. Este método pode seguir o modelo abaixo:
Bloco de código | ||||
---|---|---|---|---|
| ||||
function resolve(process,colleague){
var userList = new java.util.ArrayList();
//-- CHAMADA A UM SERVICO DE INTEGRACAO FLUIG, COM UM WEBSERVICE ESPECIFICADO
var biblioteca = ServiceManager.getService('ECMColleagueService').getBean();
var endpoint = biblioteca.instantiate('com.totvs.technology.ecm.foundation.ws.ECMColleagueServiceServiceLocator');
var webservice = endpoint.getColleagueServicePort();
var usuariosDtoArray = webservice.getSummaryColleagues(1);
for each(usuario in usuariosDtoArray.getItem()){
userList.add( usuario.getColleagueId().toString() );
}
return userList;
} |
Em que os parâmetros "process" e "colleague" se referem, respectivamente, aos objetos WorkflowProcess process e Colleague colleague.
WorkflowProcess | |
---|---|
Parâmetro | Tipo |
workflowProcessPK
| WorkflowProcessPK |
processId | String |
version | Integer |
requesterId | String |
active | Boolean |
attachmentSeqId | Integer |
sourceProcess | Integer |
sourceThreadSequence | Integer |
UUID | String |
Colleague | |
---|---|
Parâmetro | Tipo |
colleaguePK
| ColleaguePK |
userTenantId | long |
colleagueName | String |
String | |
login | String |
passwd | String |
active | Boolean |
adminUser | Boolean |
groupId | String |
O exemplo acima utilizou o webservice ECMColleagueService da própria plataforma e o Serviço foi criado utilizando a API Axis.
Third Party Trademarks
Obrigatório, conforme o que for utilizado no texto.
Adobe, Flash, Flex, Flex Builder, PostScript and Reader are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries.
Apache is a trademark of The Apache Software Foundation.
Firefox and Mozilla are registered trademarks of the Mozilla Foundation.
JavaScript is a trademark of Oracle Corporation.
Microsoft, Active Directory, Excel, Internet Explorer, Outlook, PowerPoint, SQL Server, Windows and Windows Vista are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries.
MySQL is a trademark of Oracle Corporation and/or its affiliates.
function resolve(process,colleague){
var userList = null;
return userList;
}