git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_Intranet/trunk/src@99 e2b1556b-49f8-d141-9351-52d6861a72d9
1131 lines
42 KiB
PHP
1131 lines
42 KiB
PHP
<?php
|
||
|
||
/*
|
||
* Clase Pedido
|
||
*/
|
||
|
||
include_once("Objects/BD.php");
|
||
include_once("Objects/CandidatoPedido.php");
|
||
include_once("Objects/Candidato.php");
|
||
include_once("Objects/Empleado.php");
|
||
include_once("Objects/Afinidad.php");
|
||
include_once("Objects/Automata.php");
|
||
include_once("Objects/Oferta.php");
|
||
include_once("ListaCapacidadesProfesionales.php");
|
||
|
||
class Pedido {
|
||
|
||
// Atributos:
|
||
/* Usuario que tiene activa la sesión. */
|
||
private $usuario;
|
||
|
||
/* Contiene una lista con todos los atributos y su valor */
|
||
private $campos = array();
|
||
private $listaOfertas = null;
|
||
|
||
|
||
/* Lista de perfiles */
|
||
private $listaPerfiles = null;
|
||
|
||
/* Lista de tecnologías */
|
||
private $listaTecnologias = null;
|
||
|
||
/* Lista de idiomas */
|
||
private $listaIdiomas = null;
|
||
|
||
/* Lista de provincias */
|
||
private $listaProvincias = null;
|
||
|
||
/* Parámetros que si se cambian recalculan la afinidad */
|
||
private $listaAfinidad = array("nombre", "perfil", "pesoTecno", "pesoIdioma", "pesoPerfil", "estado");
|
||
|
||
/* Booleano que indica si el cambio de un campo lo hace por razones automáticas y dejar realizar
|
||
* el cambio */
|
||
private $setAutomatico = false;
|
||
|
||
// Constructor:
|
||
/**
|
||
* Recupera un pedido a partir de su identificador.
|
||
*
|
||
* @param id $ - datos necesarios para crear un pedido.
|
||
*/
|
||
function Pedido($id, $usuario) {
|
||
$this->usuario = $usuario;
|
||
switch (gettype($id)) {
|
||
case "string":$this->campos['oid'] = $id;
|
||
break;
|
||
case "array": $this->parseaArray($id);
|
||
break;
|
||
case "resource": $this->parseaResource($id);
|
||
break;
|
||
default: echo gettype($id);
|
||
break;
|
||
}
|
||
}
|
||
|
||
// Funciones:
|
||
/**
|
||
* Calcula el número de candidatos asociados al pedido.
|
||
*
|
||
* @param tipo $ - estado del candidato en el pedido.
|
||
* @return número de candidatos asociados a ese pedido.
|
||
*/
|
||
function dameNumCand($tipo) {
|
||
// PERMISOS:
|
||
/*
|
||
* Admin (1) - Todos
|
||
* Selección (4) - Todos
|
||
* Gestor (3) - Los suyos
|
||
* Otro - Excepción
|
||
*/
|
||
$gerente = $this->getValor("gerente");
|
||
$sesion = $this->usuario->getValor("oid");
|
||
if ($this->usuario->tieneRol(1) || $this->usuario->tieneRol(4) || ($this->usuario->tieneRol(3) && $sesion == $gerente)) {
|
||
$tipoUpper = strtoupper($tipo);
|
||
$bd = new BD();
|
||
$consulta = "SELECT count(*) FROM candidaturas_estado es, candidato_pedido ca WHERE UPPER(es.nombre)=\"" . $tipoUpper . "\" AND ca.estado =es.cod AND ca.pedido=\"" . $this->getValor("oid") . "\"";
|
||
$numero = $bd->getCampo($consulta);
|
||
} else {
|
||
$error = "El usuario no tiene permisos para obtener el número de candidatos de la solicitud de oferta.";
|
||
throw new Exception($error);
|
||
}
|
||
return $numero;
|
||
}
|
||
|
||
/**
|
||
* Procesa un array para añadir campos al pedido.
|
||
*
|
||
* @param array $ - datos a añadir al pedido.
|
||
*/
|
||
private function parseaArray($array) {
|
||
foreach ($array as $campo) {
|
||
// echo "$campo<br>";
|
||
}
|
||
}
|
||
|
||
function getCapacidadesProfesionales(){
|
||
return new ListaCapacidadesProfesionales($this->getValor("oid"),"solicitud");
|
||
}
|
||
|
||
/**
|
||
* Procesa el resultado de una query para añadir campos al pedido.
|
||
*
|
||
* @param resource $ - el resultado de la query.
|
||
*/
|
||
private function parseaResource($resource) {
|
||
$fila = mysql_fetch_array($resource);
|
||
for ($i = 0; $i < mysql_num_fields($resource); $i++) {
|
||
if (!in_array(mysql_field_name($resource, $i), $this->campos)) {
|
||
$arrayAct = array(mysql_field_name($resource, $i) => $fila[$i]);
|
||
$this->campos = $this->campos + $arrayAct;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Devuelve el valor de un campo.
|
||
*
|
||
* @param nombre $ - nombre del campo por el que buscar.
|
||
* @return valor del campo buscado.
|
||
*/
|
||
function getValor($nombre) {
|
||
// No se controlan permisos porque se tienen que recuperar datos como el oid del gerente
|
||
// para verificar el resto de permisos.
|
||
if (array_key_exists($nombre, $this->campos)) {
|
||
// El campo ya lo habÃamos recuperamos, lo mostramos
|
||
return $this->campos[$nombre];
|
||
} else {
|
||
switch ($nombre) {
|
||
case "nombre_gerente":$idGerente = $this->getValor("gerente");
|
||
$consulta = "SELECT CONCAT(nombre,\" \",apellidos) FROM usuarios WHERE oid=\"" . $idGerente . "\"";
|
||
break;
|
||
case "nombre_estado":$idEstado = $this->getValor("estado");
|
||
$idioma = $this->usuario->getValor("idioma");
|
||
$consulta = "SELECT nombre FROM pedidos_estados WHERE cod=\"" . $idEstado . "\" AND idioma=\"" . $idioma . "\"";
|
||
break;
|
||
case "nombre_cliente":$idCliente = $this->getValor("cliente");
|
||
$consulta = "SELECT id FROM clientes WHERE oid=\"" . $idCliente . "\"";
|
||
|
||
break;
|
||
case "nombre_salario_min":
|
||
$consulta = "SELECT salario.nombre FROM salario, pedidos WHERE salario.id=pedidos.salario_min AND pedidos.oid=\"" . $this->getValor("oid") . "\"";
|
||
$especial = true;
|
||
break;
|
||
case "nombre_salario_max":
|
||
$consulta = "SELECT salario.nombre FROM salario, pedidos WHERE salario.id=pedidos.salario_max AND pedidos.oid=\"" . $this->getValor("oid") . "\"";
|
||
$especial = true;
|
||
break;
|
||
default: $consulta = "SELECT " . $nombre . " FROM pedidos WHERE oid=\"" . $this->campos['oid'] . "\"";
|
||
break;
|
||
}
|
||
// Lo insertamos para nosotros
|
||
$bd = new BD();
|
||
$valor = $bd->getCampo($consulta);
|
||
// Lo insertamos para nosotros
|
||
$arrayAct = array($nombre => $valor);
|
||
$this->campos = $this->campos + $arrayAct;
|
||
return $valor;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Acceso a los campos del pedido.
|
||
*
|
||
* @return los campos del pedido.
|
||
*/
|
||
function getCampos() {
|
||
return $this->campos;
|
||
}
|
||
|
||
function darNombreEstado($cod, $idioma) {
|
||
$consulta = "SELECT NOMBRE from pedidos_estados WHERE cod=\"" . $cod . "\" AND idioma=\"" . $idioma . "\"";
|
||
$bd = new BD();
|
||
echo $consulta;
|
||
return $bd->getCampo($consulta);
|
||
}
|
||
|
||
|
||
/**
|
||
* Asigna un nuevo campo al pedido.
|
||
*
|
||
* @param nombre $ - nombre del campo a asignar.
|
||
* @param valor $ - valor del campo.
|
||
*/
|
||
function setCampo($nombre, $valor) {
|
||
// PERMISOS:
|
||
/*
|
||
* Admin (1) - Todos
|
||
* Gestor (3) - Los suyos
|
||
* Otro - Excepción
|
||
*/
|
||
$gerente = $this->getValor("gerente");
|
||
$sesion = $this->usuario->getValor("oid");
|
||
if ($this->usuario->tieneRol(1) || ($this->usuario->tieneRol(3) && $sesion == $gerente) || $this->setAutomatico) {
|
||
$viejo = $this->getValor($nombre);
|
||
if ($viejo != $valor) {
|
||
// Comprobamos multivaluado y casos especiales antes del cambio:
|
||
$viejo = $this->getValorMulti($nombre, $viejo);
|
||
$this->campos[$nombre] = $valor;
|
||
$oid = $this->getValor("oid");
|
||
$consulta = "UPDATE pedidos SET $nombre = '$valor' WHERE oid='$oid'";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
// Comprobamos multivaluado y casos especiales:
|
||
$valor = $this->getValorMulti($nombre, $valor);
|
||
|
||
///////////////////////////////////////////////////
|
||
//SOLO ACTUALIZA EL HISTORIAL LOS CAMBIOS DE ESTADO
|
||
///////////////////////////////////////////////////
|
||
if ($nombre == "estado") {
|
||
$historial = "Cambio de estado (". $viejo ." a ". $valor .")";
|
||
$this->actualizarHistorial($historial);
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
$error = "El usuario no tiene permisos para editar la solicitud de oferta.";
|
||
throw new Exception($error);
|
||
}
|
||
}
|
||
|
||
private function getValorMulti($nombre, $antiguo) {
|
||
switch ($nombre) {
|
||
case "procedencia":
|
||
$valor = nombre_procedencia($antiguo);
|
||
break;
|
||
case "estado":
|
||
$valor = nombre_estado_pedido($antiguo);
|
||
break;
|
||
case "localidad":
|
||
$valor = nombre_localidad($antiguo);
|
||
break;
|
||
case "perfil":
|
||
$valor = nombre_perfil($antiguo);
|
||
break;
|
||
case "cliente":
|
||
$valor = nombre_cliente($antiguo);
|
||
break;
|
||
default:
|
||
$valor = $antiguo;
|
||
break;
|
||
}
|
||
return $valor;
|
||
}
|
||
|
||
/**
|
||
* Asigna nuevos campos al pedido.
|
||
*
|
||
* @param array $ - lista de campos a asignar de la forma campo => valor.
|
||
*/
|
||
function setCampos($array) {
|
||
foreach ($array as $key => $value) {
|
||
$this->setCampo($key, $value);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Elimina un pedido de la base de datos.
|
||
*/
|
||
function eliminar() {
|
||
// PERMISOS:
|
||
/*
|
||
* Admin (1) - Todos
|
||
* Gestor (3) - Los suyos
|
||
* Otro - Excepción
|
||
*/
|
||
$gerente = $this->getValor("gerente");
|
||
$sesion = $this->usuario->getValor("oid");
|
||
if ($this->usuario->tieneRol(1) || ($this->usuario->tieneRol(3) && $sesion == $gerente)) {
|
||
$oid = $this->getValor("oid");
|
||
$consulta = "DELETE FROM pedidos WHERE oid='$oid'";
|
||
$bd = new BD();
|
||
return $bd->execQuery($consulta);
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Calcula una lista de candidatos de un estado.
|
||
*/
|
||
private function getCandidatos($estado) {
|
||
$lista = array();
|
||
|
||
$pedido = $this->getValor("oid");
|
||
$consulta = "SELECT A.*,B.*,C.email,C.oid,C.nombre,C.apellidos,C.fecha_alta, D.nombre as estado_usuario FROM candidato_pedido as A, candidaturas_estado as B, usuarios as C, candidatos_estados as D WHERE A.pedido = '$pedido' and A.estado = B.cod and B.cod='$estado' and C.oid=A.candidato and D.cod = C.estado ORDER BY A.afinidad DESC";
|
||
$bd = new BD();
|
||
$resultado = $bd->execQuery($consulta);
|
||
while ($rows = mysql_fetch_assoc($resultado)) {
|
||
$candidato = new CandidatoPedido($rows);
|
||
$lista[] = $candidato;
|
||
}
|
||
return $lista;
|
||
}
|
||
|
||
function proponerCandidato($id, $observacion) {
|
||
$estadoP = $this->getValor("estado");
|
||
if ($estadoP == 40) {
|
||
return false;
|
||
}
|
||
$this->getCandidatosPropuestosRRHH();
|
||
$candidato = $this->buscarCandidatoLista($id, $this->getCandidatosPropuestos());
|
||
$oid = $this->getValor("oid");
|
||
// Si está en la lista de propuestos por el sistema lo cambio a la de propuestos por RRHH
|
||
if ($candidato != null) {
|
||
$candidato->modFechaCandidatura();
|
||
$consulta = "UPDATE candidato_pedido SET estado = '40', fecha = curdate(),obsRRHH = '$observacion' where candidato = '$id' AND pedido = '$oid'";
|
||
$lista = $this->listaPropuestos;
|
||
$this->listaPropuestos = null;
|
||
foreach ($lista as $elem) {
|
||
if ($elem->getValor("candidato") != $id) {
|
||
$this->listaPropuestos[] = $elem;
|
||
}
|
||
}
|
||
// Si no, lo mete directamente en la lista de propuestos por RRHH
|
||
} else {
|
||
$idPedido = $this->getValor("oid");
|
||
$idRRHH = $this->usuario->getValor("oid");
|
||
$consulta = "INSERT INTO candidato_pedido (candidato, pedido, afinidad, estado, RRHH, fecha,obsRRHH) VALUES('$id', '$idPedido', '0', '40', '$idRRHH', curdate(),'$observacion')";
|
||
try {
|
||
$candidato = new Candidato($this->usuario, $id);
|
||
} catch (Exception $e) {
|
||
$candidato = new Empleado($this->usuario, $id);
|
||
}
|
||
}
|
||
// Actualizamos la BD y las listas;
|
||
$nombre_candidato = $candidato->getValor("nombre") . " " . $candidato->getValor("apellidos");
|
||
$nombre_usuario = $this->usuario->getValor("nombre");
|
||
$mensaje = "El candidato $nombre_candidato ha sido propuesto por RRHH ($nombre_usuario)";
|
||
$this->actualizarHistorial($mensaje);
|
||
$mensaje = "Propuesto en la solicitud $oid por RRHH ($nombre_usuario)";
|
||
try {
|
||
$usuario = new Candidato($this->usuario, $id);
|
||
} catch (Exception $e) {
|
||
$usuario = new Empleado($this->usuario, $id);
|
||
}
|
||
$usuario->actualizarHistorial($mensaje);
|
||
|
||
$bd = new BD();
|
||
$bd->execQuery($consulta);
|
||
|
||
$this->listaPropuestosRRHH[] = $candidato;
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Acepta un candidato para el pedido.
|
||
*/
|
||
function aceptarCandidato($id) {
|
||
$estadoP = $this->getValor("estado");
|
||
if ($estadoP != 130) {
|
||
return false;
|
||
}
|
||
|
||
$this->getCandidatosAceptados();
|
||
// Podemos aceptar a candidatos propuestos por el sistema...
|
||
$candidato = $this->buscarCandidatoLista($id, $this->getCandidatosPropuestos());
|
||
|
||
// a candidatos propuestos por RRHH...
|
||
/* $rrhh = false;
|
||
$rechazado = false;
|
||
if ($candidato == null) {
|
||
$candidato = $this->buscarCandidatoLista($id, $this->getCandidatosPropuestosRRHH());
|
||
$rrhh = true;
|
||
} */
|
||
|
||
// Y a candidatos rechazados.
|
||
if ($candidato == null) {
|
||
$rrhh = false;
|
||
$candidato = $this->buscarCandidatoLista($id, $this->getCandidatosRechazados());
|
||
$rechazado = true;
|
||
}
|
||
|
||
$oid = $this->getValor("oid");
|
||
if ($candidato != null) {
|
||
$nombre_candidato = $candidato->getValor("nombre") . " " . $candidato->getValor("apellidos");
|
||
$mensaje = "Aceptado el candidato $nombre_candidato";
|
||
$this->actualizarHistorial($mensaje);
|
||
$mensaje = "Aceptado en la solicitud de oferta $oid";
|
||
// Contemplo si es candidato o empleado.
|
||
try {
|
||
$usuario = new Candidato($this->usuario, $candidato->getValor("oid"));
|
||
} catch (Exception $e) {
|
||
$usuario = new Empleado($this->usuario, $candidato->getValor("oid"));
|
||
}
|
||
$usuario->actualizarHistorial($mensaje);
|
||
$candidato->modFechaCandidatura();
|
||
$consulta = "UPDATE candidato_pedido SET estado = '120', fecha = curdate() WHERE candidato = '$id' AND pedido = '$oid'";
|
||
$bd = new BD();
|
||
$bd->execQuery($consulta);
|
||
$lista_antigua = array();
|
||
|
||
if ($rrhh) {
|
||
$lista_antigua = $this->listaPropuestosRRHH;
|
||
$this->listaPropuestosRRHH = null;
|
||
} else if ($rechazado) {
|
||
$lista_antigua = $this->listaRechazados;
|
||
$this->listaRechazados = null;
|
||
} else {
|
||
$lista_antigua = $this->listaPropuestos;
|
||
$this->listaPropuestos = null;
|
||
}
|
||
$lista_final = array();
|
||
foreach ($lista_antigua as $elem) {
|
||
if ($elem->getValor("oid") != $id) {
|
||
$lista_final[] = $elem;
|
||
}
|
||
}
|
||
if ($rrhh == true) {
|
||
$this->listaPropuestosRRHH = $lista_final;
|
||
} else if ($rechazado == true) {
|
||
$this->listaRechazados = $lista_final;
|
||
} else {
|
||
$this->listaPropuestos = $lista_final;
|
||
}
|
||
$this->listaAceptados[] = $candidato;
|
||
// Compruebo el número de empleados:
|
||
/* $necesarios = $this->getValor("empleados");
|
||
$actuales = count($this->listaAceptados);
|
||
$estado = $this->getValor("estado");
|
||
|
||
//Actualizo automáticamente el estado del pedido
|
||
switch ($estado) {
|
||
case 10:
|
||
if($actuales >= $necesarios){
|
||
$this->transita(20, "");
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
} */
|
||
|
||
$estadoC = $usuario->getValor("estado");
|
||
// Actualizo automáticamente el estado del candidato
|
||
// Cambiar el estado del candidato.
|
||
switch ($estadoC) {
|
||
case 540:
|
||
$usuario->transita(560, "");
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Rechaza un candidato para el pedido.
|
||
*/
|
||
function rechazarCandidato($id) {
|
||
$estadoP = $this->getValor("estado");
|
||
if ($estadoP != 130) {
|
||
return false;
|
||
}
|
||
|
||
$this->getCandidatosRechazados();
|
||
$oid = $this->getValor("oid");
|
||
$antiguo = 0;
|
||
// Buscamos al candidato en la lista de propuestos o de aceptados...
|
||
$candidato = $this->buscarCandidatoLista($id, $this->getCandidatosPropuestos());
|
||
if ($candidato == null) {
|
||
$candidato = $this->buscarCandidatoLista($id, $this->getCandidatosAceptados());
|
||
$antiguo = 1;
|
||
}
|
||
// Si no en la candidatos propuestos por RRHH...
|
||
if ($candidato == null) {
|
||
$candidato = $this->buscarCandidatoLista($id, $this->getCandidatosPropuestosRRHH());
|
||
$antiguo = 2;
|
||
}
|
||
|
||
if ($candidato != null) {
|
||
$nombre_candidato = $candidato->getValor("nombre") . " " . $candidato->getValor("apellidos");
|
||
$mensaje = "Rechazado el candidato $nombre_candidato";
|
||
$this->actualizarHistorial($mensaje);
|
||
$mensaje = "Rechazado en la solicitud de oferta $oid";
|
||
try {
|
||
$usuario = new Candidato($this->usuario, $candidato->getValor("oid"));
|
||
} catch (Exception $e) {
|
||
$usuario = new Empleado($this->usuario, $candidato->getValor("oid"));
|
||
}
|
||
$usuario->actualizarHistorial($mensaje);
|
||
$candidato->modFechaCandidatura();
|
||
$consulta = "UPDATE candidato_pedido SET estado = '10', fecha = curdate() where candidato = '$id' AND pedido = '$oid'";
|
||
$bd = new BD();
|
||
$bd->execQuery($consulta);
|
||
// Si estaba en la lista de propuestos lo sacamos de ahÃ
|
||
if ($antiguo == 0) {
|
||
$lista = $this->listaPropuestos;
|
||
$this->listaPropuestos = null;
|
||
foreach ($lista as $elem) {
|
||
if ($elem->getValor("candidato") != $id) {
|
||
$this->listaPropuestos[] = $elem;
|
||
}
|
||
}
|
||
// Si no, si estaba en la lista de aceptados lo sacamos de ahÃ
|
||
} else if ($antiguo == 1) {
|
||
$lista = $this->listaAceptados;
|
||
$this->listaAceptados = null;
|
||
foreach ($lista as $elem) {
|
||
if ($elem->getValor("candidato") != $id) {
|
||
$this->listaAceptados[] = $elem;
|
||
}
|
||
}
|
||
} else if ($antiguo == 2) {
|
||
$lista = $this->listaPropuestosRRHH;
|
||
$this->listaPropuestosRRHH = null;
|
||
foreach ($lista as $elem) {
|
||
if ($elem->getValor("candidato") != $id) {
|
||
$this->listaPropuestosRRHH[] = $elem;
|
||
}
|
||
}
|
||
}
|
||
$this->listaRechazados[] = $candidato;
|
||
// Compruebo el número de empleados:
|
||
$necesarios = $this->getValor("empleados");
|
||
$actuales = count($this->listaAceptados);
|
||
$estado = $this->getValor("estado");
|
||
// Actualizo automáticamente el estado del pedido
|
||
switch ($estado) {
|
||
case 20:
|
||
if ($actuales < $necesarios) {
|
||
$this->transita(10, "");
|
||
}
|
||
case 30:
|
||
if ($actuales < $necesarios) {
|
||
$this->transita(10, "");
|
||
}
|
||
break;
|
||
default:
|
||
}
|
||
|
||
$estadoC = $usuario->getValor("estado");
|
||
// Actualizo automáticamente el estado del candidato
|
||
// Cambiar el estado del candidato.
|
||
switch ($estadoC) {
|
||
case 30:
|
||
$usuario->transita(10, "");
|
||
break;
|
||
case 70:
|
||
$usuario->transita(50, "");
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Busca un candidato en una lista.
|
||
*
|
||
* @param id $ - identificador del candidato a buscar.
|
||
* @param lista $ - lista en la que buscar al candidato.
|
||
*/
|
||
function buscarCandidatoLista($id, $lista) {
|
||
if ($lista) {
|
||
foreach ($lista as $elem) {
|
||
if ($elem->getValor("oid") == $id) {
|
||
return $elem;
|
||
}
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* Devuelve una lista de tecnologÃas asociadas al pedido.
|
||
*/
|
||
function getTecnologias() {
|
||
if ($this->listaTecnologias == null) {
|
||
$oid = $this->getValor("oid");
|
||
$consulta = "SELECT tecnologia, id FROM tecnologia_pedido, tecnologia WHERE oid_i = '$oid' and tecnologia_pedido.tecnologia = tecnologia.oid";
|
||
$bd = new BD();
|
||
$this->listaTecnologias = $bd->keyValueQuery($consulta, "id", "tecnologia");
|
||
}
|
||
|
||
return $this->listaTecnologias;
|
||
}
|
||
|
||
/**
|
||
* Devuelve una lista de idiomas asociados al pedido.
|
||
*/
|
||
function getIdiomas() {
|
||
if ($this->listaIdiomas == null) {
|
||
$oid = $this->getValor("oid");
|
||
$consulta = "SELECT idioma, id FROM idioma_pedido, idiomas WHERE oid_i = '$oid' and idioma_pedido.idioma = idiomas.oid";
|
||
$bd = new BD();
|
||
$this->listaIdiomas = $bd->keyValueQuery($consulta, "id", "idioma");
|
||
}
|
||
|
||
return $this->listaIdiomas;
|
||
}
|
||
|
||
/**
|
||
* Devuelve una lista de perfiles asociados al pedido.
|
||
*/
|
||
function getPerfiles() {
|
||
if ($this->listaPerfiles == null) {
|
||
$oid = $this->getValor("oid");
|
||
$consulta = "SELECT perfil, id FROM perfil_pedido, perfil WHERE oid_i = '$oid' and perfil_pedido.perfil = perfil.oid";
|
||
$bd = new BD();
|
||
$this->listaPerfiles = $bd->keyValueQuery($consulta, "id", "perfil");
|
||
}
|
||
|
||
return $this->listaPerfiles;
|
||
}
|
||
|
||
/**
|
||
* Devuelve una lista de provincias asociadas al pedido.
|
||
*/
|
||
function getProvincias() {
|
||
if ($this->listaProvincias == null) {
|
||
$oid = $this->getValor("oid");
|
||
$consulta = "SELECT provincia, id FROM provincia_pedido, provincias WHERE oid_i = '$oid' and provincia_pedido.provincia = provincias.oid";
|
||
$bd = new BD();
|
||
$this->listaProvincias = $bd->keyValueQuery($consulta, "id", "provincia");
|
||
}
|
||
|
||
return $this->listaProvincias;
|
||
}
|
||
|
||
function addTecnologias($array) {
|
||
foreach ($array as $elem) {
|
||
$this->addTecnologia($elem);
|
||
}
|
||
}
|
||
|
||
function addIdiomas($array) {
|
||
foreach ($array as $elem) {
|
||
$this->addIdioma($elem);
|
||
}
|
||
}
|
||
|
||
function addProvincias($array) {
|
||
foreach ($array as $elem) {
|
||
$this->addProvincia($elem);
|
||
}
|
||
}
|
||
|
||
function addPerfiles($array) {
|
||
if (gettype($array) == "array") {
|
||
foreach ($array as $elem) {
|
||
$this->addPerfil($elem);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Asocia una nueva tecnologÃa en la base de datos.
|
||
*/
|
||
private function addTecnologia($id) {
|
||
$oid = $this->getValor("oid");
|
||
$this->getTecnologias();
|
||
if (!in_array($id, $this->listaTecnologias)) {
|
||
$consulta = "SELECT id FROM tecnologia WHERE oid='$id'";
|
||
$bd = new BD();
|
||
$nombre_tecno = $bd->getCampo($consulta);
|
||
$consulta = "INSERT INTO tecnologia_pedido VALUES('$id', '$oid')";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
$mensaje = "Nueva tecno: $nombre_tecno";
|
||
//$this->actualizarHistorial($mensaje);
|
||
$this->listaTecnologias[$nombre_tecno] = $id;
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Asocia un nuevo idioma en la base de datos.
|
||
*/
|
||
private function addIdioma($id) {
|
||
$oid = $this->getValor("oid");
|
||
$this->getIdiomas();
|
||
if (!in_array($id, $this->listaIdiomas)) {
|
||
$consulta = "SELECT id FROM idiomas WHERE oid='$id'";
|
||
$bd = new BD();
|
||
$nombre_idioma = $bd->getCampo($consulta);
|
||
$consulta = "INSERT INTO idioma_pedido VALUES('$id', '$oid')";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
$mensaje = "Nuevo idioma: $nombre_idioma";
|
||
//$this->actualizarHistorial($mensaje);
|
||
$this->listaIdiomas[$nombre_idioma] = $id;
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Asocia un nuevo perfil en la base de datos.
|
||
*/
|
||
private function addPerfil($id) {
|
||
$oid = $this->getValor("oid");
|
||
$this->getPerfiles();
|
||
if (!in_array($id, $this->listaPerfiles)) {
|
||
$consulta = "SELECT id FROM perfil WHERE oid='$id'";
|
||
$bd = new BD();
|
||
$nombre_perfil = $bd->getCampo($consulta);
|
||
$consulta = "INSERT INTO perfil_pedido VALUES('$id', '$oid')";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
$mensaje = "Nuevo perfil: $nombre_perfil";
|
||
//$this->actualizarHistorial($mensaje);
|
||
$this->listaPerfiles[$nombre_perfil] = $id;
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Asocia una nueva provincia en la base de datos.
|
||
*/
|
||
private function addProvincia($id) {
|
||
$oid = $this->getValor("oid");
|
||
$this->getProvincias();
|
||
if (!in_array($id, $this->listaProvincias)) {
|
||
$consulta = "SELECT id FROM provincias WHERE oid='$id'";
|
||
$bd = new BD();
|
||
$nombre_provincia = $bd->getCampo($consulta);
|
||
$consulta = "INSERT INTO provincia_pedido VALUES('$id', '$oid')";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
$mensaje = "Nueva provincia: $nombre_provincia";
|
||
//$this->actualizarHistorial($mensaje);
|
||
$this->listaProvincias[$nombre_provincia] = $id;
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Elimina la asociación entre una tecnología y un pedido.
|
||
*/
|
||
function removeTecnologia($id) {
|
||
$oid = $this->getValor("oid");
|
||
$this->getTecnologias();
|
||
if (in_array($id, $this->listaTecnologias)) {
|
||
$consulta = "SELECT id FROM tecnologia WHERE oid='$id'";
|
||
$bd = new BD();
|
||
$nombre_tecno = $bd->getCampo($consulta);
|
||
$consulta = "DELETE FROM tecnologia_pedido WHERE tecnologia='$id' and oid_i='$oid'";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
$mensaje = "Eliminada tecno: $nombre_tecno";
|
||
//$this->actualizarHistorial($mensaje);
|
||
$lista = $this->listaTecnologias;
|
||
$this->listaTecnologias = null;
|
||
foreach ($lista as $key => $value) {
|
||
if ($value != $id) {
|
||
$this->listaTecnologias[$key] = $value;
|
||
}
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Elimina la asociación entre un idioma y un pedido.
|
||
*/
|
||
function removeIdioma($id) {
|
||
$oid = $this->getValor("oid");
|
||
$this->getIdiomas();
|
||
if (in_array($id, $this->listaIdiomas)) {
|
||
$consulta = "SELECT id FROM idiomas WHERE oid='$id'";
|
||
$bd = new BD();
|
||
$nombre_idioma = $bd->getCampo($consulta);
|
||
$consulta = "DELETE FROM idioma_pedido WHERE idioma='$id' and oid_i='$oid'";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
$mensaje = "Eliminado idioma: $nombre_idioma";
|
||
//$this->actualizarHistorial($mensaje);
|
||
$lista = $this->listaIdiomas;
|
||
$this->listaIdiomas = null;
|
||
foreach ($lista as $key => $value) {
|
||
if ($value != $id) {
|
||
$this->listaIdiomas[$key] = $value;
|
||
}
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Elimina la asociación entre una provincia y un pedido.
|
||
*/
|
||
function removeProvincia($id) {
|
||
$oid = $this->getValor("oid");
|
||
$this->getProvincias();
|
||
if (in_array($id, $this->listaProvincias)) {
|
||
$consulta = "SELECT id FROM provincias WHERE oid='$id'";
|
||
$bd = new BD();
|
||
$nombre_provincia = $bd->getCampo($consulta);
|
||
$consulta = "DELETE FROM provincia_pedido WHERE provincia='$id' and oid_i='$oid'";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
$mensaje = "Eliminada provicia: $nombre_provincia";
|
||
//$this->actualizarHistorial($mensaje);
|
||
$lista = $this->listaProvincias;
|
||
$this->listaProvincias = null;
|
||
foreach ($lista as $key => $value) {
|
||
if ($value != $id) {
|
||
$this->listaProvincias[$key] = $value;
|
||
}
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Elimina la asociación entre un perfil y un pedido.
|
||
*/
|
||
function removePerfil($id) {
|
||
$oid = $this->getValor("oid");
|
||
$this->getPerfiles();
|
||
if (in_array($id, $this->listaPerfiles)) {
|
||
$consulta = "SELECT id FROM perfil WHERE oid='$id'";
|
||
$bd = new BD();
|
||
$nombre_perfil = $bd->getCampo($consulta);
|
||
$consulta = "DELETE FROM perfil_pedido WHERE perfil='$id' and oid_i='$oid'";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
$mensaje = "Eliminado perfil: $nombre_perfil";
|
||
//$this->actualizarHistorial($mensaje);
|
||
$lista = $this->listaPerfiles;
|
||
$this->listaPerfiles = null;
|
||
foreach ($lista as $key => $value) {
|
||
if ($value != $id) {
|
||
$this->listaPerfiles[$key] = $value;
|
||
}
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Calcula la afinidad del pedido con todos los candidatos del sistema.
|
||
*
|
||
* @param id $ - identificador del usuario.
|
||
*/
|
||
function calculaAfinidad() {
|
||
// Recuperamos al pedido:
|
||
$id = $this->getValor("oid");
|
||
$pesoIdioma = $this->getValor("pesoIdioma");
|
||
$pesoTecno = $this->getValor("pesoTecno");
|
||
$pesoPerfil = $this->getValor("pesoPerfil");
|
||
// Eliminamos a los usuario de la tabla de candidatos en pedido que se encuentren
|
||
// en proceso para este pedido.
|
||
$consulta = "DELETE FROM candidato_pedido WHERE pedido='$id' AND estado='110'";
|
||
$bd = new BD();
|
||
$bd->execQuery($consulta);
|
||
// Si el pedido no está cerrado calculamos su afinidad para los usuarios:
|
||
$estado = $this->getValor("estado");
|
||
// Estados válidos: En configuración
|
||
if ($estado == "130") {
|
||
$consulta = "SELECT email FROM usuarios WHERE tipo='candidato' AND estado IN ('540', '560')";
|
||
|
||
$bd = new BD();
|
||
$listaUsuarios = $bd->arrayQuery($consulta, "email");
|
||
// Calculamos la afinidad de cada usuario.
|
||
foreach ($listaUsuarios as $emailUsuario) {
|
||
try {
|
||
$usuario = new Usuario($emailUsuario, $this->usuario);
|
||
$idUsuario = $usuario->getValor("oid");
|
||
$idiomasPedido = $this->getIdiomas();
|
||
$idiomasUsuario = $usuario->getidiomas();
|
||
$tecnologiasPedido = $this->getTecnologias();
|
||
$tecnologiasUsuario = $usuario->getTecnologias();
|
||
$perfilesPedido = $this->getPerfiles();
|
||
$perfilesUsuario = $usuario->getPerfiles();
|
||
$provinciasPedido = $this->getProvincias();
|
||
$provinciasDeseadas = $usuario->getProvinciasDeseadas();
|
||
$provinciasNoDeseadas = $usuario->getProvinciasNoDeseadas();
|
||
$afinidad = new Afinidad($idiomasPedido, $idiomasUsuario, $tecnologiasPedido,
|
||
$tecnologiasUsuario, $perfilesPedido, $perfilesUsuario, $provinciasPedido, $provinciasDeseadas, $provinciasNoDeseadas);
|
||
$afi = $afinidad->calculaAfinidad($pesoIdioma, $pesoPerfil, $pesoTecno);
|
||
echo $afi . "<br/>";
|
||
if ($afi > 0) {
|
||
$consulta = "INSERT INTO candidato_pedido (candidato, pedido, afinidad, estado, fecha) VALUES('$idUsuario', '$id', '$afi', '110', curdate())";
|
||
|
||
$bd = new BD();
|
||
$bd->execQuery($consulta);
|
||
}
|
||
} catch (Exception $e) {
|
||
// Nunca deberÃa entrar aquÃ.
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
function actualizarHistorial($mensaje) {
|
||
$oid = $this->getValor("oid");
|
||
$usuario = $this->usuario->getValor("nombre");
|
||
$consulta = "INSERT INTO historial_pedido (oid_h, fecha_h, persona_h, texto_h) VALUES('$oid', now(), '$usuario', '$mensaje')";
|
||
$bd = new BD();
|
||
return $bd->execQuery($consulta);
|
||
}
|
||
|
||
function getHistorial() {
|
||
$historial = "";
|
||
$oid = $this->getValor("oid");
|
||
|
||
$consulta = "SELECT * FROM historial_pedido WHERE oid_h='$oid' ORDER BY id DESC";
|
||
$bd = new BD();
|
||
$resultado = $bd->execQuery($consulta);
|
||
|
||
while ($rows = mysql_fetch_array($resultado)) {
|
||
$fecha = $rows["fecha_h"];
|
||
$persona = $rows["persona_h"];
|
||
$texto = $rows["texto_h"];
|
||
$historial .= "[$fecha] $persona - $texto\n";
|
||
}
|
||
|
||
return $historial;
|
||
}
|
||
|
||
function getSiguientes() {
|
||
$estado = $this->getValor("estado");
|
||
$idioma = $this->usuario->getValor("idioma");
|
||
$rol = $this->usuario->getValor("rol");
|
||
$a = new Automata("pedidos", $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("pedidos", $idioma, $rol);
|
||
$transita = $a->getTransicion($origen, $destino);
|
||
|
||
if (($transita == "") || !($transita >= 0)) {
|
||
return false;
|
||
} else {
|
||
$res = $this->ejecutaTransicion($transita, $argumentos);
|
||
if ($res) {
|
||
$this->setAutomatico = true;
|
||
$this->setCampo("msgEstado", $argumentos);
|
||
$this->setCampo("estado", $destino);
|
||
$this->setAutomatico = false;
|
||
}
|
||
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("Pedido", $funcion), $argumentos);
|
||
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* Sin calificar -> En configuración
|
||
*/
|
||
private function ejecutar110130() {
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* En configuración ->Sin calificar
|
||
*/
|
||
private function ejecutar130110() { // De *En configuración* a *Sin calificar*
|
||
$id = $this->getValor("oid");
|
||
|
||
$bd = new BD();
|
||
|
||
// Borro la tabla de ofertas de este pedido
|
||
$consulta = "DELETE FROM candidato_pedido WHERE pedido='$id'";
|
||
$bd->execQuery($consulta);
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Añade un comentario por parte de un gerente hacia un candidato
|
||
*
|
||
* @param idCandidato $ : oid del candidato
|
||
* @param observacion $ : observacion a proponer
|
||
*/
|
||
function addComentarioPropuesta($idCandidato, $observacion) {
|
||
// Sólo lo puede hacer los gerentes
|
||
if (!$this->usuario->tieneRol("3")) {
|
||
$error = "No tiene permisos para editar la candidatura";
|
||
throw new Exception($error);
|
||
return false;
|
||
exit;
|
||
}
|
||
$consulta = "UPDATE candidato_pedido SET obsGerente='" . $observacion . "' WHERE pedido='" . $this->getValor("oid") . "' AND candidato='" . $idCandidato . "'";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
// Nos actualizamos
|
||
$candidato = $this->buscarCandidatoLista($idCandidato, $this->getCandidatosPropuestos());
|
||
if ($candidato == null) {
|
||
$candidato = $this->buscarCandidatoLista($idCandidato, $this->getCandidatosPropuestosRRHH());
|
||
}
|
||
if ($candidato == null) {
|
||
$candidato = $this->buscarCandidatoLista($idCandidato, $this->getCandidatosRechazados());
|
||
}
|
||
if ($candidato == null) {
|
||
$candidato = $this->buscarCandidatoLista($idCandidato, $this->getCandidatosAceptados());
|
||
}
|
||
$candidato->modObsGerente($observacion);
|
||
} else {
|
||
$error = "No se ha podido actualiar la observación";
|
||
throw new Exception($error);
|
||
return false;
|
||
exit;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Añade un comentario por parte de un RRHH hacia un candidato
|
||
*
|
||
* @param idCandidato $ : oid del candidato
|
||
* @param observacion $ : observacion a proponer
|
||
*/
|
||
function addComentarioPropuestaRRHH($idCandidato, $observacion) {
|
||
// Sólo lo puede hacer los RRHH
|
||
if (!$this->usuario->tieneRol("4")) {
|
||
$error = "No tiene permisos para editar la candidatura";
|
||
throw new Exception($error);
|
||
return false;
|
||
exit;
|
||
}
|
||
$consulta = "UPDATE candidato_pedido SET obsRRHH='" . $observacion . "' WHERE pedido='" . $this->getValor("oid") . "' AND candidato='" . $idCandidato . "'";
|
||
$bd = new BD();
|
||
if ($bd->execQuery($consulta)) {
|
||
// Nos actualizamos
|
||
$candidato = $this->buscarCandidatoLista($idCandidato, $this->getCandidatosPropuestos());
|
||
if ($candidato == null) {
|
||
$candidato = $this->buscarCandidatoLista($idCandidato, $this->getCandidatosPropuestosRRHH());
|
||
}
|
||
if ($candidato == null) {
|
||
$candidato = $this->buscarCandidatoLista($idCandidato, $this->getCandidatosRechazados());
|
||
}
|
||
if ($candidato == null) {
|
||
$candidato = $this->buscarCandidatoLista($idCandidato, $this->getCandidatosAceptados());
|
||
}
|
||
$candidato->modObsRRHH($observacion);
|
||
} else {
|
||
$error = "No se ha podido actualiar la observación";
|
||
throw new Exception($error);
|
||
return false;
|
||
exit;
|
||
}
|
||
}
|
||
|
||
function setOfertaElaborada() {
|
||
$resultado = false;
|
||
$estado = $this->getValor("estado");
|
||
switch ($estado) {
|
||
case 120;
|
||
case 140;
|
||
case 150: $resultado=true;
|
||
break;
|
||
|
||
case 110;
|
||
case 130: $consulta = "UPDATE pedidos SET estado=140 where oid='".$this->getValor("oid")."'";
|
||
$bd = new BD();
|
||
return $bd->execQuery($consulta);
|
||
break;
|
||
|
||
default: $resultado=false;
|
||
break;
|
||
}
|
||
|
||
return $resultado;
|
||
}
|
||
|
||
}
|
||
|
||
?>
|