# 🔔 Sistema de Notificações - Nova Estrutura (sis000_notificacao)

## 📋 Visão Geral

Novo sistema de notificações **centralizado** usando a tabela `sis000_notificacao` para armazenar notificações que podem ser geradas para **múltiplos usuários** a partir de diferentes processos.

**Diferenças da estrutura anterior:**
- ❌ Antes: Tabela `sis003c_notificacoes` (não era usada adequadamente)
- ✅ Agora: Tabela `sis000_notificacao` (centralizada para todo o sistema)

---

## 📊 Estrutura do Banco de Dados

```sql
CREATE TABLE public.sis000_notificacao (
    id serial4 NOT NULL,
    idusuario int4 NOT NULL,
    idreferencia int4 NULL,
    rotina varchar NULL,
    lida int4 DEFAULT 0 NOT NULL,
    dtnotificacao timestamp NULL,
    dtleitura timestamp NULL,
    status int4 DEFAULT 0 NOT NULL,
    titulo varchar NULL,
    descricao varchar NULL,
    CONSTRAINT sis000_notificacao_pk PRIMARY KEY (id)
);

-- Índices para performance
CREATE INDEX sis000_notificacao_idusuario_idx ON public.sis000_notificacao (idusuario);
CREATE INDEX sis000_notificacao_lida_idx ON public.sis000_notificacao (idusuario, lida);
```

### 📌 Campos Explicados

| Campo | Tipo | Descrição |
|-------|------|-----------|
| `id` | serial | ID único da notificação |
| `idusuario` | int | Qual usuário recebe a notificação |
| `idreferencia` | int | ID da referência (ocorrência, veiculo, etc) |
| `rotina` | varchar | De onde veio (ex: "tms001c_ocorrencia", "painel", "portal") |
| `lida` | int | 0=não lida, 1=lida |
| `dtnotificacao` | timestamp | Data que foi gerada |
| `dtleitura` | timestamp | Data que usuário leu |
| `status` | int | 0=ativa, 1=arquivada |
| `titulo` | varchar | Título da notificação |
| `descricao` | varchar | Descrição/corpo da notificação |

---

## 📁 Arquivos do Sistema

### APIs (Em `/include/`)

#### 1. **api_notificacoes_nao_lidas.php**
Retorna **quantidade** de notificações não lidas do usuário

**Endpoint:** `GET /include/api_notificacoes_nao_lidas.php`

**Request:**
```
GET /include/api_notificacoes_nao_lidas.php
Requer sessão autenticada ($_SESSION['idusuario'])
```

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

#### 2. **api_notificacoes_detalhes.php**
Retorna **lista completa** de notificações não lidas

**Endpoint:** `GET /include/api_notificacoes_detalhes.php?limit=10`

**Request:**
```
GET /include/api_notificacoes_detalhes.php?limit=10
Query params:
  - limit: Número máximo de notificações (default: 10)
```

**Response:**
```json
{
  "success": true,
  "total": 3,
  "notificacoes": [
    {
      "id": 1,
      "idusuario": 5,
      "idreferencia": 100,
      "rotina": "tms001c_ocorrencia",
      "lida": 0,
      "dtnotificacao": "2025-12-09 14:30:00",
      "dtleitura": null,
      "status": 0,
      "titulo": "Nova Ocorrência",
      "descricao": "Ocorrência criada para veiculo XYZ"
    },
    ...
  ]
}
```

#### 3. **api_marcar_notificacao_lida.php**
Marca uma notificação como **lida**

**Endpoint:** `POST /include/api_marcar_notificacao_lida.php`

**Request:**
```
POST /include/api_marcar_notificacao_lida.php
Body:
  idnotificacao=1
```

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

---

## 🎯 Integração no Sistema

### Passo 1: Criar Tabela

Execute o SQL acima no seu banco PostgreSQL:

