--- name: Chat de Atendimento description: Chat em tempo real entre aluno (app Flutter) e administração (painel direção) type: project originSessionId: 9f56349d-73d5-48f7-b7da-f744b427bde6 --- Sistema de atendimento implementado em 2026-04-28 ligando o app do aluno ao painel administrativo. **Por que:** demanda do dono — atendimento centralizado dentro do app, sem depender só do WhatsApp. **Estrutura no banco:** - `chat_conversas` — uma por aluno (UNIQUE em aluno_id), guarda contadores `nao_lidas_admin/aluno`, `ultima_mensagem`, `ultima_mensagem_at`, `status` (aberta/arquivada) - `chat_mensagens` — `remetente_tipo` ENUM('aluno','admin'), `remetente_id` (usuario_id), `conteudo`, `lida`, FK para conversa com ON DELETE CASCADE - Migration: `2026-04-28-100000_CreateChatTables.php` **Backend (CodeIgniter 4):** - Models: `ChatConversaModel`, `ChatMensagemModel` — incremento atômico de `nao_lidas_*` ao registrar mensagem - API aluno (filter apiauth): `GET /api/aluno/chat/mensagens`, `POST /api/aluno/chat/enviar`, `GET /api/aluno/chat/status` - Painel direção: `GET /direcao/chat` (página), `GET /direcao/api/chat/conversas|mensagens/{id}|nao-lidas`, `POST /direcao/api/chat/enviar/{id}` - Controller painel: `ChatController.php`. Item de menu "Atendimento" em `Views/layouts/main.php` com badge de não lidas (polling 15s). **Frontend painel (`Views/direcao/chat.php`):** - Layout dois painéis (lista + janela), polling 5s nas mensagens e 8s na lista, marca lidas ao abrir conversa. **App aluno (Flutter):** - `screens/chat_screen.dart` com bolhas, polling 5s, otimista (msg local com `enviando=true` removida ao confirmar) - URLs em `config/api_config.dart`: `chatMensagensUrl`, `chatEnviarUrl`, `chatStatusUrl` - Atalho na home_screen via `_buildAcoesRapidas` **How to apply:** ao mexer no chat sempre considere os contadores de não-lidas (atualizados no `registrar()` e zerados em `marcarLidasParaDestinatario()`). Para deploy, lembrar de subir os 2 controllers, models, migrations, view e atualizar `Routes.php`.