Skip to content
This repository was archived by the owner on Jul 26, 2019. It is now read-only.

Commit

Permalink
Adicionar suporte a pre-matriculas e listagem de pre-matriculas
Browse files Browse the repository at this point in the history
  • Loading branch information
danielmapar committed Dec 5, 2017
1 parent 1209260 commit a5f3e46
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 28 deletions.
22 changes: 22 additions & 0 deletions server/controllers/pre_matricula.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,32 @@
import PreMatriculaService from '../services/pre_matricula';

export default {

buscarPreMatriculas(req, res) {
return PreMatriculaService
.buscarPreMatriculas(req.user.id_aluno)
.then(preMatriculas => res.status(200).send(preMatriculas))
.catch(error => res.status(400).send(error));
},

registrarPreMatricula(req, res) {
return PreMatriculaService
.registrarPreMatricula(req.user, req.params.id_disciplina, req.body.turma, req.body.status)
.then(disciplinas => res.status(200).send(disciplinas))
.catch(error => res.status(400).send(error));
},

disciplinasDisponiveis(req, res) {
return PreMatriculaService
.disciplinasDisponiveis(req.user)
.then(disciplinas => res.status(200).send(disciplinas))
.catch(error => res.status(400).send(error));
},

disciplinaDisponivel(req, res) {
return PreMatriculaService
.disciplinasDisponiveis(req.user, req.params.id_disciplina)
.then(disciplina => res.status(200).send(disciplina))
.catch(error => res.status(400).send(error));
},
};
9 changes: 8 additions & 1 deletion server/models/configuracao.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,16 @@ export default (sequelize, DataTypes) => {
primaryKey: true,
type: DataTypes.INTEGER(11),
},
texto_inicial: DataTypes.STRING(10000),
somente_veterano: DataTypes.BOOLEAN,
sistema_ativo: DataTypes.BOOLEAN,