```bash
psql -U postgres -d SAG -c "
CREATE TABLE public.sis000_notificacao (
    id serial4 NOT NULL,
    idusuario int4 NOT NULL,
    idreferencia int4 NULL,
    rotina varchar NULL,
    lida int4 DEFAULT 0 NOT NULL,
    dtnotificacao timestamp NULL,
    dtleitura timestamp NULL,
    status int4 DEFAULT 0 NOT NULL,
    titulo varchar NULL,
    descricao varchar NULL,
    CONSTRAINT sis000_notificacao_pk PRIMARY KEY (id)
);

CREATE INDEX sis000_notificacao_idusuario_idx ON public.sis000_notificacao (idusuario);
CREATE INDEX sis000_notificacao_lida_idx ON public.sis000_notificacao (idusuario, lida);
"
```

### Passo 2: Incluir no Header

No seu arquivo `include/inicio.php`, **substitua** o bloco de notificações atual:

```php
<!-- ANTIGO - REMOVER -->
<ul class="notifications">
    <li>...</li>
    <li>
        <a href="#"  onclick="return chamarPhpAjax();"class="dropdown-toggle notification-icon" data-toggle="dropdown">
            <i class="fas fa-envelope"></i>
            <span class="badge"  id="TOTAL_T"></span>
        </a>
        ...
    </li>
</ul>

<!-- NOVO - ADICIONAR -->
<ul class="notifications">
    <?php include('../include/notificacoes_navbar.php'); ?>
</ul>
```

### Passo 3: Remover Arquivos Antigos

Delete os seguintes arquivos (não mais necessários):
- ❌ `/include/notificacoes_badge.php`
- ❌ `/include/notificacoes_toast.php`
- ❌ `/include/notificacoes_script.js`
- ❌ `/include/api_notificacoes_nao_lidas.php` (versão antiga)
- ❌ `/include/api_notificacoes_detalhes.php` (versão antiga)
- ❌ `/include/api_marcar_notificacao_lida.php` (versão antiga)

---

## 🔄 Workflow Completo

### 1️⃣ Sistema Gera Notificação

Quando um processo (ex: criação de ocorrência) gera uma notificação:

```php
<?php
// Em qualquer arquivo do sistema (ex: tms001c_ocorrencia/salvar.php)

require('../include/autenticacao.php');

// Conectar ao banco
// Inserir notificação para usuário(s)
$idusuario = $_SESSION['idusuario']; // Qual usuário recebe
$idreferencia = $idocorrencia; // ID da ocorrência criada
$rotina = 'tms001c_ocorrencia';
$titulo = 'Nova Ocorrência';
$descricao = 'Ocorrência #' . $idocorrencia . ' foi criada';

$sql = "INSERT INTO sis000_notificacao 
        (idusuario, idreferencia, rotina, dtnotificacao, titulo, descricao, lida, status)
        VALUES ($idusuario, $idreferencia, '$rotina', now(), '$titulo', '$descricao', 0, 0)";

pg_query($bdcon, $sql);
pg_close($bdcon);
?>
```

### 2️⃣ Usuário Recebe no Navbar

O component `notificacoes_navbar.php` faz polling a cada 30 segundos:

```javascript
// Fase 1: Busca quantidade
GET /include/api_notificacoes_nao_lidas.php
// Resposta: { "success": true, "count": 3 }

// Fase 2: Se count > 0, busca detalhes
GET /include/api_notificacoes_detalhes.php?limit=10
// Resposta: { "success": true, "notificacoes": [...] }

// Fase 3: Renderiza no dropdown
```

### 3️⃣ Usuário Clica em Notificação

```javascript
// Clique em notificação dispara:
POST /include/api_marcar_notificacao_lida.php
Body: { "idnotificacao": 1 }
// Resposta: { "success": true, "message": "Notificação marcada como lida" }
```

---

## 📊 Exemplos de Uso

### Exemplo 1: Criar Notificação para Todos os Usuários

```php
<?php
// Evento: Novo veículo adicionado
$idveiculonovo = 123;

// Buscar todos os usuários com notificações ativas
$sql_usuarios = "SELECT DISTINCT id FROM sis003_usuario WHERE ativo = 1";
$res = pg_query($bdcon, $sql_usuarios);

while ($user = pg_fetch_array($res)) {
    $idusuario = $user['id'];
    
    // Inserir notificação para cada usuário
    $sql = "INSERT INTO sis000_notificacao 
            (idusuario, idreferencia, rotina, dtnotificacao, titulo, descricao, lida, status)
            VALUES ($idusuario, $idveiculonovo, 'dim_veiculostelemetria', now(),
                    'Novo Veículo', 'Um novo veículo foi adicionado ao sistema', 0, 0)";
    pg_query($bdcon, $sql);
}

pg_close($bdcon);
?>
```

### Exemplo 2: Criar Notificação para Gestores Específicos

```php
<?php
$idocorrencia = 456;

// Buscar gestores relacionados
$sql = "SELECT DISTINCT idusuario FROM sis003a_gestor WHERE empresa = 1 AND ativo = 1";
$res = pg_query($bdcon, $sql);

while ($gestor = pg_fetch_array($res)) {
    $idusuario = $gestor['idusuario'];
    
    $sql = "INSERT INTO sis000_notificacao 
            (idusuario, idreferencia, rotina, dtnotificacao, titulo, descricao, lida, status)
            VALUES ($idusuario, $idocorrencia, 'tms001c_ocorrencia', now(),
                    'Ocorrência Criada', 'Novo evento registrado', 0, 0)";
    pg_query($bdcon, $sql);
}

pg_close($bdcon);
?>
```

---

## 🔍 Monitoramento & Debugging

### Verificar Notificações no Banco

```sql
-- Ver todas as notificações de um usuário
SELECT * FROM sis000_notificacao 
WHERE idusuario = 5 
ORDER BY dtnotificacao DESC;

-- Ver não lidas
SELECT * FROM sis000_notificacao 
WHERE idusuario = 5 AND lida = 0 
ORDER BY dtnotificacao DESC;

-- Contar por rotina
SELECT rotina, COUNT(*) FROM sis000_notificacao 
WHERE idusuario = 5 
GROUP BY rotina;
```

### Verificar Logs

Abra o browser (F12) e veja o console:

```
✅ SistemaNotificacoesNavbar iniciado
🔄 Atualizando notificações via polling...
📡 Resposta recebida: 200
📊 Dados da API: {success: true, count: 3}
📥 Carregando detalhes das notificações
📋 Detalhes carregados: {success: true, total: 3, notificacoes: [...]}
🎨 Renderizando 3 notificações
```

Verifique também o servidor (error_log):

```
=== API GET NOTIFICAÇÕES NÃO LIDAS ===
ID Usuário: 5
Query Count: SELECT COUNT(*) as total FROM sis000_notificacao WHERE idusuario = 5 AND lida = 0 AND status = 0
SUCESSO: 3 notificações não lidas
```

---

## 🚀 Próximas Fases

### Fase 2: Filtros por Preferência
- [ ] Implementar `notificacaotodas`
- [ ] Implementar `notificacaogestor`
- [ ] Implementar `notificacaotipoalerta`

### Fase 3: Histórico
- [ ] Criar página `/painel/notificacoes.php` com histórico completo
- [ ] Permitir arquivar notificações
- [ ] Permitir pesquisar por rotina/período

### Fase 4: Melhorias
- [ ] Implementar WebSocket para real-time (sem polling)
- [ ] Adicionar notificações por email
- [ ] Adicionar sons de notificação
- [ ] Implementar triggers SQL para auto-geração

---

## ⚠️ Notas Importantes

1. **Sessão Requerida:** Todas as APIs requerem `$_SESSION['idusuario']` válido
2. **Tabela Requerida:** Execute o SQL de criação da tabela ANTES de usar
3. **Polling:** Sistema faz polling a cada 30 segundos (ajustável em `notificacoes_navbar.php`)
4. **Performance:** Mantenha os índices criados para melhor performance
5. **Limpeza:** Considere arquivar notificações antigas periodicamente

---

## 📞 Suporte

Se tiver dúvidas sobre a integração:
1. Verifique o console do navegador (F12)
2. Verifique o error_log do servidor
3. Execute as queries SQL de monitoramento acima

**Versão:** 2.0 (Novo Schema)  
**Data:** 2025-12-09  
**Status:** Em Produção ✅
