Commit 28a0eb40 authored by D’jalmar Gutierrez Titirico's avatar D’jalmar Gutierrez Titirico 🚲

se agrego la funcionalidad de autocalcular las calficaciones agrupadas por etapa

parent 0ac54162
(()=> {
'use strict';
class CalificacionService {
constructor($resource, appConfig) {
this.resource = $resource(appConfig.serverAddress + '/api/calificaciones/:id', {id: '@_id'}, {
update: {method: 'PUT'},
query: {isArray: false}
})
}
calificaciones(parametros) {
return this.resource.query(parametros).$promise;
}
calificacion(id, parametros = {}) {
parametros.id = id;
return this.resource.get(parametros).$promise;
}
crear(calificacion) {
return this.resource.save(calificacion).$promise;
}
editar(id, calificacion) {
return this.resource.update({id: id}, calificacion).$promise;
}
eliminar(id) {
return this.resource.remove({id: id}).$promise;
}
}
angular.module('moduloPersonalApp')
.service('CalificacionService', CalificacionService);
})();
(()=> {
'use strict';
class CalificacionCrearModalController {
constructor($uibModalInstance, parametros, CalificacionService) {
this.errores = {};
this.enviado = false;
this.modal = $uibModalInstance;
this.service = CalificacionService;
if (parametros.evaluacion.Calificacion._id) {
this.evaluacion = Object.assign({}, parametros.evaluacion);
this.evaluacionInicial = parametros.evaluacion;
}
else
this.evaluacion = parametros.evaluacion;
}
guardar(form) {
this.enviado = true;
if (form.$valid) {
if (!this.evaluacion.Calificacion._id) {
this.service.crear(this.evaluacion.Calificacion)
.then(calificacion=> {
this.modal.close(calificacion)
})
.catch(err=> {
this.errores.otros = err.data.message || err;
})
}
else {
this.service.editar(this.evaluacionInicial.Calificacion._id, this.evaluacion.Calificacion)
.then(calificacion=> {
this.modal.close(calificacion)
})
.catch(err=> {
this.errores.otros = err.data.message || err;
})
}
}
}
}
angular.module('moduloPersonalApp')
.controller('CalificacionCrearModalCtrl', CalificacionCrearModalController)
})();
<form class="form" name="form" ng-submit="vm.guardar(form)" novalidate>
<div class="modal-header modal-header-primary">
<button type="button" ng-click="vm.modal.dismiss()" class="close">&times;</button>
<h4 class="modal-title">Evaluación</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="text-right" title="Evaluación">
<i class="fa fa-check-square-o fa-lg" title="Evaluacion"></i>
{{vm.evaluacion.nombre}} &nbsp;&nbsp;&nbsp;
</div>
</div>
<div class="row">
<div class="col-md-12">
<label>Calificación</label>
<input type="number" name="valor" class="form-control" ng-model="vm.evaluacion.Calificacion.valor" max="100"
required autofocus>
<p class="help-block" ng-show="form.valor.$error.required && vm.enviado">
Ingrese una calificación
</p>
<p class="help-block" ng-show="form.valor.$error.max">
El valor maximo es 100
</p>
</div>
</div>
<div class="form-group has-error">
<p class="help-block">{{ vm.errores.otros}}</p>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-primary-outline" type="submit"
ng-disabled="!(form.valor.$dirty ) || form.$invalid">
Guardar
</button>
<button class="btn btn-default" type="button" ng-click="vm.modal.dismiss()">Cancelar</button>
</div>
</form>
......@@ -26,6 +26,15 @@
this.cargosConvocatoria = respuesta;
});
}
eliminar(cargoConvocatoria) {
this.Modal.confirm.eliminar(cargoConvocatoria=> {
this.service.eliminar(cargoConvocatoria._id).then(()=> {
this.cargosConvocatoria.rows.splice(this.cargosConvocatoria.rows.indexOf(cargoConvocatoria), 1);
this.alertas.push({tipo: 'danger', mensaje: 'La relación con el cargo se elimino correctamente'});
});
})('la relación con el cargo: ' + cargoConvocatoria.Cargo.nombre, cargoConvocatoria);
}
}
angular.module('moduloPersonalApp')
.controller('CargoConvocatoriaCtrl', CargoConvocatoriaController);
......
......@@ -26,11 +26,12 @@
<td>{{cargo.Cargo.nombre}}</td>
<td class="text-right">
<div class="btn-group" role="group">
<a class="btn btn-info-outline btn-xs" href="#" role="button"
ui-sref="cargos.editar({cargoId:cargo._id})">
<a class="btn btn-info-outline btn-xs" role="button"
ui-sref="cargos.editar({cargoId:cargo._id})" ng-click="$event.stopPropagation()">
<i class="fa fa-edit fa-lg"></i>
</a>
<a class="btn btn-danger-outline btn-xs" href="#" role="button" ng-click="vm.eliminar(cargo)">
<a class="btn btn-danger-outline btn-xs" role="button"
ng-click="vm.eliminar(cargo);$event.stopPropagation()">
<i class="fa fa-trash fa-lg"></i>
</a>
</div>
......
......@@ -28,6 +28,10 @@
return this.resource.get(parametros).$promise
}
eliminar(id) {
return this.resource.remove({id: id}).$promise;
}
postulaciones(id, parametros = {}) {
parametros.id = id;
return this.resource.postulaciones(parametros).$promise;
......
......@@ -17,7 +17,6 @@
console.log(cargoConvocatoria);
this.cargoConvocatoria = cargoConvocatoria;
})
}
}
angular.module('moduloPersonalApp')
......
......@@ -64,6 +64,15 @@
})
}
eliminar(etapa) {
this.Modal.confirm.eliminar(etapa=> {
this.service.eliminar(etapa._id).then(()=> {
this.etapas.rows.splice(this.etapas.rows.indexOf(etapa), 1);
this.alertas.push({tipo: 'danger', mensaje: 'La etapa se elimino correctamente'});
});
})(etapa.nombre, etapa);
}
cambioOrden(e) {
console.log(e);
e.source.nodesScope.$parent.vm.actualizarOrden(e.source.index, e.dest.index);
......
......@@ -25,6 +25,10 @@
editar(id, etapa) {
return this.resource.update({id: id}, etapa).$promise;
}
eliminar(id) {
return this.resource.remove({id: id}).$promise;
}
}
angular.module('moduloPersonalApp')
......
......@@ -35,6 +35,30 @@
})
}
editar(evaluacion) {
this.modal.open({
templateUrl: 'app/evaluaciones/modals/evaluaciones.modal.html',
controller: 'EvaluacionEditarModalCtrl',
controllerAs: 'vm',
resolve: {parametros: {evaluacion: evaluacion}}
}).result.then(evl=> {
evaluacion = Object.assign(evaluacion, evl);
this.alertas.push({
tipo: 'success',
mensaje: 'Se edito correctamente la evaluación ' + evaluacion.nombre
});
})
}
eliminar(evaluacion) {
this.Modal.confirm.eliminar(evaluacion=> {
this.service.eliminar(evaluacion._id).then(()=> {
this.evaluaciones.rows.splice(this.evaluaciones.rows.indexOf(evaluacion), 1);
this.alertas.push({tipo: 'danger', mensaje: 'La evaluación se elimino correctamente'});
});
})(evaluacion.nombre, evaluacion);
}
cambiarPagina() {
let parametros = {pagina: this.paginaActual, elementos: 10};
this.convocatoriaService.evaluaciones(this.convocatoriaId, parametros)
......
......@@ -34,12 +34,12 @@
<td>{{evaluacion.nombre}}</td>
<td class="text-right">
<div class="btn-group" role="group">
<a class="btn btn-primary-outline btn-xs" role="button"
ng-click="vm.editar(convocatoria);$event.stopPropagation();">
<a class="btn btn-info-outline btn-xs" role="button"
ng-click="vm.editar(evaluacion);$event.stopPropagation();">
<i class="fa fa-edit fa-lg"></i>
</a>
<a class="btn btn-danger-outline btn-xs" role="button"
ng-click="vm.eliminar(convocatoria);$event.stopPropagation();">
ng-click="vm.eliminar(evaluacion);$event.stopPropagation();">
<i class="fa fa-trash fa-lg"></i>
</a>
</div>
......
......@@ -25,6 +25,11 @@
editar(id, evaluacion) {
return this.resource.update({id: id}, evaluacion).$promise;
}
eliminar(id) {
return this.resource.remove({id: id}).$promise;
}
}
angular.module('moduloPersonalApp')
......
......@@ -8,7 +8,6 @@
this.modal = $uibModalInstance;
this.convocatoriaId = parametros.convocatoriaId;
this.etapas = parametros.etapas; // TODO validar con el porcentaje total de las otras etapas, esta validacion tambien se debe realizar en el servidor
this.service = EvaluacionService;
......
'use strict';
(()=> {
class EvaluacionEditarModalController {
constructor($uibModalInstance, parametros, EvaluacionService) {
this.enviado = false;
this.errores = {};
this.modal = $uibModalInstance;
this.evaluacionInicial = parametros.evaluacion;
this.service = EvaluacionService;
this.evaluacion = Object.assign({}, this.evaluacionInicial);
}
guardar(form) {
this.enviado = true;
if (form.$valid) {
this.service.editar(this.evaluacionInicial._id, this.evaluacion)
.then(evaluacion=> {
this.modal.close(evaluacion);
})
.catch(err => {
this.errores.otros = err.data.message;
});
}
}
}
angular.module('moduloPersonalApp')
.controller('EvaluacionEditarModalCtrl', EvaluacionEditarModalController);
})();
......@@ -38,6 +38,8 @@
})
}
guardar() {
var evaluacionesCargosEtapas = [];
this.etapas.rows.forEach(etapa=> {
......
......@@ -39,6 +39,15 @@
})
}
eliminar(postulacion) {
this.Modal.confirm.eliminar(postulacion=> {
this.service.eliminarPostulacion(postulacion.Postulaciones.filter(x=>x.Postulacion.fk_cargo_convocatoria == this.cargoConvocatoriaId)[0].Postulacion._id).then(()=> {
this.postulaciones.rows.splice(this.postulaciones.rows.indexOf(postulacion), 1);
this.alertas.push({tipo: 'danger', mensaje: 'La postulación se elimino correctamente'});
});
})('la postulación de: ' + postulacion.nombres + ' ' + postulacion.apellidos, postulacion);
}
formatearTags() {
this.tagsBusqueda = [];
this.tagsSeleccionados.forEach(tag=> {
......@@ -76,7 +85,7 @@
elementos: 10,
ordenarPor: this.ordenarPor,
orden: this.ordenDescendente,
incluye: [{entidad: 'Cargos'}, {entidad: 'Evaluaciones'}]
incluye: [{entidad: 'Cargos'}, {entidad: 'Evaluaciones'}, {entidad: 'Postulaciones'}]
};
if (this.tagsSeleccionados.length > 0) {
parametros.incluye = [{entidad: 'Tags', buscar: this.tagsBusqueda}]
......@@ -102,28 +111,38 @@
this.existeRelacionLaboral = postulacion.contratado ? true : this.existeRelacionLaboral;
});
this.cargoConvocatoria.Etapas.sort((a, b)=>a.orden - b.orden);
console.log(this.cargoConvocatoria.Etapas);
this.cargoConvocatoria.Etapas.forEach(etapa=> {
//obtenermos las evaluaciones de cada etapa
etapa.Evaluaciones = this.cargoConvocatoria.Evaluaciones.filter(x=>x.EvaluacionCargoEtapa.fk_etapa == etapa._id);
this.postulaciones.rows.forEach(postulante=> {
var etapaPostulante = Object.assign({}, etapa);
postulante.Etapas = Array.isArray(postulante.Etapas) ? postulante.Etapas : [];
//obtenermos las evaluaciones del postulante relacionadas a la etapa
etapaPostulante.Evaluaciones = postulante.Evaluaciones.filter(x=>etapa.Evaluaciones.filter(y=>y._id == x._id).length > 0);
//obtenemos la suma de las calificaciones
etapaPostulante.calificacion = etapaPostulante.Evaluaciones.length > 0 ?
etapaPostulante.Evaluaciones.map(evaluacion=>parseInt(evaluacion.Calificacion.valor)).reduce((a, b)=>a + b) : 0;
postulante.Etapas.push(etapaPostulante);
postulante.total = postulante.total > -1 ? postulante.total + etapaPostulante.calificacion : etapaPostulante.calificacion;
})
});
this.postulaciones.rows.sort((a, b)=>b.total - a.total)
console.log(this.postulaciones.rows);
this.calcularNotas();
})
}
calcularNotas() {
this.postulaciones.rows.forEach(postulante=> {
postulante.Etapas = [];
postulante.total = 0;
this.cargoConvocatoria.Etapas.forEach(etapa=> {
var etapaPostulante = Object.assign({}, etapa);
etapaPostulante.Evaluaciones = this.cargoConvocatoria.Evaluaciones.filter(x=>x.EvaluacionCargoEtapa.fk_etapa == etapa._id);
etapa.Evaluaciones = etapaPostulante.Evaluaciones;
var evaluaciones = postulante.Evaluaciones.filter(x=>etapaPostulante.Evaluaciones.filter(y=>y._id == x._id).length > 0);
etapaPostulante.Evaluaciones.forEach(evaluacion=> {
var evaluacionEncontrada = evaluaciones.filter(x=>x.Calificacion.fk_evaluacion == evaluacion._id);
evaluacion.Calificacion = evaluacionEncontrada.length == 0 ? {
valor: 0,
fk_persona: postulante._id,
fk_evaluacion: evaluacion._id
} : evaluacionEncontrada[0].Calificacion;
});
etapaPostulante.calificacion = etapaPostulante.Evaluaciones.length > 0 ?
etapaPostulante.Evaluaciones.map(evaluacion=>parseInt(evaluacion.Calificacion.valor)).reduce((a, b)=>a + b) : 0;
etapaPostulante.calificacion = Math.round((etapaPostulante.calificacion / etapaPostulante.Evaluaciones.length) * (etapaPostulante.porcentaje / 100));
postulante.total += etapaPostulante.calificacion;
var x = JSON.stringify(etapaPostulante);
postulante.Etapas.push(JSON.parse(x));
});
});
this.postulaciones.rows.sort((a, b)=>b.total - a.total)
}
ordenar(campo) {
this.ordenDescendente = campo != this.ordenarPor ? false : !this.ordenDescendente;
this.ordenarPor = campo;
......@@ -140,10 +159,34 @@
this.alertas.push({
tipo: 'success',
mensaje: 'Se creo la relación laboral con el postulante: ' + postulante.nombres + " " + postulante.apellidos
})
});
this.cambiarPagina();
})
}
editarCalificacion(evaluacion, postulacion) {
evaluacion.Calificacion.valor = parseInt(evaluacion.Calificacion.valor);
this.modal.open({
templateUrl: 'app/calificaciones/modals/calificaciones.modal.html',
controller: 'CalificacionCrearModalCtrl',
controllerAs: 'vm',
resolve: {parametros: {evaluacion: evaluacion}}
}).result.then(cal=> {
cal.valor = parseInt(cal.valor);
console.log(cal);
evaluacion.Calificacion = Object.assign(evaluacion.Calificacion, cal);
var evaluacionEncontrada = postulacion.Evaluaciones.filter(x=>x._id == evaluacion._id)[0];
if (!evaluacionEncontrada)
postulacion.Evaluaciones.push(evaluacion);
else
evaluacionEncontrada.Calificacion = Object.assign(evaluacionEncontrada.Calificacion, cal);
this.calcularNotas();
this.alertas.push({
tipo: 'success',
mensaje: 'Se modifico correctamente la calficación de la evaluación: ' + evaluacion.nombre
});
})
}
}
angular.module('moduloPersonalApp')
.controller('PostulacionCtrl', PostulacionController);
......
......@@ -39,19 +39,46 @@
<table class="table table-striped">
<thead>
<tr>
<th>Nombres y Apellidos</th>
<th ng-repeat="etapa in vm.cargoConvocatoria.Etapas"> {{etapa.nombre}}</th>
<th>Total</th>
<th class="text-right">Opciones</th>
<th rowspan="2">Nombres y Apellidos</th>
<th ng-repeat="etapa in vm.cargoConvocatoria.Etapas" colspan="{{etapa.Evaluaciones.length}}"
class="text-center">
{{etapa.nombre}}
<small>{{etapa.porcentaje}} %</small>
</th>
<th rowspan="2">Total</th>
<th rowspan="2" class="text-right">Opciones</th>
</tr>
<tr>
<!--<th ng-repeat="evaluacion in vm.cargoConvocatoria.Evaluaciones" class="text-center">-->
<!--<label>{{evaluacion.nombre}}</label>-->
<!--</th>-->
<th ng-repeat="etapa in vm.cargoConvocatoria.Etapas" colspan="{{etapa.Evaluaciones.length}}">
<table class="table" style="background-color: transparent;margin-bottom: 0">
<tr>
<td ng-repeat="evaluacion in etapa.Evaluaciones" class="text-center"
style="padding: 0;width: {{100/etapa.Evaluaciones.length}}%;border-top:0;">
{{evaluacion.nombre}}
</td>
</tr>
</table>
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="postulacion in vm.postulaciones.rows" ng-class="{success:postulacion.contratado}"
ng-show="postulacion.Cargos.length == 0 || postulacion.contratado">
<td>{{postulacion.nombres}}, {{postulacion.apellidos}}</td>
<td ng-repeat="etapa in postulacion.Etapas"
<td ng-repeat="etapa in postulacion.Etapas" colspan="{{etapa.Evaluaciones.length}}"
ng-class="{danger:etapa.calificacion <etapa.porcentajeMinimo,success:etapa.calificacion >=etapa.porcentajeMinimo}">
{{etapa.calificacion}}
<table class="table" style="background-color: transparent;margin-bottom: 0">
<tr>
<td ng-repeat="evaluacion in etapa.Evaluaciones" class="text-center"
style="padding: 0;width: {{100/etapa.Evaluaciones.length}}%;border-top:0;"
ng-click="vm.editarCalificacion(evaluacion, postulacion)">
{{evaluacion.Calificacion.valor}}
</td>
</tr>
</table>
</td>
<td>{{postulacion.total}}</td>
<td class="text-right">
......
......@@ -75,7 +75,9 @@
<script src="components/autenticacion/autenticacion.module.js"></script>
<script src="components/modal/modal.module.js"></script>
<script src="components/util/util.module.js"></script>
<script src="app/main/main.controller.js"></script>
<script src="app/gruposConvocatoria/modals/gruposConvocatoria.editar.modal.controller.js"></script>
<script src="app/cargos/cargos.js"></script>
<script src="app/cargos/cargos.service.js"></script>
<script src="app/cargos/editar/cargos.editar.controller.js"></script>
<script src="app/cargos/modals/cargos.crear.modal.controller.js"></script>
<script src="app/cargos/modals/cargos.editar.modal.controller.js"></script>
......@@ -118,6 +120,7 @@
<script src="app/evaluaciones/evaluaciones.js"></script>
<script src="app/evaluaciones/evaluaciones.service.js"></script>
<script src="app/evaluaciones/modals/evaluaciones.crear.modal.controller.js"></script>
<script src="app/evaluaciones/modals/evaluaciones.editar.modal.controller.js"></script>
<script src="app/evaluacionesCargosEtapas/evaluacionesCargosEtapas.controller.js"></script>
<script src="app/evaluacionesCargosEtapas/evaluacionesCargosEtapas.js"></script>
<script src="app/evaluacionesCargosEtapas/evaluacionesCargosEtapas.service.js"></script>
......@@ -126,8 +129,8 @@
<script src="app/gruposConvocatoria/gruposConvocatoria.js"></script>
<script src="app/gruposConvocatoria/gruposConvocatoria.service.js"></script>
<script src="app/gruposConvocatoria/modals/gruposConvocatoria.crear.modal.controller.js"></script>
<script src="app/gruposConvocatoria/modals/gruposConvocatoria.editar.modal.controller.js"></script>
<script src="app/cargos/cargos.controller.js"></script>
<script src="app/calificaciones/calificaciones.service.js"></script>
<script src="app/main/main.controller.js"></script>
<script src="app/main/main.js"></script>
<script src="app/oficinas/editar/oficinas.editar.controller.js"></script>
<script src="app/oficinas/modals/oficina.entidad.crear.modal.controller.js"></script>
......@@ -175,13 +178,13 @@
<script src="components/autenticacion/interceptor.service.js"></script>
<script src="components/autenticacion/router.decorator.js"></script>
<script src="components/footer/footer.directive.js"></script>
<script src="app/cargos/cargos.js"></script>
<script src="app/calificaciones/modals/calificaciones.crear.modal.controller.js"></script>
<script src="components/navbar/navbar.controller.js"></script>
<script src="components/navbar/navbar.directive.js"></script>
<script src="components/organigrama/framework/jquery.orgchart.js"></script>
<script src="components/organigrama/organigrama.controller.js"></script>
<script src="components/organigrama/organigrama.directive.js"></script>
<script src="app/cargos/cargos.service.js"></script>
<script src="app/cargos/cargos.controller.js"></script>
<script src="components/util/util.service.js"></script>
<!-- endinjector -->
<!-- endbuild -->
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment