git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_Intranet/trunk/src@1 e2b1556b-49f8-d141-9351-52d6861a72d9
211 lines
6.3 KiB
PHP
211 lines
6.3 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 = $this->paginas[$pagina]['0'];
|
|
$id_modo = $this->paginas[$pagina]['1'];
|
|
$tabla = $this->paginas[$pagina]['2'];
|
|
$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{
|
|
$cod = $this->paginas[$pagina]['4'];
|
|
$error = $this->paginas[$pagina]['3'];
|
|
$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;
|
|
|
|
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;
|
|
}
|
|
|
|
}
|
|
}
|
|
?>
|