> ## Documentation Index
> Fetch the complete documentation index at: https://docs.assessiq.digital/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Histórico de versões e mudanças do AssessIQ.

## v1.12.0 — Jun 2026

### 🔒 Segurança

* **Backup R2 criptografado**: arquivos de backup agora são criptografados com AES-256-GCM antes de serem enviados ao Cloudflare R2 — ilegíveis sem a `ENCRYPTION_KEY`
* **Backups sem criptografia rejeitados**: sistema não aceita mais fallback para backups em texto plano
* **CSRF bypass para rotas cron**: `/api/cron/*` usa `CRON_SECRET` como autenticação, sem necessidade de token CSRF

### ✨ Novas Funcionalidades

* **Audit Log completo com actor**: todas as ações de escrita (CRUD) registram o evento com nome, email, IP e dados alterados do usuário autor — visível em Admin → Logs
* **Backup abrangente**: backups automáticos agora incluem tabelas `Organization`, `FavoriteForm`, `Notification` e `UserNotificationPreference`
* **Retenção por data**: limpeza de backups antigos usa janela de 30 dias (não mais "manter 3 mais recentes")

### 🔧 Correções

* **GitHub Actions**: workflow de backup falhava com 403 (CSRF bloqueava o POST do cron)
* **Prisma 6.19**: `url`/`directUrl` migrados do `schema.prisma` para `prisma.config.ts` conforme nova API
* **Cards Visão Geral**: PerformanceOverview agora preenche todo o espaço do card pai corretamente
* **Falha de descriptografia**: agora registra warning em log (antes era silenciosa)

## v1.11.0 — Mai 2026

### ✨ Novas Funcionalidades

* **Página de Configurações Redesenhada**: Nova estrutura em abas — Geral, Segurança, Notificações, Privacidade e Admin — com navegação clara e separação de responsabilidades
* **Aba de Segurança**: Acesso rápido às configurações de senha e autenticação de dois fatores (2FA) diretamente das configurações
* **Email unificado**: `User.email` é agora a única fonte de verdade para o email de login — exibido consistentemente no menu do usuário, perfil e conta
* **Campo de email somente leitura**: O email de login não pode mais ser alterado pelo usuário diretamente; campo marcado como bloqueado com nota explicativa
* **Correções de TypeScript**: 137 erros de TypeScript corrigidos incluindo compatibilidade com Zod v4 (`z.record()`, `.issues`), parâmetros implícitos `any` em 26 arquivos
* **Módulo de métricas**: Novo `lib/metrics.ts` para rastreamento de interações de usuário e performance

### 🔧 Correções

* Corrigido carregamento das configurações de privacidade (nunca buscava da API ao abrir a página)
* Corrigido guard de administrador inconsistente nas configurações (agora unificado com `isSuperAdmin`)
* Corrigida exibição do email no dropdown do menu do usuário (usava `Teacher.email` em vez de `User.email`)
* Corrigida tipagem no analisador de JSON (`StructureAnalysis.allKeys`, `RootFieldInfo.value`)
* Corrigido acesso a propriedades aninhadas em `reports/export/route.ts` com `submission` tipado como `Record<string, unknown>`

## v1.10.0 — Abr 2026

### ✨ Novas Funcionalidades

* **Módulo de Cobranças (Mobile)**: Administradores agora podem exigir pagamento ao aplicar testes — suporte a PIX, cartão de crédito, boleto via Asaas e métodos externos (PIX externo, cartão)
* **Tela de Cobranças no App**: Nova tela `/assessments/payments` lista todas as cobranças da organização com estatísticas (pendentes, pagos, total arrecadado) e filtros por status
* **Ações de pagamento para admins**: Confirmar pagamento, isentar participante, cancelar cobrança e sincronizar status com Asaas diretamente do app mobile
* **Bloqueio de teste por pagamento**: Participante com cobrança pendente vê aviso e link de pagamento antes de iniciar o teste
* **Webhook Asaas**: `POST /api/webhooks/asaas` recebe notificações de pagamento e atualiza automaticamente o status das atribuições

