Incam_Intranet/Objects/Semaforo.php
2011-04-06 12:06:00 +00:00

223 lines
6.5 KiB
PHP

<?php
/*
* Clase Semaforo
*
* Gestiona los semáforos.
*
* 2008-09-30 (diego): Se crea el objeto con los métodos necesarios para bloquear registros en uso.
*
*/
include_once("BD.php");
class Semaforo{
//Atributos:
/* Usuario que tiene activa la sesión */
private $usuario;
private $paginas;
private $locale;
function Semaforo($usuario,$locale){
$this->usuario = $usuario;
//Para los pedidos
$this->paginas["gestion_pedido.php"]['0'] = "edit";
$this->paginas["gestion_pedido.php"]['1'] = "idPedido";
$this->paginas["gestion_pedido.php"]['2'] = "pedidos";
$this->paginas["gestion_pedido.php"]['3'] = "pedido.php";
$this->paginas["gestion_pedido.php"]['4'] = "1";
$this->paginas["eliminar_pedido.php"]['0'] = "edit";
$this->paginas["eliminar_pedido.php"]['1'] = "idPedido";
$this->paginas["eliminar_pedido.php"]['2'] = "pedidos";
$this->paginas["eliminar_pedido.php"]['3'] = "pedido.php";
$this->paginas["eliminar_pedido.php"]['4'] = "2";
$this->paginas["gestion_candidato.php"]['0'] = "edit";
$this->paginas["gestion_candidato.php"]['1'] = "oid";
$this->paginas["gestion_candidato.php"]['2'] = "usuarios";
$this->paginas["gestion_candidato.php"]['3'] = "detalle_candidato.php";
$this->paginas["gestion_candidato.php"]['4'] = "3";
$this->paginas["gestion_empleado.php"]['0'] = "edit";
$this->paginas["gestion_empleado.php"]['1'] = "oid";
$this->paginas["gestion_empleado.php"]['2'] = "usuarios";
$this->paginas["gestion_empleado.php"]['3'] = "detalle_empleado.php";
$this->paginas["gestion_empleado.php"]['4'] = "4";
$this->paginas["elimina_candidato.php"]['0'] = "edit";
$this->paginas["elimina_candidato.php"]['1'] = "oid";
$this->paginas["elimina_candidato.php"]['2'] = "usuarios";
$this->paginas["elimina_candidato.php"]['3'] = "detalle_candidato.php";
$this->paginas["elimina_candidato.php"]['4'] = "5";
$this->locale = $locale;
}
function regular($url){
$pagina = $this->nombrePagina($url);
$modo = "";
$id_modo = "";
$tabla = "";
$error = "";
$cod = "";
if (isset($this->paginas[$pagina])) {
$modo = $this->paginas[$pagina]['0'];
$id_modo = $this->paginas[$pagina]['1'];
$tabla = $this->paginas[$pagina]['2'];
$error = $this->paginas[$pagina]['3'];
$cod = $this->paginas[$pagina]['4'];
}
$id = $this->parametro($url, $id_modo);
//Sistema de bloqueo nuevo.
if($modo == "edit" && $id){
//Si no está bloqueado lo bloqueo para mí.
if(!$this->estaBloqueado($tabla, $id)){
$this->bloquear($tabla, $id);
//Si está bloqueado lanzo una excepción para avisar.
} else {
$error .= "?$id_modo=$id&msgSem=$cod";
throw new Exception($error);
}
//Página de no bloqueo, la libero.
} else if ($modo != "edit"){
$this->liberar();
}
}
function getMensaje($cod){
$m = "s$cod";
return $this->locale[$m];
}
private function nombrePagina($url){
$tok = strtok ($url,"/");
$pag = $tok;
while ($tok !== false) {
$tok = strtok("/");
if($tok !== false){
$pag = $tok;
}
}
$pag = strtok ($pag,"?");
return $pag;
}
private function parametro($url, $id_modo){
//Recuperamos los argumentos
$tok = strtok ($url,"?");
$pag = $tok;
$valor = "";
while ($tok !== false) {
$tok = strtok("?");
if($tok !== false){
$pag = $tok;
}
}
//Miramos argumento a argumento
$tok = strtok ($pag,"&");
while ($tok !== false) {
if($tok !== false){
$id = strtok($tok, "=");
if($id == $id_modo){
$valor = strtok("&");
}
}
$tok = strtok("&");
}
return $valor;
}
private function bloquear($tabla, $id){
$usuario = $this->usuario->getValor("oid");
$consulta = "UPDATE $tabla SET mutex='$usuario', tiempo=now() WHERE oid='$id'";
$bd=new BD();
return $bd->execQuery($consulta);
}
private function liberar(){
$usuario = $this->usuario->getValor("oid");
$this->liberarPartesActividad($usuario);
$this->liberarPedidos($usuario);
$this->liberarUsuarios($usuario);
$this->liberarVacaciones($usuario);
}
private function liberarPartesActividad($usuario){
$consulta = "UPDATE partes_actividad SET mutex='0' WHERE mutex='$usuario'";
$bd=new BD();
return $bd->execQuery($consulta);
}
private function liberarPedidos($usuario){
$consulta = "UPDATE pedidos SET mutex='0' WHERE mutex='$usuario'";
$bd=new BD();
return $bd->execQuery($consulta);
}
private function liberarUsuarios($usuario){
$consulta = "UPDATE usuarios SET mutex='0' WHERE mutex='$usuario'";
$bd=new BD();
return $bd->execQuery($consulta);
}
private function liberarVacaciones($usuario){
$consulta = "UPDATE vacaciones SET mutex='0' WHERE mutex='$usuario'";
$bd=new BD();
return $bd->execQuery($consulta);
}
private function estaBloqueado($tabla, $id){
$seguimos = false;
$usuario = $this->usuario->getValor("oid");
$consulta = "select mutex,tiempo from $tabla where oid = '".$id."'";
$bd = new BD();
if($resultado = $bd->execQuery($consulta)){
while ($row = mysql_fetch_array($resultado)){
$mutex = $row["mutex"];
$fecha = $row["tiempo"];
$seguimos = true;
}
}
//Si está bloqueado por el usuario que tiene sesión no se considera ocupado y puede entrar.
if($mutex == $usuario) return false;
if ($seguimos && ($mutex > 0)){
/* Ahora tenemos que comparar la fecha almacenada con la actual. Si
la diferencia es mayor de 20 minutos, volvemos a poner el mutex a 0
*/
list($a_m_d, $h_m_s) = split(" ",$fecha);
list($anio, $mes, $dia) = split("-",$a_m_d);
list($hora, $minuto, $segundo) = split(":",$h_m_s);
$fecha_mutex = mktime($hora,$minuto,$segundo,$mes,$dia,$anio);
$fecha_ahora = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y"));
//Han pasado 1200 segundos?
$diferencia = $fecha_ahora - $fecha_mutex;
if ($diferencia >= 1200){
//Ha caducado el semáforo, lo ponemos a cero
$oid = $this->usuario->getValor("oid");
if ($resultado = mysql_query("update $tabla set mutex=0 where oid = '".$oid."'")){
return false;
}
else return false;
}
else return true;
}
else{
return false;
}
}
}
?>