# 🗄️ Sistema de Persistência de Dados - Aço Calc Pro ## 📋 Visão Geral Este documento técnico descreve a arquitetura completa do sistema de persistência de dados do Aço Calc Pro, garantindo que todas as personalizações e configurações do painel administrativo permaneçam inalteradas durante o uso e recarregamento do aplicativo. ## 🏗️ Arquitetura Atual de Persistência ### 1. **Camadas de Armazenamento** ```mermaid graph TD A[Aplicação] --> B[State Manager] B --> C[Storage Layer] C --> D[localStorage] C --> E[IndexedDB] C --> F[Cache Manager] subgraph "Persistência Local" D E F end G[Admin Panel] --> H[Data Manager] H --> C I[User Preferences] --> C ``` ### 2. **Componentes Principais** #### **Data Manager** (`js/database/data-manager.js`) - **Função**: Gerenciamento central de dados e cache inteligente - **Armazenamento**: localStorage com prefixo `acoCalcPro_cache_` - **TTL**: 24 horas para atualização automática - **Versionamento**: Detecta mudanças e atualiza automaticamente ```javascript // Estrutura de cache localStorage.setItem('acoCalcPro_cache_cantoneiras', JSON.stringify(dados)); localStorage.setItem('acoCalcPro_metadata', JSON.stringify(metadata)); ``` #### **Storage Manager** (`js/core/storage.js`) - **Função**: Gerenciamento de preferências do usuário - **Armazenamento**: localStorage com chave `acoCalcPreferences` - **Dados**: tema, esquema de cores, tamanho de fonte, família de fonte ```javascript // Estrutura de preferências const userPreferences = { theme: 'dark', colorScheme: 'default', fontSize: 'medium', fontFamily: 'default' }; ``` #### **Cache Manager** (`js/core/cache-manager.js`) - **Função**: Gerenciamento avançado com IndexedDB - **Armazenamento**: IndexedDB para grandes volumes de dados - **Fallback**: CSV embutido quando IndexedDB não disponível - **Stores**: cantoneiras, barras, tubos, perfis, etc. #### **State Manager** (`js/core/state.js`) - **Função**: Estado global da aplicação - **Dados**: histórico, favoritos, orçamento, seção atual - **Persistência**: Integrado com Storage Manager #### **Admin Panel** (`js/database/admin-panel.js`) - **Função**: Interface de administração e configurações - **Estado**: Não persiste configurações atualmente - **Ações**: Atualizar dados, limpar cache, exportar/importar ## 🔍 Análise de Persistência Atual ### **Pontos Fortes** 1. ✅ **Cache Inteligente**: Dados carregados uma vez, reusados múltiplas vezes 2. ✅ **Versionamento Automático**: Detecta e aplica atualizações 3. ✅ **Multipla Camadas**: localStorage, IndexedDB e CSV como fallback 4. ✅ **Performance Otimizada**: Carregamento rápido após primeiro acesso ### **Pontos de Fragilidade** 1. ❌ **Admin Panel Sem Persistência**: Configurações administrativas não são salvas 2. ❌ **Dependência de localStorage**: Limitado a ~5-10MB 3. ❌ **Sem Sincronização**: Sem backup em nuvem ou sincronização entre dispositivos 4. ❌ **Falta de Migração**: Sem sistema de migração de dados entre versões ## 🎯 Proposta de Arquitetura Robustas ### 1. **Sistema de Configurações Persistentes** ```javascript // Novo sistema de configurações administrativas class AdminConfigManager { constructor() { this.configKey = 'acoCalcPro_admin_config'; this.version = '1.0.0'; this.defaultConfig = { appName: 'AÇO CALC PRO', appSubtitle: 'Plataforma Técnica com Base de Dados de Materiais Brasileiros', footerText: '© 2025 AÇO CALC PRO v7.5 PROFESSIONAL EDITION', themeDefault: 'escuro', modeDefault: 'simples', toolsVisibility: { 'cev': true, 'seletor': true, 'equivalencias': false, 'comparativo': false, 'parafusos': true, 'layout': true, // ... todas as ferramentas }, dataRefreshInterval: 24, // horas autoBackup: true, backupInterval: 7, // dias lastBackup: null, version: this.version }; } saveConfig(config) { const configToSave = { ...this.getConfig(), ...config, version: this.version }; localStorage.setItem(this.configKey, JSON.stringify(configToSave)); return configToSave; } getConfig() { try { const saved = localStorage.getItem(this.configKey); return saved ? JSON.parse(saved) : this.defaultConfig; } catch { return this.defaultConfig; } } resetConfig() { localStorage.setItem(this.configKey, JSON.stringify(this.defaultConfig)); return this.defaultConfig; } } ``` ### 2. **Sistema de Backup e Restauração** ```javascript class BackupManager { constructor() { this.backupKey = 'acoCalcPro_backup'; this.maxBackups = 5; } async createBackup() { const backup = { timestamp: Date.now(), version: '1.0.0', data: { preferences: this.getPreferences(), adminConfig: this.getAdminConfig(), cacheStats: window.dataManager.getCacheStats(), appState: this.getAppState() } }; // Salvar em localStorage const backups = this.getBackups(); backups.unshift(backup); // Limitar número de backups if (backups.length > this.maxBackups) { backups.splice(this.maxBackups); } localStorage.setItem(this.backupKey, JSON.stringify(backups)); return backup; } getBackups() { try { const saved = localStorage.getItem(this.backupKey); return saved ? JSON.parse(saved) : []; } catch { return []; } } restoreBackup(backup) { // Restaurar preferências if (backup.data.preferences) { localStorage.setItem('acoCalcPreferences', JSON.stringify(backup.data.preferences)); } // Restaurar configurações admin if (backup.data.adminConfig) { localStorage.setItem('acoCalcPro_admin_config', JSON.stringify(backup.data.adminConfig)); } // Aplicar mudanças this.applyRestoredSettings(); return true; } } ``` ### 3. **Sistema de Migração de Dados** ```javascript class MigrationManager { constructor() { this.migrationKey = 'acoCalcPro_migration_version'; this.currentVersion = '1.0.0'; } checkAndRunMigrations() { const savedVersion = localStorage.getItem(this.migrationKey) || '0.0.0'; if (savedVersion < this.currentVersion) { console.log(`🔄 Executando migração de ${savedVersion} para ${this.currentVersion}`); this.runMigrations(savedVersion); localStorage.setItem(this.migrationKey, this.currentVersion); } } runMigrations(fromVersion) { // Migrar de versões antigas if (fromVersion < '1.0.0') { this.migrateToV1(); } } migrateToV1() { // Converter configurações antigas const oldConfig = localStorage.getItem('acoCalcPro_config'); if (oldConfig) { try { const parsed = JSON.parse(oldConfig); // Converter para novo formato const newConfig = this.convertToNewFormat(parsed); localStorage.setItem('acoCalcPro_admin_config', JSON.stringify(newConfig)); localStorage.removeItem('acoCalcPro_config'); } catch (e) { console.warn('⚠️ Falha ao migrar configurações antigas'); } } } } ``` ### 4. **Integração com Admin Panel** ```javascript // Atualizar admin-panel.js para persistir configurações function abrirPainelDados() { const adminConfig = window.adminConfigManager.getConfig(); const stats = window.dataManager.getCacheStats(); // Adicionar seções de configuração no modal const configSection = `