# 🔔 Sistema de Notificações - Guia de Integração

## Arquivos Criados

### 1. **notificacoes_badge.php**
- Badge com contador de notificações não lidas
- Tooltip com últimas 5 notificações
- Polling automático a cada 30 segundos
- **Onde incluir:** No final de `include/fim.php`

### 2. **notificacoes_toast.php**
- Componente de notificação flutuante (toast)
- Suporta 5 tipos: info, success, warning, danger, alert
- Auto-remove após 5 segundos
- **Onde incluir:** No final de `include/fim.php`

### 3. **notificacoes_script.js**
- Classe `SistemaNotificacoes` para gerenciar notificações
- Polling em background
- Métodos para marcar como lida
- **Onde incluir:** No final de `include/fim.php` (após notificacoes_badge.php)

### 4. **api_notificacoes_nao_lidas.php**
- Retorna: `{ count: número_não_lidas, preferencias: {...} }`
- Endpoint: `/include/api_notificacoes_nao_lidas.php`

### 5. **api_notificacoes_detalhes.php**
- Retorna: Array com últimas N notificações
- Endpoint: `/include/api_notificacoes_detalhes.php?limit=10`

### 6. **api_marcar_notificacao_lida.php**
- POST: `idnotificacao`
- Endpoint: `/include/api_marcar_notificacao_lida.php`

### 7. **notificacoes_api.php**
- Documentação dos endpoints disponíveis
- **Apenas para referência**

---

## 🚀 Como Integrar

### Passo 1: Adicionar no `include/fim.php`

Adicione estas linhas **antes de fechar o `</body>`**:

```php
<!-- Componentes de Notificação -->
<?php include('notificacoes_badge.php'); ?>
<?php include('notificacoes_toast.php'); ?>
<script src="<?php echo $base_path; ?>/include/notificacoes_script.js"></script>
```

### Passo 2: Criar arquivos PHP em `/include/`

✅ Já foram criados:
- `api_notificacoes_nao_lidas.php`
- `api_notificacoes_detalhes.php`
- `api_marcar_notificacao_lida.php`

### Passo 3: Executar Script SQL

```sql
CREATE TABLE public.sis003c_notificacoes (
    id serial4 NOT NULL,
    idusuario int4 NOT NULL,
    empresa int4 NOT NULL,
    idocorrencia int4 NOT NULL,
    tipoalerta int4 NULL,
    descricao text NULL,
    lida int4 DEFAULT 0 NOT NULL,
    dtnotificacao timestamp DEFAULT now() NOT NULL,
    dtleitura timestamp NULL,
    CONSTRAINT sis003c_notificacoes_pk PRIMARY KEY (id),
    CONSTRAINT sis003c_notificacoes_usuario_fk FOREIGN KEY (idusuario) REFERENCES sis003_usuario(id) ON DELETE CASCADE,
    CONSTRAINT sis003c_notificacoes_ocorrencia_fk FOREIGN KEY (idocorrencia) REFERENCES tms001c_ocorrencia(id) ON DELETE CASCADE
);

CREATE INDEX sis003c_notificacoes_usuario_idx ON public.sis003c_notificacoes (idusuario, lida);
CREATE INDEX sis003c_notificacoes_ocorrencia_idx ON public.sis003c_notificacoes (idocorrencia);
CREATE INDEX sis003c_notificacoes_empresa_idx ON public.sis003c_notificacoes (empresa, dtnotificacao DESC);
```

---

## 📖 Como Usar

### Exibir Toast em Qualquer Página

```javascript
// Sucesso
ToastNotification.sucesso('Operação Realizada', 'Registro salvo com sucesso!');

// Erro
ToastNotification.erro('Erro ao Salvar', 'Tente novamente mais tarde');

// Aviso
ToastNotification.aviso('Atenção', 'Ação será irreversível');

// Info
ToastNotification.info('Informação', 'Sistema em manutenção às 23:00');

// Alerta (notificação de ocorrência)
ToastNotification.alerta('Novo Alerta!', 'Veículo XYZ-1234 possui novo evento');
```

### Acessar Variáveis de Preferência

```javascript
console.log(sistemaNotificacoes.userPreferences.notificacaotodas);
console.log(sistemaNotificacoes.userPreferences.notificacaogestor);
console.log(sistemaNotificacoes.userPreferences.notificacaotipoalerta);
```

### Atualizar Manualmente

```javascript
// Atualiza contador de notificações
sistemaNotificacoes.atualizarContador();

// Carrega detalhes (abre tooltip)
sistemaNotificacoes.carregarDetalhes(10); // 10 últimas
```

---

## 🔄 Fluxo de Funcionamento

```
1. Página carrega → Executa include/fim.php
2. notificacoes_badge.php renderiza HTML/CSS do badge
3. notificacoes_toast.php renderiza container de toasts
4. notificacoes_script.js inicializa classe SistemaNotificacoes
5. Polling iniciado (a cada 30 segundos)
6. Fetch para get_notificacoes_nao_lidas.php
7. Badge atualiza com count
8. Quando usuário clica no badge, carrega detalhes
9. Ao clicar em notificação, chama marcar_notificacao_lida.php
10. UI atualiza em tempo real
```

---

## ⚙️ Configurações

### Mudar Intervalo de Polling

No `notificacoes_script.js`, na inicialização:

```javascript
sistemaNotificacoes = new SistemaNotificacoes({
    appPath: '',
    intervalo: 60000  // 60 segundos ao invés de 30
});
```

### Mudar Duração do Toast

```javascript
ToastNotification.criarToast({
    titulo: 'Meu Aviso',
    mensagem: 'Durará 10 segundos',
    duracao: 10000  // em milissegundos
});
```

---

## 🐛 Troubleshooting

### Badge não aparece
- Verificar se `include/fim.php` inclui `notificacoes_badge.php`
- Verificar se `sis003c_notificacoes` tem registros
- Abrir F12 Console e checar erros

### Toast não aparece
- Verificar se `notificacoes_toast.php` está incluído
- Tentar: `ToastNotification.info('Teste', 'Funcionando?');`

### Notificações não atualizam
- Verificar se polling está ativo (F12 → Network)
- Verificar resposta de `get_notificacoes_nao_lidas.php`
- Checar se usuário tem preferências configuradas (notificacaotodas=1)

---

## 📅 Próximos Passos

- [ ] Criar trigger SQL para auto-inserir em `sis003c_notificacoes` quando ocorrência é criada
- [ ] Implementar filtro por Gestor (notificacaogestor)
- [ ] Implementar filtro por Tipo de Alerta (notificacaotipoalerta)
- [ ] Criar página de histórico completo de notificações
- [ ] Implementar WebSocket para tempo real (ao invés de polling)
- [ ] Adicionar som de notificação

---

## 📞 Support

Para dúvidas ou problemas, consulte os arquivos individuais.
