From 19c78f53f062f3885a659e90e355e302df944a1d Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Tue, 28 Mar 2017 09:57:27 -0300
Subject: [PATCH] Add UC408 route

---
 src/libs/routes/enrollment.js | 182 +++++++++++++++++++++++++++++++---
 1 file changed, 167 insertions(+), 15 deletions(-)

diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js
index 5f0cdd04..d29baf0d 100644
--- a/src/libs/routes/enrollment.js
+++ b/src/libs/routes/enrollment.js
@@ -27,9 +27,9 @@ enrollmentApp.get('/year_range', (req, res, next) => {
 
 enrollmentApp.get('/location', (req, res, next) => {
     req.sql = squel.select()
-        .field('id')
-        .field('descricao', 'name')
-        .from('localizacao');
+    .field('id')
+    .field('descricao', 'name')
+    .from('localizacao');
     next();
 }, query, response('location'));
 
@@ -287,28 +287,28 @@ enrollmentApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
         if(typeof result.gender_id !== 'undefined') {
             switch (result.gender_id) {
                 case 1:
-                    result.gender_name = 'Masculino';
-                    break;
+                result.gender_name = 'Masculino';
+                break;
                 case 2:
-                    result.gender_name = 'Feminino';
-                    break;
+                result.gender_name = 'Feminino';
+                break;
             }
             delete result.gender_id;
         }
         if(typeof result.period_id !== 'undefined') {
             switch (result.period_id) {
                 case 1:
-                    result.period_name = 'Diurno';
-                    break;
+                result.period_name = 'Diurno';
+                break;
                 case 2:
-                    result.period_name = 'Noturno';
-                    break;
+                result.period_name = 'Noturno';
+                break;
                 case 3:
-                    result.period_name = 'Integral';
-                    break;
+                result.period_name = 'Integral';
+                break;
                 default:
-                    result.period_name = 'Indefinido';
-                    break;
+                result.period_name = 'Indefinido';
+                break;
             }
             delete result.period_id;
         }
@@ -316,4 +316,156 @@ enrollmentApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     next();
 }, response('enrollment'));
 
