Incam_Intranet/Objects/Pedido.php

1121 lines
41 KiB
PHP
Raw Permalink Normal View History

<?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<73>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<6F>as */
private $listaTecnologias = null;
/* Lista de idiomas */
private $listaIdiomas = null;
/* Lista de provincias */
private $listaProvincias = null;
/* Par<61>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<EFBFBD>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<EFBFBD>mero de candidatos asociados al pedido.
*
* @param tipo $ - estado del candidato en el pedido.
* @return n<EFBFBD>mero de candidatos asociados a ese pedido.
*/
function dameNumCand($tipo) {
// PERMISOS:
/*
* Admin (1) - Todos
* Selecci<EFBFBD>n (4) - Todos
* Gestor (3) - Los suyos
* Otro - Excepci<EFBFBD>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<EFBFBD>adir campos al pedido.
*
* @param array $ - datos a a<EFBFBD>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<EFBFBD>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;
}
/**
* 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<EFBFBD>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);
if ($viejo == "" && $valor != "") {
$historial = "$nombre (de - a $valor)";
} else {
$historial = "$nombre (de $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<EFBFBD>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<73> 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<6F>ticamente el estado del pedido
switch ($estado) {
case 10:
if($actuales >= $necesarios){
$this->transita(20, "");
}
break;
default:
break;
} */
$estadoC = $usuario->getValor("estado");
// Actualizo autom<6F>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<6F>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<6F>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<EFBFBD>n entre una tecnolog<EFBFBD>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<EFBFBD>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<EFBFBD>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<EFBFBD>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<73> cerrado calculamos su afinidad para los usuarios:
$estado = $this->getValor("estado");
// Estados v<>lidos: En configuraci<63>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 fecha_h 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<EFBFBD>n
*/
private function ejecutar110130() {
return true;
}
/**
* En configuraci<EFBFBD>n ->Sin calificar
*/
private function ejecutar130110() { // De *En configuraci<63>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<EFBFBD>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<EFBFBD>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;
}
}
?>