texto_inicial: DataTypes.STRING(10000),
texto_pagina_fila_espera: DataTypes.STRING(10000),
texto_pagina_fila_nivelamento: DataTypes.STRING(10000),
texto_pagina_vaga_disponivel: DataTypes.STRING(10000),
texto_popup_fila_espera: DataTypes.STRING(10000),
texto_popup_fila_nivelamento: DataTypes.STRING(10000),
texto_popup_vaga_disponivel: DataTypes.STRING(10000),
}, {
tableName: 'configuracao_cadastro',
timestamps: false,
Expand Down
12 changes: 6 additions & 6 deletions server/models/pre_matricula.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@ export default (sequelize, DataTypes) => {
primaryKey: true,
type: DataTypes.INTEGER(10),
},
aluno_cpf: DataTypes.STRING(15),
nome_curso: DataTypes.STRING(45),
id_curso: DataTypes.INTEGER(11),
turma: DataTypes.STRING(100),
status: DataTypes.STRING(45),
data_modificado: DataTypes.DATE,
cpf_aluno: DataTypes.STRING(15),
nome_disciplina: DataTypes.STRING(100),
id_disciplina: DataTypes.INTEGER(11),
turno: DataTypes.STRING(100),
veterano: DataTypes.BOOLEAN,
vaga_garantida: DataTypes.BOOLEAN,
fila_nivelamento: DataTypes.BOOLEAN,
fila_espera: DataTypes.BOOLEAN,
fila_de_nivelamento: DataTypes.BOOLEAN,
fila_de_espera: DataTypes.BOOLEAN,
nome_aluno: DataTypes.STRING(100),
id_aluno: DataTypes.INTEGER(11),
}, {
Expand Down
5 changes: 4 additions & 1 deletion server/routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@ export default (app) => {
app.get('/', (req, res) => {
res.send({ apiAtiva: true });
});
// requerAutenticacaoJWT,
app.get('/usuario/disciplinasDisponiveis', requerAutenticacaoJWT, PreMatriculaController.disciplinasDisponiveis);
app.get('/usuario/disciplinaDisponivel/:id_disciplina', requerAutenticacaoJWT, PreMatriculaController.disciplinaDisponivel);
app.post('/usuario/registrarPreMatricula/:id_disciplina', requerAutenticacaoJWT, PreMatriculaController.registrarPreMatricula);
app.get('/usuario/buscarPreMatriculas', requerAutenticacaoJWT, PreMatriculaController.buscarPreMatriculas);

app.get('/configuracao', ConfiguracaoController.buscar);
app.get('/cursos', CursoController.lista);
app.post('/usuario/cadastrar', AlunoController.cadastrar);
Expand Down
21 changes: 21 additions & 0 deletions server/services/curso.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,27 @@ import BD from '../models';
const { Curso, Disciplina, DisciplinaPreRequisito } = BD;

export default class CursoService {
static listarDisciplina(idDisciplina) {
return Curso
.findAll({
include: [{
model: Disciplina,
as: 'disciplinas',
include: [{
model: DisciplinaPreRequisito,
as: 'pre_disciplinas',
}],
}],
where: {
'$Curso.status$': 1,
'$disciplinas.status$': 1,
'$disciplinas.id_disciplina$': idDisciplina,
},
})
.then(cursos => cursos)
.catch(error => error);
}

static listarTodos() {
return Curso
.findAll({
Expand Down
16 changes: 15 additions & 1 deletion server/services/disciplina.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import Sequelize from 'sequelize';

import BD from '../models';

const { DisciplinaPreRequisito, DataFuncionamento, Aluno, Periodo, Turma,
Expand All @@ -17,7 +19,18 @@ export default class DisciplinaService {
});
}

static buscarEmCurso(idAluno) {
static atualizarTotalDeVagas(idDisciplina, campo) {
const values = {};
values[campo] = Sequelize.literal(`${campo} + 1`);
return Disciplina.update(values,
{ where: { id_disciplina: idDisciplina } });
}

static buscarEmCurso(idAluno, idDisciplina) {
let filtroDisciplina = {};
if (idDisciplina) {
filtroDisciplina = { id_disciplina: idDisciplina };
}
return Periodo.findOne({
include: [{
model: Turma,
Expand All @@ -40,6 +53,7 @@ export default class DisciplinaService {
{
model: Disciplina,
as: 'disciplina',
where: filtroDisciplina,
include: [{
model: DisciplinaPreRequisito,
as: 'proximas_disciplinas',
Expand Down
91 changes: 72 additions & 19 deletions server/services/pre_matricula.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import BD from '../models';
import BD, { criar } from '../models';
import DesciplinaService from './disciplina';
import AlunoService from './aluno';
import CursoService from './curso';
Expand All @@ -13,46 +13,85 @@ const STATUS = {
};

const TURMAS = {
PRIMEIRO: '8:00 - 10:00',
SEGUNDO: '10:30 - 12:30',
PRIMEIRA: '8:00 - 10:00',
SEGUNDA: '10:30 - 12:30',
};

export default class PreMatriculaService {
static buscarTurmasValidos(turmaPreMatriculas) {
const turmasDisponiveis = [];
if (!turmaPreMatriculas.Manha) {
turmasDisponiveis.push(TURMAS.PRIMEIRO);
if (!turmaPreMatriculas.PRIMEIRA) {
turmasDisponiveis.push(TURMAS.PRIMEIRA);
}
if (!turmaPreMatriculas.Tarde) {
turmasDisponiveis.push(TURMAS.SEGUNDO);
if (!turmaPreMatriculas.SEGUNDA) {
turmasDisponiveis.push(TURMAS.SEGUNDA);
}
return turmasDisponiveis;
}

static criarMapaPreMatricula(preMatriculas) {
const turmaPreMatriculas = {};
preMatriculas.forEach((preMatricula) => {
if (preMatricula.turma === TURMAS.PRIMEIRO) {
turmaPreMatriculas.Manha = preMatricula;
} else if (preMatricula.turma === TURMAS.SEGUNDO) {
turmaPreMatriculas.Tarde = preMatricula;
if (preMatricula.turma === TURMAS.PRIMEIRA) {
turmaPreMatriculas.PRIMEIRA = preMatricula;
} else if (preMatricula.turma === TURMAS.SEGUNDA) {
turmaPreMatriculas.SEGUNDA = preMatricula;
}
});
return turmaPreMatriculas;
}

static disciplinasDisponiveis(aluno) {
static registrarPreMatricula(aluno, idDisciplina, turma, status) {
return PreMatriculaService.disciplinasDisponiveis(aluno, idDisciplina).then((disciplina) => {
// Disciplina esta disponivel para pre matricula
if (disciplina &&
disciplina[idDisciplina] &&
disciplina[idDisciplina].status === status &&
disciplina[idDisciplina].turmas.indexOf(turma) > -1) {
const preMatricula = {
data_modificado: new Date(),
numero_comprovante: `${idDisciplina}${aluno.id_aluno}`,
turma,
id_aluno: aluno.id_aluno,
cpf_aluno: aluno.cpf,
nome_aluno: aluno.nome_aluno,
id_disciplina: idDisciplina,
nome_disciplina: disciplina[idDisciplina].nome,
veterano: disciplina[idDisciplina].veterano,
vaga_garantida: disciplina[idDisciplina].status === STATUS.VAGA_NO_CURSO,
fila_de_nivelamento: disciplina[idDisciplina].status === STATUS.FILA_DE_NIVELAMENTO,
fila_de_espera: disciplina[idDisciplina].status === STATUS.FILA_DE_ESPERA,
status: 'Ativo',
};
return criar(PreMatricula, preMatricula).then((preMatriculaRet) => {
let promise = null;
if (preMatricula.vaga_garantida) {
promise = DesciplinaService.atualizarTotalDeVagas(preMatriculaRet.id_disciplina, 'vagas_do_curso');
} else if (preMatricula.fila_de_nivelamento) {
promise = DesciplinaService.atualizarTotalDeVagas(preMatriculaRet.id_disciplina, 'fila_de_nivelamento');
} else if (preMatricula.fila_de_espera) {
promise = DesciplinaService.atualizarTotalDeVagas(preMatriculaRet.id_disciplina, 'fila_de_espera');
}
return promise.then(() => preMatriculaRet);
});
}
throw new Error('Disciplina indisponível para cadastro!');
});
}

static disciplinasDisponiveis(aluno, idDisciplina) {
return ConfiguracaoService.buscar().then((configuracao) => {
if (configuracao.somente_veterano) {
return PreMatriculaService.disciplinasDisponiveisSomenteVeteranos(aluno);
return PreMatriculaService.disciplinasDisponiveisSomenteVeteranos(aluno, idDisciplina);
}
return PreMatriculaService.disciplinasDisponiveisTodos(aluno);
return PreMatriculaService.disciplinasDisponiveisTodos(aluno, idDisciplina);
});
}

static disciplinasDisponiveisTodos(aluno) {
static disciplinasDisponiveisTodos(aluno, idDisciplina) {
const idadeAluno = AlunoService.calcularIdade(new Date(aluno.data_nascimento));
let turmaPreMatriculas = {};
let preMatriculasIds = [];

return PreMatriculaService.buscarPreMatriculas(aluno.id_aluno)
.then((preMatriculas) => {
Expand All @@ -62,14 +101,19 @@ export default class PreMatriculaService {
}
// Buscar pre cadastros previamente realizados
turmaPreMatriculas = PreMatriculaService.criarMapaPreMatricula(preMatriculas);
preMatriculasIds = preMatriculas.map(preMatricula => preMatricula.id_disciplina);

if (idDisciplina) {
return CursoService.listarDisciplina(idDisciplina);
}
return CursoService.listarTodos();
}).then((cursos) => {
const disciplinas = {};
cursos.forEach((curso) => {
curso.disciplinas.forEach((disciplina) => {
let status = null;
if (idadeAluno >= disciplina.idade_minima) {
if (idadeAluno >= disciplina.idade_minima &&
preMatriculasIds.indexOf(disciplina.id_disciplina) === -1) {
if (disciplina.total_vagas_do_curso > disciplina.vagas_do_curso &&
disciplina.pre_disciplinas.length === 0) {
status = STATUS.VAGA_NO_CURSO;
Expand All @@ -84,6 +128,8 @@ export default class PreMatriculaService {
disciplinas[disciplina.id_disciplina] = {
status,
turmas: PreMatriculaService.buscarTurmasValidos(turmaPreMatriculas),
nome: disciplina.nome_disciplina,
veterano: false,
};
}
});
Expand All @@ -98,7 +144,7 @@ export default class PreMatriculaService {
}).catch(error => error);
}

static disciplinasDisponiveisSomenteVeteranos(aluno) {
static disciplinasDisponiveisSomenteVeteranos(aluno, idDisciplina) {
const idadeAluno = AlunoService.calcularIdade(new Date(aluno.data_nascimento));

return PreMatriculaService.buscarPreMatriculas(aluno.id_aluno)
Expand All @@ -109,8 +155,9 @@ export default class PreMatriculaService {
}
// Buscar pre cadastros previamente realizados
const turmaPreMatriculas = PreMatriculaService.criarMapaPreMatricula(preMatriculas);
const preMatriculasIds = preMatriculas.map(preMatricula => preMatricula.id_disciplina);

return DesciplinaService.buscarEmCurso(aluno.id_aluno).then((periodo) => {
return DesciplinaService.buscarEmCurso(aluno.id_aluno, idDisciplina).then((periodo) => {
if (!periodo) {
return {};
}
Expand All @@ -133,20 +180,24 @@ export default class PreMatriculaService {
// Descorbrir se o proximo curso tem vagas diretas, ou vagas na fila de espera
const disciplinasComVagasNoCurso = turma.disciplina.proximas_disciplinas
.filter(({ disciplina }) =>
preMatriculasIds.indexOf(disciplina.id_disciplina) === -1 &&
disciplina.total_vagas_do_curso > disciplina.vagas_do_curso &&
idadeAluno >= disciplina.idade_minima)
.map(({ disciplina }) => (
{
...disciplina.dataValues,
status: STATUS.VAGA_NO_CURSO,
turmas: PreMatriculaService.buscarTurmasValidos(turmaPreMatriculas),
nome: disciplina.nome_disciplina,
veterano: true,
}
));
const disciplinasComFilasDeEspera = turma.disciplina.proximas_disciplinas
.filter(({ disciplina }) =>
disciplinasComVagasNoCurso.filter(disciplinaComVagasNoCurso =>
disciplina.id_disciplina === disciplinaComVagasNoCurso.id_disciplina,
).length === 0 &&
preMatriculasIds.indexOf(disciplina.id_disciplina) === -1 &&
disciplina.total_fila_de_espera > disciplina.fila_de_espera &&
idadeAluno >= disciplina.idade_minima,
)
Expand All @@ -155,6 +206,8 @@ export default class PreMatriculaService {
...disciplina.dataValues,
status: STATUS.FILA_DE_ESPERA,
turmas: PreMatriculaService.buscarTurmasValidos(turmaPreMatriculas),
nome: disciplina.nome_disciplina,
veterano: true,
}
));

Expand All @@ -181,7 +234,7 @@ export default class PreMatriculaService {
return PreMatricula.findAll({
where: {
id_aluno: idAluno,
vaga_garantida: true,
status: 'Ativo',
},
}).then((preMatriculas) => {
if (!preMatriculas) {
Expand Down

0 comments on commit a5f3e46

Please sign in to comment.