const express = require('express'); const classroomCountApp = 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 addMissing = require(`${libs}/middlewares/addMissing`); const config = require(`${libs}/config`); const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware; let rqf = new ReqQueryFields(); rqf.addField({ name: 'filter', field: false, where: true }).addField({ name: 'dims', field: true, where: false }).addValueToField({ name: 'city', table: 'municipio', tableField: 'nome', resultField: 'city_name', where: { relation: '=', type: 'integer', field: 'municipio_id', table: '@' }, join: { primary: 'id', foreign: 'municipio_id', foreignTable: '@' } }, 'filter').addValueToField({ name: 'city', table: 'municipio', tableField: ['nome', 'id'], resultField: ['city_name', 'city_id'], where: { relation: '=', type: 'integer', field: 'id' }, join: { primary: 'id', foreign: 'municipio_id', foreignTable: '@' } }, 'dims').addValueToField({ name: 'state', table: 'estado', tableField: 'nome', resultField: 'state_name', where: { relation: '=', type: 'integer', field: 'estado_id', table: '@' }, join: { primary: 'id', foreign: 'estado_id', foreignTable: '@' } }, 'filter').addValueToField({ name: 'state', table: 'estado', tableField: ['nome', 'id'], resultField: ['state_name', 'state_id'], where: { relation: '=', type: 'integer', field: 'id', }, join: { primary: 'id', foreign: 'estado_id', foreignTable: '@' } }, 'dims').addValue({ name: 'region', table: 'regiao', tableField: 'nome', resultField: 'region_name', where: { relation: '=', type: 'integer', field: 'id' }, join: { primary: 'id', foreign: 'regiao_id', foreignTable: '@' } }).addValue({ name: 'min_year', table: '@', tableField: 'ano_censo', resultField: 'year', where: { relation: '>=', type: 'integer', field: 'ano_censo' } }).addValue({ name: 'max_year', table: '@', tableField: 'ano_censo', resultField: 'year', where: { relation: '<=', type: 'integer', field: 'ano_censo' } }).addValue({ name: 'period', table: '@', tableField: 'turma_turno_id', resultField: 'period_id', where: { relation: '=', type: 'integer', field: 'turma_turno_id' } }).addValue({ name: 'school_year', table: '@', tableField: 'serie_ano_id', resultField: 'school_year_id', where: { relation: '=', type: 'integer', field: 'serie_ano_id' } }).addValue({ name: 'location', table: '@', tableField: 'localizacao_id', resultField: 'location_id', where: { relation: '=', type: 'integer', field: 'localizacao_id' } }).addValue({ name: 'education_level_short', table: '@', tableField: 'etapa_resumida', resultField: 'education_level_short_id', where: { relation: '=', type: 'integer', field: 'etapa_resumida' } }); classroomCountApp.post('/', rqf.parse(), (req, res, next) => { req.dims.state = true; req.dims.city = true; req.dims.period = true; req.dims.education_level_short = true; req.dims.location = true; req.sql.field('COUNT(*)', 'total') .field("'Brasil'", 'name') .field('matricula.ano_censo', 'year') .from('matricula') .group('matricula.ano_censo') .order('matricula.ano_censo') .where('matricula.tipo<=3'); next(); }, rqf.build(), query, id2str.transform(), (req, res, next) => { req.enrollment = req.result; req.resetSql(); next(); }, rqf.parse(), (req, res, next) => { req.dims.state = true; req.dims.city = true; req.dims.location = true; req.sql.field('SUM(escola.num_salas)', 'total') .field("'Brasil'", 'name') .field('escola.ano_censo', 'year') .from('escola') .group('escola.ano_censo') .order('escola.ano_censo') .where('escola.situacao_de_funcionamento = 1 AND escola.local_func_predio_escolar = 1'); next(); }, rqf.build(), query, id2str.transform(), (req, res, next) => { let classSize = JSON.parse(req.body.class_size) || null; let integralTime = JSON.parse(req.body.integral_time) || null; console.log(classSize, integralTime); req.classroom = req.result; let classroom = []; req.classroom.forEach((c) => { let cityObjects = req.classroom.filter((value) => { return (c.city_id == value.city_id && c.year == value.year); }); let obj = { state_id: c.state_id, state_name: c.state_name, city_id: c.city_id, city_name: c.city_name, year: c.year, locations: [] }; cityObjects.forEach((co) => { obj.locations.push({ location_id: co.location_id, location_name: co.location_name, total_classroom: co.total }); }); if(classroom.findIndex((el) => {return el.city_id === obj.city_id}) === -1) { classroom.push(obj); } }); let result = []; classroom.forEach((c) => { function filterUrbanEnrollment(e) { return (e.city_id == c.city_id && e.year == c.year && e.location_id == 1); } function filterRuralEnrollment(e) { return (e.city_id == c.city_id && e.year == c.year && e.location_id == 2); } let urbanEnrollments = req.enrollment.filter(filterUrbanEnrollment); let ruralEnrollments = req.enrollment.filter(filterRuralEnrollment); let r = c; // r.locations[0].enrollments = urbanEnrollments; // r.locations[1].enrollments = ruralEnrollments; result.push(r); }); console.log('FEITO'); // console.log('SALAS'); // console.log(classroom[0]); // console.log('FILTRO'); // console.log(classEnrollments); req.result = result; next(); }, response('classroom_count')); module.exports = classroomCountApp;