Commit e69a1b53 authored by Matheus Horstmann's avatar Matheus Horstmann 🐴

Odair mergeturma

parent ec8e8bed
......@@ -177,29 +177,29 @@ function criaHorarios(cb){
{
livre: false,
dia:2,
horario_inicial:1,
horario_final:2,
horario_inicial:"15:30:00",
horario_final:"17:30:00",
ensalamentoId:1
},
{
livre: false,
dia:3,
horario_inicial:1,
horario_final:2,
horario_inicial:"15:30:00",
horario_final:"17:30:00",
ensalamentoId:1
},
{
livre: false,
dia:4,
horario_inicial:1,
horario_final:2,
horario_inicial:"15:30:00",
horario_final:"17:30:00",
ensalamentoId:1
},
{
livre: false,
dia:2,
horario_inicial:1,
horario_final:2,
horario_inicial:"15:30:00",
horario_final:"17:30:00",
ensalamentoId:1
}
], function(err, horarios){
......
......@@ -31,9 +31,11 @@ Disciplina.search = async function(query) {
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}
);
}
......
......@@ -87,6 +87,13 @@
"principalId": "admin",
"permission": "ALLOW",
"property": "*"
},
{
"accessType": "EXECUTE",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW",
"property": "search"
}
],
"methods": {
......@@ -142,7 +149,7 @@
"arg": "query",
"type": "string",
"required": true,
"description": "palavra chave para a pesquisa",
"description": "query",
"http": {
"source": "query"
}
......@@ -153,14 +160,14 @@
"arg": "turmas",
"type": "array",
"root": false,
"description": "lista de turmas da disciplina"
"description": "turmas"
}
],
"description": "pesquisa por uma disciplina, retorna turmas",
"description": "pesquisa por turma ",
"http": [
{
"path": "/search",
"verb": "post"
"verb": "get"
}
]
}
......
......@@ -12,9 +12,17 @@ var app = require('../../server/server');
const {Ensalador, EnsaladorPart, Schedule, ScheduleCollection, Room, RoomColection, CurrentSchedule} = require(path.resolve(__dirname,'../../bin/ensalador/ensalador.js'));
// Convert an instance of Horario into an Schedule (Ensalador) instance
// TODO<Odair M. odairmario45@gmail.com>: refatorar essa função, o ensalador
// utiliza os campos log e lat para decidir qual é a melhor sala. Idealmente
// toas as turmas de um curso deve ser ensalado perto do centro geográfico do
// curso. Mas da forma como foi modelado o banco, um horario pode está
// relacionado a multiplas turmas de multiplos cursos, que torna inviavel
// ensalar próximo do curso. Como alternativa a curto prazo, será utilizado a
// localização do curso da primeira turma do horario.
function getScheduleInstance(h, cb){
var Horario = app.models.Horario;
Horario.getCode(h.id, (err,horarioCode) => {
console.log(horarioCode);
if(err) return cb(err,null);
Horario.getTotalSize(h.id, (err,horarioSize) => {
if(err) return cb(err,null);
......@@ -23,12 +31,14 @@ function getScheduleInstance(h, cb){
code: horarioCode,
id: h.id,
day: h.dia,
ini: h.horario_inicial,
end: h.horario_final,
ini: parseInt(h.horario_inicial),
end: parseInt(h.horario_final),
size: horarioSize,
type: 1,
department: "d",
course: "c",
department: "informatica",
log: -49.2322392,
lat: -25.450472,
course: "21A",
klass_id: 1
});
cb(null,schedule);
......@@ -103,6 +113,9 @@ module.exports = function(Ensalamento) {
// yaml new files
rooms.save();
schedules.save();
console.log("---------------- schedule -----------------------")
console.log(schedules)
console.log("-------------------------------------------------")
var dataCurrent = schedules.toJSON().schedules.map(s =>{
return new Schedule(s)
});
......
......@@ -26,6 +26,13 @@
},
"status": {
"type": "string"
},
"completed": {
"type": "number",
"default": 0,
"postgresql": {
"dataType": "real"
}
}
},
"validations": [],
......
......@@ -25,6 +25,10 @@
},
"motivo": {
"type": "string"
},
"visible": {
"type": "boolean",
"default": true
}
},
"validations": [],
......
'use strict';
var app = require('../../server/server');
module.exports = function(Professor) {
/**
* search turma by professor query
* @param {string} query query
* @param {Function(Error, array)} callback
*/
Professor.search = async function(query) {
var turmas = [];
var _query = {ilike:"%"+query+"%"}
var professores = await app.models.Professor.find({where: {or: [
{nome: _query},
{codigo: _query},
{email: _query},
{website: _query}
]}})
for (var i=0; i< professores.length; i++) {
var professor = professores[i];
var t = await professor.turmas.find();
for (var j=0; j < t.length; j++) {
var horarios = await t[j].horarios.find();
var disciplina = await t[j].disciplina.get();
turmas.push({"turma":t[j],
"horarios":horarios,
"disciplina": disciplina,
"professor": professor}
)
}
}
return turmas
};
};
......@@ -52,6 +52,13 @@
"principalId": "admin",
"permission": "ALLOW",
"property": "*"
},
{
"accessType": "EXECUTE",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW",
"property": "search"
}
],
"methods": {}
......
......@@ -5,6 +5,7 @@ const async = require('async');
const { fork } = require('child_process');
const loopback = require('loopback');
const Disciplina = app.models.Disciplina;
const DEBUG = true
module.exports = function(Turma) {
Turma.validatesPresenceOf('disciplinaCod');
......@@ -19,7 +20,6 @@ module.exports = function(Turma) {
var _turmas = [];
for(var i=0; i < turmas.length ; i++) {
var turma = turmas[i];
console.log(turma);
var t = await app.models.Turma.findById(turma.id)
_turmas.push(t);
}
......@@ -106,10 +106,103 @@ module.exports = function(Turma) {
turma_y.horarios.destroyAll()
}
turma_y.destroy()
console.log("turma x depois",turma_x)
turma_x.save()
return turmas;
};
async function check_horario_merge(horarios) {
var horarios_iguais = true
var horario = horarios[0].horario
for (var i=1; i<horarios.length && horarios_iguais; i++) {
var _horario = horarios[i]
if (DEBUG)
console.log("Comparacao de horario merge: horario e _horario ",horario,_horario)
if (_horario.horario.horario_inicial != horario.horario_inicial ||
_horario.horario.horario_final != horario.horario_final ||
_horario.horario.dia != horario.dia)
horarios_iguais = false;
}
return horarios_iguais;
}
//itera todas as turmas e todos os horarios, para verificar se existe
//alguma turma com relação com horario
async function check_exist_turma(allturmas,horario) {
for (var i=0; i<allturmas.length; i++) {
var horarios_turma = allturmas[i];
for (var j=0; j<horarios_turma; j++) {
if (horarios_turma[j].id == horario.id)
return true;
}
}
return false;
}
/**
* juntar dois horarios de turmas diferentes
* @param {array} horarios array de objetos horarios, incluindo turma
* @param {Function(Error, object)} callback
*/
Turma.mergehorario = async function(horarios) {
var status = {"status":0, "msg":"inicio"};
var horarios_m = {};
var _horarios = []
for (var i = 0; i < horarios.length; i++) {
var h = horarios[i]
var _horario = await app.models.Horario.findById(h.id);
var t = await app.models.Turma.findById(h.turma);
_horarios.push({"horario":_horario,"turma":t});
}
if (_horarios.length <= 1)
return {"status":1, "msg":"lista de horarios possui menos de dois horarios"}
// verifica se todos os horarios são no mesmo dia e possui a mesma hora
// de inicio e fim. se sim então une, caso contrário retorna mensagem
// dizendo que os horarios são diferentes
if (!check_horario_merge(_horarios))
return {"status":2, "msg":"horarios são divergentes no dia ou hora de inicio ou fim"}
var allturmas = await app.models.Turma.find({include:{relation:"horarios"}})
// faz a uniao
var horario = _horarios[0];
for(var i=1; i < _horarios.length; i++ ) {
var h = _horarios[i];
await h.turma.horarios.remove(h.horario); //remove a relação de horario i com turma i
await h.turma.horarios.add(horario.horario) // adiciona a relação do horario 0 com a turma i
// verifica se o horario i possui alguma relação com alguma turma,
// se não tiver então deleta
if(!check_exist_turma(allturmas,h.horario))
h.horario.destroy();
}
return {"status":3,"msg":"união de horarios feita com sucesso"};
};
/**
* 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;
//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])
}
return status
};
};
......@@ -18,6 +18,10 @@
"data_fim": {
"type": "date",
"required": true
},
"merged": {
"type": "boolean",
"default": false
}
},
"validations": [],
......@@ -46,6 +50,11 @@
"type": "belongsTo",
"model": "Curso",
"foreignKey": "cursoCod"
},
"turmasMergeds": {
"type": "hasMany",
"model": "Turma",
"foreignKey": "mergedCod"
}
},
"acls": [
......@@ -99,6 +108,56 @@
"verb": "post"
}
]
},
"mergehorario": {
"accepts": [
{
"arg": "horarios",
"type": "array",
"required": true,
"description": "array de objetos horarios, incluindo turma"
}
],
"returns": [
{
"arg": "status",
"type": "object",
"root": false,
"description": "status de retorno"
}
],
"description": "juntar dois horarios de turmas diferentes",
"http": [
{
"path": "/mergehorario",
"verb": "post"
}
]
},
"create": {
"accepts": [
{
"arg": "turma",
"type": "object",
"required": true,
"description": "turma a ser inserida, contendo horarios"
}
],
"returns": [
{
"arg": "status",
"type": "object",
"root": false,
"description": "objeto de retorno"
}
],
"description": "cria ou atualiza turma",
"http": [
{
"path": "/create",
"verb": "put"
}
]
}
}
}
......@@ -8,20 +8,17 @@
},
"properties": {
"organizador": {
"type": "string",
"required": true
"type": "string"
},
"vagas": {
"type": "number",
"required": true
},
"ano": {
"type": "number",
"required": true
"type": "number"
},
"periodo": {
"type": "string",
"required": true
"type": "string"
}
},
"validations": [],
......
'use strict';
require('events').EventEmitter.defaultMaxListeners = 0;
var loopback = require('loopback');
var boot = require('loopback-boot');
var app = module.exports = loopback();
app.start = function() {
// start the web server
return app.listen(function() {
......
......@@ -96,7 +96,6 @@ async function handle_line(line) {
// enconra curso
var curso = await Curso.findById(row.curso_cod);
console.log(row.curso_cod)
if (!curso) return {"status":true,"msg":"Curso não encontrado","row":row}
//object turma
......@@ -125,6 +124,9 @@ function convert_enconding(file_path) {
fs.writeFile(file_path, output); // write csv converted in file_path
}
function get_completed(line,total_line) {
return (total_line)? Math.round(((100*(line+1)) / total_line)*10) / 10 : 0;
}
async function turma_import(container, file, options, callback) {
var rows = []; // array of line csv
var file_path = path.join(options.root, container,file); // get path of uploaded file
......@@ -137,6 +139,7 @@ async function turma_import(container, file, options, callback) {
csv.fromPath(file_path,{delimiter:';',headers:true}).on("data",function(data) {
rows.push(data); }).on("end", async function(){
// iterate earch row of css, and add course, klass and schedule.
const total_line = rows.length
for (const [line_number, row ] of rows.entries()) {
var result = await handle_line(row);
// write error msg in fileupload
......@@ -147,9 +150,15 @@ async function turma_import(container, file, options, callback) {
"fileUpload":fileupload.id
});
}
if (line_number % 10) {
var completed = get_completed(line_number,total_line);
await fileupload.updateAttribute("completed",completed);
}
}
// change status to finished
await fileupload.updateAttribute("status","Terminado");
await fileupload.updateAttribute("completed",100.0);
});
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment