diff --git a/src/libs/routes/location.js b/src/libs/routes/location.js index 68ca03be1621b295e0ef42343f8b57af3c6b3b07..b4a252d8d8f5b50e5f8c5166297de94a541df1f3 100644 --- a/src/libs/routes/location.js +++ b/src/libs/routes/location.js @@ -45,43 +45,43 @@ function schoolYearIdToStr(schoolYearId) schoolYearStr = 'Pré-escola'; break; case 31: - schoolYearStr = 'EF-AI 1 Ano'; + schoolYearStr = '1 Ano'; break; case 32: - schoolYearStr = 'EF-AI 2 Ano - 1 Serie'; + schoolYearStr = '2 Ano - 1 Serie'; break; case 33: - schoolYearStr = 'EF-AI 3 Ano - 2 Serie'; + schoolYearStr = '3 Ano - 2 Serie'; break; case 34: - schoolYearStr = 'EF-AI 4 Ano - 3 Serie'; + schoolYearStr = '4 Ano - 3 Serie'; break; case 35: - schoolYearStr = 'EF-AI 5 Ano - 4 Serie'; + schoolYearStr = '5 Ano - 4 Serie'; break; case 41: - schoolYearStr = 'EF-AF 6 Ano - 5 Serie'; + schoolYearStr = '6 Ano - 5 Serie'; break; case 42: - schoolYearStr = 'EF-AF 7 Ano - 6 Serie'; + schoolYearStr = '7 Ano - 6 Serie'; break; case 43: - schoolYearStr = 'EF-AF 8 Ano - 7 Serie'; + schoolYearStr = '8 Ano - 7 Serie'; break; case 44: - schoolYearStr = 'EF-AF 9 Ano - 8 Serie'; + schoolYearStr = '9 Ano - 8 Serie'; break; case 51: - schoolYearStr = 'EM 1 Série'; + schoolYearStr = '1 Ano'; // equivalent to 'EM 1 Série' break; case 52: - schoolYearStr = 'EM 2 Série'; + schoolYearStr = '2 Ano'; // equivalent to 'EM 2 Série' break; case 53: - schoolYearStr = 'EM 3 Série'; + schoolYearStr = '3 Ano'; // equivalent to 'EM 3 Série' break; case 54: - schoolYearStr = 'EM 4 Série'; + schoolYearStr = '4 Ano'; // equivalent to 'EM 4 Série' break; case 61: schoolYearStr = 'EJA AI'; @@ -987,8 +987,11 @@ locationApp.get('/educational/city/:id', (req, res, next) => { }); }, response('location')); -/* TODO: fix response format to nest objects by year -locationApp.get('/educational/per_year', (req, res, next) => { +locationApp.get('/educational/school_level', (req, res, next) => { + const enrollmentsPerSchoolLevelYearQry = squel.select() + .field('MAX(turma.ano_censo)', 'census_year') + .from('turma'); + const enrollmentsPerSchoolLevelQry = squel.select() .field('COALESCE(SUM(turma.num_matriculas), 0)', 'total') .field('turma.ano_censo', 'census_year') @@ -996,6 +999,7 @@ locationApp.get('/educational/per_year', (req, res, next) => { .field('etapa_ensino.desc_etapa', 'school_level') .from('turma') .from('etapa_ensino') + .where(`turma.ano_censo IN (${enrollmentsPerSchoolLevelYearQry.toString()})`) .where('turma.fk_etapa_ensino_id = etapa_ensino.pk_etapa_ensino_id') .where('turma.fk_tipo_turma_id <= 3') .group('etapa_ensino.desc_etapa') @@ -1005,24 +1009,40 @@ locationApp.get('/educational/per_year', (req, res, next) => { .order('turma.serie_ano') .order('turma.ano_censo'); - const queryLabels = [ "enrollment_per_school_level" ]; - const querySet = [ enrollmentsPerSchoolLevelQry ]; + const queryLabels = [ 'enrollment_per_school_level', 'enrollment_census_year' ]; + const querySet = [ enrollmentsPerSchoolLevelQry, enrollmentsPerSchoolLevelYearQry ]; // wait until all queries finish or one of them fail - Promise.all(dbExecAll(querySet)).then((queryResults) => { + Promise.all(dbExecAll(querySet, enrollmentsPerSchoolLevelYearQry)).then((queryResults) => { const result = queryResults[0]; - let response = {}; + const censusYear = queryResults[1][0]['census_year']; + + let school_levels = {}; for(let i = 0; i < result.length; ++i) { - log.debug(result[i]); const school_year = schoolYearIdToStr(result[i].school_year); const school_level = result[i].school_level; const census_year = result[i].census_year; - if (typeof response[school_level] === "undefined") { - response[school_level] = {}; + if (typeof school_levels[school_level] === 'undefined') { + school_levels[school_level] = {}; } - if (typeof response[school_level][school_year] === "undefined") { - response[school_level][school_year] = {}; + school_levels[school_level][school_year] = parseInt(result[i].total, 10); + } + + let response = []; + for(let level in school_levels) { + if (school_levels.hasOwnProperty(level)) { + let sclevel = {}; + sclevel["degree"] = level; + sclevel["census_year"] = parseInt(censusYear, 10); + sclevel["table"] = []; + for(let school_year in school_levels[level]) { + if (school_levels[level].hasOwnProperty(school_year)) { + let enrollment = { 'title' : school_year, + 'value' : school_levels[level][school_year] }; + sclevel["table"].push(enrollment); + } + } + response.push(sclevel); } - response[school_level][school_year] = parseInt(result[i].total, 10); } req.result = response; next(); @@ -1031,6 +1051,5 @@ locationApp.get('/educational/per_year', (req, res, next) => { next(error); }); }, response('location')); -*/ module.exports = locationApp; diff --git a/src/test/location.js b/src/test/location.js index 7d8f202e7efff24c8474fed39f6de94725c6b53c..06924a3b8b1aba3c5e2c76df8000c241c7e69467 100644 --- a/src/test/location.js +++ b/src/test/location.js @@ -446,4 +446,33 @@ describe('test location', () => { done(); }); }).timeout(testTimeout); + + it('should return the correct format of enrollments per school level', (done) => { + chai.request(server) + .get('/api/v1/location/educational/school_level') + .end((err, res) => { + res.should.have.status(200); + // test response format + res.should.be.json; + // test for result attribute in the response + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + // test response attributes for school + res.body.result.forEach((row) => { + row.should.be.a('object'); + row.should.have.property('degree'); + row.should.have.property('census_year'); + row.should.have.property('table'); + row.table.should.be.a('array'); + row.table.forEach((tableRow) => { + tableRow.should.be.a('object'); + tableRow.should.have.property('title'); + tableRow.should.have.property('value'); + tableRow.title.should.be.a('String'); + tableRow.value.should.be.a('Number'); + }); + }); + done(); + }); + }).timeout(testTimeout); });