Commit 39ea9ede authored by D’jalmar Gutierrez Titirico's avatar D’jalmar Gutierrez Titirico 🚲

Merge branch 'iss5589-correccion-bugs-proceso-convocatoria' into 'desarrollo'

#31 se agregaron cambios al manejo de las convocatorias y las relaciones laborales



See merge request !44
parents 6db81d48 d923b92e
<div class="container">
<div ui-view></div>
<div ui-view="cargoConvocatoria"></div>
<div ui-view="cargo"></div>
<div ui-view="convocatorias"></div>
<div ui-view="contratos"></div>
<div ui-view="relacionesLaborales"></div>
</div>
......@@ -22,11 +22,24 @@ angular.module('moduloPersonalApp')
url: '/personas',
templateUrl: 'app/postulaciones/postulaciones.cargo.html'
})
.state('cargos.editar',{
url:'/:cargoId/editar',
templateUrl:'app/cargos/editar/cargos.editar.html',
controller:'CargoEditarCtrl',
controllerAs:'vm'
.state('cargos.editar', {
url: '/:cargoId/editar',
views: {
'cargo': {
templateUrl: 'app/cargos/editar/cargos.editar.html',
controller: 'CargoEditarCtrl',
controllerAs: 'vm'
},
'convocatorias': {
templateUrl: 'app/convocatorias/convocatorias.lista.html',
controller: 'ConvocatoriaCtrl',
controllerAs: 'vm'
},
'relacionesLaborales': {
templateUrl: 'app/relacionesLaborales/relacionesLaborales.lista.html',
controller: 'RelacionLaboralCtrl',
controllerAs: 'vm'
}
}
})
});
......@@ -26,12 +26,12 @@
<thead>
<tr>
<th>Nombre del cargo</th>
<th colspan="2" ng-show="!vm.grupoId">Opciones</th>
<th colspan="2">Opciones</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="cargo in vm.cargos"
ui-sref="entidades.convocatorias.cargosConvocatoria.editar({entidadId:vm.entidadId,convocatoriaId:vm.convocatoriaId,cargoConvocatoriaId:cargo._id})">
ui-sref="cargos.editar({cargoId:cargo._id})">
<td>{{cargo.nombre}} <label class="label label-warning" ng-show="cargo.Contratos">Ocupado</label></td>
<td ng-show="!vm.grupoId">
<div class="btn-group" role="group">
......
......@@ -16,12 +16,12 @@
convocatorias: {
method: 'GET',
url: appConfig.serverAddress + '/api/cargos/:id/convocatorias',
isArray: true
isArray: false
},
relacionesLaborales: {
method: 'GET',
url: appConfig.serverAddress + '/api/cargos/:id/relacionesLaborales',
isArray: true
isArray: false
}
})
}
......@@ -59,8 +59,9 @@
return this.resource.convocatorias({id: id}).$promise;
}
relacionesLaborales(id) {
return this.resource.relacionesLaborales({id: id}).$promise;
relacionesLaborales(id, parametros = {}) {
parametros.id = id;
return this.resource.relacionesLaborales(parametros).$promise;
}
}
......
......@@ -16,13 +16,13 @@
this.cargoService.getCargo(this.id)
.then(cargo=> {
this.cargoConvocatoria = cargo;
this.cargo = cargo;
return this.tipoCargoService.tiposCargo()
})
.then(tiposCargo=> {
console.log(tiposCargo);
this.tiposCargo = tiposCargo;
this.tipoCargo = this.tiposCargo.rows.find(x=>x._id == this.cargoConvocatoria.fk_tipo_cargo)
this.tipoCargo = this.tiposCargo.rows.find(x=>x._id == this.cargo.fk_tipo_cargo)
})
}
......@@ -35,7 +35,7 @@
.then(cargo=> {
form[campo].$dirty = false;
this.enviado = false;
this.cargoConvocatoria[campo] = cargo[campo];
this.cargo[campo] = cargo[campo];
})
.catch(error => {
this.errores.other = error.message;
......
......@@ -20,7 +20,7 @@
}
cambiarPagina() {
let parametros = {pagina: this.paginaActual, elementos: 15, incluye: [{entidad: 'Cargo'}]}
let parametros = {pagina: this.paginaActual, elementos: 10, incluye: [{entidad: 'Cargo'}]}
this.convocatoriaService.cargosConvocatoria(this.convocatoriaId, parametros)
.then(respuesta=> {
this.cargosConvocatoria = respuesta;
......
......@@ -18,7 +18,7 @@
<thead>
<tr>
<th>Nombre del cargo</th>
<th colspan="2" ng-show="!vm.grupoId">Opciones</th>
<th colspan="2">Opciones</th>
</tr>
</thead>
<tbody>
......
......@@ -18,8 +18,9 @@
return this.resource.get(parametros).$promise
}
postulaciones(id) {
return this.resource.postulaciones({id: id}).$promise;
postulaciones(id, parametros = {}) {
parametros.id = id;
return this.resource.postulaciones(parametros).$promise;
}
}
......
<div>
<div class="row">
<div class="col-sm-5 col-md-4 col-xs-6">
<h3>Editar Cargo</h3>
<h3>Cargo - Convocatoria</h3>
</div>
<div class="col-sm-5 col-md-4 col-sm-offset-2">
<div class="pull-right">
......@@ -27,13 +27,14 @@
<input type="text" name="nombre" class="form-control" ng-model="vm.cargoConvocatoria.Cargo.nombre"
placeholder="Nombre de cargo" required>
<span class="input-group-btn">
<button type="button" class="btn btn-primary-outline" ng-click="vm.guardarCargo(form,'nombre')"
ng-disabled="!form.nombre.$dirty"><i class="fa fa-save"></i></button>
<button type="button" class="btn btn-primary-outline" ui-sref="cargos.editar({cargoId:vm.cargoConvocatoria.fk_cargo})">
Ir al cargo
<i class="fa fa-lg fa-arrow-right"></i>
</button>
</span>
</div>
</div>
</div>
</div>
<div class="form-group has-error">
<p class="help-block"
ng-show="(form.nombre.$error.required) && vm.enviado">
......
(()=> {
'use strict';
class RelacionLaboralController {
constructor($stateParams, $uibModal, Modal, EntidadService, cargoService, ContratacionService) {
this.errores = {}; // lista de errores
this.modal = $uibModal;
this.Modal = Modal;
this.alertas = [];
this.entidadId = $stateParams.entidadId;
this.entidadService = EntidadService;
this.cargoService = cargoService;
this.service = ContratacionService;
if ($stateParams.cargoId)
this.cargoId = $stateParams.cargoId;
this.paginaActual = 1;
this.cambiarPagina();
}
cambiarPagina() {
let parametros = {
pagina: this.paginaActual, elementos: 10, ordenarPor: 'nombre', incluye: [{entidad: 'Persona'}]
};
if (this.cargoId
) {
this.cargoService.relacionesLaborales(this.cargoId, parametros)
.then(relacionesLaborales=> {
this.relacionesLaborales = relacionesLaborales;
})
}
}
// crear() {
// this.modal.open({
// templateUrl: 'app/convocatorias/modals/convocatorias.modal.html',
// controller: 'ConvocatoriaCrearModalCtrl',
// controllerAs: 'vm',
// resolve: {parametro: {entidadId: this.entidadId}}
// }).result.then(convocatoria=> {
// this.alertas.push({
// tipo: 'success',
// mensaje: 'Se creo correctamente la convocatoria ' + convocatoria.descripcion
// });
// this.convocatorias.rows.push(convocatoria);
// this.convocatorias.count += 1;
// })
// }
//
// editar(convocatoria) {
// this.modal.open({
// templateUrl: 'app/convocatorias/modals/convocatorias.modal.html',
// controller: 'ConvocatoriaEditarModalCtrl',
// controllerAs: 'vm',
// resolve: {parametro: {entidadId: this.entidadId, convocatoria: convocatoria}}
// }).result.then(convocatoria=> {
// this.alertas.push({
// tipo: 'success',
// mensaje: 'Se edito correctamente la convocatoria ' + convocatoria.descripcion
// });
// })
// }
//
// eliminar(convocatoria) {
// this.Modal.confirm.eliminar(convocatoria=> {
// this.service.eliminar(convocatoria._id).then(()=> {
// this.convocatorias.rows.splice(this.convocatorias.rows.indexOf(convocatoria), 1);
// this.alertas.push({tipo: 'danger', mensaje: 'La convocatoria se elimino correctamente'});
// });
// })(convocatoria.descripcion, convocatoria);
// }
}
angular
.module(
'moduloPersonalApp'
)
.controller(
'RelacionLaboralCtrl'
,
RelacionLaboralController
)
;
})();
'use strict';
describe('Controller: ContratacionesCtrl', function () {
// load the controller's module
beforeEach(module('moduloPersonalApp'));
var ContratacionesCtrl, scope;
// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
ContratacionesCtrl = $controller('ContratacionesCtrl', {
$scope: scope
});
}));
it('should ...', function () {
expect(1).to.equal(1);
});
});
<div>This is the contrataciones view.</div>
'use strict';
angular.module('moduloPersonalApp')
.config(function ($stateProvider) {
$stateProvider
.state('contrataciones', {
url: '/contrataciones',
templateUrl: 'app/contrataciones/contrataciones.html',
controller: 'ContratacionesCtrl'
});
});
<div class="container">
<div class="row">
<div class="col-sm-5 col-md-4 col-xs-6">
<h4 class="color-primary">Relaciones laborales
<small><span class="label label-default">{{vm.relacionesLaborales.count}}</span></small>
</h4>
</div>
</div>
<div class="col-md-10">
<uib-alert ng-repeat="alerta in vm.alertas" type="{{alerta.tipo}}" close="vm.alertas.splice($index,1)"
dismiss-on-timeout="3000">{{alerta.mensaje}}
</uib-alert>
</div>
<blockquote class="col-md-12 blockquote-primary" ng-show="vm.relacionesLaborales.count>0">
<div class="row">
<div class="table-responsive col-md-10">
<table class="table table-hover">
<thead>
<tr>
<th>Persona</th>
<th colspan="2">Opciones</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="relacionLaboral in vm.relacionesLaborales.rows">
<td>{{relacionLaboral.Persona.nombres}} {{relacionLaboral.Persona.apellidos}}</td>
<td>
<div class="btn-group" role="group">
<a class="btn btn-danger-outline btn-xs" href="#" role="button" ng-click="vm.eliminar(relacionLaboral)">
<i class="fa fa-trash fa-lg"></i>
</a>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="col-md-10">
<uib-pagination
ng-hide="vm.relacionesLaborales.count<10"
total-items="vm.relacionesLaborales.count"
items-per-page="10"
max-size="8"
force-ellipses="true"
ng-model="vm.paginaActual"
ng-change="vm.cambiarPagina()"
next-text="Siguiente"
previous-Text="Anterior"></uib-pagination>
</div>
</div>
</blockquote>
</div>
'use strict';
(()=> {
class ContratacionCrearModalController {
constructor($uibModalInstance, parametros, ContratacionService, personaService, GrupoConvocatoriaService) {
constructor($uibModalInstance, parametros, ContratacionService, personaService, CargoConvocatoriaService) {
this.errores = {};
this.enviado = false;
this.modal = $uibModalInstance;
this.service = ContratacionService;
this.personaService = personaService;
this.grupoConvocatoriaService = GrupoConvocatoriaService;
this.cargoConvocatoriaService = CargoConvocatoriaService;
this.tiposContrato = {};
this.tipoContratoSeleccionado = {};
......@@ -29,9 +29,13 @@
}
if (parametros.cargoConvocatoriaId) {
this.cargoConvocatoriaId = parametros.cargoConvocatoriaId;
this.contratacion.fk_cargo = this.cargoConvocatoria._id;
this.cargoConvocatoria =
this.cargoTypeAhead = true;
this.cargoConvocatoriaService.cargoConvocatoria(this.cargoConvocatoriaId, {incluye: [{entidad: 'Cargo'}]})
.then(cargoConvocatoria=> {
this.cargoConvocatoria = cargoConvocatoria;
this.cargo = this.cargoConvocatoria.Cargo;
this.contratacion.fk_cargo = this.cargo._id;
this.cargoTypeAhead = true;
});
}
}
......@@ -63,7 +67,6 @@
this.enviado = true;
if (form.$valid) {
this.contratacion.estado = true;
this.contratacion.fk_cargo = this.cargoConvocatoria._id;
this.service.crear(this.contratacion)
.then(contrato=> {
this.modal.close(contrato);
......
......@@ -14,23 +14,31 @@
this.cargoService = cargoService;
this.service = ConvocatoriaService;
if ($stateParams.cargoId) {
if ($stateParams.cargoId)
this.cargoId = $stateParams.cargoId;
this.cargoService.convocatorias(this.cargoId)
this.paginaActual = 1;
this.cambiarPagina();
}
cambiarPagina() {
let parametros = {pagina: this.paginaActual, elementos: 10, ordenarPor: 'nombre'}
if (!this.cargoId) {
this.entidadService.convocatorias(this.entidadId, parametros)
.then(convocatorias=> {
this.convocatorias = {rows: []};
convocatorias.forEach(grupo=> {
this.convocatorias.rows.push(grupo.Convocatoria)
});
})
this.convocatorias = convocatorias;
});
}
else
this.entidadService.convocatorias(this.entidadId)
else {
this.cargoService.convocatorias(this.cargoId, parametros)
.then(convocatorias=> {
this.convocatorias = convocatorias;
})
}
}
crear() {
this.modal.open({
templateUrl: 'app/convocatorias/modals/convocatorias.modal.html',
......@@ -71,8 +79,16 @@
}
}
angular.module('moduloPersonalApp')
.controller('ConvocatoriaCtrl', ConvocatoriaController);
angular
.module(
'moduloPersonalApp'
)
.controller(
'ConvocatoriaCtrl'
,
ConvocatoriaController
)
;
})();
......@@ -54,6 +54,18 @@
</tbody>
</table>
</div>
<div class="col-md-10">
<uib-pagination
ng-hide="vm.convocatorias.count<10"
total-items="vm.convocatorias.count"
items-per-page="10"
max-size="8"
force-ellipses="true"
ng-model="vm.paginaActual"
ng-change="vm.cambiarPagina()"
next-text="Siguiente"
previous-Text="Anterior"></uib-pagination>
</div>
</div>
</blockquote>
</div>
<div class="container">
<div>
<div class="row">
<div class="col-sm-5 col-md-4 col-xs-6">
<h3>Convocatoria</h3>
......@@ -15,17 +15,15 @@
<uib-alert ng-repeat="alerta in vm.alertas" type="{{alerta.tipo}}" close="vm.alertas.splice($index,1)"
dismiss-on-timeout="3000">{{alerta.mensaje}}
</uib-alert>
<div class="row">
<div class="col-sm-5 col-md-4 col-xs-6">
<h4 class="color-primary">Convocatoria</h4>
</div>
</div>
<blockquote class="col-md-12 blockquote-primary">
<form class="form" name="form" novalidate>
<div class="row">
<div class="col-md-10">
<label>Descripción</label>
<div class="input-group">
<div>
<div class="container">
<h4 class="color-primary">Cargo</h4>
<blockquote class="col-md-12 blockquote-primary">
<form class="form" name="form" novalidate>
<div class="row">
<div class="col-md-10">
<label>Descripción</label>
<div class="input-group">
<textarea type="text" name="descripcion" class="form-control" rows="5"
ng-model="vm.convocatoria.descripcion"
required>
......@@ -35,48 +33,52 @@
ng-disabled="!form.descripcion.$dirty">
<i class="fa fa-save"></i>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-10">
<label>Fecha de inicio</label>
<div class="input-group">
<input class="form-control" name="fechaInicio" ng-model="vm.convocatoria.fechaInicio" type="text"
uib-datepicker-popup="dd/MM/yyyy" name="fechaContratacion" ng-init="abierto=false" is-open="abierto"
close-text="Cancelar" current-text="Hoy" clear-text="Limpiar" required>
<div class="row">
<div class="col-md-10">
<label>Fecha de inicio</label>
<div class="input-group">
<input class="form-control" name="fechaInicio" ng-model="vm.convocatoria.fechaInicio" type="text"
uib-datepicker-popup="dd/MM/yyyy" name="fechaContratacion" ng-init="abierto=false"
is-open="abierto"
close-text="Cancelar" current-text="Hoy" clear-text="Limpiar" required>
<span class="input-group-btn">
<button type="button" class="btn btn-primary-outline" ng-click="abierto = true">
<i class="fa fa-calendar"></i></button>
<button type="button" class="btn btn-primary-outline" ng-click="vm.guardar(form,'fechaInicio')"
ng-disabled="!form.fechaInicio.$dirty"><i class="fa fa-save"></i></button>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-10">
<label>Fecha de finalización</label>
<div class="input-group">
<input class="form-control" name="fechaFin" ng-model="vm.convocatoria.fechaFin" type="text"
uib-datepicker-popup="dd/MM/yyyy" name="fechaContratacion" ng-init="abiertoFin=false" is-open="abiertoFin"
close-text="Cancelar" current-text="Hoy" clear-text="Limpiar" required>
<div class="row">
<div class="col-md-10">
<label>Fecha de finalización</label>
<div class="input-group">
<input class="form-control" name="fechaFin" ng-model="vm.convocatoria.fechaFin" type="text"
uib-datepicker-popup="dd/MM/yyyy" name="fechaContratacion" ng-init="abiertoFin=false"
is-open="abiertoFin"
close-text="Cancelar" current-text="Hoy" clear-text="Limpiar" required>
<span class="input-group-btn">
<button type="button" class="btn btn-primary-outline" ng-click="abiertoFin = true">
<i class="fa fa-calendar"></i></button>
<button type="button" class="btn btn-primary-outline" ng-click="vm.guardar(form,'fechaFin')"
ng-disabled="!form.fechaFin.$dirty"><i class="fa fa-save"></i></button>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="form-group has-error">
<p class="help-block"
ng-show="(form.nombre.$error.required ||form.descripcion.$error.required || form.correo.$error.required) && vm.enviado">
Debe llenar todos los campos
</p>
<p class="help-block">{{ vm.errores.other }}</p>
</div>
</form>
</blockquote>
<div class="form-group has-error">
<p class="help-block"
ng-show="(form.nombre.$error.required ||form.descripcion.$error.required || form.correo.$error.required) && vm.enviado">
Debe llenar todos los campos
</p>
<p class="help-block">{{ vm.errores.other }}</p>
</div>
</form>
</blockquote>
</div>
</div>
</div>
......@@ -33,10 +33,9 @@
}).result.then(postulacion=> {
this.alertas.push({
tipo: 'success',
mensaje: 'Se creo correctamente la convocatoria'
mensaje: 'Se creo correctamente la postulacion'
});
this.postulaciones.rows.push(postulacion.Persona);
this.postulaciones.count += 1;
this.cambiarPagina();
})
}
......@@ -76,7 +75,8 @@
pagina: this.paginaActual,
elementos: 10,
ordenarPor: this.ordenarPor,
orden: this.ordenDescendente
orden: this.ordenDescendente,
incluye: [{entidad: 'Cargos'}]
};
if (this.tagsSeleccionados.length > 0) {
parametros.incluye = [{entidad: 'Tags', buscar: this.tagsBusqueda}]
......@@ -84,12 +84,21 @@
if (this.datosPersonalesBusqueda.length > 0) {
parametros.buscar = this.datosPersonalesBusqueda;
}
console.log(this.grupoId);
this.cargoConvocatoriaService.postulaciones(this.cargoConvocatoriaId, parametros)
.then(respuesta=> {
console.log(respuesta);
this.postulaciones = respuesta;
});
if (this.cargoConvocatoriaId)
return this.cargoConvocatoriaService.cargoConvocatoria(this.cargoConvocatoriaId);
})
.then(cargoConvocatoria=> {
console.log(cargoConvocatoria);
this.existeRelacionLaboral = false;
this.postulaciones.rows.forEach(postulacion=> {
postulacion.Cargos = postulacion.Cargos.filter(y=>y.Contratacion.estado);
postulacion.contratado = postulacion.Cargos.filter(y=>y.Contratacion.fk_cargo == cargoConvocatoria.fk_cargo).length > 0;
this.existeRelacionLaboral = postulacion.contratado ? true : this.existeRelacionLaboral;
});
})
}
ordenar(campo) {
......@@ -107,11 +116,11 @@
}).result.then(contratacion=> {
this.alertas.push({
tipo: 'success',
mensaje: 'Se creo contrato correctamente al postulante: ' + postulante.nombres + " " + postulante.apellidos
mensaje: 'Se creo la relación laboral con el postulante: ' + postulante.nombres + " " + postulante.apellidos
})
this.cambiarPagina();
})
}
}
angular.module('moduloPersonalApp')
.controller('PostulacionCtrl', PostulacionController);
......
......@@ -8,7 +8,7 @@
<div class="col-sm-7 col-md-5 col-sm-offset-2">
<div class="pull-right btn-group">
<button class="btn btn-primary-outline" ng-click="vm.crear()" type="button"><i
class="fa fa-plus"></i>
class="fa fa-lg fa-plus"></i>
Crear postulación
</button>
</div>
......@@ -32,8 +32,7 @@
</div>
<div class="input-group">
<input type="text" class="form-control" placeholder="Nombres, apellidos, cedula de identidad"
ng-model="vm.palabra"
ng-change="vm.buscar(vm.palabra)" ng-model-options="{debounce: 500}">
ng-model="vm.palabra" ng-change="vm.buscar(vm.palabra)" ng-model-options="{debounce: 500}">
<span class="input-group-addon"><i class="fa fa-search" aria-hidden="true"></i></span>
</div>
</div>
......@@ -47,17 +46,18 @@
</tr>
</thead>
<tbody>
<tr ng-repeat="postulacion in vm.postulaciones.rows">
<tr ng-repeat="postulacion in vm.postulaciones.rows" ng-class="{success:postulacion.contratado}"
ng-show="postulacion.Cargos.length == 0 || postulacion.contratado">
<td>{{postulacion.nombres}}</td>
<td>{{postulacion.apellidos}}</td>
<td class="text-center">
<div class="btn-group" role="group">
<a class="btn btn-success-outline btn-xs" href="#" role="button"
<a class="btn btn-success-outline btn-xs" href="#" role="button" ng-disabled="vm.existeRelacionLaboral"
ng-click="vm.contratar(postulacion)">
<i class="fa fa-lg fa-pencil-square-o"></i>
Contratar
Relación laboral
</a>
<a ng-show="!vm.grupoId" class="btn btn-danger-outline btn-xs" href="#" role="button"
<a class="btn btn-danger-outline btn-xs" href="#" role="button"
ng-click="vm.eliminar(postulacion)">
<i class="fa fa-trash fa-lg"></i>
</a>
......
......@@ -10,21 +10,32 @@
this.alertasUnidad = [];
this.entidadId = $stateParams.entidadId;
this.entidadId = $stateParams.entidadId;