Sei sulla pagina 1di 27

Customizao de Workflow

Guia de Referncia para


Customizao
Workflow





2

Customizao de Workflow
Copyright 2009 TOTVS S.A. Todos os direitos reservados.
Nenhuma parte deste documento pode ser copiada, reproduzida, traduzida ou transmitida por
qualquer meio eletrnico ou mecnico, na sua totalidade ou em parte, sem a prvia autorizao
escrita da TOTVS S.A., que reserva-se o direito de efetuar alteraes sem aviso prvio. A TOTVS
S.A no assume nenhuma responsabilidade pelas conseqncias de quaisquer erros ou
inexatides que possam aparecer neste documento.
TOTVS S.A.
Av. Santos Dumont, 831, Joinville, SC, Brasil, CEP 89.222-900





3

Customizao de Workflow
ndice
Customizao Workflow .................................................................... 4
Propriedades Avanadas ............................................................................... 4
Eventos do Processo ..................................................................................... 6
Customizao do Processo ......................................................................... 13
Tratamento de Excees ............................................................................. 16
Mecanismo de Atribuio............................................................................. 17
Como Criar Um Mecanismo de Atribuio .................................................. 18
Parmetros Workflow para Customizao de Fichrios .............................. 23
Customizao de E-mail .............................................................................. 23
Third Party Trademarks ................................................................... 27

















4

Customizao de Workflow

Customizao Workflow
Propriedades Avanadas
As propriedades avanadas contm informaes especiais que podem alterar
o comportamento padro do processo em algum ponto. Elas devem ser
utilizadas principalmente durante a fase de customizao ou conter flags
especiais que alterem alguma lgica interna (apenas em casos especiais).
Para cadastrar uma propriedade avanada deve-se acessar a opo
Configurao de Processos no menu Workflow. Selecione o processo
desejado de acesse a opo Editar. A seguinte tela ser apresentada:

Clique sobre a aba Avanado e ser apresentado o cadastro de
Propriedades Avanadas do processo. A seguinte tela ser apresentada:




5

Customizao de Workflow


Use os botes Adicionar, Editar e Excluir para a manuteno dos eventos
desejados. Uma propriedade avanada representada por nome e valor.
Onde o nome deve ser nico. Abaixo o formulrio para a criao de uma
propriedade avanada.






6

Customizao de Workflow

Eventos do Processo
Os eventos de um processo so um conjunto de scripts carregados pela API
de workflow. Tais scripts so desenvolvidos com o uso da linguagem
JavaScript e chamados ao longo da execuo do processo em um momentos
pr-determinados, como por exemplo a criao de um processo ou a entrada
em uma nova atividade.
Para criar a lista de eventos do processo deve-se acessar a opo
Configurao de Processos no menu Workflow. Clique sobre a aba
Avanado e posteriormente clique sobre a aba Eventos. A seguinte tela
ser apresentada.

Importante
Em todos os eventos do processo possvel obter informaes da API de
Workflow. Cada evento possui acesso ao handle da API de workflow atravs
da varivel global hAPI. Os seguintes mtodos esto disponveis atravs da
hAPI:

Mtodo Especificao
getCardValue(nomeCampo)
Permite acessar o valor de um campo da ficha
do processo, onde:
nomeCampo: o nome do campo da
ficha.
setCardValue(nomeCampo,valor)
Permite definir o valor de um campo da ficha
do processo, onde:
nomeCampo: o nome do campo da
ficha;
valor: o valor a ser definido para o
campo da ficha.
setAutomaticDecision(numAtiv,
listaColab, obs)
Permite definir o fluxo de sada de uma
atividade de forma automtica, onde:




7

Customizao de Workflow

numAtiv: o nmero da atividade destino;
listaColab: a lista dos colaboradores que
recebero a tarefa do tipo String;
obs: a observao da tarefa;

getActiveStates()
Retorna uma lista das atividades ativas do
processo.
getActualThread(numEmpresa,
numProcesso, numAtiv)
Retorna a thread da atividade que est ativa,
lembrando que em caso de atividades
paralelas, retorna 0, 1, 2 e assim
sucessivamente.
numEmpresa: o nmero da empresa;
numProcesso: o nmero da solicitao;
numAtiv: o nmero da atividade.

setDueDate(numProcesso,
numThread, userId,
dataConclusao, tempoSeg)
Permite alterar o prazo de concluso para uma
determinada atividade do processo, onde:
numProcesso: o nmero da solicitao;
numThread: o nmero da thread
(normalmente 0, quando no se utiliza
atividades paralelas);
userId: o usurio responsvel pela tarefa;
dataConclusao: a nova data de concluso.
tempoSeg: o tempo que representa a
nova hora de concluso, calculado em
segundos aps a meia-noite.
Recomendamos a utilizao deste mtodo no
evento afterTaskCreate, pois ser executado
logo aps a criao da tarefa. Exemplo:

function afterTaskCreate(colleagueId) {
var data = new Date();
//seta o dia, ms (Janeiro 0) e ano
data.setDate(20);
data.setMonth(10);
data.setFullYear(2010);
// Recupera o numero da solicitao
var processo = getValue("WKNumProces");
// Seta o prazo para as 14:00
hAPI.setDueDate(processo,0,colleagueId,data,
50400);
}

transferTask(transferUsers, obs,
int numThread)
Transfere uma tarefa de um usurio para
outro(s) usurio(s).
transferUsers: uma lista de
colaboradores do tipo String.
obs: a observao.
numThread: sequncia da thread, em caso
de atividades paralelas.
transferTask(transferUsers, obs)
Transfere uma tarefa de um usurio para
outro(s) usurio(s). Este mtodo no pode ser
usado em processos com atividades paralelas,
onde:
transferUsers: uma lista colaboradores




8

Customizao de Workflow

do tipo String;
obs: a observao.
startProcess(processId, ativDest,
listaColab, obs, completarTarefa,
valoresFicha, modoGestor )
Inicia uma solicitao workflow, onde:
processId: Cdigo do processo
ativDest: Atividade de destino
listaColab: uma lista de colaboradores
de destino do tipo String;
obs: Texto da observao
completarTarefa: Indica se deve completar
a tarefa (true) ou apenas salvar (false)
valoresFicha: Um Mapa com os valores da
ficha do processo
modoGestor: Acesso como gestor do
processo (true/false).
Retorna um mapa com informaes da
solicitao criada. Entre eles o iProcess, que
o nmero da solicitao criada.
setColleagueReplacement(userId)
Seta um usurio substituto, onde:
userId: Cdigo do usurio substituto
setTaskComments(userId,
numProcesso, numThread, obs)
Define uma observao para uma determinada
tarefa do processo, onde:
userId: usurio responsvel pela tarefa;
numProcesso: nmero da solicitao;
numThread: o nmero da thread
(normalmente 0, quando no se utiliza
atividades paralelas);
obs: a observao.
getCardData(numProcesso)
Retorna um Mapa com todos os campos e
valores do formulrio da solicitao.
numProcesso: nmero da solicitao.
getAdvancedProperty(propriedade)
Retorna o valor da propriedade avanada de
um processo.
propriedade: nome da propriedade
avanada.
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:
data: Data Inicial (Date)
segundos: Quantidade de segundos
aps a meia noite
prazo: Prazo que ser aplicado em
horas (Varivel int).
periodId - Cdigo de Expediente

Retorno: Array de Objeto, onde a primeira
posio do array a data e a segunda a hora.

Exemplo:
function afterTaskCreate(colleagueId) {
var data = new Date();

//Calcula o prazo
var obj =
hAPI.calculateDeadLineHours(data, 50000,
2, "Default");




9

Customizao de Workflow

var dt = obj[0];
var segundos = obj[1];

// Recupera o numero da solicitao
var processo = getValue("WKNumProces");
// Altera o prazo do processo
hAPI.setDueDate(processo,0,colleagueId, dt,
segundos);
}

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:
data: Data Inicial (Date)
segundos: Quantidade de segundos
aps a meia noite
prazo: Prazo que ser aplicado em
minutos (Varivel int).
periodId - Cdigo de Expediente

Retorno: Array de Objeto, onde a primeira
posio do array a data e a segunda a hora.

Exemplo:
function afterTaskCreate(colleagueId) {
var data = new Date();

//Calcula o prazo
var obj = hAPI.calculateDeadLineTime(data,
50000, 120, "Default");
var dt = obj[0];
var segundos = obj[1];

// Recupera o numero da solicitao
var processo = getValue("WKNumProces");
// Altera o prazo do processo
hAPI.setDueDate(processo,0,colleagueId, dt,
segundos);
}


Nos eventos existe a possibilidade de integrao com servios de dados. Tais
servios podem ser WebServices, AppServer Progress e Dataset.
O acesso a WebServices ou AppServer Progress deve ser previamente
configurado no cadastro de Servios. Para mais detalhes consulte o Guia de
Integrao ECM, no captulo Acessando WebServices a partir do TOTVS |
ECM.
Abaixo um exemplo de como executar o WebService de Colleague para criar
um usurio aps executar uma tarefa:
function afterTaskComplete(colleagueId,nextSequenceId,userList) {
if (nextSequenceId == 2) {
// Busca o webservices de Colaborador
var colleagueServiceProvider =
ServiceManager.getServiceInstance("Colleague");




10

Customizao de Workflow

var colleagueServiceLocator =
colleagueServiceProvider.instantiate("com.datasul.technology.webdesk.foundation.ws.
ColleagueServiceServiceLocator");
var colleagueService = colleagueServiceLocator.getColleagueServicePort();

// Cria o ColleagueDto Verificar a lista de mtodos na visualizao do servio
var colleagueDto =
colleagueServiceProvider.instantiate("com.datasul.technology.webdesk.foundation.ws.
ColleagueDto");
colleagueDto.setCompanyId(1);
colleagueDto.setColleagueId("teste1");
colleagueDto.setColleagueName("Usuario Teste 1");
colleagueDto.setActive(true);
colleagueDto.setVolumeId("Default");
colleagueDto.setLogin("teste1");
colleagueDto.setMail("teste1@teste.com");
colleagueDto.setPasswd("b09c600fddc573f117449b3723f23d64"); //String
adm em MD5
colleagueDto.setAdminUser(false);
colleagueDto.setEmailHtml(true);
colleagueDto.setDefaultLanguage("pt");
colleagueDto.setDialectId("pt");

// adiciona ao array
var listColleague = new Array( );
listColleague[0] = colleagueDto;
// cria o colleagueDtoArray e adiciona
var colleagueDtoArray =
colleagueServiceProvider.instantiate("com.datasul.technology.webdesk.foundation.ws.
ColleagueDtoArray");
colleagueDtoArray.setItem(listColleague);

var result = colleagueService.createColleague("adm", "admin", 1,
colleagueDtoArray);

log.info("Result: " + result);
}
}

Os seguintes eventos so disparados pela API de Workflow:

afterCancelProcess Ocorre aps o cancelamento da solicitao.
Parmetros: Usurio corrente (CHARACTER) e Nmero do
processo (INTEGER).

Observao: Ao retornar a varivel WKNumState quando
o processo estar em atividades paralelas. Ser retornado
todas as atividades ativas separadas pelo carcter
virgula.
afterProcessCreate Ocorre logo aps a criao de um novo processo.
Parmetros: Nmero do novo processo (INTEGER).
Observao: Em caso de execuo deste evento um em
sub-processo, no ser possvel definir ou resgatar
dados da ficha anexada ao sub-processo, pois nessa
situao a ficha ainda no est criada.




11

Customizao de Workflow

afterProcessFinish Ocorre aps finalizada a solicitao.
Parmetros: Nmero do processo (INTEGER).
afterReleaseVersion Ocorre aps a liberao de uma verso do processo
workflow.
Parmetros: XML com a definio do processo
(CHARACTER).
afterStateEntry Ocorre aps a entrada em uma nova atividade.
Parmetros: Seqncia da atividade (INTEGER).
afterStateLeave Ocorre aps a sada de uma atividade.
Parmetros: Seqncia da atividade (INTEGER).
afterTaskComplete Ocorre aps o usurio completar uma tarefa, porm as
informaes de prxima tarefa e colaboradores destino j
foram salvas.
Parmetros: Usurio corrente (CHARACTER), Seqncia da
prxima atividade (INTEGER) e lista de usurios destino
(CHARACTER).
afterTaskCreate Ocorre aps o usurio receber uma tarefa.
Parmetros: Matrcula do usurio (CHARACTER).
afterTaskSave Ocorre aps salvar as informaes selecionadas pelo usurio.
Parmetros: Usurio corrente (CHARACTER), Seqncia da
prxima atividade (INTEGER) e lista de usurios destino
(CHARACTER).
beforeCancelProcess Ocorre antes do cancelamento da solicitao.
Parmetros: Usurio corrente (CHARACTER) e Nmero do
processo (INTEGER).
beforeStateEntry Ocorre antes da entrada em uma nova atividade.
Parmetros: Seqncia da atividade (INTEGER).
beforeStateLeave Ocorre antes da sada de uma atividade.
Parmetros: Seqncia da atividade (INTEGER).
beforeTaskComplete Ocorre antes que o usurio complete uma tarefa, porm as
informaes de prxima tarefa e colaboradores destino j
foram salvas.
Parmetros: Usurio corrente (CHARACTER), Seqncia da
prxima atividade (INTEGER) e lista de usurios destino
(CHARACTER).
beforeTaskCreate Ocorre antes que o usurio receba uma tarefa.
Parmetros: Matrcula do usurio (CHARACTER).
beforeTaskSave Ocorre antes de salvar as informaes selecionadas pelo
usurio.
Parmetros: Usurio corrente (CHARACTER), Seqncia da
prxima atividade (INTEGER) e lista de usurios destino
(CHARACTER).
calculateAgreement
Ocorre aps o clculo do consenso (somente para atividades
conjuntas) e permite alterar os dados do consenso de uma
atividade.
Parmetros:
currentState (INTEGER): atividade que ter o consenso
alterado.
AgreementData (ARRAYLIST): mapa de dados com o
percentual calculado, a atividade destino e os usurios de
destino. Para obter os valores, utilize o mtodo get. Para
atribuir um valor, utilize o mtodo put. Exemplo:

function calculateAgreement (currentState, agreementData) {
log.debug("Consenso Atual: " +




12

Customizao de Workflow

agreementData.get("currentPercentage"));
log.debug("Atividade Destino Atual: " +
agreementData.get("currentDestState"));
log.debug("Usuario Destino Atual: " +
agreementData.get("currentDestUsers"));

// Altera o consenso
agreementData.put("currentPercentage", 100);
agreementData.put("currentDestState", 2);
agreementData.put("currentDestUsers", "adm,teste,super");
}
onNotify Ocorre aps a movimentao da solicitao e antes de enviar
as notificaes.
Para mais detalhes consulte o captulo Customizao de E-
mail abaixo.
Observao: Caso no Processo Workflow esteja
cadastrado o evento "onNotify", o comportamento do
produto tambm ser de ignorar a validao de e-mails
iguais para o remetente e destinatrio.
setProcess Ocorre quando um processo setado na API.
Parmetros: Nmero do processo (INTEGER).
Observao: A propriedade WKCompletTask no deve
ser utilizada neste evento, pois quando ele executado o
produto ainda no tem a informao se atividade foi ou
no completada.
subProcessCreated Ocorre quando um sub-processo criado.
Parmetros: Nmero do sub-processo (INTEGER).
validateAvailableStates Ocorre aps montada a lista de tarefas disponveis para o
usurio a partir da tarefa atual.
Parmetros: Seqncia da atividade atual (INTEGER) e input-
output lista das seqncias das atividades (ARRAYLIST).

Recomendaes:
No necessrio criar todos os eventos do processo apenas
aqueles que se estiver interessado.
Todos os eventos so executados de forma persistente.
Importante: No possvel capturar (hAPI.getCardValue) ou
adicionar (hAPI.setCardValue) dados no fichrio na
inicializao do processo. Somente a partir da segunda
tarefa, para isso pode ser utilizado a seguinte lgica:
function beforeStateEntry(sequenceId){
if(sequenceId != NUMERO_DA_ATIVIDADE_INICIAL ){
var campo = hAPI.getCardValue(campo1);
}
}





13

Customizao de Workflow

Customizao do Processo
Com o uso de eventos, o ECM permite que um processo seja customizado
possibilitando a execuo de aes definidas pelo usurio, tais como:
Validar o ato de completar uma atividade
Tomar decises automaticamente

Existem algumas propriedades que contm informaes referentes
solicitao que podem ser utilizadas na customizao do processo, so elas:
WKDef Cdigo do processo.
WKVersDef Verso do processo.
WKNumProces Nmero do processo.
WKNumState Nmero da atividade.
WKCompany Nmero da Empresa.
WKUser Usurio Corrente.
WKUserComment Comentrio feito pelo usurio na atividade
ou no cancelamento da solicitao.
WKUserPassword Senha do Usurio corrente em MD5
WKCompletTask Se a tarefa foi completada (true/false)
WKNextState Nmero da prxima atividade (destino).
WKCardId Cdigo da ficha do processo.
WKFormId Cdigo do fichrio do processo.
WKManagerMode Se quem est visualizando o processo
gestor do processo
WKMobile Se a atividade est sendo inicializada via
mobile (true/false).

Alm dessas propriedades j alimentadas pelo produto, possvel criar
propriedades customizadas que podem ser utilizadas nos eventos.
O produto disponibiliza a varivel globalVars, que um mapa de dados
(HashMap<String, String>) e estar disponvel em todos os eventos.
Para adicionar uma propriedade e seu valor, utilize o mtodo:
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 varivel globalVars, utilize o mtodo:
globalVars.get("name");
Onde "name" o nome da propriedade a ser retornado o valor. Ex:
globalVars.get("WDAprovador");

Exemplo 1:
Para validar se o usurio 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 cdigo de
customizao criado pelo ECM:
function beforeTaskComplete(colleagueId,nextSequenceId,userList){
var ativAtual = getValue("WKNumState");
var users = new java.util.ArrayList();
var usersTmp = new java.util.ArrayList();




14

Customizao de Workflow

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 deciso seja tomada automaticamente, os seguintes
procedimentos devem ser executados:
1. Configurar em Propriedades Avanadas a propriedade
AutomaticTasks conforme descrito anteriormente com a lista de
todas as atividades que tero deciso delegada via customizao
(Ex.: AutomaticTasks=3,6,10).
2. Implementar o evento beforeStateEntry e executar e chamar a o
mtodo setAutomaticDecision da hAPI, passando como parmetros
o prximo estado, o prximo usurio (ou lista de usurios) e a
observao.
function beforeStateEntry(sequenceId) {
var userList = new java.util.ArrayList();
userList.add(Administrator);
hAPI.setAutomaticDecision(new java.lang.Integer(8), userList, Observao);
}

ATENO: As atividades com deciso automtica tambm podem ser
criadas via editor de processos.
Para mais informaes consulte o Manual de Referncia do ECM.




15

Customizao de Workflow


Exemplo 3:
Para iniciar uma nova solicitao de um outro processo ao finalizar uma
solicitao devem ser executados os seguintes procedimentos:
1. Criar um servio 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
function afterProcessFinish(processId){
var func = { run: function(){
a();
}
};
var r = new java.lang.Runnable(func);
var t = new java.lang.Thread(r);
t.start();
log.info("Iniciei a thread");
return;
}

function a(){
try {
var atividade = getValue("WKNumState");
var user = getValue("WKUser");
var processo = getValue("WKNumProces");
log.info("########## Atividade: " + atividade);
log.info("########## inicio webservice workflow");

var workflow = ServiceManager.getService("WorkflowEngineService");
var serviceHelper = workflow.getBean();
var serviceLocator =
serviceHelper.instantiate("com.datasul.technology.webdesk.workflow.ws.WorkflowEngineServiceS
erviceLocator");
var service = serviceLocator.getWorkflowEngineServicePort();
log.info("########## carregou servio workflow");
log.info("########## Carrega Colaboradores do segundo processo");
var stringArray = service.getAvailableUsersStart("adm", "adm", 1, "process2", 0, 0);

var field1 =
serviceHelper.instantiate("com.datasul.technology.webdesk.workflow.ws.KeyValueDto");
field1.setKey("nome");
field1.setValue("valorNome");

var field2 =
serviceHelper.instantiate("com.datasul.technology.webdesk.workflow.ws.KeyValueDto");
field2.setKey("cid");
field2.setValue("valorCidade");

var resultArr =
serviceHelper.instantiate("com.datasul.technology.webdesk.workflow.ws.KeyValueDtoArray");
resultArr.setItem(new Array(field1, field2));

log.info("########## Inicia StartProcess");

var userArray = serviceHelper.instantiate("net.java.dev.jaxb.array.StringArray");

userArray.setItem(new Array(user));

log.info("########## Usuario: " + userArray.getItem(0));

try {




16

Customizao de Workflow

var ret = service.startProcessClassic("adm", "adm", 1, "process2", 2, userArray ,
"webservice chamada", "adm", false, null,resultArr, null, true);
} catch(e) {
log.info("########## Erro startProcess: " + e);
}
} catch(x) {
log.info("########## Erro Process: " + x);
}
}

Tratamento de Excees
As excees podem ser tratadas nos seguintes eventos: beforeStateEntry,
beforeTaskSave e beforeCancelProcess. O tratamento da exceo no evento
beforeStateEntry pode ser utilizado somente na inicializao de solicitaes,
pois ele impede que a solicitao seja iniciada. O tratamento da exceo no
evento beforeTaskSave pode ser utilizado somente se a solicitao j estiver
inicializada. Abaixo segue os modelos para utilizao em cada um dos
eventos:

function beforeStateEntry(sequenceId){
var activity = getValue("WKNumState");
if (activity == 0 || activity == 1){
//outra condio.
throw "TRATAMENTO DA EXCEO"
}
}


function beforeTaskSave(colleagueId,nextSequenceId,userList){
var activity = getValue("WKNumState");
if (activity != 0 && activity != 1){
// outra condio
throw "TRATAMENTO DE EXCEO";
}
}

function beforeCancelProcess(colleagueId, processId){
// condio.
throw "TRATAMENTO DA EXCEO"
}

possvel consistir o campo observao de uma solicitao workflow,
verificando se ele foi preenchido ou no. Para isto, necessrio validar a
propriedade WKUserComment no evento beforeTaskSave ou no evento
beforeCancelProcess.

function beforeTaskSave(colleagueId,nextSequenceId,userList){
if(getValue("WKUserComment")==null || getValue("WKUserComment")=="")
throw "A observao deve ser preenchida";
}

function beforeCancelProcess(colleagueId,processId){
if(getValue("WKUserComment")==null || getValue("WKUserComment")=="")
throw "A observao deve ser preenchida";
}





17

Customizao de Workflow

Mecanismo de Atribuio
Os mecanismos de atribuio so instrumentos utilizados durante um
processo de workflow que permitem criar, segundo um critrio estabelecido
pelo prprio mecanismo, uma lista de possveis colaboradores para uma
atividade. Esta lista pode ser utilizada em dois momentos:
1. Na inicializao do processo, onde o sistema verifica se o usurio
corrente faz parte desta lista e, portanto, pode inici-lo;
2. No momento do encaminhamento de uma tarefa, quando esta lista
apresentada ao usurio corrente com opes de encaminhamento da
solicitao.
No primeiro caso, a lista gerada de acordo com o mecanismo de atribuio
existente na primeira atividade do processo (que representa a atividade de
start). Nas demais atividades adotado o segundo procedimento. Quando
no houver um mecanismo de atribuio associado a uma atividade (seja ela
inicial ou no), todos os usurios so considerados vlidos.
Na inicializao do ECM so criados alguns mecanismos automaticamente,
conforme abaixo:

Associado Permite compor lgicas complexas de atribuio por
intermdio da associao de vrios mecanismos.
Campo Formulrio Permite atribuir tarefas ao colaborador informado
em um campo do formulrio do processo.
Executor Atividade Permite selecionar os colaboradores que
executaram uma atividade anterior.
Grupo Permite filtrar apenas os colaboradores que faam
parte de um determinado grupo.
Grupos Colaborador Permite filtrar apenas os colaboradores que
pertenam a um dos grupos do colaborador
corrente, ou do colaborador que iniciou o processo
(solicitante). Tambm permite filtrar apenas os
colaboradores cujo grupo de trabalho seja o mesmo
do colaborador (corrente ou solicitante).
Papel Permite filtrar apenas os colaboradores que
possuam um determinado papel no Workflow.
Pool Grupo Permite atribuir tarefas a um grupo de
colaboradores e no apenas a um colaborador.
Assim, qualquer um dos colaboradores deste grupo
pode assumir as tarefas para complet-las.
Pool Papel Permite atribuir tarefas a um papel e no apenas a
um colaborador. Assim, qualquer um dos
colaboradores neste papel pode assumir as tarefas
para complet-las.
Usurio Permite atribuir tarefas a um colaborador especfico.







18

Customizao de Workflow

Como Criar Um Mecanismo de Atribuio
O mecanismo de atribuio geralmente composto de duas partes, a tela de
configurao e o script de resoluo do mecanismo de atribuio.

Para criar um mecanismo de atribuio basta acessar o Painel de Controle,
na opo Workflow e clicar sobre Mecanismos de Atribuio. A seguinte
tela ser apresentada:

A tela apresenta todos os mecanismos de atribuio padro do ECM e
tambm os mecanismos customizados.
Para criar um novo mecanismo de atribuio clique sobre o boto Adicionar,
ento a seguinte tela ser apresentada:




19

Customizao de Workflow


O mecanismo de atribuio dever possuir obrigatoriamente seu cdigo, o
nome e a descrio da configurao. A tela de configurao opcional, mas
caso for utiliz-la, deve-se obrigatoriamente importar o componente
AssignmentSelectedEvent.swc que fica dentro do diretrio de instalao do
ECM (Ex: <INSTALL_ECM>\server\default\deploy\Webdesk3EE.ear) dentro
do pacote EAR existe um pacote ecm-web.war, abra o arquivo e copie o
SWC para o seu projeto e importe como biblioteca. Aps, sua tela deve
estender o mdulo WebdeskModule, veja um exemplo de tela abaixo:




20

Customizao de Workflow


<?xml version="1.0" encoding="utf-8"?>
<module:WebdeskModule xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:module="com.datasul.technology.webdesk.foundation.module.*"
creationComplete="{init();}">

<module:states>
<mx:State name="blocked">
<mx:SetProperty target="{this}" name="enabled" value="false"/>
</mx:State>
</module:states>

<mx:Script>
<![CDATA[
import com.datasul.technology.webdesk.workflow.assignment.event.AssignmentSelectedEvent;
import com.datasul.technology.webdesk.dm.view.event.CloseWindowEvent;
import mx.collections.ArrayCollection;

[Bindable]
private var arr:ArrayCollection = new ArrayCollection([
{value:"asd1",label:"Informtica"},
{value:"asd2",label:"RH"},
{value:"asd3",label:"Produto"}]);

private function init():void {
if (super.xmlFromDatabase != null) {
var xml:XML = new XML(super.xmlFromDatabase);
var area:String = String(xml.area);
this.tiNome.text = String(xml.nome);

for each (var current:Object in this.arr) {
if (current.value == area) {
this.cbArea.selectedItem = current;
break;
}
}
}
}

private function saveMecan():void {
var event:AssignmentSelectedEvent = new AssignmentSelectedEvent();
event.xmlString = "<Custom>" +
" <nome>"+this.tiNome.text+"</nome>" +
" <area>"+this.cbArea.selectedItem.value+"</area>" +
"</Custom>";

this.dispatchEvent(event);
this.closeWindow();
}

private function closeWindow():void {
this.dispatchEvent(new CloseWindowEvent());
}
]]>
</mx:Script>

<mx:Form>
<mx:FormItem label="Nome">
<mx:TextInput id="tiNome" width="200"/>
</mx:FormItem>
<mx:FormItem label="rea">
<mx:ComboBox id="cbArea" dataProvider="{arr}"></mx:ComboBox>
</mx:FormItem>
<mx:FormItem direction="horizontal" width="100%">
<mx:Button label="Salvar" click="{saveMecan()}"/>
<mx:Button label="Fechar" click="{closeWindow()}"/>
</mx:FormItem>
</mx:Form>

</module:WebdeskModule>




21

Customizao de Workflow

A tela de configurao dever montar o XML que consiste da configurao do
mecanismo de atribuio. Na resoluo de uma atividade do processo o XML
de configurao ser enviado ao script de descrio da configurao o
ltimo campo da tela. Exemplo baseado na tela acima:


OBS: possvel acessar Datasets e WebServices apartir da funo.
Alm do XML o script tambm recebe como parmetros o cdigo do processo
e o usurio corrente. Por fim, o script de configurao retorna a lista de
usurios e o fluxo de sada da atividade selecionado.
Para persistir o XML de configurao criado pela tela basta lanar o evento
AssignmentSelectedEvent e atribuir o XML de configurao na propriedade
xmlString.
Dica: caso a compilao normal pela GUI de desenvolvimento no esteja
efetuando as importaes corretamente, segue sugesto de compilao do
projeto:
mxmlc -debug=false -optimize=true -warnings=false -load-config flex-
config-mxmlc.xml -source-path=. <ARQUIVO>.mxml -output
<ARQUIVO>.swf











function resolve(process,colleague,configXML){

var newXML = new XML(configXML);
var userList = new java.util.ArrayList();

if (newXML.area.toString()=="asd1") {
userList.add('adm');
} else if (newXML.area.toString()=="asd2") {
userList.add('1');
} else {
userList.add('10');
}

return userList;
}




22

Customizao de Workflow

Arquivo FLEX-CONFIG-MXMLC.XML:

Por fim, o arquivo SWF do mecanismo de atribuio deve ser publicado no
ECM como um documento. Para selecionar o documento no momento da
publicao basta clicar sobre o cone ao lado do campo Tela de
Configurao.







<?xml version="1.0" encoding="utf-8"?>
<flex-config xmlns="http://www.adobe.com/2006/flex-config">

<metadata>
<title>TOTVS | ECM</title>
<language>EN</language>
</metadata>

<compiler>

<fonts>
<local-fonts-snapshot>C:/Arquivos de programas/Adobe/Flex Builder 3
Plug-in/sdks/2.0.1/frameworks/localFonts.ser</local-fonts-snapshot>
</fonts>

<!-- list of SWC files or directories that contain SWC files -->
<library-path>
<path-element>C:/Arquivos de programas/Adobe/Flex Builder 3 Plug-
in/sdks/2.0.1/frameworks/libs</path-element>
<path-element>C:/Arquivos de programas/Adobe/Flex Builder 3 Plug-
in/sdks/2.0.1/frameworks/locale/en_US</path-element>
<path-element>AssignmentSelectedEvent.swc</path-element>
</library-path>

<debug>true</debug>
</compiler>
<use-network>true</use-network>
</flex-config>




23

Customizao de Workflow

Parmetros Workflow para Customizao de
Fichrios

Para processos que possuem um fichrio padro definido so passados
alguns parmetros com informaes sobre o processo para serem utilizados
nas customizaes do fichrio, conforme abaixo:
WKDef Cdigo do processo.
WKVersDef Verso do processo.
WKNumProces Nmero do processo.
WKNumState Nmero da atividade.
WKCompany Nmero da Empresa.
WKUser Usurio Corrente.

Estas informaes so passadas como parmetros da URL do programa que
permite o encaminhamento das atividades, portanto no programa de
customizao do fichrio basta recuperar as informaes com o comando
getValue, conforme exemplo:

var vCodProcess = getValue("WKDef");

Customizao de E-mail

possvel incluir customizaes de e-mail durante o andamento de um
Workflow. Existem duas modalidades de customizao nessa categoria:

Envio e alterao de e-mail padro atravs do evento
onNotify.
Envio de e-mail customizado em qualquer evento do
Workflow.

Envio de E-mail Padro

Para interferir no envio de um e-mail padro, 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 alteraes, como por
exemplo: adicionar outros destinatrios ao e-mail (alm daqueles que esto
participando do processo), modificar os valores dos parmetros utilizados no
template de e-mail, etc.
Abaixo se encontra um exemplo de como implementar esse evento.

function onNotify(subject, receivers, template, params) {
if (template.match("tpl028")!=null) {
receivers.add("usuario@dominio.com");
}
}




24

Customizao de Workflow


O evento onNotify est disponvel na lista de eventos do Workflow. Portanto,
ao selecionar esse evento na lista de eventos disponveis, a assinatura da
funo acima j ser preenchida automaticamente.
Este evento disponibiliza os seguintes parmetros:

1. Subject: o assunto do e-mail. A alterao desta varivel ir implicar
que todos os usurios recebam o e-mail com o novo assunto
configurado, inclusive aqueles que participam do processo. Exemplo
de utilizao: subject.add("ASSUNTO");
2. Receivers: Lista de e-mails destinatrios. Tambm possvel
adicionar outros e-mails, de usurios que no participam do workflow.
Inclusive, podem ser adicionados e-mails de usurios que no esto
cadastrados no ECM, caso seja necessrio notificar uma pessoa que
no tenho acesso ao sistema.
3. Template: Permite validar qual tipo de e-mail est sendo enviado (por
exemplo, template de nova tarefa, notificao de gestor, etc). Com
base nessa varivel podemos distinguir quais e-mails queremos
customizar. recomendvel que sempre seja verificado o cdigo do
template, para evitar que ocorram alteraes em outros tipos de e-
mail, que no necessitariam de customizao.
4. Params: um mapa de dados que permite alterar/incluir parmetros
para que sejam apresentados no e-mail. O nome dos parmetros
informados nesse mapa devem ser os mesmos que so utilizados
dentro do arquivo de template.

No exemplo que foi apresentado acima est sendo validado se o template o
TPL028 (que corresponde a Notificao do Gestor), em caso positivo, um
novo e-mail ser adicionado na lista de destinatrios. Ou seja, alm do gestor
do processo, outra pessoa ser notificada, recebendo uma cpia do e-mail
que o gestor ir receber. Como est sendo validado o cdigo do template, os
demais tipos de e-mail no sero afetados.
Os templates podem ser consultados dentro do diretrio do volume, em:
<VOLUME>\templates\tplmail. Se for necessrio adicionar algum parmetro
no e-mail padro, os templates podem ser editados diretamente nesse
diretrio.


Envio de E-mail Customizado

Caso seja necessrio incluir um novo tipo de e-mail, alm daqueles que so
disponibilizados pelo produto, o ECM permite que o usurio cadastre
templates customizados, atravs do cone Templates na categoria GED ou
Painel de Controle, na tela principal do sistema.
Para incluir um novo Template, basta clicar no boto adicionar e preencher os
dados solicitados. Nesta etapa tambm deve ser feito upload do arquivo de
template.





25

Customizao de Workflow

Para adicionar parmetros dentro de um arquivo de template (TXT ou HTML),
deve-se utilizar a seguinte notao:

${NOME_USUARIO}

Neste caso, ser utilizado o identificador NOME_USUARIO durante a
customizao para atribuir um valor a este parmetro.
Os templates disponveis no volume da empresa
(<VOLUME>\templates\tplmail) podem ser consultados para mais exemplos
de utilizao de parmetros.

Aps cadastrar um novo template, possvel utiliz-lo para enviar e-mail a
partir de qualquer um dos eventos do Workflow (exceto no onNotify ver
Envio de E-mail Padro).
Para efetuar um envio de e-mail, em base de um template customizado,
utilizado o objeto notifier, chamando a funo notify, conforme o cdigo
abaixo:

try{
//Monta mapa com parmetros do template
var parametros = new java.util.HashMap();
parametros.put("NOME_USUARIO", "JOAO");
parametros.put("CODIGO_USUARIO", "01");

//Este parmetro obrigatrio e representa o assunto do e-mail
parametros.put("subject", "ASSUNTO");

//Monta lista de destinatrios
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 parmetro que a funo notify recebe o cdigo/matrcula do
usurio que ir enviar o e-mail (remetente).
O segundo parmetro o cdigo do template que foi cadastrado atravs do
cone de Templates.
O terceiro parmetro um mapa de dados (java.util.HashMap) que contm os
parmetros que sero utilizados para preencher as variveis do template.
Por padro, os parmetros WDK_VirtualDir (diretrio virtual) e
WDK_AdviceUser (Nome do colaborador remetente) so adicionados ao
mapa de parmetros automaticamente e podem ser utilizados na template,
sem que os valores sejam adicionados pela customizao.




26

Customizao de Workflow

O quarto parmetro representa a lista de usurios que iro receber o e-mail
(java.util.ArrayList). Esta lista de usurios consiste em uma lista de
cdigos/matrculas de colaboradores cadastrados no ECM.
O quinto e ltimo parmetro especifica qual ser o formato do e-mail enviado.
Os valores aceitos so text/html e text/plain.

Outra forma de executar o mtodo de envio de email informando o nmero
da ficha, conforme exemplo:
notifier.notify("MATRICULA-REMETENTE", NMERO DA FICHA, "CODIGO-
TEMPLATE", parametros, destinatarios, "text/html");
ATENO: Obrigatoriamente o valor informado deve ser uma ficha. Outros
tipos de documentos no sero tratados e ocorrer erro na execuo do
evento.
Ao executar este mtodo, automaticamente os parmetros abaixo sero
adicionados a lista de parmetros e podem ser utilizados na template:

WDK_CardContent Contedo HTML da ficha (simula a
visualizao)
WDK_DocumentAuthor Nome do Autor
WDK_DocumentComments Comentrio adicional
WDK_DocumentDescription Descrio da ficha
WDK_DocumentIconImage Imagem do cone da ficha
WDK_DocumentNumber Nmero da ficha
WDK_DocumentUpdatedDate Data de atualizao da ficha
WDK_DocumentVersion Verso da ficha
WDK_DocumentViewLink Link para acesso a ficha






27

Customizao de Workflow

Third Party Trademarks

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.

Apple is a trademark of Apple Inc., registered in the U.S. and other countries

Firefox and Mozilla are registered trademarks of the Mozilla Foundation.

Google, Android and Google Chrome are trademarks of the Google Inc.

IOS is a trademark or registered trademark of Cisco in the U.S. and other
countries and is used under license

JavaScript is a trademark of Oracle Corporation.

Liferay, Liferay Portal, and the Liferay logo are trademarks or registered
trademarks of Liferay, Inc., in the United States and other countries.

Linux is the registered trademark of Linus Torvalds in the U.S. and other
countries.

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.

openDBcopy is an open-source project by Anthony Smith, published under the
terms of the GNU General Public License

OpenLDAP is a registered trademark of the OpenLDAP Foundation

Oracle, Java and OpenOffice.org are registered trademarks of Oracle and/or
its affiliates. Other names may be trademarks of their respective owners.

Progress and OpenEdge are trademarks or registered trademarks of Progress
Software Corporation or one of its subsidiaries or affiliates in the U.S. and
other countries.

Red Hat and JBoss are registered trademarks of Red Hat, Inc. in the United
States and other countries.

This product includes software developed by the Visigoth Software Society
(http://www.visigoths.org/).

Any other third party trademarks are the property of their respective owners.

Potrebbero piacerti anche