Criou página com '= Fase 2 = <br> == Escopo == <br> * 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. <br> == Requisitos Funcionais == <br> == Requisitos Não-Funcionais == <br> == Melhores P...'
 
 
(74 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 9: Linha 9:


== Requisitos Funcionais ==
== Requisitos Funcionais ==
<br>
=== Fase 1 - 2025-1 ===
<br>
* RF01 - Cadastro
** O sistema deve permitir que o aluno realize o cadastro com nome, e-mail, matrícula e senha 
<br>
* RF02 - Login
** O sistema deve permitir que o usuário realize login na plataforma utilizando seus dados, para ter uma experiencia customizada
<br>
* 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.
<br>
* 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
<br>
* RF05 - Selecionar disciplinas 
** O sistema deve permitir que o usuário selecione e peça a matrícula das disciplinas que ele desejar
<br>
* 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
<br>
* RF07 - Validar Pré-requisitos
** O sistema deve validar os pré-requisitos antes de permitir a matrícula em uma disciplina
<br>
* RF08 - Verificar carga horária
** O sistema deve verificar a carga mínima e máxima permitida
<br>
* RF09 - Disponibilidade de vagas
** O sistema deve informar ao aluno a disponibilidade de vagas nas disciplinas selecionadas
<br>
Personalização de Grade
<br>
* RF10 - Preferencias de horários
** O sistema deve permitir que o aluno defina preferencias de horários e dias livres
<br>
* 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
<br>
'''Ajuste e Modificação '''
<br>
* 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
<br>
* 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
<br>
<br>


== Requisitos Não-Funcionais ==
== Requisitos Não-Funcionais ==
<br>
<br>
* RNF01 - Interface Amigável ['''Usabilidade''']
** O sistema deve possuir uma interface intuitiva e de fácil uso para estudantes sem conhecimento técnico.
<br>
* RNF02 - Responsividade
** A interface deve ser responsiva, permitindo o uso em diferentes dispositivos (computadores, tablets e smartphones).
<br>
* RNF03 - Disponibilidade
** O sistema deve ter uma disponibilidade de 99,5%, garantindo que os alunos possam acessar a qualquer momento
<br>
* RNF04 - Auto-Recuperação
** Deve possuir um mecanismo de recuperação automática em caso de falha.
<br>
* RNF05 - Tempo de Resposta ['''Desempenho ''']
** O sistema deve processar a simulação da grade curricular em no máximo 2 segundos.
<br>
* 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
<br>
* RNF07 - Legalmente dentro dos padrões
** O sistema deve estar em conformidade com a legislação vigente sobre proteção de dados (LGPD).
<br>
* RNF08 - Criptografia de Dados
** Os dados dos usuários devem ser armazenados de forma criptografada.
<br>
* RNF09 - Suporte para Atualizações ['''Distribuição''']
** Deve oferecer suporte para atualizações automáticas sem perda de dados.
<br>
* 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.
<br>
* RNF11 - Sistema Operacional ['''Hardware e software''']
** O sistema deve ser compatível com servidores Linux e Windows.
<br>
=== Fase 2 - 2025-2 ===
<br>
<b>
*Banco de Dados College Helper
</b>
Este script SQL cria toda a estrutura do banco de dados utilizada pelo sistema College Helper. Ele define o schema principal (college_helper) e todas as tabelas responsáveis por armazenar informações de cursos, disciplinas, requisitos, horários, usuários e alunos.
Além disso, estabelece relacionamentos entre as entidades (incluindo chave estrangeira, deleções em cascata e validações), cria as extensões necessárias (como pgcrypto para gerar UUIDs) e garante regras importantes, como validação de perfis de usuário e integridade referencial da grade horária.
Esse conjunto de tabelas forma a base para funcionalidades como cadastro de disciplinas, montagem automática de horários, gestão de requisitos e administração de contas de estudantes e administradores dentro do sistema.
<br>
--
<b>create schema if not exists "college_helper";</b>
<b>CREATE TABLE if not exists college_helper.curso </b>
<pre>
    id SERIAL PRIMARY KEY,
    nome TEXT NOT NULL,
    coordenador TEXT,
    codigo_do_curso BIGINT UNIQUE
</pre>
<b>CREATE TABLE if not exists college_helper.disciplina </b>
<pre>
    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
</pre>
<b>CREATE TABLE if not exists college_helper.disciplina_requisito</b>
<pre>
    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)
</pre>
<b>CREATE TABLE if not exists college_helper.horario_aula</b>
<pre>
    id SERIAL PRIMARY KEY,
    dia_semana INT NOT NULL,  -- 1 a 7
    hora_inicio TIME NOT NULL,
    hora_fim TIME NOT NULL
</pre>
<b>CREATE TABLE if not exists college_helper.disciplina_horario</b>
<pre>
    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)
</pre>
<b>create extension if not exists pgcrypto;</b>
<b>create table if not exists college_helper.usuario</b>
<pre>
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'))
</pre>
<b>CREATE TABLE if not exists college_helper.aluno</b>
<pre>
    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
</pre>
<b>CREATE TABLE if not exists college_helper.grade_horaria</b>
<pre>
    id SERIAL PRIMARY KEY,
    aluno_id INT UNIQUE REFERENCES college_helper.aluno(id) ON DELETE CASCADE
</pre>
<b>CREATE TABLE if not exists college_helper.grade_horaria_disponibilidade</b>
<pre>
    grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE,
    horario INTEGER NOT NULL,
    PRIMARY KEY (grade_id, horario)
