# πŸ“Š Diagrama Visual do Sistema de Banco de Dados ## πŸ—οΈ Arquitetura Geral ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ APLICAÇÃO WEB β”‚ β”‚ (index.html) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ SISTEMA DE SCRIPTS β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Data Manager β”‚ β”‚Perfis Loader β”‚ β”‚ Admin Panel β”‚ β”‚ β”‚ β”‚ (Core) β”‚ β”‚ (UI Logic) β”‚ β”‚ (Admin) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ localStorage β”‚ β”‚ CSV Files β”‚ β”‚ (Cache) β”‚ β”‚ (BD/perfis) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ”„ Fluxo de Dados Completo ``` INICIALIZAÇÃO ═════════════ 1. PΓ‘gina Carrega β”‚ β”œβ”€> Carrega data-manager.js β”‚ β”‚ β”‚ └─> new DataManager() β”‚ β”‚ β”‚ └─> init() β”‚ β”‚ β”‚ β”œβ”€> getMetadata() β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€> Cache existe? ──YES──> Dados prontos βœ… β”‚ β”‚ β”‚ β”‚ β”‚ └─> NO ──> updateAllData() β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€> loadCSV('cantoneiras') β”‚ β”‚ β”œβ”€> loadCSV('barras_redondas') β”‚ β”‚ β”œβ”€> loadCSV('tubos_circulares') β”‚ β”‚ β”œβ”€> ... (10 tipos) β”‚ β”‚ β”‚ β”‚ β”‚ └─> saveToCache() β”‚ β”‚ β”‚ β”‚ β”‚ └─> localStorage.setItem() β”‚ β”‚ β”‚ └─> Dados prontos βœ… β”‚ β”œβ”€> Carrega perfis-loader.js β”‚ └─> FunΓ§Γ΅es disponΓ­veis β”‚ └─> Carrega admin-panel.js └─> FunΓ§Γ΅es disponΓ­veis CARREGAMENTO DE CATÁLOGO ═════════════════════════ 2. UsuΓ‘rio Acessa CatΓ‘logo β”‚ └─> showSection('catalogo-perfis') β”‚ └─> getCantoneirasContent() β”‚ └─> HTML renderizado β”‚ └─> carregarCantoneiras() β”‚ └─> carregarCantoneirasV2() β”‚ β”œβ”€> dataManager.getData('cantoneiras') β”‚ β”‚ β”‚ β”œβ”€> loadFromCache() β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€> Cache existe? ──YES──> Retorna dados ⚑ β”‚ β”‚ β”‚ β”‚ β”‚ └─> NO ──> loadCSV() β”‚ β”‚ β”‚ β”‚ β”‚ └─> saveToCache() β”‚ β”‚ β”‚ └─> Retorna dados β”‚ └─> exibirCantoneirasV2(dados) β”‚ └─> Tabela preenchida βœ… FILTROS E BUSCAS ════════════════ 3. UsuΓ‘rio Aplica Filtro β”‚ └─> filtrarCantoneirasV2() β”‚ β”œβ”€> Obter valores dos filtros β”‚ β”œβ”€> Tamanho β”‚ β”œβ”€> Peso mΓ‘ximo β”‚ └─> Busca por nome β”‚ β”œβ”€> dataManager.filterData(dados, filtros) β”‚ └─> Filtra em memΓ³ria ⚑ β”‚ β”œβ”€> dataManager.searchData(dados, busca) β”‚ └─> Busca em memΓ³ria ⚑ β”‚ └─> exibirCantoneirasV2(filtrados) └─> Tabela atualizada βœ… ADMINISTRAÇÃO ═════════════ 4. UsuΓ‘rio Abre Painel Admin β”‚ └─> abrirPainelDados() β”‚ β”œβ”€> getCacheStats() β”‚ β”‚ β”‚ β”œβ”€> getMetadata() β”‚ └─> loadFromCache() para cada tipo β”‚ β”œβ”€> Renderiza modal com: β”‚ β”œβ”€> Status do sistema β”‚ β”œβ”€> Tabela de tipos β”‚ β”œβ”€> BotΓ΅es de aΓ§Γ£o β”‚ └─> Log de atividades β”‚ └─> Modal exibido βœ… 5. UsuΓ‘rio Atualiza Dados β”‚ └─> atualizarTodosDados() β”‚ └─> dataManager.updateAllData() β”‚ β”œβ”€> Para cada tipo: β”‚ β”œβ”€> loadCSV() β”‚ └─> saveToCache() β”‚ └─> updateMetadata() └─> Dados atualizados βœ… ``` --- ## πŸ’Ύ Estrutura do Cache (localStorage) ``` localStorage β”œβ”€ acoCalcPro_metadata β”‚ └─ { β”‚ version: "1.0.0", β”‚ lastUpdate: 1234567890, β”‚ results: { success: [...], errors: [...] }, β”‚ totalTypes: 10, β”‚ successCount: 10, β”‚ errorCount: 0 β”‚ } β”‚ β”œβ”€ acoCalcPro_cache_cantoneiras β”‚ └─ [ β”‚ { β”‚ id: "CANT001", β”‚ nome: "L25x25x3", β”‚ lado_mm: 25, β”‚ espessura_mm: 3, β”‚ peso_kg_m: 1.11, β”‚ area_cm2: 1.42, β”‚ momento_inercia_cm4: 0.48, β”‚ raio_giracao_cm: 0.58, β”‚ tipo: "Pequena", β”‚ _metadata: { β”‚ source: "BD/perfis/cantoneiras_brasil_completo.csv", β”‚ loadedAt: "2025-01-01T12:00:00.000Z", β”‚ version: "1.0.0" β”‚ } β”‚ }, β”‚ ... β”‚ ] β”‚ β”œβ”€ acoCalcPro_cache_barras_redondas β”‚ └─ [...] β”‚ β”œβ”€ acoCalcPro_cache_tubos_circulares β”‚ └─ [...] β”‚ └─ ... (outros tipos) ``` --- ## πŸ” Fluxo de DecisΓ£o do Cache ``` getData(tipo) β”‚ β–Ό loadFromCache(tipo) β”‚ β”œβ”€ Cache existe? β”‚ β”‚ β”‚ β”œβ”€ SIM ──> Retorna dados ⚑ (50ms) β”‚ β”‚ β”‚ └─ NΓƒO ──> loadCSV(config) β”‚ β”‚ β”‚ β”œβ”€ fetch(csv) β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ Sucesso ──> Processa CSV β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ Parse linhas β”‚ β”‚ β”‚ β”œβ”€ Converte tipos β”‚ β”‚ β”‚ β”œβ”€ Adiciona metadata β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─> saveToCache() β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─> Retorna dados βœ… (500ms) β”‚ β”‚ β”‚ β”‚ β”‚ └─ Erro ──> throw Error ❌ β”‚ β”‚ β”‚ └─ Retorna dados β”‚ └─ Retorna dados ``` --- ## ⏱️ Timeline de Performance ``` PRIMEIRA CARGA (Sem Cache) ═══════════════════════════ 0ms β”œβ”€ PΓ‘gina carrega β”‚ 50ms β”œβ”€ Data Manager inicializa β”‚ 100ms β”œβ”€ Verifica cache (vazio) β”‚ 150ms β”œβ”€ Inicia carregamento de CSVs β”‚ 200ms β”œβ”€ Fetch cantoneiras.csv β”‚ 300ms β”œβ”€ Processa CSV β”‚ 400ms β”œβ”€ Salva no cache β”‚ 500ms └─ Dados prontos βœ… SEGUNDA CARGA (Com Cache) ══════════════════════════ 0ms β”œβ”€ PΓ‘gina carrega β”‚ 50ms β”œβ”€ Data Manager inicializa β”‚ 60ms β”œβ”€ Verifica cache (existe!) β”‚ 70ms β”œβ”€ Carrega do localStorage β”‚ 80ms └─ Dados prontos βœ… (10x mais rΓ‘pido!) FILTROS (Em MemΓ³ria) ════════════════════ 0ms β”œβ”€ UsuΓ‘rio aplica filtro β”‚ 5ms β”œβ”€ filterData() processa β”‚ 10ms └─ Tabela atualizada βœ… (instantΓ’neo!) ``` --- ## 🎯 Componentes e Responsabilidades ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ DATA MANAGER β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Responsabilidades: β”‚ β”‚ β€’ Gerenciar cache (localStorage) β”‚ β”‚ β€’ Carregar e processar CSVs β”‚ β”‚ β€’ Validar e normalizar dados β”‚ β”‚ β€’ Filtrar e buscar dados β”‚ β”‚ β€’ Controlar versionamento β”‚ β”‚ β€’ Gerenciar TTL (24 horas) β”‚ β”‚ β”‚ β”‚ MΓ©todos Principais: β”‚ β”‚ β€’ getData(tipo) β”‚ β”‚ β€’ filterData(dados, filtros) β”‚ β”‚ β€’ searchData(dados, termo) β”‚ β”‚ β€’ updateAllData() β”‚ β”‚ β€’ clearCache() β”‚ β”‚ β€’ getCacheStats() β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ PERFIS LOADER β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Responsabilidades: β”‚ β”‚ β€’ Carregar dados via Data Manager β”‚ β”‚ β€’ Exibir dados na interface β”‚ β”‚ β€’ Gerenciar estado da UI (loading, erro) β”‚ β”‚ β€’ Aplicar filtros e buscas β”‚ β”‚ β€’ Atualizar contadores β”‚ β”‚ β”‚ β”‚ FunΓ§Γ΅es Principais: β”‚ β”‚ β€’ carregarCantoneirasV2() β”‚ β”‚ β€’ exibirCantoneirasV2(dados) β”‚ β”‚ β€’ filtrarCantoneirasV2() β”‚ β”‚ β€’ limparFiltrosCantoneirasV2() β”‚ β”‚ β€’ atualizarDadosCantoneiras() β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ADMIN PANEL β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Responsabilidades: β”‚ β”‚ β€’ Interface de administraΓ§Γ£o β”‚ β”‚ β€’ Visualizar status do sistema β”‚ β”‚ β€’ Executar aΓ§Γ΅es de manutenΓ§Γ£o β”‚ β”‚ β€’ Exibir logs e estatΓ­sticas β”‚ β”‚ β€’ Exportar dados β”‚ β”‚ β”‚ β”‚ FunΓ§Γ΅es Principais: β”‚ β”‚ β€’ abrirPainelDados() β”‚ β”‚ β€’ atualizarTodosDados() β”‚ β”‚ β€’ limparCacheCompleto() β”‚ β”‚ β€’ verificarIntegridade() β”‚ β”‚ β€’ exportarDados() β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ”„ Ciclo de Vida dos Dados ``` CRIAÇÃO ═══════ CSV criado/atualizado β”‚ └─> Armazenado em BD/perfis/ CARREGAMENTO ════════════ Primeira vez ou cache expirado β”‚ β”œβ”€> fetch(csv) β”œβ”€> parse() β”œβ”€> validate() β”œβ”€> normalize() └─> saveToCache() CACHE ═════ Dados em localStorage β”‚ β”œβ”€> VΓ‘lido por 24 horas β”œβ”€> Versionado └─> Pode ser limpo manualmente USO ═══ AplicaΓ§Γ£o usa dados β”‚ β”œβ”€> getData() ──> loadFromCache() β”œβ”€> filterData() └─> searchData() ATUALIZAÇÃO ═══════════ Manual ou automΓ‘tica (TTL) β”‚ β”œβ”€> clearCache() β”œβ”€> loadCSV() └─> saveToCache() EXPIRAÇÃO ═════════ ApΓ³s 24 horas ou mudanΓ§a de versΓ£o β”‚ └─> needsUpdate() ──> true β”‚ └─> updateAllData() ``` --- ## πŸ“Š MΓ©tricas de Performance ``` OPERAÇÃO TEMPO MELHORIA ═══════════════════════════════════════════════════ Primeira carga 500ms Baseline Segunda carga (cache) 50ms 10x ⚑ Filtro por tipo 10ms 50x ⚑ Busca por nome 10ms 50x ⚑ Limpar filtros 5ms 100x ⚑ Atualizar dados 500ms N/A Limpar cache 50ms N/A Verificar integridade 100ms N/A Exportar dados 200ms N/A ``` --- ## 🎨 Interface Visual ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ HEADER [πŸ—„οΈ] [πŸŒ™] β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ SIDEBAR β”‚ MAIN CONTENT β”‚ β”‚ β”‚ β”‚ β”‚ πŸ“ MATERIAIS β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”œβ”€ CatΓ‘logo ◄───┼─── πŸ“ Cantoneiras - CatΓ‘logo β”‚ β”‚ β”‚ β”œβ”€ CEV β”‚ β”‚ β”‚ β”‚ β”‚ └─ Seletor β”‚ β”‚ πŸ” Filtros β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ πŸ”© CONEXΓ•ES β”‚ β”‚ β”‚ Tamanho: [Todos β–Ό] β”‚ β”‚ β”‚ β”‚ β”œβ”€ Parafusos β”‚ β”‚ β”‚ Peso Max: [____] β”‚ β”‚ β”‚ β”‚ └─ FuraΓ§Γ£o β”‚ β”‚ β”‚ Busca: [____] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ πŸ”₯ SOLDAGEM β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ PrΓ©-aquec. β”‚ β”‚ πŸ“Š Tabela (39 modelos) β”‚ β”‚ β”‚ └─ Consumo β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Nome β”‚ Lado β”‚ Esp β”‚ Peso ... β”‚ β”‚ β”‚ β”‚ πŸ”¬ ENSAIOS β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ β”œβ”€ Dureza β”‚ β”‚ β”‚ L25 β”‚ 25 β”‚ 3 β”‚ 1.11 ... β”‚ β”‚ β”‚ β”‚ └─ Charpy β”‚ β”‚ β”‚ L25 β”‚ 25 β”‚ 4 β”‚ 1.42 ... β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ... β”‚ β”‚ β”‚ β”‚ 🎨 PINTURA β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ └─ Consumo β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Total: 39 modelos β”‚ β”‚ β”‚ πŸ’° ORΓ‡AMENTO β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ └─ Detalhado β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ [πŸ—„οΈ FAB] ``` --- **Sistema completo e documentado! πŸŽ‰**