+function schoolYearIdToStr(schoolYearId) {
+    let schoolYearStr;
+    switch(schoolYearId) {
+        case 11:
+        schoolYearStr = 'Creche - Menor de 1 ano';
+        break;
+        case 12:
+        schoolYearStr = 'Creche - 1 ano';
+        break;
+        case 13:
+        schoolYearStr = 'Creche - 2 anos';
+        break;
+        case 14:
+        schoolYearStr = 'Creche - 3 anos';
+        break;
+        case 21:
+        schoolYearStr = 'Pré-escola - 4 anos';
+        break;
+        case 22:
+        schoolYearStr = 'Pré-escola - 5 anos';
+        break;
+        case 31:
+        schoolYearStr = 'Ens. Fundamental - 1º Ano';
+        break;
+        case 32:
+        schoolYearStr = 'Ens. Fundamental - 1ª série/2º ano';
+        break;
+        case 33:
+        schoolYearStr = 'Ens. Fundamental - 2ª série/3º ano';
+        break;
+        case 34:
+        schoolYearStr = 'Ens. Fundamental - 3ª série/4º ano';
+        break;
+        case 35:
+        schoolYearStr = 'Ens. Fundamental - 4ª série/5º Ano';
+        break;
+        case 41:
+        schoolYearStr = 'Ens. Fundamental - 5ª série/6º ano';
+        break;
+        case 42:
+        schoolYearStr = 'Ens. Fundamental - 6ª série/7º ano';
+        break;
+        case 43:
+        schoolYearStr = 'Ens. Fundamental - 7ª série/8º ano';
+        break;
+        case 44:
+        schoolYearStr = 'Ens. Fundamental - 8ª serie/9º ano';
+        break;
+        case 51:
+        schoolYearStr = 'Ens. Médio - 1ª série'; // equivalent to 'EM 1 Série'
+        break;
+        case 52:
+        schoolYearStr = 'Ens. Médio - 2ª série'; // equivalent to 'EM 2 Série'
+        break;
+        case 53:
+        schoolYearStr = 'Ens. Médio - 3ª série'; // equivalent to 'EM 3 Série'
+        break;
+        case 54:
+        schoolYearStr = 'Ens. Médio - 4ª série'; // equivalent to 'EM 4 Série'
+        break;
+        case 61:
+        schoolYearStr = 'EJA - anos iniciais do Ens. Fundamental';
+        break;
+        case 62:
+        schoolYearStr = 'EJA - anos finais do Ens. Fundamental';
+        break;
+        case 63:
+        schoolYearStr = 'EJA - Ensino Médio';
+        break;
+        case 64:
+        schoolYearStr = 'EJA semi-presencial';
+        break;
+        case 71:
+        schoolYearStr = 'Educação Profissional';
+        break;
+        default:
+        schoolYearStr = 'Não classificado';
+    }
+    return schoolYearStr;
+}
+
+let simRqf = new ReqQueryFields();
+
+simRqf.addField({
+    name: 'filter'
+}).addValue({
+    name: 'simulation_time'
+})
+
+enrollmentApp.get('/offer_projection', simRqf.parse(), (req, res, next) => {
+    const max_year = squel.select()
+    .field('MAX(matricula.ano_censo)')
+    .from('matricula')
+    .toString();
+
+    req.sql.field('matricula.ano_censo', 'offerYear')
+    .field('turma.turno', 'period_id')
+    .field('etapa_ensino.desc_etapa', 'education_level_name')
+    .field('etapa_ensino.id', 'education_level_id')
+    .field('matricula.serie_ano_id')
+    .field('COUNT(matricula.id)', 'currentOffer')
+    .from('matricula')
+    .join('etapa_ensino', null, 'matricula.etapa_ensino_id=etapa_ensino.id')
+    .join('turma', null, 'matricula.turma_id=turma.id')
+    .where('matricula.tipo <= 3')
+    .where(`matricula.ano_censo IN (${max_year})`)
+    .where('turma.turno <= 2')
+    .group('matricula.ano_censo')
+    .group('turma.turno')
+    .group('etapa_ensino.desc_etapa')
+    .group('etapa_ensino.id')
+    .group('matricula.serie_ano_id');
+
+    next();
+}, query, (req, res, next) => {
+    let years = parseInt(req.filter.simulation_time, 10);
+    if(isNaN(years)) years = 0;
+    let offerYear = req.result[0].offerYear;
+    let temp = {daytime: {}, nightly: {}};
+    let result = {
+        daytime: [],
+        nightly: [],
+        offerYear,
+        years: Array.apply(null, {length: years}).map(Number.call, Number).map((i)=>i+offerYear+1)
+    };
+    req.result.forEach((i) => {
+        let period = (i.period_id === 1) ? 'daytime' : 'nightly';
+        if(typeof temp[period][i.education_level_name] === 'undefined') {
+            temp[period][i.education_level_name] = {
+                id: i.education_level_id,
+                name: i.education_level_name,
+                currentOffer: 0,
+                grades: []
+            };
+        }
+        temp[period][i.education_level_name].currentOffer += i.currentOffer;
+        temp[period][i.education_level_name].grades.push({
+            id: i.serie_ano_id,
+            name: schoolYearIdToStr(i.serie_ano_id),
+            currentOffer: i.currentOffer
+        });
+    });
+    Object.keys(temp.daytime).forEach((k) => {
+        result.daytime.push(temp.daytime[k]);
+    });
+    Object.keys(temp.nightly).forEach((k) => {
+        result.nightly.push(temp.nightly[k]);
+    });
+    req.result = result;
+    next();
+}, response('offer_projection'));
+
 module.exports = enrollmentApp;
-- 
GitLab