</pre>
<b>CREATE TABLE if not exists college_helper.grade_horaria_preferencia</b>
</pre>
    grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE,
    horario INTEGER NOT NULL,
    PRIMARY KEY (grade_id, horario)
</pre>
<b>CREATE TABLE if not exists college_helper.grade_horaria_disciplina</b>
<pre>
    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)
</pre>
<b>-- Creates a user</b>
<b>-- if the role is from "ESTUDANTE" or "ADMIN", the DB will prevent the insertion</b>
<pre>
insert into college_helper.usuario(nome, email, hash_senha, perfil) values ('Paulo Oliveira', 'paulo@email.com', '123123123', 'ADMIN');
select * from college_helper.usuario;
</pre>


== Melhores Práticas ==
== Melhores Práticas ==
<br>
<br>
<b>1) Uso de modelos Pydantic, garantindo padronização validação e conversão dos dados</b>
<b>
* class TimeSlot(BaseModel):
</b>
<pre>
    start: str
    end: str
</pre>
*<b>class DaySchedule(BaseModel):</b>
<pre>
    day: str
    available: bool
    timeSlots: List[TimeSlot]
</pre>
*<b>class UploadedSubject(BaseModel):</b>
<pre>
    name: str
    schedule: str
    credits: int
    difficulty: int
</pre>
*<b>class FormData(BaseModel):</b>
<pre>
    subjectCount: int
    preferenceStrategy: str
    prioritizeDependencies: bool
    includeSaturday: bool
    weeklySchedule: List[DaySchedule]
    additionalNotes: Optional[str] = ""
    uploadedSubjects: List[UploadedSubject]
    totalAvailableHours: float
</pre>
<b>2) Padrão de Nome Snake Case</b>
def normalize(lst):
async def submit_preferences(form_data: FormData):
getCollegeGradeFromFile(subjects_list)
<b>3) Documentação por modulo:</b>
*<b>CHATGPT INTEGRATION MODULE</b>
<pre>
This module provides AI-powered subject advisory services using OpenAI's ChatGPT.
</pre>
<b>4) Separação de servidores, front e back rodam separados</b>
<b>5) Nomenclatura auto explicativa</b>
<pre>
const [showPassword, setShowPassword] = useState(false)
const [isLoading, setIsLoading] = useState(false)
const [error, setError] = useState("")
const [success, setSuccess] = useState("")
</pre>
<b>6) Tratamento de erros</b>
<pre>
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.")
    }
  }
}
</pre>
= CRONOGRAMA =
<br>
{| class="wikitable"
|-
! 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 || 100%
|-
| x || 24/11/2025 || TeckWeek ||
|-
| 7 || 01/12/2025 || Melhores Práticas || 100%
|-
| 8 || 01/12/2025 || RF01: Modelar o BD || 100%
|-
| 9 || 01/12/2025  || RF02:  Criar o BD || 100%
|-
| 10 || 01/12/2025 || RF03: Criar autenticação da aplicação || 80%
|-
| 11 || 15/12/2025 || Segunda Entrega ||
|-
| 12 || 02/02/2026 || Desenvolver 4o RF || 100%
|-
| 13 || || RF04: Criar tela de resultados pós upload da grade horária ||
|-
| 14 || || Incrementar diferencial tecnológico ||
|-
| 15 || 19/12/2025 || Cliente aguardando vídeo demo ||
|-
|}
{| class="wikitable"
|-
! Item !! Data !! Atividades CollegeHelper!! Responsável
|-
| 1 || 09/02/2026 || xx ||
|-
| 2 || 23/02/2026 || xx ||
|-
| 3 || 02/03/2026 || xx ||
|-
| 4 || 09/03/2026 || xx ||
|-
| 5 || 16/03/2026 || xx ||
|-
|}

Edição atual tal como às 20h55min de 9 de fevereiro de 2026

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


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.


Fase 2 - 2025-2


  • Banco de Dados College Helper

Este script SQL cria toda a estrutura do banco de dados utilizada pelo sistema College Helper. Ele define o schema principal (college_helper) e todas as tabelas responsáveis por armazenar informações de cursos, disciplinas, requisitos, horários, usuários e alunos.

Além disso, estabelece relacionamentos entre as entidades (incluindo chave estrangeira, deleções em cascata e validações), cria as extensões necessárias (como pgcrypto para gerar UUIDs) e garante regras importantes, como validação de perfis de usuário e integridade referencial da grade horária.

Esse conjunto de tabelas forma a base para funcionalidades como cadastro de disciplinas, montagem automática de horários, gestão de requisitos e administração de contas de estudantes e administradores dentro do sistema.

--

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;

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.")
    }
  }
}

CRONOGRAMA


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 100%
x 24/11/2025 TeckWeek
7 01/12/2025 Melhores Práticas 100%
8 01/12/2025 RF01: Modelar o BD 100%
9 01/12/2025 RF02: Criar o BD 100%
10 01/12/2025 RF03: Criar autenticação da aplicação 80%
11 15/12/2025 Segunda Entrega
12 02/02/2026 Desenvolver 4o RF 100%
13 RF04: Criar tela de resultados pós upload da grade horária
14 Incrementar diferencial tecnológico
15 19/12/2025 Cliente aguardando vídeo demo
Item Data Atividades CollegeHelper Responsável
1 09/02/2026 xx
2 23/02/2026 xx
3 02/03/2026 xx
4 09/03/2026 xx
5 16/03/2026 xx