> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://ajuda.groner.app/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Condicionais em Modelos em HTML

# Condicionais em Templates

As **Condicionais** permitem que uma mesma mensagem mude de acordo com os dados do cliente, do projeto ou da [venda](https://ajuda.groner.app/pt-br/article/o-que-e-uma-venda-na-groner-1s0sqzj/?ref=groner-suporte). Em vez de criar várias mensagens diferentes para cada situação, você cria uma única mensagem inteligente que se adapta sozinha.

## Início rápido

Um exemplo completo, com tudo o que você precisa saber em 30 segundos:

```
Olá, [[nome_cliente]]!

{{if [[status_projeto]] == 'Aprovado'}}
Seu projeto foi aprovado e está pronto para a próxima etapa.
{{else}}
Estamos analisando seu projeto e em breve traremos novidades.
{{endif}}

{{if [[telefone_contato]] IsNotEmpty}}
Caso prefira, retornamos pelo número [[telefone_contato]].
{{endif}}
```

Tudo o que está em **`{{if}} ... {{endif}}`** só aparece se a condição for verdadeira. O **`{{else}}`** é opcional e define o que mostrar quando a condição for falsa.

---

## Sintaxe básica

A estrutura sempre segue este formato:

```
{{if CONDIÇÃO}}
Texto exibido quando a condição é verdadeira
{{else}}
Texto exibido quando a condição é falsa
{{endif}}
```

A parte do `{{else}}` é opcional. Sem ela, se a condição for falsa, simplesmente nada é exibido naquele lugar.

### Sem else (mais comum)

```
{{if [[nome]] IsNotEmpty}}
Olá, [[nome]]!
{{endif}}
```

### Com else

```
{{if [[nome]] IsNotEmpty}}
Olá, [[nome]]!
{{else}}
Olá!
{{endif}}
```

---

## Como funciona

1. O sistema procura blocos no formato `{{if ... }} ... {{endif}}` dentro da mensagem.
2. Avalia a condição.
3. Substitui o bloco inteiro pelo texto da parte correspondente (`if` ou `else`).
4. Tudo o que estiver fora da condicional permanece inalterado.

> Comparações de texto **não diferenciam maiúsculas de minúsculas**. `'Aprovado'` é tratado como igual a `'aprovado'` ou `'APROVADO'`.

---

## Variáveis no template

[Variáveis](https://ajuda.groner.app/pt-br/article/o-que-sao-variaveis-19g45cs/?ref=groner-suporte) aparecem entre colchetes duplos: `[[nome_da_variavel]]`. Elas podem ser usadas em três lugares:

**Dentro da condição:**
```
{{if [[status_projeto]] == 'Aprovado'}}
```

**Dentro do conteúdo exibido:**
```
{{if [[nome]] IsNotEmpty}}
Bem-vindo, [[nome]]! Seu protocolo é [[protocolo]].
{{endif}}
```

**Comparando duas variáveis entre si:**
```
{{if [[valor_pago]] >= [[valor_total]]}}
Pagamento quitado.
{{else}}
Ainda há saldo em aberto.
{{endif}}
```

---

## Operadores de comparação

### Igualdade e diferença

| Operador | Significado |
| --- | --- |
| `==` | É igual a |
| `!=` | É diferente de |

Funcionam tanto para texto quanto para números.

```
{{if [[status_projeto]] == 'Aprovado'}}
Seu projeto foi aprovado! 🎉
{{endif}}
```

```
{{if [[forma_pagamento]] != 'Boleto'}}
Pagamento confirmado automaticamente.
{{endif}}
```

> Strings podem usar aspas simples `'texto'` ou aspas duplas `"texto"`. Os dois funcionam.

### Comparação numérica

| Operador | Significado |
| --- | --- |
| `>` | Maior que |
| `<` | Menor que |
| `>=` | Maior ou igual a |
| `<=` | Menor ou igual a |

```
{{if [[potencia_kwp]] >= 10}}
Sua usina é classificada como **média**.
{{else}}
Sua usina é classificada como **micro**.
{{endif}}
```

```
{{if [[valor_total]] > 50000}}
Você tem direito ao desconto VIP!
{{endif}}
```

> Números aceitam tanto o formato brasileiro (`1.234,56`) quanto o internacional (`1234.56`). Se algum dos lados não for um número válido, a comparação volta a ser feita como texto (ordem alfabética). Por isso, sempre garanta que o campo realmente contém um número antes de usar `>`, `<`, `>=` ou `<=`.

---

## Operadores de texto

| Operador | Significado |
| --- | --- |
| `Contains` | Contém o texto informado |
| `Not Contains` | NÃO contém o texto informado |
| `StartsWith` | Começa com o texto informado |
| `EndsWith` | Termina com o texto informado |

```
{{if [[email]] Contains '@gmail.com'}}
Detectamos que você usa Gmail.
{{endif}}
```

```
{{if [[telefone]] StartsWith '+55'}}
Cliente nacional confirmado.
{{endif}}
```

```
{{if [[observacoes]] Not Contains 'urgente'}}
Atendimento será feito em até 48h.
{{else}}
Atendimento prioritário acionado!
{{endif}}
```

```
{{if [[arquivo]] EndsWith '.pdf'}}
Documento em PDF recebido com sucesso.
{{endif}}
```

---

## Verificação de preenchimento

| Operador | Significado |
| --- | --- |
| `IsEmpty` | Está vazio ou não foi preenchido |
| `IsNotEmpty` | Tem algum valor preenchido |

São extremamente úteis para evitar mensagens com lacunas em branco.

```
{{if [[nome_cliente]] IsNotEmpty}}
Olá, [[nome_cliente]]!
{{else}}
Olá!
{{endif}}
```

```
{{if [[data_instalacao]] IsEmpty}}
Ainda estamos agendando sua instalação. Em breve entraremos em contato.
{{else}}
Sua instalação está agendada para [[data_instalacao]].
{{endif}}
```

> Quando uma variável não tem valor preenchido (e o sistema não consegue substituir), ela é considerada "vazia" para efeitos do `IsEmpty`. Isso evita que o cliente receba mensagens com placeholders soltos no meio do texto.

---

## Combinando condições com AND, OR e NOT

Quando uma única condição não basta, você pode combinar várias usando os operadores lógicos `AND`, `OR` e `NOT`.

### AND — todas as condições devem ser verdadeiras

```
{{if [[status]] == 'Aprovado' AND [[valor_total]] > 10000}}
Projeto aprovado e elegível para financiamento.
{{endif}}
```

### OR — basta uma das condições ser verdadeira

```
{{if [[email]] IsEmpty OR [[telefone]] IsEmpty}}
Por favor, complete seu cadastro com email e telefone.
{{endif}}
```

### NOT — inverte o resultado

```
{{if NOT [[observacoes]] Contains 'cancelar'}}
Vamos prosseguir com a instalação.
{{endif}}
```

### Parênteses para agrupar

Quando precisa misturar AND com OR, use parênteses para deixar claro o que combina com o quê:

```
{{if ([[status]] == 'Aprovado' OR [[status]] == 'EmAnalise') AND [[valor]] > 1000}}
Seu projeto se enquadra no atendimento prioritário.
{{endif}}
```

> **Ordem de precedência (do mais "forte" para o mais "fraco"):** `NOT` → `AND` → `OR`. Quando misturar os três sem parênteses, `NOT` é avaliado primeiro, depois `AND`, depois `OR`. Em caso de dúvida, use parênteses — eles deixam a intenção explícita.

---

## Condicionais aninhadas

É possível colocar uma condicional **dentro** de outra para criar lógicas mais ricas:

```
{{if [[tipo_cliente]] == 'PJ'}}
  {{if [[faturamento_anual]] > 1000000}}
  Você se enquadra como cliente Enterprise.
  {{else}}
  Você se enquadra como cliente Business.
  {{endif}}
{{else}}
Você se enquadra como cliente Residencial.
{{endif}}
```

Cada `{{if}}` precisa ter o seu `{{endif}}` correspondente. A indentação é só para leitura — não afeta o resultado.

> Em muitos casos, é mais limpo usar AND/OR/NOT do que aninhar várias condicionais. Prefira aninhamento apenas quando os ramos têm conteúdos bem diferentes entre si.

---

## Receitas prontas

### Saudação por etapa do projeto

```
Olá, [[nome_cliente]]!

{{if [[etapa]] == 'Homologacao'}}
Seu projeto está em fase de homologação na concessionária. O prazo médio é de 30 dias.
{{endif}}

{{if [[etapa]] == 'Instalacao'}}
Sua instalação está marcada para [[data_instalacao]]. A equipe chegará entre 8h e 12h.
{{endif}}

{{if [[etapa]] == 'Concluido'}}
Parabéns! Sua usina já está gerando energia.
{{endif}}
```

### Confirmação de pagamento condicional

```
Recebemos seu pagamento de R$ [[valor_pago]].

{{if [[valor_pago]] >= [[valor_total]]}}
Pagamento quitado integralmente. Obrigado!
{{else}}
Saldo restante: R$ [[saldo_devedor]].
Pague pelo link: [[link_pagamento]]
{{endif}}
```

### Mensagem só para clientes com canal de contato preenchido

```
Olá!

{{if [[telefone_contato]] IsNotEmpty AND [[email]] IsNotEmpty}}
Podemos retornar pelo telefone [[telefone_contato]] ou pelo email [[email]].
{{else}}
  {{if [[telefone_contato]] IsNotEmpty}}
  Caso prefira, retornamos pelo telefone [[telefone_contato]].
  {{endif}}
  {{if [[email]] IsNotEmpty}}
  Caso prefira, retornamos pelo email [[email]].
  {{endif}}
{{endif}}
```

### Detecção de cliente corporativo

```
{{if [[email]] Contains '@' AND NOT ([[email]] Contains '@gmail.com' OR [[email]] Contains '@hotmail.com' OR [[email]] Contains '@outlook.com')}}
Detectamos que você é cliente corporativo. Você terá atendimento dedicado.
{{else}}
Atendimento residencial padrão acionado.
{{endif}}
```

### Filtro por porte da usina

```
{{if [[potencia_kwp]] < 5}}
Sua usina é micro residencial.
{{endif}}

{{if [[potencia_kwp]] >= 5 AND [[potencia_kwp]] < 75}}
Sua usina é mini residencial/comercial.
{{endif}}

{{if [[potencia_kwp]] >= 75}}
Sua usina é de grande porte. Atendimento técnico especializado disponível.
{{endif}}
```

### Validação de cadastro completo

```
{{if [[nome]] IsEmpty OR [[cpf]] IsEmpty OR [[endereco]] IsEmpty}}
⚠️ Seu cadastro está incompleto. Faltam dados básicos. Acesse o portal para completar.
{{else}}
✅ Cadastro completo. Você está pronto para avançar.
{{endif}}
```

---

## Como saber se está funcionando

Quando uma condicional não funciona como esperado, na maioria das vezes uma destas situações aconteceu:

1. **A condição era inválida e foi tratada como falsa.** Quando o sistema não consegue interpretar a condição (por erro de digitação, aspas faltando, operador errado), ele assume que a condição é falsa e exibe o conteúdo do `{{else}}` (ou nada, se não houver else).
2. **A variável não tinha valor.** Se `[[campo]]` não foi substituído por nenhum dado real, ele entra na comparação como vazio. Isso afeta `==`, `!=` e até as comparações numéricas.
3. **Comparou texto como número.** Se o campo for texto (ex.: `"Aprovado"`) e você usar `>` ou `<`, a comparação será alfabética e provavelmente não vai dar o resultado esperado.

**Para depurar,** crie uma versão de teste da mensagem dividindo a condição em pedaços. Por exemplo, em vez de:

```
{{if [[status]] == 'Aprovado' AND [[valor]] > 1000}}OK{{endif}}
```

Faça um teste isolado:

```
Status: [[status]]
Valor: [[valor]]
{{if [[status]] == 'Aprovado'}}Status bate{{else}}Status não bate{{endif}}
{{if [[valor]] > 1000}}Valor bate{{else}}Valor não bate{{endif}}
```

Assim você descobre rapidamente qual lado da condição está falhando.

---

## Dicas e boas práticas

* **Sempre use&#32;`IsNotEmpty`&#32;antes de exibir uma variável opcional**, para evitar mensagens com lacunas em branco.
* **Prefira&#32;`==`&#32;e&#32;`!=`** para comparar status fixos (ex.: `'Aprovado'`, `'Pendente'`, `'Cancelado'`).
* **Use&#32;`Contains`** quando o conteúdo do campo pode variar mas você quer detectar uma palavra-chave (ex.: detectar `@gmail.com` em um email).
* **Mantenha a indentação** quando usar condicionais aninhadas — facilita a leitura e a manutenção.
* **Use parênteses** sempre que misturar AND com OR. Não custa nada e evita confusão.
* **Sempre coloque valores de texto entre aspas.** `[[status]] == Aprovado` não funciona; `[[status]] == 'Aprovado'` sim.

---

## Erros comuns

### Esquecer o `{{endif}}`

```
❌ Errado:
{{if [[nome]] IsNotEmpty}}
Olá, [[nome]]

✅ Certo:
{{if [[nome]] IsNotEmpty}}
Olá, [[nome]]
{{endif}}
```

### Esquecer as aspas em valores de texto

```
❌ Errado:
{{if [[status]] == Aprovado}}

✅ Certo:
{{if [[status]] == 'Aprovado'}}
```

### Usar `>` ou `<` com texto

```
❌ Pode dar resultado inesperado:
{{if [[status]] > 'Aprovado'}}

✅ Use == ou !=:
{{if [[status]] == 'Aprovado'}}
```

### Espaços no operador `Not Contains`

Use exatamente `Not Contains` (com espaço entre as palavras). Outras grafias não funcionam.

### `else` sem `if`

`{{else}}` só funciona dentro de um bloco `{{if}}...{{endif}}`. Não pode aparecer sozinho.

### Confundir AND/OR sem parênteses

```
❌ Pode dar resultado inesperado:
{{if [[a]] == 'x' OR [[b]] == 'y' AND [[c]] == 'z'}}

✅ Use parênteses para deixar claro:
{{if ([[a]] == 'x' OR [[b]] == 'y') AND [[c]] == 'z'}}
ou
{{if [[a]] == 'x' OR ([[b]] == 'y' AND [[c]] == 'z')}}
```

---

## Tabela de referência rápida

### Operadores de comparação

| Operador | Tipo | Exemplo |
| --- | --- | --- |
| `==` | Igualdade | `[[status]] == 'Aprovado'` |
| `!=` | Diferença | `[[status]] != 'Cancelado'` |
| `>` | Maior que | `[[potencia]] > 10` |
| `<` | Menor que | `[[potencia]] < 5` |
| `>=` | Maior ou igual | `[[valor]] >= 1000` |
| `<=` | Menor ou igual | `[[valor]] <= 500` |
| `Contains` | Contém texto | `[[email]] Contains '@gmail.com'` |
| `Not Contains` | Não contém texto | `[[obs]] Not Contains 'urgente'` |
| `StartsWith` | Começa com | `[[telefone]] StartsWith '+55'` |
| `EndsWith` | Termina com | `[[arquivo]] EndsWith '.pdf'` |
| `IsEmpty` | Está vazio | `[[data_instalacao]] IsEmpty` |
| `IsNotEmpty` | Está preenchido | `[[nome]] IsNotEmpty` |

### Operadores lógicos

| Operador | Significado | Exemplo |
| --- | --- | --- |
| `AND` | Todas as condições devem ser verdadeiras | `[[a]] == 'x' AND [[b]] > 10` |
| `OR` | Pelo menos uma condição deve ser verdadeira | `[[a]] IsEmpty OR [[b]] IsEmpty` |
| `NOT` | Inverte o resultado | `NOT [[obs]] Contains 'spam'` |
| `( )` | Agrupa para definir prioridade | `([[a]] == 'x' OR [[a]] == 'y') AND [[b]] > 0` |

### Estrutura de delimitadores

| Marcação | [Função](https://ajuda.groner.app/pt-br/article/o-que-sao-funcoes-ye23se/?ref=groner-suporte) |
| --- | --- |
| `{{if ...}}` | Inicia o bloco condicional |
| `{{else}}` | Define o conteúdo alternativo (opcional) |
| `{{endif}}` | Encerra o bloco condicional (obrigatório) |
| `[[variavel]]` | Marca uma variável que será substituída |
| `'texto'` | Define um valor de texto fixo na comparação |

---

Em caso de dúvidas, entre em contato com o suporte.