diff --git a/CHANGELOG.md b/CHANGELOG.md index e45a014e419123986ad65d1f4d5a523166eb1cb5..05e1e145819b3536c8ec6fdf58db7c5444a238e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added - Add financial route - Add employees route - ### Changed - Fix transport route - Fix return where integral time is null +- Classroom count route returns school year results for education level 1 ## 1.7.0 - 2018-09-20 ### Changed diff --git a/src/libs/routes/classroomCount.js b/src/libs/routes/classroomCount.js index bdec29e54dca56e3f0eb71184e89645002edf0de..d28de14a3671b6cc0823491f853b2a403fe89030 100644 --- a/src/libs/routes/classroomCount.js +++ b/src/libs/routes/classroomCount.js @@ -163,8 +163,6 @@ classroomCountApp.post('/', rqf.parse(), (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); - if(classSize == null || integralTime == null) { res.statusCode = 400; return res.json({err: {message: "There was an error processing class_size or integral_time. Check your JSON sintax and be sure you're sending both paramenters."}}); @@ -197,7 +195,7 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => { if(id2str.schoolYear(i) !== id2str.schoolYear(99)) { let educationLevelId = Math.floor(i/10); - let classSize = req.classSize.find((el) => {return el.id === educationLevelId}); + let classSize = req.classSize.find((el) => {return el.id === educationLevelId || el.id === i}); let integralTime = req.integralTime.find((el) => {return el.id === educationLevelId}); let numberStudentClass = (typeof classSize !== 'undefined') ? classSize.numberStudentClass : null; @@ -286,6 +284,7 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => { let enrollmentMatch = true; j = 0; let educationLevelSet = new Set(); + let schoolYearSet = new Set(); let enrollment = enrollments[j]; while(enrollmentMatch && j < enrollments.length) { @@ -346,7 +345,11 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => { total_classrooms_needed: 0 } }; - + + if(enrollmentEducationLevel.id == 1) { + educationLevel.classes_school_year = []; + } + // Para manter a ordem da etapa de ensino if (location.education_level.length == 0) { location.education_level.push(educationLevel); @@ -375,20 +378,54 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => { educationLevel = location.education_level[k]; } + // Adiciona as séries da creche + let currentSchoolYear = null; + if(enrollmentEducationLevel.id == 1){ + let schoolYearHash = '' + enrollment.year + enrollment.city_id + enrollment.location_id + enrollment.school_year_id; + if(schoolYearSet.has(schoolYearHash)) { // Busca a série escolar + let k = 0; + let el = educationLevel.classes_school_year[k]; + while(k < educationLevel.classes_school_year.length) { + if(el.school_year_id != enrollment.school_year_id) { + ++k; + if(k < educationLevel.classes_school_year.length) el = educationLevel.classes_school_year[k]; + } else break; + } + if(k >= educationLevel.classes_school_year.length) --k; + currentSchoolYear = educationLevel.classes_school_year[k]; + } else { // Adiciona uma nova série escolar + let school_year = { + school_year_id: enrollment.school_year_id, + school_year_name: enrollment.school_year_name, + total_enrollment_day: 0, + total_enrollment_night: 0, + full_period_classes: 0, + day_classes: 0, + night_classes: 0, + total_classrooms_needed: 0 + } + schoolYearSet.add(schoolYearHash); + educationLevel.classes_school_year.push(school_year); + currentSchoolYear = school_year; + } + } + + let currentOfferGoal = enrollmentEducationLevel.offerGoal; + let currentNumberStudentClass = (enrollment.location_id == 1) ? enrollmentEducationLevel.numberStudentClass.urban : enrollmentEducationLevel.numberStudentClass.country; + // Soma os totais de matrÃcula da etapa de ensino educationLevel.enrollment.total_enrollment_day += (enrollment.period_id < 3 && enrollment.period_id != null) ? enrollment.total : 0; educationLevel.enrollment.total_enrollment_night += (enrollment.period_id == 3) ? enrollment.total : 0; // Calcula o número de turmas parcial // Turmas de perÃodo integral - educationLevel.enrollment.full_period_classes = Math.ceil((educationLevel.enrollment.total_enrollment_day * (enrollmentEducationLevel.offerGoal/100)) / enrollmentEducationLevel.numberStudentClass); + educationLevel.enrollment.full_period_classes = Math.ceil((educationLevel.enrollment.total_enrollment_day * (currentOfferGoal/100)) / currentNumberStudentClass); - // Turmas diurnas - // MatrÃculas diurnas - matrÃculas integrais - educationLevel.enrollment.day_classes = Math.ceil((educationLevel.enrollment.total_enrollment_day * (1 - enrollmentEducationLevel.offerGoal/100)) / enrollmentEducationLevel.numberStudentClass); + // Turmas diurnas (matrÃculas diurnas - matrÃculas integrais) + educationLevel.enrollment.day_classes = Math.ceil((educationLevel.enrollment.total_enrollment_day * (1 - currentOfferGoal/100)) / currentNumberStudentClass); // Turmas noturnas - educationLevel.enrollment.night_classes = Math.ceil((educationLevel.enrollment.total_enrollment_night / enrollmentEducationLevel.numberStudentClass)); + educationLevel.enrollment.night_classes = Math.ceil((educationLevel.enrollment.total_enrollment_night / currentNumberStudentClass)) || 0; // Total de salas educationLevel.enrollment.total_classrooms_needed = (educationLevel.enrollment.full_period_classes + educationLevel.enrollment.day_classes/2); @@ -397,6 +434,33 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => { educationLevel.enrollment.total_classrooms_needed = Math.ceil(educationLevel.enrollment.total_classrooms_needed); + // Faz os mesmos cálculos para a série escolar + if(currentSchoolYear) { + // Totais de matrÃcula + currentSchoolYear.total_enrollment_day += (enrollment.period_id < 3 && enrollment.period_id != null) ? enrollment.total : 0; + currentSchoolYear.total_enrollment_night += (enrollment.period_id == 3) ? enrollment.total : 0; + + // Número de turmas parcial + currentSchoolYear.full_period_classes = Math.ceil((currentSchoolYear.total_enrollment_day * (currentOfferGoal/100)) / currentNumberStudentClass); + + currentSchoolYear.day_classes = Math.ceil((currentSchoolYear.total_enrollment_day * (1 - currentOfferGoal/100)) / currentNumberStudentClass); + + currentSchoolYear.night_classes = Math.ceil((currentSchoolYear.total_enrollment_night / enrollmentEducationLevel.numberStudentClass)) || 0; + + // Total de salas + currentSchoolYear.total_classrooms_needed = (currentSchoolYear.full_period_classes + currentSchoolYear.day_classes/2); + + if(currentSchoolYear.night_classes > (currentSchoolYear.day_classes/2)) currentSchoolYear.total_classrooms_needed += (currentSchoolYear.night_classes - (currentSchoolYear.day_classes/2)); + + currentSchoolYear.total_classrooms_needed = Math.ceil(currentSchoolYear.total_classrooms_needed); + + function reducer(key) { return (sum, elem) => sum + elem[key]} + educationLevel.enrollment.full_period_classes = educationLevel.classes_school_year.reduce(reducer('full_period_classes'), 0); + educationLevel.enrollment.day_classes = educationLevel.classes_school_year.reduce(reducer('day_classes'), 0); + educationLevel.enrollment.night_classes = educationLevel.classes_school_year.reduce(reducer('night_classes'), 0); + educationLevel.enrollment.total_classrooms_needed = educationLevel.classes_school_year.reduce(reducer('total_classrooms_needed'), 0); + } + enrollment = enrollments[j]; } @@ -470,10 +534,11 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => { continue; } - // Fazer "merge" do array education_level + // Faz "merge" do array education_level + // Se a localidade atual não tem o vetor if(currentLocation.education_level.length == 0) { currentLocation.education_level = [...cityLocation.education_level]; - } else { + } else { // Caso já tenha, atualiza os valores let l = 0; while(l < cityLocation.education_level.length) { let cityEducation = cityLocation.education_level[l]; @@ -493,6 +558,42 @@ classroomCountApp.post('/', rqf.parse(), (req, res, next) => { currentEducation.enrollment.day_classes += cityEducation.enrollment.day_classes; currentEducation.enrollment.night_classes += cityEducation.enrollment.night_classes; currentEducation.enrollment.total_classrooms_needed += cityEducation.enrollment.total_classrooms_needed; + if((typeof cityEducation.classes_school_year !== 'undefined') && (typeof currentEducation.classes_school_year !== 'undefined')) { + let n = 0; + let o = 0; + let cityClass = null; + let currentClass = null; + while((typeof cityClass !== 'undefined') && (typeof currentClass !== 'undefined')) { + cityClass = cityEducation.classes_school_year[o]; + currentClass = currentEducation.classes_school_year[n]; + + // Se a série escolar é menor que a atual, ela não está no vetor, pois o vetor está ordenado e tem range limitado + if(cityClass.school_year_id < currentClass.school_year_id) { + currentEducation.classes_school_year.splice(n, 0, cityClass); + cityClass = cityEducation.classes_school_year[++o]; + continue; + } else if(cityClass.school_year_id > currentClass.school_year_id) { + currentClass = currentEducation.classes_school_year[++n]; + // Se o ano escolar da cidade é maior que a localidade do objeto atual E o vetor de ano escolar do objeto atual + // acaba, então este ano escolar falta no objeto atual, pois os anos escolares estão ordenados + if(typeof currentClass == 'undefined' && typeof cityClass !== 'undefined') { + currentEducation.classes_school_year[n] = cityClass; + currentClass = currentEducation.classes_school_year[n]; + } + continue; + } + + currentClass.total_enrollment_day += cityClass.total_enrollment_day; + currentClass.total_enrollment_night += cityClass.total_enrollment_night; + currentClass.full_period_classes += cityClass.full_period_classes; + currentClass.day_classes += cityClass.day_classes; + currentClass.night_classes += cityClass.night_classes; + currentClass.total_classrooms_needed += cityClass.total_classrooms_needed; + + cityClass = cityEducation.classes_school_year[++o]; + } + + } } else { if(currentEducation.education_level_short_id < cityEducation.education_level_short_id) { currentLocation.education_level.splice(++m, 0, cityEducation);