--- name: Cancelar/Trancar/Destrancar Matrícula description: Bugs corrigidos em apiCancelarMatricula, apiTrancarMatricula e apiDestrancarMatricula — uso de $db não inicializado e validationRules rejeitando update parcial type: project originSessionId: 30ca44ac-e884-4293-ab32-57e3f44147be --- ## Bugs corrigidos (2026-04-20) ### 1. `$db` não inicializado em apiCancelarMatricula - Linha ~1074 do `MatriculaController.php` usava `$db->table('lancamentos_financeiros')` sem declarar `$db` - Causava `Undefined variable $db` → catch → "Erro interno do servidor" - **Correção**: `$db = \Config\Database::connect();` antes do uso ### 2. Model::update() rejeita updates parciais em matriculas - `MatriculaModel::$validationRules` exige `aluno_id`, `curso_id`, `professor_id`, `sala_id`, `data_inicio`, `meses`, `valor_mensal` como required - Ao fazer `$this->matriculaModel->update($id, ['status' => 'cancelada'])` a validação falha - Mesmo problema documentado em `aula_edicao_conflitos.md` para AulaModel - **Correção**: usar `$db->table('matriculas')->where('id', $id)->update($data)` direto ### 3. Campos de trancamento fora de allowedFields - Colunas `data_trancamento`, `motivo_trancamento`, `data_destrancamento`, `dias_trancados` existem no banco (migration 2026-02-03-200000) mas NÃO estão em `MatriculaModel::$allowedFields` - `Model::update()` silenciosamente ignora esses campos mesmo se a validação passasse - **Correção**: usar `$db->table()` direto (bypassa allowedFields) ### 4. Aulas com status 'suspensa' - `AulaModel::$validationRules` tem `status => in_list[agendada,em_andamento,concluida,cancelada,falta_professor,falta_aluno]` - 'suspensa' não está na lista — setar via Model falharia - **Correção**: usar `$db->table('aulas')` direto para mudar status de aulas **Why:** Os 3 endpoints (cancelar/trancar/destrancar) davam "Erro interno do servidor" combinando esses 4 problemas. O padrão de `$db->table()` direto já está estabelecido no projeto. **How to apply:** Sempre que precisar fazer update parcial em `matriculas` ou `aulas` no controller, usar `$db = \Config\Database::connect(); $db->table('xxx')->where(...)->update(...)`. Nunca usar `$this->matriculaModel->update()` ou `$this->aulaModel->update()` para updates parciais. ### Rotas afetadas - `POST /api/matricula/cancelar/{id}` e `/api/cancelar-matricula/{id}` - `POST /api/matricula/trancar/{id}` e `/api/trancar-matricula/{id}` - `POST /api/matricula/destrancar/{id}` e `/api/destrancar-matricula/{id}`