From 9e8d34fe002443b457b0879987540575e5f542cc Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Fri, 24 Apr 2020 14:16:41 -0300
Subject: [PATCH 01/53] [homologa]Added course modifications

---
 src/libs/routes/courseCount.js | 112 +++++++++++++++++++++------------
 1 file changed, 71 insertions(+), 41 deletions(-)

diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 9a7f9d4e..65c17462 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -40,12 +40,8 @@ const config = require(`${libs}/config`);
 
 const addMissing = require(`${libs}/middlewares/addMissing`);
 
-const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
-
 let rqf = new ReqQueryFields();
 
-courseCountApp.use(cache('15 day'));
-
 courseCountApp.get('/upper_adm_dependency', (req, res, next) => {
     req.result = [];
     for(let i = 1; i <= 7; ++i) {
@@ -59,7 +55,8 @@ courseCountApp.get('/upper_adm_dependency', (req, res, next) => {
 
 courseCountApp.get('/years', (req, res, next) => {
     req.sql.from('curso_ens_superior')
-    .field('DISTINCT curso_ens_superior.ano_censo', 'year');
+    .field('DISTINCT curso_ens_superior.ano_censo', 'year')
+    .where('curso_ens_superior.ano_censo > 2010');
     next();
 }, query, response('years'));
 
@@ -81,15 +78,6 @@ courseCountApp.get('/academic_organization', (req, res, next) => {
     next();
 }, response('academic_organization'));
 
-courseCountApp.get('/capital', (req, res, next) => {
-    req.result = [
-        {id: null, name: 'Não Classificado'},
-        {id: 0, name: 'Não'},
-        {id: 1, name: 'Sim'}
-    ];
-    next();
-}, response('capital'));
-
 courseCountApp.get('/ocde_geral', (req, res, next) => {
     req.result = [];
     for(let i = 1; i <= 8; ++i) {
@@ -186,6 +174,13 @@ courseCountApp.get('/university', (req, res, next) => {
     next();
 }, query, response('university'));
 
+courseCountApp.get('/localoffer', (req, res, next) => {
+    req.sql.from('localoferta_ens_superior', 'l')
+    .field('DISTINCT l.nome', 'localoffer_name')
+    .field('l.cod_local_oferta', 'localoffer_id');
+    next();
+}, query, response('localoffer'));
+
 rqf.addField({
     name: 'filter',
     field: false,
@@ -200,8 +195,8 @@ rqf.addField({
     tableField: ['nome', 'id'],
     resultField: ['region_name', 'region_id'],
     where: {
-        relation: '=',
-        type: 'integer',
+        relation: 'LIKE',
+        type: 'string',
         field: 'id'
     },
     join: {
@@ -211,34 +206,51 @@ rqf.addField({
     }
 }).addValue({
     name: 'state',
-    table: 'estado',
-    tableField: ['nome', 'id'],
+    table: 'localoferta_ens_superior',
+    tableField: ['sigla_uf', 'cod_uf'],
     resultField: ['state_name', 'state_id'],
     where: {
         relation: '=',
         type: 'integer',
-        field: 'id'
+        field: 'cod_uf_curso',
+	    table: 'curso_ens_superior'
     },
     join: {
-        primary: 'id',
-        foreign: 'cod_uf_curso',
+        primary: ['ano_censo', 'cod_curso'],
+        foreign: ['ano_censo', 'cod_curso'],
         foreignTable: 'curso_ens_superior'
     }
 }).addValue({
     name: 'city',
-    table: 'municipio',
-    tableField: ['nome', 'id'],
+    table: 'localoferta_ens_superior',
+    tableField: ['nome_municipio', 'cod_municipio'],
     resultField: ['city_name', 'city_id'],
     where: {
         relation: '=',
         type: 'integer',
-        field: 'cod_municipio_curso',
-        table: '@'
+        field: 'cod_curso',
+        table: 'curso_ens_superior'
     },
     join: {
-        primary: 'id',
-        foreign: 'cod_municipio_curso',
-        foreignTable: '@'
+        primary: ['ano_censo', 'cod_curso'],
+        foreign: ['ano_censo', 'cod_curso'],
+        foreignTable: 'curso_ens_superior'
+    }
+}).addValue({
+    name: 'localoffer',
+    table: 'localoferta_ens_superior',
+    tableField: ['cod_ies', 'cod_local_oferta', 'nome'],
+    resultField: ['university_id', 'localoffer_id', 'localoffer_name'],
+    where: {
+	    relation: '=',
+	    type: 'integer',
+	    field: 'cod_curso',
+	    table: 'curso_ens_superior'
+    },
+    join: {
+        primary: ['ano_censo', 'cod_curso'],
+	    foreign: ['ano_censo', 'cod_curso'],
+	    foreignTable: 'curso_ens_superior'
     }
 }).addValue({
     name: 'university',
@@ -270,16 +282,6 @@ rqf.addField({
         type: 'integer',
         field: 'cod_organizacao_academica'
     }
-}).addValue({
-    name:'capital',
-    table: 'curso_ens_superior',
-    tableField: 'tfd_capital_curso',
-    resultField: 'capital_id',
-    where: {
-        relation: '=',
-        type: 'integer',
-        field: 'tfd_capital_curso'
-    }
 }).addValue({
     name:'course',
     table: 'curso_ens_superior',
@@ -416,8 +418,16 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
             .order('curso_ens_superior.ano_censo')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
             .where('curso_ens_superior.cod_nivel_academico = 1');
-    }
-    else {
+    } else if ("localoffer" in req.dims) {
+         req.sql.from('curso_ens_superior')
+            .field('curso_ens_superior.ano_censo')
+            .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
+            .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
+            .where('curso_ens_superior.cod_nivel_academico = 1')
+            .group('curso_ens_superior.ano_censo')
+            .order('curso_ens_superior.ano_censo')
+            .order('localoferta_ens_superior.cod_local_oferta');
+    } else {
         req.sql.from('curso_ens_superior')
             .field('COUNT(curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
@@ -428,6 +438,26 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
             .where('curso_ens_superior.cod_nivel_academico = 1');
     }
     next();
-}, rqf.build(), query, id2str.transform(), addMissing(rqf), response('course_count'));
+}, rqf.build(), query, id2str.transform(), (req, res, next) => {
+    if ("localoffer" in req.dims) {
+        let baseq = req.sql.clone()
+	let iesq = squel.select()
+
+        iesq.from('ies_ens_superior')
+            .field('ies_ens_superior.cod_ies')
+            .field('ies_ens_superior.nome_ies');
+
+	req.sql = squel.select().from(baseq, 'bq')
+            .field("'Brasil'", 'name')
+	    .field('ano_censo', 'year')
+	    .field('total')
+	    .field('university_id')
+	    .field('nome_ies', 'university_name')
+	    .field('localoffer_id')
+	    .field('localoffer_name')
+            .join(iesq, 'iq', 'iq.cod_ies=bq.university_id');
+    }
+    next();
+}, query, id2str.transform(), addMissing(rqf), response('course_count'));
 
 module.exports = courseCountApp;
-- 
GitLab


From 31becfc7fcfa42a9a6965ec2bad145788dbd8f60 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Tue, 28 Apr 2020 11:12:12 -0300
Subject: [PATCH 02/53] Add school location

---
 src/libs/routes/api.js            | 23 +++-----
 src/libs/routes/schoolLocation.js | 88 +++++++++++++++++++++++++++++++
 2 files changed, 95 insertions(+), 16 deletions(-)
 create mode 100644 src/libs/routes/schoolLocation.js

diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index 7d312660..3a09aea2 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -40,8 +40,6 @@ const school = require('./school');
 
 const simulation = require('./simulation');
 
-const user = require('./user');
-
 const classroom = require('./classroom');
 
 const teacher = require('./teacher');
@@ -64,16 +62,8 @@ const idhmr = require('./idhmr');
 
 const idhml = require('./idhml');
 
-const oauth2 = require(`${libs}/middlewares/oauth2`);
-
-const verifyToken = require(`${libs}/routes/verifyToken`);
-
-const resetToken = require(`${libs}/routes/resetToken`);
-
 const educationYears = require(`${libs}/routes/educationYears`);
 
-const downloads = require(`${libs}/routes/downloads`);
-
 const infrastructure = require(`${libs}/routes/infrastructure`);
 
 const schoolInfrastructure = require(`${libs}/routes/schoolInfrastructure`);
@@ -114,12 +104,16 @@ const university = require(`${libs}/routes/university`);
 
 const universityTeacher = require(`${libs}/routes/universityTeacher`);
 
+const educationalBudget = require(`${libs}/routes/educationalBudget`);
+
+const schoolLocation = require(`${libs}/routes/schoolLocation`);
+
+
 api.get('/', (req, res) => {
     res.json({ msg: 'SimCAQ API is running' });
 });
 
 // mount API routes
-api.use('/user', user);
 api.use('/simulation', simulation);
 api.use('/class', classes);
 api.use('/enrollment', enrollment);
@@ -138,11 +132,7 @@ api.use('/rate_school', rateSchool);
 api.use('/gloss_enrollment_ratio', glossEnrollmentRatio);
 api.use('/liquid_enrollment_ratio', liquidEnrollmentRatio);
 api.use('/idhml', idhml);
-api.use('/auth/token', oauth2.token);
-api.use('/verify', verifyToken);
-api.use('/reset', resetToken);
 api.use('/education_years', educationYears);
-api.use('/downloads', downloads);
 api.use('/infrastructure', infrastructure);
 api.use('/school_infrastructure', schoolInfrastructure);
 api.use('/distribution_factor', distributionFactor);
@@ -163,5 +153,6 @@ api.use('/university_enrollment', universityEnrollment);
 api.use('/university', university);
 api.use('/university_teacher', universityTeacher);
 api.use('/course_count', courseCount);
-
+api.use('/educational_budget', educationalBudget);
+api.use('/school_location', schoolLocation)
 module.exports = api;
diff --git a/src/libs/routes/schoolLocation.js b/src/libs/routes/schoolLocation.js
new file mode 100644
index 00000000..b18464bf
--- /dev/null
+++ b/src/libs/routes/schoolLocation.js
@@ -0,0 +1,88 @@
+const express = require('express');
+
+const schoolLocationApp = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const log = require(`${libs}/log`)(module);
+
+const squel = require('squel');
+
+const query = require(`${libs}/middlewares/query`).query;
+
+const response = require(`${libs}/middlewares/response`);
+
+const id2str = require(`${libs}/middlewares/id2str`);
+
+const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
+
+const request = require(`request`);
+
+const config = require(`${libs}/config`);
+
+const passport = require('passport');
+
+const addMissing = require(`${libs}/middlewares/addMissing`);
+
+const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+
+let rqf = new ReqQueryFields();
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addField({
+    name: 'dims',
+    field: true,
+    where: false
+}).addValue({
+    name: 'id',
+    table: 'localizacao_escolas',
+    tableField: 'id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    }
+}).addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: '@'
+    }
+}, 'dims').addValueToField({
+    name: 'school',
+    table: 'localizacao_escolas',
+    tableField: ['nome', 'id'],
+    resultField: ['school_name', 'school_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+}, 'dims');
+
+schoolLocationApp.get('/', rqf.parse(), (req, res, next) => {
+    req.dims.city=true;
+    req.dims.school=true;
+
+    req.sql.from('localizacao_escolas')
+        .field("'Brasil'", 'name')
+        .field('localizacao_escolas.latitude', 'latitude')
+        .field('localizacao_escolas.longitude', 'longitude')
+        .group('localizacao_escolas.latitude')
+        .group('localizacao_escolas.longitude');
+    next();
+}, rqf.build(), query, id2str.transform(), response('school_location'));
+
+module.exports = schoolLocationApp;
-- 
GitLab


From cf8ea1f8731cb828f54e79a99aabbc4286574893 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Tue, 28 Apr 2020 11:18:58 -0300
Subject: [PATCH 03/53] Revert user api changes

---
 src/libs/routes/api.js | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index 3a09aea2..bc8da67c 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -40,6 +40,8 @@ const school = require('./school');
 
 const simulation = require('./simulation');
 
+const user = require('./user');
+
 const classroom = require('./classroom');
 
 const teacher = require('./teacher');
@@ -62,8 +64,16 @@ const idhmr = require('./idhmr');
 
 const idhml = require('./idhml');
 
+const oauth2 = require(`${libs}/middlewares/oauth2`);
+
+const verifyToken = require(`${libs}/routes/verifyToken`);
+
+const resetToken = require(`${libs}/routes/resetToken`);
+
 const educationYears = require(`${libs}/routes/educationYears`);
 
+const downloads = require(`${libs}/routes/downloads`);
+
 const infrastructure = require(`${libs}/routes/infrastructure`);
 
 const schoolInfrastructure = require(`${libs}/routes/schoolInfrastructure`);
@@ -114,6 +124,7 @@ api.get('/', (req, res) => {
 });
 
 // mount API routes
+api.use('/user', user);
 api.use('/simulation', simulation);
 api.use('/class', classes);
 api.use('/enrollment', enrollment);
@@ -132,7 +143,11 @@ api.use('/rate_school', rateSchool);
 api.use('/gloss_enrollment_ratio', glossEnrollmentRatio);
 api.use('/liquid_enrollment_ratio', liquidEnrollmentRatio);
 api.use('/idhml', idhml);
+api.use('/auth/token', oauth2.token);
+api.use('/verify', verifyToken);
+api.use('/reset', resetToken);
 api.use('/education_years', educationYears);
+api.use('/downloads', downloads);
 api.use('/infrastructure', infrastructure);
 api.use('/school_infrastructure', schoolInfrastructure);
 api.use('/distribution_factor', distributionFactor);
@@ -153,6 +168,5 @@ api.use('/university_enrollment', universityEnrollment);
 api.use('/university', university);
 api.use('/university_teacher', universityTeacher);
 api.use('/course_count', courseCount);
-api.use('/educational_budget', educationalBudget);
 api.use('/school_location', schoolLocation)
 module.exports = api;
-- 
GitLab


From 9a4431c7006c027c2b5138d42fea7f2423831172 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Wed, 6 May 2020 10:38:31 -0300
Subject: [PATCH 04/53] [homologa]Added fixed results

---
 src/libs/convert/nightTime.js  | 32 ++++++++++++++++++
 src/libs/routes/courseCount.js | 62 ++++++++++++++++++++++++++++------
 2 files changed, 83 insertions(+), 11 deletions(-)
 create mode 100644 src/libs/convert/nightTime.js

diff --git a/src/libs/convert/nightTime.js b/src/libs/convert/nightTime.js
new file mode 100644
index 00000000..1e840071
--- /dev/null
+++ b/src/libs/convert/nightTime.js
@@ -0,0 +1,32 @@
+'use strict';
+
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function nightTime(id) {
+	switch (id) {
+		case 0:
+			return 'Não';
+		case 1:
+			return 'Sim';
+		default:
+			return 'Curso a distância';
+	}
+};
\ No newline at end of file
diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 65c17462..15cb9a16 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -191,17 +191,18 @@ rqf.addField({
     where: false
 }).addValue({
     name: 'region',
-    table: 'regiao',
-    tableField: ['nome', 'id'],
+    table: 'localoferta_ens_superior',
+    tableField: ['nome_regiao_curso', 'cod_regiao_curso'],
     resultField: ['region_name', 'region_id'],
     where: {
-        relation: 'LIKE',
-        type: 'string',
-        field: 'id'
+        relation: '=',
+        type: 'integer',
+        field: 'cod_regiao_curso',
+	table: 'localoferta_ens_superior'
     },
     join: {
-        primary: 'nome',
-        foreign: 'nome_regiao_curso',
+        primary: ['ano_censo', 'cod_curso'],
+        foreign: ['ano_censo', 'cod_curso'],
         foreignTable: 'curso_ens_superior'
     }
 }).addValue({
@@ -212,8 +213,8 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'cod_uf_curso',
-	    table: 'curso_ens_superior'
+        field: 'cod_uf',
+	    table: 'localoferta_ens_superior'
     },
     join: {
         primary: ['ano_censo', 'cod_curso'],
@@ -228,8 +229,8 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'cod_curso',
-        table: 'curso_ens_superior'
+        field: 'cod_municipio',
+        table: 'localoferta_ens_superior'
     },
     join: {
         primary: ['ano_censo', 'cod_curso'],
@@ -322,6 +323,36 @@ rqf.addField({
         type: 'integer',
         field: 'cod_ocde_area_detalhada'
     }
+}).addValue({
+    name:'cine_specific',
+    table: 'curso_ens_superior',
+    tableField: ['cod_cine_area_especifica', 'nome_cine_area_especifica'],
+    resultField: ['cine_specific_id', 'cine_specific_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_cine_area_especifica'
+    }
+}).addValue({
+    name:'cine_geral',
+    table: 'curso_ens_superior',
+    tableField: ['cod_cine_area_geral', 'nome_cine_area_geral'],
+    resultField: ['cine_geral_id', 'cine_geral_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_cine_area_geral'
+    }
+}).addValue({
+    name:'cine_detailed',
+    table: 'curso_ens_superior',
+    tableField: ['cod_cine_area_detalhada', 'nome_cine_area_detalhada'],
+    resultField: ['cine_detailed_id', 'cine_datailed_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_cine_area_detalhada'
+    }
 }).addValue({
     name:'academic_level',
     table: 'curso_ens_superior',
@@ -427,6 +458,15 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
             .group('curso_ens_superior.ano_censo')
             .order('curso_ens_superior.ano_censo')
             .order('localoferta_ens_superior.cod_local_oferta');
+    } else if (("state" in req.dims) || ("city" in req.dims) || ("region" in req.dims)) {
+	req.sql.from('curso_ens_superior')
+            .field('COUNT(DISTINCT curso_ens_superior.cod_curso)', 'total')
+            .field("'Brasil'", 'name')
+            .field('curso_ens_superior.ano_censo', 'year')
+            .group('curso_ens_superior.ano_censo')
+            .order('curso_ens_superior.ano_censo')
+            .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
+            .where('curso_ens_superior.cod_nivel_academico = 1');
     } else {
         req.sql.from('curso_ens_superior')
             .field('COUNT(curso_ens_superior.cod_curso)', 'total')
-- 
GitLab


From ea189e009160ca4be13bf95f89b7a4eb62249663 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Wed, 6 May 2020 18:56:51 -0300
Subject: [PATCH 05/53] Added night time fix

---
 src/libs/middlewares/id2str.js | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js
index 327ce2a4..fadf365b 100644
--- a/src/libs/middlewares/id2str.js
+++ b/src/libs/middlewares/id2str.js
@@ -80,6 +80,7 @@ const genderIES = require(`${libs}/convert/genderIES`);
 const deficiency = require(`${libs}/convert/studentDeficiency`);
 const govermentAgreement = require(`${libs}/convert/govermentAgreement`);
 const arrangement = require(`${libs}/convert/arrangement`);
+const nightTime = require(`${libs}/convert/nightTime`);
 
 const ids = {
     gender_id: gender,
@@ -135,7 +136,7 @@ const ids = {
     school_type_id: schoolType,
     upper_turn_id: upperTurn,
     is_free_id: booleanVariable,
-    night_time_id: booleanVariable,
+    night_time_id: nightTime,
     capital_id: booleanVariable,
     ethnic_group_ies_id: ethnicGroupIES,
     teacher_situation_id: teacherSituation,
@@ -251,5 +252,6 @@ module.exports = {
     deficiency,
     transport,
     govermentAgreement,
-    arrangement
+    arrangement,
+    nightTime
 };
-- 
GitLab


From 8d8d390e2d2a5277ea6efcbe4cc5a56c8c3923b8 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vic_picussa2@hotmail.com>
Date: Thu, 7 May 2020 17:45:04 -0300
Subject: [PATCH 06/53] Added CINE dimension

---
 src/libs/convert/cineDetailed.js | 199 +++++++++++++++++++++++++++++++
 src/libs/convert/cineGeral.js    |  48 ++++++++
 src/libs/convert/cineSpecific.js |  99 +++++++++++++++
 src/libs/middlewares/id2str.js   |  15 ++-
 src/libs/routes/courseCount.js   |  49 ++++++++
 5 files changed, 408 insertions(+), 2 deletions(-)
 create mode 100644 src/libs/convert/cineDetailed.js
 create mode 100644 src/libs/convert/cineGeral.js
 create mode 100644 src/libs/convert/cineSpecific.js

diff --git a/src/libs/convert/cineDetailed.js b/src/libs/convert/cineDetailed.js
new file mode 100644
index 00000000..e1211704
--- /dev/null
+++ b/src/libs/convert/cineDetailed.js
@@ -0,0 +1,199 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+module.exports = function cineDetailed(id) {
+	switch (id) {
+		case 11: 
+        return 'Programas básicos';                                              
+        case 111: 
+        return 'Ciência da educação';                                            
+        case 112: 
+        return 'Formação de professores de educação infantil';
+        case 113: 
+        return 'Formação de professores sem áreas específicas';                  
+        case 114: 
+        return 'Formação de professores em áreas específicas (exceto Letras)';   
+        case 115: 
+        return 'Formação de professores de letras';                              
+        case 188: 
+        return 'Programas interdisciplinares abrangendo educação';               
+        case 211: 
+        return 'Produção audiovisual, de mídia e cultural';                      
+        case 212: 
+        return 'Moda, design de interiores e desenho industrial';                
+        case 213: 
+        return 'Belas artes';                                                    
+        case 214: 
+        return 'Artesanato';                                                     
+        case 215: 
+        return 'Música e artes cênicas';                                         
+        case 221: 
+        return 'Religião e teologia';                                            
+        case 222: 
+        return 'História e arqueologia';                                         
+        case 223: 
+        return 'Filosofia e ética';                                              
+        case 231: 
+        return 'Letras';                                                         
+        case 288: 
+        return 'Programas interdisciplinares abrangendo artes e humanidades';    
+        case 311: 
+        return 'Economia';                                                       
+        case 312: 
+        return 'Ciências sociais e políticas';                                   
+        case 313: 
+        return 'Psicologia';                                                     
+        case 321: 
+        return 'Jornalismo e reportagem';                                        
+        case 322: 
+        return 'Biblioteconomia, informação e estudos arquivísticos';            
+        case 388: 
+        return 'Programas interdisciplinares abrangendo ciências sociais, jornalismo e informação';                                               
+        case 411: 
+        return 'Contabilidade e tributação';                                     
+        case 412: 
+        return 'Finanças, bancos e seguros';                                     
+        case 413: 
+        return 'Gestão e administração';                                         
+        case 414: 
+        return 'Marketing e propaganda';                                         
+        case 415: 
+        return 'Secretariado e trabalhos de escritório';                         
+        case 416: 
+        return 'Gestão comercial';                                               
+        case 421: 
+        return 'Direito';                                                        
+        case 488: 
+        return 'Programas interdisciplinares abrangendo negócios, administração e direito';                                                       
+        case 511: 
+        return 'Biologia';                                                       
+        case 512: 
+        return 'Bioquímica e biotecnologia';                                     
+        case 521: 
+        return 'Ciências ambientais';                                            
+        case 531: 
+        return 'Química';                                                        
+        case 532: 
+        return 'Ciências da terra';                                              
+        case 533: 
+        return 'Física';                                                         
+        case 541: 
+        return 'Matemática';                                                     
+        case 542: 
+        return 'Estatística';                                                    
+        case 588: 
+        return 'Programas interdisciplinares abrangendo ciências naturais, matemática e estatística';                                             
+        case 612: 
+        return 'Infraestrutura e gestão de TIC';                                 
+        case 613: 
+        return 'Produção de software';                                           
+        case 614: 
+        return 'Ciência da computação';                                          
+        case 615: 
+        return 'Gestão e desenvolvimento de sistemas de informação';             
+        case 616: 
+        return 'Desenvolvimento de sistemas que integram software e hardware';   
+        case 688: 
+        return 'Programas interdisciplinares abrangendo computação e Tecnologias da Informação e Comunicação (TIC)';                              
+        case 710: 
+        return 'Engenharia e profissões correlatas sem definição precisa';       
+        case 711: 
+        return 'Engenharia química e de processos';                              
+        case 712: 
+        return 'Tecnologia de proteção ambiental';                               
+        case 713: 
+        return 'Eletricidade e energia';                                         
+        case 714: 
+        return 'Eletrônica e automação';                                         
+        case 715: 
+        return 'Engenharia mecânica e metalurgia';                               
+        case 716: 
+        return 'Veículos a motor, construção naval, aeronáutica, ferroviária e metroviária';                                                      
+        case 721: 
+        return 'Processamento de alimentos';                                     
+        case 722: 
+        return 'Materiais';                                                      
+        case 723: 
+        return 'Têxteis (vestuário, calçados e couro)';                          
+        case 724: 
+        return 'Mineração e extração';                                           
+        case 725: 
+        return 'Produção e processos de fabricação';                             
+        case 731: 
+        return 'Arquitetura e planejamento urbano';                              
+        case 732: 
+        return 'Engenharia civil e construção';                                  
+        case 788: 
+        return 'Programas interdisciplinares abrangendo engenharia, produção e construção';                                                       
+        case 811: 
+        return 'Produção agrícola, agropecuária e zootecnia';                    
+        case 812: 
+        return 'Horticultura';                                                   
+        case 821: 
+        return 'Silvicultura';                                                   
+        case 831: 
+        return 'Pesca';                                                          
+        case 841: 
+        return 'Veterinária';                                                    
+        case 888: 
+        return 'Programas interdisciplinares abrangendo agricultura, silvicultura, pesca e veterinária';                                          
+        case 911: 
+        return 'Odontologia';                                                    
+        case 912: 
+        return 'Medicina';                                                       
+        case 913: 
+        return 'Enfermagem';                                                     
+        case 914: 
+        return 'Tecnologia de diagnóstico e tratamento médico';                  
+        case 915: 
+        return 'Promoção, prevenção, terapia e reabilitação';                    
+        case 916: 
+        return 'Farmácia';                                                       
+        case 917: 
+        return 'Medicina e terapia tradicional e complementar';                  
+        case 918: 
+        return 'Saúde pública e saúde coletiva';                                 
+        case 921: 
+        return 'Assistência a idosos e a deficientes';                           
+        case 923: 
+        return 'Serviço social';                                                 
+        case 988: 
+        return 'Programas interdisciplinares abrangendo saúde e bem-estar';      
+        case 1011: 
+        return 'Serviços domésticos';                                            
+        case 1012: 
+        return 'Serviços de beleza';                                             
+        case 1013: 
+        return 'Serviços de alimentação';                                        
+        case 1014: 
+        return 'Esportes e lazer';                                               
+        case 1015: 
+        return 'Turismo e hotelaria';                                            
+        case 1022: 
+        return 'Saúde e segurança no trabalho';                                  
+        case 1031: 
+        return 'Setor militar e de defesa';                                      
+        case 1032: 
+        return 'Proteção de pessoas e de propriedades';                          
+        case 1041: 
+        return 'Serviços de transporte';
+        default:
+        return 'Não classificada';
+	}
+};
\ No newline at end of file
diff --git a/src/libs/convert/cineGeral.js b/src/libs/convert/cineGeral.js
new file mode 100644
index 00000000..4f38e88a
--- /dev/null
+++ b/src/libs/convert/cineGeral.js
@@ -0,0 +1,48 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function cineGeral(id) {
+    switch (id) {
+        case 0:
+        return 'Programas básicos';
+        case 1:
+        return 'Educação';
+        case 2:
+        return 'Artes e humanidades';
+        case 3:
+        return 'Ciências sociais, jornalismo e informação';
+        case 4:
+        return 'Negócios, administração e direito';
+        case 5:
+        return 'Ciências naturais, matemática e estatística';
+        case 6:
+        return 'Computação e Tecnologias da Informação e Comunicação (TIC)';
+        case 7:
+        return 'Engenharia, produção e construção';
+        case 8:
+        return 'Agricultura, silvicultura, pesca e veterinária';
+        case 9:
+        return 'Saúde e bem-estar';
+        case 10:
+        return 'Serviços';
+        default:
+        return 'Não classificada';
+    }
+};
diff --git a/src/libs/convert/cineSpecific.js b/src/libs/convert/cineSpecific.js
new file mode 100644
index 00000000..8c900c35
--- /dev/null
+++ b/src/libs/convert/cineSpecific.js
@@ -0,0 +1,99 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software:
+return 'you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+module.exports = function cineSpecific(id) {
+    switch (id) {
+        case 1:
+        return 'Programas básicos';                                            
+        case 11:
+        return 'Educação';                                                      
+        case 18:
+        return 'Programas interdisciplinares abrangendo educação';              
+        case 21:
+        return 'Artes';                                                         
+        case 22:
+        return 'Humanidades (exceto línguas)';                                  
+        case 23:
+        return 'Línguas';                                                       
+        case 28:
+        return 'Programas interdisciplinares abrangendo artes e humanidades';   
+        case 31:
+        return 'Ciências sociais e comportamentais';                            
+        case 32:
+        return 'Jornalismo e informação';                                       
+        case 38:
+        return 'Programas interdisciplinares abrangendo ciências sociais, jornalismo e informação';                                              
+        case 41:
+        return 'Negócios e administração';                                      
+        case 42:
+        return 'Direito';                                                       
+        case 48:
+        return 'Programas interdisciplinares abrangendo negócios, administração e direito';                                                      
+        case 51:
+        return 'Ciências biológicas e correlatas';                              
+        case 52:
+        return 'Meio ambiente';                                                 
+        case 53:
+        return 'Ciências físicas';                                              
+        case 54:
+        return 'Matemática e estatística';                                      
+        case 58:
+        return 'Programas interdisciplinares abrangendo ciências naturais, matemática e estatística';                                            
+        case 61:
+        return 'Computação e Tecnologias da Informação e Comunicação (TIC)';    
+        case 68:
+        return 'Programas interdisciplinares abrangendo computação e Tecnologias da Informação e Comunicação (TIC)';                             
+        case 71:
+        return 'Engenharia e profissões correlatas';                            
+        case 72:
+        return 'Produção e processamento';                                      
+        case 73:
+        return 'Arquitetura e construção';                                      
+        case 78:
+        return 'Programas interdisciplinares abrangendo engenharia, produção e construção';                                                      
+        case 81:
+        return 'Agricultura';                                                   
+        case 82:
+        return 'Silvicultura';                                                 
+        case 83:
+        return 'Pesca';                                                         
+        case 84:
+        return 'Veterinária';                                                   
+        case 88:
+        return 'Programas interdisciplinares abrangendo agricultura, silvicultura, pesca e veterinária';                                         
+        case 91:
+        return 'Saúde';                                                         
+        case 92:
+        return 'Bem-estar';                                                     
+        case 98:
+        return 'Programas interdisciplinares abrangendo saúde e bem-estar';     
+        case 101:
+        return 'Serviços pessoais';                                             
+        case 102:
+        return 'Higiene e serviços de saúde ocupacional';                       
+        case 103:
+        return 'Serviços de segurança';                                         
+        case 104:
+        return 'Serviços de transporte';
+        default:
+        return 'Não classificada';
+    }
+};
diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js
index 327ce2a4..78fd170d 100644
--- a/src/libs/middlewares/id2str.js
+++ b/src/libs/middlewares/id2str.js
@@ -61,6 +61,9 @@ const academicOrganization = require(`${libs}/convert/academicOrganization`);
 const ocdeSpecific = require(`${libs}/convert/ocdeSpecific`);
 const ocdeGeral = require(`${libs}/convert/ocdeGeral`);
 const ocdeDetailed = require(`${libs}/convert/ocdeDetailed`);
+const cineSpecific = require(`${libs}/convert/cineSpecific`);
+const cineGeral = require(`${libs}/convert/cineGeral`);
+const cineDetailed = require(`${libs}/convert/cineDetailed`);
 const academicLevel = require(`${libs}/convert/academicLevel`);
 const upperEducationMod = require(`${libs}/convert/upperEducationMod`);
 const studentDeficiency = require(`${libs}/convert/studentDeficiency`);
@@ -80,6 +83,7 @@ const genderIES = require(`${libs}/convert/genderIES`);
 const deficiency = require(`${libs}/convert/studentDeficiency`);
 const govermentAgreement = require(`${libs}/convert/govermentAgreement`);
 const arrangement = require(`${libs}/convert/arrangement`);
+const nightTime = require(`${libs}/convert/nightTime`);
 
 const ids = {
     gender_id: gender,
@@ -129,13 +133,16 @@ const ids = {
     ocde_specific_id: ocdeSpecific,
     ocde_geral_id: ocdeGeral,
     ocde_detailed_id: ocdeDetailed,
+    cine_specific_id: cineSpecific,
+    cine_geral_id: cineGeral,
+    cine_detailed_id: cineDetailed,
     academic_level_id: academicLevel,
     upper_education_mod_id: upperEducationMod,
     student_deficiency_id: studentDeficiency,
     school_type_id: schoolType,
     upper_turn_id: upperTurn,
     is_free_id: booleanVariable,
-    night_time_id: booleanVariable,
+    night_time_id: nightTime,
     capital_id: booleanVariable,
     ethnic_group_ies_id: ethnicGroupIES,
     teacher_situation_id: teacherSituation,
@@ -231,6 +238,9 @@ module.exports = {
     ocdeSpecific,
     ocdeGeral,
     ocdeDetailed,
+    cineSpecific,
+    cineGeral,
+    cineDetailed,
     academicLevel,
     upperEducationMod,
     studentDeficiency,
@@ -251,5 +261,6 @@ module.exports = {
     deficiency,
     transport,
     govermentAgreement,
-    arrangement
+    arrangement,
+    nightTime
 };
diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 15cb9a16..53b33ede 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -127,6 +127,55 @@ courseCountApp.get('/ocde_detailed', (req, res, next) => {
     next();
 }, response('ocde_detailed'));
 
+courseCountApp.get('/cine_geral', (req, res, next) => {
+    req.result = [];
+    for(let i = 0; i <= 10; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.cineGeral(i)
+        });
+    };
+    next();
+}, response('cine_geral'));
+
+courseCountApp.get('/cine_specific', (req, res, next) => {
+    req.result = [];
+    const defaultCase = null;
+    for(let i = 1; i <= 104; ++i) {
+        let obj = {
+            id: i,
+            name: id2str.cineSpecific(i)
+        };
+        if (obj.name !== id2str.cineSpecific(defaultCase)){
+            req.result.push(obj);
+        }
+    };
+    req.result.push({
+        id: defaultCase,
+        name: id2str.cineSpecific(defaultCase)
+    });
+    next();
+}, response('cine_specific'));
+
+courseCountApp.get('/cine_detailed', (req, res, next) => {
+    req.result = [];
+    const defaultCase = null;
+    for(let i = 11; i <= 1041; ++i) {
+        let obj = {
+            id: i,
+            name: id2str.cineDetailed(i)
+        };
+        if (obj.name !== id2str.cineDetailed(defaultCase)){
+            req.result.push(obj);
+        }
+    };
+    req.result.push({
+        id: defaultCase,
+        name: id2str.cineDetailed(defaultCase)
+    });
+    next();
+}, response('cine_detailed'));
+
 courseCountApp.get('/academic_level', (req, res, next) => {
     req.result = [];
     for(let i = 1; i <= 4; ++i) {
-- 
GitLab


From 30d4eb90b70aaea570a9e8d1663e283cd26108b1 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Tue, 12 May 2020 10:05:23 -0300
Subject: [PATCH 07/53] Fix dot error

---
 src/libs/convert/educationLevelMod.js | 2 +-
 src/libs/convert/ruralLocation.js     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/libs/convert/educationLevelMod.js b/src/libs/convert/educationLevelMod.js
index 0cdfbeee..5add8f1e 100644
--- a/src/libs/convert/educationLevelMod.js
+++ b/src/libs/convert/educationLevelMod.js
@@ -43,7 +43,7 @@ module.exports = function educationLevelMod(id) {
         case 11:
         return 'EJA - EF e EM Integrado - tecnico';
         case 12:
-        return 'Educacao Profissional - concomitante e subsequente.'
+        return 'Educacao Profissional - concomitante e subsequente'
         default:
         return 'Não classificada';
     }
diff --git a/src/libs/convert/ruralLocation.js b/src/libs/convert/ruralLocation.js
index ab60f412..7ff47d96 100644
--- a/src/libs/convert/ruralLocation.js
+++ b/src/libs/convert/ruralLocation.js
@@ -35,6 +35,6 @@ module.exports = function ruralLocation(id) {
         case 7:
         return 'Rural - Unidade de uso sustentavel em terra indígena';
         case 8:
-        return 'Rural - Unidade de uso sustentável em área remanescente de quilombos.';
+        return 'Rural - Unidade de uso sustentável em área remanescente de quilombos';
     }
 };
-- 
GitLab


From 14d0bbad58047bcf9967678d2548801e1d648c4c Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Wed, 13 May 2020 13:52:03 -0300
Subject: [PATCH 08/53] New location

---
 src/libs/convert/stateName.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/libs/convert/stateName.js b/src/libs/convert/stateName.js
index 4760d242..fe268ebc 100644
--- a/src/libs/convert/stateName.js
+++ b/src/libs/convert/stateName.js
@@ -74,5 +74,7 @@ module.exports = function stateName(id) {
         return 'Goiás';
         case 53:
         return 'Distrito Federal';
+        case 99:
+        return 'Exterior';
     }
 };
-- 
GitLab


From 83f935b8c743522888eb53c3bf61a806709258d1 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Thu, 14 May 2020 11:22:16 -0300
Subject: [PATCH 09/53] Fix filter

---
 src/libs/routes/courseCount.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 53b33ede..4a03f3d6 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -487,6 +487,7 @@ rqf.addField({
 });
 
 courseCountApp.get('/', rqf.parse(), (req, res, next) => {
+    console.log(req)
     if ("university" in req.dims) {
         req.sql.from('curso_ens_superior')
             .field('COUNT(curso_ens_superior.cod_curso)', 'total')
@@ -507,7 +508,8 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
             .group('curso_ens_superior.ano_censo')
             .order('curso_ens_superior.ano_censo')
             .order('localoferta_ens_superior.cod_local_oferta');
-    } else if (("state" in req.dims) || ("city" in req.dims) || ("region" in req.dims)) {
+    } else if (("state" in req.dims) || ("city" in req.dims) || ("region" in req.dims) ||
+        ("state" in req.filter) || ("city" in req.filter) || ("region" in req.filter)) {
 	req.sql.from('curso_ens_superior')
             .field('COUNT(DISTINCT curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
-- 
GitLab


From cccc18b43a2e3983fc6a1a6b1e22cf3ee249cf4f Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Thu, 14 May 2020 16:24:53 -0300
Subject: [PATCH 10/53] Fixed citys

---
 src/libs/routes/courseCount.js | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 4a03f3d6..567f05cf 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -273,8 +273,8 @@ rqf.addField({
 }).addValue({
     name: 'city',
     table: 'localoferta_ens_superior',
-    tableField: ['nome_municipio', 'cod_municipio'],
-    resultField: ['city_name', 'city_id'],
+    tableField: 'cod_municipio',
+    resultField: 'city_id',
     where: {
         relation: '=',
         type: 'integer',
@@ -513,7 +513,8 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
 	req.sql.from('curso_ens_superior')
             .field('COUNT(DISTINCT curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
-            .field('curso_ens_superior.ano_censo', 'year')
+            .field('curso_ens_superior.ano_censo')
+	    .field('curso_ens_superior.ano_censo', 'year')
             .group('curso_ens_superior.ano_censo')
             .order('curso_ens_superior.ano_censo')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
@@ -547,6 +548,20 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
 	    .field('localoffer_id')
 	    .field('localoffer_name')
             .join(iesq, 'iq', 'iq.cod_ies=bq.university_id');
+    } if (("city" in req.dims) || ("city" in req.filter)) {
+        let baseq = req.sql.clone()
+	let cityq = squel.select()
+        cityq.from('municipio')
+            .field('municipio.id')
+            .field('municipio.nome');
+
+        req.sql = squel.select().from(baseq, 'bq')
+            .field("'Brasil'", 'name')
+            .field('ano_censo', 'year')
+            .field('total')
+            .field('nome', 'city_name')
+            .field('city_id')
+            .join(cityq, 'cq', 'cq.id=bq.city_id');
     }
     next();
 }, query, id2str.transform(), addMissing(rqf), response('course_count'));
-- 
GitLab


From e4ea3a96bb795234218574293b4bc45f86ffc725 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Thu, 14 May 2020 16:37:46 -0300
Subject: [PATCH 11/53] Removed filter check

---
 src/libs/routes/courseCount.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 567f05cf..74ae6662 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -548,7 +548,7 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
 	    .field('localoffer_id')
 	    .field('localoffer_name')
             .join(iesq, 'iq', 'iq.cod_ies=bq.university_id');
-    } if (("city" in req.dims) || ("city" in req.filter)) {
+    } if ("city" in req.dims) {
         let baseq = req.sql.clone()
 	let cityq = squel.select()
         cityq.from('municipio')
-- 
GitLab


From 3b38d9d088fdcebe9b5137d9e4e8e4e16dcc1a8c Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Fri, 15 May 2020 10:10:11 -0300
Subject: [PATCH 12/53] Fix Employees

---
 src/libs/routes/employees.js | 128 ++++++++++++++++++++---------------
 1 file changed, 75 insertions(+), 53 deletions(-)

diff --git a/src/libs/routes/employees.js b/src/libs/routes/employees.js
index 1e119d1f..7d455e25 100644
--- a/src/libs/routes/employees.js
+++ b/src/libs/routes/employees.js
@@ -468,67 +468,89 @@ function matchQueries(queryTotal, queryPartial) {
 employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
     req.allEmployees = {}
     req.allTeacher = {}
-
-    if ("school" in req.filter) {
-        req.sql.field('SUM(escola.num_funcionarios)', 'total')
-        .field("'Brasil'", 'name')
-        .field('escola.ano_censo', 'year')
-        .from('escola')
-        .group('escola.ano_censo')
-        .order('escola.ano_censo')
-        .where('(escola.situacao_de_funcionamento = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4) AND (escola.id=' + req.filter.school + ')');
-        delete req.filter.school;
-        next();
-    } else {
-        req.sql.field('SUM(escola.num_funcionarios)', 'total')
-        .field("'Brasil'", 'name')
-        .field('escola.ano_censo', 'year')
-        .from('escola')
-        .group('escola.ano_censo')
-        .order('escola.ano_censo')
-        .where('(escola.situacao_de_funcionamento = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4)');
-        next();
-    }
+    req.schoolTable = {}
+
+        if ("school" in req.filter) {
+            req.sql.field('SUM(escola.num_funcionarios)', 'total')
+            .field("'Brasil'", 'name')
+            .field('escola.ano_censo', 'year')
+            .from('escola')
+            .group('escola.ano_censo')
+            .order('escola.ano_censo')
+            .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4) AND (escola.id=' + req.filter.school + ')');
+            delete req.filter.school;
+        } else {
+            req.sql.field('SUM(escola.num_funcionarios)', 'total')
+            .field("'Brasil'", 'name')
+            .field('escola.ano_censo', 'year')
+            .from('escola')
+            .group('escola.ano_censo')
+            .order('escola.ano_censo')
+            .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4)');
+        }
+    next();
 }, rqfSchool.build(), query, rqfSchool.parse(), id2str.transform(), (req, res, next) => {
 
     req.allEmployees = req.result;
-    req.resetSql();
 
-    if ("school" in req.filter) {
-        req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
-        .field("'Brasil'", 'name')
-        .field('docente_por_escola.ano_censo', 'year')
-        .from('docente_por_escola')
-        .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
-        .group('docente_por_escola.ano_censo')
-        .order('docente_por_escola.ano_censo')
-        .where('(docente_por_escola.dependencia_adm_id > 1) AND (docente_por_escola.escola_id=' + req.filter.school + ')');
-    } else if ("school" in req.dims) {
-        req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
-        .field("'Brasil'", 'name')
-        .field('docente_por_escola.ano_censo', 'year')
-        .field('escola.nome_escola', 'school_name')
-        .from('docente_por_escola')
-        .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
-        .group('docente_por_escola.ano_censo')
-        .order('docente_por_escola.ano_censo')
-        .where('(docente_por_escola.dependencia_adm_id > 1)');
-    } else {
-        req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
-        .field("'Brasil'", 'name')
-        .field('docente_por_escola.ano_censo', 'year')
-        .from('docente_por_escola')
-        .group('docente_por_escola.ano_censo')
-        .order('docente_por_escola.ano_censo')
-        .where('(docente_por_escola.dependencia_adm_id > 1)');
-    }
+        req.resetSql();
+        if ("school" in req.filter) {
+            req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
+            .field("'Brasil'", 'name')
+            .field('docente_por_escola.ano_censo', 'year')
+            .from('docente_por_escola')
+            .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
+            .group('docente_por_escola.ano_censo')
+            .order('docente_por_escola.ano_censo')
+            .where('(docente_por_escola.dependencia_adm_id > 1) AND (docente_por_escola.escola_id=' + req.filter.school + ')');
+        } else if ("school" in req.dims) {
+            req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
+            .field("'Brasil'", 'name')
+            .field('docente_por_escola.ano_censo', 'year')
+            .field('escola.nome_escola', 'school_name')
+            .from('docente_por_escola')
+            .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
+            .group('docente_por_escola.ano_censo')
+            .order('docente_por_escola.ano_censo')
+            .where('(docente_por_escola.dependencia_adm_id > 1)');
+        } else {
+            req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
+            .field("'Brasil'", 'name')
+            .field('docente_por_escola.ano_censo', 'year')
+            .from('docente_por_escola')
+            .group('docente_por_escola.ano_censo')
+            .order('docente_por_escola.ano_censo')
+            .where('(docente_por_escola.dependencia_adm_id > 1)');
+        }
     next();
 
-}, rqfSchool.build(), query,  id2str.transform(),  (req, res, next) => {
+}, rqfSchool.build(), query, rqfSchool.parse(), id2str.transform(), (req, res, next) => {
 
     req.allTeacher = req.result;
-    let aux_employees = matchQueries(req.allEmployees, req.allTeacher);
-    req.result = aux_employees;
+    req.resetSql();
+    req.sql.field('SUM(CASE WHEN escola.qt_prof_admin = 88888 THEN 0 ELSE escola.qt_prof_admin END) + SUM(CASE WHEN escola.qtde_prof_servicos_gerais = 88888 THEN 0 ELSE escola.qtde_prof_servicos_gerais END) + SUM(CASE WHEN escola.qtde_prof_bibliotecario = 88888 THEN 0 ELSE escola.qtde_prof_bibliotecario END) + SUM(CASE WHEN escola.qtde_prof_saude = 88888 THEN 0 ELSE escola.qtde_prof_saude END) + SUM(CASE WHEN escola.qtde_prof_coordenador = 88888 THEN 0 ELSE escola.qtde_prof_coordenador END) + SUM(CASE WHEN escola.qtde_prof_fono = 88888 THEN 0 ELSE escola.qtde_prof_fono END) + SUM(CASE WHEN escola.qtde_prof_nutricionista = 88888 THEN 0 ELSE escola.qtde_prof_nutricionista END) + SUM(CASE WHEN escola.qtde_prof_psicologo = 88888 THEN 0 ELSE escola.qtde_prof_psicologo END) + SUM(CASE WHEN escola.qtde_prof_alimentacao = 88888 THEN 0 ELSE escola.qtde_prof_alimentacao END) + SUM(CASE WHEN escola.qtde_prof_pedagogia = 88888 THEN 0 ELSE escola.qtde_prof_pedagogia END) + SUM(CASE WHEN escola.qtde_prof_secretario = 88888 THEN 0 ELSE escola.qtde_prof_secretario END) + SUM(CASE WHEN escola.qtde_prof_seguranca = 88888 THEN 0 ELSE escola.qtde_prof_seguranca END) + SUM(CASE WHEN escola.qtde_prof_monitores = 88888 THEN 0 ELSE escola.qtde_prof_monitores END)', 'total')
+    .field("'Brasil'", 'name')
+    .field('escola.ano_censo', 'year')
+    .from('escola')
+    .group('escola.ano_censo')
+    .order('escola.ano_censo')
+    .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (escola.dependencia_adm_id = 2 OR escola.dependencia_adm_id = 3 OR escola.dependencia_adm_id = 4) and ano_censo >= 2019');
+    next();
+
+}, rqfSchool.build(), query,  id2str.transform(),  (req, res, next) => {
+
+    req.schoolTable = req.result;
+    console.log(req.schoolTable)
+    console.log("AAA");
+    if (req.filter.min_year <= 2018 && req.filter.max_year <= 2018) {
+        let aux_employees = matchQueries(req.allEmployees, req.allTeacher);
+        req.result = aux_employees;
+    } else if (req.filter.min_year >= 2019 && req.filter.max_year >= 2019) {
+        req.result = req.schoolTable;
+    } else if (req.filter.min_year <= 2018 && req.filter.max_year >= 2019) {
+        let aux_employees = matchQueries(req.allEmployees, req.allTeacher);
+        req.result = aux_employees.concat(req.schoolTable);
+    }
     next();
 }, response('employees'));
 
-- 
GitLab


From 5f0240cfb192313f0e2097bb1c9c9f196905c6a1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Wed, 20 May 2020 09:54:05 -0300
Subject: [PATCH 13/53] Add micro and macro regions dims,filters

---
 src/libs/routes/city.js                 | 20 ++++++++++++++++
 src/libs/routes/enrollment.js           | 30 ++++++++++++++++++++++++
 src/libs/routes/school.js               | 30 ++++++++++++++++++++++++
 src/libs/routes/schoolLocation.js       | 31 +++++++++++++++++++++++++
 src/libs/routes/teacher.js              | 30 ++++++++++++++++++++++++
 src/libs/routes/universityEnrollment.js | 30 ++++++++++++++++++++++++
 6 files changed, 171 insertions(+)

diff --git a/src/libs/routes/city.js b/src/libs/routes/city.js
index 42494878..6714206d 100644
--- a/src/libs/routes/city.js
+++ b/src/libs/routes/city.js
@@ -69,6 +69,26 @@ rqf.addField({
         foreign: 'estado_id',
         foreignTable: 'municipio'
     }
+}).addValue({
+    name: 'mesoregion',
+    table: 'municipio',
+    tableField: ['nome_mesorregiao', 'mesorregiao_id'],
+    resultField: ['mesoregion_name', 'mesoregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'mesorregiao_id',
+    }
+}).addValue({
+    name: 'microregion',
+    table: 'municipio',
+    tableField: ['nome_microrregiao', 'microrregiao_id'],
+    resultField: ['microregion_name', 'microregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'microrregiao_id',
+    }
 }).addField({
     name: 'search',
     field: false,
diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js
index 87083fcf..1ca90dbf 100644
--- a/src/libs/routes/enrollment.js
+++ b/src/libs/routes/enrollment.js
@@ -341,6 +341,36 @@ rqf.addField({
         foreign: 'regiao_id',
         foreignTable: 'matricula'
     }
+}).addValue({
+    name: 'mesoregion',
+    table: 'municipio',
+    tableField: ['nome_mesorregiao', 'mesorregiao_id'],
+    resultField: ['mesoregion_name', 'mesoregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'microregion',
+    table: 'municipio',
+    tableField: ['nome_microrregiao', 'microrregiao_id'],
+    resultField: ['microregion_name', 'microregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: '@'
+    }
 }).addValueToField({
     name: 'state',
     table: 'estado',
diff --git a/src/libs/routes/school.js b/src/libs/routes/school.js
index e430ff42..991b6696 100644
--- a/src/libs/routes/school.js
+++ b/src/libs/routes/school.js
@@ -345,6 +345,36 @@ rqfCount.addField({
         foreign: 'estado_id',
         foreignTable: 'escola'
     }
+}).addValue({
+    name: 'mesoregion',
+    table: 'municipio',
+    tableField: ['nome_mesorregiao', 'mesorregiao_id'],
+    resultField: ['mesoregion_name', 'mesoregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'microregion',
+    table: 'municipio',
+    tableField: ['nome_microrregiao', 'microrregiao_id'],
+    resultField: ['microregion_name', 'microregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: '@'
+    }
 }).addValue({
     name: 'region',
     table: 'regiao',
diff --git a/src/libs/routes/schoolLocation.js b/src/libs/routes/schoolLocation.js
index b18464bf..9b5309bb 100644
--- a/src/libs/routes/schoolLocation.js
+++ b/src/libs/routes/schoolLocation.js
@@ -45,6 +45,36 @@ rqf.addField({
         type: 'integer',
         field: 'id'
     }
+}).addValue({
+    name: 'mesoregion',
+    table: 'municipio',
+    tableField: ['nome_mesorregiao', 'mesorregiao_id'],
+    resultField: ['mesoregion_name', 'mesoregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'microregion',
+    table: 'municipio',
+    tableField: ['nome_microrregiao', 'microrregiao_id'],
+    resultField: ['microregion_name', 'microregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'municipio_id',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: '@'
+    }
 }).addValueToField({
     name: 'city',
     table: 'municipio',
@@ -75,6 +105,7 @@ rqf.addField({
 schoolLocationApp.get('/', rqf.parse(), (req, res, next) => {
     req.dims.city=true;
     req.dims.school=true;
+    req.dims.mesoregion=true;
 
     req.sql.from('localizacao_escolas')
         .field("'Brasil'", 'name')
diff --git a/src/libs/routes/teacher.js b/src/libs/routes/teacher.js
index 59d6f8db..a1fb24f3 100644
--- a/src/libs/routes/teacher.js
+++ b/src/libs/routes/teacher.js
@@ -265,6 +265,36 @@ rqf.addField({
         foreign: 'escola_regiao_id',
         foreignTable: 'docente'
     }
+}).addValue({
+    name: 'mesoregion',
+    table: 'municipio',
+    tableField: ['nome_mesorregiao', 'mesorregiao_id'],
+    resultField: ['mesoregion_name', 'mesoregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'escola_municipio_id',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'escola_municipio_id',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'microregion',
+    table: 'municipio',
+    tableField: ['nome_microrregiao', 'microrregiao_id'],
+    resultField: ['microregion_name', 'microregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'escola_municipio_id',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'escola_municipio_id',
+        foreignTable: '@'
+    }
 }).addValue({
     name: 'state',
     table: 'estado',
diff --git a/src/libs/routes/universityEnrollment.js b/src/libs/routes/universityEnrollment.js
index a618a7be..a6d2ba44 100644
--- a/src/libs/routes/universityEnrollment.js
+++ b/src/libs/routes/universityEnrollment.js
@@ -285,6 +285,36 @@ rqf.addField({
         foreign: 'cod_municipio_ies',
         foreignTable: '@'
     }
+}).addValue({
+    name: 'mesoregion',
+    table: 'municipio',
+    tableField: ['nome_mesorregiao', 'mesorregiao_id'],
+    resultField: ['mesoregion_name', 'mesoregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_municipio_ies'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_municipio_ies',
+        foreignTable: '@'
+    }
+}).addValue({
+    name: 'microregion',
+    table: 'municipio',
+    tableField: ['nome_microrregiao', 'microrregiao_id'],
+    resultField: ['microregion_name', 'microregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_municipio_ies',
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_municipio_ies',
+        foreignTable: '@'
+    }
 }).addValue({
     name: 'region',
     table: 'regiao',
-- 
GitLab


From 122a433c83fe37cdc29ee9f64270ba362a845fbd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Wed, 20 May 2020 09:59:36 -0300
Subject: [PATCH 14/53] Add micro and macro regions dims,filters

---
 src/libs/routes/schoolLocation.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/libs/routes/schoolLocation.js b/src/libs/routes/schoolLocation.js
index 9b5309bb..2bc37ea7 100644
--- a/src/libs/routes/schoolLocation.js
+++ b/src/libs/routes/schoolLocation.js
@@ -106,6 +106,7 @@ schoolLocationApp.get('/', rqf.parse(), (req, res, next) => {
     req.dims.city=true;
     req.dims.school=true;
     req.dims.mesoregion=true;
+    req.dims.microregion=true;
 
     req.sql.from('localizacao_escolas')
         .field("'Brasil'", 'name')
-- 
GitLab


From 92b9b0dc3b38bff558bf966c19fc06a1676a7f95 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Wed, 20 May 2020 11:42:35 -0300
Subject: [PATCH 15/53] Add mesoregion and microregion routes

---
 src/libs/routes/api.js         |  7 +++-
 src/libs/routes/city.js        | 24 ++---------
 src/libs/routes/mesoregion.js  | 76 ++++++++++++++++++++++++++++++++++
 src/libs/routes/microregion.js | 76 ++++++++++++++++++++++++++++++++++
 4 files changed, 161 insertions(+), 22 deletions(-)
 create mode 100644 src/libs/routes/mesoregion.js
 create mode 100644 src/libs/routes/microregion.js

diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index bc8da67c..86333d7d 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -118,6 +118,9 @@ const educationalBudget = require(`${libs}/routes/educationalBudget`);
 
 const schoolLocation = require(`${libs}/routes/schoolLocation`);
 
+const microregion = require(`${libs}/routes/microregion`);
+
+const mesoregion = require(`${libs}/routes/mesoregion`);
 
 api.get('/', (req, res) => {
     res.json({ msg: 'SimCAQ API is running' });
@@ -168,5 +171,7 @@ api.use('/university_enrollment', universityEnrollment);
 api.use('/university', university);
 api.use('/university_teacher', universityTeacher);
 api.use('/course_count', courseCount);
-api.use('/school_location', schoolLocation)
+api.use('/school_location', schoolLocation);
+api.use('/mesoregion', mesoregion);
+api.use('/microregion', microregion);
 module.exports = api;
diff --git a/src/libs/routes/city.js b/src/libs/routes/city.js
index 6714206d..ef28500f 100644
--- a/src/libs/routes/city.js
+++ b/src/libs/routes/city.js
@@ -69,26 +69,6 @@ rqf.addField({
         foreign: 'estado_id',
         foreignTable: 'municipio'
     }
-}).addValue({
-    name: 'mesoregion',
-    table: 'municipio',
-    tableField: ['nome_mesorregiao', 'mesorregiao_id'],
-    resultField: ['mesoregion_name', 'mesoregion_id'],
-    where: {
-        relation: '=',
-        type: 'integer',
-        field: 'mesorregiao_id',
-    }
-}).addValue({
-    name: 'microregion',
-    table: 'municipio',
-    tableField: ['nome_microrregiao', 'microrregiao_id'],
-    resultField: ['microregion_name', 'microregion_id'],
-    where: {
-        relation: '=',
-        type: 'integer',
-        field: 'microrregiao_id',
-    }
 }).addField({
     name: 'search',
     field: false,
@@ -111,7 +91,9 @@ cityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     .field('municipio.id')
     .field('municipio.estado_id', 'state_id')
     .field('municipio.longitude', 'longitude')
-    .field('municipio.latitude', 'latitude');
+    .field('municipio.latitude', 'latitude')
+    .field('municipio.mesorregiao_id', 'mesoregion_id')
+    .field('municipio.microrregiao_id', 'microregion_id');
     next();
 }, query, response('city'));
 
diff --git a/src/libs/routes/mesoregion.js b/src/libs/routes/mesoregion.js
new file mode 100644
index 00000000..1180f8ca
--- /dev/null
+++ b/src/libs/routes/mesoregion.js
@@ -0,0 +1,76 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+const express = require('express');
+
+const mesoregion = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const squel = require('squel');
+
+const query = require(`${libs}/middlewares/query`).query;
+
+const response = require(`${libs}/middlewares/response`);
+
+const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
+
+const config = require(`${libs}/config`); 
+
+const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+
+let rqf = new ReqQueryFields();
+
+mesoregionApp.use(cache('15 day'));
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addValue({
+    name: 'state',
+    table: 'estado',
+    tableField: ['nome', 'id'],
+    resultField: ['state_name', 'state_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'estado_id',
+        table: 'municipio'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'estado_id',
+        foreignTable: 'municipio'
+    }
+});
+
+mesoregionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
+    req.sql.from('municipio')
+        .field('municipio.nome_mesorregiao', 'name')
+        .field('municipio.mesorregiao_id')
+        .field('municipio.estado_id', 'state_id')
+        .group('municipio.nome_mesorregiao')
+        .group('municipio.mesorregiao_id')
+        .group('municipio.estado_id')
+    next();
+}, query, response('city'));
+
+module.exports = mesoregionApp;
diff --git a/src/libs/routes/microregion.js b/src/libs/routes/microregion.js
new file mode 100644
index 00000000..a7de2511
--- /dev/null
+++ b/src/libs/routes/microregion.js
@@ -0,0 +1,76 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+const express = require('express');
+
+const microregion = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const squel = require('squel');
+
+const query = require(`${libs}/middlewares/query`).query;
+
+const response = require(`${libs}/middlewares/response`);
+
+const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
+
+const config = require(`${libs}/config`); 
+
+const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+
+let rqf = new ReqQueryFields();
+
+microregionApp.use(cache('15 day'));
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addValue({
+    name: 'state',
+    table: 'estado',
+    tableField: ['nome', 'id'],
+    resultField: ['state_name', 'state_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'estado_id',
+        table: 'municipio'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'estado_id',
+        foreignTable: 'municipio'
+    }
+});
+
+microregionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
+    req.sql.from('municipio')
+        .field('municipio.nome_microrregiao', 'name')
+        .field('municipio.microrregiao_id')
+        .field('municipio.estado_id', 'state_id')
+        .group('municipio.nome_microrregiao')
+        .group('municipio.microrregiao_id')
+        .group('municipio.estado_id')
+    next();
+}, query, response('city'));
+
+module.exports = microregionApp;
-- 
GitLab


From 5c1ad6fa09eb1e01e4178f15525cf59ed8fbbe83 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Wed, 20 May 2020 12:03:18 -0300
Subject: [PATCH 16/53] Small fix to mesoregion, microregion routes

---
 src/libs/routes/api.js         | 4 ++--
 src/libs/routes/mesoregion.js  | 6 +++---
 src/libs/routes/microregion.js | 6 +++---
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index 86333d7d..45bdea87 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -118,10 +118,10 @@ const educationalBudget = require(`${libs}/routes/educationalBudget`);
 
 const schoolLocation = require(`${libs}/routes/schoolLocation`);
 
-const microregion = require(`${libs}/routes/microregion`);
-
 const mesoregion = require(`${libs}/routes/mesoregion`);
 
+const microregion = require(`${libs}/routes/microregion`);
+
 api.get('/', (req, res) => {
     res.json({ msg: 'SimCAQ API is running' });
 });
diff --git a/src/libs/routes/mesoregion.js b/src/libs/routes/mesoregion.js
index 1180f8ca..9e62d0ef 100644
--- a/src/libs/routes/mesoregion.js
+++ b/src/libs/routes/mesoregion.js
@@ -20,7 +20,7 @@ along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
 
 const express = require('express');
 
-const mesoregion = express.Router();
+const mesoregionApp = express.Router();
 
 const libs = `${process.cwd()}/libs`;
 
@@ -69,8 +69,8 @@ mesoregionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
         .field('municipio.estado_id', 'state_id')
         .group('municipio.nome_mesorregiao')
         .group('municipio.mesorregiao_id')
-        .group('municipio.estado_id')
+        .group('municipio.estado_id');
     next();
-}, query, response('city'));
+}, query, response('mesoregion'));
 
 module.exports = mesoregionApp;
diff --git a/src/libs/routes/microregion.js b/src/libs/routes/microregion.js
index a7de2511..2816ab42 100644
--- a/src/libs/routes/microregion.js
+++ b/src/libs/routes/microregion.js
@@ -20,7 +20,7 @@ along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
 
 const express = require('express');
 
-const microregion = express.Router();
+const microregionApp = express.Router();
 
 const libs = `${process.cwd()}/libs`;
 
@@ -69,8 +69,8 @@ microregionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
         .field('municipio.estado_id', 'state_id')
         .group('municipio.nome_microrregiao')
         .group('municipio.microrregiao_id')
-        .group('municipio.estado_id')
+        .group('municipio.estado_id');
     next();
-}, query, response('city'));
+}, query, response('microregion'));
 
 module.exports = microregionApp;
-- 
GitLab


From b254bb4b05a90291e23222c06b56d065fefb51f7 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Thu, 21 May 2020 09:14:49 -0300
Subject: [PATCH 17/53] Change name in rural location

---
 src/libs/convert/ruralLocation.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/convert/ruralLocation.js b/src/libs/convert/ruralLocation.js
index 7ff47d96..2e09f051 100644
--- a/src/libs/convert/ruralLocation.js
+++ b/src/libs/convert/ruralLocation.js
@@ -23,7 +23,7 @@ module.exports = function ruralLocation(id) {
         case 1:
         return 'Urbana';
         case 2:
-        return 'Rural';
+        return 'Rural sem especificação';
         case 3:
         return 'Rural - Área de assentamento';
         case 4:
-- 
GitLab


From b19d7d26e4e7a021bc0f2c362c0ba3bc6b30ea59 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Thu, 21 May 2020 09:30:06 -0300
Subject: [PATCH 18/53] Add mesoregion field to microregion

---
 src/libs/routes/microregion.js | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/libs/routes/microregion.js b/src/libs/routes/microregion.js
index 2816ab42..ed95bf5b 100644
--- a/src/libs/routes/microregion.js
+++ b/src/libs/routes/microregion.js
@@ -66,9 +66,13 @@ microregionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.sql.from('municipio')
         .field('municipio.nome_microrregiao', 'name')
         .field('municipio.microrregiao_id')
+        .field('municipio.nome_mesorregiao', 'name')
+        .field('municipio.mesorregiao_id')
         .field('municipio.estado_id', 'state_id')
         .group('municipio.nome_microrregiao')
         .group('municipio.microrregiao_id')
+        .group('municipio.nome_mesorregiao')
+        .group('municipio.mesorregiao_id')
         .group('municipio.estado_id');
     next();
 }, query, response('microregion'));
-- 
GitLab


From e4cb68ef9dad8e4a6bf9e9c4fcb82ff49ad91902 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Thu, 21 May 2020 09:36:02 -0300
Subject: [PATCH 19/53] Fix fields names

---
 src/libs/routes/mesoregion.js  | 4 ++--
 src/libs/routes/microregion.js | 8 ++++----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/libs/routes/mesoregion.js b/src/libs/routes/mesoregion.js
index 9e62d0ef..b321fa62 100644
--- a/src/libs/routes/mesoregion.js
+++ b/src/libs/routes/mesoregion.js
@@ -64,8 +64,8 @@ rqf.addField({
 
 mesoregionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.sql.from('municipio')
-        .field('municipio.nome_mesorregiao', 'name')
-        .field('municipio.mesorregiao_id')
+        .field('municipio.nome_mesorregiao', 'mesoregion_name')
+        .field('municipio.mesorregiao_id', 'mesoregion_id')
         .field('municipio.estado_id', 'state_id')
         .group('municipio.nome_mesorregiao')
         .group('municipio.mesorregiao_id')
diff --git a/src/libs/routes/microregion.js b/src/libs/routes/microregion.js
index ed95bf5b..a7a7b009 100644
--- a/src/libs/routes/microregion.js
+++ b/src/libs/routes/microregion.js
@@ -64,10 +64,10 @@ rqf.addField({
 
 microregionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.sql.from('municipio')
-        .field('municipio.nome_microrregiao', 'name')
-        .field('municipio.microrregiao_id')
-        .field('municipio.nome_mesorregiao', 'name')
-        .field('municipio.mesorregiao_id')
+        .field('municipio.nome_microrregiao', 'microregion_name')
+        .field('municipio.microrregiao_id', 'microregion_id')
+        .field('municipio.nome_mesorregiao', 'mesoregion_name')
+        .field('municipio.mesorregiao_id', 'mesoregion_id')
         .field('municipio.estado_id', 'state_id')
         .group('municipio.nome_microrregiao')
         .group('municipio.microrregiao_id')
-- 
GitLab


From c3ce5a0b932d27e1a2f1f5e85f1d3c85697039d1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Thu, 21 May 2020 10:28:26 -0300
Subject: [PATCH 20/53] Fix mesoregion, microregion filters

---
 src/libs/routes/enrollment.js           | 10 ++++++----
 src/libs/routes/school.js               | 10 ++++++----
 src/libs/routes/schoolLocation.js       | 10 ++++++----
 src/libs/routes/teacher.js              | 10 ++++++----
 src/libs/routes/universityEnrollment.js | 10 ++++++----
 5 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js
index 1ca90dbf..91b4fafe 100644
--- a/src/libs/routes/enrollment.js
+++ b/src/libs/routes/enrollment.js
@@ -349,12 +349,13 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'municipio_id',
+        field: 'mesorregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'municipio_id',
-        foreignTable: '@'
+        foreignTable: 'matricula'
     }
 }).addValue({
     name: 'microregion',
@@ -364,12 +365,13 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'municipio_id',
+        field: 'microrregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'municipio_id',
-        foreignTable: '@'
+        foreignTable: 'matricula'
     }
 }).addValueToField({
     name: 'state',
diff --git a/src/libs/routes/school.js b/src/libs/routes/school.js
index 991b6696..d1f31701 100644
--- a/src/libs/routes/school.js
+++ b/src/libs/routes/school.js
@@ -353,12 +353,13 @@ rqfCount.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'municipio_id',
+        field: 'mesorregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'municipio_id',
-        foreignTable: '@'
+        foreignTable: 'escola'
     }
 }).addValue({
     name: 'microregion',
@@ -368,12 +369,13 @@ rqfCount.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'municipio_id',
+        field: 'microrregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'municipio_id',
-        foreignTable: '@'
+        foreignTable: 'escola'
     }
 }).addValue({
     name: 'region',
diff --git a/src/libs/routes/schoolLocation.js b/src/libs/routes/schoolLocation.js
index 2bc37ea7..b37f0d1b 100644
--- a/src/libs/routes/schoolLocation.js
+++ b/src/libs/routes/schoolLocation.js
@@ -53,12 +53,13 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'municipio_id',
+        field: 'mesorregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'municipio_id',
-        foreignTable: '@'
+        foreignTable: 'localizacao_escolas'
     }
 }).addValue({
     name: 'microregion',
@@ -68,12 +69,13 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'municipio_id',
+        field: 'microrregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'municipio_id',
-        foreignTable: '@'
+        foreignTable: 'localizacao_escolas'
     }
 }).addValueToField({
     name: 'city',
diff --git a/src/libs/routes/teacher.js b/src/libs/routes/teacher.js
index a1fb24f3..2b2037c4 100644
--- a/src/libs/routes/teacher.js
+++ b/src/libs/routes/teacher.js
@@ -273,12 +273,13 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'escola_municipio_id',
+        field: 'mesorregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'escola_municipio_id',
-        foreignTable: '@'
+        foreignTable: 'docente'
     }
 }).addValue({
     name: 'microregion',
@@ -288,12 +289,13 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'escola_municipio_id',
+        field: 'microrregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'escola_municipio_id',
-        foreignTable: '@'
+        foreignTable: 'docente'
     }
 }).addValue({
     name: 'state',
diff --git a/src/libs/routes/universityEnrollment.js b/src/libs/routes/universityEnrollment.js
index a6d2ba44..748df1c4 100644
--- a/src/libs/routes/universityEnrollment.js
+++ b/src/libs/routes/universityEnrollment.js
@@ -293,12 +293,13 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'cod_municipio_ies'
+        field: 'mesorregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'cod_municipio_ies',
-        foreignTable: '@'
+        foreignTable: 'aluno_ens_superior'
     }
 }).addValue({
     name: 'microregion',
@@ -308,12 +309,13 @@ rqf.addField({
     where: {
         relation: '=',
         type: 'integer',
-        field: 'cod_municipio_ies',
+        field: 'microrregiao_id',
+        table: 'municipio'
     },
     join: {
         primary: 'id',
         foreign: 'cod_municipio_ies',
-        foreignTable: '@'
+        foreignTable: 'aluno_ens_superior'
     }
 }).addValue({
     name: 'region',
-- 
GitLab


From 268614439eb053941abc1a9dcadc00c3a546e5a2 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Thu, 21 May 2020 10:48:44 -0300
Subject: [PATCH 21/53] Fix courses

---
 src/libs/routes/courseCount.js | 59 +++++++++++++++++++++++++---------
 1 file changed, 44 insertions(+), 15 deletions(-)

diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 74ae6662..2e478626 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -289,8 +289,8 @@ rqf.addField({
 }).addValue({
     name: 'localoffer',
     table: 'localoferta_ens_superior',
-    tableField: ['cod_ies', 'cod_local_oferta', 'nome'],
-    resultField: ['university_id', 'localoffer_id', 'localoffer_name'],
+    tableField: ['cod_local_oferta', 'nome'],
+    resultField: ['localoffer_id', 'localoffer_name'],
     where: {
 	    relation: '=',
 	    type: 'integer',
@@ -487,35 +487,47 @@ rqf.addField({
 });
 
 courseCountApp.get('/', rqf.parse(), (req, res, next) => {
-    console.log(req)
-    if ("university" in req.dims) {
-        req.sql.from('curso_ens_superior')
-            .field('COUNT(curso_ens_superior.cod_curso)', 'total')
+    if (("state" in req.dims) || ("city" in req.dims) || ("region" in req.dims) ||
+        ("state" in req.filter) || ("city" in req.filter) || ("region" in req.filter)) {
+	req.sql.from('curso_ens_superior')
+            .field('COUNT(DISTINCT curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
-            .field('curso_ens_superior.ano_censo', 'year')
-            .group('curso_ens_superior.cod_ies')
+            .field('curso_ens_superior.ano_censo')
+	    .field('curso_ens_superior.ano_censo', 'year')
             .group('curso_ens_superior.ano_censo')
-            .order('curso_ens_superior.cod_ies')
             .order('curso_ens_superior.ano_censo')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
             .where('curso_ens_superior.cod_nivel_academico = 1');
     } else if ("localoffer" in req.dims) {
+	 if ("university" in req.dims) {
+	     req.sql.from('curso_ens_superior')
+                .field('curso_ens_superior.ano_censo')
+                .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
+                .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
+                .where('curso_ens_superior.cod_nivel_academico = 1')
+                .group('curso_ens_superior.ano_censo')
+                .order('curso_ens_superior.ano_censo')
+               .order('localoferta_ens_superior.cod_local_oferta');
+
+	 } else {
          req.sql.from('curso_ens_superior')
             .field('curso_ens_superior.ano_censo')
             .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
+	    .field('localoferta_ens_superior.cod_ies', 'university_id')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
             .where('curso_ens_superior.cod_nivel_academico = 1')
             .group('curso_ens_superior.ano_censo')
             .order('curso_ens_superior.ano_censo')
             .order('localoferta_ens_superior.cod_local_oferta');
-    } else if (("state" in req.dims) || ("city" in req.dims) || ("region" in req.dims) ||
-        ("state" in req.filter) || ("city" in req.filter) || ("region" in req.filter)) {
-	req.sql.from('curso_ens_superior')
-            .field('COUNT(DISTINCT curso_ens_superior.cod_curso)', 'total')
+	}
+    } else if ("university" in req.dims) {
+        req.sql.from('curso_ens_superior')
+            .field('COUNT(curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
             .field('curso_ens_superior.ano_censo')
-	    .field('curso_ens_superior.ano_censo', 'year')
+            .group('curso_ens_superior.cod_ies')
             .group('curso_ens_superior.ano_censo')
+            .order('curso_ens_superior.cod_ies')
             .order('curso_ens_superior.ano_censo')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
             .where('curso_ens_superior.cod_nivel_academico = 1');
@@ -548,7 +560,8 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
 	    .field('localoffer_id')
 	    .field('localoffer_name')
             .join(iesq, 'iq', 'iq.cod_ies=bq.university_id');
-    } if ("city" in req.dims) {
+    } 
+    if ("city" in req.dims) {
         let baseq = req.sql.clone()
 	let cityq = squel.select()
         cityq.from('municipio')
@@ -563,6 +576,22 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
             .field('city_id')
             .join(cityq, 'cq', 'cq.id=bq.city_id');
     }
+    if ("university" in req.dims) {
+        let baseq = req.sql.clone()
+	let iesq = squel.select()
+
+        iesq.from('ies_ens_superior')
+            .field('ies_ens_superior.cod_ies')
+            .field('ies_ens_superior.nome_ies');
+
+	req.sql = squel.select().from(baseq, 'bq')
+            .field("'Brasil'", 'name')
+	    .field('ano_censo', 'year')
+	    .field('total')
+	    .field('university_id')
+	    .field('nome_ies', 'university_name')
+            .join(iesq, 'iq', 'iq.cod_ies=bq.university_id'); 
+    }
     next();
 }, query, id2str.transform(), addMissing(rqf), response('course_count'));
 
-- 
GitLab


From 7330e933b27872360914de37ecfc72e9ab153daa Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Thu, 21 May 2020 11:14:33 -0300
Subject: [PATCH 22/53] Query group

---
 src/libs/routes/courseCount.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 2e478626..28de65c5 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -517,6 +517,7 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
             .where('curso_ens_superior.cod_nivel_academico = 1')
             .group('curso_ens_superior.ano_censo')
+            .group('localoferta_ens_superior.cod_ies')
             .order('curso_ens_superior.ano_censo')
             .order('localoferta_ens_superior.cod_local_oferta');
 	}
-- 
GitLab


From 70648a9e0e883aea01a46c2363d458097657e981 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Fri, 22 May 2020 09:22:39 -0300
Subject: [PATCH 23/53] Small change to mesoregion and microregion routes

---
 src/libs/routes/mesoregion.js  | 4 ++--
 src/libs/routes/microregion.js | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/libs/routes/mesoregion.js b/src/libs/routes/mesoregion.js
index b321fa62..0feb7627 100644
--- a/src/libs/routes/mesoregion.js
+++ b/src/libs/routes/mesoregion.js
@@ -64,8 +64,8 @@ rqf.addField({
 
 mesoregionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.sql.from('municipio')
-        .field('municipio.nome_mesorregiao', 'mesoregion_name')
-        .field('municipio.mesorregiao_id', 'mesoregion_id')
+        .field('municipio.nome_mesorregiao', 'name')
+        .field('municipio.mesorregiao_id', 'id')
         .field('municipio.estado_id', 'state_id')
         .group('municipio.nome_mesorregiao')
         .group('municipio.mesorregiao_id')
diff --git a/src/libs/routes/microregion.js b/src/libs/routes/microregion.js
index a7a7b009..0b9b0e1a 100644
--- a/src/libs/routes/microregion.js
+++ b/src/libs/routes/microregion.js
@@ -64,8 +64,8 @@ rqf.addField({
 
 microregionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.sql.from('municipio')
-        .field('municipio.nome_microrregiao', 'microregion_name')
-        .field('municipio.microrregiao_id', 'microregion_id')
+        .field('municipio.nome_microrregiao', 'name')
+        .field('municipio.microrregiao_id', 'id')
         .field('municipio.nome_mesorregiao', 'mesoregion_name')
         .field('municipio.mesorregiao_id', 'mesoregion_id')
         .field('municipio.estado_id', 'state_id')
-- 
GitLab


From cbfc33bb4713f03bbb4814140ab7bcc9a14a783b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Fri, 22 May 2020 09:32:31 -0300
Subject: [PATCH 24/53] Small change to schoolLocation route

---
 src/libs/routes/schoolLocation.js | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/libs/routes/schoolLocation.js b/src/libs/routes/schoolLocation.js
index b37f0d1b..a38b019a 100644
--- a/src/libs/routes/schoolLocation.js
+++ b/src/libs/routes/schoolLocation.js
@@ -111,9 +111,12 @@ schoolLocationApp.get('/', rqf.parse(), (req, res, next) => {
     req.dims.microregion=true;
 
     req.sql.from('localizacao_escolas')
-        .field("'Brasil'", 'name')
+        .field('localizacao_escolas.nome', 'name')
+        .field('localizacao_escolas.id', 'id')
         .field('localizacao_escolas.latitude', 'latitude')
         .field('localizacao_escolas.longitude', 'longitude')
+        .group('localizacao_escolas.nome')
+        .group('localizacao_escolas.id')
         .group('localizacao_escolas.latitude')
         .group('localizacao_escolas.longitude');
     next();
-- 
GitLab


From 041c22bb520bcc707392147bf90108bb08d77b72 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Fri, 22 May 2020 09:46:21 -0300
Subject: [PATCH 25/53] Push to homologa function employees dims

---
 src/libs/routes/employees.js | 244 ++++++++++++++++++++++++++---------
 1 file changed, 182 insertions(+), 62 deletions(-)

diff --git a/src/libs/routes/employees.js b/src/libs/routes/employees.js
index 7d455e25..bd0d3b69 100644
--- a/src/libs/routes/employees.js
+++ b/src/libs/routes/employees.js
@@ -115,6 +115,18 @@ employeesApp.get('/rural_location', (req, res, next) => {
     next();
 }, response('rural_location'));
 
+employeesApp.get('/function', (req, res, next) => {
+    req.result = [
+        {id: 1, name: "Urbana"},
+        {id: 2, name: "Rural"},
+        {id: 3, name: "Rural - Área de assentamento"},
+        {id: 4, name: "Rural - Terra indígena"},
+        {id: 5, name: "Rural - Área remanescente de quilombos"},
+        {id: 6, name: "Rural - Unidade de uso sustentável"}
+    ];
+    next();
+}, response('function'));
+
 rqfSchool.addField({
     name: 'filter',
     field: false,
@@ -243,6 +255,16 @@ rqfSchool.addField({
         type: 'integer',
         field: 'localidade_area_rural'
     }
+}).addValue({
+    name: 'function',
+    table: '@',
+    tableField: 'a',
+    resultField: 'function_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'a'
+    }
 }).addValue({
     name: 'min_year',
     table: '@',
@@ -425,6 +447,65 @@ rqfTeacher.addField({
     }
 });
 
+function formatFunction(queryOriginal,reqDims) {
+    delete reqDims.size;
+    delete reqDims.function;
+    let dims = Object.keys(reqDims); //se for = 0, apenas lidamos com a dimensao function. Se for = 1, lidamos com function mais a dimensao q esta nesse array.
+    console.log(dims)
+    let name = {
+        qtde_admin: "Administrativos",
+        qtde_servicos_gerais: "Serviços Gerais",
+        qtde_bibliotecario: "Bibliotecário",
+        qtde_saude: "Saúde",
+        qtde_coordenador: "Coordenador",
+        qtde_fono: "Fonoaudiólogo",
+        qtde_nutricionista: "Nutricionista",
+        qtde_psicologo: "Psicólogo",
+        qtde_alimentacao: "Alimentação",
+        qtde_pedagogia: "Pedagogia",
+        qtde_secretario: "Secretário",
+        qtde_seguranca: "Segurança",
+        qtde_monitores: "Monitores"
+    }
+    let resultObj = []
+    //Nesse caso apenas precisamos acertar as dimensoes que o banco retorna, ou seja, criando um objeto para cada funcao de funcionario
+    if (dims.length == 0) {
+        queryOriginal.forEach((result) => {
+            Object.keys(result).forEach(function(key,index) {
+                if (key.includes("qtde")) {
+                    let newObj = {
+                        year: result["year"],
+                        function_id: index,
+                        function_name: name[key],
+                        total: result[key]
+                    }
+                    resultObj.push(newObj);
+                }
+            })
+        })
+    }
+    //Nesse caso precisamos copiar o id e name da variavel que está na dimensão junto com funcionarios por função
+    else {
+        queryOriginal.forEach((result) => {
+            Object.keys(result).forEach(function(key,index) {
+                if (key.includes("qtde")) {
+                    let newObj = {
+                        year: result["year"],
+                        function_id: index,
+                        function_name: name[key],
+                        total: result[key]
+                    }
+                    newObj[dims[0] + "_id"] = result[dims[0] + "_id"];
+                    newObj[dims[0] + "_name"] = result[dims[0] + "_name"];
+                    resultObj.push(newObj);
+                }
+            })
+        })
+    }
+
+    return resultObj;
+
+}
 
 function matchQueries(queryTotal, queryPartial) {
     let match = [];
@@ -456,9 +537,11 @@ function matchQueries(queryTotal, queryPartial) {
 
         if(objMatch) {
             newObj.total = result.total - objMatch.total;
-            newObj.total_employees = result.total;
-            newObj.total_teachers = objMatch.total
-            match.push(newObj);
+            if (newObj.total > 0) {
+                newObj.total_employees = result.total;
+                newObj.total_teachers = objMatch.total
+                match.push(newObj);
+            }
         }
     });
 
@@ -469,79 +552,116 @@ employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
     req.allEmployees = {}
     req.allTeacher = {}
     req.schoolTable = {}
-
-        if ("school" in req.filter) {
-            req.sql.field('SUM(escola.num_funcionarios)', 'total')
-            .field("'Brasil'", 'name')
-            .field('escola.ano_censo', 'year')
-            .from('escola')
-            .group('escola.ano_censo')
-            .order('escola.ano_censo')
-            .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4) AND (escola.id=' + req.filter.school + ')');
-            delete req.filter.school;
-        } else {
-            req.sql.field('SUM(escola.num_funcionarios)', 'total')
-            .field("'Brasil'", 'name')
-            .field('escola.ano_censo', 'year')
-            .from('escola')
-            .group('escola.ano_censo')
-            .order('escola.ano_censo')
-            .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4)');
-        }
+    delete req.dims.function;
+    if ("school" in req.filter) {
+        req.sql.field('SUM(escola.num_funcionarios)', 'total')
+        .field("'Brasil'", 'name')
+        .field('escola.ano_censo', 'year')
+        .from('escola')
+        .group('escola.ano_censo')
+        .order('escola.ano_censo')
+        .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4) AND (escola.id=' + req.filter.school + ')');
+        delete req.filter.school;
+    } else {
+        req.sql.field('SUM(escola.num_funcionarios)', 'total')
+        .field("'Brasil'", 'name')
+        .field('escola.ano_censo', 'year')
+        .from('escola')
+        .group('escola.ano_censo')
+        .order('escola.ano_censo')
+        .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4)');
+    }
     next();
 }, rqfSchool.build(), query, rqfSchool.parse(), id2str.transform(), (req, res, next) => {
 
     req.allEmployees = req.result;
 
-        req.resetSql();
-        if ("school" in req.filter) {
-            req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
-            .field("'Brasil'", 'name')
-            .field('docente_por_escola.ano_censo', 'year')
-            .from('docente_por_escola')
-            .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
-            .group('docente_por_escola.ano_censo')
-            .order('docente_por_escola.ano_censo')
-            .where('(docente_por_escola.dependencia_adm_id > 1) AND (docente_por_escola.escola_id=' + req.filter.school + ')');
-        } else if ("school" in req.dims) {
-            req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
-            .field("'Brasil'", 'name')
-            .field('docente_por_escola.ano_censo', 'year')
-            .field('escola.nome_escola', 'school_name')
-            .from('docente_por_escola')
-            .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
-            .group('docente_por_escola.ano_censo')
-            .order('docente_por_escola.ano_censo')
-            .where('(docente_por_escola.dependencia_adm_id > 1)');
-        } else {
-            req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
-            .field("'Brasil'", 'name')
-            .field('docente_por_escola.ano_censo', 'year')
-            .from('docente_por_escola')
-            .group('docente_por_escola.ano_censo')
-            .order('docente_por_escola.ano_censo')
-            .where('(docente_por_escola.dependencia_adm_id > 1)');
-        }
+    req.resetSql();
+    delete req.dims.function;
+    if ("school" in req.filter) {
+        req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
+        .field("'Brasil'", 'name')
+        .field('docente_por_escola.ano_censo', 'year')
+        .from('docente_por_escola')
+        .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
+        .group('docente_por_escola.ano_censo')
+        .order('docente_por_escola.ano_censo')
+        .where('(docente_por_escola.dependencia_adm_id > 1) AND (docente_por_escola.escola_id=' + req.filter.school + ')');
+    } else if ("school" in req.dims) {
+        req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
+        .field("'Brasil'", 'name')
+        .field('docente_por_escola.ano_censo', 'year')
+        .field('escola.nome_escola', 'school_name')
+        .from('docente_por_escola')
+        .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
+        .group('docente_por_escola.ano_censo')
+        .order('docente_por_escola.ano_censo')
+        .where('(docente_por_escola.dependencia_adm_id > 1)');
+    } else {
+        req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
+        .field("'Brasil'", 'name')
+        .field('docente_por_escola.ano_censo', 'year')
+        .from('docente_por_escola')
+        .group('docente_por_escola.ano_censo')
+        .order('docente_por_escola.ano_censo')
+        .where('(docente_por_escola.dependencia_adm_id > 1)');
+    }
     next();
 
 }, rqfSchool.build(), query, rqfSchool.parse(), id2str.transform(), (req, res, next) => {
 
     req.allTeacher = req.result;
+    console.log("AAA");
+    console.log("BBB");
+    console.log("DEI UM RESET")
     req.resetSql();
-    req.sql.field('SUM(CASE WHEN escola.qt_prof_admin = 88888 THEN 0 ELSE escola.qt_prof_admin END) + SUM(CASE WHEN escola.qtde_prof_servicos_gerais = 88888 THEN 0 ELSE escola.qtde_prof_servicos_gerais END) + SUM(CASE WHEN escola.qtde_prof_bibliotecario = 88888 THEN 0 ELSE escola.qtde_prof_bibliotecario END) + SUM(CASE WHEN escola.qtde_prof_saude = 88888 THEN 0 ELSE escola.qtde_prof_saude END) + SUM(CASE WHEN escola.qtde_prof_coordenador = 88888 THEN 0 ELSE escola.qtde_prof_coordenador END) + SUM(CASE WHEN escola.qtde_prof_fono = 88888 THEN 0 ELSE escola.qtde_prof_fono END) + SUM(CASE WHEN escola.qtde_prof_nutricionista = 88888 THEN 0 ELSE escola.qtde_prof_nutricionista END) + SUM(CASE WHEN escola.qtde_prof_psicologo = 88888 THEN 0 ELSE escola.qtde_prof_psicologo END) + SUM(CASE WHEN escola.qtde_prof_alimentacao = 88888 THEN 0 ELSE escola.qtde_prof_alimentacao END) + SUM(CASE WHEN escola.qtde_prof_pedagogia = 88888 THEN 0 ELSE escola.qtde_prof_pedagogia END) + SUM(CASE WHEN escola.qtde_prof_secretario = 88888 THEN 0 ELSE escola.qtde_prof_secretario END) + SUM(CASE WHEN escola.qtde_prof_seguranca = 88888 THEN 0 ELSE escola.qtde_prof_seguranca END) + SUM(CASE WHEN escola.qtde_prof_monitores = 88888 THEN 0 ELSE escola.qtde_prof_monitores END)', 'total')
-    .field("'Brasil'", 'name')
-    .field('escola.ano_censo', 'year')
-    .from('escola')
-    .group('escola.ano_censo')
-    .order('escola.ano_censo')
-    .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (escola.dependencia_adm_id = 2 OR escola.dependencia_adm_id = 3 OR escola.dependencia_adm_id = 4) and ano_censo >= 2019');
+    console.log("VOU PRINTAR O REQ DIMS")
+    console.log(req.dims);
+    console.log(req.filter);
+    if ("function" in req.dims) {
+        console.log("TO NO IF");
+        req.sql.field('SUM(CASE WHEN escola.qt_prof_admin = 88888 THEN 0 ELSE escola.qt_prof_admin END)', 'qtde_admin')
+        .field('SUM(CASE WHEN escola.qtde_prof_servicos_gerais = 88888 THEN 0 ELSE escola.qtde_prof_servicos_gerais END) AS qtde_servicos_gerais')
+        .field('SUM(CASE WHEN escola.qtde_prof_bibliotecario = 88888 THEN 0 ELSE escola.qtde_prof_bibliotecario END)', 'qtde_bibliotecario')
+        .field('SUM(CASE WHEN escola.qtde_prof_saude = 88888 THEN 0 ELSE escola.qtde_prof_saude END)','qtde_saude')
+        .field('SUM(CASE WHEN escola.qtde_prof_coordenador = 88888 THEN 0 ELSE escola.qtde_prof_coordenador END)','qtde_coordenador')
+        .field('SUM(CASE WHEN escola.qtde_prof_fono = 88888 THEN 0 ELSE escola.qtde_prof_fono END)','qtde_fono')
+        .field('SUM(CASE WHEN escola.qtde_prof_nutricionista = 88888 THEN 0 ELSE escola.qtde_prof_nutricionista END)', 'qtde_nutricionista')
+        .field('SUM(CASE WHEN escola.qtde_prof_psicologo = 88888 THEN 0 ELSE escola.qtde_prof_psicologo END)', 'qtde_psicologo')
+        .field('SUM(CASE WHEN escola.qtde_prof_alimentacao = 88888 THEN 0 ELSE escola.qtde_prof_alimentacao END)','qtde_alimentacao')
+        .field('SUM(CASE WHEN escola.qtde_prof_pedagogia = 88888 THEN 0 ELSE escola.qtde_prof_pedagogia END)', 'qtde_pedagogia')
+        .field('SUM(CASE WHEN escola.qtde_prof_secretario = 88888 THEN 0 ELSE escola.qtde_prof_secretario END)','qtde_secretario')
+        .field('SUM(CASE WHEN escola.qtde_prof_seguranca = 88888 THEN 0 ELSE escola.qtde_prof_seguranca END)','qtde_seguranca')
+        .field('SUM(CASE WHEN escola.qtde_prof_monitores = 88888 THEN 0 ELSE escola.qtde_prof_monitores END)', 'qtde_monitores')
+        .field("'Brasil'", 'name')
+        .field('escola.ano_censo', 'year')
+        .from('escola')
+        .group('escola.ano_censo')
+        .order('escola.ano_censo')
+        .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (escola.dependencia_adm_id = 2 OR escola.dependencia_adm_id = 3 OR escola.dependencia_adm_id = 4) and ano_censo >= 2019');
+        delete req.dims.function;
+    } else {
+        console.log("AAA to no if")
+        req.sql.field('SUM(CASE WHEN escola.qt_prof_admin = 88888 THEN 0 ELSE escola.qt_prof_admin END) + SUM(CASE WHEN escola.qtde_prof_servicos_gerais = 88888 THEN 0 ELSE escola.qtde_prof_servicos_gerais END) + SUM(CASE WHEN escola.qtde_prof_bibliotecario = 88888 THEN 0 ELSE escola.qtde_prof_bibliotecario END) + SUM(CASE WHEN escola.qtde_prof_saude = 88888 THEN 0 ELSE escola.qtde_prof_saude END) + SUM(CASE WHEN escola.qtde_prof_coordenador = 88888 THEN 0 ELSE escola.qtde_prof_coordenador END) + SUM(CASE WHEN escola.qtde_prof_fono = 88888 THEN 0 ELSE escola.qtde_prof_fono END) + SUM(CASE WHEN escola.qtde_prof_nutricionista = 88888 THEN 0 ELSE escola.qtde_prof_nutricionista END) + SUM(CASE WHEN escola.qtde_prof_psicologo = 88888 THEN 0 ELSE escola.qtde_prof_psicologo END) + SUM(CASE WHEN escola.qtde_prof_alimentacao = 88888 THEN 0 ELSE escola.qtde_prof_alimentacao END) + SUM(CASE WHEN escola.qtde_prof_pedagogia = 88888 THEN 0 ELSE escola.qtde_prof_pedagogia END) + SUM(CASE WHEN escola.qtde_prof_secretario = 88888 THEN 0 ELSE escola.qtde_prof_secretario END) + SUM(CASE WHEN escola.qtde_prof_seguranca = 88888 THEN 0 ELSE escola.qtde_prof_seguranca END) + SUM(CASE WHEN escola.qtde_prof_monitores = 88888 THEN 0 ELSE escola.qtde_prof_monitores END)', 'total')
+        .field("'Brasil'", 'name')
+        .field('escola.ano_censo', 'year')
+        .from('escola')
+        .group('escola.ano_censo')
+        .order('escola.ano_censo')
+        .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (escola.dependencia_adm_id = 2 OR escola.dependencia_adm_id = 3 OR escola.dependencia_adm_id = 4) and ano_censo >= 2019');
+    }
     next();
 
-}, rqfSchool.build(), query,  id2str.transform(),  (req, res, next) => {
+}, rqfSchool.build(), query,  rqfSchool.parse(), id2str.transform(),  (req, res, next) => {
+
+    console.log(req.dims)
+    if ("function" in req.dims) {
+        let aux_employes = formatFunction(req.result, req.dims);
+        req.schoolTable = aux_employes;
+    } else {
+        req.schoolTable = req.result
+    }
 
-    req.schoolTable = req.result;
-    console.log(req.schoolTable)
-    console.log("AAA");
     if (req.filter.min_year <= 2018 && req.filter.max_year <= 2018) {
         let aux_employees = matchQueries(req.allEmployees, req.allTeacher);
         req.result = aux_employees;
-- 
GitLab


From 3bc9b701456c59ca42398ee84febf1f870b6adb4 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Wed, 27 May 2020 10:37:58 -0300
Subject: [PATCH 26/53] Change employees to new table

---
 src/libs/routes/employees.js | 73 ++++--------------------------------
 1 file changed, 8 insertions(+), 65 deletions(-)

diff --git a/src/libs/routes/employees.js b/src/libs/routes/employees.js
index bd0d3b69..abaa191b 100644
--- a/src/libs/routes/employees.js
+++ b/src/libs/routes/employees.js
@@ -549,77 +549,22 @@ function matchQueries(queryTotal, queryPartial) {
 }
 
 employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
-    req.allEmployees = {}
     req.allTeacher = {}
     req.schoolTable = {}
     delete req.dims.function;
-    if ("school" in req.filter) {
-        req.sql.field('SUM(escola.num_funcionarios)', 'total')
-        .field("'Brasil'", 'name')
-        .field('escola.ano_censo', 'year')
-        .from('escola')
-        .group('escola.ano_censo')
-        .order('escola.ano_censo')
-        .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4) AND (escola.id=' + req.filter.school + ')');
-        delete req.filter.school;
-    } else {
-        req.sql.field('SUM(escola.num_funcionarios)', 'total')
-        .field("'Brasil'", 'name')
-        .field('escola.ano_censo', 'year')
-        .from('escola')
-        .group('escola.ano_censo')
-        .order('escola.ano_censo')
-        .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (dependencia_adm_id = 2 OR dependencia_adm_id = 3 OR dependencia_adm_id = 4)');
-    }
-    next();
-}, rqfSchool.build(), query, rqfSchool.parse(), id2str.transform(), (req, res, next) => {
-
-    req.allEmployees = req.result;
 
-    req.resetSql();
-    delete req.dims.function;
-    if ("school" in req.filter) {
-        req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
-        .field("'Brasil'", 'name')
-        .field('docente_por_escola.ano_censo', 'year')
-        .from('docente_por_escola')
-        .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
-        .group('docente_por_escola.ano_censo')
-        .order('docente_por_escola.ano_censo')
-        .where('(docente_por_escola.dependencia_adm_id > 1) AND (docente_por_escola.escola_id=' + req.filter.school + ')');
-    } else if ("school" in req.dims) {
-        req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
-        .field("'Brasil'", 'name')
-        .field('docente_por_escola.ano_censo', 'year')
-        .field('escola.nome_escola', 'school_name')
-        .from('docente_por_escola')
-        .join('escola', null, 'docente_por_escola.escola_id=escola.id AND docente_por_escola.ano_censo=escola.ano_censo')
-        .group('docente_por_escola.ano_censo')
-        .order('docente_por_escola.ano_censo')
-        .where('(docente_por_escola.dependencia_adm_id > 1)');
-    } else {
-        req.sql.field('SUM(docente_por_escola.total_professores)', 'total')
-        .field("'Brasil'", 'name')
-        .field('docente_por_escola.ano_censo', 'year')
-        .from('docente_por_escola')
-        .group('docente_por_escola.ano_censo')
-        .order('docente_por_escola.ano_censo')
-        .where('(docente_por_escola.dependencia_adm_id > 1)');
-    }
+    req.sql.field('SUM(funcionarios_por_escola.total)', 'total')
+    .field('funcionarios_por_escola.ano_censo', 'year')
+    .from('funcionarios_por_escola')
+    .group('funcionarios_por_escola.ano_censo')
+    .order('funcionarios_por_escola.ano_censo')
     next();
 
 }, rqfSchool.build(), query, rqfSchool.parse(), id2str.transform(), (req, res, next) => {
-
+    
     req.allTeacher = req.result;
-    console.log("AAA");
-    console.log("BBB");
-    console.log("DEI UM RESET")
     req.resetSql();
-    console.log("VOU PRINTAR O REQ DIMS")
-    console.log(req.dims);
-    console.log(req.filter);
     if ("function" in req.dims) {
-        console.log("TO NO IF");
         req.sql.field('SUM(CASE WHEN escola.qt_prof_admin = 88888 THEN 0 ELSE escola.qt_prof_admin END)', 'qtde_admin')
         .field('SUM(CASE WHEN escola.qtde_prof_servicos_gerais = 88888 THEN 0 ELSE escola.qtde_prof_servicos_gerais END) AS qtde_servicos_gerais')
         .field('SUM(CASE WHEN escola.qtde_prof_bibliotecario = 88888 THEN 0 ELSE escola.qtde_prof_bibliotecario END)', 'qtde_bibliotecario')
@@ -641,7 +586,6 @@ employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
         .where('(escola.situacao_funcionamento_pareada = 1) AND (escola.ensino_regular = 1 OR escola.ensino_eja = 1 OR escola.educacao_profissional = 1) AND (escola.dependencia_adm_id = 2 OR escola.dependencia_adm_id = 3 OR escola.dependencia_adm_id = 4) and ano_censo >= 2019');
         delete req.dims.function;
     } else {
-        console.log("AAA to no if")
         req.sql.field('SUM(CASE WHEN escola.qt_prof_admin = 88888 THEN 0 ELSE escola.qt_prof_admin END) + SUM(CASE WHEN escola.qtde_prof_servicos_gerais = 88888 THEN 0 ELSE escola.qtde_prof_servicos_gerais END) + SUM(CASE WHEN escola.qtde_prof_bibliotecario = 88888 THEN 0 ELSE escola.qtde_prof_bibliotecario END) + SUM(CASE WHEN escola.qtde_prof_saude = 88888 THEN 0 ELSE escola.qtde_prof_saude END) + SUM(CASE WHEN escola.qtde_prof_coordenador = 88888 THEN 0 ELSE escola.qtde_prof_coordenador END) + SUM(CASE WHEN escola.qtde_prof_fono = 88888 THEN 0 ELSE escola.qtde_prof_fono END) + SUM(CASE WHEN escola.qtde_prof_nutricionista = 88888 THEN 0 ELSE escola.qtde_prof_nutricionista END) + SUM(CASE WHEN escola.qtde_prof_psicologo = 88888 THEN 0 ELSE escola.qtde_prof_psicologo END) + SUM(CASE WHEN escola.qtde_prof_alimentacao = 88888 THEN 0 ELSE escola.qtde_prof_alimentacao END) + SUM(CASE WHEN escola.qtde_prof_pedagogia = 88888 THEN 0 ELSE escola.qtde_prof_pedagogia END) + SUM(CASE WHEN escola.qtde_prof_secretario = 88888 THEN 0 ELSE escola.qtde_prof_secretario END) + SUM(CASE WHEN escola.qtde_prof_seguranca = 88888 THEN 0 ELSE escola.qtde_prof_seguranca END) + SUM(CASE WHEN escola.qtde_prof_monitores = 88888 THEN 0 ELSE escola.qtde_prof_monitores END)', 'total')
         .field("'Brasil'", 'name')
         .field('escola.ano_censo', 'year')
@@ -654,7 +598,6 @@ employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
 
 }, rqfSchool.build(), query,  rqfSchool.parse(), id2str.transform(),  (req, res, next) => {
 
-    console.log(req.dims)
     if ("function" in req.dims) {
         let aux_employes = formatFunction(req.result, req.dims);
         req.schoolTable = aux_employes;
@@ -663,12 +606,12 @@ employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
     }
 
     if (req.filter.min_year <= 2018 && req.filter.max_year <= 2018) {
-        let aux_employees = matchQueries(req.allEmployees, req.allTeacher);
+        let aux_employees = req.allTeacher;
         req.result = aux_employees;
     } else if (req.filter.min_year >= 2019 && req.filter.max_year >= 2019) {
         req.result = req.schoolTable;
     } else if (req.filter.min_year <= 2018 && req.filter.max_year >= 2019) {
-        let aux_employees = matchQueries(req.allEmployees, req.allTeacher);
+        let aux_employees = req.allTeacher;
         req.result = aux_employees.concat(req.schoolTable);
     }
     next();
-- 
GitLab


From c6d18e45d044b327fe6759da14059a1c0e765ae5 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Wed, 27 May 2020 10:55:30 -0300
Subject: [PATCH 27/53] Add SC 2009 condition

---
 src/libs/routes/employees.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/libs/routes/employees.js b/src/libs/routes/employees.js
index abaa191b..c9504a7e 100644
--- a/src/libs/routes/employees.js
+++ b/src/libs/routes/employees.js
@@ -558,6 +558,7 @@ employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
     .from('funcionarios_por_escola')
     .group('funcionarios_por_escola.ano_censo')
     .order('funcionarios_por_escola.ano_censo')
+    .where('(docente.ano_censo <> 2009 or docente.escola_estado_id <> 42)')
     next();
 
 }, rqfSchool.build(), query, rqfSchool.parse(), id2str.transform(), (req, res, next) => {
-- 
GitLab


From 68411e9dea2c440cf175a7b1969a78786b895308 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Wed, 27 May 2020 10:59:25 -0300
Subject: [PATCH 28/53] Fix error

---
 src/libs/routes/employees.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/routes/employees.js b/src/libs/routes/employees.js
index c9504a7e..cee84120 100644
--- a/src/libs/routes/employees.js
+++ b/src/libs/routes/employees.js
@@ -558,7 +558,7 @@ employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
     .from('funcionarios_por_escola')
     .group('funcionarios_por_escola.ano_censo')
     .order('funcionarios_por_escola.ano_censo')
-    .where('(docente.ano_censo <> 2009 or docente.escola_estado_id <> 42)')
+    .where('(funcionarios_por_escola.ano_censo <> 2009 or funcionarios_por_escola.estado_id <> 42)')
     next();
 
 }, rqfSchool.build(), query, rqfSchool.parse(), id2str.transform(), (req, res, next) => {
-- 
GitLab


From 0f038a6b671d4009e5641a6ee487c4b00cd76735 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vic_picussa2@hotmail.com>
Date: Thu, 28 May 2020 10:51:19 -0300
Subject: [PATCH 29/53] Courses variable name fix

---
 src/libs/routes/courseCount.js | 56 +++++++++++++++++-----------------
 1 file changed, 28 insertions(+), 28 deletions(-)

diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 28de65c5..294f98f4 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -366,7 +366,7 @@ rqf.addField({
     name:'ocde_detailed',
     table: 'curso_ens_superior',
     tableField: ['cod_ocde_area_detalhada', 'nome_ocde_area_detalhada'],
-    resultField: ['ocde_detailed_id', 'ocde_datailed_name'],
+    resultField: ['ocde_detailed_id', 'ocde_detailed_name'],
     where: {
         relation: '=',
         type: 'integer',
@@ -396,7 +396,7 @@ rqf.addField({
     name:'cine_detailed',
     table: 'curso_ens_superior',
     tableField: ['cod_cine_area_detalhada', 'nome_cine_area_detalhada'],
-    resultField: ['cine_detailed_id', 'cine_datailed_name'],
+    resultField: ['cine_detailed_id', 'cine_detailed_name'],
     where: {
         relation: '=',
         type: 'integer',
@@ -489,11 +489,11 @@ rqf.addField({
 courseCountApp.get('/', rqf.parse(), (req, res, next) => {
     if (("state" in req.dims) || ("city" in req.dims) || ("region" in req.dims) ||
         ("state" in req.filter) || ("city" in req.filter) || ("region" in req.filter)) {
-	req.sql.from('curso_ens_superior')
+	    req.sql.from('curso_ens_superior')
             .field('COUNT(DISTINCT curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
             .field('curso_ens_superior.ano_censo')
-	    .field('curso_ens_superior.ano_censo', 'year')
+	        .field('curso_ens_superior.ano_censo', 'year')
             .group('curso_ens_superior.ano_censo')
             .order('curso_ens_superior.ano_censo')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
@@ -501,19 +501,19 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
     } else if ("localoffer" in req.dims) {
 	 if ("university" in req.dims) {
 	     req.sql.from('curso_ens_superior')
-                .field('curso_ens_superior.ano_censo')
-                .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
-                .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
-                .where('curso_ens_superior.cod_nivel_academico = 1')
-                .group('curso_ens_superior.ano_censo')
-                .order('curso_ens_superior.ano_censo')
-               .order('localoferta_ens_superior.cod_local_oferta');
+            .field('curso_ens_superior.ano_censo')
+            .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
+            .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
+            .where('curso_ens_superior.cod_nivel_academico = 1')
+            .group('curso_ens_superior.ano_censo')
+            .order('curso_ens_superior.ano_censo')
+            .order('localoferta_ens_superior.cod_local_oferta');
 
 	 } else {
          req.sql.from('curso_ens_superior')
             .field('curso_ens_superior.ano_censo')
             .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
-	    .field('localoferta_ens_superior.cod_ies', 'university_id')
+	        .field('localoferta_ens_superior.cod_ies', 'university_id')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
             .where('curso_ens_superior.cod_nivel_academico = 1')
             .group('curso_ens_superior.ano_censo')
@@ -546,7 +546,7 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
 }, rqf.build(), query, id2str.transform(), (req, res, next) => {
     if ("localoffer" in req.dims) {
         let baseq = req.sql.clone()
-	let iesq = squel.select()
+	    let iesq = squel.select()
 
         iesq.from('ies_ens_superior')
             .field('ies_ens_superior.cod_ies')
@@ -554,22 +554,22 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
 
 	req.sql = squel.select().from(baseq, 'bq')
             .field("'Brasil'", 'name')
-	    .field('ano_censo', 'year')
-	    .field('total')
-	    .field('university_id')
-	    .field('nome_ies', 'university_name')
-	    .field('localoffer_id')
-	    .field('localoffer_name')
+            .field('ano_censo', 'year')
+            .field('total')
+            .field('university_id')
+            .field('nome_ies', 'university_name')
+            .field('localoffer_id')
+            .field('localoffer_name')
             .join(iesq, 'iq', 'iq.cod_ies=bq.university_id');
     } 
     if ("city" in req.dims) {
         let baseq = req.sql.clone()
-	let cityq = squel.select()
-        cityq.from('municipio')
+	    let cityq = squel.select()
+            cityq.from('municipio')
             .field('municipio.id')
             .field('municipio.nome');
 
-        req.sql = squel.select().from(baseq, 'bq')
+            req.sql = squel.select().from(baseq, 'bq')
             .field("'Brasil'", 'name')
             .field('ano_censo', 'year')
             .field('total')
@@ -579,18 +579,18 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
     }
     if ("university" in req.dims) {
         let baseq = req.sql.clone()
-	let iesq = squel.select()
+	    let iesq = squel.select()
 
         iesq.from('ies_ens_superior')
             .field('ies_ens_superior.cod_ies')
             .field('ies_ens_superior.nome_ies');
 
-	req.sql = squel.select().from(baseq, 'bq')
+	    req.sql = squel.select().from(baseq, 'bq')
             .field("'Brasil'", 'name')
-	    .field('ano_censo', 'year')
-	    .field('total')
-	    .field('university_id')
-	    .field('nome_ies', 'university_name')
+            .field('ano_censo', 'year')
+            .field('total')
+            .field('university_id')
+            .field('nome_ies', 'university_name')
             .join(iesq, 'iq', 'iq.cod_ies=bq.university_id'); 
     }
     next();
-- 
GitLab


From 4039497caf877b4ad54098e01dca6c3d49f1dc78 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Fri, 29 May 2020 09:31:10 -0300
Subject: [PATCH 30/53] Add null case in employees

---
 src/libs/routes/employees.js | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/src/libs/routes/employees.js b/src/libs/routes/employees.js
index cee84120..612ea4cd 100644
--- a/src/libs/routes/employees.js
+++ b/src/libs/routes/employees.js
@@ -447,6 +447,7 @@ rqfTeacher.addField({
     }
 });
 
+
 function formatFunction(queryOriginal,reqDims) {
     delete reqDims.size;
     delete reqDims.function;
@@ -465,7 +466,8 @@ function formatFunction(queryOriginal,reqDims) {
         qtde_pedagogia: "Pedagogia",
         qtde_secretario: "Secretário",
         qtde_seguranca: "Segurança",
-        qtde_monitores: "Monitores"
+        qtde_monitores: "Monitores",
+        qtde_null: "Não Classificada"
     }
     let resultObj = []
     //Nesse caso apenas precisamos acertar as dimensoes que o banco retorna, ou seja, criando um objeto para cada funcao de funcionario
@@ -551,18 +553,26 @@ function matchQueries(queryTotal, queryPartial) {
 employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
     req.allTeacher = {}
     req.schoolTable = {}
-    delete req.dims.function;
-
-    req.sql.field('SUM(funcionarios_por_escola.total)', 'total')
-    .field('funcionarios_por_escola.ano_censo', 'year')
-    .from('funcionarios_por_escola')
-    .group('funcionarios_por_escola.ano_censo')
-    .order('funcionarios_por_escola.ano_censo')
-    .where('(funcionarios_por_escola.ano_censo <> 2009 or funcionarios_por_escola.estado_id <> 42)')
+
+    if ("function" in req.dims) {
+        delete req.dims.function;
+        req.sql.field('SUM(funcionarios_por_escola.total)', 'qtde_null')
+        .field('funcionarios_por_escola.ano_censo', 'year')
+        .from('funcionarios_por_escola')
+        .group('funcionarios_por_escola.ano_censo')
+        .order('funcionarios_por_escola.ano_censo')
+    } else {
+        delete req.dims.function;
+        req.sql.field('SUM(funcionarios_por_escola.total)', 'total')
+        .field('funcionarios_por_escola.ano_censo', 'year')
+        .from('funcionarios_por_escola')
+        .group('funcionarios_por_escola.ano_censo')
+        .order('funcionarios_por_escola.ano_censo')
+    }
     next();
 
 }, rqfSchool.build(), query, rqfSchool.parse(), id2str.transform(), (req, res, next) => {
-    
+
     req.allTeacher = req.result;
     req.resetSql();
     if ("function" in req.dims) {
@@ -601,6 +611,7 @@ employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
 
     if ("function" in req.dims) {
         let aux_employes = formatFunction(req.result, req.dims);
+        req.allTeacher = formatFunction(req.allTeacher, req.dims);
         req.schoolTable = aux_employes;
     } else {
         req.schoolTable = req.result
-- 
GitLab


From f8dda283ba0d8484892281caa3fb3aee2e0ec19c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Fri, 29 May 2020 09:33:48 -0300
Subject: [PATCH 31/53] Change classroomCount salas var

---
 src/libs/routes/classroomCount.js |  2 +-
 src/libs/routes/schoolLocation.js | 11 -----------
 2 files changed, 1 insertion(+), 12 deletions(-)

diff --git a/src/libs/routes/classroomCount.js b/src/libs/routes/classroomCount.js
index bf447a3b..4f1c1991 100644
--- a/src/libs/routes/classroomCount.js
+++ b/src/libs/routes/classroomCount.js
@@ -285,7 +285,7 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => {
     req.dims.location = true;
     req.dims.school_building = true;
 
-    req.sql.field('SUM(escola.num_salas)', 'total')
+    req.sql.field('SUM(escola.qtde_salas_utilizadas_dentro)', 'total')
     .field("'Brasil'", 'name')
     .field('escola.ano_censo', 'year')
     .from('escola')
diff --git a/src/libs/routes/schoolLocation.js b/src/libs/routes/schoolLocation.js
index a38b019a..5c0d98ff 100644
--- a/src/libs/routes/schoolLocation.js
+++ b/src/libs/routes/schoolLocation.js
@@ -92,21 +92,10 @@ rqf.addField({
         foreign: 'municipio_id',
         foreignTable: '@'
     }
-}, 'dims').addValueToField({
-    name: 'school',
-    table: 'localizacao_escolas',
-    tableField: ['nome', 'id'],
-    resultField: ['school_name', 'school_id'],
-    where: {
-        relation: '=',
-        type: 'integer',
-        field: 'id'
-    },
 }, 'dims');
 
 schoolLocationApp.get('/', rqf.parse(), (req, res, next) => {
     req.dims.city=true;
-    req.dims.school=true;
     req.dims.mesoregion=true;
     req.dims.microregion=true;
 
-- 
GitLab


From dc22f8773dee229c19b73ef5e7f7fceff367e7b2 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd@inf.ufpr.br>
Date: Fri, 29 May 2020 09:41:02 -0300
Subject: [PATCH 32/53] Update src/libs/routes/employees.js

---
 src/libs/routes/employees.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/routes/employees.js b/src/libs/routes/employees.js
index 612ea4cd..2985368a 100644
--- a/src/libs/routes/employees.js
+++ b/src/libs/routes/employees.js
@@ -467,7 +467,7 @@ function formatFunction(queryOriginal,reqDims) {
         qtde_secretario: "Secretário",
         qtde_seguranca: "Segurança",
         qtde_monitores: "Monitores",
-        qtde_null: "Não Classificada"
+        qtde_null: "Não Classificado"
     }
     let resultObj = []
     //Nesse caso apenas precisamos acertar as dimensoes que o banco retorna, ou seja, criando um objeto para cada funcao de funcionario
-- 
GitLab


From 59f7885fd82b7c3d3f2b16572603bd6357335dfa Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd@inf.ufpr.br>
Date: Fri, 29 May 2020 09:42:28 -0300
Subject: [PATCH 33/53] Update employees.js

-- 
GitLab


From 9db039a6c036bd1fc8153e45c1f8dd7aad7f00a7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Fri, 29 May 2020 09:55:12 -0300
Subject: [PATCH 34/53] Change classroom qnt salas var

---
 src/libs/routes/classroom.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/routes/classroom.js b/src/libs/routes/classroom.js
index 538ca7b0..8e2b6a7e 100644
--- a/src/libs/routes/classroom.js
+++ b/src/libs/routes/classroom.js
@@ -244,7 +244,7 @@ rqf.addField({
 
 classroomApp.get('/', cache('15 day'), rqf.parse(), rqf.build(), (req, res, next) => {
     req.sql.from('escola')
-        .field('SUM(escola.num_salas)', 'total')
+        .field('SUM(escola.qtde_salas_utilizadas_dentro)', 'total')
         .field("'Brasil'", 'name')
         .field('escola.ano_censo', 'year')
         .group('escola.ano_censo')
-- 
GitLab


From c06c2b1cd2e486e5bb4e3dfc4ecff714748ea3fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Fri, 29 May 2020 10:12:02 -0300
Subject: [PATCH 35/53] Change simcaq classCount base filter

---
 src/libs/routes/classCount.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/routes/classCount.js b/src/libs/routes/classCount.js
index efa33011..27132383 100644
--- a/src/libs/routes/classCount.js
+++ b/src/libs/routes/classCount.js
@@ -367,7 +367,7 @@ classCountApp.get('/count', rqf.parse(), (req, res, next) => {
    .from('turma')
    .group('turma.ano_censo')
    .order('turma.ano_censo')
-   .where('turma.tipo_turma_id = 0 AND turma.dependencia_adm_id <= 3 AND ((turma.etapa_resumida >= 1 AND turma.etapa_resumida <= 7) OR turma.etapa_resumida = 99)');
+   .where('turma.local_turma = 0 AND turma.dependencia_adm_id <= 3 AND ((turma.etapa_resumida >= 1 AND turma.etapa_resumida <= 7) OR turma.etapa_resumida = 99)');
    next();
 }, rqf.build(), query, addMissing(rqf), id2str.transform(), response('class_count'));
 
-- 
GitLab


From 40e673b8779c099eb3aa5b7a1581247bdad632b3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Fri, 29 May 2020 10:22:49 -0300
Subject: [PATCH 36/53] Update dailyChargeAmount filters

---
 src/libs/routes/dailyChargeAmount.js | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js
index 4eef5dcd..d2303a39 100644
--- a/src/libs/routes/dailyChargeAmount.js
+++ b/src/libs/routes/dailyChargeAmount.js
@@ -373,7 +373,7 @@ dailyChargeAmountApp.get('/', rqf.parse(), (req, res, next) => {
         .group('turma.etapa_resumida')
         .order('turma.ano_censo')
         .order('turma.etapa_resumida')
-        .where('turma.tipo_turma_id <= 3 and turma.dependencia_adm_id <= 3')
+        .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL)) and turma.dependencia_adm_id <= 3')
     } else {
         res.status(400);
         next({
@@ -428,13 +428,13 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
         .field('duracao_turma')
         .field('etapas_mod_ensino_segmento_id')
         .field('ROW_NUMBER() OVER(PARTITION BY etapas_mod_ensino_segmento_id ORDER BY duracao_turma)', 'rowno')
-        .where('tipo_turma_id <= 3')
+        .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL))')
 
         let tableG = baseQ.clone();
         tableG.from('turma')
         .field('1+COUNT(*)', 'counter')
         .field('etapas_mod_ensino_segmento_id')
-        .where('tipo_turma_id <= 3')
+        .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL))')
         .group('etapas_mod_ensino_segmento_id')
 
         let joinRG = squel.select();
@@ -458,7 +458,8 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
         .group('turma.etapas_mod_ensino_segmento_id')
         .order('turma.ano_censo')
         .order('turma.etapas_mod_ensino_segmento_id')
-        .where('turma.tipo_turma_id <= 3 and m.etapas_mod_ensino_segmento_id = turma.etapas_mod_ensino_segmento_id')
+        .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL)) \
+                and m.etapas_mod_ensino_segmento_id = turma.etapas_mod_ensino_segmento_id')
     } else {
         res.status(400);
         next({
-- 
GitLab


From b04ef94c7b383946ab16f61232489566a1c1f89e Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Fri, 29 May 2020 10:31:56 -0300
Subject: [PATCH 37/53] Add SC condition

---
 src/libs/routes/employees.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/libs/routes/employees.js b/src/libs/routes/employees.js
index 2985368a..cc60affa 100644
--- a/src/libs/routes/employees.js
+++ b/src/libs/routes/employees.js
@@ -561,6 +561,7 @@ employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
         .from('funcionarios_por_escola')
         .group('funcionarios_por_escola.ano_censo')
         .order('funcionarios_por_escola.ano_censo')
+				.where('funcionarios_por_escola.ano_censo <> 2009 or funcionarios_por_escola.estado_id <> 42')
     } else {
         delete req.dims.function;
         req.sql.field('SUM(funcionarios_por_escola.total)', 'total')
@@ -568,6 +569,7 @@ employeesApp.get('/', rqfSchool.parse(), (req, res, next) => {
         .from('funcionarios_por_escola')
         .group('funcionarios_por_escola.ano_censo')
         .order('funcionarios_por_escola.ano_censo')
+				.where('funcionarios_por_escola.ano_censo <> 2009 or funcionarios_por_escola.estado_id <> 42')
     }
     next();
 
-- 
GitLab


From 7ca2bf289a40690a06cc65f28a36e872d9f8f6ea Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Fri, 29 May 2020 11:33:10 -0300
Subject: [PATCH 38/53] Change employees category

---
 src/libs/routes/employees.js | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/libs/routes/employees.js b/src/libs/routes/employees.js
index cc60affa..43fcc476 100644
--- a/src/libs/routes/employees.js
+++ b/src/libs/routes/employees.js
@@ -117,12 +117,20 @@ employeesApp.get('/rural_location', (req, res, next) => {
 
 employeesApp.get('/function', (req, res, next) => {
     req.result = [
-        {id: 1, name: "Urbana"},
-        {id: 2, name: "Rural"},
-        {id: 3, name: "Rural - Área de assentamento"},
-        {id: 4, name: "Rural - Terra indígena"},
-        {id: 5, name: "Rural - Área remanescente de quilombos"},
-        {id: 6, name: "Rural - Unidade de uso sustentável"}
+        {id: 0, name: "Administrativos"},
+        {id: 1, name: "Serviços Gerais"},
+        {id: 2, name: "Bibliotecário"},
+        {id: 3, name: "Saúde"},
+        {id: 4, name: "Coordenador"},
+        {id: 5, name: "Fonoaudiólogo"},
+        {id: 6, name: "Nutricionista"},
+        {id: 7, name: "Psicólogo"},
+        {id: 8, name: "Alimentação"},
+        {id: 9, name: "Pedagogia"},
+        {id: 10, name: "Secretário"},
+        {id: 11, name: "Segurança"},
+        {id: 12, name: "Monitores"},
+        {id: 99, name: "Não Classificado"}
     ];
     next();
 }, response('function'));
-- 
GitLab


From b9e688d3d0088d900d6b4777d733e5e88a66b12a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Tue, 2 Jun 2020 10:39:09 -0300
Subject: [PATCH 39/53] Update infrastructure with 2019 vars

---
 src/libs/routes/cub.js                  |  2 +-
 src/libs/routes/schoolInfrastructure.js | 84 +++++++++++--------------
 2 files changed, 37 insertions(+), 49 deletions(-)

diff --git a/src/libs/routes/cub.js b/src/libs/routes/cub.js
index 5310f0be..3707e7f0 100644
--- a/src/libs/routes/cub.js
+++ b/src/libs/routes/cub.js
@@ -173,6 +173,6 @@ cubApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     }
 
     next();
-}, query, addMissing(rqf), id2str.transform(), response('cub'));
+}, query, id2str.transform(), response('cub'));
 
 module.exports = cubApp;
diff --git a/src/libs/routes/schoolInfrastructure.js b/src/libs/routes/schoolInfrastructure.js
index 32f316a4..ced26a2f 100644
--- a/src/libs/routes/schoolInfrastructure.js
+++ b/src/libs/routes/schoolInfrastructure.js
@@ -360,35 +360,24 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.queryIndex.allSchoolsNotSchoolBuilding = req.querySet.push(allSchoolsNotSchoolBuilding) - 1;
 
     // Bibliotecas
-    // Se (situacao_de_funcionamento=1) & (dependencia_adm_id<=3) & (CEBES027P1=1) & 
-    // (ensino_regular=1 | ensino_eja=1 |    educacao_profissional=1) & 
-    // (reg_fund_ai_t1=1 | reg_fund_af_t1=1 | reg_medio_medio_t1=1 | ensino_eja_fund= 1 |  
-    // ensino_eja_medio= 1 | ensino_eja_prof= 1 | esp_eja_fund=1 | esp_eja_medio=1 | ensino_esp_exclusiva_eja_prof=1) & (localizacao_id=1) então conta id
-    let allLibraries = allUrbanSchools.clone();
-    allLibraries.where('reg_fund_ai_t1=1 OR reg_fund_af_t1=1 OR reg_medio_medio_t1=1 OR ensino_eja_fund= 1 OR ensino_eja_medio= 1 OR ensino_eja_prof= 1 OR esp_eja_fund=1 OR esp_eja_medio=1 OR ensino_esp_exclusiva_eja_prof=1');
-    req.queryIndex.allLibraries = req.querySet.push(allLibraries) - 1;
+    req.queryIndex.allLibraries = req.queryIndex.allUrbanSchools;
 
-    let haveLibraries = allLibraries.clone();
+    let haveLibraries = allUrbanSchools.clone();
     haveLibraries.where('escola.biblioteca = 1');
     req.queryIndex.haveLibraries = req.querySet.push(haveLibraries) - 1;
 
-    let needLibraries = allLibraries.clone();
+    let needLibraries = allUrbanSchools.clone();
     needLibraries.where('escola.biblioteca = 0');
     req.queryIndex.needLibraries = req.querySet.push(needLibraries) - 1;
 
-    // Bibliotecas/Sala de leitura
-    // Se (situacao_de_funcionamento=1) & (dependencia_adm_id<=3) & (CEBES027P1=1) & (ensino_regular=1 | ensino_eja=1 | educacao_profissional=1) & 
-    // (reg_fund_ai_t1=1 | reg_fund_af_t1=1 | reg_medio_medio_t1=1 | ensino_eja_fund= 1 |  ensino_eja_medio= 1 | 
-    // ensino_eja_prof= 1 | esp_eja_fund=1 | esp_eja_medio=1 | ensino_esp_exclusiva_eja_prof=1) & (localizacao_id=2) então conta id
-    let allLibrariesReadingRoom = allCountrySchools.clone();
-    allLibrariesReadingRoom.where('reg_fund_ai_t1=1 OR reg_fund_af_t1=1 OR reg_medio_medio_t1=1 OR ensino_eja_fund=1 OR ensino_eja_medio=1 OR ensino_eja_prof=1 OR esp_eja_fund=1 OR esp_eja_medio=1 OR ensino_esp_exclusiva_eja_prof=1');
-    req.queryIndex.allLibrariesReadingRoom = req.querySet.push(allLibrariesReadingRoom) - 1;
+    // Sala de leitura
+    req.queryIndex.allLibrariesReadingRoom = req.queryIndex.allCountrySchools;
 
-    let haveLibrariesReadingRoom = allLibrariesReadingRoom.clone();
+    let haveLibrariesReadingRoom = allCountrySchools.clone();
     haveLibrariesReadingRoom.where('escola.biblioteca_sala_leitura = true');
     req.queryIndex.haveLibrariesReadingRoom = req.querySet.push(haveLibrariesReadingRoom) - 1;
 
-    let needLibrariesReadingRoom = allLibrariesReadingRoom.clone();
+    let needLibrariesReadingRoom = allCountrySchools.clone();
     needLibrariesReadingRoom.where('escola.biblioteca_sala_leitura = false');
     req.queryIndex.needLibrariesReadingRoom = req.querySet.push(needLibrariesReadingRoom) - 1;
 
@@ -437,20 +426,20 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     needKidsPark.where('escola.parque_infantil = 0');
     req.queryIndex.needKidsPark = req.querySet.push(needKidsPark) - 1;
 
-    // Berçário
-    let allCribs = allSchools.clone();
-    allCribs.where('escola.reg_infantil_creche_t1 = 1');
-    req.queryIndex.allCribs = req.querySet.push(allCribs) - 1;
+    // // Berçário
+    // let allCribs = allSchools.clone();
+    // allCribs.where('escola.reg_infantil_creche_t1 = 1');
+    // req.queryIndex.allCribs = req.querySet.push(allCribs) - 1;
 
-    let haveCribs = allCribs.clone();
-    haveCribs.where('escola.bercario = 1');
-    req.queryIndex.haveCribs = req.querySet.push(haveCribs) - 1;
+    // let haveCribs = allCribs.clone();
+    // haveCribs.where('escola.bercario = 1');
+    // req.queryIndex.haveCribs = req.querySet.push(haveCribs) - 1;
 
-    let needCribs = allCribs.clone();
-    needCribs.where('escola.bercario = 0');
-    req.queryIndex.needCribs = req.querySet.push(needCribs) - 1;
+    // let needCribs = allCribs.clone();
+    // needCribs.where('escola.bercario = 0');
+    // req.queryIndex.needCribs = req.querySet.push(needCribs) - 1;
 
-    // Quadra Coberta
+    // Quadra de esportes
     let allSportsCourt = allSchools.clone();
     allSportsCourt.where('reg_fund_ai_t1=1  or reg_fund_af_t1=1 or  reg_medio_medio_t1=1  or  ensino_eja_fund= 1 or ensino_eja_medio= 1 or ensino_eja_prof= 1 or esp_eja_fund=1 or esp_eja_medio=1 or ensino_esp_exclusiva_eja_prof=1');
     req.queryIndex.allSportsCourt = req.querySet.push(allSportsCourt) - 1;
@@ -463,7 +452,7 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     needSportsCourt.where('escola.quadra_esportes = 0');
     req.queryIndex.needSportsCourt = req.querySet.push(needSportsCourt) - 1;
 
-    // Cobertura de quadra esportiva
+    // Quadras a serem cobertas
     // Se (situacao_de_funcionamento=1) and (ensino_regular=1 OR ensino_eja=1 OR educacao_profissional=1) and (local_func_predio_escolar=1) and 
     // (dependencia_adm_id<=3) and (reg_fund_ai_t1=1  or reg_fund_af_t1=1 or  reg_medio_medio_t1=1  or  ensino_eja_fund= 1 or ensino_eja_medio= 1 or 
     // ensino_eja_prof= 1 or esp_eja_fund=1 or esp_eja_medio=1 or ensino_esp_exclusiva_eja_prof=1) and (quadra_esportes_descoberta=1) então conta id
@@ -479,7 +468,7 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.queryIndex.allCourtyard = req.queryIndex.allSchools;
 
     let haveCourtyard = allSchools.clone();
-    haveCourtyard.where('escola.patio = 2 OR escola.patio = 1');
+    haveCourtyard.where('escola.patio = 1 OR escola.patio = 2');
     req.queryIndex.haveCourtyard = req.querySet.push(haveCourtyard) - 1;
 
     let needCourtyard = allSchools.clone();
@@ -488,7 +477,7 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
 
     // Cobertura do Pátio
     let allCourtyardCoverage = allSchools.clone();
-    allCourtyardCoverage.where('escola.patio = 1');
+    allCourtyardCoverage.where('escola.patio_descoberto = 1');
     req.queryIndex.allCourtyardCoverage = req.querySet.push(allCourtyardCoverage) - 1;
 
     req.queryIndex.haveCourtyardCoverage = req.queryIndex.allCourtyardCoverage; // It must be []
@@ -585,15 +574,15 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     needBroadbandInternet.where('escola.internet_banda_larga = 0');
     req.queryIndex.needBroadbandInternet = req.querySet.push(needBroadbandInternet) - 1;
 
-    // Sanitário dentro do prédio
+    // Banheiro
     req.queryIndex.allInsideBathroom = req.queryIndex.allSchools;
 
     let haveInsideBathroom = allSchools.clone();
-    haveInsideBathroom.where('escola.sanitario_dentro_predio = 1');
+    haveInsideBathroom.where('escola.banheiro = 1');
     req.queryIndex.haveInsideBathroom = req.querySet.push(haveInsideBathroom) - 1;
 
     let needInsideBathroom = allSchools.clone();
-    needInsideBathroom.where('escola.sanitario_dentro_predio = 0');
+    needInsideBathroom.where('escola.banheiro = 0');
     req.queryIndex.needInsideBathroom = req.querySet.push(needInsideBathroom) - 1;
 
     // Banheiro adequado para educação infantil dentro do prédio
@@ -615,55 +604,55 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.queryIndex.allEletricPower = req.queryIndex.allSchools;
 
     let haveEletricPower = allSchools.clone();
-    haveEletricPower.where('escola.fornecimento_energia = 1');
+    haveEletricPower.where('escola.energia_inexistente = 0');
     req.queryIndex.haveEletricPower = req.querySet.push(haveEletricPower) - 1;
 
     let needEletricPower = allSchools.clone();
-    needEletricPower.where('escola.fornecimento_energia = 0');
+    needEletricPower.where('escola.energia_inexistente = 1');
     req.queryIndex.needEletricPower = req.querySet.push(needEletricPower) - 1;
 
     // Abastecimento de água
     req.queryIndex.allWaterSupply = req.queryIndex.allSchools;
 
     let haveWaterSupply = allSchools.clone();
-    haveWaterSupply.where('escola.fornecimento_agua = 1');
+    haveWaterSupply.where('escola.agua_inexistente = 0');
     req.queryIndex.haveWaterSupply = req.querySet.push(haveWaterSupply) - 1;
 
     let needWaterSupply = allSchools.clone();
-    needWaterSupply.where('escola.fornecimento_agua = 0');
+    needWaterSupply.where('escola.agua_inexistente = 1');
     req.queryIndex.needWaterSupply = req.querySet.push(needWaterSupply) - 1;
 
-    // Água filtrada
+    // Água Potável
     req.queryIndex.allFilteredWater = req.queryIndex.allSchools;
 
     let haveFilteredWater = allSchools.clone();
-    haveFilteredWater.where('escola.agua_filtrada = 1');
+    haveFilteredWater.where('escola.agua_potavel = 1');
     req.queryIndex.haveFilteredWater = req.querySet.push(haveFilteredWater) - 1;
 
     let needFilteredWater = allSchools.clone();
-    needFilteredWater.where('escola.agua_filtrada = 0');
+    needFilteredWater.where('escola.agua_potavel = 0');
     req.queryIndex.needFilteredWater = req.querySet.push(needFilteredWater) - 1;
 
     // Coleta de esgoto
     req.queryIndex.allSewage = req.queryIndex.allSchools;
 
     let haveSewage = allSchools.clone();
-    haveSewage.where('escola.esgoto_sanitario = 1');
+    haveSewage.where('escola.esgoto_rede_publica = 1 OR escola.esgoto_fossa_septica = 1');
     req.queryIndex.haveSewage = req.querySet.push(haveSewage) - 1;
 
     let needSewage = allSchools.clone();
-    needSewage.where('escola.esgoto_sanitario = 0');
+    needSewage.where('escola.esgoto_rede_publica = 0 AND escola.esgoto_fossa_septica = 0');
     req.queryIndex.needSewage = req.querySet.push(needSewage) - 1;
 
     // Dependências adaptada para pessoas com deficiências
     req.queryIndex.allAdaptedBuilding = req.queryIndex.allSchools;
 
     let haveAdaptedBuilding = allSchools.clone();
-    haveAdaptedBuilding.where('escola.dependencias_pne = 1');
+    haveAdaptedBuilding.where('escola.acessibilidade_inexistente = 0');
     req.queryIndex.haveAdaptedBuilding = req.querySet.push(haveAdaptedBuilding) - 1;
 
     let needAdaptedBuilding = allSchools.clone();
-    needAdaptedBuilding.where('escola.dependencias_pne = 0');
+    needAdaptedBuilding.where('escola.acessibilidade_inexistente = 1');
     req.queryIndex.needAdaptedBuilding = req.querySet.push(needAdaptedBuilding) - 1;
 
     // Banheiros adaptados para pessoas com deficiências
@@ -692,7 +681,7 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     let computer_lab = matchQueries(req.result[req.queryIndex.allInfLab], req.result[req.queryIndex.haveInfLab], req.result[req.queryIndex.needInfLab]);
     let science_lab = matchQueries(req.result[req.queryIndex.allScienceLab], req.result[req.queryIndex.haveScienceLab], req.result[req.queryIndex.needScienceLab]);
     let kids_park = matchQueries(req.result[req.queryIndex.allKidsPark], req.result[req.queryIndex.haveKidsPark], req.result[req.queryIndex.needKidsPark]);
-    let nursery = matchQueries(req.result[req.queryIndex.allCribs], req.result[req.queryIndex.haveCribs], req.result[req.queryIndex.needCribs]);
+    // let nursery = matchQueries(req.result[req.queryIndex.allCribs], req.result[req.queryIndex.haveCribs], req.result[req.queryIndex.needCribs]);
     let sports_court = matchQueries(req.result[req.queryIndex.allSportsCourt], req.result[req.queryIndex.haveSportsCourt], req.result[req.queryIndex.needSportsCourt]);
     let sports_court_coverage = matchQueries(req.result[req.queryIndex.allSportsCourtCoverage], [], req.result[req.queryIndex.needSportsCourtCoverage], true); // have = []
     let courtyard = matchQueries(req.result[req.queryIndex.allCourtyard], req.result[req.queryIndex.haveCourtyard], req.result[req.queryIndex.needCourtyard]);
@@ -724,7 +713,6 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
         computer_lab,
         science_lab,
         kids_park,
-        nursery,
         sports_court,
         sports_court_coverage,
         courtyard,
-- 
GitLab


From 8fa062a57e4940a58bb86e67a60ec3c572d24fff Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Wed, 3 Jun 2020 18:34:37 -0300
Subject: [PATCH 40/53] Region id order

---
 src/libs/middlewares/addMissing.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/middlewares/addMissing.js b/src/libs/middlewares/addMissing.js
index 1050a1df..21ff8af0 100644
--- a/src/libs/middlewares/addMissing.js
+++ b/src/libs/middlewares/addMissing.js
@@ -72,7 +72,7 @@ module.exports = function addMissing(rqf) {
                 }
 
                 if (dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
-                    if (['school', 'city', 'state', 'region', 'arrangement'].includes(dim)) {      // those should be ordered by its name
+                    if (['school', 'city', 'state', 'arrangement'].includes(dim)) {      // those should be ordered by its name
                         let namePosition = binarySearch(r[secondaryRqfName], dimsNames[secondaryRqfName], 0, dimsNames[secondaryRqfName].length)    // find the position of the name in alphabetical order and keep the names vector ordered
                         dimsValues[rqfName].splice(namePosition.pos, 0, r[rqfName]);
                         dimsNames[secondaryRqfName].splice(namePosition.pos, 0, r[secondaryRqfName]);
-- 
GitLab


From bb2b796c758d1a57cc9ebe7e1c81b19132aaa7af Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd15@inf.ufpr.br>
Date: Thu, 4 Jun 2020 11:18:19 -0300
Subject: [PATCH 41/53] Arrangement Filter

---
 src/libs/routes/school.js | 36 +++++++++++++++++++++++++++++++++---
 1 file changed, 33 insertions(+), 3 deletions(-)

diff --git a/src/libs/routes/school.js b/src/libs/routes/school.js
index d1f31701..b72df7c7 100644
--- a/src/libs/routes/school.js
+++ b/src/libs/routes/school.js
@@ -175,6 +175,22 @@ schoolApp.get('/education_eja', cache('15 day'), (req, res, next) => {
     next();
 }, response('education_eja'));
 
+
+schoolApp.get('/arrangement', cache('15 day'), (req, res, next) => {
+    req.result = [
+        {id: 0, name: 'Creche'},
+        {id: 1, name: 'Pré Escola'},
+        {id: 2, name: 'Ensino Fundamental - AI'},
+        {id: 3, name: 'Ensino Fundamental - AF'},
+        {id: 4, name: 'Ed. Infantil Unificada/Multietapa/Multissérie/Correção fluxo'},
+        {id: 5, name: 'Ensino Médio'},
+        {id: 6, name: 'Ensino EJA'},
+        {id: 7, name: 'Educação Profissional'},
+        {id: 8, name: 'Educação Especial Exclusiva'}
+    ];
+    next();
+}, response('arrangement'));
+
 schoolApp.get('/integral_time', cache('15 day'), (req, res, next) => {
     req.result = [
         {id: 0, name: 'Não'},
@@ -595,7 +611,9 @@ schoolApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     next();
 }, query, response('school'));
 
-schoolApp.get('/count', cache('15 day'), rqfCount.parse(), rqfCount.build(), (req, res, next) => {
+schoolApp.get('/count', cache('15 day'), rqfCount.parse(), (req, res, next) => {
+	console.log(req.filter);
+	let arrang = ["arranjo_creche", "arranjo_pre", "arranjo_fundamental_ai", "arranjo_fundamental_af", "arranjo_multietapa", "arranjo_ensino_medio", "ensino_eja", "educacao_profissional", "ensino_especial"];
 
     req.sql.from('escola')
         .field('COUNT(escola.id)', 'total')
@@ -603,8 +621,20 @@ schoolApp.get('/count', cache('15 day'), rqfCount.parse(), rqfCount.build(), (re
         .field('escola.ano_censo', 'year')
         .group('escola.ano_censo')
         .order('escola.ano_censo')
-        .where('escola.situacao_funcionamento_pareada = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)');
+        .where('escola.situacao_funcionamento_pareada = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)')
+
+	//Transforma a query em OR se tiver o filtro do arranjo
+	if (req.filter.arrangement) {
+		let arrangementQuery = "";
+		for (let i = 0; i < req.filter.arrangement.length - 1; i++) {
+			arrangementQuery += 'escola.' + arrang[req.filter.arrangement[i]] + ' = 1 OR ';
+		}
+		// o ultimo elemento precisa ser sem o OR
+		arrangementQuery += 'escola.' + arrang[req.filter.arrangement[req.filter.arrangement.length - 1]] + ' = 1';
+		req.sql.where('' + arrangementQuery);
+	}
+	delete req.filter.arrangement
     next();
-}, query, id2str.transform(), addMissing(rqfCount), response('school'));
+}, rqfCount.build(), query, id2str.transform(), addMissing(rqfCount), response('school'));
 
 module.exports = schoolApp;
-- 
GitLab


From e5ffaa0eb72434a0370fd466bb0a2f582694af99 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Fri, 12 Jun 2020 10:56:12 -0300
Subject: [PATCH 42/53] Added modifications

---
 src/libs/routes/courseCount.js | 88 ++++++++--------------------------
 1 file changed, 19 insertions(+), 69 deletions(-)

diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 294f98f4..50f7ceb8 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -273,8 +273,8 @@ rqf.addField({
 }).addValue({
     name: 'city',
     table: 'localoferta_ens_superior',
-    tableField: 'cod_municipio',
-    resultField: 'city_id',
+    tableField: ['cod_municipio', 'nome_municipio'],
+    resultField: ['city_id', 'city_name'],
     where: {
         relation: '=',
         type: 'integer',
@@ -366,7 +366,7 @@ rqf.addField({
     name:'ocde_detailed',
     table: 'curso_ens_superior',
     tableField: ['cod_ocde_area_detalhada', 'nome_ocde_area_detalhada'],
-    resultField: ['ocde_detailed_id', 'ocde_detailed_name'],
+    resultField: ['ocde_detailed_id', 'ocde_datailed_name'],
     where: {
         relation: '=',
         type: 'integer',
@@ -396,7 +396,7 @@ rqf.addField({
     name:'cine_detailed',
     table: 'curso_ens_superior',
     tableField: ['cod_cine_area_detalhada', 'nome_cine_area_detalhada'],
-    resultField: ['cine_detailed_id', 'cine_detailed_name'],
+    resultField: ['cine_detailed_id', 'cine_datailed_name'],
     where: {
         relation: '=',
         type: 'integer',
@@ -489,11 +489,10 @@ rqf.addField({
 courseCountApp.get('/', rqf.parse(), (req, res, next) => {
     if (("state" in req.dims) || ("city" in req.dims) || ("region" in req.dims) ||
         ("state" in req.filter) || ("city" in req.filter) || ("region" in req.filter)) {
-	    req.sql.from('curso_ens_superior')
+	req.sql.from('curso_ens_superior')
             .field('COUNT(DISTINCT curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
-            .field('curso_ens_superior.ano_censo')
-	        .field('curso_ens_superior.ano_censo', 'year')
+	    .field('curso_ens_superior.ano_censo', 'year')
             .group('curso_ens_superior.ano_censo')
             .order('curso_ens_superior.ano_censo')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
@@ -501,23 +500,25 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
     } else if ("localoffer" in req.dims) {
 	 if ("university" in req.dims) {
 	     req.sql.from('curso_ens_superior')
-            .field('curso_ens_superior.ano_censo')
-            .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
-            .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
-            .where('curso_ens_superior.cod_nivel_academico = 1')
-            .group('curso_ens_superior.ano_censo')
-            .order('curso_ens_superior.ano_censo')
-            .order('localoferta_ens_superior.cod_local_oferta');
+                .field('curso_ens_superior.ano_censo', 'year')
+                .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
+                .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
+                .where('curso_ens_superior.cod_nivel_academico = 1')
+                .group('curso_ens_superior.ano_censo')
+                .order('curso_ens_superior.ano_censo')
+               .order('localoferta_ens_superior.cod_local_oferta');
 
 	 } else {
          req.sql.from('curso_ens_superior')
-            .field('curso_ens_superior.ano_censo')
+            .field('curso_ens_superior.ano_censo', 'year')
             .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
-	        .field('localoferta_ens_superior.cod_ies', 'university_id')
+	    .field('localoferta_ens_superior.cod_ies', 'university_id')
+	    .field('curso_ens_superior.nome_ies', 'university_name')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
             .where('curso_ens_superior.cod_nivel_academico = 1')
             .group('curso_ens_superior.ano_censo')
             .group('localoferta_ens_superior.cod_ies')
+            .group('curso_ens_superior.nome_ies')
             .order('curso_ens_superior.ano_censo')
             .order('localoferta_ens_superior.cod_local_oferta');
 	}
@@ -525,7 +526,7 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
         req.sql.from('curso_ens_superior')
             .field('COUNT(curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
-            .field('curso_ens_superior.ano_censo')
+            .field('curso_ens_superior.ano_censo', 'year')
             .group('curso_ens_superior.cod_ies')
             .group('curso_ens_superior.ano_censo')
             .order('curso_ens_superior.cod_ies')
@@ -543,57 +544,6 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
             .where('curso_ens_superior.cod_nivel_academico = 1');
     }
     next();
-}, rqf.build(), query, id2str.transform(), (req, res, next) => {
-    if ("localoffer" in req.dims) {
-        let baseq = req.sql.clone()
-	    let iesq = squel.select()
-
-        iesq.from('ies_ens_superior')
-            .field('ies_ens_superior.cod_ies')
-            .field('ies_ens_superior.nome_ies');
-
-	req.sql = squel.select().from(baseq, 'bq')
-            .field("'Brasil'", 'name')
-            .field('ano_censo', 'year')
-            .field('total')
-            .field('university_id')
-            .field('nome_ies', 'university_name')
-            .field('localoffer_id')
-            .field('localoffer_name')
-            .join(iesq, 'iq', 'iq.cod_ies=bq.university_id');
-    } 
-    if ("city" in req.dims) {
-        let baseq = req.sql.clone()
-	    let cityq = squel.select()
-            cityq.from('municipio')
-            .field('municipio.id')
-            .field('municipio.nome');
-
-            req.sql = squel.select().from(baseq, 'bq')
-            .field("'Brasil'", 'name')
-            .field('ano_censo', 'year')
-            .field('total')
-            .field('nome', 'city_name')
-            .field('city_id')
-            .join(cityq, 'cq', 'cq.id=bq.city_id');
-    }
-    if ("university" in req.dims) {
-        let baseq = req.sql.clone()
-	    let iesq = squel.select()
-
-        iesq.from('ies_ens_superior')
-            .field('ies_ens_superior.cod_ies')
-            .field('ies_ens_superior.nome_ies');
-
-	    req.sql = squel.select().from(baseq, 'bq')
-            .field("'Brasil'", 'name')
-            .field('ano_censo', 'year')
-            .field('total')
-            .field('university_id')
-            .field('nome_ies', 'university_name')
-            .join(iesq, 'iq', 'iq.cod_ies=bq.university_id'); 
-    }
-    next();
-}, query, id2str.transform(), addMissing(rqf), response('course_count'));
+}, rqf.build(), query, id2str.transform(), addMissing(rqf), response('course_count'));
 
 module.exports = courseCountApp;
-- 
GitLab


From 77e38292b31356da7e87795909e583c05c57da79 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Mon, 15 Jun 2020 09:59:45 -0300
Subject: [PATCH 43/53] Change patios a serem cobertos var

---
 src/libs/routes/schoolInfrastructure.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/libs/routes/schoolInfrastructure.js b/src/libs/routes/schoolInfrastructure.js
index ced26a2f..c74f0e30 100644
--- a/src/libs/routes/schoolInfrastructure.js
+++ b/src/libs/routes/schoolInfrastructure.js
@@ -475,9 +475,9 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     needCourtyard.where('escola.patio = 0');
     req.queryIndex.needCourtyard = req.querySet.push(needCourtyard) - 1;
 
-    // Cobertura do Pátio
+    // Pátios a serem cobertos
     let allCourtyardCoverage = allSchools.clone();
-    allCourtyardCoverage.where('escola.patio_descoberto = 1');
+    allCourtyardCoverage.where('escola.patio = 1');
     req.queryIndex.allCourtyardCoverage = req.querySet.push(allCourtyardCoverage) - 1;
 
     req.queryIndex.haveCourtyardCoverage = req.queryIndex.allCourtyardCoverage; // It must be []
-- 
GitLab


From 23a4d0252474efa9c49f2a06c63d1858ad58ce4e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Mon, 15 Jun 2020 10:43:14 -0300
Subject: [PATCH 44/53] Update req filters in dailyChargeAmount

---
 src/libs/routes/dailyChargeAmount.js | 185 +++++++++++++--------------
 1 file changed, 89 insertions(+), 96 deletions(-)

diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js
index d2303a39..bac32807 100644
--- a/src/libs/routes/dailyChargeAmount.js
+++ b/src/libs/routes/dailyChargeAmount.js
@@ -42,7 +42,7 @@ const config = require(`${libs}/config`);
 
 const addMissing = require(`${libs}/middlewares/addMissing`);
 
-const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+const cache = require('apicache').options({ debug: config.debug, statusCodes: { include: [200] } }).middleware;
 
 let rqf = new ReqQueryFields();
 
@@ -52,27 +52,27 @@ let rqfCount = new ReqQueryFields();
 
 dailyChargeAmountApp.get('/year_range', (req, res, next) => {
     req.sql.from('turma')
-    .field('MIN(turma.ano_censo)', 'start_year')
-    .field('MAX(turma.ano_censo)', 'end_year');
+        .field('MIN(turma.ano_censo)', 'start_year')
+        .field('MAX(turma.ano_censo)', 'end_year');
     next();
 }, query, response('range'));
 
 dailyChargeAmountApp.get('/years', (req, res, next) => {
     req.sql.from('turma')
-    .field('DISTINCT turma.ano_censo', 'year');
+        .field('DISTINCT turma.ano_censo', 'year');
     next();
 }, query, response('years'));
 
 dailyChargeAmountApp.get('/source', (req, res, next) => {
     req.sql.from('fonte')
-    .field('fonte', 'source')
-    .where('tabela = \'turma\'');
+        .field('fonte', 'source')
+        .where('tabela = \'turma\'');
     next();
 }, query, response('source'));
 
 dailyChargeAmountApp.get('/adm_dependency', (req, res, next) => {
     req.result = [];
-    for(let i = 1; i <= 4; ++i) {
+    for (let i = 1; i <= 4; ++i) {
         req.result.push({
             id: i,
             name: id2str.admDependency(i)
@@ -83,7 +83,7 @@ dailyChargeAmountApp.get('/adm_dependency', (req, res, next) => {
 
 dailyChargeAmountApp.get('/adm_dependency_detailed', cache('15 day'), (req, res, next) => {
     req.result = [];
-    for(let i = 1; i <= 6; ++i) {
+    for (let i = 1; i <= 6; ++i) {
         req.result.push({
             id: i,
             name: id2str.admDependencyPriv(i)
@@ -94,58 +94,58 @@ dailyChargeAmountApp.get('/adm_dependency_detailed', cache('15 day'), (req, res,
 
 dailyChargeAmountApp.get('/location', cache('15 day'), (req, res, next) => {
     req.result = [
-        {id: 1, name: 'Urbana'},
-        {id: 2, name: 'Rural'}
+        { id: 1, name: 'Urbana' },
+        { id: 2, name: 'Rural' }
     ];
     next();
 }, response('location'));
 
 dailyChargeAmountApp.get('/rural_location', (req, res, next) => {
     req.result = [
-        {id: 1, name: "Urbana"},
-        {id: 2, name: "Rural"},
-        {id: 3, name: "Rural - Área de assentamento"},
-        {id: 4, name: "Rural - Terra indígena"},
-        {id: 5, name: "Rural - Área remanescente de quilombos"},
-        {id: 6, name: "Rural - Unidade de uso sustentável"}
+        { id: 1, name: "Urbana" },
+        { id: 2, name: "Rural" },
+        { id: 3, name: "Rural - Área de assentamento" },
+        { id: 4, name: "Rural - Terra indígena" },
+        { id: 5, name: "Rural - Área remanescente de quilombos" },
+        { id: 6, name: "Rural - Unidade de uso sustentável" }
     ];
     next();
 }, response('rural_location'));
 
 dailyChargeAmountApp.get('/education_level_short', (req, res, next) => {
     req.result = [
-        {id: null, name: 'Não classificada'},
-        {id: 1, name: 'Creche'},
-        {id: 2, name: 'Pré-Escola'},
-        {id: 3, name: 'Ensino Fundamental - anos iniciais'},
-        {id: 4, name: 'Ensino Fundamental - anos finais'},
-        {id: 5, name: 'Ensino Médio'},
-        {id: 6, name: 'EJA'},
-        {id: 7, name: 'EE exclusiva'}
+        { id: null, name: 'Não classificada' },
+        { id: 1, name: 'Creche' },
+        { id: 2, name: 'Pré-Escola' },
+        { id: 3, name: 'Ensino Fundamental - anos iniciais' },
+        { id: 4, name: 'Ensino Fundamental - anos finais' },
+        { id: 5, name: 'Ensino Médio' },
+        { id: 6, name: 'EJA' },
+        { id: 7, name: 'EE exclusiva' }
     ];
     next();
 }, response('education_level_short'));
 
 dailyChargeAmountApp.get('/average/education_level_mod', (req, res, next) => {
     req.result = [
-        {id: null, name: 'Não classificada'},
-        {id: 1, name: 'Creche'},
-        {id: 2, name: 'Pré-Escola'},
-        {id: 3, name: 'Educação Infantil Unificada'},
-        {id: 4, name: 'Ensino Fundamental - anos iniciais'},
-        {id: 5, name: 'Ensino Fundamental - anos finais'},
-        {id: 6, name: 'Ensino Médio'},
-        {id: 7, name: 'Turma Multisseriadas e Multietapas'},
-        {id: 8, name: 'EJA - Ensino Fundamental'},
-        {id: 9, name: 'EJA - Ensino Médio'},
-        {id: 10, name: 'Educação Profissional'}
+        { id: null, name: 'Não classificada' },
+        { id: 1, name: 'Creche' },
+        { id: 2, name: 'Pré-Escola' },
+        { id: 3, name: 'Educação Infantil Unificada' },
+        { id: 4, name: 'Ensino Fundamental - anos iniciais' },
+        { id: 5, name: 'Ensino Fundamental - anos finais' },
+        { id: 6, name: 'Ensino Médio' },
+        { id: 7, name: 'Turma Multisseriadas e Multietapas' },
+        { id: 8, name: 'EJA - Ensino Fundamental' },
+        { id: 9, name: 'EJA - Ensino Médio' },
+        { id: 10, name: 'Educação Profissional' }
     ];
     next();
 }, response('education_level_mod'));
 
 dailyChargeAmountApp.get('/period', (req, res, next) => {
     req.result = [];
-    for(let i = 1; i <= 3; ++i) {
+    for (let i = 1; i <= 3; ++i) {
         req.result.push({
             id: i,
             name: id2str.period(i)
@@ -160,9 +160,9 @@ dailyChargeAmountApp.get('/period', (req, res, next) => {
 
 dailyChargeAmountApp.get('/integral_time', (req, res, next) => {
     req.result = [
-        {id: null, name: 'Não Disponível'},
-        {id: 0, name: 'Não'},
-        {id: 1, name: 'Sim'}
+        { id: null, name: 'Não Disponível' },
+        { id: 0, name: 'Não' },
+        { id: 1, name: 'Sim' }
     ];
     next();
 }, response('integral_time'));
@@ -343,37 +343,30 @@ rqf.addField({
 
 dailyChargeAmountApp.get('/', rqf.parse(), (req, res, next) => {
     var status = 0;
-    if ('integral_time' in req.filter) {
-        if (req.filter['integral_time'] == '0'
-        && ('period' in req.filter)) {
-            if (req.filter['period'].length == 1
-            && req.filter['period'][0] == '3') {
-                status = 1;
-            } else if (req.filter['period'].length <= 2
-            && (req.filter['period'].includes('1')
-            || req.filter['period'].includes('2'))
-            && (!req.filter['period'].includes('3'))) {
-                status = 1;
-            }
-        } else if (req.filter['integral_time'] == '1') {
+    if ('period' in req.filter) {
+        if (req.filter['period'].length == 1 && (req.filter['period'][0] == '3' || req.filter['period'][0] === 4)) {
+            status = 1;
+        } else if (req.filter['period'].length <= 2 && (req.filter['period'].includes('1') || req.filter['period'].includes('2')) && (!req.filter['period'].includes('3'))) {
             status = 1;
         }
+    } else if (req.filter['integral_time'] == '1') {
+        status = 1;
     }
 
     if (status) {
         req.sql.from('turma')
-        .field('turma.ano_censo', 'year')
-        .field('turma.etapa_resumida', 'education_level_short_id')
-        .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
-        .field('MEDIAN(turma.duracao_turma)/60.0', 'median_class_duration')
-        .field('STDDEV_SAMP(turma.duracao_turma)/60.0', 'std_class_duration')
-        .field('QUANTILE(turma.duracao_turma, 0.25)/60.0', 'fstqt_class_duration')
-        .field('QUANTILE(turma.duracao_turma, 0.75)/60.0', 'thdqt_class_duration')
-        .group('turma.ano_censo')
-        .group('turma.etapa_resumida')
-        .order('turma.ano_censo')
-        .order('turma.etapa_resumida')
-        .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL)) and turma.dependencia_adm_id <= 3')
+            .field('turma.ano_censo', 'year')
+            .field('turma.etapa_resumida', 'education_level_short_id')
+            .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
+            .field('MEDIAN(turma.duracao_turma)/60.0', 'median_class_duration')
+            .field('STDDEV_SAMP(turma.duracao_turma)/60.0', 'std_class_duration')
+            .field('QUANTILE(turma.duracao_turma, 0.25)/60.0', 'fstqt_class_duration')
+            .field('QUANTILE(turma.duracao_turma, 0.75)/60.0', 'thdqt_class_duration')
+            .group('turma.ano_censo')
+            .group('turma.etapa_resumida')
+            .order('turma.ano_censo')
+            .order('turma.etapa_resumida')
+            .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL)) and turma.dependencia_adm_id <= 3')
     } else {
         res.status(400);
         next({
@@ -403,16 +396,16 @@ dailyChargeAmountApp.get('/', rqf.parse(), (req, res, next) => {
 dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next) => {
     var status = 0;
     if (('education_level_mod' in req.filter || 'education_level_mod' in req.dims)
-    && ('integral_time' in req.filter)) {
+        && ('integral_time' in req.filter)) {
         if (req.filter['integral_time'] == '0'
-        && ('period' in req.filter)) {
+            && ('period' in req.filter)) {
             if (req.filter['period'].length == 1
-            && req.filter['period'][0] == '3') {
+                && req.filter['period'][0] == '3') {
                 status = 1;
             } else if (req.filter['period'].length <= 2
-            && (req.filter['period'].includes('1')
-            || req.filter['period'].includes('2'))
-            && (!req.filter['period'].includes('3'))) {
+                && (req.filter['period'].includes('1')
+                    || req.filter['period'].includes('2'))
+                && (!req.filter['period'].includes('3'))) {
                 status = 1;
             }
         } else if (req.filter['integral_time'] == '1') {
@@ -425,40 +418,40 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
 
         let tableR = baseQ.clone();
         tableR.from('turma')
-        .field('duracao_turma')
-        .field('etapas_mod_ensino_segmento_id')
-        .field('ROW_NUMBER() OVER(PARTITION BY etapas_mod_ensino_segmento_id ORDER BY duracao_turma)', 'rowno')
-        .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL))')
+            .field('duracao_turma')
+            .field('etapas_mod_ensino_segmento_id')
+            .field('ROW_NUMBER() OVER(PARTITION BY etapas_mod_ensino_segmento_id ORDER BY duracao_turma)', 'rowno')
+            .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL))')
 
         let tableG = baseQ.clone();
         tableG.from('turma')
-        .field('1+COUNT(*)', 'counter')
-        .field('etapas_mod_ensino_segmento_id')
-        .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL))')
-        .group('etapas_mod_ensino_segmento_id')
+            .field('1+COUNT(*)', 'counter')
+            .field('etapas_mod_ensino_segmento_id')
+            .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL))')
+            .group('etapas_mod_ensino_segmento_id')
 
         let joinRG = squel.select();
         joinRG.from(tableR, 'R')
-        .field('R.etapas_mod_ensino_segmento_id')
-        .field('AVG(1.0*R.duracao_turma)/60', 'median_value')
-        .join(tableG, 'G', 'R.etapas_mod_ensino_segmento_id = G.etapas_mod_ensino_segmento_id AND R.rowNo BETWEEN G.counter/2 AND G.counter/2+G.counter%2')
-        .group('R.etapas_mod_ensino_segmento_id')
+            .field('R.etapas_mod_ensino_segmento_id')
+            .field('AVG(1.0*R.duracao_turma)/60', 'median_value')
+            .join(tableG, 'G', 'R.etapas_mod_ensino_segmento_id = G.etapas_mod_ensino_segmento_id AND R.rowNo BETWEEN G.counter/2 AND G.counter/2+G.counter%2')
+            .group('R.etapas_mod_ensino_segmento_id')
 
         req.sql
-        .from('turma')
-        .from(joinRG, 'm')
-        .field('turma.ano_censo', 'year')
-        .field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id')
-        .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
-        .field('AVG(m.median_value)', 'median_class_duration')
-        .field('STDDEV_SAMP(turma.duracao_turma)/60.0', 'std_class_duration')
-        .field('QUANTILE(turma.duracao_turma, 0.25)/60.0', 'fstqt_class_duration')
-        .field('QUANTILE(turma.duracao_turma, 0.75)/60.0', 'thdqt_class_duration')
-        .group('turma.ano_censo')
-        .group('turma.etapas_mod_ensino_segmento_id')
-        .order('turma.ano_censo')
-        .order('turma.etapas_mod_ensino_segmento_id')
-        .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL)) \
+            .from('turma')
+            .from(joinRG, 'm')
+            .field('turma.ano_censo', 'year')
+            .field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id')
+            .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
+            .field('AVG(m.median_value)', 'median_class_duration')
+            .field('STDDEV_SAMP(turma.duracao_turma)/60.0', 'std_class_duration')
+            .field('QUANTILE(turma.duracao_turma, 0.25)/60.0', 'fstqt_class_duration')
+            .field('QUANTILE(turma.duracao_turma, 0.75)/60.0', 'thdqt_class_duration')
+            .group('turma.ano_censo')
+            .group('turma.etapas_mod_ensino_segmento_id')
+            .order('turma.ano_censo')
+            .order('turma.etapas_mod_ensino_segmento_id')
+            .where('((turma.tipo_turma_id <= 3 AND turma.tipo_atendimento_id is NULL) OR (turma.tipo_atendimento_id <= 2 AND turma.tipo_turma_id is NULL)) \
                 and m.etapas_mod_ensino_segmento_id = turma.etapas_mod_ensino_segmento_id')
     } else {
         res.status(400);
-- 
GitLab


From f2d7cadf88d99c5dcbbc01b6169910ac703d5205 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Mon, 15 Jun 2020 10:46:07 -0300
Subject: [PATCH 45/53] Update req filters in dailyChargeAmount

---
 src/libs/routes/dailyChargeAmount.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js
index bac32807..4af6cb7d 100644
--- a/src/libs/routes/dailyChargeAmount.js
+++ b/src/libs/routes/dailyChargeAmount.js
@@ -344,7 +344,7 @@ rqf.addField({
 dailyChargeAmountApp.get('/', rqf.parse(), (req, res, next) => {
     var status = 0;
     if ('period' in req.filter) {
-        if (req.filter['period'].length == 1 && (req.filter['period'][0] == '3' || req.filter['period'][0] === 4)) {
+        if (req.filter['period'].length == 1 && (req.filter['period'][0] == '3' || req.filter['period'][0] === '4')) {
             status = 1;
         } else if (req.filter['period'].length <= 2 && (req.filter['period'].includes('1') || req.filter['period'].includes('2')) && (!req.filter['period'].includes('3'))) {
             status = 1;
-- 
GitLab


From 1275c9276174ae18abdb668dc95ef4673982a3df Mon Sep 17 00:00:00 2001
From: Fernando Erd <fcerd@inf.ufpr.br>
Date: Mon, 15 Jun 2020 11:40:10 -0300
Subject: [PATCH 46/53] Update .gitlab-ci.yml

---
 .gitlab-ci.yml | 35 +++++++++++++++++++++++------------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4a127f37..356b1c4b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,23 +10,34 @@ variables:
   MONGO_URI: 'mongodb://mongo/app_name'
   NODE_ENV: 'test'
 
-before_script:
-  - node -v
-  - npm install --global gulp gulp-cli babel babel-cli babel-core babel-register mocha gulp-mocha gulp-eslint
-  - npm install
-  - curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
-  - python get-pip.py
+#run_tests:
+#  stage: test
+#  before_script:
+#    - node -v
+#    - npm install --global gulp gulp-cli babel babel-cli babel-core babel-register mocha gulp-mocha #gulp-eslint
+#    - npm install
+#  script:
+#    - ping -W1 -c1 mongo
+#    - sed -i -e 's/false/true/g' config.json
+#    - gulp build
+#    - gulp test
+#  tags:
+#    - node
 
-run_tests:
+regression_tests:
   stage: test
+  before_script:
+    - npm install --global gulp gulp-cli babel babel-cli babel-core babel-register mocha gulp-mocha gulp-eslint
+    - npm install
+    - gulp build && gulp &
+    - curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
+    - python get-pip.py
+    - sleep 60
   script:
+    
     - git clone https://gitlab.c3sl.ufpr.br/simcaq/lde-api-regression-test.git
-    - ping -W1 -c1 mongo
-    - sed -i -e 's/false/true/g' config.json
-    - gulp build
-    - gulp test
     - cd lde-api-regression-test
     - pip install -r requirements.txt
-    - python regression_test.py --compare
+    - python manage.py compare --verbose
   tags:
     - node
-- 
GitLab


From 19bccb38fe5924551b96614cd0b0c9474c3c80ff Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Mon, 15 Jun 2020 22:18:10 -0300
Subject: [PATCH 47/53] Changed variables to work with new protocols

---
 src/libs/routes/courseCount.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 50f7ceb8..3168ba4a 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -241,7 +241,7 @@ rqf.addField({
 }).addValue({
     name: 'region',
     table: 'localoferta_ens_superior',
-    tableField: ['nome_regiao_curso', 'cod_regiao_curso'],
+    tableField: ['nome_regiao', 'cod_regiao'],
     resultField: ['region_name', 'region_id'],
     where: {
         relation: '=',
@@ -257,7 +257,7 @@ rqf.addField({
 }).addValue({
     name: 'state',
     table: 'localoferta_ens_superior',
-    tableField: ['sigla_uf', 'cod_uf'],
+    tableField: ['sigla_uf_t', 'cod_uf_t'],
     resultField: ['state_name', 'state_id'],
     where: {
         relation: '=',
@@ -273,7 +273,7 @@ rqf.addField({
 }).addValue({
     name: 'city',
     table: 'localoferta_ens_superior',
-    tableField: ['cod_municipio', 'nome_municipio'],
+    tableField: ['cod_municipio_t', 'nome_municipio_t'],
     resultField: ['city_id', 'city_name'],
     where: {
         relation: '=',
-- 
GitLab


From bd8f24dcdabf0379161af7e95e5a08f4cebf78bc Mon Sep 17 00:00:00 2001
From: Victor Picussa <vic_picussa2@hotmail.com>
Date: Tue, 16 Jun 2020 01:36:14 -0300
Subject: [PATCH 48/53] Removed ordenation for location, yeah i know

---
 src/libs/middlewares/addMissing.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/middlewares/addMissing.js b/src/libs/middlewares/addMissing.js
index 21ff8af0..298deaee 100644
--- a/src/libs/middlewares/addMissing.js
+++ b/src/libs/middlewares/addMissing.js
@@ -72,7 +72,7 @@ module.exports = function addMissing(rqf) {
                 }
 
                 if (dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
-                    if (['school', 'city', 'state', 'arrangement'].includes(dim)) {      // those should be ordered by its name
+                    if (['school', 'arrangement'].includes(dim)) {      // those should be ordered by its name
                         let namePosition = binarySearch(r[secondaryRqfName], dimsNames[secondaryRqfName], 0, dimsNames[secondaryRqfName].length)    // find the position of the name in alphabetical order and keep the names vector ordered
                         dimsValues[rqfName].splice(namePosition.pos, 0, r[rqfName]);
                         dimsNames[secondaryRqfName].splice(namePosition.pos, 0, r[secondaryRqfName]);
-- 
GitLab


From 7ba60eb4fe4025cccec2527fd84e7640e3ae49e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Tue, 16 Jun 2020 10:20:07 -0300
Subject: [PATCH 49/53] Change outOfSchool to follow pattern

---
 src/libs/routes/outOfSchool.js | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/libs/routes/outOfSchool.js b/src/libs/routes/outOfSchool.js
index 91bac8dd..6d2461f3 100644
--- a/src/libs/routes/outOfSchool.js
+++ b/src/libs/routes/outOfSchool.js
@@ -346,12 +346,22 @@ simcaqRqf.addField({
 });
 
 outOfSchoolApp.get('/simcaq', simcaqRqf.parse(), simcaqRqf.build(), (req, res, next) => {
-    req.sql.from('populacao_fora_da_escola')
-    .field('SUM(populacao_fora_da_escola.pop_fora_escola)', 'total')
-    .field("'Brasil'", 'name')
-    .field('populacao_fora_da_escola.ano_censo')
-    .group('populacao_fora_da_escola.ano_censo')
-    .order('populacao_fora_da_escola.ano_censo');
+    if ('state' in req.filter || 'city' in req.filter) { // Query in state/city level
+        req.sql.from('populacao_fora_da_escola')
+        .field('SUM(populacao_fora_da_escola.pop_fora_escola)', 'total')
+        .field("'Brasil'", 'name')
+        .field('populacao_fora_da_escola.ano_censo')
+        .group('populacao_fora_da_escola.ano_censo')
+        .order('populacao_fora_da_escola.ano_censo');
+    } else { // Query in 'Brasil' level
+        req.sql.from('populacao_fora_da_escola')
+        .field('SUM(populacao_fora_da_escola.pop_fora_escola)', 'total')
+        .field("'Brasil'", 'name')
+        .field('populacao_fora_da_escola.ano_censo')
+        .where('populacao_fora_da_escola.brasil = 1')
+        .group('populacao_fora_da_escola.ano_censo')
+        .order('populacao_fora_da_escola.ano_censo'); 
+    }
 
     next();
 }, query, (req, res, next) => {
-- 
GitLab


From d67a211753fb91439c964003986d1509482e302e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Tue, 16 Jun 2020 11:05:07 -0300
Subject: [PATCH 50/53] Remove state filter from outOfSchool when it is called
 with a city filter

---
 src/libs/routes/outOfSchool.js | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/libs/routes/outOfSchool.js b/src/libs/routes/outOfSchool.js
index 6d2461f3..15d8599c 100644
--- a/src/libs/routes/outOfSchool.js
+++ b/src/libs/routes/outOfSchool.js
@@ -345,8 +345,11 @@ simcaqRqf.addField({
     }
 });
 
-outOfSchoolApp.get('/simcaq', simcaqRqf.parse(), simcaqRqf.build(), (req, res, next) => {
+outOfSchoolApp.get('/simcaq', simcaqRqf.parse(), (req, res, next) => {
     if ('state' in req.filter || 'city' in req.filter) { // Query in state/city level
+
+        if ('city' in req.filter && 'state' in req.filter) delete req.filter.state   // use only the city filter because of the table particularities
+
         req.sql.from('populacao_fora_da_escola')
         .field('SUM(populacao_fora_da_escola.pop_fora_escola)', 'total')
         .field("'Brasil'", 'name')
@@ -364,7 +367,7 @@ outOfSchoolApp.get('/simcaq', simcaqRqf.parse(), simcaqRqf.build(), (req, res, n
     }
 
     next();
-}, query, (req, res, next) => {
+}, simcaqRqf.build(), query, (req, res, next) => {
 	req.result.forEach((i) => {
 		i.total = parseInt(i.total);
 	});
-- 
GitLab


From 8ad978651d6158d583d4d6a699acc7191bd33d31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Tue, 16 Jun 2020 11:29:01 -0300
Subject: [PATCH 51/53] Fix city e state dims

---
 src/libs/routes/outOfSchool.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/routes/outOfSchool.js b/src/libs/routes/outOfSchool.js
index 15d8599c..fcd57867 100644
--- a/src/libs/routes/outOfSchool.js
+++ b/src/libs/routes/outOfSchool.js
@@ -346,7 +346,7 @@ simcaqRqf.addField({
 });
 
 outOfSchoolApp.get('/simcaq', simcaqRqf.parse(), (req, res, next) => {
-    if ('state' in req.filter || 'city' in req.filter) { // Query in state/city level
+    if ('state' in req.filter || 'city' in req.filter || 'state' in req.dims || 'city' in req.dims) { // Query in state/city level
 
         if ('city' in req.filter && 'state' in req.filter) delete req.filter.state   // use only the city filter because of the table particularities
 
-- 
GitLab


From 1a71d4a3090407196ed4b0e40e7763486d25b97e Mon Sep 17 00:00:00 2001
From: Victor Picussa <vic_picussa2@hotmail.com>
Date: Wed, 17 Jun 2020 11:02:07 -0300
Subject: [PATCH 52/53] Restore files

---
 src/libs/convert/stateName.js      |   2 -
 src/libs/middlewares/addMissing.js |   2 +-
 src/libs/routes/courseCount.js     | 206 +++++++----------------------
 3 files changed, 46 insertions(+), 164 deletions(-)

diff --git a/src/libs/convert/stateName.js b/src/libs/convert/stateName.js
index fe268ebc..4760d242 100644
--- a/src/libs/convert/stateName.js
+++ b/src/libs/convert/stateName.js
@@ -74,7 +74,5 @@ module.exports = function stateName(id) {
         return 'Goiás';
         case 53:
         return 'Distrito Federal';
-        case 99:
-        return 'Exterior';
     }
 };
diff --git a/src/libs/middlewares/addMissing.js b/src/libs/middlewares/addMissing.js
index 298deaee..1050a1df 100644
--- a/src/libs/middlewares/addMissing.js
+++ b/src/libs/middlewares/addMissing.js
@@ -72,7 +72,7 @@ module.exports = function addMissing(rqf) {
                 }
 
                 if (dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
-                    if (['school', 'arrangement'].includes(dim)) {      // those should be ordered by its name
+                    if (['school', 'city', 'state', 'region', 'arrangement'].includes(dim)) {      // those should be ordered by its name
                         let namePosition = binarySearch(r[secondaryRqfName], dimsNames[secondaryRqfName], 0, dimsNames[secondaryRqfName].length)    // find the position of the name in alphabetical order and keep the names vector ordered
                         dimsValues[rqfName].splice(namePosition.pos, 0, r[rqfName]);
                         dimsNames[secondaryRqfName].splice(namePosition.pos, 0, r[secondaryRqfName]);
diff --git a/src/libs/routes/courseCount.js b/src/libs/routes/courseCount.js
index 3168ba4a..9a7f9d4e 100644
--- a/src/libs/routes/courseCount.js
+++ b/src/libs/routes/courseCount.js
@@ -40,8 +40,12 @@ const config = require(`${libs}/config`);
 
 const addMissing = require(`${libs}/middlewares/addMissing`);
 
+const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+
 let rqf = new ReqQueryFields();
 
+courseCountApp.use(cache('15 day'));
+
 courseCountApp.get('/upper_adm_dependency', (req, res, next) => {
     req.result = [];
     for(let i = 1; i <= 7; ++i) {
@@ -55,8 +59,7 @@ courseCountApp.get('/upper_adm_dependency', (req, res, next) => {
 
 courseCountApp.get('/years', (req, res, next) => {
     req.sql.from('curso_ens_superior')
-    .field('DISTINCT curso_ens_superior.ano_censo', 'year')
-    .where('curso_ens_superior.ano_censo > 2010');
+    .field('DISTINCT curso_ens_superior.ano_censo', 'year');
     next();
 }, query, response('years'));
 
@@ -78,6 +81,15 @@ courseCountApp.get('/academic_organization', (req, res, next) => {
     next();
 }, response('academic_organization'));
 
+courseCountApp.get('/capital', (req, res, next) => {
+    req.result = [
+        {id: null, name: 'Não Classificado'},
+        {id: 0, name: 'Não'},
+        {id: 1, name: 'Sim'}
+    ];
+    next();
+}, response('capital'));
+
 courseCountApp.get('/ocde_geral', (req, res, next) => {
     req.result = [];
     for(let i = 1; i <= 8; ++i) {
@@ -127,55 +139,6 @@ courseCountApp.get('/ocde_detailed', (req, res, next) => {
     next();
 }, response('ocde_detailed'));
 
-courseCountApp.get('/cine_geral', (req, res, next) => {
-    req.result = [];
-    for(let i = 0; i <= 10; ++i) {
-        req.result.push({
-            id: i,
-            name: id2str.cineGeral(i)
-        });
-    };
-    next();
-}, response('cine_geral'));
-
-courseCountApp.get('/cine_specific', (req, res, next) => {
-    req.result = [];
-    const defaultCase = null;
-    for(let i = 1; i <= 104; ++i) {
-        let obj = {
-            id: i,
-            name: id2str.cineSpecific(i)
-        };
-        if (obj.name !== id2str.cineSpecific(defaultCase)){
-            req.result.push(obj);
-        }
-    };
-    req.result.push({
-        id: defaultCase,
-        name: id2str.cineSpecific(defaultCase)
-    });
-    next();
-}, response('cine_specific'));
-
-courseCountApp.get('/cine_detailed', (req, res, next) => {
-    req.result = [];
-    const defaultCase = null;
-    for(let i = 11; i <= 1041; ++i) {
-        let obj = {
-            id: i,
-            name: id2str.cineDetailed(i)
-        };
-        if (obj.name !== id2str.cineDetailed(defaultCase)){
-            req.result.push(obj);
-        }
-    };
-    req.result.push({
-        id: defaultCase,
-        name: id2str.cineDetailed(defaultCase)
-    });
-    next();
-}, response('cine_detailed'));
-
 courseCountApp.get('/academic_level', (req, res, next) => {
     req.result = [];
     for(let i = 1; i <= 4; ++i) {
@@ -223,13 +186,6 @@ courseCountApp.get('/university', (req, res, next) => {
     next();
 }, query, response('university'));
 
-courseCountApp.get('/localoffer', (req, res, next) => {
-    req.sql.from('localoferta_ens_superior', 'l')
-    .field('DISTINCT l.nome', 'localoffer_name')
-    .field('l.cod_local_oferta', 'localoffer_id');
-    next();
-}, query, response('localoffer'));
-
 rqf.addField({
     name: 'filter',
     field: false,
@@ -240,67 +196,49 @@ rqf.addField({
     where: false
 }).addValue({
     name: 'region',
-    table: 'localoferta_ens_superior',
-    tableField: ['nome_regiao', 'cod_regiao'],
+    table: 'regiao',
+    tableField: ['nome', 'id'],
     resultField: ['region_name', 'region_id'],
     where: {
         relation: '=',
         type: 'integer',
-        field: 'cod_regiao_curso',
-	table: 'localoferta_ens_superior'
+        field: 'id'
     },
     join: {
-        primary: ['ano_censo', 'cod_curso'],
-        foreign: ['ano_censo', 'cod_curso'],
+        primary: 'nome',
+        foreign: 'nome_regiao_curso',
         foreignTable: 'curso_ens_superior'
     }
 }).addValue({
     name: 'state',
-    table: 'localoferta_ens_superior',
-    tableField: ['sigla_uf_t', 'cod_uf_t'],
+    table: 'estado',
+    tableField: ['nome', 'id'],
     resultField: ['state_name', 'state_id'],
     where: {
         relation: '=',
         type: 'integer',
-        field: 'cod_uf',
-	    table: 'localoferta_ens_superior'
+        field: 'id'
     },
     join: {
-        primary: ['ano_censo', 'cod_curso'],
-        foreign: ['ano_censo', 'cod_curso'],
+        primary: 'id',
+        foreign: 'cod_uf_curso',
         foreignTable: 'curso_ens_superior'
     }
 }).addValue({
     name: 'city',
-    table: 'localoferta_ens_superior',
-    tableField: ['cod_municipio_t', 'nome_municipio_t'],
-    resultField: ['city_id', 'city_name'],
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
     where: {
         relation: '=',
         type: 'integer',
-        field: 'cod_municipio',
-        table: 'localoferta_ens_superior'
+        field: 'cod_municipio_curso',
+        table: '@'
     },
     join: {
-        primary: ['ano_censo', 'cod_curso'],
-        foreign: ['ano_censo', 'cod_curso'],
-        foreignTable: 'curso_ens_superior'
-    }
-}).addValue({
-    name: 'localoffer',
-    table: 'localoferta_ens_superior',
-    tableField: ['cod_local_oferta', 'nome'],
-    resultField: ['localoffer_id', 'localoffer_name'],
-    where: {
-	    relation: '=',
-	    type: 'integer',
-	    field: 'cod_curso',
-	    table: 'curso_ens_superior'
-    },
-    join: {
-        primary: ['ano_censo', 'cod_curso'],
-	    foreign: ['ano_censo', 'cod_curso'],
-	    foreignTable: 'curso_ens_superior'
+        primary: 'id',
+        foreign: 'cod_municipio_curso',
+        foreignTable: '@'
     }
 }).addValue({
     name: 'university',
@@ -332,6 +270,16 @@ rqf.addField({
         type: 'integer',
         field: 'cod_organizacao_academica'
     }
+}).addValue({
+    name:'capital',
+    table: 'curso_ens_superior',
+    tableField: 'tfd_capital_curso',
+    resultField: 'capital_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'tfd_capital_curso'
+    }
 }).addValue({
     name:'course',
     table: 'curso_ens_superior',
@@ -372,36 +320,6 @@ rqf.addField({
         type: 'integer',
         field: 'cod_ocde_area_detalhada'
     }
-}).addValue({
-    name:'cine_specific',
-    table: 'curso_ens_superior',
-    tableField: ['cod_cine_area_especifica', 'nome_cine_area_especifica'],
-    resultField: ['cine_specific_id', 'cine_specific_name'],
-    where: {
-        relation: '=',
-        type: 'integer',
-        field: 'cod_cine_area_especifica'
-    }
-}).addValue({
-    name:'cine_geral',
-    table: 'curso_ens_superior',
-    tableField: ['cod_cine_area_geral', 'nome_cine_area_geral'],
-    resultField: ['cine_geral_id', 'cine_geral_name'],
-    where: {
-        relation: '=',
-        type: 'integer',
-        field: 'cod_cine_area_geral'
-    }
-}).addValue({
-    name:'cine_detailed',
-    table: 'curso_ens_superior',
-    tableField: ['cod_cine_area_detalhada', 'nome_cine_area_detalhada'],
-    resultField: ['cine_detailed_id', 'cine_datailed_name'],
-    where: {
-        relation: '=',
-        type: 'integer',
-        field: 'cod_cine_area_detalhada'
-    }
 }).addValue({
     name:'academic_level',
     table: 'curso_ens_superior',
@@ -487,42 +405,7 @@ rqf.addField({
 });
 
 courseCountApp.get('/', rqf.parse(), (req, res, next) => {
-    if (("state" in req.dims) || ("city" in req.dims) || ("region" in req.dims) ||
-        ("state" in req.filter) || ("city" in req.filter) || ("region" in req.filter)) {
-	req.sql.from('curso_ens_superior')
-            .field('COUNT(DISTINCT curso_ens_superior.cod_curso)', 'total')
-            .field("'Brasil'", 'name')
-	    .field('curso_ens_superior.ano_censo', 'year')
-            .group('curso_ens_superior.ano_censo')
-            .order('curso_ens_superior.ano_censo')
-            .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
-            .where('curso_ens_superior.cod_nivel_academico = 1');
-    } else if ("localoffer" in req.dims) {
-	 if ("university" in req.dims) {
-	     req.sql.from('curso_ens_superior')
-                .field('curso_ens_superior.ano_censo', 'year')
-                .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
-                .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
-                .where('curso_ens_superior.cod_nivel_academico = 1')
-                .group('curso_ens_superior.ano_censo')
-                .order('curso_ens_superior.ano_censo')
-               .order('localoferta_ens_superior.cod_local_oferta');
-
-	 } else {
-         req.sql.from('curso_ens_superior')
-            .field('curso_ens_superior.ano_censo', 'year')
-            .field('COUNT(localoferta_ens_superior.cod_local_oferta)', 'total')
-	    .field('localoferta_ens_superior.cod_ies', 'university_id')
-	    .field('curso_ens_superior.nome_ies', 'university_name')
-            .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
-            .where('curso_ens_superior.cod_nivel_academico = 1')
-            .group('curso_ens_superior.ano_censo')
-            .group('localoferta_ens_superior.cod_ies')
-            .group('curso_ens_superior.nome_ies')
-            .order('curso_ens_superior.ano_censo')
-            .order('localoferta_ens_superior.cod_local_oferta');
-	}
-    } else if ("university" in req.dims) {
+    if ("university" in req.dims) {
         req.sql.from('curso_ens_superior')
             .field('COUNT(curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
@@ -533,7 +416,8 @@ courseCountApp.get('/', rqf.parse(), (req, res, next) => {
             .order('curso_ens_superior.ano_censo')
             .where('curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL')
             .where('curso_ens_superior.cod_nivel_academico = 1');
-    } else {
+    }
+    else {
         req.sql.from('curso_ens_superior')
             .field('COUNT(curso_ens_superior.cod_curso)', 'total')
             .field("'Brasil'", 'name')
-- 
GitLab


From dfa1c61c125f9a742e9eb6bfbda51f6c53fbc6e6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Wed, 17 Jun 2020 11:19:34 -0300
Subject: [PATCH 53/53] v.1.14.0

---
 CHANGELOG.md | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 657bbdfa..9ddb1709 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](http://keepachangelog.com/)
 and this project adheres to [Semantic Versioning](http://semver.org/).
 
+## 1.14.0 - 2020-06-17
+## Added
+- Route school_location
+- Route mesoregion
+- Route microregion
+## Changed
+- City route now returns microregion_id and mesoregion_id
+- Update classCount base filters
+- Update classroom base query
+- Update classroomCount base filters in school
+- Removed addMissing from cub route
+- Changed dailyChargeAmount filter pattern
+- Enrollment now has mesoregion/microregion dims/filters
+- Changed reqFilters in outOfSchool route
+- School now has mesoregion/microregion dims/filters
+- Teacher now has mesoregion/microregion dims/filters
+- UnivesityEnrollment now has mesoregion/microregion dims/filters
+
 ## 1.13.2 - 2020-05-21
 ## Changed
 - Rename rural category
-- 
GitLab