# Modelo de dados ```mermaid erDiagram workspaces ||--o| spreadsheet_adapter_settings : configura workspaces ||--o{ spreadsheet_models : possui workspaces ||--o{ spreadsheet_jobs : isola profiles ||--o{ spreadsheet_jobs : executa spreadsheet_models ||--o{ spreadsheet_jobs : orienta spreadsheet_jobs ||--o{ spreadsheet_job_sources : contem spreadsheet_job_sources ||--o{ spreadsheet_job_mappings : mapeia workspaces ||--o{ audit_log : audita ``` Migrations: `0001_platform_shim.sql`, `0002_spreadsheet_adapter.sql`, `0003_rls.sql`. Rollback do módulo: `migrations/down/0002_spreadsheet_adapter_down.sql`. Não remove tabelas de identidade do Elo Pro. ## Integridade - Nome lógico único entre modelos `active` por workspace - No máximo 10 modelos ativos e 10 fontes por job, também por trigger - Mapeamento único nos dois sentidos (`source_column` e `model_column`) - Job não referencia modelo de outro workspace - Conteúdo da planilha fica no storage, não em JSONB de linhas - `status = deleted` e `deleted_at` deixam a exclusão física reversível até a decisão de produto Colunas extras em fontes (`output_csv_key`, `output_xlsx_key`, `columns_schema`, `process_idempotency_key`) guardam metadados da saída temporária. O PDF é gerado na hora do download a partir do CSV privado.