Files
camilafagundesandCursor 6e23f1533b Implementa o MVP do Adaptador de Planilhas no Elo Pro.
O módulo usa a identidade Supabase, isola cada workspace e registra storage, TTL, runner e biblioteca XLSX como decisões ainda abertas.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 23:02:00 -03:00

186 lines
8.7 KiB
Markdown

# MASTER CONTEXT — Adaptador de Planilhas Elo Pro
Use este contexto em **todas** as etapas de implementação.
## Papel do agente
Você está implementando um módulo de produção dentro do ecossistema Elo Pro. Trabalhe como engenheiro sênior full-stack. Antes de alterar código, inspecione padrões existentes no repositório e reutilize-os. Não crie subsistemas paralelos de autenticação, autorização, design system, auditoria, observabilidade, feature flags ou acesso ao Supabase quando já houver equivalentes.
## Objetivo do produto
O Adaptador recebe planilhas de origens diferentes, valida sua estrutura, mapeia colunas manualmente para um modelo padronizado, mostra uma prévia do resultado e gera um novo arquivo consolidado sem alterar o modelo original.
Fluxo principal:
`Elo Pro autenticado -> Adaptador -> selecionar modelo -> carregar fonte(s) -> selecionar aba/cabeçalho quando necessário -> validar -> mapear -> revisar -> processar -> acompanhar progresso -> baixar -> continuar com outra fonte ou encerrar`.
## Identidade e login — regra inegociável
- O Adaptador **NÃO possui login próprio**.
- O Adaptador **NÃO possui cadastro de senha, hash de senha, refresh token proprietário ou tabela própria de usuários**.
- Use o mesmo **Supabase Auth** do Elo Pro.
- Use o mesmo `auth.users`, `profiles`, `workspace_members`, clientes Supabase SSR/server/browser e fluxo de logout já existentes.
- Ao entrar no módulo, valide sessão, workspace ativo, membership e habilitação do módulo.
- Ausência de sessão deve seguir o fluxo central de autenticação Elo Pro.
- Logout encerra a sessão Elo Pro.
- A meta é uma identidade/uma senha para vários apps do ecossistema. Não copie usuários entre bancos e não crie credenciais duplicadas.
## Tenant e autorização
- Tenant técnico: `workspace_id`.
- Toda persistência do módulo deve ser isolada por workspace.
- RLS é obrigatória quando aplicável.
- Não aceite `workspace_id` do cliente como verdade. Derive/valide no servidor conforme padrão Elo Pro.
- Papéis operacionais: `owner`, `admin`, `gestor`, `agent` conforme modelo existente.
- `owner/admin`: gestão de modelos e configurações.
- `gestor/agent`: fluxo operacional. Upload de modelo só se configuração específica permitir.
- `superadmin`: permanece mecanismo de plataforma já existente, auditado; não crie modo especial dentro do Adaptador.
- Segurança deve existir no servidor/banco. Esconder botão no frontend é apenas UX.
## Regras de negócio do MVP
- Até 10 modelos ativos por workspace.
- Nome lógico de modelo único dentro do workspace; sem versionamento automático no MVP.
- Entradas suportadas: XLSX e CSV.
- XLS, ODS e XML ficam fora do MVP.
- Fonte: até 10 MB e 50.000 linhas úteis por arquivo.
- Até 10 fontes por operação/jornada.
- XLSX pode ter múltiplas abas, mas exatamente uma aba é selecionada/processada por fonte em cada execução.
- Permitir seleção da linha de cabeçalho quando necessário.
- Toda coluna utilizada precisa ter cabeçalho identificável.
- Detectar inconsistências relevantes de tipo por coluna e impedir processamento inválido; não corrigir automaticamente.
- Mapeamento manual 1:1: uma coluna fonte -> no máximo uma coluna modelo e vice-versa.
- Todas as colunas obrigatórias do modelo devem estar mapeadas.
- Mapeamento não vira template reutilizável no MVP.
- Deve existir etapa de pré-visualização antes do processamento.
- Uma operação do usuário não executa duas transferências concorrentes.
- Modelo persistido é imutável durante transformação. Saída é sempre novo artefato.
- Modelos são persistentes. Fontes e saídas são temporárias, sujeitas a TTL.
- Exclusão de modelo exige confirmação, só `owner/admin`, e é bloqueada se houver processamento ativo usando o modelo.
- Configuração por workspace pode permitir/bloquear upload de modelo por perfis não administrativos. Isso não concede exclusão/gestão geral.
- Auditar upload/exclusão de modelo, alteração de configuração, início/fim/erro de processamento e downloads relevantes, sem registrar conteúdo de células.
- Sem fórmulas, normalização semântica, conversão de moeda/data, enriquecimento ou junção simultânea de fontes no MVP.
## Stack obrigatória
Frontend:
- Next.js 16, App Router
- React 19
- TypeScript 5
- Tailwind CSS v4
- Lucide React
- `@dnd-kit` para drag and drop acessível
- TanStack Query v5 para estado remoto/cache
- `@react-pdf/renderer` para PDF
Backend/infra:
- Supabase Auth + PostgreSQL com `@supabase/supabase-js` e `@supabase/ssr`
- Redis via `ioredis`
- Sentry client/server/edge
- `postgres` + `tsx` para migrations/ETL onde esse for o padrão do repositório
IA:
- `@anthropic-ai/sdk` pode existir na stack, mas **não participa do caminho crítico do MVP**.
Qualidade:
- Vitest
- ESLint 9
- typecheck estrito conforme padrão do monorepo/repo
## UX/UI — EloPro Design System Global V2.1
O Adaptador não cria Design System próprio.
- Interface predominantemente clara.
- Cloud White `#FBFBFE`: base.
- Midnight Ink `#071B45`: texto/estrutura.
- Action/Primary Blue: ações principais conforme token oficial do repo.
- Bright Blue `#2F8FFF`: foco/hover/ativos quando previsto.
- Aqua Signal `#00C2A8`: sucesso, continuidade e progresso.
- Warning `#F39A2D`.
- Error `#E63946`, sempre com texto/ícone; nunca cor isolada.
- Tipografia operacional: Manrope.
- Espaçamento base: 4px.
- Reutilize componentes oficiais: Button, IconButton, Card/OpenFramePanel, Input, Select, Checkbox, Radio, Switch, Dialog, Toast, Tooltip, Tabs/CapsuleTabs, SemanticMarker, JourneyTrail quando semanticamente adequado.
- Lucide React para ícones.
- Drag-and-drop precisa ter alternativa via teclado/select.
- Estados obrigatórios: loading/skeleton, empty, disabled, error recuperável e success.
- Não use fluxogramas antigos como referência visual; eles são referência funcional.
## Modelo de dados proposto
Adapte nomes/convenções ao repo, mantendo semântica:
- `spreadsheet_adapter_settings`
- `workspace_id` PK/FK
- `allow_non_admin_model_upload`
- timestamps
- `spreadsheet_models`
- `id`, `workspace_id`, `name`, `original_filename`, `format`, `storage_key`
- `sheet_name`, `header_row`, `columns_schema jsonb`
- `created_by`, `created_at`, `status`
- `spreadsheet_jobs`
- `id`, `workspace_id`, `user_id`, `model_id`, `status`
- `source_count`, `current_source`, `output_format`, `progress`
- `error_code`, `started_at`, `finished_at`, `created_at`
- `spreadsheet_job_sources`
- `id`, `job_id`, `source_name`, `temp_storage_key`
- `selected_sheet`, `header_row`, `row_count`, `size_bytes`, `status`, `expires_at`
- `spreadsheet_job_mappings`
- `id`, `job_source_id`, `source_column`, `model_column`, `is_required`, `position`
- Reuse `audit_log` existente quando compatível.
## Rotas sugeridas
Adapte ao padrão existente do Elo Pro:
- `GET /api/spreadsheet-adapter/models`
- `POST /api/spreadsheet-adapter/models`
- `DELETE /api/spreadsheet-adapter/models/:id`
- `GET/PATCH /api/spreadsheet-adapter/settings`
- `POST /api/spreadsheet-adapter/sources/validate`
- `POST /api/spreadsheet-adapter/jobs`
- `GET /api/spreadsheet-adapter/jobs/:id`
- `POST /api/spreadsheet-adapter/jobs/:id/process`
- `GET /api/spreadsheet-adapter/jobs/:id/download?format=xlsx|csv|pdf`
Server Actions podem substituir rotas quando o padrão Elo Pro indicar, desde que contratos de segurança, teste e idempotência permaneçam claros.
## Pendências que NÃO devem ser inventadas
Se o repo não trouxer uma decisão, pare e documente a alternativa recomendada em vez de “decidir silenciosamente”:
1. Object storage definitivo: Supabase Storage privado ou equivalente S3.
2. Topologia de login único entre hosts/domínios.
3. Job runner durável para processamentos que possam exceder request timeout.
4. TTL exato de fontes/saídas temporárias.
5. Biblioteca XLSX de produção (licença, segurança, manutenção, preservação de formatação).
6. Exclusão física vs soft delete de modelos.
## Segurança mínima
- RLS e checagem server-side contra IDOR.
- Validar extensão, MIME e assinatura/estrutura do arquivo.
- Proteger contra path traversal e nomes maliciosos.
- Tratar CSV injection em exportações quando relevante.
- Nunca logar conteúdo de célula no Sentry/audit log.
- Não enviar planilha ao Anthropic no MVP.
- Storage privado; download somente após autorização.
- Sanitizar nomes e metadados exibidos.
## Definição de pronto geral
Uma etapa só está concluída quando:
- implementação segue padrões existentes do Elo Pro;
- lint/typecheck passam;
- testes da etapa passam;
- segurança de workspace/permissões foi coberta;
- estados de UX relevantes existem;
- nenhuma nova autenticação paralela foi criada;
- mudanças e decisões abertas estão documentadas.