Incam_Intranet/Objects/Candidato.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;
}
}
?>