Commit 621f35df authored by Matheus Horstmann's avatar Matheus Horstmann 🐴

Merge branch 'refatora-backend' into 'development'

arruma pesquisa por curso

See merge request !42
parents e2bb9772 128046e6
......@@ -18,6 +18,7 @@ ds.automigrate(lbTables, function(err) {
loadModelFromOldDB(old_db.get_salas, app.models.Sala, LOG_CREATE),
loadModelFromOldDB(old_db.get_blocos, app.models.Bloco, LOG_CREATE),
loadModelFromOldDB(old_db.get_Tipodesala, app.models.Tipodesala, LOG_CREATE),
loadModelFromOldDB(old_db.get_professores, app.models.Professor, LOG_CREATE),
criaUsuario,
criaSecretario,
criaRoles,
......@@ -28,7 +29,6 @@ ds.automigrate(lbTables, function(err) {
criaSemestre,
criaTurmas,
criaHorarios,
loadModelFromOldDB(old_db.get_professores, app.models.Professor, LOG_CREATE),
loadModelFromOldDB(old_db.get_departamentos, app.models.Departamento, LOG_CREATE),
loadModelFromOldDB(old_db.get_setores, app.models.Setor, LOG_CREATE),
loadModelFromOldDB(old_db.get_disciplinas, app.models.Disciplina, LOG_CREATE),
......@@ -146,7 +146,7 @@ function criaTurmas(cb){
{
"disciplinaCod":"ci055",
"data_inicio":"2019-02-26T13:58:50.150Z",
"semestre": "2018/1",
"semestre": "2017/1",
"data_fim":"2019-02-26T13:58:50.150Z",
"codigo": "t3",
"organizador":"a",
......@@ -159,7 +159,7 @@ function criaTurmas(cb){
"disciplinaCod":"ci055",
"data_inicio":"2019-02-26T13:58:50.150Z",
"data_fim":"2019-02-26T13:58:50.150Z",
"semestre": "2018/1",
"semestre": "2017/1",
"codigo": "t4",
"organizador":"a",
"vagas":49,
......@@ -168,10 +168,13 @@ function criaTurmas(cb){
"periodo": 1
},
], function(err, turmas){
turmas[0].horarios.add(1);
turmas[1].horarios.add(2);
turmas[2].horarios.add(3);
turmas[3].horarios.add(4);
var _professores = ["CI065A","elias","albini","agregio"]
var _cursos = ["21A","96A","23A","21A"]
for(var i=0; i<turmas.length; i++) {
turmas[i].horarios.add(i+1)
turmas[i].professores.add(_professores[i])
turmas[i].cursos.add(_cursos[i])
}
cb(err);
}.bind(this));
}
......
*.json
\ No newline at end of file
[ {"nome":"Mesae Carteira"}, {"nome":"Carteira com Braço"}, {"nome":"Mesa estilo Prancheta"}, {"nome":"Anfiteatro"}, {"nome":"Laboratório"}, {"nome":"Laboratório de Química"}, {"nome":"Laboratório de Pesquisa"}, {"nome":"Laboratório de Informática"}, {"nome":"Laboratório de Elétrica"}, {"nome":"Gabinete de Professor"}, {"nome":"Bancadas"}, {"nome":"Mesa de reunião e cadeiras "}, {"nome":"Laboratório de Fisioterapia"}, {"nome":"Laboratório de Anatomia"}, {"nome":"Laboratório de Microscópios"}, {"nome":"Laboratório de Tribologia"} ]
......@@ -6,16 +6,19 @@ module.exports = function(Departamento) {
var _query = {ilike:"%"+query+"%"}
//como o é utilizado somente o código da sala, não precisa incluir a
//relacao sala
var _include = {turmas:["professor","disciplina","cursos","horarios"]}
var _include = {
"relation": "turmas",
"scope": {
"where": {"merged": false},
"include": ["professores","disciplina","cursos","horarios"]
}
}
//var _include = {turmas:["professor","disciplina","cursos",{horarios:["sala"]}]}
var dpts = await app.models.Departamento.find({where:
{or: [ {nome: _query},
{codigo: _query} ]},include:_include})
// TODO
return dpts
};
};
......@@ -23,24 +23,53 @@ module.exports = function(Disciplina) {
Disciplina.search = async function(query) {
var _query = {ilike:"%"+query+"%"}
var disciplinas = await app.models.Disciplina.find({where: {or: [{nome: _query}, {codigo: _query}]}});
var turmas = [];
for (var i=0; i< disciplinas.length; i++) {
var disciplina = disciplinas[i]
var t = await disciplina.turmas.find();
for (var j=0; j< t.length; j++) {
var horarios = await t[j].horarios.find();
var professor = await t[j].professor.get()
var curso = await t[j].cursos.get()
turmas.push({"turma":t[j],
"horarios":horarios,
"professor":professor,
"curso":curso,
"disciplina":disciplina}
);
var _include = {
"relation": "turmas",
"scope": {
"where": {"merged": false},
"include": ["professores","disciplina","cursos","horarios"]
}
}
return turmas
var disciplinas = await app.models.Disciplina.find({where:
{or: [{nome: _query},
{codigo: _query}]}, include:_include});
return disciplinas
//for (var i=0; i< disciplinas.length; i++) {
// var disciplina = disciplinas[i]
// var t = await disciplina.turmas.find({where:{merged:false}});
// for (var j=0; j< t.length; j++) {
// // verifica se a turma foi unida com outra
// var turmas_merged = await app.models.Turma.find({where: {"mergedCod":t[j].id}})
// var cursos = []
// var cursos_nome = []
// if (turmas_merged) {
// for(var k=0; k<turmas_merged.length; k++) {
// var _curso = await turmas_merged[k].cursos.get()
// if(_curso) {
// cursos.push(_curso)
// cursos_nome.push(_curso.nome)
// }
// }
// }
// var curso = await t[j].cursos.get()
// cursos.push(curso)
// if ( curso)
// cursos_nome.push( curso.nome)
// // remove cursos duplicados
// var cursos_uniq = [... new Set( cursos)]
// var cursos_nome_uniq = [... new Set( cursos_nome)]
// var horarios = await t[j].horarios.find();
// var professores = await t[j].professores.find()
// turmas.push({"turma":t[j],
// "horarios":horarios,
// "professores":professores,
// "curso_str":cursos_nome_uniq.join(", "),
// "cursos":cursos_uniq,
// "disciplina":disciplina}
// );
// }
//}
};
......
......@@ -20,7 +20,6 @@ module.exports = function(Horario) {
// Create an array with the codes of turmas
// If the turma is not related with horario_id, then the code
console.log("Horarios -----------------")
// is an empty string
for(var h in horarios_turma){
//for(var h=0; h < horarios_turma.length; h++){
......@@ -72,6 +71,7 @@ module.exports = function(Horario) {
for(var i=0; i< turmas.length; i++) {
var t = turmas[i];
var horarios_turma;
var cursos_turma = await t.cursos.find()
if (turmas[i].horarios_list)
horarios_turma = turmas[i].horarios_list;
else {
......@@ -84,7 +84,7 @@ module.exports = function(Horario) {
if(horario.id == horario_id) {
codes.push(t.codigo);
vagas += t.vagas;
cursos.push(t.cursos);
cursos.push(cursos_turma[0]);
if(horario_id % 100 == 0)
console.log(horario_id)
}
......@@ -99,7 +99,7 @@ module.exports = function(Horario) {
var curso = "21A";
var bloco_cod = "";
if(cursos && cursos[0]) {
curso = await cursos[0].get()
curso = cursos[0]
if(curso) {
var bloco = await curso.bloco.get()
curso = curso.codigo
......
......@@ -19,6 +19,10 @@
"type": "string",
"required": true
},
"data": {
"type": "date",
"required": false
},
"livre": {
"type": "boolean",
"required": true
......
......@@ -15,6 +15,7 @@ var models = [
'Equivalenciadisciplina',
'Evento',
'Turma',
'Reserva',
'Recursodesala',
'SalaRecursodesala',
'DisciplinaRecursodesala',
......@@ -33,6 +34,8 @@ var models = [
"FileUploadError",
"FileUploadFileUploadError",
"TurmaHorario",
"TurmaProfessor",
"TurmaCurso",
];
......
......@@ -33,11 +33,6 @@
"type": "belongsTo",
"model": "Departamento",
"foreignKey": "departamentoCod"
},
"turmas": {
"type": "hasMany",
"model": "Turma",
"foreignKey": "turmaId"
}
},
"acls": [
......
'use strict';
var app = require('../../server/server');
// repeticao está ativa, logo tem que verificar se horario final da
// repeticao, tipo da repeticao e se horario final é maior que horario
// inicial
function verifica_repeticao(reserva) {
if(reserva.repetir) {
if(!reserva.hasOwnProperty("repeticao_final"))
return {"msg":"O horário final da repeticão está ausente","code":4}
if(!reserva.hasOwnProperty("tipo_repeticao"))
return {"msg":"tipo de repeticao está ausente","code":4}
if(reserva.horario_inicio >= reserva.repeticao_final)
return {"msg":"horario final da repetição é menor que o horario inicial da reserva.","code":4}
}
return {"code":0}
}
// cria uma reserva
async function create_reserva(sala,departamento,reserva) {
console.log( "create reserva")
var _reserva = await app.models.Reserva.create({
"codigo":reserva.codigo,
"repetir": reserva.repetir,
"tipo_repeticao":reserva.tipo_repeticao,
"dia": reserva.dia,
"inicio_repeticao":reserva.horario_inicio,
"organizador": reserva.organizador,
"departamentoCod": departamento.codigo,
"motivo": reserva.motivo,
"salaCod": sala.codigo,
"vagas": reserva.vagas,
"fim-repeticao": reserva.repeticao_final
})
// horarios
var horarios = []
if (reserva.repetir) {
var dia_final = new Date(reserva.repeticao_final)
for (var i = new Date(reserva.dia); i < dia_final; i.setDate(i.getDate() + reserva.tipo_repeticao) )
var dia = new Date(i)
horarios.push({
"data": new Date(dia),
"dia": dia.getDay(),
"horario_inicial": reserva.horario_inicio,
"horario_final": reserva.horario_fim,
"livre": true // o que diabos é esse atributo?
})
}
else {
var data = new Date(reserva.data)
horarios.push({
"data": data,
"dia": data.getDay(),
"horario_inicial": reserva.horario_inicio,
"horario_final": reserva.horario_fim,
"salaCod": sala.codigo,
"livre": true // o que diabos é esse atributo?
})
}
console.log("horarios",horarios)
// verifica se horario estão disponiveis
return "ola"
}
// atualiza uma reserva
async function update_reserva(sala,departamento,_reserva,reserva) {
console.log( "update resreva")
return "oi"
}
function verifica_hora(reserva) {
// horario inicial
var data_inicio = new Date(reserva.data)
var time_inicial = reserva.horario_inicio.split(":")
data_inicio.setHours(time_inicial[0])
data_inicio.setMinutes(time_inicial[1])
// horario final
var data_fim = new Date(reserva.data)
var time_fim = reserva.horario_fim.split(":")
data_fim.setHours(time_fim[0])
data_fim.setMinutes(time_fim[1])
// verifica se horario de inicio é menor que horario de fim
if(data_inicio >= data_fim)
return {"msg":"O horário inicial é maior ou igual ao horario final","code":3}
return {"code":0}
}
module.exports = function(Reserva) {
/**
* faz a reserva de uma sala
* @param {object} reserva objeto com informaçoes da reserva
* @param {Function(Error, object)} callback
*/
Reserva.reservar = async function(reserva, callback) {
// verificar se todos os campos mininos estão no objeto de entrada
// verificar se a sala e o departamento existem
// verificar se data de inicio é menor que a data de fim
// verificar se o booleano de repeticao está ativo, se sim então verificar
// se a data de fim da repeticao e o tipo da repeticao existem no objeto de
// entrada
// criar reservar, e horarios. sendo a quantidade de horarios variavel de
// acordo com a quantidade de repeticao. iterar 23
// faz a validação dos dados, em duas partes, primeiro verificando se todos
// os campos existem e depois checando se campos chaves como cala e
// departamento existem na base de dados
// verifica se os seguintes campos existem no objeto de entrada:
// codigo
// motivo
// observacao
// sala
// horario inicio
// horario fim
// dia
// departamento
if (!reserva.hasOwnProperty("vagas") )
return {"mgs":"vagas ausente no formulário", "code":1}
if (!reserva.hasOwnProperty("codigo") )
return {"mgs":"codigo ausente no formulário", "code":1}
if (!reserva.hasOwnProperty("data") )
return {"mgs":"data ausente no formulário", "code":1}
if (!reserva.hasOwnProperty("sala") )
return {"mgs":"sala ausente no formulário", "code":1}
if (!reserva.hasOwnProperty("motivo") )
return {"mgs":"motivo ausente no formulário", "code":1}
if (!reserva.hasOwnProperty("observacao") )
return {"mgs":"observação ausente no formulário", "code":1}
if (!reserva.hasOwnProperty("horario_inicio") )
return {"mgs":"horário de inicio ausente no formulário", "code":1}
if (!reserva.hasOwnProperty("horario_fim") )
return {"mgs":"horário de fim ausente no formulário", "code":1}
if (!reserva.hasOwnProperty("departamento") )
return {"mgs":"departamento ausente no formulário", "code":1}
// verifica se sala passa como parametro consta na base de dados
var sala = await app.models.Sala.findById(reserva.sala)
if(!sala)
return {"mgs":"A sala "+ reserva.sala+" não existe", "code":2}
// verifica se o departamento passado como parametro consta na base de dados
var departamento = await app.models.Departamento.findById(reserva.departamento)
if(!departamento)
return {"mgs":"O departamento "+ reserva.departamento+" não existe", "code":2}
// verifica se o horario inicial é menor que o horario final
var result_verifica_hora = verifica_hora(reserva)
if(result_verifica_hora.code)
return result_verifica_hora
// verifica informações de repeticao, se estiver ativo então as informações
// devem está consistente, caso contrário retorna um erro
var repeticao = verifica_repeticao(reserva)
if(repeticao.code)
return repeticao // existe algum erro na informações de repeticao
// verifica se o codigo da reserva existe na base de dados, se sim então
// atualiza as informações, caso contrário cria uma nova instancia na base
// de dados
var _reserva = await app.models.Reserva.findById(reserva.codigo)
if(_reserva)
return await update_reserva(sala,departamento,_reserva,reserva)
return await create_reserva(sala,departamento,reserva)
};
};
{
"name": "Reserva",
"plural": "reservas",
"base": "Evento",
"idInjection": false,
"properties": {
"codigo": {
"type": "String",
"id": true,
"required": true,
"length": 64
},
"repetir": {
"type": "boolean",
"default": false
},
"tipo_repeticao": {
"type": "integer"
},
"incio_repeticao": {
"type": "date"
},
"dia": {
"type": "date"
},
"motivo":{
"type": "string"
},
"observacao": {
"type": "string"
},
"fim-repeticao": {
"type": "date"
}
},
"validations": [],
"relations": {
"departamento": {
"type": "belongsTo",
"model": "Departamento",
"foreignKey": "departamentoCod"
},
"departamento": {
"type": "belongsTo",
"model": "Sala",
"foreignKey": "salaCod"
}
},
"acls": [],
"methods": {
"reservar": {
"accepts": [
{
"arg": "reserva",
"type": "object",
"required": true,
"description": "objeto com informaçoes da reserva"
}
],
"returns": [
{
"arg": "response",
"type": "object",
"root": false,
"description": "não sei ainda o que vou retornar"
}
],
"description": "faz a reserva de uma sala",
"http": [
{
"path": "/reservar",
"verb": "post"
}
]
}
}
}
......@@ -21,7 +21,7 @@ module.exports = function(Semestre) {
};
Semestre.deletesemestre = async function(semestreId) {
var status = {"status": "ok"};
var _status = {"msg": "ok"};
var semestre = await Semestre.findById(semestreId)
var turmas = await semestre.turmas.find() //obtem todas as turmas do semestre
// itera a lista de semestre, removendo os horarios e a turma
......@@ -34,11 +34,13 @@ module.exports = function(Semestre) {
await turma.horarios.destroyAll()
turma.destroy()
}
// remove o arquivo
fileupload = await semestre.fileUploads.get( )
fileupload.destroy( )
semestre.destroy()
return status;
// remove o arquivo, caso ele exista
if(semestre.fileUploads) {
fileupload = await semestre.fileUploads.get( )
fileupload.destroy()
}
await semestre.destroy()
return _status;
};
......
......@@ -49,8 +49,11 @@ module.exports = function(Turma) {
async function check_disciplina(t1,t2) {
var disciplina_x = t1.disciplina.get()
var disciplina_y = t2.disciplina.get()
//var equivalencias_x = await disciplina_x.getEquivalencias()
//console.log(equivalencias_x)
if (disciplina_x.codigo == disciplina_y.codigo)
return true;
var equivalencias_x = await disciplina_x.getEquivalencias()
console.log(equivalencias_x)
//if (Array.isArray(equivalencias_x)) {
// for(var i=0; i < equivalencias_x.length; i++)
// if (equivalencias_x[i].codigo == disciplina_y.codigo)
......@@ -60,8 +63,6 @@ module.exports = function(Turma) {
// if (disciplina_y.codigo == equivalencias_x.codigo)
// return true;
//}
if (disciplina_x.codigo == disciplina_y.codigo)
return true;
return false;
}
......@@ -71,14 +72,12 @@ module.exports = function(Turma) {
return {"status":0, "msg": "Lista de turmas vazia"}
var turmas = await get_turmas(_turmas);
console.log(turmas)
turmas.map(async (i)=>{
var horarios = await i.horarios.find()
var disciplina = await i.disciplina.get()
console.log("Horarios: ",horarios,"disciplina: ",disciplina)
});
var turma_x = turmas[0];
console.log("turma x antes",turma_x)
var turmas_to_merged = []
for(var j=1; j < turmas.length; j++) {
var turma_y = turmas[j];
......@@ -103,9 +102,25 @@ module.exports = function(Turma) {
for (var i = 0; i < turmas_to_merged.length; i++) {
turma_y = turmas_to_merged[i]
turma_x.vagas += turma_y.vagas
turma_y.horarios.destroyAll()
// atualiza os horarios da turma y para invisivel
var horarios_turma_y = await turma_y.horarios.find()
for(var j = 0; j < horarios_turma_y.length; j++) {
var _horario_y = horarios_turma_y[j]
await _horario_y.updateAttribute("visible",false);
}
}
turma_y.destroy()
turma_y.updateAttribute("merged",true)
turma_y.updateAttribute("mergedCod",turma_x.id)
//adiciona os cursos da turma y na turma x
var cursos_y = await turma_y.cursos.find()
cursos_y.map((curso)=>{turma_x.cursos.add(curso.codigo)})
//adiciona os professores da turma y na turma x
var professores_y = await turma_y.professores.find()
professores_y.map((professor)=>{turma_x.professores.add(professor.codigo)})
turma_x.save()
return turmas;
......@@ -178,28 +193,109 @@ module.exports = function(Turma) {
return {"status":3,"msg":"união de horarios feita com sucesso"};
};
// dado uma lista de valores de um atributo verifica se a instancia do
// modelo possui os mesmos valores, caso exista um valor que o modelo possui
// e a lista não possui, então é removido do modelo esse valor
// atribute_name nome do atributo ex: cursos
// list_value: lista de valores ex: ["21A","96A"]
// list_value_model: valores do modelo: turma.cursos = ["21A"]
// atribute_index: chave primaria do atributo ex: codigo
// model: modelo no qual será feito as operaçoes ex: turma
async function check_atribute(relation_name,atribute_name,list_value,list_value_model,atribute_index,_model) {
console.log("Modelo: ",atribute_name)
//console.log("lista model: ",list_value_model)
console.log("tamanho: ",list_value_model.length)
for(var j=0; j<list_value_model.length; j++) {
var is_presence = false
for(var i=0; i<list_value.length; i++) {
// verifica se o codigo fornecido pelo usuário é de algum modelo
// no banco de dados
var relation_value = await app.models[relation_name].findById(list_value[i])
if (!relation_value || relation_value == list_value_model[j][atribute_index])
is_presence = true
}
if(!is_presence) // quer dizer que um elemento não está presente nas duas lista, logo tem que ser removido
await _model[atribute_name].remove(list_value_model[j][atribute_index])
}
}
/**
* cria ou atualiza turma
* @param {object} turma turma a ser inserida, contendo horarios
* @param {Function(Error, object)} callback
*/
Turma.create = async function(turma) {
var status;
console.log("turma entrada: ",turma)
return turma;
Turma.create_turma = async function(turma) {
//verifica se existe o campo id, se sim encontra modelo correspondente,
//caso contrário cria
var _turma = await app.models.Turma.findOrCreate({where:{id:turma._id}},turma);
console.log("_turma: ",_turma)
for(var i=0; i< turma.horarios.length; i++) {
var horario = await app.models.Horario.findOrCreate({where:turma.horarios[i]},turma.horarios[i]);
console.log("horario: ",horario);
for (var j=0; j<horario.length; j++)
await _turma[0].horarios.add(horario[j])
var _turma = null
// se estiver definido _id ou id então busca o modelo e faz o replace, caso contrario cria
if(turma._id || turma.id)
_turma = await app.models.Turma.replaceById((turma._id)? turma._id : turma.id,turma)
else
_turma = await app.models.Turma.create(turma)
if(!_turma) // se _turma for nulo então ocorreu algum erro ao tentar buscar ou criar o modelo
return {"code":1, "msg": "erro ao tentar criar ou atualizar a turma"}
if(turma.horarios) {
var horarios_turma = await _turma.horarios.find()
// cria ou atualiza os horarios do input do usuário
var horarios = []
var horarios_value = []
for(var h=0; h < turma.horarios.length; h++) {
var horario = turma.horarios[h]
var result = null
if(horario.id || horario._id)
result = await app.models.Horario.replaceById((horario._id)? horario._id : horario.id, horario)
else
result = await app.models.Horario.create(horario)
horarios_value.push(result.id)
horarios.push(result)
}
await check_atribute("Horario","horarios",horarios_value,horarios_turma,"id",_turma)
horarios.map(async (horario)=>{
if(horario)
await _turma.horarios.add(horario.id)
})
}
//adiciona ou atualiza a lista de cursos da associado a turmas
if(turma.cursosCod) {
// remove todos os cursos
var cursos_turma = await _turma.cursos.find()
await check_atribute("Curso","cursos",turma.cursosCod,cursos_turma,"codigo",_turma)
await turma.cursosCod.map(async (curso)=>{
var _curso = await app.models.Curso.findById(curso)
if(_curso)
await _turma.cursos.add(_curso.codigo)
})
}
// adiciona ou atualiza a lista de cursos associados a turmas
if(turma.professoresCod) {
// remove todos os professores
var professores_turma = await _turma.professores.find()
await check_atribute("Professor","professores",turma.professoresCod,professores_turma,"codigo",_turma)
await turma.professoresCod.map(async (professor)=>{
var _professor = await app.models.Professor.findById(professor)
if (_professor)
await _turma.professores.add(_professor.codigo)
})
}
await _turma.save( )
return status
return _turma
};
......
......@@ -41,20 +41,22 @@
"model": "Semestre",
"foreignKey": "semestre"
},
"professor": {
"type": "belongsTo",
"model": "Professor",
"foreignKey": "professorCod"
},
"cursos": {