Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • simcaq/simcaq-node
  • SMPPIR/SMPPIR-Node
2 results
Select Git revision
Show changes
Commits on Source (19)
services:
simcaq-node:
container_name: simcaq-node
build: .
ports:
- '3000:3000'
develop:
watch:
- action: sync
path: .
target: /API
#!/bin/bash
echo "Starting simcaq-node"
gulp watch &> /dev/null &
cd build
NODE_ENV=production gulp run
...@@ -43,12 +43,12 @@ gulp.task('compile', ['lint'], () => { ...@@ -43,12 +43,12 @@ gulp.task('compile', ['lint'], () => {
gulp.src('src/**/*.js') gulp.src('src/**/*.js')
.pipe(cache.filter()) // cache source files .pipe(cache.filter()) // cache source files
.pipe(babel()) // compile only modified files .pipe(babel()) // compile only modified files
// .pipe(cache.cache()) // cache compiled files .pipe(cache.cache()) // cache compiled files
.pipe(gulp.dest('build')); // move compiled files to build directory .pipe(gulp.dest('build')); // move compiled files to build directory
}); });
gulp.task('build', ['compile'], () => { gulp.task('build', ['compile'], () => {
var filesToCopy = [ 'config.json', 'package.json' ]; var filesToCopy = [ 'config.json', 'package.json', '.eslintignore', '.eslintrc.json' ];
// copy configuration file to build directory // copy configuration file to build directory
gulp.src(filesToCopy) gulp.src(filesToCopy)
.pipe(gulp.dest('build')); .pipe(gulp.dest('build'));
...@@ -93,24 +93,16 @@ gulp.task('test', ['pre-test'], () => { ...@@ -93,24 +93,16 @@ gulp.task('test', ['pre-test'], () => {
}); });
}); });
gulp.task('watch', ['compile'], () => { gulp.task('watch', () => {
console.log('Watching source directory for changes'); console.log('Watching source directory for changes');
gulp.watch('src/**/*.js').on('change', () => { return gulp.watch('src/**/*.js').on('change', () => {
console.log('Recompiling source'); console.log('Recompiling source');
gulp.start('compile'); gulp.start('compile');
console.log('Source recompilation done'); console.log('Source recompilation done');
}); });
}); });
gulp.task('run', () => { gulp.task('default', () => {
process.chdir('build'); console.log("Não execuatar apenas gulp, execute da forma:");
nodemon({ console.log("\t\tgulp <task>");
script: 'server.js',
tasks: ['watch'],
ignore: ["test/test.js", "gulpfile.babel.js"],
ext: 'js html json',
env: { 'NODE_ENV': process.env.NODE_ENV }
});
}); });
gulp.task('default', ['run']);
const gulp = require('gulp');
const nodemon = require('gulp-nodemon');
gulp.task('run', () => {
// process.chdir('build');
nodemon({
script: 'server.js',
// tasks: ['watch'],
ignore: ["test/test.js", "gulpfile.babel.js"],
ext: 'js html json',
env: { 'NODE_ENV': process.env.NODE_ENV }
});
});
gulp.task('default', () => {
console.log("Não execuatar apenas gulp, execute da forma:");
console.log("\t\tgulp <task>");
});
...@@ -254,6 +254,7 @@ function transform(removeId=false) { ...@@ -254,6 +254,7 @@ function transform(removeId=false) {
} }
// Para cada objeto do resultado // Para cada objeto do resultado
req.result.forEach((obj) => { req.result.forEach((obj) => {
console.log(obj),
Object.keys(obj).forEach((key) => { Object.keys(obj).forEach((key) => {
// Se não há uma função especificada, retorna // Se não há uma função especificada, retorna
if(typeof ids[key] === 'undefined') return; if(typeof ids[key] === 'undefined') return;
......
/*
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 aggregateClassApp = 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();
aggregateClassApp.use(cache('15 day'));
aggregateClassApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
req.sql.from('turmas_agregadas2022')
.field('id');
next();
}, query, response('aggregateClass'));
module.exports = aggregateClassApp;
...@@ -157,8 +157,18 @@ const email = require(`${libs}/routes_v1/email`); ...@@ -157,8 +157,18 @@ const email = require(`${libs}/routes_v1/email`);
const uniLocalOfferAggregate = require(`${libs}/routes_v1/uniLocalOfferAggregate`) const uniLocalOfferAggregate = require(`${libs}/routes_v1/uniLocalOfferAggregate`)
const studentsReceivingAidTax = require(`${libs}/routes_v1/studentsReceivingAidTax`)
const superiorEducationConclusionTax = require(`${libs}/routes_v1/superiorEducationConclusionTax`)
const aggregateClass = require(`${libs}/routes_v1/aggregateClass`);
const instructionLevel = require(`${libs}/routes_v1/instructionLevel`);
const basicEducationConclusion = require(`${libs}/routes_v1/basicEducationConclusion`); const basicEducationConclusion = require(`${libs}/routes_v1/basicEducationConclusion`);
const iliteracyRate = require(`${libs}/routes_v1/iliteracyRate`);
api.get('/', (req, res) => { api.get('/', (req, res) => {
res.json({ msg: 'SimCAQ API v1 is running' }); res.json({ msg: 'SimCAQ API v1 is running' });
}); });
...@@ -219,13 +229,18 @@ api.use('/universityLocalOffer', universityLocalOffer); ...@@ -219,13 +229,18 @@ api.use('/universityLocalOffer', universityLocalOffer);
api.use('/message', message); api.use('/message', message);
api.use('/course_students', courseStudents); api.use('/course_students', courseStudents);
api.use('/new_pnad', newPnad); api.use('/new_pnad', newPnad);
api.use('/aggregate_class', aggregateClass);
api.use('/instruction_level', instructionLevel)
api.use('/rate_school_new', rateSchoolNew) api.use('/rate_school_new', rateSchoolNew)
api.use('/enrollmentAggregate', enrollmentAggregate); api.use('/enrollmentAggregate', enrollmentAggregate);
api.use('/employeesAggregate', employeesAggregate); api.use('/employeesAggregate', employeesAggregate);
api.use('/course_aggregate', courseAggregate); api.use('/course_aggregate', courseAggregate);
api.use('/federativeEntity', federativeEntity); api.use('/federativeEntity', federativeEntity);
api.use('/uni_offer_aggregate', uniLocalOfferAggregate); api.use('/uni_offer_aggregate', uniLocalOfferAggregate);
api.use('/students_receiving_aid_tax', studentsReceivingAidTax);
api.use('/superior_education_conclusion_tax', superiorEducationConclusionTax)
api.use('/basic_education_conclusion', basicEducationConclusion); api.use('/basic_education_conclusion', basicEducationConclusion);
api.use('/iliteracy_rate', iliteracyRate);
//Publication //Publication
api.use('/publication', publication); api.use('/publication', publication);
......
...@@ -144,6 +144,7 @@ cityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { ...@@ -144,6 +144,7 @@ cityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
.field('municipio.latitude', 'latitude') .field('municipio.latitude', 'latitude')
.field('municipio.mesorregiao_id', 'mesoregion_id') .field('municipio.mesorregiao_id', 'mesoregion_id')
.field('municipio.microrregiao_id', 'microregion_id'); .field('municipio.microrregiao_id', 'microregion_id');
console.log(req.sql.toString());
next(); next();
}, query, response('city')); }, query, response('city'));
......
/*
Copyright (C) 2024 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 iliteracyRate = express.Router();
const libs = `${process.cwd()}/libs`;
const squel = require('squel');
const query = require(`${libs}/middlewares/query`).query;
const multiQuery = require(`${libs}/middlewares/multiQuery`);
const response = require(`${libs}/middlewares/response`);
const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
const id2str = require(`${libs}/middlewares/id2str`);
const config = require(`${libs}/config`);
const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
let rqf = new ReqQueryFields();
iliteracyRate.use(cache('15 day'));
iliteracyRate.get('/years', (req, res, next) => {
req.sql.from('pnad_novo')
.field('DISTINCT pnad_novo.ano_ref', 'year')
.where('pnad_novo.ano_ref >= 2019')
next();
}, query, response('years'));
iliteracyRate.get('/illiteracy', (req, res, next) => {
req.result = []
for (let i = 0; i < 2; i++) {
req.result.push({
id: i, name: id2str.illiteracy(i)
});
}
req.result.push({id: 9, name: id2str.illiteracy(9)});
next();
}, response('illiteracy'));
iliteracyRate.get('/years_of_study', (req, res, next) => {
req.result = []
for (let i = 0; i < 17; i++) {
req.result.push({
id: i, name: id2str.yearsOfStudy(i)
});
}
req.result.push({id: 99, name: id2str.yearsOfStudy(99)});
next();
}, response('years_of_study'));
iliteracyRate.get('/instruction_level', (req, res, next) => {
req.result = []
for (let i = 1; i < 8; i++) {
req.result.push({
id: i, name: id2str.instructionLevel(i)
});
}
req.result.push({id: 99, name: id2str.instructionLevel(99)});
next();
}, response('instruction_level'));
iliteracyRate.get('/new_pnad_adm_dependency', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.newPnadAdmDependency(i)
});
}
req.result.push({id: 99, name: id2str.newPnadAdmDependency(99)});
next();
}, response('new_pnad_adm_dependency'));
iliteracyRate.get('/region', (req, res, next) => {
req.result = []
for (let i = 1; i < 6; i++) {
req.result.push({
id: i, name: id2str.regionCode(i)
});
}
next();
}, response('region'));
iliteracyRate.get('/cap_code', (req, res, next) => {
req.result = []
for (let i = 11; i < 54; i++) {
if (id2str.capitalCode(i) !== 'Não informado') {
req.result.push({
id: i, name: id2str.capitalCode(i)
});
}
}
req.result.push({id: 99, name: id2str.capitalCode(99)});
next();
}, response('cap_code'));
iliteracyRate.get('/metro_code', (req, res, next) => {
req.result = []
for (let i = 13; i < 53; i++) {
if (id2str.metroCode(i) !== 'Não informado') {
req.result.push({
id: i, name: id2str.metroCode(i)
});
}
}
req.result.push({id: 99, name: id2str.metroCode(99)});
next();
}, response('metro_code'));
iliteracyRate.get('/attended_modality', (req, res, next) => {
req.result = []
for (let i = 1; i < 16; i++) {
req.result.push({
id: i, name: id2str.attendedModality(i)
});
}
// Remove the option with id equals 10 => This option exists in the database, a better solution to this would be remove the option from the database
req.result.splice(req.result.findIndex((item) => item.id === 10), 1);
req.result.push({id: 99, name: id2str.attendedModality(99)});
next();
}, response('attended_modality'));
iliteracyRate.get('/income_range', (req, res, next) => {
req.result = []
for (let i = 1; i < 10; i++) {
req.result.push({
id: i, name: id2str.incomeRange(i)
});
}
next();
}, response('income_range'));
iliteracyRate.get('/attends_school', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.attendsSchool(i)
});
}
next();
}, response('attends_school'));
iliteracyRate.get('/gender', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.gender(i)
});
}
next();
}, response('gender'));
iliteracyRate.get('/new_pnad_ethnic_group', (req, res, next) => {
req.result = []
for (let i = 1; i < 6; i++) {
req.result.push({
id: i, name: id2str.ethnicGroupNewPnad(i)
});
}
req.result.push({id: 9, name: id2str.ethnicGroupNewPnad(9)});
next();
}, response('new_pnad_ethnic_group'));
iliteracyRate.get('/bolsa_familia', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.attendsSchool(i)
});
}
req.result.push({id: 9, name: id2str.attendsSchool(9)});
next();
}, response('bolsa_familia'));
iliteracyRate.get('/modality', (req, res, next) => {
req.result = []
for (let i = 1; i < 4; i++) {
req.result.push({
id: i, name: id2str.modality(i)
});
}
req.result.push({id: 99, name: id2str.modality(99)});
next();
}, response('modality'));
iliteracyRate.get('/modality_shift', (req, res, next) => {
req.result = []
for (let i = 1; i < 8; i++) {
req.result.push({
id: i, name: id2str.modalityShift(i)
});
}
req.result.push({id: 9, name: id2str.modalityShift(9)});
req.result.push({id: 99, name: id2str.modalityShift(99)});
next();
}, response('modality_shift'));
iliteracyRate.get('/state', (req, res, next) => {
req.result = []
for (let i = 11; i < 54; i++) {
if (id2str.stateName(i) !== 'Não declarada') {
req.result.push({
id: i, name: id2str.stateName(i)
});
}
}
req.result.push({id: 99, name: id2str.stateName(99)});
next();
}, response('state'));
iliteracyRate.get('/age_range_all', (req, res, next) => {
req.result = []
for (let i = 5; i < 12; i++) {
req.result.push({
id: i, name: id2str.ageRangeAll(i)
});
}
next();
}, response('age_range_all'));
iliteracyRate.get('/location', (req, res, next) => {
req.result = []
for (let i = 1; i <= 2; i++) {
req.result.push({
id: i, name: id2str.location(i)
});
}
next();
}, response('location'));
rqf.addField({
name: 'filter',
field: false,
where: true
}).addField({
name: 'dims',
field: true,
where: false
}).addValue({
name: 'id',
table: 'pnad_novo',
tableField: 'id',
where: {
relation: '=',
type: 'integer',
field: 'id'
}
}).addValue({
name: 'state',
table: 'estado',
tableField: ['id', 'nome'],
resultField: ['state_id', 'state_nome'],
where: {
relation: '=',
type: 'integer',
field: 'id',
},
join: {
primary: 'id',
foreign: 'cod_uf',
foreignTable: 'pnad_novo'
}
}).addValue({
name: 'state_not',
table: 'estado',
tableField: ['nome', 'id'],
resultField: ['state_name', 'state_id'],
where: {
relation: '<>',
type: 'integer',
field: 'cod_uf',
table: 'pnad_novo'
},
join: {
primary: 'id',
foreign: 'cod_uf',
foreignTable: 'pnad_novo'
}
}).addValue({
name: 'years_of_study',
table: 'pnad_novo',
tableField: 'anos_de_estudo',
resultField: 'years_of_study_id',
where: {
relation: '=',
type: 'integer',
field: 'anos_de_estudo'
}
}).addValue({
name: 'instruction_level',
table: 'pnad_novo',
tableField: 'nivel_de_instrucao',
resultField: 'instruction_level_id',
where: {
relation: '=',
type: 'integer',
field: 'nivel_de_instrucao'
}
}).addValue({
name: 'new_pnad_adm_dependency',
table: 'pnad_novo',
tableField: 'dependencia_adm',
resultField: 'new_pnad_adm_dependency_id',
where: {
relation: '=',
type: 'integer',
field: 'dependencia_adm'
}
}).addValue({
name: 'attends_school',
table: 'pnad_novo',
tableField: 'frequenta_escola',
resultField: 'attends_school_id',
where: {
relation: '=',
type: 'integer',
field: 'frequenta_escola'
}
}).addValue({
name: 'modality',
table: 'pnad_novo',
tableField: 'modalidade',
resultField: 'modality_id',
where: {
relation: '=',
type: 'integer',
field: 'modalidade'
}
}).addValue({
name: 'attended_modality',
table: 'pnad_novo',
tableField: 'nivel_etapa_modalidade_freq',
resultField: 'attended_modality_id',
where: {
relation: '=',
type: 'integer',
field: 'nivel_etapa_modalidade_freq'
}
}).addValue({
name: 'illiteracy',
table: 'pnad_novo',
tableField: 'analfabetismo',
resultField: 'illiteracy_id',
where: {
relation: '=',
type: 'integer',
field: 'analfabetismo'
}
}).addValue({
name: 'modality_shift',
table: 'pnad_novo',
tableField: 'turno_nivel_etapa',
resultField: 'modality_shift_id',
where: {
relation: '=',
type: 'integer',
field: 'turno_nivel_etapa'
}
}).addValue({
name: 'bolsa_familia',
table: 'pnad_novo',
tableField: 'recebeu_rendimentos_de_programa_bolsa_familia',
resultField: 'bolsa_familia_id',
where: {
relation: '=',
type: 'integer',
field: 'recebeu_rendimentos_de_programa_bolsa_familia'
}
}).addValue({
name: 'new_pnad_ethnic_group',
table: 'pnad_novo',
tableField: 'cor_raca',
resultField: 'new_pnad_ethnic_group_id',
where: {
relation: '=',
type: 'integer',
field: 'cor_raca'
}
}).addValue({
name: 'age_range_all',
table: 'pnad_novo',
tableField: 'faixa_etaria',
resultField: 'age_range_all_id',
where: {
relation: '=',
type: 'integer',
field: 'faixa_etaria'
}
}).addValue({
name: 'income_range',
table: 'pnad_novo',
tableField: 'faixa_rendimento_aux',
resultField: 'income_range_id',
where: {
relation: '=',
type: 'integer',
field: 'faixa_rendimento_aux'
}
}).addValue({
name: 'gender',
table: 'pnad_novo',
tableField: 'sexo',
resultField: 'gender_id',
where: {
relation: '=',
type: 'integer',
field: 'sexo'
}
}).addValue({
name: 'cap_code',
table: 'pnad_novo',
tableField: 'cod_cap',
resultField: 'cap_code_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_cap'
}
}).addValue({
name: 'region',
table: 'pnad_novo',
tableField: 'cod_regiao',
resultField: 'region_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_regiao'
}
}).addValue({
name: 'metro_code',
table: 'pnad_novo',
tableField: 'cod_rm_ride',
resultField: 'metro_code_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_rm_ride'
}
}).addValue({
name: 'location',
table: 'pnad_novo',
tableField: 'situacao_domicilio',
resultField: 'location_id',
where: {
relation: '=',
type: 'integer',
field: 'situacao_domicilio'
}
}).addValue({
name: 'min_year',
table: 'pnad_novo',
tableField: 'ano_ref',
resultField: 'year',
where: {
relation: '>=',
type: 'integer',
field: 'ano_ref'
}
}).addValue({
name: 'max_year',
table: 'pnad_novo',
tableField: '',
resultField: 'year',
where: {
relation: '<=',
type: 'integer',
field: 'ano_ref'
}
}).addField({
name: 'search',
field: false,
where: true
}).addValueToField({
name: 'name',
table: 'pnad_novo',
tableField: 'nome',
where: {
relation: 'LIKE',
type: 'string',
field: 'nome'
}
}, 'search').addValue({
name: 'mesoregion',
table: 'pnad_novo',
tableField: 'mesorregiao_id',
where: {
relation: '=',
type: 'integer',
field: 'mesorregiao_id'
}
}).addValue({
name: 'microregion',
table: 'pnad_novo',
tableField: 'microrregiao_id',
where: {
relation: '=',
type: 'integer',
field: 'microrregiao_id'
}
});
function matchQueries(queryPartial, queryTotal) {
let match = [];
queryTotal.forEach((result) => {
let newObj = {};
let keys = Object.keys(result);
keys.forEach((key) => {
newObj[key] = result[key];
});
let index = keys.indexOf('total');
if(index > -1) keys.splice(index, 1);
let objMatch = null;
for(let i = 0; i < queryPartial.length; ++i) {
let partial = queryPartial[i];
let foundMatch = true;
for(let j = 0; j < keys.length; ++j) {
let key = keys[j];
if(partial[key] !== result[key]) {
foundMatch = false;
break;
}
}
if(foundMatch) {
objMatch = partial;
break;
}
}
if(objMatch) {
newObj.denominator = result.total;
newObj.partial = objMatch.total;
newObj.total = (objMatch.total / result.total) * 100;
newObj.total = newObj.total.toFixed(1);
match.push(newObj);
}
});
return match;
}
iliteracyRate.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
req.querySet = [];
// Subquery para total_pop_maior_19 com filtros dinâmicos
let totalAnalfabetismo = req.sql.clone();
totalAnalfabetismo.from("pnad_novo")
.field("ano_ref", "year")
.field("SUM(peso_domicilio_pessoas_com_cal)", "total")
.where("analfabetismo = 1")
.where("ano_ref >= 2019")
.group("ano_ref")
.order("ano_ref");
// Subquery para total_pop_ed_bas_maior_19 com filtros dinâmicos
let totalPop = req.sql.clone();
totalPop.from("pnad_novo")
.field("ano_ref", "year")
.field("SUM(peso_domicilio_pessoas_com_cal)", "total")
.where("analfabetismo = 0 or analfabetismo = 1")
.where("ano_ref >= 2019")
.group("ano_ref")
.order("ano_ref");
req.querySet.push(totalAnalfabetismo);
req.querySet.push(totalPop);
next();
}, multiQuery, (req, res, next) => {
// The multiple requests are made. Then we need to calculate the percetange. So the function
// below is used
let newObj = matchQueries(req.result[0], req.result[1]);
req.result = newObj;
next();
}, id2str.transform(false), response('iliteracy_rate'));
module.exports = iliteracyRate;
/*
Copyright (C) 2024 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 NivelInstrucao = 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 id2str = require(`${libs}/middlewares/id2str`);
const config = require(`${libs}/config`);
const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
let rqf = new ReqQueryFields();
NivelInstrucao.use(cache('15 day'));
NivelInstrucao.get('/years', (req, res, next) => {
req.sql.from('pnad_novo')
.field('DISTINCT pnad_novo.ano_ref', 'year')
next();
}, query, response('years'));
NivelInstrucao.get('/instruction_level', (req, res, next) => {
req.result = []
for (let i = 1; i < 8; i++) {
req.result.push({
id: i, name: id2str.instructionLevel(i)
});
}
req.result.push({id: 99, name: id2str.instructionLevel(99)});
next();
}, response('instruction_level'));
rqf.addField({
name: 'filter',
field: false,
where: true
}).addField({
name: 'dims',
field: true,
where: false
}).addValue({
name: 'id',
table: 'pnad_novo',
tableField: 'id',
where: {
relation: '=',
type: 'integer',
field: 'id'
}
}).addValue({
name: 'location',
table: 'pnad_novo',
tableField: 'tipo_de_area',
resultField: 'location_id',
where: {
relation: '=',
type: 'integer',
field: 'id'
}
}).addValue({
name: 'bolsa_familia',
table: 'pnad_novo',
tableField: 'recebeu_rendimentos_de_programa_bolsa_familia',
resultField: 'bolsa_familia_id',
where: {
relation: '=',
type: 'integer',
field: 'recebeu_rendimentos_de_programa_bolsa_familia'
}
}).addValue({
name: 'cap_code',
table: 'pnad_novo',
tableField: 'cod_cap',
resultField: 'cap_code_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_cap'
}
}).addValue({
name: 'new_pnad_ethnic_group',
table: 'pnad_novo',
tableField: 'cor_raca',
resultField: 'new_pnad_ethnic_group_id',
where: {
relation: '=',
type: 'integer',
field: 'cor_raca'
}
}).addValue({
name: 'age_range_all',
table: 'pnad_novo',
tableField: 'faixa_etaria',
resultField: 'age_range_all_id',
where: {
relation: '=',
type: 'integer',
field: 'faixa_etaria'
}
}).addValue({
name: 'income_range',
table: 'pnad_novo',
tableField: 'faixa_rendimento_aux',
resultField: 'income_range_id',
where: {
relation: '=',
type: 'integer',
field: 'faixa_rendimento_aux'
}
}).addValue({
name: 'region',
table: 'pnad_novo',
tableField: 'cod_regiao',
resultField: 'region_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_regiao'
}
}).addValue({
name: 'metro_code',
table: 'pnad_novo',
tableField: 'cod_rm_ride',
resultField: 'metro_code_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_rm_ride'
}
}).addValue({
name: 'gender',
table: 'pnad_novo',
tableField: 'sexo',
resultField: 'gender_id',
where: {
relation: '=',
type: 'integer',
field: 'sexo'
}
}).addValue({
name: 'state',
table: 'estado',
tableField: ['id', 'nome'],
resultField: ['state_id', 'state_nome'],
where: {
relation: '=',
type: 'integer',
field: 'id',
},
join: {
primary: 'id',
foreign: 'cod_uf',
foreignTable: 'pnad_novo'
}
}).addValue({
name: 'instruction_level',
table: 'pnad_novo',
tableField: 'nivel_de_instrucao',
resultField: 'instruction_level_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_uf'
}
}).addValue({
name: 'min_year',
table: 'pnad_novo',
tableField: 'ano_ref',
resultField: 'year',
where: {
relation: '>=',
type: 'integer',
field: 'ano_ref'
}
}).addValue({
name: 'max_year',
table: 'pnad_novo',
tableField: '',
resultField: 'year',
where: {
relation: '<=',
type: 'integer',
field: 'ano_ref'
}
}).addValue({
name: 'bolsa_familia',
table: 'pnad_novo',
tableField: 'recebeu_rendimentos_de_programa_bolsa_familia',
resultField: 'bolsa_familia_id',
where: {
relation: '=',
type: 'integer',
field: 'recebeu_rendimentos_de_programa_bolsa_familia'
}
})
NivelInstrucao.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
if ("instruction_level" in req.filter || "instruction_level" in req.dims) {
// The multiple requests are made. Then we need to calculate the percetange. So the function
// below is used
req.sql.from('pnad_novo')
.field('nivel_de_instrucao', 'nivel')
.field('round(sum(peso_domicilio_pessoas_com_cal), 0)', 'total')
.field('ano_ref', 'year')
.where('nivel_de_instrucao <> 99')
.where('faixa_etaria <> 99')
.group('pnad_novo.ano_ref')
.group('pnad_novo.nivel_de_instrucao')
console.log(req.sql.toString())
}
else {
res.status(400);
next({
status: 400,
message: 'Wrong/No filter specified'
});
}
next();
}, query, id2str.transform(false), response('pnad_novo'));
module.exports = NivelInstrucao;
/*
Copyright (C) 2024 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 studentsReceivingAidTaxApp = express.Router();
const libs = `${process.cwd()}/libs`;
const squel = require('squel');
const query = require(`${libs}/middlewares/query`).query;
const multiQuery = require(`${libs}/middlewares/multiQuery`);
const response = require(`${libs}/middlewares/response`);
const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
const id2str = require(`${libs}/middlewares/id2str`);
const config = require(`${libs}/config`);
const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
let rqf = new ReqQueryFields();
studentsReceivingAidTaxApp.use(cache('15 day'));
studentsReceivingAidTaxApp.get('/years', (req, res, next) => {
req.sql.from('pnad_novo')
.field('DISTINCT pnad_novo.ano_ref', 'year')
.where('pnad_novo.ano_ref >= 2019')
next();
}, query, response('years'));
studentsReceivingAidTaxApp.get('/illiteracy', (req, res, next) => {
req.result = []
for (let i = 0; i < 2; i++) {
req.result.push({
id: i, name: id2str.illiteracy(i)
});
}
req.result.push({id: 9, name: id2str.illiteracy(9)});
next();
}, response('illiteracy'));
studentsReceivingAidTaxApp.get('/years_of_study', (req, res, next) => {
req.result = []
for (let i = 0; i < 17; i++) {
req.result.push({
id: i, name: id2str.yearsOfStudy(i)
});
}
req.result.push({id: 99, name: id2str.yearsOfStudy(99)});
next();
}, response('years_of_study'));
studentsReceivingAidTaxApp.get('/instruction_level', (req, res, next) => {
req.result = []
for (let i = 1; i < 8; i++) {
req.result.push({
id: i, name: id2str.instructionLevel(i)
});
}
req.result.push({id: 99, name: id2str.instructionLevel(99)});
next();
}, response('instruction_level'));
studentsReceivingAidTaxApp.get('/new_pnad_adm_dependency', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.newPnadAdmDependency(i)
});
}
req.result.push({id: 99, name: id2str.newPnadAdmDependency(99)});
next();
}, response('new_pnad_adm_dependency'));
studentsReceivingAidTaxApp.get('/region', (req, res, next) => {
req.result = []
for (let i = 1; i < 6; i++) {
req.result.push({
id: i, name: id2str.regionCode(i)
});
}
next();
}, response('region'));
studentsReceivingAidTaxApp.get('/cap_code', (req, res, next) => {
req.result = []
for (let i = 11; i < 54; i++) {
if (id2str.capitalCode(i) !== 'Não informado') {
req.result.push({
id: i, name: id2str.capitalCode(i)
});
}
}
req.result.push({id: 99, name: id2str.capitalCode(99)});
next();
}, response('cap_code'));
studentsReceivingAidTaxApp.get('/metro_code', (req, res, next) => {
req.result = []
for (let i = 13; i < 53; i++) {
if (id2str.metroCode(i) !== 'Não informado') {
req.result.push({
id: i, name: id2str.metroCode(i)
});
}
}
req.result.push({id: 99, name: id2str.metroCode(99)});
next();
}, response('metro_code'));
studentsReceivingAidTaxApp.get('/attended_modality', (req, res, next) => {
req.result = []
for (let i = 1; i < 16; i++) {
req.result.push({
id: i, name: id2str.attendedModality(i)
});
}
// Remove the option with id equals 10 => This option exists in the database, a better solution to this would be remove the option from the database
req.result.splice(req.result.findIndex((item) => item.id === 10), 1);
req.result.push({id: 99, name: id2str.attendedModality(99)});
next();
}, response('attended_modality'));
studentsReceivingAidTaxApp.get('/income_range', (req, res, next) => {
req.result = []
for (let i = 1; i < 8; i++) {
req.result.push({
id: i, name: id2str.incomeRange(i)
});
}
req.result.push({id: 10, name: id2str.incomeRange(10)});
next();
}, response('income_range'));
studentsReceivingAidTaxApp.get('/attends_school', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.attendsSchool(i)
});
}
next();
}, response('attends_school'));
studentsReceivingAidTaxApp.get('/gender', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.gender(i)
});
}
next();
}, response('gender'));
studentsReceivingAidTaxApp.get('/new_pnad_ethnic_group', (req, res, next) => {
req.result = []
for (let i = 1; i < 6; i++) {
req.result.push({
id: i, name: id2str.ethnicGroupNewPnad(i)
});
}
req.result.push({id: 9, name: id2str.ethnicGroupNewPnad(9)});
next();
}, response('new_pnad_ethnic_group'));
studentsReceivingAidTaxApp.get('/bolsa_familia', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.attendsSchool(i)
});
}
req.result.push({id: 9, name: id2str.attendsSchool(9)});
next();
}, response('bolsa_familia'));
studentsReceivingAidTaxApp.get('/modality', (req, res, next) => {
req.result = []
for (let i = 1; i < 4; i++) {
req.result.push({
id: i, name: id2str.modality(i)
});
}
req.result.push({id: 99, name: id2str.modality(99)});
next();
}, response('modality'));
studentsReceivingAidTaxApp.get('/modality_shift', (req, res, next) => {
req.result = []
for (let i = 1; i < 8; i++) {
req.result.push({
id: i, name: id2str.modalityShift(i)
});
}
req.result.push({id: 9, name: id2str.modalityShift(9)});
req.result.push({id: 99, name: id2str.modalityShift(99)});
next();
}, response('modality_shift'));
studentsReceivingAidTaxApp.get('/state', (req, res, next) => {
req.result = []
for (let i = 11; i < 54; i++) {
if (id2str.stateName(i) !== 'Não declarada') {
req.result.push({
id: i, name: id2str.stateName(i)
});
}
}
req.result.push({id: 99, name: id2str.stateName(99)});
next();
}, response('state'));
studentsReceivingAidTaxApp.get('/age_range', (req, res, next) => {
req.result = []
for (let i = 1; i < 12; i++) {
req.result.push({
id: i, name: id2str.ageRangeAll(i)
});
}
next();
}, response('age_range'));
studentsReceivingAidTaxApp.get('/location', (req, res, next) => {
req.result = []
for (let i = 1; i <= 2; i++) {
req.result.push({
id: i, name: id2str.location(i)
});
}
next();
}, response('location'));
rqf.addField({
name: 'filter',
field: false,
where: true
}).addField({
name: 'dims',
field: true,
where: false
}).addValue({
name: 'id',
table: 'pnad_novo',
tableField: 'id',
where: {
relation: '=',
type: 'integer',
field: 'id'
}
}).addValue({
name: 'state',
table: 'estado',
tableField: ['id', 'nome'],
resultField: ['state_id', 'state_nome'],
where: {
relation: '=',
type: 'integer',
field: 'id',
},
join: {
primary: 'id',
foreign: 'cod_uf',
foreignTable: 'pnad_novo'
}
}).addValue({
name: 'state_not',
table: 'estado',
tableField: ['nome', 'id'],
resultField: ['state_name', 'state_id'],
where: {
relation: '<>',
type: 'integer',
field: 'cod_uf',
table: 'pnad_novo'
},
join: {
primary: 'id',
foreign: 'cod_uf',
foreignTable: 'pnad_novo'
}
}).addValue({
name: 'years_of_study',
table: 'pnad_novo',
tableField: 'anos_de_estudo',
resultField: 'years_of_study_id',
where: {
relation: '=',
type: 'integer',
field: 'anos_de_estudo'
}
}).addValue({
name: 'instruction_level',
table: 'pnad_novo',
tableField: 'nivel_de_instrucao',
resultField: 'instruction_level_id',
where: {
relation: '=',
type: 'integer',
field: 'nivel_de_instrucao'
}
}).addValue({
name: 'new_pnad_adm_dependency',
table: 'pnad_novo',
tableField: 'dependencia_adm',
resultField: 'new_pnad_adm_dependency_id',
where: {
relation: '=',
type: 'integer',
field: 'dependencia_adm'
}
}).addValue({
name: 'attends_school',
table: 'pnad_novo',
tableField: 'frequenta_escola',
resultField: 'attends_school_id',
where: {
relation: '=',
type: 'integer',
field: 'frequenta_escola'
}
}).addValue({
name: 'modality',
table: 'pnad_novo',
tableField: 'modalidade',
resultField: 'modality_id',
where: {
relation: '=',
type: 'integer',
field: 'modalidade'
}
}).addValue({
name: 'attended_modality',
table: 'pnad_novo',
tableField: 'nivel_etapa_modalidade_freq',
resultField: 'attended_modality_id',
where: {
relation: '=',
type: 'integer',
field: 'nivel_etapa_modalidade_freq'
}
}).addValue({
name: 'illiteracy',
table: 'pnad_novo',
tableField: 'analfabetismo',
resultField: 'illiteracy_id',
where: {
relation: '=',
type: 'integer',
field: 'analfabetismo'
}
}).addValue({
name: 'modality_shift',
table: 'pnad_novo',
tableField: 'turno_nivel_etapa',
resultField: 'modality_shift_id',
where: {
relation: '=',
type: 'integer',
field: 'turno_nivel_etapa'
}
}).addValue({
name: 'bolsa_familia',
table: 'pnad_novo',
tableField: 'recebeu_rendimentos_de_programa_bolsa_familia',
resultField: 'bolsa_familia_id',
where: {
relation: '=',
type: 'integer',
field: 'recebeu_rendimentos_de_programa_bolsa_familia'
}
}).addValue({
name: 'new_pnad_ethnic_group',
table: 'pnad_novo',
tableField: 'cor_raca',
resultField: 'new_pnad_ethnic_group_id',
where: {
relation: '=',
type: 'integer',
field: 'cor_raca'
}
}).addValue({
name: 'age_range_all',
table: 'pnad_novo',
tableField: 'faixa_etaria',
resultField: 'age_range_all_id',
where: {
relation: '=',
type: 'integer',
field: 'faixa_etaria'
}
}).addValue({
name: 'income_range',
table: 'pnad_novo',
tableField: 'faixa_rendimento_aux_tx',
resultField: 'income_range_id',
where: {
relation: '=',
type: 'integer',
field: 'faixa_rendimento_aux_tx'
}
}).addValue({
name: 'gender',
table: 'pnad_novo',
tableField: 'sexo',
resultField: 'gender_id',
where: {
relation: '=',
type: 'integer',
field: 'sexo'
}
}).addValue({
name: 'cap_code',
table: 'pnad_novo',
tableField: 'cod_cap',
resultField: 'cap_code_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_cap'
}
}).addValue({
name: 'region',
table: 'pnad_novo',
tableField: 'cod_regiao',
resultField: 'region_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_regiao'
}
}).addValue({
name: 'metro_code',
table: 'pnad_novo',
tableField: 'cod_rm_ride',
resultField: 'metro_code_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_rm_ride'
}
}).addValue({
name: 'location',
table: 'pnad_novo',
tableField: 'situacao_domicilio',
resultField: 'location_id',
where: {
relation: '=',
type: 'integer',
field: 'situacao_domicilio'
}
}).addValue({
name: 'min_year',
table: 'pnad_novo',
tableField: 'ano_ref',
resultField: 'year',
where: {
relation: '>=',
type: 'integer',
field: 'ano_ref'
}
}).addValue({
name: 'max_year',
table: 'pnad_novo',
tableField: '',
resultField: 'year',
where: {
relation: '<=',
type: 'integer',
field: 'ano_ref'
}
}).addField({
name: 'search',
field: false,
where: true
}).addValueToField({
name: 'name',
table: 'pnad_novo',
tableField: 'nome',
where: {
relation: 'LIKE',
type: 'string',
field: 'nome'
}
}, 'search').addValue({
name: 'mesoregion',
table: 'pnad_novo',
tableField: 'mesorregiao_id',
where: {
relation: '=',
type: 'integer',
field: 'mesorregiao_id'
}
}).addValue({
name: 'microregion',
table: 'pnad_novo',
tableField: 'microrregiao_id',
where: {
relation: '=',
type: 'integer',
field: 'microrregiao_id'
}
});
function matchQueries(queryPartial, queryTotal) {
let match = [];
queryTotal.forEach((result) => {
let newObj = {};
let keys = Object.keys(result);
keys.forEach((key) => {
newObj[key] = result[key];
});
let index = keys.indexOf('total');
if(index > -1) keys.splice(index, 1);
let objMatch = null;
for(let i = 0; i < queryPartial.length; ++i) {
let partial = queryPartial[i];
let foundMatch = true;
for(let j = 0; j < keys.length; ++j) {
let key = keys[j];
if(partial[key] !== result[key]) {
foundMatch = false;
break;
}
}
if(foundMatch) {
objMatch = partial;
break;
}
}
if(objMatch) {
newObj.denominator = result.total;
newObj.denominator = Number(newObj.denominator.toFixed(2));
newObj.partial = objMatch.total;
newObj.partial = Number(newObj.total.toFixed(2));
newObj.total = (objMatch.total / result.total) * 100;
newObj.total = Number(newObj.total.toFixed(2));
match.push(newObj);
}
});
return match;
}
studentsReceivingAidTaxApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
req.querySet = [];
// Subquery para total_pop_maior_25 com filtros dinâmicos
let totalEstudantesQueRecebemAuxilio = req.sql.clone();
totalEstudantesQueRecebemAuxilio.from("pnad_novo")
.field("ano_ref", "year")
.field("SUM(peso_domicilio_pessoas_com_cal)", "total")
.where("recebeu_rendimentos_de_programa_bolsa_familia = 1")
.where("frequenta_escola = 1")
.where("ano_ref >= 2019")
.group("ano_ref")
.order("ano_ref");
// Subquery para total_pop_maior_25 com filtros dinâmicos
let totalEstudantes = req.sql.clone();
totalEstudantes.from("pnad_novo")
.field("ano_ref", "year")
.field("SUM(peso_domicilio_pessoas_com_cal)", "total")
.where("frequenta_escola = 1")
.group("ano_ref")
.order("ano_ref");
req.querySet.push(totalEstudantesQueRecebemAuxilio);
req.querySet.push(totalEstudantes);
next();
}, multiQuery, (req, res, next) => {
// The multiple requests are made. Then we need to calculate the percetange. So the function
// below is used
let newObj = matchQueries(req.result[0], req.result[1]);
req.result = newObj;
next();
}, id2str.transform(false), response('studentsReceivingAidTax'));
module.exports = studentsReceivingAidTaxApp;
/*
Copyright (C) 2024 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 superiorEducationConclusionTaxApp = express.Router();
const libs = `${process.cwd()}/libs`;
const squel = require('squel');
const query = require(`${libs}/middlewares/query`).query;
const multiQuery = require(`${libs}/middlewares/multiQuery`);
const response = require(`${libs}/middlewares/response`);
const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
const id2str = require(`${libs}/middlewares/id2str`);
const config = require(`${libs}/config`);
const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
let rqf = new ReqQueryFields();
superiorEducationConclusionTaxApp.use(cache('15 day'));
superiorEducationConclusionTaxApp.get('/years', (req, res, next) => {
req.sql.from('pnad_novo')
.field('DISTINCT pnad_novo.ano_ref', 'year')
.where('pnad_novo.ano_ref >= 2019')
next();
}, query, response('years'));
superiorEducationConclusionTaxApp.get('/illiteracy', (req, res, next) => {
req.result = []
for (let i = 0; i < 2; i++) {
req.result.push({
id: i, name: id2str.illiteracy(i)
});
}
req.result.push({id: 9, name: id2str.illiteracy(9)});
next();
}, response('illiteracy'));
superiorEducationConclusionTaxApp.get('/years_of_study', (req, res, next) => {
req.result = []
for (let i = 0; i < 17; i++) {
req.result.push({
id: i, name: id2str.yearsOfStudy(i)
});
}
req.result.push({id: 99, name: id2str.yearsOfStudy(99)});
next();
}, response('years_of_study'));
superiorEducationConclusionTaxApp.get('/instruction_level', (req, res, next) => {
req.result = []
for (let i = 1; i < 8; i++) {
req.result.push({
id: i, name: id2str.instructionLevel(i)
});
}
req.result.push({id: 99, name: id2str.instructionLevel(99)});
next();
}, response('instruction_level'));
superiorEducationConclusionTaxApp.get('/new_pnad_adm_dependency', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.newPnadAdmDependency(i)
});
}
req.result.push({id: 99, name: id2str.newPnadAdmDependency(99)});
next();
}, response('new_pnad_adm_dependency'));
superiorEducationConclusionTaxApp.get('/region', (req, res, next) => {
req.result = []
for (let i = 1; i < 6; i++) {
req.result.push({
id: i, name: id2str.regionCode(i)
});
}
next();
}, response('region'));
superiorEducationConclusionTaxApp.get('/cap_code', (req, res, next) => {
req.result = []
for (let i = 11; i < 54; i++) {
if (id2str.capitalCode(i) !== 'Não informado') {
req.result.push({
id: i, name: id2str.capitalCode(i)
});
}
}
req.result.push({id: 99, name: id2str.capitalCode(99)});
next();
}, response('cap_code'));
superiorEducationConclusionTaxApp.get('/metro_code', (req, res, next) => {
req.result = []
for (let i = 13; i < 53; i++) {
if (id2str.metroCode(i) !== 'Não informado') {
req.result.push({
id: i, name: id2str.metroCode(i)
});
}
}
req.result.push({id: 99, name: id2str.metroCode(99)});
next();
}, response('metro_code'));
superiorEducationConclusionTaxApp.get('/attended_modality', (req, res, next) => {
req.result = []
for (let i = 1; i < 16; i++) {
req.result.push({
id: i, name: id2str.attendedModality(i)
});
}
// Remove the option with id equals 10 => This option exists in the database, a better solution to this would be remove the option from the database
req.result.splice(req.result.findIndex((item) => item.id === 10), 1);
req.result.push({id: 99, name: id2str.attendedModality(99)});
next();
}, response('attended_modality'));
superiorEducationConclusionTaxApp.get('/income_range', (req, res, next) => {
req.result = []
for (let i = 1; i < 8; i++) {
req.result.push({
id: i, name: id2str.incomeRange(i)
});
}
req.result.push({id: 10, name: id2str.incomeRange(10)});
next();
}, response('income_range'));
superiorEducationConclusionTaxApp.get('/attends_school', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.attendsSchool(i)
});
}
next();
}, response('attends_school'));
superiorEducationConclusionTaxApp.get('/gender', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.gender(i)
});
}
next();
}, response('gender'));
superiorEducationConclusionTaxApp.get('/new_pnad_ethnic_group', (req, res, next) => {
req.result = []
for (let i = 1; i < 6; i++) {
req.result.push({
id: i, name: id2str.ethnicGroupNewPnad(i)
});
}
req.result.push({id: 9, name: id2str.ethnicGroupNewPnad(9)});
next();
}, response('new_pnad_ethnic_group'));
superiorEducationConclusionTaxApp.get('/bolsa_familia', (req, res, next) => {
req.result = []
for (let i = 1; i < 3; i++) {
req.result.push({
id: i, name: id2str.attendsSchool(i)
});
}
req.result.push({id: 9, name: id2str.attendsSchool(9)});
next();
}, response('bolsa_familia'));
superiorEducationConclusionTaxApp.get('/modality', (req, res, next) => {
req.result = []
for (let i = 1; i < 4; i++) {
req.result.push({
id: i, name: id2str.modality(i)
});
}
req.result.push({id: 99, name: id2str.modality(99)});
next();
}, response('modality'));
superiorEducationConclusionTaxApp.get('/modality_shift', (req, res, next) => {
req.result = []
for (let i = 1; i < 8; i++) {
req.result.push({
id: i, name: id2str.modalityShift(i)
});
}
req.result.push({id: 9, name: id2str.modalityShift(9)});
req.result.push({id: 99, name: id2str.modalityShift(99)});
next();
}, response('modality_shift'));
superiorEducationConclusionTaxApp.get('/state', (req, res, next) => {
req.result = []
for (let i = 11; i < 54; i++) {
if (id2str.stateName(i) !== 'Não declarada') {
req.result.push({
id: i, name: id2str.stateName(i)
});
}
}
req.result.push({id: 99, name: id2str.stateName(99)});
next();
}, response('state'));
superiorEducationConclusionTaxApp.get('/age_range', (req, res, next) => {
req.result = []
for (let i = 1; i < 12; i++) {
req.result.push({
id: i, name: id2str.ageRangeAll(i)
});
}
next();
}, response('age_range'));
superiorEducationConclusionTaxApp.get('/location', (req, res, next) => {
req.result = []
for (let i = 1; i <= 2; i++) {
req.result.push({
id: i, name: id2str.location(i)
});
}
next();
}, response('location'));
rqf.addField({
name: 'filter',
field: false,
where: true
}).addField({
name: 'dims',
field: true,
where: false
}).addValue({
name: 'id',
table: 'pnad_novo',
tableField: 'id',
where: {
relation: '=',
type: 'integer',
field: 'id'
}
}).addValue({
name: 'state',
table: 'estado',
tableField: ['id', 'nome'],
resultField: ['state_id', 'state_nome'],
where: {
relation: '=',
type: 'integer',
field: 'id',
},
join: {
primary: 'id',
foreign: 'cod_uf',
foreignTable: 'pnad_novo'
}
}).addValue({
name: 'state_not',
table: 'estado',
tableField: ['nome', 'id'],
resultField: ['state_name', 'state_id'],
where: {
relation: '<>',
type: 'integer',
field: 'cod_uf',
table: 'pnad_novo'
},
join: {
primary: 'id',
foreign: 'cod_uf',
foreignTable: 'pnad_novo'
}
}).addValue({
name: 'years_of_study',
table: 'pnad_novo',
tableField: 'anos_de_estudo',
resultField: 'years_of_study_id',
where: {
relation: '=',
type: 'integer',
field: 'anos_de_estudo'
}
}).addValue({
name: 'instruction_level',
table: 'pnad_novo',
tableField: 'nivel_de_instrucao',
resultField: 'instruction_level_id',
where: {
relation: '=',
type: 'integer',
field: 'nivel_de_instrucao'
}
}).addValue({
name: 'new_pnad_adm_dependency',
table: 'pnad_novo',
tableField: 'dependencia_adm',
resultField: 'new_pnad_adm_dependency_id',
where: {
relation: '=',
type: 'integer',
field: 'dependencia_adm'
}
}).addValue({
name: 'attends_school',
table: 'pnad_novo',
tableField: 'frequenta_escola',
resultField: 'attends_school_id',
where: {
relation: '=',
type: 'integer',
field: 'frequenta_escola'
}
}).addValue({
name: 'modality',
table: 'pnad_novo',
tableField: 'modalidade',
resultField: 'modality_id',
where: {
relation: '=',
type: 'integer',
field: 'modalidade'
}
}).addValue({
name: 'attended_modality',
table: 'pnad_novo',
tableField: 'nivel_etapa_modalidade_freq',
resultField: 'attended_modality_id',
where: {
relation: '=',
type: 'integer',
field: 'nivel_etapa_modalidade_freq'
}
}).addValue({
name: 'illiteracy',
table: 'pnad_novo',
tableField: 'analfabetismo',
resultField: 'illiteracy_id',
where: {
relation: '=',
type: 'integer',
field: 'analfabetismo'
}
}).addValue({
name: 'modality_shift',
table: 'pnad_novo',
tableField: 'turno_nivel_etapa',
resultField: 'modality_shift_id',
where: {
relation: '=',
type: 'integer',
field: 'turno_nivel_etapa'
}
}).addValue({
name: 'bolsa_familia',
table: 'pnad_novo',
tableField: 'recebeu_rendimentos_de_programa_bolsa_familia',
resultField: 'bolsa_familia_id',
where: {
relation: '=',
type: 'integer',
field: 'recebeu_rendimentos_de_programa_bolsa_familia'
}
}).addValue({
name: 'new_pnad_ethnic_group',
table: 'pnad_novo',
tableField: 'cor_raca',
resultField: 'new_pnad_ethnic_group_id',
where: {
relation: '=',
type: 'integer',
field: 'cor_raca'
}
}).addValue({
name: 'age_range_all',
table: 'pnad_novo',
tableField: 'faixa_etaria',
resultField: 'age_range_all_id',
where: {
relation: '=',
type: 'integer',
field: 'faixa_etaria'
}
}).addValue({
name: 'income_range',
table: 'pnad_novo',
tableField: 'faixa_rendimento_aux_tx',
resultField: 'income_range_id',
where: {
relation: '=',
type: 'integer',
field: 'faixa_rendimento_aux_tx'
}
}).addValue({
name: 'gender',
table: 'pnad_novo',
tableField: 'sexo',
resultField: 'gender_id',
where: {
relation: '=',
type: 'integer',
field: 'sexo'
}
}).addValue({
name: 'cap_code',
table: 'pnad_novo',
tableField: 'cod_cap',
resultField: 'cap_code_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_cap'
}
}).addValue({
name: 'region',
table: 'pnad_novo',
tableField: 'cod_regiao',
resultField: 'region_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_regiao'
}
}).addValue({
name: 'metro_code',
table: 'pnad_novo',
tableField: 'cod_rm_ride',
resultField: 'metro_code_id',
where: {
relation: '=',
type: 'integer',
field: 'cod_rm_ride'
}
}).addValue({
name: 'location',
table: 'pnad_novo',
tableField: 'situacao_domicilio',
resultField: 'location_id',
where: {
relation: '=',
type: 'integer',
field: 'situacao_domicilio'
}
}).addValue({
name: 'min_year',
table: 'pnad_novo',
tableField: 'ano_ref',
resultField: 'year',
where: {
relation: '>=',
type: 'integer',
field: 'ano_ref'
}
}).addValue({
name: 'max_year',
table: 'pnad_novo',
tableField: '',
resultField: 'year',
where: {
relation: '<=',
type: 'integer',
field: 'ano_ref'
}
}).addField({
name: 'search',
field: false,
where: true
}).addValueToField({
name: 'name',
table: 'pnad_novo',
tableField: 'nome',
where: {
relation: 'LIKE',
type: 'string',
field: 'nome'
}
}, 'search').addValue({
name: 'mesoregion',
table: 'pnad_novo',
tableField: 'mesorregiao_id',
where: {
relation: '=',
type: 'integer',
field: 'mesorregiao_id'
}
}).addValue({
name: 'microregion',
table: 'pnad_novo',
tableField: 'microrregiao_id',
where: {
relation: '=',
type: 'integer',
field: 'microrregiao_id'
}
});
function matchQueries(queryPartial, queryTotal) {
let match = [];
queryTotal.forEach((result) => {
let newObj = {};
let keys = Object.keys(result);
keys.forEach((key) => {
newObj[key] = result[key];
});
let index = keys.indexOf('total');
if(index > -1) keys.splice(index, 1);
let objMatch = null;
for(let i = 0; i < queryPartial.length; ++i) {
let partial = queryPartial[i];
let foundMatch = true;
for(let j = 0; j < keys.length; ++j) {
let key = keys[j];
if(partial[key] !== result[key]) {
foundMatch = false;
break;
}
}
if(foundMatch) {
objMatch = partial;
break;
}
}
if(objMatch) {
newObj.denominator = result.total;
newObj.partial = objMatch.total;
newObj.total = (objMatch.total / result.total) * 100;
match.push(newObj);
}
});
return match;
}
superiorEducationConclusionTaxApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
req.querySet = [];
// Subquery para total_pop_maior_25 com filtros dinâmicos
let totalPopMaior25ComSuperiorCompleto = req.sql.clone();
totalPopMaior25ComSuperiorCompleto.from("pnad_novo")
.field("ano_ref", "year")
.field("SUM(peso_domicilio_pessoas_com_cal)", "total")
.where("idade_morador_31_03 >= 25")
.where("nivel_de_instruc_mais_elevad_para_o_fundam_com_duracao_9_anos = 7")
.where("ano_ref >= 2019")
.group("ano_ref")
.order("ano_ref");
// Subquery para total_pop_maior_25 com filtros dinâmicos
let totalPopMaior25 = req.sql.clone();
totalPopMaior25.from("pnad_novo")
.field("ano_ref", "year")
.field("SUM(peso_domicilio_pessoas_com_cal)", "total")
.where("idade_morador_31_03 >= 25")
.where("ano_ref >= 2019")
.group("ano_ref")
.order("ano_ref");
// if (req.query.dims && req.query.dims.includes("income_range")) {
// totalPopMaior19.where("faixa_rendimento_aux_tx is not null");
// totalPopEdBasMaior19.where("faixa_rendimento_aux_tx is not null");
// }
req.querySet.push(totalPopMaior25ComSuperiorCompleto);
req.querySet.push(totalPopMaior25);
next();
}, multiQuery, (req, res, next) => {
// The multiple requests are made. Then we need to calculate the percetange. So the function
// below is used
let newObj = matchQueries(req.result[0], req.result[1]);
req.result = newObj;
next();
}, id2str.transform(false), response('superiorEducationConclusionTax'));
module.exports = superiorEducationConclusionTaxApp;