# SteelBook - Arquitetura Técnica Completa ## 📋 Índice 1. [Visão Geral](#visão-geral) 2. [Arquitetura do Sistema](#arquitetura-do-sistema) 3. [Banco de Dados](#banco-de-dados) 4. [Fluxo de Dados](#fluxo-de-dados) 5. [Componentes Principais](#componentes-principais) 6. [Autenticação e Segurança](#autenticação-e-segurança) --- ## Visão Geral **SteelBook** é uma aplicação web moderna para gerenciamento de Databooks técnicos. Permite criar, organizar e gerar documentação completa com suporte a múltiplos formatos, categorização inteligente e integração com IA. **Stack Tecnológico:** - **Frontend:** React 18 + TypeScript + Vite - **Styling:** Tailwind CSS - **Backend:** Supabase (PostgreSQL + Auth) - **State Management:** TanStack Query (React Query) - **UI Components:** Lucide Icons --- ## Arquitetura do Sistema ``` ┌─────────────────────────────────────────────────────────────┐ │ FRONTEND (React) │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ Pages: Dashboard, DatabookView, Templates, etc. │ │ │ │ Components: Modal, Button, Input, LoadingSpinner │ │ │ │ Hooks: useQuery, useMutation (TanStack Query) │ │ │ └──────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ SUPABASE (Backend) │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ PostgreSQL Database │ │ │ │ - Tabelas de Dados │ │ │ │ - Row Level Security (RLS) │ │ │ │ - Triggers e Functions │ │ │ └──────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ Authentication (JWT) │ │ │ │ - Email/Password │ │ │ │ - Session Management │ │ │ └──────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ Storage (Bucket) │ │ │ │ - Documentos (PDF, Imagens) │ │ │ │ - Logos e Marca d'água │ │ │ └──────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## Banco de Dados ### Tabelas Principais #### 1. **usuarios** Gerencia usuários do sistema com diferentes perfis. ```sql CREATE TABLE usuarios ( id UUID PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, nome_completo VARCHAR(255) NOT NULL, perfil VARCHAR(50) -- 'admin', 'gerente_qualidade', 'engenheiro', 'cliente' ativo BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT NOW() ); ``` **Perfis:** - `admin`: Acesso total ao sistema - `gerente_qualidade`: Gerencia qualidade e aprovações - `engenheiro`: Cria e edita databooks - `cliente`: Visualiza apenas seus projetos --- #### 2. **clientes** Informações dos clientes/empresas. ```sql CREATE TABLE clientes ( id UUID PRIMARY KEY, nome VARCHAR(255) NOT NULL, contato VARCHAR(255), email VARCHAR(255), telefone VARCHAR(20), ativo BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT NOW() ); ``` --- #### 3. **templates_topicos** Tópicos padrão que compõem um databook. ```sql CREATE TABLE templates_topicos ( id UUID PRIMARY KEY, numero_topico VARCHAR(20) NOT NULL, -- Ex: "1", "1.1", "2.3" titulo VARCHAR(255) NOT NULL, descricao TEXT, obrigatorio BOOLEAN DEFAULT FALSE, ordem INTEGER, tipo_documentos TEXT[], -- ['pdf', 'jpg', 'png'] tags_padrao TEXT[], categoria VARCHAR(100), -- Referência à categoria created_at TIMESTAMP DEFAULT NOW() ); ``` **Hierarquia de Tópicos:** - Nível 1: `1`, `2`, `3` (tópicos principais) - Nível 2: `1.1`, `1.2`, `2.1` (subtópicos) - Nível 3: `1.1.1`, `1.1.2` (sub-subtópicos) --- #### 4. **templates_customizados** Templates personalizados criados a partir dos tópicos padrão. ```sql CREATE TABLE templates_customizados ( id UUID PRIMARY KEY, nome VARCHAR(255) UNIQUE NOT NULL, tipo VARCHAR(50) -- 'novo' ou 'derivado' template_pai_id UUID REFERENCES templates_customizados(id), topicos_selecionados TEXT[], -- IDs dos tópicos total_topicos INTEGER, total_obrigatorios INTEGER, descricao TEXT, ativo BOOLEAN DEFAULT TRUE, criado_por UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); ``` --- #### 5. **projetos** Projetos/Databooks em desenvolvimento. ```sql CREATE TABLE projetos ( id UUID PRIMARY KEY, numero_projeto VARCHAR(100) UNIQUE NOT NULL, nome_projeto VARCHAR(255) NOT NULL, cliente_id UUID REFERENCES clientes(id), template_id UUID REFERENCES templates_customizados(id), status VARCHAR(50) -- 'rascunho', 'em_andamento', 'revisao', 'finalizado' progresso_percentual INTEGER DEFAULT 0, -- Calculado automaticamente data_inicio DATE, data_entrega_prevista DATE, responsavel_id UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); ``` **Status do Projeto:** - `rascunho`: Criado mas não iniciado - `em_andamento`: Documentos sendo adicionados - `revisao`: Aguardando aprovação - `finalizado`: Databook gerado e entregue --- #### 6. **databooks_mestres** Configurações e metadados do databook final. ```sql CREATE TABLE databooks_mestres ( id UUID PRIMARY KEY, projeto_id UUID NOT NULL REFERENCES projetos(id), cliente_nome VARCHAR(255), cliente_contato VARCHAR(255), cliente_email VARCHAR(255), cliente_telefone VARCHAR(20), produto_nome VARCHAR(255) NOT NULL, produto_tipo VARCHAR(100), produto_descricao TEXT, produto_normas TEXT[], numero_projeto VARCHAR(100), ordem_compra VARCHAR(100), data_inicio DATE, data_entrega_prevista DATE, responsavel_id UUID, revisao_numero VARCHAR(20) DEFAULT 'Rev. 0', revisao_data TIMESTAMP DEFAULT NOW(), revisao_autor_id UUID, revisao_motivo TEXT, logo_empresa_url TEXT, logo_cliente_url TEXT, marca_agua_url TEXT, cor_primaria VARCHAR(7), -- Hex color cor_secundaria VARCHAR(7), titulo_principal VARCHAR(255), subtitulo VARCHAR(255), texto_rodape_capa TEXT, tamanho_pagina VARCHAR(20) -- 'A4' ou 'Letter' orientacao VARCHAR(20) -- 'retrato' ou 'paisagem' margem_superior_mm NUMERIC(5,2) DEFAULT 20, margem_lateral_mm NUMERIC(5,2) DEFAULT 20, incluir_marca_agua BOOLEAN DEFAULT TRUE, incluir_numero_pagina BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); ``` --- #### 7. **secoes_databook** Seções do databook (uma por tópico). ```sql CREATE TABLE secoes_databook ( id UUID PRIMARY KEY, projeto_id UUID NOT NULL REFERENCES projetos(id), topico_id UUID REFERENCES templates_topicos(id), numero_secao VARCHAR(20) NOT NULL, -- Ex: "1", "1.1" titulo VARCHAR(255) NOT NULL, ordem INTEGER, status VARCHAR(50) -- 'completo', 'incompleto', 'nao_aplicavel' total_documentos INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW() ); ``` --- #### 8. **documentos_auto_indexados** Documentos carregados em cada seção. ```sql CREATE TABLE documentos_auto_indexados ( id UUID PRIMARY KEY, databook_id UUID NOT NULL REFERENCES projetos(id), secao_id UUID REFERENCES secoes_databook(id), secao_numero VARCHAR(20), titulo VARCHAR(255) NOT NULL, numero_documento VARCHAR(100), revisao VARCHAR(20), arquivo_url TEXT NOT NULL, -- URL do Supabase Storage arquivo_tipo VARCHAR(50), -- 'pdf', 'jpg', 'png' conteudo_texto TEXT, -- Texto extraído (OCR) tags_automaticas TEXT[], -- Geradas por IA tags_usuario TEXT[], -- Adicionadas manualmente relevancia_score NUMERIC(3,2), -- 0.00 a 1.00 confianca_classificacao NUMERIC(3,2), ordem_na_secao INTEGER, data_documento DATE, aprovado BOOLEAN DEFAULT FALSE, processado_por_ia VARCHAR(50), -- 'openai', 'claude', etc processado_em TIMESTAMP, criado_em TIMESTAMP DEFAULT NOW() ); ``` --- #### 9. **categorias** Categorias para organizar tópicos e documentos. ```sql CREATE TABLE categorias ( id UUID PRIMARY KEY, nome VARCHAR(100) UNIQUE NOT NULL, descricao TEXT, cor VARCHAR(7) DEFAULT '#3B82F6', -- Hex color icone VARCHAR(50), ativo BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); ``` **Categorias Padrão:** - Certificados (#10B981 - Verde) - Desenhos (#3B82F6 - Azul) - Relatórios (#F59E0B - Laranja) - Procedimentos (#8B5CF6 - Roxo) - Normas (#EF4444 - Vermelho) --- #### 10. **configuracoes_pastas** Mapeamento de pastas locais/nuvem para sincronização. ```sql CREATE TABLE configuracoes_pastas ( id UUID PRIMARY KEY, tipo_documento VARCHAR(100) NOT NULL, caminho_local TEXT NOT NULL, caminho_subtipo VARCHAR(100), caminho_completo TEXT, categoria_id UUID REFERENCES categorias(id), habilitado BOOLEAN DEFAULT TRUE, frequencia_atualizacao VARCHAR(50) -- 'manual', 'ao_criar', 'diario', 'semanal' ultima_atualizacao TIMESTAMP, incluir_subpastas BOOLEAN DEFAULT TRUE, formatos_aceitos TEXT[], tamanho_maximo_mb INTEGER DEFAULT 50, tags_obrigatorias TEXT[], palavras_chave_filtro TEXT[], palavras_chave_excluir TEXT[], ordem_docs VARCHAR(50) -- 'data', 'nome', 'relevancia' criado_por UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); ``` --- #### 11. **integracao_ia** Configurações de provedores de IA. ```sql CREATE TABLE integracao_ia ( id UUID PRIMARY KEY, provider VARCHAR(50) -- 'openai', 'claude', 'gemini' api_key_encriptada TEXT NOT NULL, modelo_padrao VARCHAR(100), maximo_tokens INTEGER DEFAULT 2000, ativo BOOLEAN DEFAULT FALSE, testado_em TIMESTAMP, teste_status VARCHAR(50), teste_mensagem TEXT, criado_por UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); ``` --- #### 12. **log_processamento_ia** Histórico de processamentos com IA. ```sql CREATE TABLE log_processamento_ia ( id UUID PRIMARY KEY, databook_id UUID NOT NULL REFERENCES projetos(id), inicio_processamento TIMESTAMP, fim_processamento TIMESTAMP, duracao_segundos INTEGER, total_documentos_encontrados INTEGER, total_documentos_indexados INTEGER, total_erros INTEGER, pastas_varridas TEXT[], provider_ia VARCHAR(50), modelo_usado VARCHAR(100), tokens_utilizados INTEGER, status VARCHAR(50) -- 'sucesso', 'parcial', 'erro' mensagem_erro TEXT, iniciado_por UUID REFERENCES usuarios(id), created_at TIMESTAMP DEFAULT NOW() ); ``` --- #### 13. **permissoes_usuario_detalhadas** Controle granular de permissões por usuário. ```sql CREATE TABLE permissoes_usuario_detalhadas ( id UUID PRIMARY KEY, usuario_id UUID NOT NULL REFERENCES usuarios(id), pode_criar_template BOOLEAN DEFAULT FALSE, pode_editar_template BOOLEAN DEFAULT FALSE, pode_deletar_template BOOLEAN DEFAULT FALSE, pode_criar_databook BOOLEAN DEFAULT FALSE, pode_editar_databook BOOLEAN DEFAULT FALSE, pode_deletar_databook BOOLEAN DEFAULT FALSE, pode_upload_documentos BOOLEAN DEFAULT FALSE, pode_aprovar_documentos BOOLEAN DEFAULT FALSE, pode_gerar_pdf BOOLEAN DEFAULT FALSE, pode_visualizar_preview BOOLEAN DEFAULT FALSE, pode_acessar_logs BOOLEAN DEFAULT FALSE, pode_configurar_ia BOOLEAN DEFAULT FALSE, pode_configurar_pastas BOOLEAN DEFAULT FALSE, pode_gerenciar_usuarios BOOLEAN DEFAULT FALSE, acesso_apenas_seus_projetos BOOLEAN DEFAULT TRUE, pode_visualizar_precos BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); ``` --- ### Relacionamentos Principais ``` usuarios ├─ 1:N → projetos (responsavel_id) ├─ 1:N → templates_customizados (criado_por) ├─ 1:N → configuracoes_pastas (criado_por) ├─ 1:N → integracao_ia (criado_por) ├─ 1:N → log_processamento_ia (iniciado_por) └─ 1:1 → permissoes_usuario_detalhadas clientes └─ 1:N → projetos templates_topicos ├─ 1:N → secoes_databook └─ N:M → templates_customizados (via topicos_selecionados) templates_customizados ├─ 1:N → projetos └─ 0:1 → templates_customizados (template_pai_id - auto-referência) projetos ├─ 1:1 → databooks_mestres ├─ 1:N → secoes_databook ├─ 1:N → documentos_auto_indexados └─ 1:N → log_processamento_ia secoes_databook ├─ 1:N → documentos_auto_indexados └─ 0:1 → templates_topicos categorias ├─ 1:N → templates_topicos └─ 1:N → configuracoes_pastas ``` --- ## Fluxo de Dados ### 1. Criação de um Novo Databook ``` 1. Usuário clica "Novo Databook" ↓ 2. Seleciona Cliente e Template ↓ 3. Sistema cria registro em 'projetos' ↓ 4. Sistema cria 'databooks_mestres' com configurações padrão ↓ 5. Sistema cria 'secoes_databook' (uma por tópico do template) ↓ 6. Databook pronto para receber documentos ``` ### 2. Upload de Documentos ``` 1. Usuário seleciona arquivo (PDF, JPG, PNG) ↓ 2. Frontend valida tipo e tamanho ↓ 3. Upload para Supabase Storage ↓ 4. Sistema cria registro em 'documentos_auto_indexados' ↓ 5. Se IA ativada: Processa com OCR/Análise ↓ 6. Atualiza 'secoes_databook.total_documentos' ↓ 7. Recalcula 'projetos.progresso_percentual' ``` ### 3. Cálculo de Progresso ``` Progresso = (Seções com documentos / Total de tópicos) × 100 Exemplo: - Total de tópicos: 28 - Seções com documentos: 7 - Progresso: (7/28) × 100 = 25% ``` ### 4. Geração de PDF ``` 1. Usuário clica "Gerar PDF" ↓ 2. Sistema busca todos os dados do databook ↓ 3. Renderiza preview com React ↓ 4. Converte para PDF (html2pdf/jsPDF) ↓ 5. Aplica marca d'água, numeração, cores ↓ 6. Download automático ``` --- ## Componentes Principais ### Frontend Structure ``` src/ ├── pages/ │ ├── Dashboard.tsx # Visão geral de projetos │ ├── DatabookView.tsx # Visualização do databook │ ├── Templates.tsx # Gerenciamento de templates │ ├── TopicosGestao.tsx # Gerenciamento de tópicos │ ├── Configuracoes.tsx # Painel de configurações │ └── Login.tsx # Autenticação │ ├── components/ │ ├── common/ │ │ ├── Button.tsx # Botão reutilizável │ │ ├── Input.tsx # Input reutilizável │ │ ├── Modal.tsx # Modal reutilizável │ │ ├── LoadingSpinner.tsx # Spinner de carregamento │ │ └── Navbar.tsx # Barra de navegação │ │ │ ├── configuracoes/ │ │ ├── PastasTab.tsx # Mapeamento de pastas │ │ ├── CategoriasTab.tsx # Gerenciamento de categorias │ │ ├── UsuariosTab.tsx # Gerenciamento de usuários │ │ ├── LogsTab.tsx # Visualização de logs │ │ └── IATab.tsx # Configuração de IA │ │ │ └── databook/ │ ├── DatabookPreview.tsx # Preview do databook │ ├── DocumentUpload.tsx # Upload de documentos │ └── SectionEditor.tsx # Editor de seções │ ├── lib/ │ ├── supabase.ts # Cliente Supabase │ ├── mutations.ts # Funções de mutação │ ├── toast.ts # Sistema de notificações │ └── utils.ts # Funções utilitárias │ └── types/ └── index.ts # Tipos TypeScript ``` --- ## Autenticação e Segurança ### Fluxo de Autenticação ``` 1. Usuário faz login com email/senha ↓ 2. Supabase valida credenciais ↓ 3. Retorna JWT token ↓ 4. Token armazenado no localStorage ↓ 5. Incluído em todas as requisições ↓ 6. Supabase valida token em cada request ``` ### Row Level Security (RLS) Todas as tabelas têm RLS habilitado com políticas: ```sql -- Exemplo: Usuários veem apenas seus próprios projetos CREATE POLICY "Usuários veem seus projetos" ON projetos FOR SELECT USING (responsavel_id = auth.uid()); -- Exemplo: Apenas admins podem deletar CREATE POLICY "Apenas admins deletam" ON projetos FOR DELETE USING ( EXISTS ( SELECT 1 FROM usuarios WHERE id = auth.uid() AND perfil = 'admin' ) ); ``` ### Segurança de Dados - **Senhas:** Hash com bcrypt (Supabase Auth) - **API Keys:** Encriptadas no banco - **Tokens:** JWT com expiração - **HTTPS:** Obrigatório em produção - **CORS:** Configurado para domínios autorizados --- ## Queries Importantes ### Buscar Progresso de um Projeto ```sql SELECT p.id, p.numero_projeto, COUNT(DISTINCT CASE WHEN d.id IS NOT NULL THEN s.id END) as secoes_com_docs, COUNT(DISTINCT t.id) as total_topicos, ROUND( (COUNT(DISTINCT CASE WHEN d.id IS NOT NULL THEN s.id END)::float / COUNT(DISTINCT t.id)) * 100 ) as progresso_percentual FROM projetos p LEFT JOIN secoes_databook s ON p.id = s.projeto_id LEFT JOIN templates_topicos t ON s.topico_id = t.id LEFT JOIN documentos_auto_indexados d ON s.id = d.secao_id WHERE p.id = $1 GROUP BY p.id, p.numero_projeto; ``` ### Buscar Documentos de uma Seção ```sql SELECT d.*, c.nome as categoria_nome, c.cor as categoria_cor FROM documentos_auto_indexados d LEFT JOIN categorias c ON d.secao_numero = c.nome WHERE d.secao_id = $1 ORDER BY d.ordem_na_secao ASC; ``` ### Buscar Tópicos com Cores de Categoria ```sql SELECT t.*, c.cor as categoria_cor FROM templates_topicos t LEFT JOIN categorias c ON t.categoria = c.nome WHERE t.id = ANY($1::uuid[]) ORDER BY t.ordem ASC; ``` --- ## Variáveis de Ambiente ```env VITE_SUPABASE_URL=https://seu-projeto.supabase.co VITE_SUPABASE_ANON_KEY=sua-chave-anonima VITE_API_URL=http://localhost:5173 ``` --- ## Deployment ### Produção 1. Build: `npm run build` 2. Deploy em Vercel/Netlify 3. Configurar variáveis de ambiente 4. Ativar HTTPS 5. Configurar CORS no Supabase ### Banco de Dados 1. Executar migrations em produção 2. Configurar backups automáticos 3. Monitorar performance 4. Manter índices atualizados --- ## Troubleshooting ### Erro 400 ao atualizar - Verificar se coluna existe na tabela - Validar tipos de dados - Checar RLS policies ### Progresso não atualiza - Verificar se documentos estão sendo salvos - Checar se secoes_databook.total_documentos está sendo atualizado - Recarregar página para forçar recálculo ### Upload falha - Verificar tamanho do arquivo - Checar permissões do bucket - Validar tipo de arquivo --- ## Contato e Suporte Para dúvidas sobre a arquitetura, consulte a documentação do usuário ou entre em contato com o time de desenvolvimento.