Histórico da Página
...
Método | Especificação | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
copyDocumentToUploadArea(documentId, version) | Copia o arquivo físico os arquivos físicos de um documento existente para a área de upload do usuário logado, onde:
Retorno: Array de Strings contendo os nomes dos arquivos que foram disponibilizados na área de upload. | ||||||||||
createDocument(document, attachments, securityConfig, approvers, relatedDocs) | Cria um novo documento no GED de acordo com os parâmetros enviados, onde:
Retorno: DocumentDto do documento criado. | ||||||||||
createFolder(document, securityConfig, approvers) | Cria uma nova pasta no GED de acordo com os parâmetros enviados, onde:
Retorno: DocumentDto da pasta criada. | ||||||||||
getDocumentVersion(documentId, version) | Retorna o DocumentDto de um documento com base no seu id e sua versão, onde:
| getUserPermissions(documentId, version) |
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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);
}
} |
Retorna se o usuário logado faz parte do grupo informado, onde:
group: código do grupo a ser verificado;Informações | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Recomendamos a utilização deste método no evento afterTaskCreate, pois será executado logo após a criação da tarefa. Exemplo:
|
Retorna uma nova instância de Attachment.
Retorna uma nova instância de RelatedDocumentDto.
Retorna uma nova instancia de DocumentSecurityConfigDto.
Retorna uma nova instância de ApproverDto.
Retorna uma nova instância de DocumentDto, com o tipo 2 (Documento) como padrão.
Desenvolvimento de processo sob a plataforma
Com o uso de eventos, o fluig permite que um processo seja desenvolvido sob a plataforma, possibilitando a execução de ações definidas pelo usuário, tais como:
- validar o ato de completar uma atividade;
- tomar decisões automaticamente;
- realizar integrações com outros sistemas;
- iniciar novas solicitações automaticamente.
Existem algumas propriedades que contém informações referentes à solicitação que podem ser utilizadas no desenvolvimento do processo sob a plataforma, 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 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ó pode ser consultada nos eventos beforeCancelProcess e afterCancelProcess. |
WKUserLocale | Identifica o idioma corrente do usuário. |
Além dessas propriedades já alimentadas pela plataforma, é possível criar propriedades desenvolvidas sob a plataforma 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");
...
effectDuration | 0.5 |
---|---|
id | samples |
history | false |
effectType | fade |
Card | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||
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 desenvolvimento de um processo sob a plataforma:
|
Card | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||
Para fazer com que uma decisão seja tomada automaticamente, os seguintes procedimentos devem ser executados:
|
Exemplo de utilização desta função em conjunto com a função copyDocumentToUploadArea:
| ||||||||||||
createFolder(document, securityConfig, approvers) | Cria uma nova pasta no GED de acordo com os parâmetros enviados, onde:
Retorno: DocumentDto da pasta criada. Exemplo de utilização desta função:
| |||||||||||
getDocumentVersion(documentId, version) | Retorna o DocumentDto de um documento com base no seu id e sua versão, onde:
| |||||||||||
getUserPermissions(documentId, version) | Retorna o nível de permissão do usuário logado no documento informado, onde:
| |||||||||||
isUserInGroup(group) | Retorna se o usuário logado faz parte do grupo informado, onde:
| |||||||||||
newAttachment() | Retorna uma nova instância de Attachment. | |||||||||||
newRelatedDocumentDto() | Retorna uma nova instância de RelatedDocumentDto. | |||||||||||
newDocumentSecurityConfigDto() | Retorna uma nova instancia de DocumentSecurityConfigDto. | |||||||||||
newApproverDto() | Retorna uma nova instância de ApproverDto. | |||||||||||
newDocumentDto() | Retorna uma nova instância de DocumentDto, com o tipo 2 (Documento) como padrão. |
Desenvolvimento de processo sob a plataforma
Com o uso de eventos, o fluig permite que um processo seja desenvolvido sob a plataforma, possibilitando a execução de ações definidas pelo usuário, tais como:
- validar o ato de completar uma atividade;
- tomar decisões automaticamente;
- realizar integrações com outros sistemas;
- iniciar novas solicitações automaticamente.
Existem algumas propriedades que contém informações referentes à solicitação que podem ser utilizadas no desenvolvimento do processo sob a plataforma, 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 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ó pode ser consultada nos eventos beforeCancelProcess e afterCancelProcess. |
WKUserLocale | Identifica o idioma corrente do usuário. |
Além dessas propriedades já alimentadas pela plataforma, é possível criar propriedades desenvolvidas sob a plataforma 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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.
Abaixo é apresentado os modelos para utilização em cada um dos eventos
...
id | 3 |
---|---|
label | Exemplo 3 |
Para iniciar uma nova solicitação de um outro processo ao finalizar uma solicitação podem ser executados os seguintes procedimentos:
...
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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("net.java.dev.jaxb.array.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.
Abaixo é apresentado os modelos para utilização em cada um dos eventos:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
function beforeStateEntry(sequenceId) {
var activity = getValue("WKNumState");
if (activity == 0 || activity == 1) {
//Outra condição.
throw "TRATAMENTO DE 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 DE EXCEÇÃO";
} |
É possível consultar o campo 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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
function beforeTaskSave(colleagueId, nextSequenceId, userListbeforeStateEntry(sequenceId) { ifvar activity = (getValue("WKUserCommentWKNumState"); if (activity == null0 || getValue("WKUserComment")activity == ""1) { //Outra condição. throw "ATRATAMENTO observação deve ser preenchidaDE EXCEÇÃO"; } } function beforeCancelProcessbeforeTaskSave(colleagueId, processIdnextSequenceId, userList) { ifvar activity = (getValue("WKUserCommentWKNumState"); if (activity !== null0 || getValue("WKUserComment") == ""&& activity != 1) { //Outra condição throw "ATRATAMENTO observação deve ser preenchidaDE EXCEÇÃO"; } } function beforeCancelProcess(colleagueId, processId) { //Condição. throw "TRATAMENTO DE EXCEÇÃO"; } |
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 inicialização do processo, onde o sistema verifica se o usuário corrente faz parte desta lista e, portanto, pode iniciá-lo;
- 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ão, conforme abaixo:
Mecanismo de Atribuição | Descrição |
---|---|
Para um 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 (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ção | Permite compor lógicas complexas de atribuição por intermédio da associação de vários mecanismos. |
Por campo de formulário | Permite atribuir tarefas ao usuário informado em um campo do formulário do processo. |
Por executor de atividade | Permite selecionar os usuários que executaram uma atividade anterior. |
Por grupo | Permite filtrar apenas os usuários que façam parte de um determinado grupo. |
Por grupos do usuá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 papel | Permite filtrar apenas os usuários que possuam um determinado papel. |
Por usuá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 Studio, sendo necessário já existir um projeto fluig.
Utilize o passo-a-passo para conhecer o processo de criação de um mecanismo de atribuição de exemplo:
É possível consultar o campo 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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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 inicialização do processo, onde o sistema verifica se o usuário corrente faz parte desta lista e, portanto, pode iniciá-lo;
- 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ão, conforme abaixo:
Mecanismo de Atribuição | Descrição |
---|---|
Para um 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 (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ção | Permite compor lógicas complexas de atribuição por intermédio da associação de vários mecanismos. |
Por campo de formulário | Permite atribuir tarefas ao usuário informado em um campo do formulário do processo. |
Por executor de atividade | Permite selecionar os usuários que executaram uma atividade anterior. |
Por grupo | Permite filtrar apenas os usuários que façam parte de um determinado grupo. |
Por grupos do usuá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 papel | Permite filtrar apenas os usuários que possuam um determinado papel. |
Por usuá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 Studio, sendo necessário já existir um projeto fluig.
Utilize o passo-a-passo para conhecer o processo de criação de um mecanismo de atribuição de exemplo:
Deck of Cards | |||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||
Card | | ||||||||||||||||||||||||||||||||||||
|
Parâmetros workflow para desenvolvimento de formulários sob a plataforma
Para processos que possuem uma definição de formulário são passados alguns parâmetros com informações sobre o processo para serem utilizados nos eventos da definição 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 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 | ||||
---|---|---|---|---|
| ||||
var vCodProcess = getValue("WKDef"); |
Funções JavaScript para validações na camada de interface de formulário
Em processos que possuem um formulário desenvolvido sob a plataforma é possível implementar funções JavaScript dentro do formulário, para serem executadas automaticamente durante a movimentação do processo.
Estão disponíveis:
|
Parâmetros workflow para desenvolvimento de formulários sob a plataforma
Para processos que possuem uma definição de formulário são passados alguns parâmetros com informações sobre o processo para serem utilizados nos eventos da definição 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 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 | ||||
---|---|---|---|---|
| ||||
var vCodProcess = getValue("WKDef"); |
Funções JavaScript para validações na camada de interface de formulário
Em processos que possuem um formulário desenvolvido sob a plataforma é possível implementar funções JavaScript dentro do formulário, para serem executadas automaticamente durante a movimentação do processo.
Estão disponíveis:
Função | Descrição | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
beforeMovementOptions | É executada quando o usuário pressiona o botão Movimentar antes de serem exibidas as opções de movimentação do processo.
Parâmetros:
Opcionais:
Exemplo:
| ||||||||||||||||||||||||
beforeSendValidate | Ocorre antes da solicitação ser movimentada, após já ter sido selecionada a atividade destino, o usuário e demais informações necessárias à solicitação. Parâmetros:
| ||||||||||||||||||||||||
Função | Descrição | ||||||||||||||||||||||||
beforeMovementOptions |
Nota |
---|
Se o fluxo não necessitar da interação do usuário, este método não será executado! |
Parâmetros:
numState: número da atividade atual- .
Opcionais:
- return false: impedirá a execução do processo. Esta opção permite que
- seja exibido um erro personalizado no formulário.
- throw(“Erro”): impedirá a execução e exibirá uma tela de erro padrão do fluig com o texto informado.
Exemplo:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
var |
beforeSendValidate = function(numState,nextState){ console.log("- |
beforeSendValidate-"); console.log("numState: " + numState); |
console.log(" |
nextState: " + |
nextState); |
Ocorre antes da solicitação ser movimentada, após já ter sido selecionada a atividade destino, o usuário e demais informações necessárias à solicitação.
Parâmetros:
- numState: número da atividade atual.
- nextState: número da atividade destino.
Opcionais:
- return false: impedirá a execução do processo. Esta opção permite que seja exibido um erro personalizado no formulário.
- throw(“Erro”): impedirá a execução e exibirá uma tela de erro padrão do fluig com o texto informado.
Exemplo:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
var beforeSendValidate = function(numState,nextState){
console.log("-beforeSendValidate-");
console.log("numState: " + numState);
console.log("nextState: " + nextState);
throw("Erro Xyz");
} |
Nota | ||
---|---|---|
| ||
Sobre personalização de notificações e e-mail acompanhe informações detalhadas em:
|
...
|
Nota | ||
---|---|---|
| ||
Sobre personalização de notificações e e-mail acompanhe informações detalhadas em:
|
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);
}
}