diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b263b2b43cf4c8fc328875bb1beae5e9633f0f0..a4bfb83bf8faa8e1c8532dd115c91793abc41335 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/package.json b/package.json index 65e8d4c96f3372c0348376b054012ae247d64202..bb9438bfbcf40e8adfddb2dd27896bbe557a4dc5 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/src/libs/app.js b/src/libs/app.js index 6f464ead79b585ef439b825587413177bdc51223..b8b953c1ca4b23d2cc743611d6570b1d500de1e1 100644 --- a/src/libs/app.js +++ b/src/libs/app.js @@ -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(); diff --git a/src/libs/convert/educationLevelSchoolYear.js b/src/libs/convert/educationLevelSchoolYear.js new file mode 100644 index 0000000000000000000000000000000000000000..f4fe43b73539fdf47650994f5773463d98f05a5f --- /dev/null +++ b/src/libs/convert/educationLevelSchoolYear.js @@ -0,0 +1,36 @@ +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 diff --git a/src/libs/convert/pfe.js b/src/libs/convert/pfe.js new file mode 100644 index 0000000000000000000000000000000000000000..8ef82c87554dec7a6bb6246083c2bda7fd771d29 --- /dev/null +++ b/src/libs/convert/pfe.js @@ -0,0 +1,17 @@ +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'; + } +}; diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js index 1fa084f717431dc83a1ce28b40b79995e5720843..cb4c8cc1553ae711719878eb84d30ec29d3e993c 100644 --- a/src/libs/middlewares/id2str.js +++ b/src/libs/middlewares/id2str.js @@ -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) { diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js index dcd938f36f878c0a855cb61498779e50a6582bbb..c9150981ec646981c8999d25b21ab93cbb3a9c5a 100644 --- a/src/libs/routes/api.js +++ b/src/libs/routes/api.js @@ -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); diff --git a/src/libs/routes/classCount.js b/src/libs/routes/classCount.js index 71b7ab36a540d3e6dff748d7840b3e5e815f0a04..aba72e13eeeaa5c78d29ac42c3faba7d8dadb525 100644 --- a/src/libs/routes/classCount.js +++ b/src/libs/routes/classCount.js @@ -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; diff --git a/src/libs/routes/classroomCount.js b/src/libs/routes/classroomCount.js index d28de14a3671b6cc0823491f853b2a403fe89030..6fc655c90c6a78dafafaa6bccab2d6419780f4b4 100644 --- a/src/libs/routes/classroomCount.js +++ b/src/libs/routes/classroomCount.js @@ -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')); diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js index 33d914fcaea2d95976140b6a704217001b0285a3..54ef5beabc0aa84f611acb61e3a6412285838d79 100644 --- a/src/libs/routes/dailyChargeAmount.js +++ b/src/libs/routes/dailyChargeAmount.js @@ -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; diff --git a/src/libs/routes/enrollmentProjection.js b/src/libs/routes/enrollmentProjection.js new file mode 100644 index 0000000000000000000000000000000000000000..1bbe8ea3934a4fe59116ec0a3d96d292a446d59f --- /dev/null +++ b/src/libs/routes/enrollmentProjection.js @@ -0,0 +1,139 @@ +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 diff --git a/src/libs/routes/outOfSchool.js b/src/libs/routes/outOfSchool.js index d7e3915a624bac28541ecbe2460f8ae54d8e0e0c..3d8f33d9959d70906877f767ef242685f54f6350 100644 --- a/src/libs/routes/outOfSchool.js +++ b/src/libs/routes/outOfSchool.js @@ -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;