# Fase 3 — Extrair as Regras

Objetivo: traduzir cada fórmula, validação e dependência da planilha em uma **regra de aplicação** explícita. Nada do que a planilha faz hoje pode se perder no app.

## Sumário
- Taxonomia: fórmula de planilha → comportamento de app
- Como tratar cada categoria
- Validações de dados (listas suspensas)
- Formatação condicional
- Catálogo de regras (saída)

## Taxonomia — fórmula → app

O analisador já classifica cada fórmula em `categorias`. Use esta tabela pra traduzir:

| Categoria (Excel/Sheets) | O que é | Vira no app |
|---|---|---|
| **lookup** — PROCV, VLOOKUP, ÍNDICE+CORRESP, PROCX | Puxa um valor de outra tabela a partir de uma chave | **Relação entre tabelas** + auto-preenchimento. Ex.: escolheu o material → preço e foto vêm sozinhos |
| **condicional** — SE, SES, SEERRO, E, OU | Decisão de negócio | **Regra de negócio** (if/else no backend) ou validação. Ex.: `SE(total>1000;"aprovar gerente")` → fluxo de aprovação / badge |
| **agregacao** — SOMA, SOMASE, CONT.SE, MÉDIA, MÁX | Totaliza/conta um conjunto | **Campo calculado de resumo** ou métrica de dashboard |
| **texto** — CONCATENAR, TEXTO, ESQUERDA, EXT.TEXTO | Monta/formata strings | **Campo derivado** (ex.: código do pedido) ou formatação de exibição |
| **data** — HOJE, AGORA, DATADIF | Cálculo com datas | **Campo de data automático**, prazos, "dias em aberto" → gatilho de automação (Fase 5) |
| **outro** — aritmética pura (`=A2*B2`) | Cálculo direto | **Campo computado**. Ex.: `area = largura × altura` |

## Como tratar cada categoria

**lookup (o coração do "puxa automático"):** cada PROCV que aponta pra um catálogo vira:
1. uma relação no banco (chave estrangeira);
2. comportamento de UI: ao selecionar o item-chave, os campos dependentes preenchem sozinhos (preço, foto, descrição). É exatamente o "selecionei a cor e já puxou valor e imagem" que a pessoa descreve.

**condicional:** escreva a regra em português antes de codar: *"SE o total passar de R$ 1.000, marcar como 'precisa aprovação do gerente'."* Confirme limites/textos com a pessoa — eles podem estar desatualizados na planilha.

**campos computados:** marque o campo como **calculado** (read-only no formulário, recalculado pelo backend). Nunca deixe a pessoa digitar um valor que deveria ser calculado.

## Validações de dados (listas suspensas)

Cada item em `validacoes_dados` com `tipo: list` é um **campo de seleção**:
- Se a `formula1` aponta pra um intervalo de outra aba (`=Catalogo!$B$2:$B$5`) → o select é alimentado por aquela tabela (relação dinâmica).
- Se é uma lista fixa (`"Pendente,Pago,Cancelado"`) → vira um **enum** (status com opções fixas).

Validações numéricas/data (ex.: "valor ≥ 0", "data ≥ hoje") viram **regras de validação de formulário**.

## Formatação condicional

Cada regra em `formatacao_condicional` é um **estado visual**. Ex.: "linha fica vermelha quando atrasado" → no app vira **badge/cor de status**. Traduza a condição (geralmente a mesma lógica de um SE) e o significado visual.

## Catálogo de regras (saída para o BLUEPRINT.md)

```
## Fase 3 — Regras
| # | Origem (célula/aba) | Regra em português | Tipo no app |
|---|---|---|---|
| R1 | Orcamento!F2 PROCV | Ao escolher o material, puxar preço/m² e foto do Catálogo | Relação + auto-preenchimento |
| R2 | Orcamento!H2 SE | Se total > R$1.000 → "aprovar com gerente" | Regra de negócio + badge |
| R3 | Orcamento!E2 | Área = largura × altura | Campo computado |
| R4 | Validação B2:B100 | Material só pode ser um do Catálogo | Select dinâmico |
```

**Pontos a confirmar com a pessoa** (sempre liste): limites numéricos, textos de status, e qualquer fórmula que pareça "gambiarra" (referências quebradas, cálculos manuais). Feche com o **checkpoint**.
