From d4df694d08509bc922f00a5b0967f7e0f2068ee5 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Wed, 15 Aug 2018 09:54:20 -0300
Subject: [PATCH 01/20] Update CHANGELOG

---
 CHANGELOG.md | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9b07f941..e057c443 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
 and this project adheres to [Semantic Versioning](http://semver.org/).
 
 ## UNRELEASED
+### Added
 - Dimension state in route enrollment now returns state name and id
+- Add route to search for INEP
+- Add search with state abbreviation and city name in school route
 
 ## 1.5.0 - 2018-07-30
 ### Added
-- 
GitLab


From 3ba7f20895eb264d4f8bb356d7441cf205870988 Mon Sep 17 00:00:00 2001
From: Gabriel Ruschel <grc15@inf.ufpr.br>
Date: Thu, 16 Aug 2018 10:55:45 -0300
Subject: [PATCH 02/20] Revert "Merge branch 'account_duplicate' into
 development"

This reverts commit 06a917994e45947c4207ab39f916136c7b121714, reversing
changes made to 2c2dbdd6100d9b95893c2e25ef8ae0b9e328a1d8.
---
 src/libs/routes/user.js | 98 ++++++++++++++++-------------------------
 1 file changed, 38 insertions(+), 60 deletions(-)

diff --git a/src/libs/routes/user.js b/src/libs/routes/user.js
index ee5ddf01..af123a58 100644
--- a/src/libs/routes/user.js
+++ b/src/libs/routes/user.js
@@ -141,76 +141,54 @@ userApp.post('/', (req, res, next) => {
     admin: false
   });
 
-  let emailAddress = req.body.email;
-  let origin = req.body.origin;
-  User.findOne({email: emailAddress}, (err, find)=> {
-    if(err) {
+  if (typeof req.body.password === 'undefined' || !req.body.password) {
+    res.statusCode = 400;
+    return res.json({errors: ["O campo senha é obrigatório"]});
+  } else {
+    user.save((err) => {
+      if(err) {
         log.error(err);
         let errors = [];
         for(let errName in err.errors) {
           errors.push(err.errors[errName].message);
         }
+        log.error(errors);
         res.statusCode = 400;
         return res.json({err, errors});
-    } else if (find) {
-          if (find.origin != origin) {
-              res.statusCode = 400;
-              return res.json({errors:["Identificamos que esta conta já existe em outra plataforma.\n\nVocê pode realizar o login com a conta do SimCAQ ou criar uma conta nova com outros dados"]});
-          } else {
-              res.statusCode = 400;
-              return res.json({errors:["Identificamos que esta conta já existe nesta plataforma"]});
-          }
-    } else {
-          if (typeof req.body.password === 'undefined' || !req.body.password) {
-            res.statusCode = 400;
-            return res.json({errors: ["O campo senha é obrigatório"]});
-          } else {
-            user.save((err) => {
-              if(err) {
-                log.error(err);
-                let errors = [];
-                for(let errName in err.errors) {
-                  errors.push(err.errors[errName].message);
-                }
-                log.error(errors);
-                res.statusCode = 400;
-                return res.json({err, errors});
-              }
+      }
 
-              // Create verification token
-              let verificationToken = new VerificationToken({
-                userId: user._id
-              });
+      // Create verification token
+      let verificationToken = new VerificationToken({
+        userId: user._id
+      });
 
-              verificationToken.createVerificationToken((err, token) => {
-                if(err) {
-                  log.error(err);
-                  return next(err);
-                }
-                let url = config.default.lde.url + '/verify';
-                let text = `Olá, ${user.name}, seja bem vindo/a ao Laboratório de Dados Educacionais.\n\nClique neste link para confirmar sua conta: ${url}/${token}`;
-                // Send confirmation email
-                let mailOptions = {
-                  to: `"${user.name} <${user.email}>"`,
-                  subject: "Confirme seu cadastro - Laboratório de Dados Educacionais",
-                  text
-                }
-                email(mailOptions, (err, info) => {
-                  if(err) {
-                    log.error(err);
-                    res.json({msg: 'User created'});
-                  }
-                  if(info) {
-                    log.info(`Message ${info.messageId} sent: ${info.response}`);
-                    log.info(`Usuário ${user.email} foi criado`);
-                  }
-                  res.json({msg: 'User created'});
-                });
-              });
-            });
+      verificationToken.createVerificationToken((err, token) => {
+        if(err) {
+          log.error(err);
+          return next(err);
+        }
+        let url = config.default.lde.url + '/verify';
+        let text = `Olá, ${user.name}, seja bem vindo/a ao Laboratório de Dados Educacionais.\n\nClique neste link para confirmar sua conta: ${url}/${token}`;
+        // Send confirmation email
+        let mailOptions = {
+          to: `"${user.name} <${user.email}>"`,
+          subject: "Confirme seu cadastro - Laboratório de Dados Educacionais",
+          text
+        }
+        email(mailOptions, (err, info) => {
+          if(err) {
+            log.error(err);
+            res.json({msg: 'User created'});
           }
-      }
-  })
+          if(info) {
+            log.info(`Message ${info.messageId} sent: ${info.response}`);
+            log.info(`Usuário ${user.email} foi criado`);
+          }
+          res.json({msg: 'User created'});
+        });
+      });
+    });
+  }
 
 });
 
-- 
GitLab


From 39e30a2ce24300c1933e81e29a071f48054e609b Mon Sep 17 00:00:00 2001
From: Fernando Erd <fce15@inf.ufpr.br>
Date: Thu, 16 Aug 2018 11:33:16 -0300
Subject: [PATCH 03/20] Fix portal mec inep name

---
 src/libs/routes/portalMecInep.js | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/libs/routes/portalMecInep.js b/src/libs/routes/portalMecInep.js
