Passos, decisões e esperas
O catálogo dos nós de um workflow — condições, escritas no registo, notificações, emails, scripts, esperas, ciclos, paralelismo e junções.
Esta página percorre todos os tipos de passo que se arrastam da paleta Nós para a tela. Para cada um: o que faz, o que se preenche e o que acontece na execução.
Antes disso, uma peça que se repete em quase todos: a origem de um valor.
De onde vem um valor
Sempre que um passo pede um valor — o lado direito de uma condição, o que se escreve num campo — a interface oferece as mesmas quatro origens:
| Origem | O que traz |
|---|---|
| Valor fixo | Um texto escrito à mão ("Ganha", "25000"). |
| Campo do registo | Um campo do registo de que a execução trata. |
| Variável | Uma das variáveis do processo. |
| Quem iniciou | Quem mandou o processo arrancar — Utilizador (o username) ou Id do utilizador. |
É por isto que um processo não precisa de código para a maior parte do que faz: as decisões e as escritas compõem-se com estas quatro peças.
Condição
Abre dois caminhos a partir de uma pergunta. Tem sempre duas saídas fixas: Verdadeiro e Falso.
- Selecciona o passo e abre Condições no botão ….
- Clica em Acrescentar condição.
- Escolhe a origem do lado esquerdo (normalmente Campo do registo), o campo, o operador e o lado direito.
Os operadores são os mesmos dos filtros e das regras de formatação do resto da plataforma:
| Operador | Significa |
|---|---|
eq / neq |
Igual a / diferente de |
gt / gte |
Maior que / maior ou igual a |
lt / lte |
Menor que / menor ou igual a |
contains |
Contém o texto |
startsWith / endsWith |
Começa por / acaba em |
isEmpty / isNotEmpty |
Está vazio / não está vazio |
"Todas têm de se verificar" — várias condições no mesmo passo combinam-se com E, nunca com OU. Para um OU, usa dois passos de condição em cadeia.
Sem condições nenhumas, "segue sempre por «Verdadeiro»" — útil enquanto se desenha, perigoso se ficar assim.
Escrever no registo
Grava campos no registo de que a execução trata. É o passo que fecha o circuito: o processo decidiu, agora a ficha do CRM tem de reflectir isso.

- Abre Campos a escrever no botão ….
- Clica em Acrescentar campo.
- Escolhe o Campo e a origem do valor.
No exemplo, o passo Marcar como Ganha escreve fase = "Ganha" (valor
fixo) e responsavel = Quem iniciou (o username de quem começou o processo).
Nota
A escrita é feita "pelo mesmo GraphQL da app, com a autorização de quem começou". Ou seja: as permissões contam. Se quem iniciou o processo não pode alterar aquela entidade, o passo falha — e falha bem, porque um processo não é uma porta das traseiras às permissões.
Um passo sem campos nenhuns "não faz nada" — a interface di-lo em vez de o esconder.
Notificar
Manda uma notificação dentro da app — o sino da navegação, em tempo real para quem está com sessão aberta, e na caixa de entrada para quem não está.
| Campo | Notas |
|---|---|
| Utilizadores | Contas da app, escolhidas à mão. |
| Papéis | Todos os utilizadores com esse papel. Sobrevive a entradas e saídas de pessoas. |
| Título | A linha que aparece na notificação. |
| Texto | O corpo. |
No título e no texto podes meter valores do registo ou de variáveis entre
chavetas: A oportunidade {titulo} foi rejeitada.
Igual ao Notificar, mas o destino é o email, pelo canal configurado nas definições da app. Tem dois campos a mais: o corpo é HTML, escrito num editor próprio, e pode levar um relatório em anexo.

| Campo | Notas |
|---|---|
| Utilizadores / Papéis | Os destinatários. Quem não tiver email fica de fora. |
| Assunto | Aceita {campo} como o resto das mensagens. |
| Texto | Abre um editor de HTML no botão … (Corpo do email). |
| Anexar relatório | Um dos relatórios da app, ou Sem anexo. |
Sobre o anexo: "o PDF é gerado no momento do envio, para o registo desta execução" — não é um ficheiro guardado, é o documento daquele caso, feito naquele instante. Ver o capítulo Relatórios.
Atenção
Sem canal de email activo e com SMTP completo nas definições da app, o passo não consegue enviar. Configura-o em Definições da app → Notificações antes de pôr o processo a correr.
Correr script
Chama um script Python da app, a meio do processo. É a válvula de escape para tudo o que o desenho não faz: chamar um serviço externo, calcular uma margem, validar contra outro sistema.

