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 pela variável global hAPI. Os seguintes métodos estão disponíveis através da hAPI:
Informações |
---|
Veja o exemplo em nosso repositório aqui. |
| |
---|
getCardValue("nomeCampo") | Permite acessar o valor de um campo do formulário do processo, onde: - nomeCampo: nome do campo do formulário.
|
Dica |
---|
| Campos do tipo checkbox retornarem os valores on para marcado ou "" (vazio) para não marcado. Para trabalhar de uma maneira mais fácil, é possível transformá-los em booleanos. Exemplo: Bloco de código |
---|
language | js |
---|
linenumbers | true |
---|
| var campoCheckbox = hAPI.getCardValue("campoCheckbox") == "on" ? true : false; |
|
|
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") | |
A propriedade automaticTasks esta depreciada O método setAutomaticDecision encontra-se depreciado, não havendo mais suporte a partir da atualização 1.5.9 |
|
di É recomendada numEmpresa: número da empresa;numProcesso: número da solicitação;Permite definir o fluxo de saída de uma atividade de forma automática, onde: Bloco de código |
---|
language | js |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId){
if(sequenceId == 4){
var users = new java.util.ArrayList();
//Caso a próxima atividade seja uma automática utilizar users.add("System:Auto");
users.add("adm");
hAPI.setAutomaticDecision(7, users, "Decisao tomada automaticamente pelo Fluig");
}
} |
|
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.
Aviso |
---|
| O método getActualThread encontra-se depreciado, não havendo mais suporte a partir da atualização 1.8.0-221122 do Fluig. Recomenda-se a utilização dos parâmetros WKCurrentMovto e WKActualThread descritos na documentação Parâmetros. |
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: |
123
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function
afterTaskCreate(colleagueId) |
|
{
var
nrProxAtividade = {
var nrProxAtividade = getValue("WKNextState"); |
|
if
paralelas
var
data =
new
paralelas
var data = new Date(); |
|
var
numEmpresa =
var numEmpresa = getValue("WKCompany"); |
|
//seta o dia, mês (Janeiro é 0) e |
|
ano
var
numProcesso =
// 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: |
javascriptjs | theme | Eclipse |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterTaskCreate(colleagueId) {
var atividade = getValue('WKCurrentState');
// Atividade de sequência 5 é a da tarefa criada e que vou alterar o prazo de conclusão
if (atividade == 5) {
// Recuperando a data informada no campo do formulário
var prazoFormulario = hAPI.getCardValue('prazoConclusao');
if (prazoFormulario != undefined && prazoFormulario != '') {
var numeroDaSolicitacao = getValue('WKNumProces');
var threadDaSolicitacao = 0; // Normalmente 0, quando não for atividade paralela
var responsavelPelaTarefa = colleagueId;
/* Nesse caso o formato da data salva pelo formulário no exemplo é DD/MM/AAAA, mas isso pode variar de acordo com a formatação utilizada,
mudando assim as posições das informações dentro do array */
/* Extrai os dados da data do formulário para um array, para posteriormente transformar em data do Javascript */
var arrayPrazoConclusao = prazoFormulario.split("/");
var dia = arrayPrazoConclusao[0]; // Posição 0 do array é o dia
var mes = arrayPrazoConclusao[1] - 1; // Posição 1 do array é o mês (Subtraímos 1 porque na data do Javascript o mês vai de 0 a 11)
var ano = arrayPrazoConclusao[2]; // Posição 2 do array é o ano
var horaDoPrazo = (24*60*60) - 1; /* A hora é em milisegundos, e esse cálculo tem resultado de 23:59:59, ou seja,
o prazo de conclusão vai ser até o último segundo do dia informado no formulário */
// Cria a data no Javascript
var dataDoPrazo = new Date();
dataDoPrazo.setDate(dia);
dataDoPrazo.setMonth(mes);
dataDoPrazo.setFullYear(ano);
// Altera o prazo de conclusão
hAPI.setDueDate(numeroDaSolicitacao, threadDaSolicitacao, responsavelPelaTarefa, dataDoPrazo, horaDoPrazo);
}
}
} |
|
|
transferTasktransferUsersprocessId, ativDest, listaColab, "obs" |
, int numThread, completarTarefa, valoresForm, modoGestor) |
Transfere uma tarefa de um usuário para outro(s) usuário(s).
Inicia uma solicitação workflow, onde: - processId: código do processo;
- ativDest: código da atividade de destino;
- listaColab: lista
|
transferUsers: lista - (do tipo String) de usuários;
- obs:
|
a 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) | - 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.
Exemplo de inicialização de uma solicitação pelo método hAPI.startProcess enviando a atividade para um papel: Bloco de código |
---|
language | js |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId){
if (sequenceId == 5) {
//A tarefa destino tem o mecanismo de atribuição para um papel, cujo o |
|
Inicia uma solicitação workflow, onde:
- processId: código do processo;
- ativDest: código da 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.
Exemplo de inicialização de uma solicitação pelo método hAPI.startProcess enviando a atividade para um papel:
Bloco de código |
function beforeStateEntry(sequenceId){
if (sequenceId == 5) {
//A tarefa destino tem o mecanismo de atribuição para um papel, cujo o código é papelUser
var users = new java.util.ArrayList();
users.add("Pool:Role:papelUser");
var formData = new java.util.HashMap();
formData.put("Nome_do_Campo1", "Valor do Campo 1");
formData.put("Nome_do_Campo2", "Valor do Campo 2");
hAPI.startProcess("pool", 4, users, "Solicitação inicializada pela função hAPI", true, formData, false);
}
} |
|
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.
Informações |
---|
Para formulário pai e filho, os campos são identificados da seguinte forma: campo1___1, sendo campo1 o nome atribuído ao campo através da tag do campo HTML +___(3 underlines) + número sequencial do registro. Por exemplo, em um formulário de nota fiscal com os seguintes campos: - Formulário pai:
- Número da Nota - numNota;
|
|
- Formulário filho:
- Código do item - codItem;
- Descrição do item - desItem;
- Quantidade do item - qtdItem;
O retorno do mapa seria: - numNota = 99999
- codItem___1 = 91
- desItem___1 = Caneta
- qtdItem___1 = 100
- codItem___2 = 92
- desItem___2 = Lápis
- qtdItem___2 = 200
- codItem___3 = 93
- desItem___3 = Borracha
- qtdItem___3 = 150
|
|
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
Aviso |
---|
| Este método retorna o horário com a formatação BRT, sendo necessário algumas adaptações em algumas funções do javascript, como exemplo: getFullYear(). |
| 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 (tipo Date);
- segundos: quantidade de segundos após a meia noite;
- prazo: prazo que será aplicado em horas (tipo int);
- periodId: código de expediente.
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo: |
1234
5
6
7
8
9
10
11
12
13
14
function
afterTaskCreate(colleagueId) |
|
{
var
data =
new
prazo
var
obj = prazo
var obj = hAPI.calculateDeadLineHours(data, 50000, 2, |
|
var
dt =
var
segundos =
solicitação
var
processo = solicitação
var processo = getValue("WKNumProces"); |
|
processo
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 (tipo Date);
- segundos: quantidade de segundos após a meia noite;
- prazo: prazo que será aplicado em minutos (tipo int);
- periodId: código de expediente.
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo: |
123
4
5
6
7
8
9
10
11
12
13
function
afterTaskCreate(colleagueId) |
|
{
var
data =
new
prazo
var
obj = prazo
var obj = hAPI.calculateDeadLineTime(data, 50000, 120, |
|
var
dt =
var
segundos =
solicitação
var
processo = solicitação
var processo = getValue("WKNumProces"); |
|
processo
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 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". |
|
1234
5
6
7
8
9
10
11
12
13
function
afterTaskCreate(colleagueId) |
|
{
var
sequenceId = {
var sequenceId = getValue("WKCurrentState"); |
|
if
{
var
destinatarios =
new
{
var destinatarios = new java.util.ArrayList(); |
|
destinatarios.add(colleagueId); |
|
var
parametros =
new
var parametros = new java.util.HashMap(); |
|
parametros.put("WDK_CompanyId", getValue("WKCompany")); |
|
parametros
parametros.put("WDK_TaskLink", hAPI.getUserTaskLink(sequenceId)); |
|
notifier.notify(getValue("WKUser"), |
|
"tplCustomizado", parametros, destinatarios, |
|
}
|
createAdHocTasks(workflowProcessInstanceId, sequenceId, assunto, detalhamento, listatvidadesAhoc) | Permite a criação de atividades adhoc dentro dos eventos do fluig |
123
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function
beforeStateEntry(sequenceId){ |
|
tarefas
var
adHocTasks =
new
tarefas
var adHocTasks = new Array(); |
|
// variavel com o código da solicitação do processo. |
|
var
process =
var process = getValue("WKNumProces"); |
|
tarefa
var
task = { tarefa
var task = { name:"nome da tarefas", responsible:"adm", dueDate:"10/10/2014"}; |
|
//adicionando a tarefa criada para a lista de |
|
tarefas
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, |
|
"Detalhamento do assunto ", adHocTasks); |
|
|
listAttachments() | Retorna a lista de anexos do processo. DocumentDto[ ] Veja aqui os paramêtros do objeto DocumentDto |
. e aqui os métodos para acesso as variáveis. |
1234
5
6
7
8
9
10
11
12
13
14
15
function
| function beforeTaskSave(colleagueId, nextSequenceId, userList) |
|
{
var
attachments = {
var attachments = hAPI.listAttachments(); |
|
var
hasAttachment =
false
;
for
(
var
i = 0; i <
var hasAttachment = false;
for (var i = 0; i < attachments.size(); i++) |
|
{
var
attachment = {
var attachment = attachments.get(i); |
|
if
if (attachment.getDocumentDescription() == |
|
{
hasAttachment =
true
;
}
}
if
{
hasAttachment = true;
}
}
if (!hasAttachment) |
|
{
throw
{
throw "Attachment not found!"; |
|
}
|
publishWorkflowAttachment(documento) | Permite publicar anexos workflow da solicitação no GED do fluig, onde: |
Exemplo: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | | Utiliza os parâmetros do objeto DocumentDto. |
Exemplo:
Bloco de código |
---|
language | js |
---|
linenumbers | true |
---|
| function |
|
function
beforeStateEntry(sequenceId){ |
|
if
{
var
calendar = {
var calendar = java.util.Calendar.getInstance().getTime(); |
|
var
docs =
var docs = hAPI.listAttachments(); |
|
for
i = 0; i < docs.size(); i++) |
|
{
var
doc =
if
if (doc.getDocumentType() != |
|
{
continue
;
}
{
continue;
}
doc.setParentDocumentId(27); |
|
doc.setVersionDescription("Processo: " |
|
+ getValue("WKNumProces")); |
|
doc.setCreateDate(calendar); |
|
doc.setInheritSecurity(true); |
|
doc.setUserNotify(false); |
|
doc.setValidationStartDate(calendar); |
|
doc.setVersionOption("0"); |
|
doc.setUpdateIsoProperties(true); |
|
hAPI.publishWorkflowAttachment(doc); |
|
}
}
|
attachDocument(documentId) |
| Permite anexar documentos do GED a solicitação workflow, onde: - documentId: código do documento a ser anexado a solicitação.
Exemplo: |
123
4
5
6
7
8
9
10
function
beforeStateEntry(sequenceId) |
|
{
var
docList = {
var docList = [44, 46, 135]; |
|
if
(sequenceId == 2) {
for
(
var
i = 0; i <
if (sequenceId == 2) {
for (var i = 0; i < docList.length; i++) |
|
{
var
docId = {
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 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 da solicitação pai.
Exemplo: function beforeStateEntry(sequenceId){
if (sequenceId == 5) {
var numProcess = getValue( "WKNumProces" );
var childrenProcess = hAPI.getChildrenInstances(numProcess);
for ( var i = 0; i < childrenProcess.size(); i++) {
var childCardData = hAPI.getCardData(childrenProcess.get(i));
var obs = childCardData.get( "obs" );
hAPI.setCardValue( "obs" , obs );
}
}
}
|
|
getParentInstance(processInstanceId) | Retorna o número da solicitação pai, onde: - processInstanceId: número da solicitação filha.
Exemplo: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function beforeStateEntry(sequenceId) {
if (sequenceId == 2) {
var numProcess = getValue( "WKNumProces" );
var parentProcess = hAPI.getParentInstance(numProcess);
var parentCardData = hAPI.getCardData(parentProcess);
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 da tabela filha onde será criado o filho;
- cardData: mapa com os campos do filho e seus valores.
Exemplo: 1 2 3 4 5 6 7 8 9 | 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);
}
}
|
|
...
- 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 da solicitação pai.
Exemplo:
Bloco de código |
---|
language | js |
---|
linenumbers | true |
---|
| function beforeStateEntry(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 da solicitação filha.
Exemplo:
Bloco de código |
---|
language | js |
---|
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 da tabela filha onde será criado o filho;
- cardData: mapa com os campos do filho e seus valores.
Exemplo:
Bloco de código |
---|
language | js |
---|
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);
}
} |
|
removeCardChild | Informações |
---|
Este método estará disponível a partir da atualização 1.8.1 do TOTVS Fluig Plataforma. |
Remove uma linha de uma tabela Pai X Filho. Utilize o método removeCardChild, passando o nome da tabela (valor do atributo name) e o número da linha que deseja deletar. Exemplo: removeCardChild(tableName, 1);
Nota |
---|
| Caso queira excluir mais de uma linha e chamar o método mais de uma vez (utilizando um laço de repetição), se atente ao detalhe de que cada chamada nesse método ele irá resetar os index dos filhos da tabela por exemplo: Uma tabela tem 3 registros(A,B,C) e você utiliza o método duas vezes para excluir as duas primeiras linhas (A,B): removeCardChild(tableName, 1); removeCardChild(tableName, 2); Nesse caso ele estaria excluindo a linha A e linha C, pois quando chamou o primeiro método para excluir a linha 1(A) ele resetou os index da tabela e a linha 2(B) passou a ser 1 e a 3(C) passou a ser 2 e assim por diante. Temos duas alternativas para esse cenário: 1 - Excluir primeiro os últimos registros Exemplo: removeCardChild(tableName, 2); removeCardChild(tableName, 1); 2 - Antes de excluir utilizar um for para percorrer a linha de forma decrescente. Assim você garante estar excluindo sempre a linha que deseja sem interferir na próxima, por exemplo: Bloco de código |
---|
language | js |
---|
linenumbers | true |
---|
| var indexes = hAPI.getChildrenIndexes("tableName");
for (var i = indexes.length-1; i >= 0; i--)
{ hAPI.removeCardChild("tableName", indexes[i]); } |
Ou este outro exemplo: Bloco de código |
---|
language | js |
---|
linenumbers | true |
---|
| var indexes = hAPI.getChildrenIndexes("tableName");
for (var i = indexes.length-1; i >= 0; i--)
{ if (indexes[i] == 1) \{ hAPI.removeCardChild("tableName", indexes[i]); } |
Onde a variável indexes[i] possui os valor do número da linha. |
|
Nos eventos existe a possibilidade de integração com serviços de dados. Tais serviços podem ser WebServices, AppServer Progress® e Dataset.
...
Abaixo um exemplo de como executar o WebService de Colleague para criar um usuário no fluig após executar uma tarefa:
Bloco de código |
---|
language | js |
---|
linenumbers | true |
---|
|
function |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | function
afterTaskComplete(colleagueId, nextSequenceId, userList) |
{
if
(nextSequenceId == 2) {
//Servico {
if (nextSequenceId == 2) {
//Busca o webservices de Colaborador
//Servico "<url_fluig>/webdesk/ECMColleagueService?wsdl" cadastrado com o código "Colleague" |
var
colleagueServiceProvider =
var colleagueServiceProvider = ServiceManager.getServiceInstance("Colleague") |
;
var
colleagueServiceLocator = ;
var colleagueServiceLocator = colleagueServiceProvider.instantiate("com.totvs.technology.ecm.foundation.ws.ECMColleagueServiceService"); |
var
colleagueService =
var colleagueService = colleagueServiceLocator.getColleagueServicePort(); |
//Cria o ColleagueDto – Verificar a lista de métodos na visualização do |
serviço
var
colleagueDto = serviço
var colleagueDto = colleagueServiceProvider.instantiate("com.totvs.technology.ecm.foundation.ws.ColleagueDto"); |
colleagueDto.setCompanyId(1); |
colleagueDto.setColleagueId("teste"); |
colleagueDto.setColleagueName("Usuario Teste"); |
colleagueDto.setActive(true); |
colleagueDto.setVolumeId("Default"); |
colleagueDto.setLogin("teste"); |
teste@empresa
colleagueDto.setPasswd("teste"); |
colleagueDto.setAdminUser( |
false
);
false);
colleagueDto.setEmailHtml(true); |
colleagueDto.setDialectId("pt_BR"); |
//Cria o colleagueDtoArray e |
adiciona
var
colleagueDtoArray = adiciona
var colleagueDtoArray = colleagueServiceProvider.instantiate("com.totvs.technology.ecm.foundation.ws.ColleagueDtoArray"); |
colleagueDtoArray.getItem().add(colleagueDto); |
var
result =
var result = colleagueService.createColleague("adm", |
}
}
| |
Abaixo um outro exemplo utilizando o WebService ECMCardService para alterar o valor do campo de um registro de formulário após a entrada em uma nova atividade:
1234
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function
afterStateEntry(sequenceId){ |
if
{
{
//Servico "<url_fluig>/webdesk/ECMCardService?wsdl"cadastrado com o código "CardService" |
var
cardServiceProvider =
var cardServiceProvider = ServiceManager.getServiceInstance(" |
CardService
var
cardServiceLocator =
var cardServiceLocator = cardServiceProvider.instantiate("com.totvs.technology.ecm.dm.ws. |
ECMCardServiceServiceLocator
var
cardService =
var cardService = cardServiceLocator.getCardServicePort(); |
var
cardFieldDtoArray =
var cardFieldDtoArray = cardServiceProvider.instantiate("com.totvs.technology.ecm.dm.ws.CardFieldDtoArray"); |
var
cardField =
var cardField = cardServiceProvider.instantiate("com.totvs.technology.ecm.dm.ws.CardFieldDto"); |
//Seta valor no campo com name = 'nome' |
cardField.setField("nome"); |
cardField.setValue("Valor alterado via WS dentro de um evento workflow"); |
var
vetCardFields =
new
Array();
var vetCardFields = new Array();
vetCardFields.push(cardField); |
cardFieldDtoArray.setItem
cardFieldDtoArray.getItem().addAll(vetCardFields); |
//Altera o(s) campo(s) do registro de formulário. |
//updateCardData(tenantId, login, senha, codRegistroForm, cardFieldDtoArray); |
cardService.updateCardData(1, |
"adm", 8, cardFieldDtoArray); |
}
}
Os seguintes eventos são disparados pela API de Workflow:
| | |
---|
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. |
| - 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. |
abortada | - 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: |
123
4
5
6
7
8
9
10
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")); |
|
consenso
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 - On Notify.setProcess | Ocorre quando um processo é "setado" na API. | Número do processo (Integer)eventos - On Notify. |
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. |
123
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function
validateAvailableStates(iCurrentState, stateList) |
|
{
{
// Código: 1 - Descrição: Atividade |
|
inicial
inicial
// Código: 2 - Descrição: Atividade |
|
ordem 3
ordem 3
// Código: 3 - Descrição: Atividade ordem |
|
2
2
// Código: 4 - Descrição: Atividade ordem |
|
1
// stateList atual: 1
// stateList atual: [2,3,4] |
|
var
stateArray =
new
Array();
if
(iCurrentState == 1) {
var stateArray = new Array();
if (iCurrentState == 1) {
stateList.clear(); |
|
}
}
stateArray.forEach(function(code) |
|
{
java.lang.Integer(code)); |
|
// stateList reordenado: [4,3,2] |
|
return
| - iCurrentState: Sequência da atividade atual (Integer);
- stateList: Lista das sequências dapublishWorkflowAttachments atividades (List<Integer>).
|
- Não é necessário criar todos os eventos do processo – apenas aqueles nos quais se tem interesse.
- Todos os eventos são executados de forma persistente.