Incam_Intranet/Objects/Pedido.php

1376 lines
41 KiB
PHP

<?php
/*
* Clase Pedido
*/
include_once("BD.php");
include_once("CandidatoPedido.php");
include_once("Candidato.php");
include_once("Empleado.php");
include_once("Afinidad.php");
include_once("Automata.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();
/* Lista de candidatos propuestos*/
private $listaPropuestos = null;
/* Lista de candidatos propuestos por RRHH*/
private $listaPropuestosRRHH = null;
/* Lista de candidatos aceptados*/
private $listaAceptados = null;
/* Lista de candidatos rechazados*/
private $listaRechazados = 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");
/* Booleano que indica si el cambio de un campo lo hace por razones automáticas y dejar realizar
* el camio */
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>";
}
}
/**
* 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 = "<a href='".$path."/detalle_candidato.php?oid=".$oid."'>".$nombre."</a>";
$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 '<script type="text/javascript">
// <!--
// if (confirm("Se acaba de crear un nuevo pedido con el codigo:'.$id.'. ¿Desea visualizar el nuevo pedido?")) {
// // Respuesta afirmativa...
// document.location="pedido.php?idPedido='.$id.'";
// }
// -->
// </script>';
$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&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;
}
}
}
?>