diff --git a/GEMINI.md b/GEMINI.md index 49f0674..2edd6d2 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -19,6 +19,12 @@ > Ao realizar a migração completa dos dados do sistema legado 'schoodat' para o nosso banco de dados local Postgres, **é terminantemente proibido alterar, resetar ou re-hashear as senhas existentes.** > As credenciais devem ser mantidas exatamente como estão para garantir que o acesso dos usuários não seja interrompido. +## 🚨 Regras de Fluxo de Trabalho (CRÍTICO) + +> [!CAUTION] +> **Git Push Proibido Sem Demanda Explícita:** +> NUNCA execute `git add`, `git commit` ou `git push` sem que o USUÁRIO solicite explicitamente. Alterações devem ser feitas nos arquivos, mas o envio ao repositório remoto é uma ação exclusiva do usuário. Aguarde sempre o comando direto do usuário para realizar qualquer operação de versionamento. + ## 📜 Padrões de Desenvolvimento 1. **Design System:** Estética Premium, Dark Mode por padrão (ou glassmorphism), micro-animações e ausência de placeholders. 2. **Segurança:** Todas as rotas sensíveis devem validar o token JWT local (via secrets do ambiente). Proibido usar Supabase SDK para lógica de autenticação ou sincronização no frontend. diff --git a/MEMORY.md b/MEMORY.md index 00b54d9..8ac7d8f 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -1,5 +1,7 @@ # MEMORY.md - Contexto de Desenvolvimento +> **🚨 REGRA ABSOLUTA:** NUNCA execute `git add/commit/push` sem que o usuário peça explicitamente. Alterações nos arquivos são livres, mas versionamento é ação EXCLUSIVA do usuário. + ## 📅 Estado Atual (30/04/2026) - [x] **Automação de Mensagens (Cron Jobs):** Implementados dois disparadores independentes (`preventivo` e `atrasado`) via `node-cron`. @@ -10,8 +12,10 @@ - [x] **Auto-Initialization DB:** Script de boot que garante a existência das colunas `overdue_warnings_count` e `last_overdue_warning_at` na tabela `alunos_cobrancas`. - [x] **Correção de Crash no Portal:** Resolvido erro de `.toFixed()` que quebrava as abas de "Avaliações" e "Notas" devido ao retorno de tipos `NUMERIC` do PostgreSQL como strings. - [x] **Persistência de UI (Mensagens):** Integrada chamada ao `updateData` ao salvar agendamentos, garantindo que o estado do toggle não seja perdido ao trocar de aba no Manager. +- [x] **Sincronização de Boletim (Provas):** Adicionada validação rigorosa no Manager (`Exams.tsx`) para impedir a publicação de provas sem vínculo com `subjectId` e `periodId`. Inserido alerta visual para provas legadas desconectadas, garantindo que as notas feitas no Portal sejam corretamente injetadas no Boletim. - [ ] Próximo Passo: Monitorar o log de disparos automáticos (`[Cron]`) e validar a taxa de entrega via Evolution API. + ## 📅 Histórico Anterior (22/04/2026) - [x] Correção do "Bug da Tela Preta" na câmera ao alternar para câmera traseira no celular. diff --git a/manager/components/Exams.tsx b/manager/components/Exams.tsx index f55cb76..988f02b 100644 --- a/manager/components/Exams.tsx +++ b/manager/components/Exams.tsx @@ -1,6 +1,6 @@ import React, { useState, useRef } from 'react'; import { SchoolData, Exam, Question } from '../types'; -import { FileText, Plus, Search, BookOpen, Upload, Trash2, ArrowLeft, Save, CheckCircle, Image as ImageIcon, X, RefreshCw, Lock, Unlock } from 'lucide-react'; +import { FileText, Plus, Search, BookOpen, Upload, Trash2, ArrowLeft, Save, CheckCircle, Image as ImageIcon, X, RefreshCw, Lock, Unlock, AlertTriangle } from 'lucide-react'; import { uploadExamImage } from '../services/supabase'; import { useDialog } from '../DialogContext'; import { dbService } from '../services/dbService'; @@ -165,7 +165,16 @@ const Exams: React.FC = ({ data, updateData }) => { if (!editingExam) return; if (!editingExam.title || !editingExam.classId) { - alert('Preencha o título e a turma antes de salvar.'); + showAlert('Atenção', 'Preencha o título e a turma antes de salvar.', 'warning'); + return; + } + + if (status === 'published' && (!editingExam.subjectId || !editingExam.periodId)) { + showAlert( + 'Vínculo Obrigatório', + 'Para PUBLICAR a avaliação e permitir que as notas entrem no Boletim Escolar, você precisa vincular uma Disciplina e um Período.', + 'warning' + ); return; } @@ -266,7 +275,9 @@ const Exams: React.FC = ({ data, updateData }) => { />
- + -

Vincule a uma disciplina do Boletim Escolar para lançar notas automaticamente.

+

Obrigatório para Publicar. A nota irá automaticamente para o boletim.

- + -

Vincule a um período para que a nota apareça no campo correto do boletim.

+

Obrigatório para Publicar. Define em qual coluna do boletim a nota entra.

@@ -536,6 +549,17 @@ const Exams: React.FC = ({ data, updateData }) => { {(data.periods || []).find(p => p.id === exam.periodId)?.name || '—'}

)} + + {/* ALERTA DE BOLETIM */} + {exam.status === 'published' && (!exam.subjectId || !exam.periodId) && ( +
+ +

+ Boletim Desconectado!
+ As notas desta avaliação não aparecerão no boletim do aluno porque faltou vincular a Disciplina ou o Período. Edite a prova para corrigir. +

+
+ )}