Incam_Intranet/src/Objects/Oferta.php
roberto 4204a6ea18 Tareas #723
Se solicitan los siguientes cambios en los estados de los candidatos.

- El estado "Todos los candidatos" se sustituirá por "Todos".

- El estado "Pendiente de clasificar" se sustituirá por "borrador". (Desde este estado se podrá ir a todos menos a los estados "en proceso").

- Nuevo estado "Sin capacidades". (Desde este estado podrá ir a todos los demás menos a "Disponible asignado")

- El estado "Rechazados" se queda como está. (Desde este estado solo se podrá volver al estado "borrador").

- El estado "No disponible" se sustituirá por "Si, más adelante". (Desde este estado solo se podrá volver al estado "borrador").

- Nuevo estado "Otras provincias". (Desde este estado solo se podrá volver al estado "borrador").

- El estado "Disponible" pasará a "En proceso: Disponible". (Desde este estado se podrá ir a cualquiera de los estados existentes)

- El estado "Disponible asignado" pasará a "En proceso: Disponible asignado. (Este estado solo se pasará cuando un candidato esté asignado a una oferta, y no podrá cambiarse hasta que sea desasignado de la oferta)


git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_Intranet/trunk@113 e2b1556b-49f8-d141-9351-52d6861a72d9
2011-12-28 11:22:48 +00:00

381 lines
14 KiB
PHP

