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
"; } } /** * 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; } /** * 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); if($viejo == "" && $valor != ""){ $historial = "$nombre (de - a $valor)"; }else{ $historial = "$nombre (de $viejo a $valor)"; } $this->actualizarHistorial($historial); //Si hago un update del perfil tengo que actualizar la afinidad: if(in_array($nombre, $this->listaAfinidad)){ $this->calculaAfinidad(); //En este caso tengo que comprobar si cambio de estado }else if($nombre == "empleados"){ $necesarios = $valor; $actuales = count($this->getCandidatosAceptados()); $estado = $this->getValor("estado"); //Actualizo automáticamente el estado del pedido switch($estado){ case 10: if($actuales >= $necesarios){ $this->transita("20", ""); } break; case 20: if($actuales < $necesarios){ $this->transita("10", ""); } break; case 30: if($actuales < $necesarios){ $this->transita("10", ""); } break; default: } } } } }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; } /** * Devuelve una lista de candidatos propuestos para el pedido. */ function getCandidatosPropuestos(){ if($this->listaPropuestos == null){ $this->listaPropuestos = $this->getCandidatos("30"); } return $this->listaPropuestos; } /** * Devuelve una lista de candidatos aceptados para el pedido. */ function getCandidatosAceptados(){ if($this->listaAceptados == null){ $this->listaAceptados = $this->getCandidatos("20"); } return $this->listaAceptados; } /** * Devuelve una lista de candidatos rechazados para el pedido. */ function getCandidatosRechazados(){ if($this->listaRechazados == null){ $this->listaRechazados = $this->getCandidatos("10"); } return $this->listaRechazados; } /** * Devuelve una lista de candidatos propuestos por RRHH. */ function getCandidatosPropuestosRRHH(){ if($this->listaPropuestosRRHH == null){ $this->listaPropuestosRRHH = $this->getCandidatos("40"); } return $this->listaPropuestosRRHH; } 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 el pedido $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 == 40 || $estadoP == 50){ 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 = '20', 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 10: $usuario->transita(30, ""); break; case 50: $usuario->transita(70, ""); break; default: break; } return true; } return false; } /** * Rechaza un candidato para el pedido. */ function rechazarCandidato($id){ $estadoP = $this->getValor("estado"); if($estadoP == 40 || $estadoP == 50){ 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); } $this->calculaAfinidad(); } function addIdiomas($array){ foreach($array as $elem){ $this->addIdioma($elem); } $this->calculaAfinidad(); } function addProvincias($array){ foreach($array as $elem){ $this->addProvincia($elem); } $this->calculaAfinidad(); } function addPerfiles($array){ if(gettype($array) == "array"){ foreach($array as $elem){ $this->addPerfil($elem); } $this->calculaAfinidad(); } } /** * 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->listasProvincias)){ $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->listasProvincias[$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; } $this->calculaAfinidad(); 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; } $this->calculaAfinidad(); 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->listasProvincias)){ $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->listasProvincias; $this->listasProvincias = null; foreach($lista as $key => $value){ if($value != $id){ $this->listasProvincias[$key] = $value; } } }else{ return false; } }else{ return false; } $this->calculaAfinidad(); 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; } $this->calculaAfinidad(); 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='30'"; $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: Todos menos cerrado (Pendiente). if($estado == 10){ $consulta = "SELECT email FROM usuarios WHERE tipo='candidato' AND estado IN ('10', '30', '50', '70')"; $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(); $afinidad = new Afinidad($idiomasPedido, $idiomasUsuario, $tecnologiasPedido, $tecnologiasUsuario, $perfilesPedido, $perfilesUsuario, $provinciasPedido, $provinciasDeseadas); $afi = $afinidad->calculaAfinidad($pesoIdioma, $pesoPerfil, $pesoTecno); if($afi > 0){ $consulta = "INSERT INTO candidato_pedido (candidato, pedido, afinidad, estado, fecha) VALUES('$idUsuario', '$id', '$afi', '30', 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; } /** * Pendiente a asignado * Admin, Gestor SE LLEGA DESDE: - Al aceptar al candidato (pedido.aceptar). - Editar el número de empleados del pedido. PRECONDICIONES: - Comprobar que el número de candidatos aceptados es mayor o igual que el de candidatos necesarios. POSTCONDICIONES: - Ninguna. */ private function ejecutar1020(){ $necesarios = $this->getValor("empleados"); $actuales = count($this->listaAceptados); //PRECONDICIONES: //- Comprobar que el número de candidatos aceptados es mayor o igual que el de candidatos necesarios. if($actuales >= $necesarios){ return true; }else{ return false; } } /** * Asignado a Pendiente * Admin, Gestor SE LLEGA DESDE: - Al rechazar al candidato (pedido.rechazar). - Editar el número de empleados del pedido. PRECONDICIONES: - Comprobar que el número de candidatos aceptados es menor que el de candidatos necesarios. POSTCONDICIONES: - Ninguna. */ private function ejecutar2010(){ $necesarios = $this->getValor("empleados"); $actuales = count($this->listaAceptados); //Comprobamos que se dan las condiciones para transitar. if($actuales < $necesarios){ return true; }else{ return false; } } /** * Asignado a No contratado * Pendiente a No contratado * Tramitando contratación a No contratado * Admin, Gestor SE LLEGA DESDE: - La vista del pedido al pulsar el botón de “Cambiar a No contratado”. PRECONDICIONES: - Mensaje indicando el motivo del cambio a No contratado. POSTCONDICIONES: - Se borra la lista de usuarios aceptados, rechazados y en proceso para este pedido y para cada candidato cambia a su estado previo de disponible o entrevistado. */ private function ejecutar2050($mensaje){ if($mensaje == ""){ $error = "Debe introducir un motivo para pasar el pedido a Desactivado"; throw new Exception($error); return false; exit; } $id = $this->getValor("oid"); $bd = new BD(); //Borro la tabla de candidaturas para este pedido. $consulta = "DELETE FROM candidato_pedido WHERE pedido='$id'"; $bd->execQuery($consulta); //Cojo los candidatos y limpio las listas del pedido. $candidatos = $this->getCandidatosAceptados(); if(count($candidatos) > 0){ //Voy empleado por empleado comprobando su estado y transitando. foreach($candidatos as $c){ $candidato = new Candidato($this->usuario, $c->getValor("oid")); $estado = $candidato->getValor("estado"); switch ($estado) { case 30: $candidato->transita(10, ""); break; case 70: $candidato->transita(50, ""); break; default: break; } } } $this->listaPropuestos = null; $this->listaPropuestosRRHH = null; $this->listaAceptados = null; $this->listaRechazados = null; return true; } /** * Tramitando contratación a Contratado. * Admin, Gestor SE LLEGA DESDE: - La vista del pedido, al pulsar el botón de “Cambiar a cerrado”. PRECONDICIONES: - Todos los candidatos aceptados están incorporados a la empresa. POSTCONDICIONES: - Se eliminan todos los candidatos propuestos por el sistema y por RRHH y rechazados ESCENARIO ALTERNATIVO: - Por cada candidato aceptado no incorporado a la empresa se generará una alarma en forma de correo electrónico al personal de recursos humanos para que le incorpore. */ private function ejecutar3040(){ $lista = $this->getCandidatosAceptados(); $ok = true; //Si encontramos algún aceptado que sea candidato tenemos error. if(count($lista) <= 0){ $error = "No hay candidados aceptados para esta solicitud de oferta"; throw new Exception($error); return false; exit; } foreach($lista as $candidato){ $tipo = $candidato->getValor("tipo"); //Escenario alternativo if($tipo != "usuario"){ $nombre = $candidato->getValor("nombre"); $oid = $candidato->getValor("oid"); //Enviar un mail a RRHH con los datos pidiendo incorporación. $asunto = "Solicitud de contratación"; $direccion = constante("email"); $path = "http://portal.selforsistemas.net"; $link = "".$nombre.""; $email = "Se solicita la contratación para el candidato ".$link; envia_correo($direccion, $asunto, $email); $ok = false; } } if($ok){ $bd = new BD(); //Borro la tabla de candidaturas para este pedido. $consulta = "DELETE FROM candidato_pedido WHERE pedido='$id' AND estado IN ('10', '30', '40')"; $bd->execQuery($consulta); $this->listaPropuestos = null; $this->listaPropuestosRRHH = null; }else{ $error = "No se puede contratar aprobar la oferta hasta que todos los candidatos hayan sido contratados."; throw new Exception($error); return false; exit; } return $ok; } /** * No contratado a Pendiente * Admin, Gestor SE LLEGA DESDE: - La vista del pedido, al pulsar el botón de “Cambiar a pendiente”. POSTCONDICIONES: - Crea un nuevo pedido con los mismos datos cambiando el código y lo pone en “Pendiente”. - Calcula las afinidades para ese nuevo pedido que está en "Pendiente". */ private function ejecutar5010(){ $l = new ListaPedido($this->usuario, "", "", ""); $this->getValor("procedencia"); $this->getValor("cliente"); $bd = new BD(); $miId = $this->getValor("oid"); $consulta = "SELECT * FROM pedidos WHERE oid='$miId'"; $res = $bd->execQuery($consulta); $this->parseaResource($res); $campos = array(); foreach($this->campos as $campo => $valor){ if($campo != "oid" && $campo != "fecha") $campos[$campo] = $valor; } $campos["estado"] = 10; $campos["msgEstado"] = ""; $id = $l->addPedido($campos); $p = new Pedido($id, $this->usuario); $p->addTecnologias($this->getTecnologias()); $p->addIdiomas($this->getIdiomas()); $p->addProvincias($this->getProvincias()); // echo ''; $this->calculaAfinidad(); return false; } /** * 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; } } } ?>