Fase 2


Escopo


  • Desenvolver um aplicativo para uso dos universitários da faculdade UFU (Universidade Federal de Uberlândia), no qual seja possível definir a grade horária mais compatível com o aluno de acordo com o curso que o mesmo está matriculado e as matérias que ainda estão disponíveis para matrícula, baseando-se na rotina definida pelo aluno.


Requisitos Funcionais


Fase 1 - 2025-1


  • RF01 - Cadastro
    • O sistema deve permitir que o aluno realize o cadastro com nome, e-mail, matrícula e senha


  • RF02 - Login
    • O sistema deve permitir que o usuário realize login na plataforma utilizando seus dados, para ter uma experiencia customizada


  • RF03 - Recuperação de senha
    • O sistema deve permitir que o usuário recupere sua senha perdida por meio de um e-mail secundário ou número de telefone
Grade Curricular: requisitos que se relacionam e interagem com disciplinas, horários, matrícula, carga horária, pré-requisitos em disciplinas. 


  • RF04 - Listar disciplinas disponíveis
    • O sistema deve exibir a lista de disciplinas disponíveis para o semestre atual, deixando para que o usuário escolha entre elas


  • RF05 - Selecionar disciplinas
    • O sistema deve permitir que o usuário selecione e peça a matrícula das disciplinas que ele desejar


  • RF06 - Verificar conflitos entre disciplinas
    • O sistema deve verificar e alertar o usuário de possíveis conflitos de horário ao selecionar as disciplinas desejadas


  • RF07 - Validar Pré-requisitos
    • O sistema deve validar os pré-requisitos antes de permitir a matrícula em uma disciplina


  • RF08 - Verificar carga horária
    • O sistema deve verificar a carga mínima e máxima permitida


  • RF09 - Disponibilidade de vagas
    • O sistema deve informar ao aluno a disponibilidade de vagas nas disciplinas selecionadas


Personalização de Grade 


  • RF10 - Preferencias de horários
    • O sistema deve permitir que o aluno defina preferencias de horários e dias livres


  • RF11 - Opções diferentes de grade curricular
    • O sistema deve permitir que o aluno visualize diferentes opções de grades antes de confirmar a escolha


Ajuste e Modificação 


  • RF12 - Edição da grade
    • sistema deve permitir que o aluno modifique sua grade, adicionando ou removendo disciplinas dentro do período de ajuste acadêmico


  • RF13 - Exclusão de disciplinas
    • O sistema deve alertar o aluno caso o trancamento ou exclusão de uma disciplina comprometa a progressão ou organização da grade


Fase 2 - 2025-2

  • create schema if not exists "college_helper";

CREATE TABLE if not exists college_helper.curso 
(
    id SERIAL PRIMARY KEY,
    nome TEXT NOT NULL,
    coordenador TEXT,
    codigo_do_curso BIGINT UNIQUE
);

CREATE TABLE if not exists college_helper.disciplina (

   id SERIAL PRIMARY KEY,
   nome TEXT NOT NULL,
   carga_horaria INTEGER NOT NULL,
   periodo TEXT,
   nome_professor TEXT,
   curso_id INT REFERENCES college_helper.curso(id) ON DELETE SET NULL

);

CREATE TABLE if not exists college_helper.disciplina_requisito (

   disciplina_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE,
   requisito_id  INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE,
   PRIMARY KEY (disciplina_id, requisito_id)

);

CREATE TABLE if not exists college_helper.horario_aula (

   id SERIAL PRIMARY KEY,
   dia_semana INT NOT NULL,  -- 1 a 7
   hora_inicio TIME NOT NULL,
   hora_fim TIME NOT NULL

);

CREATE TABLE if not exists college_helper.disciplina_horario (

   disciplina_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE,
   horario_id INT NOT NULL REFERENCES college_helper.horario_aula(id) ON DELETE CASCADE,
   PRIMARY KEY (disciplina_id, horario_id)

);

create extension if not exists pgcrypto; create table if not exists college_helper.usuario( id UUID primary key default gen_random_uuid(), nome text not null, email text not null, hash_senha text not null, perfil text not null constraint valid_roles check (perfil in ('ESTUDANTE', 'ADMIN')) );

CREATE TABLE if not exists college_helper.aluno (

   id SERIAL PRIMARY KEY,
   nome TEXT NOT NULL,
   matricula TEXT NOT NULL,
   data_nascimento DATE,
   periodo TEXT,
   curso_id INT REFERENCES college_helper.curso(id) ON DELETE SET null,
   usuario_id uuid not null references college_helper.usuario(id) on delete cascade

);

CREATE TABLE if not exists college_helper.grade_horaria (

   id SERIAL PRIMARY KEY,
   aluno_id INT UNIQUE REFERENCES college_helper.aluno(id) ON DELETE CASCADE

);

CREATE TABLE if not exists college_helper.grade_horaria_disponibilidade (

   grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE,
   horario INTEGER NOT NULL,
   PRIMARY KEY (grade_id, horario)

);

