Commit b4f93e67 authored by Vytor Calixto's avatar Vytor Calixto 👾

Merge branch 'hotfix_1.8.2'

parents b920a3e3 a2fd12b0
Pipeline #18597 failed with stage
in 8 minutes and 1 second
......@@ -4,6 +4,11 @@ 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.8.2 - 2018-11-23
### Changed
- Fixed class count route
- Fixed classroom count school year bug
## 1.8.1 - 2018-11-13
### Changed
- Fixed bug in id2str with inexistent convert function
......
......@@ -15,37 +15,53 @@
"dependencies": {
"agenda": "^0.9.1",
"apicache": "0.7.0",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.3",
"babel-preset-es2015": "^6.24.1",
"babel-register": "^6.26.0",
"bcrypt-nodejs": "0.0.3",
"body-parser": "^1.13.1",
"body-parser": "^1.18.3",
"chai": "^3.5.0",
"chai-http": "^3.0.0",
"chai-xml": "^0.3.2",
"chalk": "^1.1.3",
"cookie-parser": "^1.3.5",
"cors": "^2.7.1",
"csv-express": "^1.1.0",
"cors": "^2.8.4",
"csv-express": "^1.2.2",
"debug": "~2.3.x",
"dirty-chai": "^1.2.2",
"express": "^4.13.0",
"eslint": "^3.19.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-react": "^6.10.3",
"express": "^4.16.4",
"forever": "^0.15.2",
"gulp-babel": "^6.1.3",
"gulp-cli": "^1.4.0",
"gulp-function": "^2.2.14",
"gulp-istanbul": "^1.1.3",
"gulp-plumber": "^1.2.0",
"gulp-rename": "^1.4.0",
"gulp-uglify": "^2.1.2",
"js2xmlparser": "^2.0.2",
"jsonexport": "^2.0.9",
"jwt-simple": "^0.5.0",
"lodash": "^4.17.2",
"method-override": "^2.3.3",
"mocha": "^3.1.2",
"jsdoc": "^3.5.5",
"jsonexport": "^2.3.0",
"jwt-simple": "^0.5.5",
"lodash": "^4.17.11",
"method-override": "^2.3.10",
"mocha": "^3.5.3",
"monetdb-pool": "0.0.8",
"mongoose": "^4.6.0",
"nconf": "^0.8.x",
"mongoose": "^4.13.17",
"nconf": "^0.8.5",
"node-uuid": "^1.4.8",
"nodemailer": "^4.0.1",
"nodemailer": "^4.6.8",
"nodemailer-html-to-text": "^2.1.0",
"oauth2orize": "^1.8.1",
"oauth2orize": "^1.11.0",
"passport": "^0.3.2",
"passport-http-bearer": "^1.0.1",
"passport-oauth2-client-password": "^0.1.2",
"request": "^2.81.0",
"squel": "^5.4.2",
"winston": "^2.2.0"
"request": "^2.88.0",
"squel": "^5.12.2",
"winston": "^2.4.4"
},
"license": "MIT",
"devDependencies": {
......
......@@ -11,7 +11,6 @@ const log = require(`${libs}/log`)(module);
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
const config = require(`${libs}/config`);
const cache = require('apicache').options({ debug: config.debug }).middleware;
const app = express();
......
module.exports = function educationLevelSchoolYear(id) {
switch(id) {
case 1: return 'Creche';
case 11: return 'Creche - Menor de 1 ano';
case 12: return 'Creche - 1 ano';
case 13: return 'Creche - 2 anos';
case 14: return 'Creche - 3 anos';
case 2: return 'Pré-Escola';
case 21: return 'Pré-Escola - 4 anos';
case 22: return 'Pré-Escola - 5 anos';
case 3: return 'Ensino Fundamental - anos iniciais';
case 31: return 'Ens. Fundamental - 1º Ano';
case 32: return 'Ens. Fundamental - 1ª série/2º ano';
case 33: return 'Ens. Fundamental - 2ª série/3º ano';
case 34: return 'Ens. Fundamental - 3ª série/4º ano';
case 35: return 'Ens. Fundamental - 4ª série/5º Ano';
case 4: return 'Ensino Fundamental - anos finais';
case 41: return 'Ens. Fundamental - 5ª série/6º ano';
case 42: return 'Ens. Fundamental - 6ª série/7º ano';
case 43: return 'Ens. Fundamental - 7ª série/8º ano';
case 44: return 'Ens. Fundamental - 8ª serie/9º ano';
case 5: return 'Ensino Médio';
case 51: return 'Ens. Médio - 1ª série';
case 52: return 'Ens. Médio - 2ª série';
case 53: return 'Ens. Médio - 3ª série';
case 54: return 'Ens. Médio - 4ª série';
case 6: return 'EJA';
case 61: return 'EJA - anos iniciais do Ens. Fundamental';
case 62: return 'EJA - anos finais do Ens. Fundamental';
case 63: return 'EJA - Ensino Médio';
case 64: return 'EJA semi-presencial';
case 7: return 'EE exclusiva';
case 71: return 'Educação Profissional';
default: return 'Não classificada';
}
}
\ No newline at end of file
module.exports = function pfeName(id) {
switch(id) {
case 1: return 'População fora da escola menor de 1 ano';
case 2: return 'População fora da escola 1 ano';
case 3: return 'População fora da escola 2 anos';
case 4: return 'População fora da escola 3 anos';
case 5: return 'População fora da escola 4 anos';
case 6: return 'População fora da escola 5 anos';
case 7: return 'População fora da escola 6 e 10 anos sem instrução ou com EF incompleto';
case 8: return 'População fora da escola 11 a 14 anos sem instrução';
case 9: return 'População fora da escola 11 a 14 anos com EF incompleto';
case 10: return 'População fora da escola 15 a 24 anos com e EF completo EM incompleto';
case 11: return 'População fora da escola 15 anos mais sem instrução';
case 12: return 'População fora da escola 15 anos mais com EF incompleto';
case 13: return 'População fora da escola 25 anos mais com EF completo e EM incompleto';
}
};
......@@ -31,7 +31,8 @@ const useTransportPublic = require(`${libs}/convert/booleanVariable`);
const transportationManager = require(`${libs}/convert/transportationManager`);
const specialClass = require(`${libs}/convert/booleanVariable`);
const integralTime = require(`${libs}/convert/integralTime`);
// const educationLevelSchoolYear = require(`${libs}/convert/educationLevelSchoolYear`);
const educationLevelSchoolYear = require(`${libs}/convert/educationLevelSchoolYear`);
const pfe = require(`${libs}/convert/pfe`);
const ids = {
gender_id: gender,
......@@ -74,7 +75,8 @@ const ids = {
use_transport_public_id: useTransportPublic,
transportation_manager_id: transportationManager,
special_class_id: specialClass,
// education_level_school_year_id: educationLevelSchoolYear,
education_level_school_year_id: educationLevelSchoolYear,
pfe_id: pfe,
};
function transform(removeId=false) {
......
......@@ -80,6 +80,8 @@ const classCount = require(`${libs}/routes/classCount`);
const portalMecInep = require(`${libs}/routes/portalMecInep`);
const enrollmentProjection = require(`${libs}/routes/enrollmentProjection`);
const employees = require(`${libs}/routes/employees`);
const financial = require(`${libs}/routes/financial`);
......@@ -126,6 +128,7 @@ api.use('/auxiliar', auxiliar);
api.use('/verify_teacher', verifyTeacher);
api.use('/class_count', classCount);
api.use('/portal_mec_inep', portalMecInep);
api.use('/enrollment_projection', enrollmentProjection);
api.use('/employees', employees);
api.use('/financial', financial);
......
......@@ -320,10 +320,26 @@ function addNullFields(result) {
});
}
// SimCAQ
classCountApp.get('/count', rqf.parse(), (req, res, next) => {
req.sql.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year')
.field('AVG(turma.num_matricula)', 'average')
.field('MEDIAN(turma.num_matricula)', 'median')
.field('STDDEV_POP(turma.num_matricula)', 'stddev')
.field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
.field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
.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)');
next();
}, rqf.build(), query, addMissing(rqf), id2str.transform(), response('class_count'));
// LDE
classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
// Faz a consulta do número de alunos pelas dimensões
if(("education_level_mod" in req.dims) || ("education_level_mod" in req.filter)) {
if(("education_level_mod" in req.dims) || ("education_level_mod" in req.filter) || ("education_level_short" in req.dims)) {
req.sql.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year')
.field('AVG(turma.num_matricula)', 'average')
......@@ -395,66 +411,4 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
next();
}, response('class_count'));
// SimCAQ
classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
req.sql.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year')
.field('AVG(turma.num_matricula)', 'average')
.field('MEDIAN(turma.num_matricula)', 'median')
.field('STDDEV_POP(turma.num_matricula)', 'stddev')
.field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
.field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
.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)');
next();
}, rqf.build(), query, id2str.transform(), (req, res, next) => {
req.partial = [];
if((req.dims) && (req.dims.size == 1)) {
req.partial = req.result;
// Se a consulta anterior selecionou dimensão:
// Considera apenas os anos escolhidos na consulta anterior para contar o número total de alunos
let yearFilter = {};
if("min_year" in req.filter)
yearFilter.min_year = req.filter.min_year;
if("max_year" in req.filter)
yearFilter.max_year = req.filter.max_year;
req.resetSql();
req.dims = {};
req.filter = yearFilter;
req.sql.field("'Brasil'", 'name')
.field('turma.ano_censo', 'year')
.field('AVG(turma.num_matricula)', 'average')
.field('MEDIAN(turma.num_matricula)', 'median')
.field('STDDEV_POP(turma.num_matricula)', 'stddev')
.field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
.field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
.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)');
}
next();
}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
// Se possui apenas uma dimensão
if(req.partial.length > 0) {
const yearClassCount = req.result;
req.result = req.partial;
// Adiciona os totais por anos ao fim da consulta
// Como esse tipo de total é específico desse indicador, um label foi adicionado para indicar
yearClassCount.forEach((result) => {
let obj = {};
obj = result;
obj.label = "total_year_average";
req.result.push(obj);
})
}
// Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total (req.result)
next();
}, response('class_count'));
module.exports = classCountApp;
......@@ -405,7 +405,14 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => {
total_classrooms_needed: 0
}
schoolYearSet.add(schoolYearHash);
educationLevel.classes_school_year.push(school_year);
// Busca a posição para inserir
let k = 0;
let el = educationLevel.classes_school_year[k];
while((typeof el !== 'undefined') && school_year.school_year_id > el.school_year_id) {
el = educationLevel.classes_school_year[++k];
}
// educationLevel.classes_school_year.push(school_year);
educationLevel.classes_school_year.splice(k, 0, school_year);
currentSchoolYear = school_year;
}
}
......@@ -558,25 +565,27 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => {
currentEducation.enrollment.day_classes += cityEducation.enrollment.day_classes;
currentEducation.enrollment.night_classes += cityEducation.enrollment.night_classes;
currentEducation.enrollment.total_classrooms_needed += cityEducation.enrollment.total_classrooms_needed;
// Insere as séries escolares, se existirem
if((typeof cityEducation.classes_school_year !== 'undefined') && (typeof currentEducation.classes_school_year !== 'undefined')) {
let n = 0;
let o = 0;
let cityClass = null;
let currentClass = null;
let currentClass = currentEducation.classes_school_year[n];
let cityClass = cityEducation.classes_school_year[o];
while((typeof cityClass !== 'undefined') && (typeof currentClass !== 'undefined')) {
cityClass = cityEducation.classes_school_year[o];
currentClass = currentEducation.classes_school_year[n];
cityClass = cityEducation.classes_school_year[o];
// Se a série escolar é menor que a atual, ela não está no vetor, pois o vetor está ordenado e tem range limitado
if(cityClass.school_year_id < currentClass.school_year_id) {
currentEducation.classes_school_year.splice(n, 0, cityClass);
currentClass = currentEducation.classes_school_year[n];
cityClass = cityEducation.classes_school_year[++o];
continue;
} else if(cityClass.school_year_id > currentClass.school_year_id) {
currentClass = currentEducation.classes_school_year[++n];
// Se o ano escolar da cidade é maior que a localidade do objeto atual E o vetor de ano escolar do objeto atual
// Se o ano escolar da cidade é maior que do objeto atual E o vetor de ano escolar do objeto atual
// acaba, então este ano escolar falta no objeto atual, pois os anos escolares estão ordenados
if(typeof currentClass == 'undefined' && typeof cityClass !== 'undefined') {
if((typeof currentClass == 'undefined') && (typeof cityClass !== 'undefined')) {
currentEducation.classes_school_year[n] = cityClass;
currentClass = currentEducation.classes_school_year[n];
}
......@@ -616,7 +625,10 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => {
}
}
req.result = reduction || result;
req.result = {
result: reduction || result,
leftovers
}
next();
}, response('classroom_count'));
......
......@@ -321,7 +321,7 @@ rqf.addField({
}
});
dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
dailyChargeAmountApp.get('/', rqf.parse(), (req, res, next) => {
var status = 0;
if ('integral_time' in req.filter) {
if (req.filter['integral_time'] == '0'
......@@ -346,14 +346,14 @@ dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
.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_POP(turma.duracao_turma)/60.0', 'std_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')
.where('turma.tipo_turma_id <= 3 and turma.dependencia_adm_id <= 3')
} else {
res.status(400);
next({
......@@ -364,7 +364,7 @@ dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
next();
}, query, addMissing(rqf), (req, res, next) => {
}, rqf.build(), query, addMissing(rqf), (req, res, next) => {
function sliced(object) {
return object['education_level_short_id'] > 3;
......@@ -380,7 +380,7 @@ dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
next();
}, id2str.transform(), response('turma'));
dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next) => {
dailyChargeAmountApp.get('/average', rqf.parse(), (req, res, next) => {
var status = 0;
if (('education_level_mod' in req.filter || 'education_level_mod' in req.dims)
&& ('integral_time' in req.filter)) {
......@@ -406,7 +406,7 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
.field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id')
.field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
.field('MEDIAN(turma.duracao_turma)/60.0', 'median_class_duration')
.field('STDDEV_POP(turma.duracao_turma)/60.0', 'std_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')
......@@ -423,6 +423,6 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
}
next();
}, query, addMissing(rqf), id2str.transform(), response('turma'));
}, rqf.build(), query, addMissing(rqf), id2str.transform(), response('turma'));
module.exports = dailyChargeAmountApp;
const express = require('express');
const enrollmentProjectionApp = express.Router();
const libs = `${process.cwd()}/libs`;
const log = require(`${libs}/log`)(module);
const query = require(`${libs}/middlewares/query`).query;
const response = require(`${libs}/middlewares/response`);
const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
const id2str = require(`${libs}/middlewares/id2str`);
const config = require(`${libs}/config`);
let rqf = new ReqQueryFields();
rqf.addField({
name: 'filter',
field: false,
where: true
}).addField({
name: 'dims',
field: true,
where: false
}).addValueToField({
name: 'state',
table: 'estado',
tableField: ['nome', 'id'],
resultField: ['state_name', 'state_id'],
where: {
relation: '=',
type: 'integer',
field: 'id'
},
join: {
primary: 'id',
foreign: 'estado_id',
foreignTable: 'projecao_matricula'
}
}, 'dims').addValueToField({
name: 'state',
table: 'estado',
tableField: 'nome',
resultField: 'state_name',
where: {
relation: '=',
type: 'integer',
field: 'id'
},
join: {
primary: 'id',
foreign: 'estado_id',
foreignTable: 'projecao_matricula'
}
}, 'filter').addValueToField({
name: 'city',
table: 'municipio',
tableField: ['nome', 'id'],
resultField: ['city_name', 'city_id'],
where: {
relation: '=',
type: 'integer',
field: 'id'
},
join: {
primary: 'id',
foreign: 'municipio_id',
foreignTable: 'projecao_matricula'
}
}, 'dims').addValueToField({
name: 'city',
table: 'municipio',
tableField: 'nome',
resultField: 'city_name',
where: {
relation: '=',
type: 'integer',
field: 'id'
},
join: {
primary: 'id',
foreign: 'municipio_id',
foreignTable: 'projecao_matricula'
}
}, 'filter').addValue({
name: 'min_year',
table: 'projecao_matricula',
tableField: 'ano_censo',
resultField: 'year',
where: {
relation: '>=',
type: 'integer',
field: 'ano_censo'
}
}).addValue({
name: 'max_year',
table: 'projecao_matricula',
tableField: 'ano_censo',
resultField: 'year',
where: {
relation: '<=',
type: 'integer',
field: 'ano_censo'
}
});
enrollmentProjectionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
req.sql.field("'Brasil'", 'name')
.field('SUM(projecao_matricula.urbano_dia_total)', 'urban_day_total')
.field('SUM(projecao_matricula.urbano_noite_total)', 'urban_night_total')
.field('SUM(projecao_matricula.rural_dia_total)', 'rural_day_total')
.field('SUM(projecao_matricula.rural_noite_total)', 'rural_night_total')
.field('projecao_matricula.etapa_ensino_escola_ano_id', 'education_level_school_year_id')
.field('projecao_matricula.ano_censo', 'year')
.from('projecao_matricula')
.where('projecao_matricula.etapa_ensino_escola_ano_id <> 7 AND projecao_matricula.etapa_ensino_escola_ano_id < 71')
.group('projecao_matricula.etapa_ensino_escola_ano_id')
.group('projecao_matricula.ano_censo')
.order('projecao_matricula.ano_censo')
.order('projecao_matricula.etapa_ensino_escola_ano_id');
next();
}, query, id2str.transform(), (req, res, next) => {
req.result.forEach((r) => {
r.urban_day_total = parseInt(r.urban_day_total, 10);
r.urban_night_total = parseInt(r.urban_night_total, 10);
r.rural_day_total = parseInt(r.rural_day_total, 10);
r.rural_night_total = parseInt(r.rural_night_total, 10);
});
next();
}, response('enrollment_projection'));
module.exports = enrollmentProjectionApp;
\ No newline at end of file
......@@ -240,4 +240,76 @@ outOfSchoolApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
next();
}, query, addMissing(rqf), id2str.transform(), response('out_of_school'));
// Versão para o SimCAQ
let simcaqRqf = new ReqQueryFields();
simcaqRqf.addField({
name: 'filter',
field: false,
where: true
}).addField({
name: 'dims',
field: true,
where: false
}).addValue({
name: 'state',
table: 'populacao_fora_da_escola',
tableField: 'unidade_federativa',
resultField: 'state_id',
where: {
relation: '=',
type: 'integer',
field: 'unidade_federativa'
}
}).addValue({
name: 'pfe',
table: 'populacao_fora_da_escola',
tableField: 'codigo_pfe',
resultField: 'pfe_id',
where: {
relation: '=',
type: 'integer',
field: 'codigo_pfe'
}
}).addValue({
name: 'min_year',
table: 'populacao_fora_da_escola',
tableField: 'ano_censo',
resultField: 'year',
where: {
relation: '>=',
type: 'integer',
table: 'populacao_fora_da_escola',
field: 'ano_censo'
}
}).addValue({
name: 'max_year',
table: 'populacao_fora_da_escola',
tableField: 'ano_censo',
resultField: 'year',
where: {
relation: '<=',
type: 'integer',
table: 'populacao_fora_da_escola',
field: 'ano_censo'
}
});
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');
next();
}, query, (req, res, next) => {
req.result.forEach((i) => {
i.total = parseInt(i.total);
console.log(i.total);
});
next();
}, addMissing(simcaqRqf), id2str.transform(), response('out_of_school'));
module.exports = outOfSchoolApp;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment