...
Deck of Cards | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||
|
...
Deck of Cards | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||
|
...
Método | Especificação |
---|---|
getCardValue(“nomeCampo”) | Permite acessar o valor de um campo da ficha do processo, onde:
|
setCardValue(“nomeCampo”,”valor”) | Permite definir o valor de um campo da ficha do processo, onde:
|
setAutomaticDecision(numAtiv, listaColab, “obs”) | Permite definir o fluxo de saída de uma atividade de forma automática, onde:
|
getActiveStates() | Retorna Retorna uma lista das atividades ativas do processo. |
getActualThread(numEmpresa, numProcesso, numAtiv) | Retorna Retorna a thread da atividade que está ativa, lembrando que em caso de atividades paralelas, retorna 0, 1, 2 e assim sucessivamente.
|
setDueDate(numProcesso, numThread, “userId”, dataConclusao, tempoSeg) | Permite Permite alterar o prazo de conclusão para uma determinada atividade do processo, onde:
Recomendamos a utilização deste método no evento afterTaskCreate, pois será executado logo após a criação da tarefa. Exemplo: |
transferTask(transferUsers, “obs”, int numThread) | Transfere uma tarefa de um usuário para outro(s) usuário(s).
|
transferTask(transferUsers, “obs”) | Transfere uma tarefa de um usuário para outro(s) usuário(s). Este método não pode ser usado em processos com atividades paralelas, onde:
|
startProcess(processId, ativDest, listaColab, “obs”, completarTarefa, valoresFicha, modoGestor ) | Inicia uma solicitação workflow, onde:
Retorna um mapa com informações da solicitação criada. Entre eles o iProcess, que é o número da solicitação criada. |
setColleagueReplacement(userId) | Seta um usuário substituto, onde:
|
setTaskComments(“userId”, numProcesso, numThread, “obs”) | Define uma observação para uma determinada tarefa do processo, onde:
|
getCardData(numProcesso) | Retorna um Mapa com todos os campos e valores do formulário da solicitação.
|
getAdvancedProperty(“propriedade”) | Retorna o valor da propriedade avançada de um processo.
|
calculateDeadLineHours(data, segundos, prazo, periodId) | Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no produto passando o prazo em horas:
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. var dt = obj[0]; var segundos = obj[1]; |
calculateDeadLineTime(data, segundos, prazo, periodId) | Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no produto passando o prazo em minutos:
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. |
getParentInstance(processInstanceId) | Retorna o número da solicitação pai, onde: processInstanceId : Número da solicitação filha. var parentCardData = hAPI.getCardData(parentProcess); |
Nos eventos existe a possibilidade de integração com serviços de dados. Tais serviços podem ser WebServices, AppServer Progress® e Dataset.
O acesso a WebServices ou AppServer Progress® deve ser previamente configurado no cadastro de Serviços. Para mais detalhes consulte o Guia de Integração ECM, no capítulo “Acessando WebServices a partir do TOTVS | ECM“.
Abaixo um exemplo de como executar o WebService de Colleague para criar um usuário após executar uma tarefa:
function afterTaskComplete(colleagueId,nextSequenceId,userList) { ColleagueDtoArray"); |
Os seguintes eventos são disparados pela API de Workflow:
afterCancelProcess | Ocorre após o cancelamento da solicitação. |
afterProcessCreate | Ocorre logo após a criação de um novo processo. Parâmetros: Número do novo processo (INTEGER). |
afterProcessFinish | Ocorre após finalizada a solicitação. |
afterReleaseVersion | Ocorre após a liberação de uma versão do processo workflow. |
afterStateEntry | Ocorre após a entrada em uma nova atividade. Parâmetros: Seqüência da atividade (INTEGER). |
afterStateLeave | Ocorre após a saída de uma atividade. Parâmetros: Seqüência da atividade (INTEGER). |
afterTaskComplete | Ocorre após o usuário completar uma tarefa, porém as informações de próxima tarefa e colaboradores destino já foram salvas. |
afterTaskCreate | Ocorre após o usuário receber uma tarefa. Parâmetros: Matrícula do usuário (CHARACTER). |
afterTaskSave | Ocorre após salvar as informações selecionadas pelo usuário. |
beforeCancelProcess | Ocorre antes do cancelamento da solicitação. |
beforeStateEntry | Ocorre antes da entrada em uma nova atividade. Parâmetros: Seqüência da atividade (INTEGER). |
beforeStateLeave | Ocorre antes da saída de uma atividade. Parâmetros: Seqüência da atividade (INTEGER). |
beforeTaskComplete | Ocorre antes que o usuário complete uma tarefa, porém as informações de próxima tarefa e colaboradores destino já foram salvas. |
beforeTaskCreate | Ocorre antes que o usuário receba uma tarefa. Parâmetros: Matrícula do usuário (CHARACTER). |
beforeTaskSave | Ocorre antes de salvar as informações selecionadas pelo usuário. |
calculateAgreement | Ocorre após o cálculo do consenso (somente para atividades conjuntas) e permite alterar os dados do consenso de uma atividade. |
onNotify | Ocorre após a movimentação da solicitação e antes de enviar as notificações. |
setProcess | Ocorre quando um processo é “setado” na API. |
subProcessCreated | Ocorre quando um sub-processo é criado. Parâmetros: Número do sub-processo (INTEGER). |
validateAvailableStates | Ocorre após montada a lista de tarefas disponíveis para o usuário a partir da tarefa atual. Parâmetros: Seqüência da atividade atual (INTEGER) e input-output lista das seqüências das atividades (ARRAYLIST). |
Informações | ||
---|---|---|
|
...
...
|
...
|
...
function beforeStateEntry(sequenceId){ |
Com o uso de eventos, o ECM permite que um processo seja customizado possibilitando a execução de ações definidas pelo usuário, tais como:
...
Existem algumas propriedades que contém informações referentes à solicitação que podem ser utilizadas na customização do processo, são elas:
...
Além dessas propriedades já alimentadas pelo produto, é possível criar propriedades customizadas que podem ser utilizadas nos eventos.
O produto disponibiliza a variável globalVars, que é um mapa de dados (HashMap<String, String>) e estará disponível em todos os eventos.
Para adicionar uma propriedade e seu valor, utilize o método: globalVars.put("name", "value"). Onde name é o nome da propriedade e value o seu valor. Ex: globalVars.put("WDAprovador","adm");
Para recuperar os valores da variável globalVars, utilize o método: globalVars.get("name");
Onde "name" é o nome da propriedade a ser retornado o valor. Ex: globalVars.get("WDAprovador");
Exemplo 1:
Para validar se o usuário está completando uma atividade corretamente, basta utilizar o evento beforeTaskComplete e retornar alguma mensagem caso queira disparar um erro. Por exemplo, segue parte de um código de customização criado pelo ECM:
Bloco de código |
---|
function beforeTaskComplete(colleagueId,nextSequenceId,userList){ var ativAtual = getValue("WKNumState"); var users = new java.util.ArrayList(); var usersTmp = new java.util.ArrayList(); var cUsers; var process = parseInt(globalVars.get("process")); var User1 = hAPI.getCardValue("resp1_H"); var eficacia1 = hAPI.getCardValue("eficaz1"); var controle1 = hAPI.getCardValue("controle1"); var eficaz = true; var codgrupo; log.info("ATIVIDADE---> " + ativAtual + " - " + nextSequenceId); if(ativAtual == 7 && nextSequenceId == 12){ if(User1 != "" && eficacia1 != "1" && eficacia1 != "2"){ if(verificaUsuario(users,User1)){ users.add(User1); } } log.info("TAMANHO VETOR ----> " + users.size()); hAPI.setAutomaticDecision(8, users, "Decisao tomada automaticamente pelo ECM."); } else if(ativAtual == 9 && nextSequenceId == 13){ log.info("[1] Usuarios----> " + User1); log.info("[1] EFICACIA----> " + eficacia1); log.info("[1] CONTROLE----> " + controle1); if(User1 != "" && eficacia1 == "2" && controle1 == ""){ eficaz = false; } log.info("EFICAZ " + eficaz); if(eficaz){ log.info("[if1]"); codGrupo = buscaGrupo(process,"Grupo-Qualidade"); log.info("CODIGO GRUPO " + codGrupo); users.add("Pool:Group:" + codGrupo); hAPI.setAutomaticDecision(6, users , "Decisao tomada automaticamente pelo ECM."); } } } |
Exemplo 2:
Para fazer com que uma decisão seja tomada automaticamente, os seguintes procedimentos devem ser executados:
1. Configurar em Propriedades Avançadas a propriedade AutomaticTasks – conforme descrito anteriormente – com a lista de todas as atividades que terão decisão delegada via customização (Ex.: AutomaticTasks=3,6,10).
2. Implementar o evento beforeStateEntry e executar e chamar a o método “setAutomaticDecision” da hAPI, passando como parâmetros o próximo estado, o próximo usuário (ou lista de usuários) e a observação.
...
ATENÇÃO: As atividades com decisão automática também podem ser criadas via editor de processos.
Para mais informações consulte o Manual de Referência do ECM.
Exemplo 3:
Para iniciar uma nova solicitação de um outro processo ao finalizar uma solicitação devem ser executados os seguintes procedimentos:
1. Criar um serviço no ECM em que a URL seja o webservice de WorkflowEngineService .
(Ex.: http://localhost:8080/webdesk/WorkflowEngineService?wsdl )
2. Implementar o evento afterProcessFinish utilizando o exemplo abaixo. Sendo ‘process2’ o novo processo a ser inicializado.
...
Bloco de código |
---|
function beforeStateEntry(sequenceId){ var activity = getValue("WKNumState"); if (activity == 0 || activity == 1){ //outra condição. throw "TRATAMENTO DA EXCEÇÃO" } } function beforeTaskSave(colleagueId,nextSequenceId,userList){ var activity = getValue("WKNumState"); if (activity != 0 && activity != 1){ // outra condição throw "TRATAMENTO DE EXCEÇÃO"; } } function beforeCancelProcess(colleagueId, processId){ // condição. throw "TRATAMENTO DA EXCEÇÃO" } |
É possível consistir o campo observação de uma solicitação workflow, verificando se ele foi preenchido ou não. Para isto, é necessário validar a propriedade WKUserComment no evento beforeTaskSave ou no evento beforeCancelProcess.
...
Os mecanismos de atribuição são instrumentos utilizados durante um processo de workflow que permitem criar, segundo um critério estabelecido pelo próprio mecanismo, uma lista de possíveis colaboradores para uma atividade. Esta lista pode ser utilizada em dois momentos:
1. Na inicialização do processo, onde o sistema verifica se o usuário corrente faz parte desta lista e, portanto, pode iniciá-lo;
2. No momento do encaminhamento de uma tarefa, quando esta lista é apresentada ao usuário corrente com opções de encaminhamento da solicitação.
No primeiro caso, a lista é gerada de acordo com o mecanismo de atribuição existente na primeira atividade do processo (que representa a atividade de start). Nas demais atividades é adotado o segundo procedimento. Quando não houver um mecanismo de atribuição associado a uma atividade (seja ela inicial ou não), todos os usuários são considerados válidos.
Na inicialização do ECM são criados alguns mecanismos automaticamente, conforme abaixo:
...
O mecanismo de atribuição geralmente é composto de duas partes, a tela de configuração e o script de resolução do mecanismo de atribuição.
Deck of Cards | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||
|
Informações | ||
---|---|---|
|
...
É possível acessar Datasets e WebServices apartir da função. Além do XML o script também recebe como parâmetros o código do processo e o usuário corrente. Por fim, o script de configuração retorna a lista de usuários e o fluxo de saída da atividade é selecionado. Para persistir o XML de configuração criado pela tela basta lançar o evento AssignmentSelectedEvent e atribuir o XML de configuração na propriedade “xmlString”. Dica: caso a compilação normal pela GUI de desenvolvimento não esteja efetuando as importações corretamente, segue sugestão de compilação do projeto: mxmlc -debug=false -optimize=true -warnings=false -load-config flex-config-mxmlc.xml -source-path=. <ARQUIVO>.mxml -output <ARQUIVO>.swf |
Arquivo FLEX-CONFIG-MXMLC.XML:
...
É possível incluir customizações de e-mail durante o andamento de um Workflow. Existem duas modalidades de customização nessa categoria:
...
Para interferir no envio de um e-mail padrão, deve ser utilizado o evento onNotify, que é disparado no exato momento em que qualquer um dos e-mails de processo é enviado. Nesse evento, podem ser feitas alterações, como por exemplo: adicionar outros destinatários ao e-mail (além daqueles que estão participando do processo), modificar os valores dos parâmetros utilizados no template de e-mail, etc.
Abaixo se encontra um exemplo de como implementar esse evento.
Bloco de código |
---|
function onNotify(subject, receivers, template, params) { if (template.match("tpl028")!=null) { receivers.add("[email protected]"); } } |
O evento onNotify está disponível na lista de eventos do Workflow. Portanto, ao selecionar esse evento na lista de eventos disponíveis, a assinatura da função acima já será preenchida automaticamente.
...
Os templates podem ser consultados dentro do diretório do volume, em: <VOLUME>\templates\tplmail. Se for necessário adicionar algum parâmetro no e-mail padrão, os templates podem ser editados diretamente nesse diretório.
Caso seja necessário incluir um novo tipo de e-mail, além daqueles que são disponibilizados pelo produto, o ECM permite que o usuário cadastre templates customizados, através do ícone “Templates” na categoria GED ou Painel de Controle, na tela principal do sistema.
...
Bloco de código |
---|
try{ //Monta mapa com parâmetros do template var parametros = new java.util.HashMap(); parametros.put("NOME_USUARIO", "JOAO"); parametros.put("CODIGO_USUARIO", "01"); //Este parâmetro é obrigatório e representa o assunto do e-mail parametros.put("subject", "ASSUNTO"); //Monta lista de destinatários var destinatarios = new java.util.ArrayList(); destinatarios.add("MATRICULA-DESTINATARIO"); //Envia e-mail notifier.notify("MATRICULA-REMETENTE", "CODIGO-TEMPLATE", parametros, destinatarios, "text/html"); } catch(e){ log.info(e); } |
O primeiro parâmetro que a função notify recebe é o código/matrícula do usuário que irá enviar o e-mail (remetente).
...
notifier.notify("MATRICULA-REMETENTE", NÚMERO DA FICHA, "CODIGO-TEMPLATE", parametros, destinatarios, "text/html");ATENÇÃO:
Nota | ||
---|---|---|
| ||
Obrigatoriamente o valor informado deve ser uma ficha. Outros tipos de documentos não serão tratados e ocorrerá erro na execução do evento. |
Ao executar este método, automaticamente os parâmetros abaixo serão adicionados a lista de parâmetros e podem ser utilizados na template:
...