| Campo | Notas |
|---|---|
| Script | Um dos scripts da app. |
| Guardar em | A variável onde fica o que o script devolver. Vazio = "deita fora". |
O script "recebe o registo, a chave e as variáveis nos argumentos" — não é preciso passá-los à mão. O que ele devolver fica na variável indicada e passa a estar disponível para os passos seguintes.
Se o script falhar, a execução fica em Falhou nesse passo, com o erro guardado no histórico.
Esperar
Adia o processo por um tempo fixo: Dias e Horas. "Zero em ambos = não espera nada."
É a peça de "avisa-me daqui a três dias se ainda não houver resposta". A execução dorme e é retomada automaticamente à hora certa, mesmo que o servidor tenha sido reiniciado pelo meio.
Esperar evento
Adia o processo até alguém mandar um sinal com um nome combinado.

O único campo é o Nome do sinal (no exemplo, dados-completos). "Quem
manda o sinal escreve este nome. Sem hora marcada: se ninguém o mandar, o
processo fica à espera."
O sinal manda-se de duas formas:
- num evento de ecrã (TypeScript):
keplin.workflow.signal("dados-completos", id) - num script (Python):
workflow.signal("dados-completos", key=id)
Sem indicar o registo, o sinal acorda todos os processos parados naquele nome; com o registo, só os desse. Zero acordados não é erro — quer dizer que ninguém estava à espera.
Dica
É comum combinar Esperar evento com uma seta de volta a uma tarefa: a pessoa devolve o caso pedindo mais dados, o processo fica à espera do sinal, e quando o comercial completa a ficha o sinal traz o caso de volta à mesma tarefa. É exactamente o que o exemplo desta documentação faz.
Ciclo
Percorre uma lista, um valor de cada vez. Tem duas saídas: Cada (o corpo do ciclo, que corre uma vez por valor) e No fim (quando a lista acaba).
| Campo | Notas |
|---|---|
| Lista | A variável com os valores a percorrer. "Um passo de script costuma ser quem a produz." |
| Guardar cada em | A variável que fica com o valor da volta actual. |
Sem lista escolhida, o desenho avisa: "Este ciclo não diz que lista percorrer: sai logo por «No fim»."
Paralelo
Arranca vários caminhos ao mesmo tempo. Cada ramo é uma saída do nó.
- Abre Ramos em paralelo no botão ….
- Cada linha é um ramo, com uma Etiqueta (o que se lê no desenho) e um Identificador.
- Liga cada saída ao primeiro passo do ramo respectivo.
No exemplo, o passo Fechar e comunicar abre dois ramos: Registo (que grava a fase) e Cliente (que envia o email). Nenhum espera pelo outro.
Junção
Volta a juntar os ramos de um Paralelo. É o passo que responde a "por quantos é que se espera?".

| Esperar por | O que faz |
|---|---|
| Todos os ramos | O processo só segue quando o último ramo chegar. |
| O primeiro decide | Segue com o primeiro que chegar — "os outros ramos são cancelados quando um chega". |
| Um número deles | Segue ao fim de Quantos ramos indicares. |
Sub-workflow
Chama outro processo, sobre o mesmo registo.
| Campo | Notas |
|---|---|
| Processo a correr | Um dos workflows da app. |
| Esperar que acabe | Ligado, este processo pára até o outro terminar. "Desligado, este processo segue em frente e o outro corre por sua conta." |
"Corre sobre o MESMO registo, e por isso tem de tratar da mesma entidade" — um processo sobre oportunidades não pode chamar um processo sobre contas. E um processo não se pode chamar a si próprio: "seria uma recursão sem fim", e o desenho acusa-o.
Fim
Termina a execução. Tem um único campo, Resultado, um texto curto como
aprovado, ganha ou perdida. "Fica no histórico e é o que o widget de
estado mostra."
Um processo pode ter vários nós de Fim — um por desfecho — e é isso que se deve fazer: em vez de um Fim genérico, um por resultado, para o histórico dizer alguma coisa a quem o lê meses depois.
Como se lê um passo na tela
Cada caixa na tela mostra três coisas: o nome do passo (o que escreveste em Nome do passo, e o que aparece no histórico), o tipo em letras pequenas por baixo, e as saídas à direita, com o nome de cada uma. Um triângulo âmbar no canto assinala um passo com problemas.
Dica
Dá nomes de negócio aos passos — "Aprovação da direcção", "Marcar como Ganha" — e não nomes técnicos. É esse texto que vais ler no histórico de cada execução quando alguém perguntar "onde é que este caso está parado?".

