...
Índice |
---|
outline | true |
---|
style | none |
---|
exclude | .*ndice |
---|
|
Propriedades
...
extensão
As propriedades de extensão contêm informações especiais que podem alterar o comportamento padrão do processo em algum ponto. Elas devem ser utilizadas principalmente durante a fase de customização desenvolvimento personalizado ou conter "flags" especiais que alterem alguma lógica interna (apenas em casos especiais).
O cadastro de propriedades de extensão do processo é realizado pelo Fluig Studiofluig Studio, sendo necessário que o diagrama do processo já esteja criado. Para cadastrar um novo atributo, é necessário abrir o processo para edição e na visão 'Properties' acessar a aba Extensão:
...
Neste exemplo iremos criar atividades automáticas customizadaspersonalizadas.
Na imagem a seguir é possível visualizar o atributo adicionado, definindo as atividades 2 e 4 (separadas por vírgula) como atividades automáticas do processo.
Eventos do
...
processo
Os eventos de um processo são um conjunto de scripts carregados pela API de workflow. Tais scripts são desenvolvidos com o uso da linguagem JavaScript e chamados ao longo da execução do processo em momentos pré-determinadospredeterminados, como por exemplo a criação da solicitação do processo ou a entrada em uma nova atividade.
A implementação dos eventos do processo é realizada pelo Fluig Studiofluig Studio, sendo necessário já existir um projeto Fluig fluig com pelo menos um diagrama de processo.
Para criar um novo evento do processo, clicar com o botão direito do mouse no projeto, acessar a opção New e, em seguida, a opção Other. No assistente aberto, selecionar a opção "Script Evento Workflow evento workflow", presente na pasta Fluigfluig, e clicar no botão Next. Na nova tela, selecionar qual o evento que será criado e relacionar ele a um processo já existente. Para finalizar, clicar no botão Finish:
Acompanhamento de eventos
A partir do Fluig fluig 1.4.9, é possível acompanhar a execução dos eventos através do pelo novo componente loading. Com este acompanhamento, é possível apresentar mensagens para o usuário tomar conhecimento das rotinas que estão sendo executadas quando a solicitação é encaminhada para a próxima atividade. Essa ferramenta também pode ser muito útil para o desenvolvedor identificar pontos de baixa performance nos desenvolvimentos realizados sob a plataforma.
Para a utilização desta funcionalidade, basta utilizar o trecho loading.setMessage(String message) na na implementação do evento, conforme exemplo no trecho de código abaixo:
Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
|
function validateForm(form){
loading.setMessage("Validando campos de formulário");
if(form.getValue('nome') == null || form.getValue('nome') == '') {
throw "Campo nome não está preenchido";
}
loading.setMessage("");
} |
Assim, durante a execução deste evento, a mensagem definida na sua implementação do mesmo aparecerá será exibida na tela para o usuário acompanhar, conforme imagem abaixo:
Image Modified
Nota |
---|
|
- Para que funcione este o correto funcionamento deste método, o serviço do Real Time deve estar iniciado;.
- Se não levar um tempo considerável no processamento após a atribuição da mensagem, não será é possível visualizar o carregamento e a mensagem;.
Por padrão, todos os eventos executados serão são informados em tela, como por exemplo: "Executando validateForms", "Executando afterStateEntry" ou "Executando createDataset", mesmo se atribuído atribuída uma mensagem usando este método.
|
...
Em todos os eventos do processo é possível obter informações da API de Workflow. Cada evento possui acesso ao handle da API de workflow através da pela variável global hAPI. Os seguintes métodos estão disponíveis através da hAPI:
Método | Especificação |
---|
getCardValue("nomeCampo") | Permite acessar o valor de um campo do formulário do processo, onde: - nomeCampo: nome do campo do formulário.
|
setCardValue("nomeCampo", "valor") | Permite definir o valor de um campo do formulário do processo, onde: - nomeCampo: nome do campo do formulário;
- valor: valor a ser definido para o campo do formulário.
|
setAutomaticDecision(numAtiv, listaColab, "obs") | Permite definir o fluxo de saída de uma atividade de forma automática, onde: |
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: número da empresa;
- numProcesso: número da solicitação;
- numAtiv: número da atividade.
Exemplo de uso para esta função: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterTaskCreate(colleagueId) {
var nrProxAtividade = getValue("WKNextState");
if (nrProxAtividade == "5"){ //atividade entre paralelas
var data = new Date();
var numEmpresa = getValue("WKCompany");
//seta o dia, mês (Janeiro é 0) e ano
data.setDate(20);
data.setMonth(10);
data.setFullYear(2010);
// Recupera o numero da solicitação
var numProcesso = getValue("WKNumProces");
// Seta o prazo para as 14:00
hAPI.setDueDate(numProcesso, hAPI.getActualThread(numEmpresa, numProcesso, nrProxAtividade), colleagueId, data, 50400);
}
} |
|
setDueDate(numProcesso, numThread, "userId", dataConclusao, tempoSeg) | Permite alterar o prazo de conclusão para uma determinada atividade do processo, onde: - numProcesso: número da solicitação;
- numThread: número da thread (normalmente 0, quando não se utiliza atividades paralelas);
- userId: o usuário responsável pela tarefa;
- dataConclusao: a nova data de conclusão;
- tempoSeg: tempo que representa a nova hora de conclusão, calculado em segundos após a meia-noite.
Informações |
---|
Recomendamos a utilização deste método no evento afterTaskCreate, pois será executado logo após a criação da tarefa. Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterTaskCreate(colleagueId) {
var data = new Date();
//seta o dia, mês (Janeiro é 0) e ano
data.setDate(20);
data.setMonth(10);
data.setFullYear(2010);
// Recupera o numero da solicitação
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 usuário para outro(s) usuário(s). - transferUsers: lista (do tipo String) de usuários;
- obs: a observação;
- numThread: sequência da thread, em caso de atividades paralelas.
|
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: - transferUsers: lista (do tipo String) de usuários;
- obs: a observação.
|
startProcess(processId, ativDest, listaColab, "obs", completarTarefa, valoresForm, modoGestor) | Inicia uma solicitação workflow, onde: - processId: código do processo;
- ativDest: atividade de destino;
- listaColab: lista (do tipo String) de usuários;
- obs: texto da observação;
- completarTarefa: indica se deve completar a tarefa (true) ou apenas salvar (false);
- valoresForm: um Mapa com os valores do formulário do processo;
- modoGestor: indica que o usuário iniciará a solicitação como gestor (true) ou que o usuário iniciará a solicitação apenas como solicitante (false).
Retorna um mapa com informações da solicitação criada. Entre elas, o iProcess que é o número da solicitação criada. |
setColleagueReplacement(userId) | Seta um usuário substituto, onde: - userId: código do usuário substituto.
|
setTaskComments("userId", numProcesso, numThread, "obs") | Define uma observação para uma determinada tarefa do processo, onde: - userId: usuário responsável pela tarefa;
- numProcesso: número da solicitação de processo;
- numThread: é o número da thread (normalmente 0, quando não se utiliza atividades paralelas);
- obs: a observação.
Nota |
---|
| É recomendado utilizar em eventos do tipo 'after', pois o comentário será criado no histórico da solicitação, então é necessário que já exista uma movimentação do processo para atribuir este comentário. |
|
getCardData(numProcesso) | Retorna um Mapa com todos os campos e valores do formulário da solicitação. - numProcesso: número da solicitação de processo.
|
getAdvancedProperty("propriedade") | Retorna o valor da propriedade avançada de um processo. - propriedade: nome da propriedade avançada.
|
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 data inicial (tipo Date);
- segundos: Quantidade quantidade de segundos após a meia noite;
- prazo: Prazo prazo que será aplicado em horas (tipo int);
- periodId: Código código de Expedienteexpediente.
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterTaskCreate(colleagueId) {
var data = new Date();
//Calcula o prazo
var obj = hAPI.calculateDeadLineHours(data, 50000, 2, "Default");
var dt = obj[0];
var segundos = obj[1];
//Recupera o numero da solicitação
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 data inicial (tipo Date);
- segundos: Quantidade quantidade de segundos após a meia noite;
- prazo: Prazo prazo que será aplicado em minutos (tipo int).;
- periodId - Código de Expediente: código de expediente.
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| 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 solicitação
var processo = getValue("WKNumProces");
// Altera o prazo do processo
hAPI.setDueDate(processo,0,colleagueId, dt, segundos);
} |
|
getUserTaskLink(numAtiv) | Permite buscar o link para movimentação de uma determinada atividade, e utilizá-lo para enviar um e-mail com template customizado personalizado, por exemplo. - numAtiv: número da atividade
Retorno: link para movimentação da solicitação.
Nota |
---|
| Este método não retorna link para atividades que ainda não foram criadas, ou seja, não pode ser utilizado em eventos como afterTaskComplete(colleagueId,nextSequenceId,userList) para obter o link da atividade com "nextSequenceId". |
Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterTaskCreate(colleagueId) {
var sequenceId = getValue("WKCurrentState");
if (sequenceId == 2) {
var destinatarios = new java.util.ArrayList();
destinatarios.add(colleagueId);
var parametros = new java.util.HashMap();
parametros.put("WDK_CompanyId", getValue("WKCompany"));
parametros.put("WDK_TaskLink", hAPI.getUserTaskLink(sequenceId));
notifier.notify(getValue("WKUser"), "tplCustomizado", parametros, destinatarios, "text/html");
}
} |
|
createAdHocTasks(workflowProcessInstanceId, sequenceId, assunto, detalhamento, listatvidadesAhoc) | Permite a criação de atividades adhoc dentro dos eventos do Fluigfluig - workflowProcessInstanceId - Número : número da solicitação workflow no qual se deseja criar as tarefas.;
- sequenceId - Código : código de sequencia da atividade de SubprocessoAdhoc.;
- Assunto - Assunto : assunto da listagem das tarefas que será repassado ao formulário de atividade ad-hoc.;
- Detalhe - Texto : texto com o detalhamento das atividades em questão. Esse texto também será repassado para o formulário da atividade ad-hoc.;
- listaAtividadesAdhoc - É : é a lista de atividades contento o que, quando e quem executará as tarefas ad-hoc.
Nota |
---|
| Certifique-se que o sequenceId é a sequência da atividade ad-hoc. Normalmente este esta atividade contém o símbolo do sub-processo comum acompanhado do identificado: identificador "~", conforme exemplo abaixo : A sequência pode ser consultada a partir do plugin Fluig fluig Designer verificando o campo código ao visualizar as propriedades da atividade de subprocesso ad-hoc. |
Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterStateEntry(sequenceId){
//lista das tarefas
var adHocTasks = new Array();
// variavel com o código da solicitação do processo.
var process = getValue("WKNumProces");
//criando uma tarefa
var task = { name:"nome da tarefas", responsible:"adm", dueDate:"10/10/2014"};
//adicionando a tarefa criada para a lista de tarefas
adHocTasks.push(task);
// process = numero da solicitacao
// sequenceId = codigo processstate da atividade que tem o processo ad-hoc
// meeting = nome do assunto em questao
// detalhe = detalhamento do assunto
// adHocTasks lista te tarefas
hAPI.createAdHocTasks(process, sequenceId, "Assunto das tarefas", "Detalhamento do assunto ", adHocTasks);
} |
|
listAttachments() | Retorna a lista de anexos do processo. Nota |
---|
| O formulário do processo não é retornado, apenas anexos do tipo GED e Workflow. |
|
publishWorkflowAttachment(documento) | Permite publicar anexos workflow da solicitação no GED do Fluigfluig, onde: - documento: Anexo anexo workflow a ser publicado no GED.
Nota |
---|
| É obrigatório informar o id da pasta destino do documento através do método setParentDocumentId, conforme o exemplo abaixo. |
Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId){
if (sequenceId == 4) {
var calendar = java.util.Calendar.getInstance().getTime();
var docs = hAPI.listAttachments();
for (var i = 0; i < docs.size(); i++) {
var doc = docs.get(i);
if (doc.getDocumentType() != "7") {
continue;
}
doc.setParentDocumentId(27);
doc.setVersionDescription("Processo: " + getValue("WKNumProces"));
doc.setExpires(false);
doc.setCreateDate(calendar);
doc.setInheritSecurity(true);
doc.setTopicId(1);
doc.setUserNotify(false);
doc.setValidationStartDate(calendar);
doc.setVersionOption("0");
doc.setUpdateIsoProperties(true);
hAPI.publishWorkflowAttachment(doc);
}
}
} |
|
attachDocument(documentId) Âncora |
---|
| attachDocumentDocs |
---|
| attachDocumentDocs |
---|
|
| Permite anexar documentos do GED a solicitação workflow, onde: - documentId: Código código do documento a ser anexado a solicitação.
Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId) {
var docList = [44, 46, 135];
if (sequenceId == 2) {
for (var i = 0; i < docList.length; i++) {
var docId = docList[i];
hAPI.attachDocument(docId);
};
}
} |
|
getAvailableStatesDetail(companyId, userId, processId, processInstanceId, threadSequence) | Retorna detalhes das atividades disponíveis para seleção. Parâmetros: - companyId: código da empresa.;
- userId: id do usuário.;
- processId: código do processo.;
- processInstanceId: número da solicitação.;
- threadSequence: Indica indica se existe atividade paralela no processo. Se não existir o valor é 0 (zero), caso exista, este valor pode ser de 1 a infinito, dependendo da quantidade de atividade paralelas existentes no processo.
Retorno: ProcessStateDto[]. |
getChildrenInstances(processInstanceId) | Retorna uma lista com os números das solicitações filhas, onde: - processInstanceId: Número número da solicitação pai.
Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | js |
---|
firstline | 1 |
---|
| function afterStateEntry(sequenceId){
if (sequenceId == 5) {
var numProcess = getValue("WKNumProces");
// Busca a Lista com o número da solicitação dos filhos
var childrenProcess = hAPI.getChildrenInstances(numProcess);
for (var i = 0; i < childrenProcess.size(); i++) {
// Busca os dados do formulário da solicitação filha
var childCardData = hAPI.getCardData(childrenProcess.get(i));
// Replica um dado do formulário da solicitação filha para o formulário da solicitação pai
var obs = childCardData.get("obs");
hAPI.setCardValue("obs", obs );
}
}
} |
|
getParentInstance(processInstanceId) | Retorna o número da solicitação pai, onde: - processInstanceId: Número número da solicitação filha.
Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId) {
if (sequenceId == 2) {
var numProcess = getValue("WKNumProces");
// Busca o número da solicitação pai
var parentProcess = hAPI.getParentInstance(numProcess);
// Busca os dados do formulário da solicitação pai
var parentCardData = hAPI.getCardData(parentProcess);
// Replica um dado do formulário da solicitação pai para o formulário da solicitação filha
var cnpj = parentCardData.get("cnpj");
hAPI.setCardValue("cnpj", cnpj);
}
} |
|
addCardChild(tableName, cardData) | Adiciona um filho no formulário pai e filho do processo, onde: - tableName: Nome nome da tabela filha onde será criado o filho;
- cardData: Mapa mapa com os campos do filho e seus valores.
Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId) {
if (sequenceId == 4) {
var childData = new java.util.HashMap();
childData.put("matricula", "0041");
childData.put("nome", "João Silva");
childData.put("cpf", "44455889987");
hAPI.addCardChild("funcionarios", childData);
}
} |
|
...
O acesso a WebServices ou AppServer Progress® deve ser previamente configurado no cadastro de Serviços. Para mais detalhes consulte em Integração Com Aplicativos Externoscom aplicativos externos, no capítulo "Acessando WebServices a partir do Fluigdo fluig".
Abaixo um exemplo de como executar o WebService de Colleague para criar um usuário no Fluig fluig após executar uma tarefa:
...
Os seguintes eventos são disparados pela API de Workflow:
Evento | Descrição | Parâmetros |
---|
afterCancelProcess | Ocorre após o cancelamento da solicitação. É recomendado não disparar exceções neste método, pois o cancelamento já foi realizado. | - Usuário corrente (String);
- Número do processo (Integer).
|
afterProcessCreate | Ocorre logo após a criação de um novo processo. Nota |
---|
Observação: Em caso de execução deste evento um em sub-processo, não será possível definir ou resgatar dados da ficha anexada ao sub-processo, pois nessa situação a ficha ainda não está criada. |
| - Número do Número do novo processo (Integer).
|
afterProcessFinish | Ocorre após finalizada a solicitação. | - Número do processo (Integer).
|
afterReleaseVersion | Ocorre após a liberação de uma versão do processo. | - XML com a definição do processo (String).
|
afterStateEntry | Ocorre após a entrada em uma nova atividade. | - Sequência da atividade (Integer).
|
afterStateLeave | Ocorre após a saída de uma atividade. | - Sequência da atividade (Integer).
|
afterTaskComplete | Ocorre após o usuário completar uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas. | - Usuário corrente (String);
- Sequência da próxima atividade (Integer);
- Lista de usuários destino (List<String>).
|
afterTaskCreate | Ocorre após o usuário receber uma tarefa. | - Matrícula do usuário (String).
|
afterTaskSave | Ocorre após salvar as informações selecionadas pelo usuário. | - Usuário corrente (String);
- Sequência da próxima atividade (Integer);
- Lista de usuários destino (List<String>).
|
beforeCancelProcess | Ocorre antes do cancelamento da solicitação. | - Usuário corrente (String);
- Número do processo (Integer).
|
beforeStateEntry | Ocorre antes da entrada em uma nova atividade. | - Sequência da atividade (Integer).
|
beforeStateLeave | Ocorre antes da saída de uma atividade. | - Sequência da atividade (Integer).
|
beforeTaskComplete | Ocorre antes que o usuário complete uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas. | - Usuário corrente (String);
- Seqüência da próxima atividade (Integer);
- Lista de usuários destino (List<String>).
|
beforeTaskCreate | Ocorre antes que o usuário receba uma tarefa. | - Matrícula do usuário (String).
|
beforeTaskSave | Ocorre antes de salvar as informações selecionadas pelo usuário. | - Usuário corrente (String);
- Sequência da próxima atividade (Integer);
- Lista de usuários destino (List<String>).
|
calculateAgreement | Ocorre após o cálculo do consenso (somente para atividades conjuntas) e permite alterar os dados do consenso de uma atividade. Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function calculateAgreement(currentState, agreementData) {
log.info("Consenso Atual: " + agreementData.get("currentPercentage"));
log.info("Atividade Destino Atual: " + agreementData.get("currentDestState"));
log.info("Usuario Destino Atual: " + agreementData.get("currentDestUsers"));
//Altera o consenso
agreementData.put("currentPercentage", 100);
agreementData.put("currentDestState", 2);
agreementData.put("currentDestUsers", "adm,teste,super");
} |
| - currentState (Integer): atividade que terá o consenso alterado;
- agreementData (Map<String, Object>): mapa de dados com o percentual calculado, a atividade destino e os usuários de destino. Para obter os valores, utilize o método "get" e para atribuir um valor, utilize o método "put".
|
onNotify | Se refere a um evento global que ocorre após a movimentação da solicitação e antes de enviar as notificações. | Para mais detalhes consulte a página Desenvolvimento de Eventos eventos - On Notify. |
setProcess | Ocorre quando um processo é "setado" na API. Nota |
---|
| : A propriedade WKCompletTask não deve ser utilizada neste evento, pois quando ele é executado o produto ainda não tem a informação se atividade foi ou não completada. |
| - Número do processo (Integer).
|
subProcessCreated | Ocorre quando um sub-processo é criado. | - 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. | - Sequência da atividade atual (Integer);
- Lista das sequências das atividades (List<Integer>).
|
Informações |
---|
- Não é necessário criar todos os eventos do processo – apenas aqueles que se estiver interessadonos quais se tem interesse.
- Todos os eventos são executados de forma persistente.
|
Nota |
---|
|
: Não é possível capturar (hAPI.getCardValue) ou adicionar (hAPI.setCardValue) dados no formulário na inicialização do processo, sendo possível somente a partir da segunda tarefa. Para isso pode ser utilizado utilizada a seguinte lógica: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId) {
if (sequenceId != "NUMERO_DA_ATIVIDADE_INICIAL") {
var campo = hAPI.getCardValue("campo1");
}
} |
|
...
Personalização do
...
processo
Com o uso de eventos, o Fluig fluig permite que um processo seja customizado pesonalizado possibilitando a execução de ações definidas pelo usuário, tais como:
- Validar validar o ato de completar uma atividade;
- Tomar tomar decisões automaticamente;
- Realizar realizar integrações com outros sistemas;
- Iniciar iniciar novas solicitações automaticamente.
Existem algumas propriedades que contém informações referentes à solicitação que podem ser utilizadas na customização personalização do processo, são elas:
Parâmetro | Descrição |
---|
WKDef | Código do processo. |
WKVersDef | Versão do processo. |
WKNumProces | Número da solicitação de processo. |
WKNumState | Número da atividade. |
WKCompany | Número da empresa. |
WKUser | Código do usuário corrente. |
WKUserComment | Comentário feito pelo usuário na atividade ou no cancelamento da solicitação. |
WKCompletTask | Se a tarefa foi completada (true/false). |
WKNextState | Número da próxima atividade (destino). |
WKCardId | Código do formulário do processo. |
WKFormId | Código da definição de formulário do processo. |
WKIdentityCompany | Identificador da Empresa empresa selecionada para Experiências de uso TOTVS. |
WKMobile | Identifica se a ação foi realizada através de um dispositivo mobile. |
WKIsService | Identifica se a solicitação de cancelamento foi realizada através de um serviço. Esta variável só poderá pode ser consultada nos eventos beforeCancelProcess e afterCancelProcess. |
WKUserLocale | Identifica o idioma corrente do usuário. |
...
Além dessas propriedades já alimentadas pelo produtopela plataforma, é possível criar propriedades customizadas personalizadas que podem ser utilizadas nos eventos. O produto disponibiliza a variável globalVars, que é um mapa de dados (Map<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. Exemplo: 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. Exemplo: globalVars.get("WDAprovador");
Deck of Cards |
---|
effectDuration | 0.5 |
---|
id | samples |
---|
history | false |
---|
effectType | fade |
---|
|
Card |
---|
default | true |
---|
id | 1 |
---|
label | Exemplo 1 |
---|
| Para validar se o usuário está completando uma atividade corretamente, basta utilizar o evento beforeTaskSave e retornar alguma mensagem caso queira disparar um erro. Por exemplo, segue parte de um código de customização personalização para um processo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeTaskSave(colleagueId, nextSequenceId, userList) {
var ativAtual = getValue("WKNumState");
var process = parseInt(globalVars.get("process"));
var resp1 = hAPI.getCardValue("resp1_H");
var eficacia1 = hAPI.getCardValue("eficaz1");
var controle1 = hAPI.getCardValue("controle1");
var eficaz = true;
var users = new java.util.ArrayList();
if (ativAtual == 7 && nextSequenceId == 12) {
if (resp1 != "" && eficacia1 != "1" && eficacia1 != "2") {
if (verificaUsuario(users, resp1)) {
users.add(resp1);
}
}
hAPI.setAutomaticDecision(8, users, "Decisao tomada automaticamente pelo Fluig.");
} else if (ativAtual == 9 && nextSequenceId == 13) {
if (resp1 != "" && eficacia1 == "2" && controle1 == ""){
eficaz = false;
}
if (eficaz) {
var codGrupo = buscaGrupo(process, "Qualidade");
users.add("Pool:Group:" + codGrupo);
hAPI.setAutomaticDecision(6, users , "Decisao tomada automaticamente pelo Fluig.");
}
}
} |
|
Card |
---|
| Para fazer com que uma decisão seja tomada automaticamente, os seguintes procedimentos devem ser executados: - Adicionar na Extensão do Processo a propriedade AutomaticTasks com a lista de todas as atividades que terão decisão delegada via customizaçãopersonalização. Exemplo: AutomaticTasks=3,6,10.
- Implementar o evento beforeStateEntry e executar o método "setAutomaticDecision" da hAPI, passando como parâmetros a próxima atividade, o próximo usuário (ou lista de usuários) e uma observação.
Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId) {
var userList = new java.util.ArrayList();
userList.add("adm");
hAPI.setAutomaticDecision(6, userList, "Decisao tomada automaticamente pelo Fluig.");
} |
Informações |
---|
As atividades com decisão automática também podem ser criadas via editor de processo. |
|
Card |
---|
| Para iniciar uma nova solicitação de um outro processo ao finalizar uma solicitação pode podem ser executados os seguintes procedimentos: - Cadastrar um serviço no Fluig fluig em que a URL seja o WSDL do serviço ECMWorkflowEngineService.
- Implementar o evento afterProcessFinish utilizando o exemplo abaixo. Sendo , sendo ‘process2’ o novo processo a ser inicializado
- .
Bloco de código |
---|
theme | Eclipse |
---|
language | js |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterProcessFinish(processId) {
// Servico <url_fluig>/webdesk/ECMWorkflowEngineService?wsdl
// Busca o webservice cadastrado com o código "WorkflowEngineService"
var workflowEngineServiceProvider = ServiceManager.getServiceInstance("WorkflowEngineService");
var workflowEngineServiceLocator = workflowEngineServiceProvider.instantiate("com.totvs.technology.ecm.workflow.ws.ECMWorkflowEngineServiceService");
var workflowEngineService = workflowEngineServiceLocator.getWorkflowEngineServicePort();
// Cria o ProcessAttachmentDtoArray
var processAttachmentDtoArray = workflowEngineServiceProvider.instantiate("com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray");
// Cria o ObjectFactory
var objectFactory = workflowEngineServiceProvider.instantiate("com.totvs.technology.ecm.workflow.ws.ObjectFactory");
// Cria um String[][]
var cardData = objectFactory.createStringArrayArray();
// Cria uma solicitação
workflowEngineService.simpleStartProcess("adm", "adm", 1, "process2", "Comment", processAttachmentDtoArray, cardData);
} |
Informações |
---|
Existem outros métodos parar iniciar uma solicitação, consulte-os aqui. Lembre-se de consultar a classe ObjectFactory do serviço, essa classe possui diversos métodos para criar instância de objetos necessários para utilização do serviço. |
|
|
Tratamento de
...
exceções
As exceções podem ser tratadas nos seguintes eventos: beforeStateEntry, beforeTaskSave e beforeCancelProcess. O tratamento de exceção no evento beforeStateEntry pode ser utilizado na inicialização de solicitações, pois ele impede que a solicitação seja iniciada. O tratamento de exceção no evento beforeTaskSave pode ser utilizado somente se a solicitação já estiver inicializada.
...
É possível consultar o campo observação Observação de uma solicitação de processo, verificando se ele foi preenchido ou não. Para isto, é necessário validar a propriedade WKUserComment no evento beforeTaskSave ou no evento beforeCancelProcess. Exemplo:
Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
|
function beforeTaskSave(colleagueId, nextSequenceId, userList) {
if (getValue("WKUserComment") == null || getValue("WKUserComment") == "") {
throw "A observação deve ser preenchida";
}
}
function beforeCancelProcess(colleagueId, processId) {
if (getValue("WKUserComment") == null || getValue("WKUserComment") == "") {
throw "A observação deve ser preenchida";
}
} |
Mecanismo de
...
atribuição
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 usuários para uma atividade. Esta lista pode ser utilizada em dois momentos:
- Na na inicialização do processo, onde o sistema verifica se o usuário corrente faz parte desta lista e, portanto, pode iniciá-lo;
- No 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 inicial). 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.
O Fluig possui alguns mecanismos de atribuição padrõespadrão, conforme abaixo:
Mecanismo de Atribuição | Descrição |
---|
Para um Papel papel (Pool) | Permite atribuir tarefas a um papel e não apenas a um usuário. Assim, qualquer um dos usuários neste papel pode assumir as tarefas para completá-las. |
Para um Grupo grupo (Pool) | Permite atribuir tarefas a um grupo e não apenas a um usuário. Assim, qualquer um dos usuários deste grupo pode assumir as tarefas para completá-las. |
Por Associaçãoassociação | Permite compor lógicas complexas de atribuição por intermédio da associação de vários mecanismos. |
Por Campo campo de Formulárioformulário | Permite atribuir tarefas ao usuário informado em um campo do formulário do processo. |
Por Executor executor de Atividadeatividade | Permite selecionar os usuários que executaram uma atividade anterior. |
Por Grupogrupo | Permite filtrar apenas os usuários que façam parte de um determinado grupo. |
Por Grupos grupos do Usuáriousuário | Permite filtrar apenas os usuários que pertençam a um dos grupos do usuário corrente, ou do usuário que iniciou o processo (solicitante). Também permite filtrar apenas os usuários cujo grupo de trabalho seja o mesmo do usuário (corrente ou solicitante). |
Por Papelpapel | Permite filtrar apenas os usuários que possuam um determinado papel. |
Por Usuáriousuário | Permite atribuir tarefas a um usuário específico. |
Como criar um Mecanismo de
...
atribuição
A criação de um mecanismo de atribuição é realizada pelo Fluig Studiofluig Studio, sendo necessário já existir um projeto Fluigfluig.
Utilize o passo-a-passo para conhecer o processo de criação de um mecanismo de atribuição de exemplo:
Deck of Cards |
---|
startHidden | false |
---|
effectDuration | 0.5 |
---|
id | mecatrib |
---|
history | false |
---|
effectType | fade |
---|
|
Card |
---|
default | true |
---|
id | 1 |
---|
label | 1º Passo |
---|
| Para criar um novo mecanismo de atribuição customizadopersonalizado, clicar com o botão direito do mouse no projeto do Fluigfluig, acessar a opção New e então a opção Other. No assistente aberto, selecionar a opção "Mecanismo customizado Fluigfluig" presente na pasta Fluig fluig e clicar no botão Next:
|
Card |
---|
| O assistente Novo Mecanismo Fluig mecanismo fluig é aberto. Informar o Código código e uma descrição e clicar no botão Finish:
|
Card |
---|
id | 3 |
---|
label | 3º Passo (Implementação) |
---|
| O arquivo JavaScript do mecanismo de atribuição é adicionado ao projeto na pasta mechanisms e aberto para edição. O script de customização personalização de mecanismo de atribuição recebe como parâmetro o código do processo e o usuário corrente. Este script deve retornar uma lista dos usuários que podem assumir a tarefa. Abaixo, exemplo de implementação: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function resolve(process, colleague) {
var userList = new java.util.ArrayList();
var groupId = colleague.getGroupId();
var c1 = DatasetFactory.createConstraint("cdArea", groupId, groupId, ConstraintType.MUST);
var constraints = new Array(c1);
var dataset = DatasetFactory.getDataset("dsResponsaveisArea", null, constraints, null);
for (var i = 0; i < dataset.rowsCount; i++) {
userList.add(dataset.getValue(i, "cdUsuarioResp"));
}
return userList;
} |
Informações |
---|
É possível acessar Datasets e Serviços cadastrados no Fluig fluig na customização personalização do mecanismo de atribuição. |
|
Card |
---|
id | 4 |
---|
label | Último Passo (Exportação) |
---|
|
Por fim, o mecanismo de atribuição customizado personalizado deve ser exportado para o servidor do Fluig fluig e ao realizar a exportação deve ser informado obrigatoriamente seu código e nome, e opcionalmente uma descrição:
|
|
Parâmetros
...
workflow para
...
personalização de
...
formulários
Para processos que possuem uma definição de formulário definida são passados alguns parâmetros com informações sobre o processo para serem utilizados nos eventos da definição de do formulário, conforme abaixo:
Parâmetro | Descrição |
---|
WKDef | Código do processo. |
WKVersDef | Versão do processo. |
WKNumProces | Número da solicitação de processo. |
WKNumState | Número da atividade movimentada. |
WKCurrentState | Número da atividade atual. |
WKCompany | Número da empresa. |
WKUser | Código do usuário corrente. |
WKCompletTask | Se a tarefa foi completada (true/false). |
WKNextState | Número da próxima atividade (destino). |
WKCardId | Código do formulário do processo. |
WKFormId | Código da definição de formulário do processo. |
WKIdentityCompany | Identificador da Empresa empresa selecionada para Experiências de uso TOTVS. |
Nos scripts dos eventos da definição de formulário basta recuperar as informações com o comando getValue, conforme exemplo:
Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
|
var vCodProcess = getValue("WKDef"); |
...
Nota |
---|
| |
Sobre customizações personalização de notificações e e-mail , acompanhe informações detalhadas em: |
...