git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_Intranet/trunk/src@99 e2b1556b-49f8-d141-9351-52d6861a72d9
436 lines
15 KiB
PHP
436 lines
15 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Clase Candidato
|
|
*
|
|
* Contiene toda la información relativa al candidato.
|
|
*
|
|
* 2008-10-06 (diego): Se crea el objeto con los métodos necesarios para gestionar candidatos.
|
|
*
|
|
*/
|
|
include_once("BD.php");
|
|
include_once("Persona.php");
|
|
include_once("Automata.php");
|
|
include_once("ListaCapacidadesProfesionales.php");
|
|
|
|
class Candidato extends Persona {
|
|
|
|
private $usuario;
|
|
|
|
function Candidato($usuario, $oid) {
|
|
$consulta = "SELECT oid FROM usuarios WHERE oid = '" . $oid . "' AND tipo='candidato'";
|
|
$bd = new BD();
|
|
$num = $bd->numFilas($consulta);
|
|
if ($num > 0) {
|
|
parent::Persona($oid);
|
|
$this->usuario = $usuario;
|
|
} else {
|
|
$error = "Candidato no encontrado.";
|
|
throw new Exception($error);
|
|
}
|
|
}
|
|
|
|
function getCapacidadesProfesionales(){
|
|
return new ListaCapacidadesProfesionales($this->getValor("oid"),"candidato");
|
|
}
|
|
|
|
function setCampo($nombre, $valor) {
|
|
//PERMISOS:
|
|
/*
|
|
* Admin (1) - Todos
|
|
* RRHH (4) - Todos
|
|
* Otro - Excepción
|
|
*/
|
|
$sesion = $this->usuario->getValor("oid");
|
|
if ($this->usuario->tieneRol(1) || $this->usuario->tieneRol(4)) {
|
|
$viejo = $this->getValor($nombre);
|
|
$resultado = parent::setCampo($nombre, $valor);
|
|
///////////////////////////////////////////////////
|
|
//SOLO ACTUALIZA EL HISTORIAL LOS CAMBIOS DE ESTADO
|
|
///////////////////////////////////////////////////
|
|
if ($nombre == "estado") {
|
|
$estado_viejo = $this->darNombreEstado($viejo, "sp");
|
|
$estado_nuevo = $this->darNombreEstado($valor, "sp");
|
|
$historial = "Cambio de estado (". $estado_viejo ." a ". $estado_nuevo .")";
|
|
$this->actualizarHistorial($historial);
|
|
}
|
|
return $resultado;
|
|
|
|
} else {
|
|
//Campos que se pueden editar por el gerente, ya sea directamente o mediante una transición.
|
|
if (($nombre == "observaciones" || $nombre == "msgEstado" || $nombre = "diasEspera" || $nombre == "estado") && $this->usuario->tieneRol(3)) {
|
|
$viejo = $this->getValor($nombre);
|
|
$resultado = parent::setCampo($nombre, $valor);
|
|
///////////////////////////////////////////////////
|
|
//SOLO ACTUALIZA EL HISTORIAL LOS CAMBIOS DE ESTADO
|
|
///////////////////////////////////////////////////
|
|
if ($nombre == "estado") {
|
|
$estado_viejo = $this->darNombreEstado($viejo, "sp");
|
|
$estado_nuevo = $this->darNombreEstado($valor, "sp");
|
|
$historial = "Cambio de estado (". $estado_viejo ." a ". $estado_nuevo .")";
|
|
$this->actualizarHistorial($historial);
|
|
}
|
|
return $resultado;
|
|
|
|
} else {
|
|
$error = "El usuario no tiene permisos para editar al candidato.";
|
|
throw new Exception($error);
|
|
return false;
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
function darNombreEstado($cod, $idioma) {
|
|
$consulta = "SELECT NOMBRE from candidatos_estados WHERE cod=\"" . $cod . "\" AND idioma=\"" . $idioma . "\"";
|
|
$bd = new BD();
|
|
return $bd->getCampo($consulta);
|
|
}
|
|
|
|
function addCurriculum($fichero) {
|
|
//PERMISOS:
|
|
/*
|
|
* Admin (1) - Todos
|
|
* RRHH (4) - Todos
|
|
* Otro - Excepción
|
|
*/
|
|
$sesion = $this->usuario->getValor("oid");
|
|
if ($this->usuario->tieneRol(3) || $this->usuario->tieneRol(1) || $this->usuario->tieneRol(4)) {
|
|
return parent::addCurriculum($fichero, $this->usuario->getValor("nombre"));
|
|
} else {
|
|
$error = "El usuario no tiene permisos para asociar CV al candidato.";
|
|
throw new Exception($error);
|
|
return false;
|
|
exit;
|
|
}
|
|
}
|
|
|
|
function removeCurriculum($curriculum, $fecha) {
|
|
//PERMISOS:
|
|
/*
|
|
* Admin (1) - Todos
|
|
* RRHH (4) - Todos
|
|
* Otro - Excepción
|
|
*/
|
|
$sesion = $this->usuario->getValor("oid");
|
|
echo $this->usuario->tieneRol(1);
|
|
echo $this->usuario->tieneRol(4);
|
|
if ($this->usuario->tieneRol(1) || $this->usuario->tieneRol(4)) {
|
|
parent::removeCurriculum($curriculum, $fecha, $this->usuario->getValor("nombre"));
|
|
} else {
|
|
$error = "El usuario no tiene permisos para eliminar un CV al candidato.";
|
|
throw new Exception($error);
|
|
}
|
|
}
|
|
|
|
/* SQL que da los pedidos en el que está un candidato dependiendo del estado
|
|
|
|
En el ejemplo
|
|
estado -> 20
|
|
id Candidato ->12
|
|
@param $estado - Estado del pedido.
|
|
@return array codPedido => nombre o vacío.
|
|
*/
|
|
|
|
function getPedidosByEstado($estado) {
|
|
/* SELECT P.oid,P.nombre
|
|
FROM pedidos P,candidato_pedido CP
|
|
WHERE CP.candidato='12'
|
|
AND CP.estado='20'
|
|
AND P.oid=CP.pedido */
|
|
$idC = $this->getValor("oid");
|
|
$consulta = "SELECT P.oid as oid,P.nombre as nombre
|
|
FROM pedidos P,candidato_pedido CP
|
|
WHERE CP.candidato='$idC'
|
|
AND CP.estado='$estado'
|
|
AND P.oid=CP.pedido";
|
|
$bd = new BD();
|
|
return $bd->keyValueQuery($consulta, "oid", "nombre");
|
|
}
|
|
|
|
function eliminar() {
|
|
//PERMISOS:
|
|
/*
|
|
* Admin (1) - Todos
|
|
* Otro - Excepción
|
|
*/
|
|
$sesion = $this->usuario->getValor("oid");
|
|
//Nos declaramos un array de estados eliminables:
|
|
$estados_eliminables = array("510","521","522","523","540");
|
|
if ($this->usuario->tieneRol(1) || $this->usuario->tieneRol(4)) {
|
|
$estado = $this->getValor("estado");
|
|
if (in_array($estado, $estados_eliminables)) {
|
|
return parent::eliminar();
|
|
} else {
|
|
$nombre_estado = $this->getValor("nombre_estado");
|
|
$error = "No se pueden eliminar candidatos en estado " . $nombre_estado . ".";
|
|
throw new Exception($error);
|
|
return false;
|
|
}
|
|
} else {
|
|
$error = "El usuario no tiene permisos para eliminar al candidato.";
|
|
throw new Exception($error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function actualizarHistorial($mensaje) {
|
|
parent::actualizarHistorial($mensaje, $this->usuario->getValor("nombre"));
|
|
}
|
|
|
|
function getSiguientes() {
|
|
$estado = $this->getValor("estado");
|
|
$idioma = $this->usuario->getValor("idioma");
|
|
$rol = $this->usuario->getValor("rol");
|
|
$a = new Automata("candidatos", $idioma, $rol);
|
|
$siguientes = $a->getSiguientes($estado);
|
|
return $siguientes;
|
|
}
|
|
|
|
function transita($destino, $argumentos) {
|
|
$origen = $this->getValor("estado");
|
|
$idioma = $this->usuario->getValor("idioma");
|
|
$rol = $this->usuario->getValor("rol");
|
|
$a = new Automata("candidatos", $idioma, $rol);
|
|
|
|
$transita = $a->getTransicion($origen, $destino);
|
|
|
|
if (($transita == "") || !($transita >= 0)) {
|
|
return false;
|
|
} else {
|
|
$res = $this->ejecutaTransicion($transita, $argumentos);
|
|
if ($res) {
|
|
$total = explode("#&dias;", $argumentos);
|
|
$msj = $total[0];
|
|
$diasEspera = $total[1];
|
|
$this->setCampos(array("msgEstado" => $msj, "diasEspera" => $diasEspera, "estado" => $destino));
|
|
/* $this->setCampo("msgEstado", $msj);
|
|
$this->setCampo("diasEspera", $diasEspera);
|
|
$this->setCampo("estado", $destino); */
|
|
}
|
|
return $res;
|
|
}
|
|
}
|
|
|
|
private function ejecutaTransicion($codigo, $argumentos) {
|
|
//Si no hace nada al transitar salimos sin más.
|
|
if ($codigo == 0)
|
|
return true;
|
|
$funcion = "ejecutar$codigo";
|
|
$res = call_user_func(array("Candidato", $funcion), $argumentos);
|
|
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* Disponible a no disponible
|
|
* Entrevistado a no disponible (entrevistado).
|
|
* Admin, RRHH
|
|
SE LLEGA DESDE:
|
|
- Editar el estado del candidato desde la vista.
|
|
|
|
PRECONDICIONES:
|
|
- Mensaje con texto.
|
|
|
|
POSTCONDICIONES:
|
|
- Eliminarle de candidaturas en las que no esté rechazado
|
|
y el pedido esté pendiente, asignado o contratado
|
|
y comprobar transiciones a otros pedidos.
|
|
*/
|
|
private function ejecutar1020($mensaje) {
|
|
|
|
if ($mensaje == "") {
|
|
echo '<script type="text/javascript">
|
|
<!--
|
|
alert("Debe introducir un motivo para pasar al candidato a No disponible");
|
|
-->
|
|
</script>';
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Disponible a Entrevistado
|
|
* En proceso a En proceso (entrevistado)
|
|
* No disponible a No disponible (entrevistado)
|
|
* Admin, RRHH
|
|
SE LLEGA DESDE:
|
|
- Editar el estado del candidato desde la vista.
|
|
|
|
PRECONDICIONES:
|
|
- Ninguna.
|
|
|
|
POSTCONDICIONES:
|
|
- Almacenar en la BD la fecha de la entrevista.
|
|
*/
|
|
private function ejecutar1050($mensaje) {
|
|
$fechaAntEntrevista = $this->getValor("fecha_entrevista");
|
|
if (($fechaAntEntrevista == "2008-1-1") || ($fechaAntEntrevista == "0000-00-00")) {
|
|
$fecha = date(Y . "-" . m . "-" . d);
|
|
$this->setCampos(array("fecha_entrevista" => $fecha));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* En proceso a no disponible
|
|
* En proceso (entrevistado) a no disponible (entrevistado).
|
|
* Admin, RRHH
|
|
SE LLEGA DESDE:
|
|
- Editar el estado del candidato desde la vista.
|
|
|
|
PRECONDICIONES:
|
|
- Mensaje con texto.
|
|
|
|
POSTCONDICIONES:
|
|
- Eliminarle de candidaturas en las que no esté rechazado
|
|
y el pedido esté pendiente, asignado o contratado
|
|
y comprobar transiciones a otros pedidos.
|
|
*/
|
|
private function ejecutar3020($mensaje) {
|
|
if ($mensaje == "") {
|
|
echo '<script type="text/javascript">
|
|
<!--
|
|
alert("Debe introducir un motivo para pasar al candidato a No disponible");
|
|
-->
|
|
</script>';
|
|
return false;
|
|
}
|
|
$oid = $this->getValor("oid");
|
|
$consulta = "SELECT pedido FROM candidato_pedido, pedidos WHERE candidato='$oid' AND estado <> '10' AND pedido.oid = candidato_pedido.pedido AND pedido.estado IN ('10', '20', '30')";
|
|
$bd = new BD();
|
|
$pedidos = $bd->arrayQuery($consulta, "pedido");
|
|
//Elimino al usuario de todas las candidaturas en las que no esté rechazado y el pedido esté pendiente, asignado o contratado.
|
|
$consulta = "DELETE FROM candidato_pedido, pedidos WHERE candidato='$oid' AND estado <> '10' AND pedido.oid = candidato_pedido.pedido AND pedido.estado IN ('10', '20', '30')";
|
|
|
|
//Para cada candidatura en la que no esté rechazado compruebo si el sacarle
|
|
//de ella supone un cambio en el pedido:
|
|
foreach ($pedidos as $idP) {
|
|
$pedido = new Pedido($idP);
|
|
$estado = $pedido->getEstado("estado");
|
|
//Si está asignado o contratado tiene que transitar a pendiente
|
|
//(la transición se encarga ya de comprobar si cumple las precondiciones
|
|
//de este cambio de estado)
|
|
if (($estado == '20') || ($estado == '30')) {
|
|
$pedido->transita(10, "");
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* No disponible a Disponible
|
|
* Admin, RRHH
|
|
SE LLEGA DESDE:
|
|
- Editar el estado del candidato desde la vista.
|
|
|
|
POSTCONDICIONES:
|
|
- Calcular la afinidad del candidato con todos los pedidos para que
|
|
puedan aparecer en ellos como "Propuestos por el sistema".
|
|
*/
|
|
private function ejecutar2010() {
|
|
$this->setCampos(array("estado" => "10"));
|
|
$this->calculaAfinidad();
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* En proceso a disponible
|
|
* En proceso (entrevistado) a disponible
|
|
SE LLEGA DESDE:
|
|
- Rechazar a un candidato.
|
|
- Poner un pedido en el que se encontraba como "No contratado".
|
|
|
|
PRECONDICIONES:
|
|
- El usuario no se encuentra aceptado en ningún proceso de selección.
|
|
|
|
*/
|
|
private function ejecutar3010() {
|
|
$id = $this->getValor("oid");
|
|
$bd = new BD();
|
|
$consulta = "SELECT * FROM candidato_pedido WHERE candidato='.$id.' AND estado='20'";
|
|
$res = $bd->numFilas(($consulta));
|
|
//No se cambia si está en más procesos.
|
|
if ($res > 0) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Disponible a En proceso.
|
|
* Admin, RRHH
|
|
SE LLEGA DESDE:
|
|
- Al aceptar a un candidato disponible en un proceso de selección.
|
|
|
|
EFECTOS:
|
|
- Se envía un email a RRHH informando de que se ha aceptado en un proyecto a un
|
|
candidato que no ha sido entrevistado.
|
|
- Se cambia el estado del candidato de disponible a enproceso
|
|
*/
|
|
private function ejecutar1030() {
|
|
//Enviar un mail a RRHH con los datos pidiendo incorporación.
|
|
$nombre = $this->getValor("nombre") . " " . $this->getValor("apellidos");
|
|
$oid = $this->getValor("oid");
|
|
$asunto = "Candidato aceptado por pedido no entrevistado";
|
|
$direccion = constante("email");
|
|
$path = "http://portal.selforsistemas.net";
|
|
//$link = "<a href='".$path."/detalle_candidato.php?oid=".$oid."'>".$nombre."</a>";
|
|
$email = "El candidato " . $nombre . " no entrevistado ha sido aceptado para un pedido.";
|
|
envia_correo($direccion, $asunto, $email);
|
|
$this->setCampos(array("estado" => "30"));
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Entrevistado a Incorporado
|
|
* En proceso (entrevistado) a Incorporado *
|
|
* Admin, RRHH
|
|
SE LLEGA DESDE:
|
|
- Editar el estado del candidato desde la vista.
|
|
|
|
PRECONDICIONES:
|
|
- Ninguna.
|
|
|
|
POSTCONDICIONES:
|
|
- Cambia el tipo a "usuario" y desaparece de la lista de candidatos.
|
|
- Se añade el campo "Fecha alta".
|
|
- Se transita automáticamente a "Esperando proyecto".
|
|
*/
|
|
private function ejecutar5080($mensaje) {
|
|
$fecha = date(Y . "-" . m . "-" . d);
|
|
$nombre = md5($this->getValor("nombre"));
|
|
$this->setCampos(array("tipo" => "usuario", "estado" => "90", "password" => $nombre, "rol" => 6, "fecha_alta" => $fecha, "salario" => $mensaje));
|
|
/* $this->setCampo("estado", "90");
|
|
$this->setCampo("password", $nombre);
|
|
$this->setCampo("rol", 6);
|
|
$this->setCampo("fecha_alta", $fecha);
|
|
$this->setCampo("salario", $mensaje); */
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Entrevistado a En proceso(entrevistado).
|
|
* Admin, RRHH
|
|
SE LLEGA DESDE:
|
|
- Al aceptar a un candidato disponible en un proceso de selección.
|
|
|
|
EFECTOS:
|
|
- Se cambia el estado del candidato de en proceso(entrevistado)
|
|
*/
|
|
private function ejecutar5070() {
|
|
$this->setCampos(array("estado" => "70"));
|
|
$this->campos["estado_usuario"] = "70";
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
?>
|