index 980e84bf..2b235891 100644
--- a/src/libs/routes/portalMecInep.js
+++ b/src/libs/routes/portalMecInep.js
@@ -46,14 +46,13 @@ rqf.addField({
 portalMecInepApp.get('/', rqf.parse(), (req, res, next) => {
 
     req.sql.field('DISTINCT escola.id', 'id')
-    .field('escola.nome_escola', 'school_name')
+    .field('escola.nome_escola', 'name')
     .from('escola')
     .join('estado', null, 'estado.id=escola.estado_id')
     .field('estado.nome', 'state_name')
     .join('municipio', null, 'municipio.id=escola.municipio_id')
     .field('municipio.nome', 'city_name')
 
-
     next();
 
 }, rqf.build(), query, response('portalMec_inep'));
-- 
GitLab


From d18d5352e28a5ec01e60eb2414f1fbfc20e72141 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fce15@inf.ufpr.br>
Date: Thu, 16 Aug 2018 11:35:44 -0300
Subject: [PATCH 04/20] Change name route portal inep

---
 src/libs/routes/api.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index 8d5aefbd..ebb16c02 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -121,6 +121,6 @@ api.use('/cub', cub);
 api.use('/auxiliar', auxiliar);
 api.use('/verify_teacher', verifyTeacher);
 api.use('/class_count', classCount);
-api.use('/poltal_mec_inep', portalMecInep);
+api.use('/portal_mec_inep', portalMecInep);
 
 module.exports = api;
-- 
GitLab


From 4aaaf7f4b80a30646f2194c6db6c2964501e84a1 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Fri, 24 Aug 2018 10:19:18 -0300
Subject: [PATCH 05/20] [dailyChargeAmount]LDE multi column change

---
 src/libs/routes/dailyChargeAmount.js | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js
index 2bf1f513..3cea1408 100644
--- a/src/libs/routes/dailyChargeAmount.js
+++ b/src/libs/routes/dailyChargeAmount.js
@@ -404,7 +404,11 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
         req.sql.from('turma')
         .field('turma.ano_censo', 'year')
         .field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id')
-        .field('AVG(turma.duracao_turma)/60.0', 'total')
+        .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
+        .field('MEDIAN(turma.duracao_turma)/60.0', 'median_class_duration')
+        .field('STDDEV_POP(turma.duracao_turma)/60.0', 'std_class_duration')
+        .field('QUANTILE(turma.duracao_turma, 0.25)/60.0', 'fstqt_class_duration')
+        .field('QUANTILE(turma.duracao_turma, 0.75)/60.0', 'thdqt_class_duration')
         .group('turma.ano_censo')
         .group('turma.etapas_mod_ensino_segmento_id')
         .order('turma.ano_censo')
-- 
GitLab


From 4b58b598294c01599dd2cdb396918464adf0d00a Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Mon, 27 Aug 2018 09:32:59 -0300
Subject: [PATCH 06/20] [dailyChargeAmount]Removed indicator limitation

---
 src/libs/routes/dailyChargeAmount.js | 17 +----------------
 1 file changed, 1 insertion(+), 16 deletions(-)

diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js
index 3cea1408..33d914fc 100644
--- a/src/libs/routes/dailyChargeAmount.js
+++ b/src/libs/routes/dailyChargeAmount.js
@@ -423,21 +423,6 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
     }
 
     next();
-
-}, query, addMissing(rqf), (req, res, next) => {
-
-    function sliced(object) {
-        return object['education_level_mod_id'] > 4;
-    }
-
-    if ('period' in req.filter || 'period' in req.dims) {
-        req.filter['period'].forEach((element) => {
-            if (element == '3')
-                req.result = req.result.filter(sliced);
-        });
-    }
-
-    next();
-}, id2str.transform(), response('turma'));
+}, query, addMissing(rqf), id2str.transform(), response('turma'));
 
 module.exports = dailyChargeAmountApp;
-- 
GitLab


From 29198b759e6bbfdd798b1b886b2b1cc503c662f4 Mon Sep 17 00:00:00 2001
From: Glenda <gpt16@inf.ufpr.br>
Date: Wed, 29 Aug 2018 10:22:07 -0300
Subject: [PATCH 07/20] fix total row and dimensions

---
 src/libs/routes/classCount.js | 106 +++++++++++++++++++++++-----------
 1 file changed, 72 insertions(+), 34 deletions(-)

diff --git a/src/libs/routes/classCount.js b/src/libs/routes/classCount.js
index d415d5a3..8747ee39 100644
--- a/src/libs/routes/classCount.js
+++ b/src/libs/routes/classCount.js
@@ -298,7 +298,7 @@ classCountApp.get('/source', (req, res, next) => {
   next();
 }, query, response('source'));
 
-function mediaCalc(response) {
+function averageCalc(response) {
   let obj = [];
   response.forEach((result) => {
     let newObj = {};
@@ -307,13 +307,15 @@ function mediaCalc(response) {
       if(key !== "total_classes" && key !== "total_enrollment")
         newObj[key] = result[key]
     })
-    newObj.total = result.total_enrollment / result.total_classes;
+    newObj.average = result.total_enrollment / result.total_classes;
     obj.push(newObj);
   });
   return(obj);
 }
 
+// LDE
 classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
+  // Faz a consulta do número de alunos pelas dimensões
   if(("education_level_mod" in req.dims) || ("education_level_mod" in req.filter)) {
     req.sql.field('COUNT(turma.id)', 'total_classes')
      .field('SUM(turma.num_matricula)', 'total_enrollment')
@@ -332,32 +334,56 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     });
   }
 }, rqf.build(), query, id2str.transform(), (req, res, next) => {
-    req.partial = req.result;
-    req.resetSql();
-    req.dims = {};
-    req.filter = {};
-    req.sql.field('COUNT(turma.id)', 'total_classes')
-     .field('SUM(turma.num_matricula)', 'total_enrollment')
-     .field("'Brasil'", 'name')
-     .field('turma.ano_censo', 'year')
-     .from('turma')
-     .group('turma.ano_censo')
-     .order('turma.ano_censo')
-     .where('turma.tipo_turma_id = 0 AND turma.etapas_mod_ensino_segmento_id >= 1 AND turma.etapas_mod_ensino_segmento_id <= 10');
-     next();
-}, query, addMissing(rqf), id2str.transform(), (req, res, next) => {
-  const classCount = mediaCalc(req.partial);
-  const yearClassCount = mediaCalc(req.result);
-  req.result = classCount;
-  yearClassCount.forEach((result) => {
-    let obj = {};
-    obj = result;
-    obj.label = "total_year_media";
-    req.result.push(obj);
-  })
+    req.partial = [];
+
+    // Caso tenha apenas uma dimensão, a indicador possuirá uma linha de total
+    if((req.dims) && (req.dims.size == 1)) {
+      req.partial = req.result;
+
+      // A linha de total deverá conter o valor total do ano que está no banco de dados, então usa o mesmo filtro de anos da consulta anterior
+      let yearFilter = {};
+      if("min_year" in req.filter)
+        yearFilter.min_year = req.filter.min_year;
+      if("max_year" in req.filter)
+        yearFilter.max_year = req.filter.max_year;
+
+      // Faz a consulta sem dimensões, do total do(s) ano(s) escolhido(s)
+      req.resetSql();
+      req.dims = {};
+      req.filter = yearFilter;
+      req.sql.field('COUNT(turma.id)', 'total_classes')
+       .field('SUM(turma.num_matricula)', 'total_enrollment')
+       .field("'Brasil'", 'name')
+       .field('turma.ano_censo', 'year')
+       .from('turma')
+       .group('turma.ano_censo')
+       .order('turma.ano_censo')
+       .where('turma.tipo_turma_id = 0 AND turma.etapas_mod_ensino_segmento_id >= 1 AND turma.etapas_mod_ensino_segmento_id <= 10');
+     }
+    next();
+}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
+  if(req.partial.length > 0) {
+    const classCount = averageCalc(req.partial);
+    const yearClassCount = averageCalc(req.result);
+    req.result = classCount;
+
+    // Como a linha de total deve aparecer em um caso específico, ela é adicionada junto com a dimensão obrigatória
+    yearClassCount.forEach((result) => {
+      let obj = {};
+      obj = result;
+      obj.education_level_mod_name = "Total";
+      req.result.push(obj);
+    })
+  }
+  // Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total
+  else {
+    const classCount = averageCalc(req.result);
+    req.result = classCount;
+  }
   next();
 }, response('class_count'));
 
+// SimCAQ
 classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
   req.sql.field('COUNT(turma.id)', 'total_classes')
    .field('SUM(turma.num_matricula)', 'total_enrollment')
@@ -368,13 +394,22 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
    .order('turma.ano_censo')
    .where('turma.tipo_turma_id = 0 AND turma.dependencia_adm_id <= 3 AND ((turma.etapa_resumida >= 1 AND turma.etapa_resumida <= 7) OR turma.etapa_resumida = 99)');
    next();
-}, query, id2str.transform(), (req, res, next) => {
+}, rqf.build(), query, id2str.transform(), (req, res, next) => {
       req.partial = [];
-      if(Object.keys(req.dims).length > 0 || Object.keys(req.filter).length > 0) {
+      if((req.dims) && (req.dims.size == 1)) {
         req.partial = req.result;
+
+        // Se a consulta anterior selecionou dimensão:
+        // Considera apenas os anos escolhidos na consulta anterior para contar o número total de alunos
+        let yearFilter = {};
+        if("min_year" in req.filter)
+          yearFilter.min_year = req.filter.min_year;
+        if("max_year" in req.filter)
+          yearFilter.max_year = req.filter.max_year;
+
         req.resetSql();
         req.dims = {};
-        req.filter = {};
+        req.filter = yearFilter;
         req.sql.field('COUNT(turma.id)', 'total_classes')
          .field('SUM(turma.num_matricula)', 'total_enrollment')
          .field("'Brasil'", 'name')
@@ -385,20 +420,23 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
          .where('turma.tipo_turma_id = 0 AND turma.dependencia_adm_id <= 3 AND ((turma.etapa_resumida >= 1 AND turma.etapa_resumida <= 7) OR turma.etapa_resumida = 99)');
      }
      next();
-}, query, addMissing(rqf), id2str.transform(), (req, res, next) => {
+}, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
   if(req.partial.length > 0) {
-    const classCount = mediaCalc(req.partial);
-    const yearClassCount = mediaCalc(req.result);
+    const classCount = averageCalc(req.partial);
+    const yearClassCount = averageCalc(req.result);
     req.result = classCount;
+
+    // Adiciona os totais por anos ao fim da consulta
+    // Como esse tipo de total é específico desse indicador, um label foi adicionado para indicar
     yearClassCount.forEach((result) => {
       let obj = {};
-      obj = result;
-      obj.label = "total_year_media";
+      obj =	result;
+      obj.label = "total_year_average";
       req.result.push(obj);
     })
   }
   else {
-    const classCount = mediaCalc(req.result);
+    const classCount = averageCalc(req.result);
     req.result = classCount;
   }
   next();
-- 
GitLab


From bc80a133a3d92caa7c6ea15627e483b953e02cbd Mon Sep 17 00:00:00 2001
From: Fernando Erd <fce15@inf.ufpr.br>
Date: Thu, 30 Aug 2018 10:56:12 -0300
Subject: [PATCH 08/20] Remove dims in transport route

---
 src/libs/routes/transport.js | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/libs/routes/transport.js b/src/libs/routes/transport.js
index 266b1400..449895d0 100644
--- a/src/libs/routes/transport.js
+++ b/src/libs/routes/transport.js
@@ -373,14 +373,14 @@ transportApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     // Vans e Kombi
     let goVansAndKombi = allTransports.clone();
     goVansAndKombi.field('matricula.transporte_vans_kombi','use_transport_id')
-    goVansAndKombi.where('matricula.transporte_vans_kombi = 1 OR matricula.transporte_vans_kombi = 0');
+    goVansAndKombi.where('matricula.transporte_vans_kombi = 1');
     goVansAndKombi.group('matricula.transporte_vans_kombi');
     req.queryIndex.goVansAndKombi = req.querySet.push(goVansAndKombi) - 1;
 
     // Micro
     let goMicroBus = allTransports.clone();
     goMicroBus.field('matricula.transporte_micro_onibus', 'use_transport_id')
-    goMicroBus.where('matricula.transporte_micro_onibus = 1 OR matricula.transporte_micro_onibus = 0');
+    goMicroBus.where('matricula.transporte_micro_onibus = 1');
     goMicroBus.group('matricula.transporte_micro_onibus');
     req.queryIndex.goMicroBus = req.querySet.push(goMicroBus) - 1;
 
@@ -388,63 +388,63 @@ transportApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     // Ônibus
     let goBus = allTransports.clone();
     goBus.field("matricula.transporte_onibus", 'use_transport_id')
-    goBus.where('matricula.transporte_onibus = 1 OR matricula.transporte_onibus = 0');
+    goBus.where('matricula.transporte_onibus = 1');
     goBus.group('matricula.transporte_onibus')
     req.queryIndex.goBus = req.querySet.push(goBus) - 1;
 
     // Bicicleta
     let goBikes = allTransports.clone();
     goBikes.field('matricula.transporte_bicicleta', 'use_transport_id')
-    goBikes.where('matricula.transporte_bicicleta = 1 OR matricula.transporte_bicicleta = 0');
+    goBikes.where('matricula.transporte_bicicleta = 1');
     goBikes.group('matricula.transporte_bicicleta')
     req.queryIndex.goBikes = req.querySet.push(goBikes) - 1;
 
     // Tração Animal
     let goAnimalTraction = allTransports.clone();
     goAnimalTraction.field('matricula.transporte_animal', 'use_transport_id')
-    goAnimalTraction.where('matricula.transporte_animal = 1 OR matricula.transporte_animal = 0');
+    goAnimalTraction.where('matricula.transporte_animal = 1');
     goAnimalTraction.group('matricula.transporte_animal')
     req.queryIndex.goAnimalTraction = req.querySet.push(goAnimalTraction) - 1;
 
     // Outro Veículo
     let goOtherVehicle = allTransports.clone();
     goOtherVehicle.field('matricula.transporte_outro', 'use_transport_id')
-    goOtherVehicle.where('matricula.transporte_outro = 1 OR matricula.transporte_outro = 0');
+    goOtherVehicle.where('matricula.transporte_outro = 1');
     goOtherVehicle.group('matricula.transporte_outro')
     req.queryIndex.goOtherVehicle = req.querySet.push(goOtherVehicle) - 1;
 
     // Aquaviário/ Embarcação (capacidade até 5 alunos)
     let goWaterway_5_Students = allTransports.clone();
     goWaterway_5_Students.field('matricula.transporte_embar_0_5','use_transport_id')
-    goWaterway_5_Students.where('matricula.transporte_embar_0_5 = 1 OR matricula.transporte_embar_0_5 = 0');
+    goWaterway_5_Students.where('matricula.transporte_embar_0_5 = 1');
     goWaterway_5_Students.group('matricula.transporte_embar_0_5')
     req.queryIndex.goWaterway_5_Students = req.querySet.push(goWaterway_5_Students) - 1;
 
     // Aquaviário/ Embarcação (capacidade de 5 até 15 alunos)
     let goWaterway_15_Students = allTransports.clone();
     goWaterway_15_Students.field('matricula.transporte_embar_5_15', 'use_transport_id')
-    goWaterway_15_Students.where('matricula.transporte_embar_5_15 = 1 OR matricula.transporte_embar_5_15 = 0');
+    goWaterway_15_Students.where('matricula.transporte_embar_5_15 = 1');
     goWaterway_15_Students.group('matricula.transporte_embar_5_15')
     req.queryIndex.goWaterway_15_Students = req.querySet.push(goWaterway_15_Students) - 1;
 
     // Aquaviário/ Embarcação (capacidade de 15 até 35 alunos)r
     let goWaterway_35_Students = allTransports.clone();
     goWaterway_35_Students.field('matricula.transporte_embar_15_35', 'use_transport_id')
-    goWaterway_35_Students.where('matricula.transporte_embar_15_35 = 1 OR matricula.transporte_embar_15_35 = 0');
+    goWaterway_35_Students.where('matricula.transporte_embar_15_35 = 1');
     goWaterway_35_Students.group('matricula.transporte_embar_15_35')
     req.queryIndex.goWaterway_35_Students = req.querySet.push(goWaterway_35_Students) - 1;
 
     // Aquaviário/ Embarcação (capacidade mais 35 alunos)
     let goWaterwayMoreThan_35 = allTransports.clone();
     goWaterwayMoreThan_35.field('matricula.transporte_embar_35', 'use_transport_id')
-    goWaterwayMoreThan_35.where('matricula.transporte_embar_35 = 1 OR matricula.transporte_embar_35 = 0');
+    goWaterwayMoreThan_35.where('matricula.transporte_embar_35 = 1');
     goWaterwayMoreThan_35.group('matricula.transporte_embar_35')
     req.queryIndex.goWaterwayMoreThan_35 = req.querySet.push(goWaterwayMoreThan_35) - 1;
 
     // Trêm / Metrô
     let goSubwayAndTrain = allTransports.clone();
     goSubwayAndTrain.field('matricula.transporte_trem_metro', 'use_transport_id')
-    goSubwayAndTrain.where('matricula.transporte_trem_metro = 1 OR matricula.transporte_trem_metro = 0');
+    goSubwayAndTrain.where('matricula.transporte_trem_metro = 1');
     goSubwayAndTrain.group('matricula.transporte_trem_metro')
     req.queryIndex.goSubwayAndTrain = req.querySet.push(goSubwayAndTrain) - 1;
 
@@ -463,8 +463,8 @@ transportApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     for (let i = 0; i < transport_match_0.length; i++) {
         transport_match_0[i].use_transport_id = true;
         transport_match.push(transport_match_0[i])
-        transport_match_1[i].use_transport_id = false;
-        transport_match.push(transport_match_1[i])
+        // transport_match_1[i].use_transport_id = false;
+        // transport_match.push(transport_match_1[i])
     }
 
     //modifica adicionando use_transport_id=false, com os mesmos valores
@@ -472,8 +472,8 @@ transportApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     for (let i = 0; i < all_enrollment_match_0.length; i++) {
         all_enrollment_match_0[i].use_transport_id = true;
         all_enrollment_match.push(all_enrollment_match_0[i])
-        all_enrollment_match_1[i].use_transport_id = false;
-        all_enrollment_match.push(all_enrollment_match_1[i])
+        // all_enrollment_match_1[i].use_transport_id = false;
+        // all_enrollment_match.push(all_enrollment_match_1[i])
     }
 
     let public_transport = matchQueries(all_enrollment_match, req.result[req.queryIndex.allEnrollmentTransport]);
-- 
GitLab


From c46299882b7136a49df64bf94157db85ae82290e Mon Sep 17 00:00:00 2001
From: Glenda <gpt16@inf.ufpr.br>
Date: Thu, 30 Aug 2018 12:19:03 -0300
Subject: [PATCH 09/20] fix LDE education level mod sequence

---
 src/libs/routes/classCount.js | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/src/libs/routes/classCount.js b/src/libs/routes/classCount.js
index 8747ee39..854b489a 100644
--- a/src/libs/routes/classCount.js
+++ b/src/libs/routes/classCount.js
@@ -313,6 +313,28 @@ function averageCalc(response) {
   return(obj);
 }
 
+// Se a dimensão obrigatória do LDE (etapa de ensino) possui alguma etapa sem nenhum valor, então é criado um objeto
+// com média 0.0 e é inserido no resultado. Usada para não quebrar a sequência de etapas na tabela do LDE.
+function addNullFields(result) {
+  const firstYear = result[0].year;
+  var obj = result.filter(res => res.year == firstYear);
+  var prevFirstDimId = obj[0];
+  obj.forEach((d) => {
+    if((d["education_level_mod_id"] > prevFirstDimId["education_level_mod_id"]) && (prevFirstDimId["education_level_mod_id"] != 10) &&
+       (d["education_level_mod_id"] != prevFirstDimId["education_level_mod_id"] + 1)) {
+      let newObj = {};
+      Object.keys(prevFirstDimId).forEach((key) => {
+        newObj[key] = prevFirstDimId[key];
+      });
+      newObj.education_level_mod_id = d["education_level_mod_id"] - 1;
+      newObj.education_level_mod_name = id2str.educationLevelMod(d["education_level_mod_id"] - 1);
+      newObj.average = 0.0;
+      result.splice(result.indexOf(prevFirstDimId) + 1, 0, newObj);
+    }
+    prevFirstDimId = d;
+  });
+}
+
 // LDE
 classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
   // Faz a consulta do número de alunos pelas dimensões
@@ -379,6 +401,7 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
   else {
     const classCount = averageCalc(req.result);
     req.result = classCount;
+    addNullFields(req.result);
   }
   next();
 }, response('class_count'));
-- 
GitLab


From c093afde3bfcfeaeb459a437ce58108950d09415 Mon Sep 17 00:00:00 2001
From: Glenda <gpt16@inf.ufpr.br>
Date: Fri, 31 Aug 2018 09:39:57 -0300
Subject: [PATCH 10/20] classCount: add median, stddev, firstQt and thirdQt

---
 src/libs/routes/classCount.js | 76 ++++++++++++++++-------------------
 1 file changed, 34 insertions(+), 42 deletions(-)

diff --git a/src/libs/routes/classCount.js b/src/libs/routes/classCount.js
index 854b489a..71b7ab36 100644
--- a/src/libs/routes/classCount.js
+++ b/src/libs/routes/classCount.js
@@ -298,21 +298,6 @@ classCountApp.get('/source', (req, res, next) => {
   next();
 }, query, response('source'));
 
-function averageCalc(response) {
-  let obj = [];
-  response.forEach((result) => {
-    let newObj = {};
-    let keys = Object.keys(result);
-    keys.forEach((key) => {
-      if(key !== "total_classes" && key !== "total_enrollment")
-        newObj[key] = result[key]
-    })
-    newObj.average = result.total_enrollment / result.total_classes;
-    obj.push(newObj);
-  });
-  return(obj);
-}
-
 // Se a dimensão obrigatória do LDE (etapa de ensino) possui alguma etapa sem nenhum valor, então é criado um objeto
 // com média 0.0 e é inserido no resultado. Usada para não quebrar a sequência de etapas na tabela do LDE.
 function addNullFields(result) {
@@ -339,10 +324,13 @@ function addNullFields(result) {
 classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
   // Faz a consulta do número de alunos pelas dimensões
   if(("education_level_mod" in req.dims) || ("education_level_mod" in req.filter)) {
-    req.sql.field('COUNT(turma.id)', 'total_classes')
-     .field('SUM(turma.num_matricula)', 'total_enrollment')
-     .field("'Brasil'", 'name')
+    req.sql.field("'Brasil'", 'name')
      .field('turma.ano_censo', 'year')
+     .field('AVG(turma.num_matricula)', 'average')
+     .field('MEDIAN(turma.num_matricula)', 'median')
+     .field('STDDEV_POP(turma.num_matricula)', 'stddev')
+     .field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
+     .field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
      .from('turma')
      .group('turma.ano_censo')
      .order('turma.ano_censo')
@@ -358,7 +346,7 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
 }, rqf.build(), query, id2str.transform(), (req, res, next) => {
     req.partial = [];
 
-    // Caso tenha apenas uma dimensão, a indicador possuirá uma linha de total
+    // Caso tenha apenas uma dimensão, o indicador possuirá uma linha de total
     if((req.dims) && (req.dims.size == 1)) {
       req.partial = req.result;
 
@@ -373,10 +361,13 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
       req.resetSql();
       req.dims = {};
       req.filter = yearFilter;
-      req.sql.field('COUNT(turma.id)', 'total_classes')
-       .field('SUM(turma.num_matricula)', 'total_enrollment')
-       .field("'Brasil'", 'name')
+      req.sql.field("'Brasil'", 'name')
        .field('turma.ano_censo', 'year')
+       .field('AVG(turma.num_matricula)', 'average')
+       .field('MEDIAN(turma.num_matricula)', 'median')
+       .field('STDDEV_POP(turma.num_matricula)', 'stddev')
+       .field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
+       .field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
        .from('turma')
        .group('turma.ano_censo')
        .order('turma.ano_censo')
@@ -384,10 +375,10 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
      }
     next();
 }, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
+  // Se tem apenas uma dimensão
   if(req.partial.length > 0) {
-    const classCount = averageCalc(req.partial);
-    const yearClassCount = averageCalc(req.result);
-    req.result = classCount;
+    const yearClassCount = req.result;
+    req.result = req.partial;
 
     // Como a linha de total deve aparecer em um caso específico, ela é adicionada junto com a dimensão obrigatória
     yearClassCount.forEach((result) => {
@@ -398,20 +389,21 @@ classCountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     })
   }
   // Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total
-  else {
-    const classCount = averageCalc(req.result);
-    req.result = classCount;
+  else
     addNullFields(req.result);
-  }
+
   next();
 }, response('class_count'));
 
 // SimCAQ
 classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
-  req.sql.field('COUNT(turma.id)', 'total_classes')
-   .field('SUM(turma.num_matricula)', 'total_enrollment')
-   .field("'Brasil'", 'name')
+  req.sql.field("'Brasil'", 'name')
    .field('turma.ano_censo', 'year')
+   .field('AVG(turma.num_matricula)', 'average')
+   .field('MEDIAN(turma.num_matricula)', 'median')
+   .field('STDDEV_POP(turma.num_matricula)', 'stddev')
+   .field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
+   .field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
    .from('turma')
    .group('turma.ano_censo')
    .order('turma.ano_censo')
@@ -433,10 +425,13 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
         req.resetSql();
         req.dims = {};
         req.filter = yearFilter;
-        req.sql.field('COUNT(turma.id)', 'total_classes')
-         .field('SUM(turma.num_matricula)', 'total_enrollment')
-         .field("'Brasil'", 'name')
+        req.sql.field("'Brasil'", 'name')
          .field('turma.ano_censo', 'year')
+         .field('AVG(turma.num_matricula)', 'average')
+         .field('MEDIAN(turma.num_matricula)', 'median')
+         .field('STDDEV_POP(turma.num_matricula)', 'stddev')
+         .field('QUANTILE(turma.num_matricula, 0.25)', 'first_qt')
+         .field('QUANTILE(turma.num_matricula, 0.75)', 'third_qt')
          .from('turma')
          .group('turma.ano_censo')
          .order('turma.ano_censo')
@@ -444,10 +439,10 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
      }
      next();
 }, rqf.build(), query, addMissing(rqf), id2str.transform(), (req, res, next) => {
+  // Se possui apenas uma dimensão
   if(req.partial.length > 0) {
-    const classCount = averageCalc(req.partial);
-    const yearClassCount = averageCalc(req.result);
-    req.result = classCount;
+    const yearClassCount = req.result;
+    req.result = req.partial;
 
     // Adiciona os totais por anos ao fim da consulta
     // Como esse tipo de total é específico desse indicador, um label foi adicionado para indicar
@@ -458,10 +453,7 @@ classCountApp.get('/count', rqf.parse(), rqf.build(), (req, res, next) => {
       req.result.push(obj);
     })
   }
-  else {
-    const classCount = averageCalc(req.result);
-    req.result = classCount;
-  }
+  // Caso tenha mais de uma dimensão, retorna a consulta só pelas dimensões, sem linha de total (req.result)
   next();
 }, response('class_count'));
 
-- 
GitLab


From f0ab35d797528100b6fb443ecf1ff3dad0a719bd Mon Sep 17 00:00:00 2001
From: Fernando Erd <fce15@inf.ufpr.br>
Date: Mon, 3 Sep 2018 10:05:15 -0300
Subject: [PATCH 11/20] Fix filters in infrastructure indicator

---
 src/libs/routes/infrastructure.js | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/libs/routes/infrastructure.js b/src/libs/routes/infrastructure.js
index 290bf1a0..8b01e338 100644
--- a/src/libs/routes/infrastructure.js
+++ b/src/libs/routes/infrastructure.js
@@ -67,19 +67,26 @@ infrastructureApp.get('/rural_location', (req, res, next) => {
 }, response('rural_location'));
 
 infrastructureApp.get('/adm_dependency', (req, res, next) => {
-    req.sql.from('dependencia_adm')
-    .field('id')
-    .field('nome', 'name')
-    .where('id <= 4');
+    req.result = [];
+    for(let i = 1; i <= 4; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.admDependency(i)
+        });
+    };
     next();
-}, query, response('adm_dependency'));
+}, response('adm_dependency'));
 
 infrastructureApp.get('/adm_dependency_detailed', (req, res, next) => {
-    req.sql.from('dependencia_adm_priv')
-    .field('id', 'id')
-    .field('nome', 'name');
+    req.result = [];
+    for(let i = 1; i <= 6; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.admDependencyPriv(i)
+        });
+    };
     next();
