# Referência: Funções Helper Comuns — Eventos de Formulário Fluig

Funções utilitárias reutilizáveis entre eventos de formulário. Todas em **ES5** (servidor Rhino).

## fnLimpaCaracteres(texto)

Remove caracteres que quebram o histórico ou causam problemas de serialização.

```javascript
function fnLimpaCaracteres(texto) {
    if (texto == null) return "";
    texto = replaceAll(texto, '#', '');
    texto = replaceAll(texto, '"', '');
    texto = replaceAll(texto, "'", "");
    texto = replaceAll(texto, '>', '');
    texto = replaceAll(texto, '<', '');
    return texto;
}
```

**Quando usar:** Sempre antes de gravar observações no histórico.

## replaceAll(texto, arg1, arg2)

Substitui TODAS as ocorrências de `arg1` por `arg2` (JS ES5 não tem `replaceAll` nativo).

```javascript
function replaceAll(texto, arg1, arg2) {
    while (texto.indexOf(arg1) != -1) {
        texto = texto.replace(arg1, arg2);
    }
    return texto;
}
```

## fnInverteData(aux)

Converte entre formato BR (`dd/mm/yyyy`) e EN (`yyyy-mm-dd`). Detecta automaticamente o formato de entrada.

```javascript
function fnInverteData(aux) {
    if (aux.indexOf('-') > 0) {
        aux = aux.split('-');
        return aux[2] + '/' + aux[1] + '/' + aux[0];
    } else if (aux.indexOf('/') > 0) {
        aux = aux.split('/');
        return aux[2] + '-' + aux[1] + '-' + aux[0];
    }
    return '';
}
```

**Quando usar:** Converter datas para formato EN antes de salvar (permite ordenação correta).

## fnBuscarDataHora(tipo)

Retorna data ou hora atual do servidor Java.

```javascript
function fnBuscarDataHora(tipo) {
    var agora = new java.util.Date();
    var formato;
    if (tipo == "data") {
        formato = new java.text.SimpleDateFormat("dd/MM/yyyy");
    } else {
        formato = new java.text.SimpleDateFormat("HH:mm");
    }
    return formato.format(agora);
}
```

**Parâmetros:** `"data"` → `dd/MM/yyyy` | `"hora"` → `HH:mm`

## fnReplaceNovaLinha(texto)

Converte quebras de linha em `<br>` para exibição em HTML (útil para textareas).

```javascript
function fnReplaceNovaLinha(texto) {
    if (texto == null) return "";
    texto = replaceAll(texto, '\n', '<br>');
    texto = replaceAll(texto, '\r', '');
    return texto;
}
```

## fnDescAtividade(numState)

Retorna descrição legível da atividade BPM. Deve ser customizada por processo.

```javascript
function fnDescAtividade(numState) {
    var map = {
        "4": "Abertura da Solicitação",
        "5": "Aprovação Gerencial",
        "6": "Área de Compras",
        "27": "Recebimento"
    };
    return map[numState.toString()] || "Atividade " + numState;
}
```

## constraintValue(constraints, campo)

Extrai valor de uma constraint específica pelo nome do campo.

```javascript
function constraintValue(constraints, campo) {
    if (constraints == null) return "";
    for (var i = 0; i < constraints.length; i++) {
        if (constraints[i].getFieldName().equals(campo)) {
            return constraints[i].getInitialValue();
        }
    }
    return "";
}
```

**Quando usar:** Em datasets customizados que recebem parâmetros via constraints.