<?php
/*
* Clase Oferta
*/
include_once("BD.php");
include_once("Automata.php");
include_once("ListaCandidatos.php");
include_once("Candidato.php");
class Oferta {
// Atributos:
/* Usuario que tiene activa la sesión. */
private $usuario;
protected $campos = array();
// Constructores:
function Oferta($oid, $usuario) {
$this->usuario = $usuario;
$consulta = "SELECT oid FROM candidato_pedido WHERE oid = '$oid'";
$bd = new BD();
$num = $bd->numFilas($consulta);
if ($num > 0) {
$this->campos['oid'] = $oid;
} else {
$error = "Oferta no encontrada.";
throw new Exception($error);
}
}
function eliminar() {
//Antes de nada quitamos el candidato asociado a la oferta para que se haga la lógica que corresponda
$idCand = $this->getValor("candidato");
if (!empty($idCand)) {
if (!$this->quitarCandidato()) {
return false;
}
}
// eliminamos en la oferta de la BD
$consulta = "DELETE FROM candidato_pedido WHERE oid = ".$this->campos['oid'];
$bd = new BD();
if (!$bd->execQuery($consulta)) {
return false;
} else {
$mensaje = "Oferta eliminada";
$this->actualizarHistorial($mensaje);
return true;
}
}
function actualizarHistorial($mensaje) {
$oid = $this->getValor("oid");
$usuario = $this->usuario->getValor("nombre");
$consulta = "INSERT INTO historial_oferta (oid_h, fecha_h, persona_h, texto_h) VALUES('$oid', now(), '$usuario', '$mensaje')";
$bd = new BD();
return $bd->execQuery($consulta);
}
function darNombreEstado($cod, $idioma) {
$consulta = "SELECT NOMBRE from candidaturas_estados WHERE cod=\"" . $cod . "\" AND idioma=\"" . $idioma . "\"";
$bd = new BD();
return $bd->getCampo($consulta);
}
function getValor($nombre) {
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_estado":
$idEstado = $this->getValor("estado");
$idioma = $this->usuario->getValor("idioma");
$consulta = "SELECT nombre FROM candidaturas_estados WHERE cod=\"" . $idEstado . "\" AND idioma=\"" . $idioma . "\"";
break;
case "nombre_solicitud":
$oidPedido = $this->getValor("pedido");
$consulta = "SELECT nombre FROM pedidos WHERE oid=\"" . $oidPedido . "\"";
break;
case "nombre_candidato":
$oidCandidato = $this->getValor("candidato");
$consulta = "SELECT concat(nombre, ' ', apellidos) FROM usuarios WHERE oid=\"" . $oidCandidato . "\"";
break;
default: $consulta = "SELECT " . $nombre . " FROM candidato_pedido WHERE oid=\"" . $this->campos['oid'] . "\"";
break;
}
// Lo insertamos para nosotros
$bd = new BD();
$valor = $bd->getCampo($consulta);
// Lo insertamos para nosotros
$arrayAct = array($nombre => $valor);
$this->campos = $this->campos + $arrayAct;
return $valor;
}
}
/**
* Acceso a los campos del pedido.
*
* @return los campos del pedido.
*/
function getCampos() {
return $this->campos;
}
function getSiguientes() {
$estado = $this->getValor("estado");
$idioma = $this->usuario->getValor("idioma");
$rol = $this->usuario->getValor("rol");
$a = new Automata("candidaturas", $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("candidaturas", $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("Oferta", $funcion), $argumentos);
return $res;
}
/**
* En configuración -> Configurada
*/
private function ejecutar110120() {
// Comprobamos que haya un candidato asignado.
$candidato = $this->getValor("candidato");
if (!empty($candidato)) {
return true;
} else {
$error = "No se puede cambiar de estado porque no hay ningún candidato asignado a esta oferta";
throw new Exception($error);
return false;
exit;
}
}
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 candidato_pedido SET $nombre = '$valor' WHERE oid='$oid'";
$bd = new BD();
if ($bd->execQuery($consulta)) {
// Guardar en el historial
$valor = $this->getValorMulti($nombre, $valor);
////////////////////////////////////////////////////////////////////////////////
//SOLO ACTUALIZA EL HISTORIAL LOS CAMBIOS DE ESTADO Y ASIGNACIONES DE CANDIDATOS
////////////////////////////////////////////////////////////////////////////////
if ($nombre == "estado") {
$estado_viejo = $this->darNombreEstado($viejo, "sp");
$estado_nuevo = $this->darNombreEstado($valor, "sp");
$historial = "Cambio de estado (". $estado_viejo ." a ". $estado_nuevo .")";
$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;
}
/**
* Devuelve una lista de candidatos disponibles para una oferta, se cambia a los nuevos estados #723 Peticion
*/
function getCandidatosDisponibles() {
return $this->getCandidatos("520,530,540,560,600");
}
/**
* Devuelve una lista de candidatos de un estado dado
*/
private function getCandidatos($estado) {
$lista = new ListaCandidatos($this->usuario, "", "", $estado);
return $lista;
}
function getHistorial() {
$historial = "";
$oid = $this->getValor("oid");
$consulta = "SELECT * FROM historial_oferta WHERE oid_h='$oid' ORDER BY id DESC";
$bd = new BD();
$resultado = $bd->execQuery($consulta);
while ($rows = mysql_fetch_array($resultado)) {
$fecha = $rows["fecha_h"];
$persona = $rows["persona_h"];
$texto = $rows["texto_h"];
$historial .= "[$fecha] $persona - $texto\n";
}
return $historial;
}
function getOfertasCandidato($oid) {
$consulta = "SELECT * FROM candidato_pedido WHERE candidato='$oid' ORDER BY fecha DESC";
$bd = new BD();
$resultado = $bd->execQuery($consulta);
return $resultado;
}
function getNumOfertasCandidato($oid) {
$consulta = "SELECT * FROM candidato_pedido WHERE candidato='$oid' ORDER BY fecha DESC";
$bd = new BD();
$resultado = $bd->execQuery($consulta);
return mysql_num_rows($resultado);
}
function quitarCandidato() {
$idCand = $this->getValor("candidato");
if (!empty($idCand)) {
$candidato = new Candidato($this->usuario, $idCand);
$estadoCand = $candidato->getValor("estado");
$numOfertasCandidato = $this->getNumOfertasCandidato($idCand);
echo "Ofertas del coandidato:".$this->getNumOfertasCandidato($idCand);
switch ($estadoCand) {
//TODO CANDIDATO ASOCIADO A UNA OFERTA (este como este su situación) pasará a En proceso:disponible si no tiene alguna otra oferta,
//el estado del candidato no cambia si está asociado a alguna otra oferta. se cambia a los nuevos estados #723 Peticion
case 600:;
case 560:;
case 510:;
case 511:;
case 520:;
case 530:;
case 540:
//Modificamos historial de candidato
$mensaje = "Se quita en oferta ". $this->getValor("referencia");
$candidato->actualizarHistorial($mensaje);
//Modificamos historial de la oferta
$nombre_candidato = $candidato->getValor("nombre") . " " . $candidato->getValor("apellidos");
$mensaje = "El candidato ".$nombre_candidato." se quita de la oferta";
$this->actualizarHistorial($mensaje);
//Cambiamos de estado al candidato
if ($numOfertasCandidato <= 1) {
$candidato->transita("540", "");
}
return true;
break;
default:
$error = "[quitarCandidato]. El candidato tiene un estado no permitido ('" . $estadoCand . "')";
throw new Exception($error);
}
}
}
function asignarCandidato($idCandidato) {
//Lo primero es tratar el candidato asociado actualmente antes de asignar el pasado por parametro
$idCand = $this->getValor("candidato");
if (!empty($idCand)) {
if (!$this->quitarCandidato()) {
return false;
}
}
$candidato = new Candidato($this->usuario, $idCandidato);
$estadoCand = $candidato->getValor("estado");
$numOfertasCandidato = $this->getNumOfertasCandidato($idCand);
switch ($estadoCand) {
//En proceso:Disponible asignado, el estado del candidato no cambia, solo se asigna a la oferta y ya está.
case 560:
$this->setCampo("candidato", $idCandidato);
//Modificamos historial de candidato
$mensaje = "Asignado en oferta ". $this->getValor("referencia");
$candidato->actualizarHistorial($mensaje);
//Modificamos historial de oferta
$nombre_candidato = $candidato->getValor("nombre") . " " . $candidato->getValor("apellidos");
$mensaje = "Asignado el candidato ".$nombre_candidato;
$this->actualizarHistorial($mensaje);
return true;
break;
//Rechazado, Sin más adelante, En proceso:Disponible, Otras provincias. se cambia a los nuevos estados #723 Peticion
//Todos los candidatos con alguno de estos estados cambiarán a En proceso:Disponible asignado (560)
case 600:;
case 520:;
case 530:;
case 540:
$this->setCampo("candidato", $idCandidato);
//Modificamos historial de candidato
$mensaje = "Asignado en oferta ". $this->getValor("referencia");
$candidato->actualizarHistorial($mensaje);
//Modificamos historial de oferta
$nombre_candidato = $candidato->getValor("nombre") . " " . $candidato->getValor("apellidos");
$mensaje = "Asignado el candidato ".$nombre_candidato;
$this->actualizarHistorial($mensaje);
//Cambiamos el estado del candidato
if ($candidato->transita("560", "")){
return true;
}
else {
$error = "ERROR: El candidato no ha podido cambiar de estado";
throw new Exception($error);
}
break;
//("")
default:
$error = "El candidato tiene un estado no permitido ('" . $candidato->getValor("nombre_estado") . "')";
throw new Exception($error);
}
}
}
?>