CREATE TABLE if not exists college_helper.grade_horaria_preferencia (

   grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE,
   horario INTEGER NOT NULL,
   PRIMARY KEY (grade_id, horario)

);

CREATE TABLE if not exists college_helper.grade_horaria_disciplina (

   grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE,
   disciplina_id INT REFERENCES college_helper.disciplina(id) ON DELETE CASCADE,
   PRIMARY KEY (grade_id, disciplina_id)

);

-- Creates a user -- if the role is from "ESTUDANTE" or "ADMIN", the DB will prevent the insertion insert into college_helper.usuario(nome, email, hash_senha, perfil) values ('Paulo Oliveira', 'paulo@email.com', '123123123', 'ADMIN'); select * from college_helper.usuario;

Requisitos Não-Funcionais


  • RNF01 - Interface Amigável [Usabilidade]
    • O sistema deve possuir uma interface intuitiva e de fácil uso para estudantes sem conhecimento técnico.


  • RNF02 - Responsividade
    • A interface deve ser responsiva, permitindo o uso em diferentes dispositivos (computadores, tablets e smartphones).


  • RNF03 - Disponibilidade
    • O sistema deve ter uma disponibilidade de 99,5%, garantindo que os alunos possam acessar a qualquer momento


  • RNF04 - Auto-Recuperação
    • Deve possuir um mecanismo de recuperação automática em caso de falha.


  • RNF05 - Tempo de Resposta [Desempenho ]
    • O sistema deve processar a simulação da grade curricular em no máximo 2 segundos.


  • RNF06 - Atualização em Tempo Real [Desempenho]
    • A integração com o sistema deve ocorrer em tempo real, garantindo informações atualizadas sobre disciplinas e vagas Segurança


  • RNF07 - Legalmente dentro dos padrões
    • O sistema deve estar em conformidade com a legislação vigente sobre proteção de dados (LGPD).


  • RNF08 - Criptografia de Dados
    • Os dados dos usuários devem ser armazenados de forma criptografada.


  • RNF09 - Suporte para Atualizações [Distribuição]
    • Deve oferecer suporte para atualizações automáticas sem perda de dados.


  • RNF10 - Orientação a Objetos [Padrões]
    • O código deve ser feito totalmente orientado a objetos, sendo a linguagem de escolha C#, para maior compatibilidade com as demais ferramentas já utilizadas e para maior escalabilidade.


  • RNF11 - Sistema Operacional [Hardware e software]
    • O sistema deve ser compatível com servidores Linux e Windows.


Melhores Práticas



1) Uso de modelos Pydantic, garantindo padronização validação e conversão dos dados

  • class TimeSlot(BaseModel):

    start: str
    end: str
  • class DaySchedule(BaseModel):
    day: str
    available: bool
    timeSlots: List[TimeSlot]
  • class UploadedSubject(BaseModel):
    name: str
    schedule: str
    credits: int
    difficulty: int
  • class FormData(BaseModel):
    subjectCount: int
    preferenceStrategy: str
    prioritizeDependencies: bool
    includeSaturday: bool
    weeklySchedule: List[DaySchedule]
    additionalNotes: Optional[str] = ""
    uploadedSubjects: List[UploadedSubject]
    totalAvailableHours: float

2) Padrão de Nome Snake Case

def normalize(lst): async def submit_preferences(form_data: FormData): getCollegeGradeFromFile(subjects_list)

3) Documentação por modulo:


  • CHATGPT INTEGRATION MODULE
This module provides AI-powered subject advisory services using OpenAI's ChatGPT.

4) Separação de servidores, front e back rodam separados

5) Nomenclatura auto explicativa

const [showPassword, setShowPassword] = useState(false)
const [isLoading, setIsLoading] = useState(false)
const [error, setError] = useState("")
const [success, setSuccess] = useState("")

6) Tratamento de erros


catch (err) {
  if (err instanceof Error) {
    if (err.message.includes("401")) {
      setError("Invalid email or password.")
    } else if (err.message.includes("500")) {
      setError("Server error.")
    } else if (err.message.includes("fetch")) {
      setError("Unable to connect to server.")
    } else {
      setError(err.message || "An unexpected error occurred.")
    }
  }
}

Evolução do projeto


Item Data College Helper Realizado
1 14/11/2025 Documentar Investigação e Visão 100%
2 14/11/2025 Criar Diagramas Comp/Implantação 100%
3 14/11/2025 Definir Proposta de Projeto 100%
4 14/11/2025 Validar Visão do Usuário 100%
5 17/11/2025 Especificar RFs e RNFs - Fase 2 100%
6 17/11/2025 RF01: Modelar o BD 80%
7 01/12/2025 Melhores Práticas
8 01/12/2025 RF01: Modelar o BD
9 RF02: Criar o BD
10 Desenvolver 3o RF
11 Desenvolver 4o RF
12 Incrementar diferencial tecnológico