### 🔌 Novos Endpoints (API Mobile)

* `GET /api/mobile/payments` — lista cobranças da organização com stats
* `GET /api/mobile/assignments/:id/payment` — status de pagamento de uma atribuição
* `POST /api/mobile/assignments/:id/payment` — cria cobrança (Asaas ou externa)
* `POST /api/mobile/assignments/:id/payment/confirm` — confirma pagamento manualmente
* `POST /api/mobile/assignments/:id/payment/exempt` — isenta participante do pagamento
* `POST /api/mobile/assignments/:id/payment/cancel` — cancela cobrança
* `POST /api/mobile/assignments/:id/payment/sync` — sincroniza status com Asaas

***

## v1.9.0 — Mar 2026

### 🔒 Segurança (Auditoria OWASP)

* **CSP expandido**: `script-src`, `style-src` e `connect-src` agora incluem domínios da Vercel (`vercel.live`, `*.vercel.live`) e Pusher (`*.pusher.com`) para eliminar bloqueios do toolbar de preview
* **Rate limiting fail-open**: quando o Redis está indisponível, requisições de autenticação são permitidas em vez de retornar 503 — evita bloqueio de logins legítimos por falha de infraestrutura
* **Tokens de redefinição de senha hasheados**: tokens de reset agora são armazenados como SHA-256 no banco (não mais em texto plano); expiração reduzida de 24h para 30 minutos
* **Rate limiting no `/api/users/forgot-password`**: proteção por IP e por e-mail contra ataques de enumeração
* **Validação do parâmetro `state` na API IBGE**: aceita apenas `[A-Z]{2}` para prevenir path injection
* **CSRF fail-safe**: `ensureCsrfCookie` e `validateCsrf` em `proxy.ts` agora são envolvidos em try-catch — ausência de `CSRF_SECRET` não causa crash em todas as requisições
* **`CORS Allow-Credentials`**: enviado apenas para origens confiáveis (flag `isTrustedOrigin`)
* **`unsafe-eval` condicional**: presente apenas em `NODE_ENV=development`
* **Remoção de log de `assignmentToken`**: bloco de debug que expunha token em texto plano foi removido de `/api/forms/[formId]/route.ts`

### 🗄️ Banco de Dados

* **`connect_timeout=30`** adicionado à URL do Prisma: suporta cold-start do Neon free tier (que pode demorar até 15s para acordar de suspend)
* **Cache do PrismaClient em produção**: `globalThis.prisma` agora é cacheado também em `NODE_ENV=production`, evitando nova conexão TCP a cada request em containers Lambda aquecidos

### 🐛 Correções

* **500 em `/api/auth/check-credentials`** no Vercel: removidas importações não utilizadas (`generateEmailCode`, `hashToken`, `sendEmailNotification`) que carregavam o módulo `notificationEmail.ts` com `new Resend(undefined)`, causando crash no bundle
* **`RESEND_API_KEY` undefined**: `new Resend(process.env.RESEND_API_KEY ?? '')` — SDK não lança mais exceção na inicialização do módulo quando a variável estiver ausente
* **Rate limiter módulo-level throw**: refatorado para lazy initialization — `REDIS_URL` ausente não causa 500 no import do módulo
* **`ENVIRONMENT_FALLBACK: timeZone`**: `NextIntlClientProvider` agora recebe `timeZone="America/Sao_Paulo"` explicitamente

***

## v1.8.0 — Mar 2026

### ✨ Novas Funcionalidades

* **Histórico de Notificações Enviadas**: Nova aba "Enviadas" no painel de Notificações exibe todas as notificações (e-mail e in-app) já entregues, com destinatário, canal, tipo e data de envio
* **Agendamentos visíveis para Admins**: ADMIN e SUPER\_ADMIN agora visualizam todos os agendamentos de testes na plataforma, independente de quem os criou

### 🔒 Controle de Acesso

