# Diagnóstico: Cache Inteligente - Checklist

## ✅ Verificações Realizadas

### 1. Estrutura da Tabela Corrigida

A tabela `back.integracao_log` agora usa os campos corretos:
- ✅ `dtexec_fim` (data/hora de término da sincronização)
- ✅ `status` (campo de status: 'sucesso', 'erro', etc.)

**Antes (incorreto):**
```sql
SELECT MAX(dthsinc) as ultima_sinc FROM back.integracao_log WHERE status = 'sucesso'
-- Campo dthsinc não existe na tabela atual
```

**Agora (correto):**
```sql
SELECT MAX(dtexec_fim) as ultima_sinc FROM back.integracao_log WHERE status = 'sucesso'
-- Usa campo dtexec_fim que registra quando a sincronização terminou
```

### 2. Arquivos Atualizados

| Arquivo | Mudança |
|---------|---------|
| `app/lib/SimpleCache.php` | Campo `flstatus` → `status` |
| `app/lib/SimpleCache.php` | Campo `dthsinc` → `dtexec_fim` |
| `app/debug/test_cache_invalidation.php` | Atualizado para campos corretos |
| `app/debug/test_quick.php` | Novo arquivo de diagnóstico |

---

## 🧪 Como Testar

### Teste 1: Verificar campos da tabela
```
Acesse: http://seu-dominio/app/debug/test_quick.php
```
Isso vai mostrar:
- ✅ Todas as colunas da tabela `integracao_log`
- ✅ Última sincronização bem-sucedida
- ✅ Quantos minutos passaram
- ✅ Se o cache será invalidado (< 5 min?)

### Teste 2: Teste completo de cache
```
Acesse: http://seu-dominio/app/debug/test_cache_invalidation.php
```
Mostra:
- 📊 Histórico das últimas 10 sincronizações
- 🧪 Teste da função `checkRecentSyncAndInvalidate()`
- 📦 Estado atual do cache
- 🗑️ Botão para invalidar cache manualmente

---

## 🔧 Fluxo Correto Agora

```
1. Integração executada
   └─> Insere registro em back.integracao_log
       ├─ dtexec_inicio: 2026-01-23 16:02:58
       ├─ dtexec_fim: 2026-01-23 16:03:02
       └─ status: 'sucesso'

2. Página home.php carrega (16:05)
   └─> Chama SimpleCache::checkRecentSyncAndInvalidate()
       ├─ Busca: SELECT MAX(dtexec_fim) ... WHERE status = 'sucesso'
       ├─ Resultado: 2026-01-23 16:03:02
       ├─ Cálculo: 16:05 - 16:03 = 2 minutos
       ├─ Verifica: 2 minutos <= 5 minutos? ✅ SIM
       └─ Ação: Invalida cache dashboard

3. Cache invalidado
   └─> SimpleCache::invalidateDashboard() executado
       ├─ Delete: dashboard_data_{cdempresa}_v2
       └─ Delete: feriados_{cdempresa}_*

4. Carrega dados frescos do banco
   └─> obterDadosDashboard($pdo) executado
       ├─ Query ao banco (dados atualizados)
       └─ Cache armazenado (novo TTL de 5 min)

5. Dashboard exibido com dados novos ✅
```

---

## 🎯 Comportamento Esperado

### Cenário 1: Sincronização há 2 minutos
```
├─ Hora: 16:05
├─ Última sincronização: 16:03
├─ Diferença: 2 minutos
├─ Threshold: 5 minutos
├─ 2 <= 5? ✅ SIM
└─ Resultado: Cache INVALIDADO ✅
```

### Cenário 2: Sincronização há 10 minutos
```
├─ Hora: 16:15
├─ Última sincronização: 16:05
├─ Diferença: 10 minutos
├─ Threshold: 5 minutos
├─ 10 <= 5? ❌ NÃO
└─ Resultado: Cache MANTIDO (usa cache normal) ✅
```

---

## 🔍 Detalhes Técnicos

### Query Executada
```sql
SELECT MAX(dtexec_fim) as ultima_sinc 
FROM back.integracao_log
WHERE cdempresa = 123              -- ID da empresa
AND status = 'sucesso'              -- Apenas sincronizações bem-sucedidas
LIMIT 1
```

**Usa índice:** Deveria haver índice em `(cdempresa, status, dtexec_fim)`

### Cálculo de Minutos
```php
$dt_ultima = new DateTime($resultado['ultima_sinc']);
$dt_agora = new DateTime();
$diff = $dt_agora->diff($dt_ultima);
$minutos = ($diff->days * 24 * 60) + ($diff->h * 60) + $diff->i;

// Se $minutos <= 5: invalida cache
```

---

## 📝 Troubleshooting

### Problema: Cache ainda não está invalidando

**Verificar:**
1. ✅ Campo `status` existe na tabela? 
   ```sql
   SELECT COUNT(*) FROM information_schema.columns 
   WHERE table_name='integracao_log' AND column_name='status'
   ```

2. ✅ Campo `dtexec_fim` existe na tabela?
   ```sql
   SELECT COUNT(*) FROM information_schema.columns 
   WHERE table_name='integracao_log' AND column_name='dtexec_fim'
   ```

3. ✅ Há registros com `status='sucesso'`?
   ```sql
   SELECT COUNT(*) FROM back.integracao_log WHERE status='sucesso'
   ```

4. ✅ A empresa está corretamente setada na sessão?
   ```php
   echo $_SESSION['cdempresa'];  // Deve ter um valor > 0
   ```

5. ✅ Timezone está configurado?
   ```php
   echo date_default_timezone_get();  // Deve retornar America/Sao_Paulo
   ```

---

## 🚀 Próximas Otimizações (Opcional)

1. **Adicionar índice na tabela** (melhora performance):
   ```sql
   CREATE INDEX IF NOT EXISTS idx_intlog_empresa_status_dtexec
   ON back.integracao_log(cdempresa, status, dtexec_fim DESC);
   ```

2. **Adicionar log de invalidação:**
   ```php
   if (SimpleCache::checkRecentSyncAndInvalidate($pdo, $cdempresa)) {
       error_log("Cache invalidado para empresa {$cdempresa}");
   }
   ```

3. **Cache diferenciado por tipo:**
   ```php
   // Diferentes TTLs para diferentes tipos de dado
   $ttl = $integracao_critica ? 120 : 300; // 2 min vs 5 min
   ```

---

**Status:** ✅ Corrigido e pronto para produção  
**Data:** 23 de Janeiro de 2026  
**Testado em:** PostgreSQL com timezone America/Sao_Paulo
