# Referência: hAPI e Variáveis de Contexto do Workflow Fluig

## hAPI — API Principal de Workflow

Disponível em TODOS os eventos de processo (afterProcessCreate, afterTaskComplete, etc.).

### Campos do Formulário

```javascript
// Ler campo
var valor = hAPI.getCardValue("nomeCampo");

// Gravar campo
hAPI.setCardValue("nomeCampo", "valor");

// Obter todos os dados do card
var dados = hAPI.getCardData(parseInt(processId));
```

> **IMPORTANTE:** Em eventos de workflow, usar `hAPI.getCardValue/setCardValue`.
> Em eventos de formulário (inputFields, validateForm), usar `form.getValue/setValue`.

### Anexos

```javascript
// Listar anexos
var anexos = hAPI.listAttachments();
var totalAnexos = anexos.size();

// Anexar documento existente
hAPI.attachDocument(documentId);
```

### Prazos

```javascript
// Definir prazo para uma tarefa
hAPI.setDueDate(processId, sequenceId, colleagueId, dueDate, secondsInDay);

// Calcular prazo em horas
var prazoFinal = hAPI.calculateDeadLineHours(
    dataInicial,    // Data de referência
    segundos,       // Segundos desde meia-noite
    horas,          // Horas de prazo
    calendario      // Nome do calendário do Fluig
);
```

### Sub-processos

```javascript
hAPI.startProcess(
    processId,        // ID do processo a iniciar
    atividade,        // Atividade inicial
    listaUsuarios,    // ArrayList de logins
    observacao,       // Observação
    completarTarefa,  // Boolean
    dados,            // HashMap com dados
    anexar,           // Boolean
    modoDigital       // Boolean
);
```

## Variáveis de Contexto (getValue)

Disponíveis via `getValue("WK...")` em eventos de workflow e formulário.

| Variável | Tipo | Descrição |
|---|---|---|
| `WKNumState` | number | Número da atividade atual |
| `WKCurrentState` | number | Estado atual do processo |
| `WKNextState` | number | Próxima atividade |
| `WKNumProces` | string | Número da solicitação (= processId) |
| `WKUser` | string | Login do usuário logado |
| `WKDef` | string | Código do processo (ex: "WF-0041") |
| `WKVersDef` | number | Versão do processo |
| `WKMobile` | boolean | Se está acessando via mobile |
| `WKIsService` | boolean | Se é chamada de serviço (API) |
| `WKReplacement` | string | Se é substituto de outro usuário |

## Email via Notifier

```javascript
// Dentro de qualquer evento de workflow
var remetente = getValue("WKUser");
var url = fluigAPI.getPageService().getServerURL();

// Montar parâmetros do template
var parametros = new java.util.HashMap();
parametros.put("processo", processId);
parametros.put("subject", "Assunto do email");
parametros.put("tituloEmail", "Título");
parametros.put("conteudo", "Corpo do email");
parametros.put("link", '<a href="' + url + '/portal/p/1/pageworkflowview?app_ecm_workflowview_detailsProcessInstanceID=' + processId + '">' + processId + '</a>');

// Definir destinatários
var destinatarios = new java.util.ArrayList();
destinatarios.add("login.destinatario");

// Enviar
notifier.notify(remetente, "TEMPLATE_EMAIL", parametros, destinatarios, "text/html");
```

## Loading (feedback visual)

```javascript
loading.setMessage("Processando...");
```

## Mapa de Eventos por Momento

| Momento | Evento | API |
|---|---|---|
| Processo criado | `afterProcessCreate(processId)` | hAPI |
| Tarefa atribuída | `afterTaskCreate(colleagueId)` | hAPI |
| Antes de salvar | `beforeTaskSave(colleagueId, nextSequenceId, userList)` | hAPI |
| Após salvar | `afterTaskSave(colleagueId, nextSequenceId, userList)` | hAPI |
| Antes de completar | `beforeTaskComplete(colleagueId, nextSequenceId, userList)` | hAPI |
| Após completar | `afterTaskComplete(colleagueId, nextSequenceId, userList)` | hAPI |
| Processo finalizado | `afterProcessFinish(processId)` | hAPI |
| Processo cancelado | `afterCancelProcess(colleagueId, processId)` | hAPI |
| Analytics | `beforeSendData(customFields, customFacts)` | hAPI |
| Consenso | `calculateAgreement(currentState, agreementData)` | hAPI |