* **Modelos de E-mail e Notificações restritos a SUPER\_ADMIN**: Itens "Modelos de E-mail" e "Notificações" no sidebar agora visíveis apenas para Super Administradores
* **Link de Administração em Configurações restrito a SUPER\_ADMIN**: A aba "Administração" na página de Configurações agora aparece apenas para Super Administradores

### 🐛 Correções

* **Nome do usuário não era salvo ao editar**: `PUT /api/users` passa a incluir o campo `name` no `updateData` e sincroniza o registro `Teacher` vinculado
* **Redirecionamento lento após criar usuário**: Removida chamada redundante `router.refresh()` após `router.push()`; adicionado `revalidatePath` na server action `createUserAction`
* **Listas desatualizadas após exclusão**: Adicionado `router.refresh()` após delete em Usuários, Professores e Alunos para recarregar dados do servidor
* **Duplo ícone X na barra de pesquisa**: Campo de busca no TopBar alterado de `type="search"` para `type="text"`, eliminando o X nativo do browser que aparecia junto ao X customizado
* **Validação de campos obrigatórios no agendamento de notificações**: Erros específicos por campo — Título sempre obrigatório; Mensagem obrigatória apenas para canais in-app/ambos; Assunto obrigatório apenas para canais e-mail/ambos
* **Chaves i18n ausentes**: Adicionadas `topbar.searchStudents`, `adminNotifications.sentNotificationsTitle`, `adminNotifications.noSentNotifications` em `pt.json` e `en.json`

***

## v1.7.0 — Fev 2026

### ✨ Melhorias de UI/UX

* **Campo de pesquisa padronizado**: Todas as páginas de listagem (Alunos, Modelos de Testes) agora utilizam o componente `Input` padrão da plataforma com ícone `Search`, garantindo consistência visual
* **Botão "Novo Agendamento"**: Movido para o `PageHeader`, seguindo o padrão já adotado em "Novo Aluno" e demais seções
* **Filtros alinhados**: Campos de busca e filtros de status na listagem de agendamentos agora estão lado a lado, alinhados à direita

### 🌐 Internacionalização (i18n)

* **Eliminadas ternárias de tradução manual** (`locale === "en" ? "..." : "..."`): Todos os textos de UI nos módulos de Agendamento (`ScheduleTestClient`, `edit/page.tsx`, `new/page.tsx`) e Aplicação de Testes (`ApplyTestClient`) agora usam `useTranslations()` / `getTranslations()` com chaves em `pt.json` e `en.json`
* **34 novas chaves de tradução** adicionadas em `scheduledTests.*` (rótulos de campos, validações, toasts, títulos de página) e `applyTest.openTest`

### 🐛 Correções

* **Erro de build JSX** (`Expected ',', got '{'`): Corrigida `div` extra fora de ordem em `ScheduledListClient.tsx` que causava falha no parse do Next.js/Turbopack

***

## v1.6.0 — Fev 2026

### 🎯 Novas Funcionalidades

* **Cancelamento de Agendamentos**: Testes agendados podem ser cancelados com justificativa obrigatória (mínimo 10 caracteres)
  * Novo campo `cancelledAt` e `cancellationReason` no modelo `TestAssignment`
  * Botão de cancelamento na listagem de agendamentos (`ScheduledListClient`)
  * Possibilidade de reativar testes cancelados
  * Filtro "cancelados" adicionado à interface de agendamentos
* **Preservação de Drafts**: Respostas parciais (drafts) agora são preservadas quando formulários são editados
  * Proteção contra deleção de respostas de drafts ao remover perguntas do formulário
  * Filtro automático de respostas de perguntas removidas ao carregar drafts
  * Endpoint `/api/assignments/[token]/draft` reativado com salvamento completo

### 🛠️ Scripts de Manutenção

* **Limpeza de Drafts Órfãos**: Novos scripts para manutenção do banco de dados
  * `pnpm cleanup:orphaned-drafts` — Remove respostas órfãs de drafts com 30+ dias
  * `pnpm cleanup:orphaned-drafts:dry-run` — Modo seguro para visualizar o que seria deletado
  * `pnpm cleanup:orphaned-drafts:90d` — Remove apenas drafts com 90+ dias
  * `pnpm draft:check <token>` — Verifica respostas salvas em draft para um token específico

### 🐛 Correções

* **Import de `isRedirectError`**: Corrigido import para usar `next/dist/client/components/redirect-error` (compatível com Next.js 16)
* **TypeScript**: Adicionado campo `formTitleSnapshot` à interface `Submission` em `ReportsClient`
* **Draft POST**: Reativado salvamento de drafts via API que estava desabilitado

### 📝 Documentação

* Todos os scripts do `package.json` agora possuem comentários explicativos na seção `_comments`
* Adicionado guia de teste em `scripts/test-draft-preservation.md`

***

## v1.5.0 — Fev 2026

### ✨ Melhorias

* **Settings — painel Admin**: Seção de Gerenciamento de Dados adicionada à aba *Admin* de `/settings`, com links diretos para:
  * Recuperação de Registros (`soft-delete-recovery`)
  * Estatísticas de Criptografia (`encryption-stats`)
  * Políticas de Retenção (`retention-policies`)
* **Internacionalização (i18n)**: Corrigidas chaves de tradução ausentes nas páginas de configurações para EN e PT, eliminando fallbacks em texto bruto no painel admin.

### 🐛 Correções

* **Hydration mismatch** (`AuthenticatedLayout`): Corrigido erro React de hidratação que ocorria quando o servidor renderizava o `AppShell` autenticado mas o cliente iniciava com `status: "loading"` (sessão ainda nula), gerando divergência de árvore DOM. O shell mínimo agora só é renderizado após a sessão ser confirmada como inativa (`status !== "loading" && !isSignedIn`).
* **Erro TypeError** `Cannot read properties of null (reading 'parentNode')`: Consequência direta do hydration mismatch acima — corrigido com a mesma solução.

### ⚡ Performance & Dependências

* **Removido Lottie / DotLottie**: Removidas as dependências `@lottiefiles/dotlottie-react`, `lottie-react` e `lottie-web` (≈ 700 KB de JS no bundle). Substituídas por:
  * `PageLoadingScreen` → spinner CSS puro (Tailwind `animate-spin`)
  * `SuccessAnimation` → SVG checkmark inline em círculo verde
  * `GreetingHeaderClient` → emojis nativos (☀️ / 🌤️ / 🌙)
* **Removido script `copy:wasm`**: O arquivo `dotlottie-player.wasm` não é mais necessário. O script `postinstall` foi simplificado para `prisma generate` apenas.
* **Removido `DotLottieConfig.tsx`**: Componente de configuração de WASM deletado e removido do layout raiz.

***

## v1.4.9 — Fev 2026

* Melhorias no seletor de faixas de pontuação na criação de testes
* Suporte a cidades brasileiras no cadastro de alunos e candidatos (`brazilianCities.ts`)
* Correções de layout na tela de candidatos
* Aprimoramento do componente `ImageCropper` para upload de avatares

***

## v1.4.8 — Jan 2026

* Adição do módulo de logs em tempo real via SSE (`RealTimeLogsViewer`)
* Templates de e-mail com suporte a variáveis dinâmicas Handlebars
* Página de estatísticas de criptografia (`encryption-stats`)
* Recuperação de soft-delete no painel admin
* Políticas de retenção de dados configuráveis

***

## v1.4.7 — Jan 2026

* Notificações agendadas com data/hora e cancelamento
* Preview ao vivo de templates de e-mail no editor
* Suporte a upload de HTML como template de notificação
* Melhoria no sistema de busca global (`GlobalSearch`)

***

## v1.4.6 — Dez 2025

* Suporte a organizações/unidades com planos (Free / Pro / Enterprise)
* Módulo de candidatos com promoção para aluno
* Auditoria de ações (`audit-logger.ts`)
* Integração com Microsoft Clarity para análise de usabilidade
