From 64b47d4a3c279cfecabbe0f724367f951f3504d0 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Mon, 1 Oct 2018 10:31:19 -0300 Subject: [PATCH] Create route enrollment_projection Related: simcaq/SCRUM#423 --- src/libs/convert/educationLevelSchoolYear.js | 36 +++++ src/libs/middlewares/id2str.js | 4 +- src/libs/routes/api.js | 3 + src/libs/routes/enrollmentProjection.js | 136 +++++++++++++++++++ 4 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 src/libs/convert/educationLevelSchoolYear.js create mode 100644 src/libs/routes/enrollmentProjection.js diff --git a/src/libs/convert/educationLevelSchoolYear.js b/src/libs/convert/educationLevelSchoolYear.js new file mode 100644 index 00000000..316efe5e --- /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 Fundamento - 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/middlewares/id2str.js b/src/libs/middlewares/id2str.js index 0a0c2af9..0af84212 100644 --- a/src/libs/middlewares/id2str.js +++ b/src/libs/middlewares/id2str.js @@ -30,6 +30,7 @@ const useTransport = require(`${libs}/convert/booleanVariable`); const useTransportPublic = require(`${libs}/convert/booleanVariable`); const transportationManager = require(`${libs}/convert/transportationManager`); const specialClass = require(`${libs}/convert/booleanVariable`); +const educationLevelSchoolYear = require(`${libs}/convert/educationLevelSchoolYear`); const ids = { gender_id: gender, @@ -71,7 +72,8 @@ const ids = { use_transport_id: useTransport, use_transport_public_id: useTransportPublic, transportation_manager_id: transportationManager, - special_class_id: specialClass + special_class_id: specialClass, + education_level_school_year_id: educationLevelSchoolYear, }; function transform(removeId=false) { diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js index 165f947e..d39b0352 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`); + api.get('/', (req, res) => { res.json({ msg: 'SimCAQ API is running' }); @@ -123,5 +125,6 @@ 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); module.exports = api; diff --git a/src/libs/routes/enrollmentProjection.js b/src/libs/routes/enrollmentProjection.js new file mode 100644 index 00000000..7ba72440 --- /dev/null +++ b/src/libs/routes/enrollmentProjection.js @@ -0,0 +1,136 @@ +const express = require('express'); + +const enrollmentProjectionApp = 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 ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`); + +const id2str = require(`${libs}/middlewares/id2str`); + +const config = require(`${libs}/config`); + +const addMissing = require(`${libs}/middlewares/addMissing`); + +const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware; + +enrollmentProjectionApp.use(cache('15 day')); + +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') + .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(), response('enrollment_projection')); + +module.exports = enrollmentProjectionApp; \ No newline at end of file -- GitLab