# 🔄 Sistema de Polling com dtnotificacao - Novo Fluxo

## 📌 Como Funciona Agora

O sistema de polling foi atualizado para usar `dtnotificacao` como marcador de "notificações já consultadas":

### 🔍 Estados de uma Notificação

| Estado | `lida` | `dtnotificacao` | O que significa |
|--------|--------|-----------------|-----------------|
| **Nova** | 0 | NULL | Acabou de chegar, nunca foi consultada |
| **Consultada** | 0 | NOT NULL | Já foi buscada pela API, mas ainda não lida |
| **Lida** | 1 | NOT NULL | Usuário clicou nela e marcou como lida |
| **Arquivada** | 0 ou 1 | NOT NULL | Status = 1 (não aparece mais) |

---

## 🔄 Fluxo de Polling (a cada 30s)

### Passo 1: API Verifica Contagem
```
GET /include/api_notificacoes_nao_lidas.php?idusuario=5
```

**O que a API faz:**
1. ✅ **UPDATE** todas as notificações com:
   - `lida = 0` 
   - `dtnotificacao IS NULL` (nunca foram consultadas)
   - Preenche `dtnotificacao = now()`

2. ✅ **SELECT COUNT** notificações não lidas (`lida = 0`)

**Resposta:**
```json
{
  "success": true,
  "count": 3
}
```

---

### Passo 2: Se count > 0, API Busca Detalhes
```
GET /include/api_notificacoes_detalhes.php?idusuario=5&limit=10
```

**O que a API faz:**
1. ✅ **UPDATE** todas as notificações com:
   - `lida = 0`
   - `dtnotificacao IS NULL` (novamente, para garantir)
   - Preenche `dtnotificacao = now()`

2. ✅ **SELECT** notificações não lidas ordenadas por `dtnotificacao DESC`

**Resposta:**
```json
{
  "success": true,
  "total": 3,
  "notificacoes": [
    {
      "id": 1,
      "titulo": "Nova Ocorrência",
      "descricao": "Ocorrência #100 foi criada",
      "rotina": "tms001c_ocorrencia",
      "lida": 0,
      "dtnotificacao": "2025-12-09 14:30:00",
      "dtleitura": null
    },
    ...
  ]
}
```

---

### Passo 3: Renderiza no Dropdown
O navbar exibe as notificações da resposta.

---

### Passo 4: Usuário Clica (Opcional)
```
POST /include/api_marcar_notificacao_lida.php
```

**Body:**
```
idusuario=5&idnotificacao=1
```

**O que a API faz:**
1. ✅ **UPDATE** a notificação:
   - `lida = 1`
   - `dtleitura = now()`

**Resposta:**
```json
{
  "success": true,
  "message": "Notificação marcada como lida"
}
```

---

## 🎯 Exemplos de Uso

### Cenário 1: Novo Sistema Criando Notificação
```php
<?php
// Inserir notificação SEM dtnotificacao (será NULL no banco)
$sql = "INSERT INTO sis000_notificacao 
        (idusuario, idreferencia, rotina, titulo, descricao, lida, status)
        VALUES (5, 100, 'tms001c_ocorrencia', 'Nova Ocorrência', 'Ocorrência #100 criada', 0, 0)";

pg_query($bdcon, $sql);
// No banco: dtnotificacao = NULL
?>
```

### Cenário 2: Primeira Consulta (30s depois)
```javascript
// Navbar chama API
fetch('/sagadm/include/api_notificacoes_nao_lidas.php?idusuario=5')
// API executa:
// UPDATE sis000_notificacao SET dtnotificacao = now() 
// WHERE idusuario=5 AND lida=0 AND dtnotificacao IS NULL
// No banco: dtnotificacao = '2025-12-09 14:30:00' (agora preenchido!)
// Badge mostra: 1 notificação não lida
```

### Cenário 3: Próximas Consultas (60s, 90s, etc)
```javascript
// Navbar chama API novamente
fetch('/sagadm/include/api_notificacoes_nao_lidas.php?idusuario=5')
// API executa:
// UPDATE sis000_notificacao SET dtnotificacao = now() 
// WHERE idusuario=5 AND lida=0 AND dtnotificacao IS NULL
// (NENHUMA LINHA AFETADA - não há com dtnotificacao NULL)
// Badge ainda mostra: 1 notificação não lida (mesma de antes)
```

### Cenário 4: Usuário Lê a Notificação
```javascript
// Usuário clica no navbar, vê a notificação e clica nela
fetch('/sagadm/include/api_marcar_notificacao_lida.php', {
    method: 'POST',
    body: 'idusuario=5&idnotificacao=1'
})
// API executa:
// UPDATE sis000_notificacao SET lida=1, dtleitura=now()
// WHERE id=1 AND idusuario=5
// Badge desaparece (0 notificações não lidas)
```

---

## 📊 Comportamento Visual

```
TEMPO    | dtnotificacao | lida | Badge | Dropdown | Toast
---------|---------------|------|-------|----------|--------
T=0s     | NULL          | 0    | [1]   | Vazio    | -
T=30s    | 2025...       | 0    | [1]   | 1 item   | Aparece! 🔔
T=60s    | 2025...       | 0    | [1]   | 1 item   | -
T=90s    | 2025...       | 0    | [1]   | 1 item   | -
T=120s   | 2025... (lido)| 1    | [ ]   | Vazio    | -
```

---

## ✨ Vantagens

✅ **Rastreia quando notificação foi vista** (`dtnotificacao`)  
✅ **Rastreia quando usuário leu** (`dtleitura`)  
✅ **Toast aparece apenas UMA VEZ** (quando `dtnotificacao` passa de NULL para now())  
✅ **Polling é eficiente** (não busca o mesmo UPDATE duas vezes)  
✅ **Histórico completo** (sabe exatamente quando cada evento aconteceu)  
✅ **Dados para análise** (pode ver latência entre consulta e leitura)

---

## 🔧 Resumo das APIs Atualizadas

| API | Mudança |
|-----|---------|
| `api_notificacoes_nao_lidas.php` | Agora faz UPDATE de dtnotificacao antes de contar |
| `api_notificacoes_detalhes.php` | Agora faz UPDATE de dtnotificacao antes de retornar lista |
| `api_marcar_notificacao_lida.php` | Sem mudanças (apenas marca como lida) |
| `api_criar_notificacao.php` | Insere com dtnotificacao=NULL (para ser preenchido depois) |

---

## 📝 Próximas Etapas

1. ✅ APIs atualizadas
2. ⏳ Testar fluxo completo no navegador
3. ⏳ Verificar error_log para garantir UPDATEs acontecendo
4. ⏳ Criar Trigger para auto-gerar notificações em INSERT