-}, query, response('adm_dependency_detailed'));
+}, response('adm_dependency_detailed'));
 
 rqf.addField({
     name: 'filter',
-- 
GitLab


From 4e27f333d75fdbc64ef0dec82ba1eed4ee1a9bf2 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Mon, 3 Sep 2018 10:14:28 -0300
Subject: [PATCH 12/20] Change courtyard variable in school infrastructure

Related: simcaq/SCRUM#440
---
 src/libs/routes/schoolInfrastructure.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/libs/routes/schoolInfrastructure.js b/src/libs/routes/schoolInfrastructure.js
index c53a02af..0c617883 100644
--- a/src/libs/routes/schoolInfrastructure.js
+++ b/src/libs/routes/schoolInfrastructure.js
@@ -425,16 +425,16 @@ infrastructureApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     req.queryIndex.allCourtyard = req.queryIndex.allSchools;
 
     let haveCourtyard = allSchools.clone();
-    haveCourtyard.where('escola.patio_coberto = 1 OR escola.patio_descoberto = 1');
+    haveCourtyard.where('escola.patio = 2 OR escola.patio = 1');
     req.queryIndex.haveCourtyard = req.querySet.push(haveCourtyard) - 1;
 
     let needCourtyard = allSchools.clone();
-    needCourtyard.where('escola.patio_descoberto = 0 AND escola.patio_descoberto = 0');
+    needCourtyard.where('escola.patio = 1');
     req.queryIndex.needCourtyard = req.querySet.push(needCourtyard) - 1;
 
     // Cobertura do Pátio
     let allCourtyardCoverage = allSchools.clone();
-    allCourtyardCoverage.where('escola.patio_coberto=0 AND escola.patio_descoberto = 1');
+    allCourtyardCoverage.where('escola.patio = 1');
     req.queryIndex.allCourtyardCoverage = req.querySet.push(allCourtyardCoverage) - 1;
 
     req.queryIndex.haveCourtyardCoverage = req.queryIndex.allCourtyardCoverage;
-- 
GitLab


From 898dbff699994a9fdbd4d15a8c3fa512b69f64af Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Tue, 4 Sep 2018 10:56:22 -0300
Subject: [PATCH 13/20] [dailyChargeAmount]Data sent modification

---
 src/libs/routes/dailyChargeAmount.js | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js
index 33d914fc..b536eb00 100644
--- a/src/libs/routes/dailyChargeAmount.js
+++ b/src/libs/routes/dailyChargeAmount.js
@@ -382,11 +382,13 @@ dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
 
 dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next) => {
     var status = 0;
+
     if (('education_level_mod' in req.filter || 'education_level_mod' in req.dims)
     && ('integral_time' in req.filter)) {
         if (req.filter['integral_time'] == '0'
         && ('period' in req.filter)) {
-            if (req.filter['period'].length == 1
+            if (req.dims.size > 1) status = 2;
+            else if (req.filter['period'].length == 1
             && req.filter['period'][0] == '3') {
                 status = 1;
             } else if (req.filter['period'].length <= 2
@@ -396,11 +398,12 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
                 status = 1;
             }
         } else if (req.filter['integral_time'] == '1') {
-            status = 1;
+            if (req.dims.size > 1) status = 2;
+            else status = 1;
         }
     }
 
-    if (status) {
+    if (status == 1) {
         req.sql.from('turma')
         .field('turma.ano_censo', 'year')
         .field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id')
@@ -414,6 +417,16 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
         .order('turma.ano_censo')
         .order('turma.etapas_mod_ensino_segmento_id')
         .where('turma.tipo_turma_id <= 3')
+    } else if (status == 2) {
+        req.sql.from('turma')
+        .field('turma.ano_censo', 'year')
+        .field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id')
+        .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
+        .group('turma.ano_censo')
+        .group('turma.etapas_mod_ensino_segmento_id')
+        .order('turma.ano_censo')
+        .order('turma.etapas_mod_ensino_segmento_id')
+        .where('turma.tipo_turma_id <= 3')
     } else {
         res.status(400);
         next({
-- 
GitLab


From d9268ab225b5d100bccf012d724244c83fc96d14 Mon Sep 17 00:00:00 2001
From: Victor Picussa <vp16@inf.ufpr.br>
Date: Wed, 5 Sep 2018 09:58:28 -0300
Subject: [PATCH 14/20] Revert "[dailyChargeAmount]Data sent modification"

This reverts commit 898dbff699994a9fdbd4d15a8c3fa512b69f64af.
---
 src/libs/routes/dailyChargeAmount.js | 19 +++----------------
 1 file changed, 3 insertions(+), 16 deletions(-)

diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js
index b536eb00..33d914fc 100644
--- a/src/libs/routes/dailyChargeAmount.js
+++ b/src/libs/routes/dailyChargeAmount.js
@@ -382,13 +382,11 @@ dailyChargeAmountApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
 
 dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next) => {
     var status = 0;
-
     if (('education_level_mod' in req.filter || 'education_level_mod' in req.dims)
     && ('integral_time' in req.filter)) {
         if (req.filter['integral_time'] == '0'
         && ('period' in req.filter)) {
-            if (req.dims.size > 1) status = 2;
-            else if (req.filter['period'].length == 1
+            if (req.filter['period'].length == 1
             && req.filter['period'][0] == '3') {
                 status = 1;
             } else if (req.filter['period'].length <= 2
@@ -398,12 +396,11 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
                 status = 1;
             }
         } else if (req.filter['integral_time'] == '1') {
-            if (req.dims.size > 1) status = 2;
-            else status = 1;
+            status = 1;
         }
     }
 
-    if (status == 1) {
+    if (status) {
         req.sql.from('turma')
         .field('turma.ano_censo', 'year')
         .field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id')
@@ -417,16 +414,6 @@ dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next)
         .order('turma.ano_censo')
         .order('turma.etapas_mod_ensino_segmento_id')
         .where('turma.tipo_turma_id <= 3')
-    } else if (status == 2) {
-        req.sql.from('turma')
-        .field('turma.ano_censo', 'year')
-        .field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id')
-        .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration')
-        .group('turma.ano_censo')
-        .group('turma.etapas_mod_ensino_segmento_id')
-        .order('turma.ano_censo')
-        .order('turma.etapas_mod_ensino_segmento_id')
-        .where('turma.tipo_turma_id <= 3')
     } else {
         res.status(400);
         next({
-- 
GitLab


From cc90a6446a77cea4e8cdf2eb6febc04762929ed5 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fce15@inf.ufpr.br>
Date: Wed, 5 Sep 2018 11:30:59 -0300
Subject: [PATCH 15/20] Fix Pib per capita route

---
 src/libs/routes/pibpercapita.js | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/libs/routes/pibpercapita.js b/src/libs/routes/pibpercapita.js
index bfe2c4dd..aacebe6e 100644
--- a/src/libs/routes/pibpercapita.js
+++ b/src/libs/routes/pibpercapita.js
@@ -155,6 +155,7 @@ pibpercapitaApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
       .group('ibge_pib.ano_censo')
       .group('ibge_pib.pib_per_capita')
       .order('ibge_pib.ano_censo')
+      console.log("CiTy")
   } else  {
       req.sql.from('ibge_pib')
       .field('SUM(ibge_pib.pib)/SUM(ibge_pib.populacao)', 'total')
@@ -165,8 +166,14 @@ pibpercapitaApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
    next();
 }, query, (req, res, next) => {
      req.result.forEach((i) => {
-        let value = i.total;
+        let value = parseFloat(i.total);
+        let isnum = /^\d+$/.test(value);
+        if (isnum == true) {
+            value = value.toFixed(2)
+            console.log(value)
+        }
         // console.log(i.total);
+
         let res = value.toString().split(".");
         //rounding decimal.
         let decimal = Math.round(res[1].toString().substring(0,2) + (".") + res[1].toString().substring(2,3));
-- 
GitLab


From 88bc524fbd4c3baece7d983d36665e510ebe79a1 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Mon, 10 Sep 2018 09:55:45 -0300
Subject: [PATCH 16/20] Fix return string in contract type id 1

Related simcaq/SCRUM#491
---
 CHANGELOG.md                     | 3 +++
 src/libs/convert/contractType.js | 4 ++--
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a48b1fcd..2c4e3ec3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
 and this project adheres to [Semantic Versioning](http://semver.org/).
 
 ## UNRELEASED
+### Changed
+- Fix return string in contract type id 1
+
 ## 1.6.1 - 2018-08-23
 # Changed
 - Fix return json name in transport route
diff --git a/src/libs/convert/contractType.js b/src/libs/convert/contractType.js
index 6c9167ce..a20ab853 100644
--- a/src/libs/convert/contractType.js
+++ b/src/libs/convert/contractType.js
@@ -1,7 +1,7 @@
-module.exports = function idhmLevel(id) {
+module.exports = function contractType(id) {
     switch (id) {
         case 1:
-        return 'Concursado/Efetivo/Estavél';
+        return 'Concursado/Efetivo/Estável';
         case 2:
         return 'Contrato temporário';
         case 3:
-- 
GitLab


From eed07b4629616e14eba2bb08747fb83c652bdc0a Mon Sep 17 00:00:00 2001
From: Fernando Erd <fce15@inf.ufpr.br>
Date: Thu, 20 Sep 2018 10:30:25 -0300
Subject: [PATCH 17/20] Add route pib/transport

---
 src/libs/routes/pibpercapita.js |  9 ++++++++-
 src/libs/routes/transport.js    | 30 +++++++++++++++---------------
 2 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/src/libs/routes/pibpercapita.js b/src/libs/routes/pibpercapita.js
index bfe2c4dd..aacebe6e 100644
--- a/src/libs/routes/pibpercapita.js
+++ b/src/libs/routes/pibpercapita.js
@@ -155,6 +155,7 @@ pibpercapitaApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
       .group('ibge_pib.ano_censo')
       .group('ibge_pib.pib_per_capita')
       .order('ibge_pib.ano_censo')
+      console.log("CiTy")
   } else  {
       req.sql.from('ibge_pib')
       .field('SUM(ibge_pib.pib)/SUM(ibge_pib.populacao)', 'total')
@@ -165,8 +166,14 @@ pibpercapitaApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
    next();
 }, query, (req, res, next) => {
      req.result.forEach((i) => {
-        let value = i.total;
+        let value = parseFloat(i.total);
+        let isnum = /^\d+$/.test(value);
+        if (isnum == true) {
+            value = value.toFixed(2)
+            console.log(value)
+        }
         // console.log(i.total);
+
         let res = value.toString().split(".");
         //rounding decimal.
         let decimal = Math.round(res[1].toString().substring(0,2) + (".") + res[1].toString().substring(2,3));
diff --git a/src/libs/routes/transport.js b/src/libs/routes/transport.js
index 266b1400..449895d0 100644
--- a/src/libs/routes/transport.js
+++ b/src/libs/routes/transport.js
@@ -373,14 +373,14 @@ transportApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     // Vans e Kombi
     let goVansAndKombi = allTransports.clone();
     goVansAndKombi.field('matricula.transporte_vans_kombi','use_transport_id')
-    goVansAndKombi.where('matricula.transporte_vans_kombi = 1 OR matricula.transporte_vans_kombi = 0');
+    goVansAndKombi.where('matricula.transporte_vans_kombi = 1');
     goVansAndKombi.group('matricula.transporte_vans_kombi');
     req.queryIndex.goVansAndKombi = req.querySet.push(goVansAndKombi) - 1;
 
     // Micro
     let goMicroBus = allTransports.clone();
     goMicroBus.field('matricula.transporte_micro_onibus', 'use_transport_id')
-    goMicroBus.where('matricula.transporte_micro_onibus = 1 OR matricula.transporte_micro_onibus = 0');
+    goMicroBus.where('matricula.transporte_micro_onibus = 1');
     goMicroBus.group('matricula.transporte_micro_onibus');
     req.queryIndex.goMicroBus = req.querySet.push(goMicroBus) - 1;
 
@@ -388,63 +388,63 @@ transportApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     // Ônibus
     let goBus = allTransports.clone();
     goBus.field("matricula.transporte_onibus", 'use_transport_id')
-    goBus.where('matricula.transporte_onibus = 1 OR matricula.transporte_onibus = 0');
+    goBus.where('matricula.transporte_onibus = 1');
     goBus.group('matricula.transporte_onibus')
     req.queryIndex.goBus = req.querySet.push(goBus) - 1;
 
     // Bicicleta
     let goBikes = allTransports.clone();
     goBikes.field('matricula.transporte_bicicleta', 'use_transport_id')
-    goBikes.where('matricula.transporte_bicicleta = 1 OR matricula.transporte_bicicleta = 0');
+    goBikes.where('matricula.transporte_bicicleta = 1');
     goBikes.group('matricula.transporte_bicicleta')
     req.queryIndex.goBikes = req.querySet.push(goBikes) - 1;
 
     // Tração Animal
     let goAnimalTraction = allTransports.clone();
     goAnimalTraction.field('matricula.transporte_animal', 'use_transport_id')
-    goAnimalTraction.where('matricula.transporte_animal = 1 OR matricula.transporte_animal = 0');
+    goAnimalTraction.where('matricula.transporte_animal = 1');
     goAnimalTraction.group('matricula.transporte_animal')
     req.queryIndex.goAnimalTraction = req.querySet.push(goAnimalTraction) - 1;
 
     // Outro Veículo
     let goOtherVehicle = allTransports.clone();
     goOtherVehicle.field('matricula.transporte_outro', 'use_transport_id')
-    goOtherVehicle.where('matricula.transporte_outro = 1 OR matricula.transporte_outro = 0');
+    goOtherVehicle.where('matricula.transporte_outro = 1');
     goOtherVehicle.group('matricula.transporte_outro')
     req.queryIndex.goOtherVehicle = req.querySet.push(goOtherVehicle) - 1;
 
     // Aquaviário/ Embarcação (capacidade até 5 alunos)
     let goWaterway_5_Students = allTransports.clone();
     goWaterway_5_Students.field('matricula.transporte_embar_0_5','use_transport_id')
-    goWaterway_5_Students.where('matricula.transporte_embar_0_5 = 1 OR matricula.transporte_embar_0_5 = 0');
+    goWaterway_5_Students.where('matricula.transporte_embar_0_5 = 1');
     goWaterway_5_Students.group('matricula.transporte_embar_0_5')
     req.queryIndex.goWaterway_5_Students = req.querySet.push(goWaterway_5_Students) - 1;
 
     // Aquaviário/ Embarcação (capacidade de 5 até 15 alunos)
     let goWaterway_15_Students = allTransports.clone();
     goWaterway_15_Students.field('matricula.transporte_embar_5_15', 'use_transport_id')
-    goWaterway_15_Students.where('matricula.transporte_embar_5_15 = 1 OR matricula.transporte_embar_5_15 = 0');
+    goWaterway_15_Students.where('matricula.transporte_embar_5_15 = 1');
     goWaterway_15_Students.group('matricula.transporte_embar_5_15')
     req.queryIndex.goWaterway_15_Students = req.querySet.push(goWaterway_15_Students) - 1;
 
     // Aquaviário/ Embarcação (capacidade de 15 até 35 alunos)r
     let goWaterway_35_Students = allTransports.clone();
     goWaterway_35_Students.field('matricula.transporte_embar_15_35', 'use_transport_id')
-    goWaterway_35_Students.where('matricula.transporte_embar_15_35 = 1 OR matricula.transporte_embar_15_35 = 0');
+    goWaterway_35_Students.where('matricula.transporte_embar_15_35 = 1');
     goWaterway_35_Students.group('matricula.transporte_embar_15_35')
     req.queryIndex.goWaterway_35_Students = req.querySet.push(goWaterway_35_Students) - 1;
 
     // Aquaviário/ Embarcação (capacidade mais 35 alunos)
     let goWaterwayMoreThan_35 = allTransports.clone();
     goWaterwayMoreThan_35.field('matricula.transporte_embar_35', 'use_transport_id')
-    goWaterwayMoreThan_35.where('matricula.transporte_embar_35 = 1 OR matricula.transporte_embar_35 = 0');
+    goWaterwayMoreThan_35.where('matricula.transporte_embar_35 = 1');
     goWaterwayMoreThan_35.group('matricula.transporte_embar_35')
     req.queryIndex.goWaterwayMoreThan_35 = req.querySet.push(goWaterwayMoreThan_35) - 1;
 
     // Trêm / Metrô
     let goSubwayAndTrain = allTransports.clone();
     goSubwayAndTrain.field('matricula.transporte_trem_metro', 'use_transport_id')
-    goSubwayAndTrain.where('matricula.transporte_trem_metro = 1 OR matricula.transporte_trem_metro = 0');
+    goSubwayAndTrain.where('matricula.transporte_trem_metro = 1');
     goSubwayAndTrain.group('matricula.transporte_trem_metro')
     req.queryIndex.goSubwayAndTrain = req.querySet.push(goSubwayAndTrain) - 1;
 
@@ -463,8 +463,8 @@ transportApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     for (let i = 0; i < transport_match_0.length; i++) {
         transport_match_0[i].use_transport_id = true;
         transport_match.push(transport_match_0[i])
-        transport_match_1[i].use_transport_id = false;
-        transport_match.push(transport_match_1[i])
+        // transport_match_1[i].use_transport_id = false;
+        // transport_match.push(transport_match_1[i])
     }
 
     //modifica adicionando use_transport_id=false, com os mesmos valores
@@ -472,8 +472,8 @@ transportApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
     for (let i = 0; i < all_enrollment_match_0.length; i++) {
         all_enrollment_match_0[i].use_transport_id = true;
         all_enrollment_match.push(all_enrollment_match_0[i])
-        all_enrollment_match_1[i].use_transport_id = false;
-        all_enrollment_match.push(all_enrollment_match_1[i])
+        // all_enrollment_match_1[i].use_transport_id = false;
+        // all_enrollment_match.push(all_enrollment_match_1[i])
     }
 
     let public_transport = matchQueries(all_enrollment_match, req.result[req.queryIndex.allEnrollmentTransport]);
-- 
GitLab


From 300e4aec2216ba03a24bca05769d1ee3318433d0 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fce15@inf.ufpr.br>
Date: Thu, 20 Sep 2018 10:31:34 -0300
Subject: [PATCH 18/20] Remove logs

---
 src/libs/routes/pibpercapita.js | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/libs/routes/pibpercapita.js b/src/libs/routes/pibpercapita.js
index aacebe6e..59a74eaf 100644
--- a/src/libs/routes/pibpercapita.js
+++ b/src/libs/routes/pibpercapita.js
@@ -155,7 +155,6 @@ pibpercapitaApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
       .group('ibge_pib.ano_censo')
       .group('ibge_pib.pib_per_capita')
       .order('ibge_pib.ano_censo')
-      console.log("CiTy")
   } else  {
       req.sql.from('ibge_pib')
       .field('SUM(ibge_pib.pib)/SUM(ibge_pib.populacao)', 'total')
@@ -170,7 +169,6 @@ pibpercapitaApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
         let isnum = /^\d+$/.test(value);
         if (isnum == true) {
             value = value.toFixed(2)
-            console.log(value)
         }
         // console.log(i.total);
 
-- 
GitLab


From dcdf16631baa3b6dd7579f893bd5222160c3a88b Mon Sep 17 00:00:00 2001
From: Fernando Erd <fce15@inf.ufpr.br>
Date: Thu, 20 Sep 2018 10:33:43 -0300
Subject: [PATCH 19/20] Change population filter name

---
 src/libs/convert/citySize.js      |  2 +-
 src/libs/routes/infrastructure.js | 25 ++++++++++++++++---------
 src/libs/routes/population.js     |  2 +-
 3 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/src/libs/convert/citySize.js b/src/libs/convert/citySize.js
index 819eb150..3f50462b 100644
--- a/src/libs/convert/citySize.js
+++ b/src/libs/convert/citySize.js
@@ -1,7 +1,7 @@
 module.exports = function citySize(id) {
     switch (id) {
         case 1:
-        return 'até 5000';
+        return '0 - 5000';
         case 2:
         return '5001 - 10000';
         case 3:
diff --git a/src/libs/routes/infrastructure.js b/src/libs/routes/infrastructure.js
index 290bf1a0..8b01e338 100644
--- a/src/libs/routes/infrastructure.js
+++ b/src/libs/routes/infrastructure.js
@@ -67,19 +67,26 @@ infrastructureApp.get('/rural_location', (req, res, next) => {
 }, response('rural_location'));
 
 infrastructureApp.get('/adm_dependency', (req, res, next) => {
-    req.sql.from('dependencia_adm')
-    .field('id')
-    .field('nome', 'name')
-    .where('id <= 4');
+    req.result = [];
+    for(let i = 1; i <= 4; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.admDependency(i)
+        });
+    };
     next();
-}, query, response('adm_dependency'));
+}, response('adm_dependency'));
 
 infrastructureApp.get('/adm_dependency_detailed', (req, res, next) => {
-    req.sql.from('dependencia_adm_priv')
-    .field('id', 'id')
-    .field('nome', 'name');
+    req.result = [];
+    for(let i = 1; i <= 6; ++i) {
+        req.result.push({
+            id: i,
+            name: id2str.admDependencyPriv(i)
+        });
+    };
     next();
-}, query, response('adm_dependency_detailed'));
+}, response('adm_dependency_detailed'));
 
 rqf.addField({
     name: 'filter',
diff --git a/src/libs/routes/population.js b/src/libs/routes/population.js
index cd307cdb..f0402daa 100644
--- a/src/libs/routes/population.js
+++ b/src/libs/routes/population.js
@@ -41,7 +41,7 @@ populationApp.get('/years', (req, res, next) => {
 
 populationApp.get('/city_size', (req, res, next) => {
     req.result = [
-        {id: 1, name: "até 5000"},
+        {id: 1, name: "0 - 5000"},
         {id: 2, name: "5001 - 10000"},
         {id: 3, name: "10001 - 20000"},
         {id: 4, name: "20001 - 50000"},
-- 
GitLab


From 4344d1d71006d0bfbbb36783e1cb274a5e1e6108 Mon Sep 17 00:00:00 2001
From: Fernando Erd <fce15@inf.ufpr.br>
Date: Thu, 20 Sep 2018 10:58:15 -0300
Subject: [PATCH 20/20] Update changelog

---
 CHANGELOG.md | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4a5ddfd5..59101d98 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](http://keepachangelog.com/)
 and this project adheres to [Semantic Versioning](http://semver.org/).
 
+## 1.7.0 - 2018-09-20
+# Changed
+- Fix out of school route
+- Fix pib-per-capita route
+- Fix filters in infrastructure route
+- Remove filters in transport route
+
 ## 1.6.1 - 2018-08-23
 # Changed
 - Fix return json name in transport route
-- 
GitLab