From 2b0f7d7a4d5afd5a2133f48fbbc1f6db95c5e8f7 Mon Sep 17 00:00:00 2001 From: fgs21 <fgs21@inf.ufpr.br> Date: Mon, 30 Sep 2024 10:46:04 -0300 Subject: [PATCH 01/11] [FIX] Fixing filter tp_org_acad --- src/libs/routes_v1/courseAggregate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/routes_v1/courseAggregate.js b/src/libs/routes_v1/courseAggregate.js index 01773c05..fdc6bd88 100644 --- a/src/libs/routes_v1/courseAggregate.js +++ b/src/libs/routes_v1/courseAggregate.js @@ -253,7 +253,7 @@ rqf.addField({ where: { relation: '=', type: 'integer', - field: 'tp_org_aca' + field: 'tp_org_acad' } }).addValue({ name: 'academic_level', -- GitLab From 94da1d736aa568654e091b04787952abc7573e2c Mon Sep 17 00:00:00 2001 From: fgs21 <fgs21@inf.ufpr.br> Date: Tue, 8 Oct 2024 11:38:08 -0300 Subject: [PATCH 02/11] [ADD] Trying to search for university in courseAggregate --- src/libs/routes_v1/courseAggregate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/routes_v1/courseAggregate.js b/src/libs/routes_v1/courseAggregate.js index fdc6bd88..4fde328f 100644 --- a/src/libs/routes_v1/courseAggregate.js +++ b/src/libs/routes_v1/courseAggregate.js @@ -316,7 +316,7 @@ rqf.addField({ field: 'cod_cine_area_detalhada' } }).addValue({ - name: 'university', + name: 'universityLocalOffer', table: 'ies_ens_superior', tableField: ['cod_ies', 'nome_ies'], resultField: ['university_id', 'university_name'], -- GitLab From 87e65daa8fe9b31bc0254687bb848d9586667cff Mon Sep 17 00:00:00 2001 From: fgs21 <fgs21@inf.ufpr.br> Date: Wed, 9 Oct 2024 09:44:11 -0300 Subject: [PATCH 03/11] [ADD] Creating new route to list all the universities above 2020 --- src/libs/routes_v1/api.js | 3 + src/libs/routes_v1/uniLocalOfferAggregate.js | 89 ++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 src/libs/routes_v1/uniLocalOfferAggregate.js diff --git a/src/libs/routes_v1/api.js b/src/libs/routes_v1/api.js index 1abfe6f0..bffc8b5d 100644 --- a/src/libs/routes_v1/api.js +++ b/src/libs/routes_v1/api.js @@ -155,6 +155,8 @@ const federativeEntity = require(`${libs}/routes_v1/federativeEntity`); const email = require(`${libs}/routes_v1/email`); +const uniLocalOfferAggregate = require(`${libs}/routes_v1/uniLocalOfferAggregate`) + api.get('/', (req, res) => { res.json({ msg: 'SimCAQ API v1 is running' }); }); @@ -220,6 +222,7 @@ api.use('/enrollmentAggregate', enrollmentAggregate); api.use('/employeesAggregate', employeesAggregate); api.use('/course_aggregate', courseAggregate); api.use('/federativeEntity', federativeEntity); +api.use('/uni_offer_aggregate', uniLocalOfferAggregate); //Publication diff --git a/src/libs/routes_v1/uniLocalOfferAggregate.js b/src/libs/routes_v1/uniLocalOfferAggregate.js new file mode 100644 index 00000000..bed9d5b0 --- /dev/null +++ b/src/libs/routes_v1/uniLocalOfferAggregate.js @@ -0,0 +1,89 @@ +/* +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 uniLocalOfferAggregateApp = express.Router(); + +const libs = `${process.cwd()}/libs`; + +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(); + +uniLocalOfferAggregateApp.use(cache('15 day')); + +rqf.addField({ + name: 'filter', + field: false, + where: true +}).addField({ + name: 'dims', + field: true, + where: false +}).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: 'curso_superior_agregado' + } +}).addValue({ + name: 'city', + table: 'municipio', + tableField: ['id', 'nome'], + resultField: ['city_id', 'city_name'], + where: { + relation: '=', + type: 'integer', + field: 'id', + table: 'municipio' + }, + join: { + primary: 'id', + foreign: 'cod_mun', + foreignTable: 'curso_superior_agregado' + } +}); + + +uniLocalOfferAggregateApp.get('/', (req, res, next) => { + req.sql.from('curso_superior_agregado') + .field('DISTINCT curso_superior_agregado.cod_ies', 'cod') + .field('ies_ens_superior.nome_ies', 'nome') + .join('ies_ens_superior', null, 'curso_superior_agregado.cod_ies = ies_ens_superior.cod_ies and curso_superior_agregado.ano_censo = ies_ens_superior.ano_censo') + next(); +}, query, response('uni_offer_aggregate')); \ No newline at end of file -- GitLab From ef7e957c3587f170bf9496bc63446b4e837bf60d Mon Sep 17 00:00:00 2001 From: fgs21 <fgs21@inf.ufpr.br> Date: Wed, 9 Oct 2024 10:02:11 -0300 Subject: [PATCH 04/11] [ADD] Adding module.export to new route file --- src/libs/routes_v1/uniLocalOfferAggregate.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libs/routes_v1/uniLocalOfferAggregate.js b/src/libs/routes_v1/uniLocalOfferAggregate.js index bed9d5b0..184bc60d 100644 --- a/src/libs/routes_v1/uniLocalOfferAggregate.js +++ b/src/libs/routes_v1/uniLocalOfferAggregate.js @@ -79,11 +79,12 @@ rqf.addField({ } }); - uniLocalOfferAggregateApp.get('/', (req, res, next) => { req.sql.from('curso_superior_agregado') .field('DISTINCT curso_superior_agregado.cod_ies', 'cod') .field('ies_ens_superior.nome_ies', 'nome') .join('ies_ens_superior', null, 'curso_superior_agregado.cod_ies = ies_ens_superior.cod_ies and curso_superior_agregado.ano_censo = ies_ens_superior.ano_censo') next(); -}, query, response('uni_offer_aggregate')); \ No newline at end of file +}, query, response('uni_offer_aggregate')); + +module.exports = uniLocalOfferAggregateApp; \ No newline at end of file -- GitLab From cee0eee2ecda809fec64d0ff53d98d5b41168ed3 Mon Sep 17 00:00:00 2001 From: fgs21 <fgs21@inf.ufpr.br> Date: Wed, 9 Oct 2024 10:59:32 -0300 Subject: [PATCH 05/11] [ADD] Adding rqf builders to the route, where it can build the query with filters/dims --- src/libs/routes_v1/uniLocalOfferAggregate.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/routes_v1/uniLocalOfferAggregate.js b/src/libs/routes_v1/uniLocalOfferAggregate.js index 184bc60d..28f6abdf 100644 --- a/src/libs/routes_v1/uniLocalOfferAggregate.js +++ b/src/libs/routes_v1/uniLocalOfferAggregate.js @@ -79,11 +79,12 @@ rqf.addField({ } }); -uniLocalOfferAggregateApp.get('/', (req, res, next) => { +uniLocalOfferAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { req.sql.from('curso_superior_agregado') .field('DISTINCT curso_superior_agregado.cod_ies', 'cod') .field('ies_ens_superior.nome_ies', 'nome') .join('ies_ens_superior', null, 'curso_superior_agregado.cod_ies = ies_ens_superior.cod_ies and curso_superior_agregado.ano_censo = ies_ens_superior.ano_censo') + .order('curso_superior_agregado.cod_ies') next(); }, query, response('uni_offer_aggregate')); -- GitLab From bf7a6dacc8ef53beee68097bb935f0ff1c7f1a6f Mon Sep 17 00:00:00 2001 From: fgs21 <fgs21@inf.ufpr.br> Date: Wed, 9 Oct 2024 11:34:03 -0300 Subject: [PATCH 06/11] [ADD] Changing route return names --- src/libs/routes_v1/uniLocalOfferAggregate.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/routes_v1/uniLocalOfferAggregate.js b/src/libs/routes_v1/uniLocalOfferAggregate.js index 28f6abdf..ab50ef37 100644 --- a/src/libs/routes_v1/uniLocalOfferAggregate.js +++ b/src/libs/routes_v1/uniLocalOfferAggregate.js @@ -81,8 +81,8 @@ rqf.addField({ uniLocalOfferAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { req.sql.from('curso_superior_agregado') - .field('DISTINCT curso_superior_agregado.cod_ies', 'cod') - .field('ies_ens_superior.nome_ies', 'nome') + .field('DISTINCT curso_superior_agregado.cod_ies', 'id') + .field('ies_ens_superior.nome_ies', 'name') .join('ies_ens_superior', null, 'curso_superior_agregado.cod_ies = ies_ens_superior.cod_ies and curso_superior_agregado.ano_censo = ies_ens_superior.ano_censo') .order('curso_superior_agregado.cod_ies') next(); -- GitLab From e450bde4bff13edf286568c46f8a6e11860eaeb7 Mon Sep 17 00:00:00 2001 From: fgs21 <fgs21@inf.ufpr.br> Date: Wed, 9 Oct 2024 11:55:54 -0300 Subject: [PATCH 07/11] [ADD] Adding new filters and new fields to query --- src/libs/routes_v1/uniLocalOfferAggregate.js | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/libs/routes_v1/uniLocalOfferAggregate.js b/src/libs/routes_v1/uniLocalOfferAggregate.js index ab50ef37..f50afff1 100644 --- a/src/libs/routes_v1/uniLocalOfferAggregate.js +++ b/src/libs/routes_v1/uniLocalOfferAggregate.js @@ -46,6 +46,36 @@ rqf.addField({ name: 'dims', field: true, where: false +}).addValue({ + name: 'min_year', + table: 'curso_superior_agregado', + tableField: 'ano_censo', + resultField: 'year', + where: { + relation: '>=', + type: 'integer', + field: 'ano_censo' + } +}).addValue({ + name: 'max_year', + table: 'curso_superior_agregado', + tableField: '', + resultField: 'year', + where: { + relation: '<=', + type: 'integer', + field: 'ano_censo' + } +}).addValue({ + name: 'region', + table: 'curso_superior_agregado', + tableField: 'cod_reg', + resultField: 'region_id', + where: { + relation: '=', + type: 'integer', + field: 'cod_reg' + } }).addValue({ name: 'state', table: 'estado', @@ -83,6 +113,9 @@ uniLocalOfferAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => req.sql.from('curso_superior_agregado') .field('DISTINCT curso_superior_agregado.cod_ies', 'id') .field('ies_ens_superior.nome_ies', 'name') + .field('curso_superior_agregado.cod_mun', 'city_id') + .field('curso_superior_agregado.cod_uf', 'state_id') + .field('curso_superior_agregado.cod_reg', 'region_id') .join('ies_ens_superior', null, 'curso_superior_agregado.cod_ies = ies_ens_superior.cod_ies and curso_superior_agregado.ano_censo = ies_ens_superior.ano_censo') .order('curso_superior_agregado.cod_ies') next(); -- GitLab From 5b1b6c62867727ed78836b94b4f7fbc738d28e0e Mon Sep 17 00:00:00 2001 From: fgs21 <fgs21@inf.ufpr.br> Date: Wed, 9 Oct 2024 13:20:19 -0300 Subject: [PATCH 08/11] [FIX] Changing 'universityLocalOffer' filter to 'uni_offer_aggregate' in courseAggregate route --- src/libs/routes_v1/courseAggregate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/routes_v1/courseAggregate.js b/src/libs/routes_v1/courseAggregate.js index 4fde328f..78ae89a7 100644 --- a/src/libs/routes_v1/courseAggregate.js +++ b/src/libs/routes_v1/courseAggregate.js @@ -316,7 +316,7 @@ rqf.addField({ field: 'cod_cine_area_detalhada' } }).addValue({ - name: 'universityLocalOffer', + name: 'uni_offer_aggregate', table: 'ies_ens_superior', tableField: ['cod_ies', 'nome_ies'], resultField: ['university_id', 'university_name'], -- GitLab From 8e60594c2691496be1557d8a43a4a7b9a469eed0 Mon Sep 17 00:00:00 2001 From: Lewis <lgtg20@inf.ufpr.br> Date: Fri, 11 Oct 2024 12:04:50 -0300 Subject: [PATCH 09/11] Fix issues 906, 909, 910 --- src/libs/convert/educationLevelBasic.js | 6 +- src/libs/convert/totalDoc.js | 23 ++++++++ src/libs/middlewares/aggregateData.js | 6 +- src/libs/middlewares/id2str.js | 7 ++- src/libs/routes_v1/employeesAggregate.js | 8 +++ src/libs/routes_v1/enrollmentAggregate.js | 27 ++++++--- src/libs/routes_v1/federativeEntity.js | 70 +++++++++++++++++------ 7 files changed, 114 insertions(+), 33 deletions(-) create mode 100644 src/libs/convert/totalDoc.js diff --git a/src/libs/convert/educationLevelBasic.js b/src/libs/convert/educationLevelBasic.js index 3d166fe5..7c242b07 100644 --- a/src/libs/convert/educationLevelBasic.js +++ b/src/libs/convert/educationLevelBasic.js @@ -24,11 +24,11 @@ module.exports = function educationLevelBasic(id) { return 'Creche'; case 2: return 'Pré-Escola'; - case 4: + case 3: return 'Ensino Fundamental - anos iniciais'; - case 5: + case 4: return 'Ensino Fundamental - anos finais'; - case 6: + case 5: return 'Ensino Médio'; default: return 'Não classificada'; diff --git a/src/libs/convert/totalDoc.js b/src/libs/convert/totalDoc.js new file mode 100644 index 00000000..09f947c8 --- /dev/null +++ b/src/libs/convert/totalDoc.js @@ -0,0 +1,23 @@ +/* +Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR + +This file is part of simcaq-node. + +simcaq-node is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +simcaq-node is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with simcaq-node. If not, see <https://www.gnu.org/licenses/>. +*/ + +module.exports = function totalDoc(id) { + return ''; +}; diff --git a/src/libs/middlewares/aggregateData.js b/src/libs/middlewares/aggregateData.js index aaa1ede4..b9b14eee 100644 --- a/src/libs/middlewares/aggregateData.js +++ b/src/libs/middlewares/aggregateData.js @@ -32,7 +32,8 @@ const convert = { gender_entity: 'gender', age_range_entity: 'ageRangeEntity', post_graduation_entity: 'postGraduationEntity', - contract_type_entity: 'contractType' + contract_type_entity: 'contractType', + total_doc: "totalDoc" } function aggregateData(req, res, next) { @@ -58,7 +59,8 @@ function aggregateData(req, res, next) { 'gender_entity', 'age_range_entity', 'post_graduation_entity', - 'contract_type_entity' + 'contract_type_entity', + 'total_doc' ] let id; const fields = req.query.dims.split(','); diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js index 078df393..a53196e2 100644 --- a/src/libs/middlewares/id2str.js +++ b/src/libs/middlewares/id2str.js @@ -124,6 +124,7 @@ const educationLevelModEntitySeg = require(`${libs}/convert/educationLevelModEnt const educationLevelModEntityAgg = require(`${libs}/convert/educationLevelModEntityAgg`); const ageRangeEntity = require(`${libs}/convert/ageRangeEntity`); const postGraduationEntity = require(`${libs}/convert/postGraduationEntity`); +const totalDoc = require(`${libs}/convert/totalDoc`); const ids = { gender_id: gender, @@ -240,7 +241,8 @@ const ids = { education_level_mod_entity_agg: educationLevelModEntityAgg, age_range_entity: ageRangeEntity, post_graduation_entity: postGraduationEntity, - special_education_entity: specialEducationEntity + special_education_entity: specialEducationEntity, + total_doc: totalDoc }; function transform(removeId=false) { @@ -379,5 +381,6 @@ module.exports = { educationLevelModEntityAgg, ageRangeEntity, postGraduationEntity, - specialEducationEntity + specialEducationEntity, + totalDoc }; diff --git a/src/libs/routes_v1/employeesAggregate.js b/src/libs/routes_v1/employeesAggregate.js index ab5102ce..9fc52918 100644 --- a/src/libs/routes_v1/employeesAggregate.js +++ b/src/libs/routes_v1/employeesAggregate.js @@ -302,6 +302,14 @@ employeesAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .order('escola.ano_censo') .where('escola.situacao_funcionamento_pareada = 1 and (escola.ensino_regular = 1 or escola.ensino_eja = 1 or escola.educacao_profissional = 1)'); } + else if (req.query.dims && req.query.dims.includes('total_doc')) { + req.sql.from('escola') + .field('SUM(escola.qt_doc_bas)', 'total_doc_bas') + .field('escola.ano_censo', 'year') + .group('escola.ano_censo') + .order('escola.ano_censo') + .where('escola.situacao_funcionamento_pareada = 1 and (escola.ensino_regular = 1 or escola.ensino_eja = 1 or escola.educacao_profissional = 1)'); + } else { req.sql.from('escola') .field('SUM(escola.qt_doc_bas)', 'total') diff --git a/src/libs/routes_v1/enrollmentAggregate.js b/src/libs/routes_v1/enrollmentAggregate.js index 08d55ddb..b44bb70a 100644 --- a/src/libs/routes_v1/enrollmentAggregate.js +++ b/src/libs/routes_v1/enrollmentAggregate.js @@ -70,7 +70,7 @@ enrollmentAggregateApp.get('/adm_dependency', (req, res, next) => { enrollmentAggregateApp.get('/adm_dependency_detailed', (req, res, next) => { req.result = [] - for (let i = 1; i <= 9; i++) { + for (let i = 1; i <= 8; i++) { req.result.push({ id: i, name: id2str.admDependencyPriv(i) }); @@ -481,9 +481,10 @@ rqf.addField({ tableField: 'localizacao_diferenciada_par', resultField: 'diff_location_id', where: { - relation: '=', + relation: 'is not null', type: 'integer', - field: 'localizacao_diferenciada_par' + field: 'localizacao_diferenciada_par', + value: 'null' } }); @@ -499,7 +500,8 @@ enrollmentAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('SUM(escola.qt_mat_bas_fem)', 'total_fem') .field('escola.ano_censo', 'year') .group('escola.ano_censo') - .order('escola.ano_censo'); + .order('escola.ano_censo') + .where('escola.localizacao_diferenciada_par is not null'); } else if (req.query.dims && req.query.dims.includes('age_range')) { req.sql.from('escola') @@ -511,7 +513,8 @@ enrollmentAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('SUM(escola.qt_mat_bas_18_mais)', 'total_18_mais') .field('escola.ano_censo', 'year') .group('escola.ano_censo') - .order('escola.ano_censo'); + .order('escola.ano_censo') + .where('escola.localizacao_diferenciada_par is not null') } else if (req.query.dims && req.query.dims.includes('ethnic_group')) { req.sql.from('escola') @@ -523,7 +526,8 @@ enrollmentAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('SUM(escola.qt_mat_bas_indigena)', 'total_indigena') .field('escola.ano_censo', 'year') .group('escola.ano_censo') - .order('escola.ano_censo'); + .order('escola.ano_censo') + .where('escola.localizacao_diferenciada_par is not null') } else if (req.query.dims && req.query.dims.includes('education_level_mod_agg')) { req.sql.from('escola') @@ -539,7 +543,9 @@ enrollmentAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('SUM(escola.qt_mat_prof_agg)', 'total_prof') .field('escola.ano_censo', 'year') .group('escola.ano_censo') - .order('escola.ano_censo'); + .order('escola.ano_censo') + .where('escola.localizacao_diferenciada_par is not null'); + } else if (req.query.dims && req.query.dims.includes('integral_time_agg')) { req.sql.from('turma,escola') @@ -549,7 +555,7 @@ enrollmentAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('escola.ano_censo', 'year') .group('escola.ano_censo') .order('escola.ano_censo') - .where('turma.tipo_atendimento_id <= 2 and turma.escola_id = escola.id and turma.ano_censo = escola.ano_censo'); + .where('turma.tipo_atendimento_id <= 2 and turma.escola_id = escola.id and turma.ano_censo = escola.ano_censo and escola.localizacao_diferenciada_par is not null'); } else if (req.query.dims && req.query.dims.includes('period_agg')) { req.sql.from('turma,escola') @@ -561,7 +567,7 @@ enrollmentAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('escola.ano_censo', 'year') .group('escola.ano_censo') .order('escola.ano_censo') - .where('turma.tipo_atendimento_id <= 2 and turma.escola_id = escola.id and turma.ano_censo = escola.ano_censo'); + .where('turma.tipo_atendimento_id <= 2 and turma.escola_id = escola.id and turma.ano_censo = escola.ano_censo and escola.localizacao_diferenciada_par is not null'); } else if (req.query.dims && req.query.dims.includes('modality_integral_time')) { req.sql.from('escola') @@ -573,6 +579,7 @@ enrollmentAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('escola.ano_censo', 'year') .group('escola.ano_censo') .order('escola.ano_censo') + .where('escola.localizacao_diferenciada_par is not null'); } else if (req.query.dims && req.query.dims.includes('special_education')) { req.sql.from('escola') @@ -581,6 +588,7 @@ enrollmentAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('escola.ano_censo', 'year') .group('escola.ano_censo') .order('escola.ano_censo') + .where('escola.localizacao_diferenciada_par is not null'); } else { req.sql.from('escola') @@ -588,6 +596,7 @@ enrollmentAggregateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('escola.ano_censo', 'year') .group('escola.ano_censo') .order('escola.ano_censo') + .where('escola.localizacao_diferenciada_par is not null'); } next(); }, query, aggregateData, id2str.transform(false), response('enrollment_aggregate')); diff --git a/src/libs/routes_v1/federativeEntity.js b/src/libs/routes_v1/federativeEntity.js index 0b0c2b5c..40668f76 100644 --- a/src/libs/routes_v1/federativeEntity.js +++ b/src/libs/routes_v1/federativeEntity.js @@ -342,8 +342,8 @@ rqf.addField({ }, join: { primary: 'id', - foreign: 'municipio_id', - foreignTable: 'escola' + foreign: 'cod_mun', + foreignTable: 'docentes_sinopse' } }, 'dims').addValueToField({ name: 'city', @@ -357,8 +357,8 @@ rqf.addField({ }, join: { primary: 'id', - foreign: 'municipio_id', - foreignTable: 'escola' + foreign: 'cod_mun', + foreignTable: 'docentes_sinopse' } }, 'filter').addValueToField({ name: 'school', @@ -428,6 +428,42 @@ rqf.addField({ }); federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { + let whereRule = ''; + const filtersObject = {} + + req.query.filter.split(',').forEach((filter) => { + let [key, value] = filter.split(':'); + filtersObject[key] = Number(JSON.parse(value)); + }) + + if (req.query.filter && req.query.filter.includes('city')) { + whereRule = 'docentes_sinopse.cod_mun = ' + filtersObject.city; + } + else if (req.query.filter && req.query.filter.includes('state')) { + whereRule = 'docentes_sinopse.cod_uf = ' + filtersObject.state + + ((req.query.dims && req.query.dims.includes('city')) ? '' : ' AND docentes_sinopse.cod_mun = 0'); + } + else if (req.query.filter && req.query.filter.includes('region')) { + whereRule = 'docentes_sinopse.cod_reg = ' + filtersObject.region + + ((req.query.dims !== undefined && req.query.dims.includes('state')) + ? ' AND docentes_sinopse.cod_mun = 0' + : (req.query.dims !== undefined && req.query.dims.includes('city')) + ? '' + : ' AND docentes_sinopse.cod_uf = 0'); + + } + else { + whereRule = (req.query.dims && req.query.dims.includes('region')) + ? 'docentes_sinopse.cod_uf = 0' + : (req.query.dims && req.query.dims.includes('state')) + ? 'docentes_sinopse.cod_mun = 0' + : (req.query.dims && req.query.dims.includes('city')) + ? '' + : 'docentes_sinopse.cod_reg = 0' + + } + + console.log(whereRule); if (req.query.dims && req.query.dims.includes('education_level_mod_entity_seg')) { @@ -442,7 +478,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if (req.query.dims && req.query.dims.includes('education_level_mod_entity_agg')) { @@ -465,7 +501,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if (req.query.dims && req.query.dims.includes('special_education_entity')) { @@ -475,7 +511,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if (req.query.dims && req.query.dims.includes('adm_dependency_entity_agg')) { @@ -485,7 +521,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if (req.query.dims && req.query.dims.includes('adm_dependency_entity')) { @@ -497,7 +533,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if (req.query.dims && req.query.dims.includes('location_entity')) { @@ -507,7 +543,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if (req.query.dims && req.query.dims.includes('gender_entity')) { @@ -517,7 +553,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if (req.query.dims && req.query.dims.includes('age_range_entity')) { @@ -532,7 +568,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if (req.query.dims && req.query.dims.includes('post_graduation_entity')) { @@ -543,7 +579,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if (req.query.dims && req.query.dims.includes('contract_type_entity')) { @@ -555,7 +591,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } else if ((req.query.dims && req.query.dims.includes('state')) || (req.query.filter && req.query.filter.includes('state'))) { req.sql.from('docentes_sinopse') @@ -563,7 +599,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_mun = 0'); + .where(whereRule); } else if ((req.query.dims && req.query.dims.includes('region')) || (req.query.filter && req.query.filter.includes('region'))) { req.sql.from('docentes_sinopse') @@ -571,7 +607,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_uf = 0'); + .where(whereRule); } else { req.sql.from('docentes_sinopse') @@ -579,7 +615,7 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .field('docentes_sinopse.ano_censo', 'year') .group('docentes_sinopse.ano_censo') .order('docentes_sinopse.ano_censo') - .where('docentes_sinopse.cod_reg = 0'); + .where(whereRule); } next(); }, query, aggregateData, id2str.transform(false), response('federative_entity')); -- GitLab From 32fb486f6e0363d349719e7e8af0e7f5d5a00b1e Mon Sep 17 00:00:00 2001 From: Lewis <lgtg20@inf.ufpr.br> Date: Mon, 14 Oct 2024 12:02:06 -0300 Subject: [PATCH 10/11] Refactor education degree entity conversion functions --- src/libs/convert/educationDegreeEntity.js | 32 +++++++++++++++++++++++ src/libs/middlewares/aggregateData.js | 6 +++-- src/libs/middlewares/id2str.js | 7 +++-- src/libs/routes_v1/enrollmentAggregate.js | 24 +++++++++++++++++ src/libs/routes_v1/federativeEntity.js | 23 ++++++++++++++++ 5 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/libs/convert/educationDegreeEntity.js diff --git a/src/libs/convert/educationDegreeEntity.js b/src/libs/convert/educationDegreeEntity.js new file mode 100644 index 00000000..e16ba13f --- /dev/null +++ b/src/libs/convert/educationDegreeEntity.js @@ -0,0 +1,32 @@ +/* +Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR + +This file is part of simcaq-node. + +simcaq-node is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +simcaq-node is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with simcaq-node. If not, see <https://www.gnu.org/licenses/>. +*/ + +module.exports = function educationDegreeEntity(id) { + switch (id) { + case 1: + return 'Ensino Fundamental'; + case 2: + return 'Ensino Médio'; + case 3: + return 'Graduação Com Licenciatura'; + case 4: + return 'Graduação Sem Licenciatura'; + } +}; diff --git a/src/libs/middlewares/aggregateData.js b/src/libs/middlewares/aggregateData.js index b9b14eee..864c2f54 100644 --- a/src/libs/middlewares/aggregateData.js +++ b/src/libs/middlewares/aggregateData.js @@ -33,7 +33,8 @@ const convert = { age_range_entity: 'ageRangeEntity', post_graduation_entity: 'postGraduationEntity', contract_type_entity: 'contractType', - total_doc: "totalDoc" + total_doc: "totalDoc", + education_degree_entity: "educationDegreeEntity" } function aggregateData(req, res, next) { @@ -60,7 +61,8 @@ function aggregateData(req, res, next) { 'age_range_entity', 'post_graduation_entity', 'contract_type_entity', - 'total_doc' + 'total_doc', + 'education_degree_entity' ] let id; const fields = req.query.dims.split(','); diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js index a53196e2..f366d90a 100644 --- a/src/libs/middlewares/id2str.js +++ b/src/libs/middlewares/id2str.js @@ -125,6 +125,7 @@ const educationLevelModEntityAgg = require(`${libs}/convert/educationLevelModEnt const ageRangeEntity = require(`${libs}/convert/ageRangeEntity`); const postGraduationEntity = require(`${libs}/convert/postGraduationEntity`); const totalDoc = require(`${libs}/convert/totalDoc`); +const educationDegreeEntity = require(`${libs}/convert/educationDegreeEntity`); const ids = { gender_id: gender, @@ -242,7 +243,8 @@ const ids = { age_range_entity: ageRangeEntity, post_graduation_entity: postGraduationEntity, special_education_entity: specialEducationEntity, - total_doc: totalDoc + total_doc: totalDoc, + education_degree_entity: educationDegreeEntity }; function transform(removeId=false) { @@ -382,5 +384,6 @@ module.exports = { ageRangeEntity, postGraduationEntity, specialEducationEntity, - totalDoc + totalDoc, + educationDegreeEntity }; diff --git a/src/libs/routes_v1/enrollmentAggregate.js b/src/libs/routes_v1/enrollmentAggregate.js index b44bb70a..034aae7f 100644 --- a/src/libs/routes_v1/enrollmentAggregate.js +++ b/src/libs/routes_v1/enrollmentAggregate.js @@ -78,6 +78,20 @@ enrollmentAggregateApp.get('/adm_dependency_detailed', (req, res, next) => { next(); }, response('adm_dependency_detailed')); +enrollmentAggregateApp.get('/government_agreement', cache('15 day'), (req, res, next) => { + req.result = [{ + id: "null", + name: id2str.governmentAgreement("null") + }]; + for(let i = 1; i <= 6; ++i) { + req.result.push({ + id: i, + name: id2str.governmentAgreement(i) + }); + }; + next(); +}, response('government_agreement')); + enrollmentAggregateApp.get('/education_level_mod_agg', (req, res, next) => { req.result = [] @@ -486,6 +500,16 @@ rqf.addField({ field: 'localizacao_diferenciada_par', value: 'null' } +}).addValue({ + name: 'government_agreement', + table: 'escola', + tableField: 'dependencia_convenio_publico', + resultField: 'government_agreement_id', + where: { + relation: '=', + type: 'integer', + field: 'dependencia_convenio_publico' + } }); // Return all cities diff --git a/src/libs/routes_v1/federativeEntity.js b/src/libs/routes_v1/federativeEntity.js index 40668f76..661907c5 100644 --- a/src/libs/routes_v1/federativeEntity.js +++ b/src/libs/routes_v1/federativeEntity.js @@ -67,6 +67,17 @@ federativeEntityApp.get('/adm_dependency', (req, res, next) => { next(); }, response('adm_dependency')); +federativeEntityApp.get('/education_degree_entity', (req, res, next) => { + req.result = [] + + for (let i = 1; i <= 4; i++) { + req.result.push({ + id: i, name: id2str.educationDegreeEntity(i) + }); + } + next(); +}, response('education_degree_entity')); + federativeEntityApp.get('/adm_dependency_detailed', (req, res, next) => { req.result = [] @@ -535,6 +546,18 @@ federativeEntityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .order('docentes_sinopse.ano_censo') .where(whereRule); } + else if (req.query.dims && req.query.dims.includes('education_degree_entity')) + { + req.sql.from('docentes_sinopse') + .field('SUM(docentes_sinopse.num_doc_esc_en_fund)', 'total_num_doc_esc_en_fund') + .field('SUM(docentes_sinopse.num_doc_esc_en_medio)', 'total_num_doc_esc_en_medio') + .field('SUM(docentes_sinopse.num_doc_esc_grad_com_licenciatura)', 'total_num_doc_esc_grad_com_licenciatura') + .field('SUM(docentes_sinopse.num_doc_esc_grad_sem_licenciatura)', 'total_num_doc_esc_grad_sem_licenciatura') + .field('docentes_sinopse.ano_censo', 'year') + .group('docentes_sinopse.ano_censo') + .order('docentes_sinopse.ano_censo') + .where(whereRule); + } else if (req.query.dims && req.query.dims.includes('location_entity')) { req.sql.from('docentes_sinopse') -- GitLab From 01e40a0d0a8cffada2f4de5fdd29849dc7b77419 Mon Sep 17 00:00:00 2001 From: Lewis <lgtg20@inf.ufpr.br> Date: Tue, 15 Oct 2024 09:46:43 -0300 Subject: [PATCH 11/11] Add route for government_agreement --- src/libs/middlewares/aggregateData.js | 3 ++- src/libs/routes_v1/enrollmentAggregate.js | 8 +++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/libs/middlewares/aggregateData.js b/src/libs/middlewares/aggregateData.js index 864c2f54..5acac924 100644 --- a/src/libs/middlewares/aggregateData.js +++ b/src/libs/middlewares/aggregateData.js @@ -34,7 +34,8 @@ const convert = { post_graduation_entity: 'postGraduationEntity', contract_type_entity: 'contractType', total_doc: "totalDoc", - education_degree_entity: "educationDegreeEntity" + education_degree_entity: "educationDegreeEntity", + government_agreement: "governmentAgreement" } function aggregateData(req, res, next) { diff --git a/src/libs/routes_v1/enrollmentAggregate.js b/src/libs/routes_v1/enrollmentAggregate.js index 034aae7f..bb4ef2bf 100644 --- a/src/libs/routes_v1/enrollmentAggregate.js +++ b/src/libs/routes_v1/enrollmentAggregate.js @@ -78,11 +78,9 @@ enrollmentAggregateApp.get('/adm_dependency_detailed', (req, res, next) => { next(); }, response('adm_dependency_detailed')); -enrollmentAggregateApp.get('/government_agreement', cache('15 day'), (req, res, next) => { - req.result = [{ - id: "null", - name: id2str.governmentAgreement("null") - }]; +enrollmentAggregateApp.get('/government_agreement', (req, res, next) => { + req.result = [] + for(let i = 1; i <= 6; ++i) { req.result.push({ id: i, -- GitLab