Incam_Intranet/Objects/Pedido.php

1131 lines
42 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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&oacute;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&oacute;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;
}
}
?>