# COMANDO — aplicação do ecossistema

Aplicação web PT-PT com 27 páginas, 10 variantes A/B, diagnóstico educativo 4C, captação persistente, consentimentos separados, SEO, estados protegidos e checkout Stripe fechado por configuração.

## Estado seguro por defeito

- `CHECKOUT_OPEN` não definido: a venda permanece fechada.
- Sem IDs de publicidade: nenhum pixel publicitário é carregado.
- Sem sessão assinada: confirmação, bilhete, QR e hub não são expostos.
- O diagnóstico calcula no dispositivo e não guarda respostas.
- A captação de leads usa D1 e regista consentimentos e atribuição.

## Validação

```bash
npm run lint
npm test
```

O teste executa o build de produção e valida contagens, gates, diagnóstico, consentimentos, atribuição e webhook.

## Variáveis de comércio

Só configurar depois da aprovação jurídica, fiscal e operacional:

```text
CHECKOUT_OPEN=true
PUBLIC_BASE_URL=https://dominio-confirmado.pt
NEXT_PUBLIC_SITE_URL=https://dominio-confirmado.pt
STRIPE_SECRET_KEY=secret
STRIPE_WEBHOOK_SECRET=secret
STRIPE_PRICE_ESSENCIAL=price_...
STRIPE_PRICE_PREMIUM=price_...
STRIPE_PRICE_VIP=price_...
STRIPE_AMOUNT_ESSENCIAL_CENTS=14700
STRIPE_AMOUNT_PREMIUM_CENTS=39700
STRIPE_AMOUNT_VIP_CENTS=89700
STRIPE_CURRENCY=eur
```

Os montantes acima são apenas exemplo de formato e não devem ser ativados sem a oferta aprovada. O endpoint cria a sessão com preços definidos no Stripe, nunca com montantes recebidos do browser. O webhook volta a consultar os line items na Stripe e reconcilia price ID, tier, quantidade, montante, moeda e referência pública antes de gravar a ordem; o evento só é marcado como processado depois dessa reconciliação. A página `/confirmacao` consulta a Stripe e a ordem server-side e não emite confirmação por simples visita. MB WAY, cartão e wallets dependem dos meios realmente ativados na conta e no país; a interface não os promete antes disso.

O hub `/participante` continua a exigir autenticação própria. Um `session_id` de checkout não é tratado como credencial permanente de participante.

## Migrações

As migrações em `drizzle/` são acumulativas. Nunca editar migrações já aplicadas. A publicação no Sites aplica as novas migrações ao binding `DB`.

## Conteúdo

`data/routes.json` é a fonte de verdade das 27 páginas e 10 variantes. Qualquer alteração deve preservar o validador e os gates de prova, Event schema, checkout e Purchase.

## Comandos

- `npm run lint` — valida TypeScript/React.
- `npm test` — build de produção + testes da aplicação.
- `npm run db:generate` — cria uma nova migração sem alterar as anteriores.
- O ciclo de publicação do Sites aplica o build e as migrações.
