X-Git-Url: https://git.llucax.com/mecon/meconlib.git/blobdiff_plain/f5bd735685abcb6d4af18906fcfc3c922b386bd9..4b08135a35b4ba9f3e87dfdb4cdc427800e359ac:/lib/MECON/Tiempo/Banda.php diff --git a/lib/MECON/Tiempo/Banda.php b/lib/MECON/Tiempo/Banda.php index 4ab49b8..03c2b48 100644 --- a/lib/MECON/Tiempo/Banda.php +++ b/lib/MECON/Tiempo/Banda.php @@ -38,77 +38,203 @@ require_once 'MECON/Tiempo/Intervalo.php'; class MECON_Tiempo_Banda { var $intervalos; + var $db; - function MECON_Tiempo_Banda() { + /** + * Constructor. + * @param $db Conexión opcional a una base de datos. + */ + function MECON_Tiempo_Banda($db = null) + { + $this->db = $db; $this->intervalos = array(); } - function Cargar($agente, $fecha) { - // FIXME - lo que es base de datos debe VOLAR!!!!!!! - $dsn = "mysql://intranet:intranet@intranet-db.mecon.ar/bandas"; - $db =& DB::connect($dsn , true); - if(DB::isError($db)) - die($db->getMessage()); + /** + * Funcion que se encarga de cargar los intervalos de tiempo de un agente. + * Devuelve true en caso de detectar una inconsistecia de reloj o false en caso contrario + * + * @param $agente Documento del agente + * @param $accesos Array o Date Variable que puede ser un array con todos los accesos + * de un agente o un objeto Date que indica la fecha de la banda a procesar + * @param $db Conexión opcional a una base de datos. + */ + function cargar($agente, $accesos, $db = null) + { + if ($db) { + $this->db = $db; + } - $funcion = $db->getOne( - "SELECT E.funcion - FROM novedades.estado as E, novedades.web003 as S - WHERE - E.nrodoc = $agente AND - S.nrodoc = $agente AND - S.codep = E.dependencia" - ); + $funcion = $this->db->getOne( + "SELECT E.funcion + FROM novedades.estado as E, novedades.web003 as S + WHERE + E.nrodoc = $agente AND + S.nrodoc = $agente AND + S.codep = E.dependencia" + ); - $fecha = $fecha->format("%Y%m%d"); - $query = "SELECT A.tipo_acceso, A.hora - FROM agentes G, accesos A - WHERE G.cred = A.cred - AND G.docu = $agente - AND A.fecha = $fecha - AND A.inconsistencia = 0 - ORDER BY A.hora"; - $result = $db->query($query); - if(DB::isError($result)) - die($result->getMessage()); + if (is_a($accesos,'date')) { + $fecha =& $accesos; + $fecha = $fecha->format("%Y%m%d"); + $query = "SELECT TA.tipo_acceso, A.hora + FROM bandas.Acceso A, bandas.Agente_Credencial AC, bandas.Tipo_Acceso TA + WHERE AC.credencial = A.credencial + AND A.fecha = '$fecha' + AND AC.agente = $agente + AND TA.puerta = A.puerta + AND AC.desde <= '$fecha' + AND ( AC.hasta >= '$fecha' + OR AC.hasta IS NULL) + ORDER BY A.hora"; + $result = $this->db->query($query); + if(DB::isError($result)) + trigger_error($result->getMessage(), E_USER_ERROR); - if($funcion != 'SE') {//Version tough - $int = null; - while( $r = $result->fetchRow() ) { - if($r[0] == 'E') - $int = new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora( $r[1] ), new MECON_Tiempo_Hora( $r[1] )); - if($r[0] == 'S' && $int != null) { - $int->setFin( new MECON_Tiempo_Hora( $r[1] ) ); - $this->agregarIntervalo( $int ); - $int = null; + $inconsistencia = false; + if($funcion != 'SE') + {//Version tough + $int = null; + while( $r = $result->fetchRow() ) + { + if($r[0] == 'E') + { + if($int != null) + $inconsistencia = true; + $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora( $r[1] ), + new Mecon_Tiempo_Hora( $r[1] )); + } + if($r[0] == 'S') + { + if($int != null) + { + $int->setFin( new Mecon_Tiempo_Hora( $r[1] ) ); + $this->agregarIntervalo( $int ); + $int = null; + } + else + $inconsistencia = true; + } } + if($int != null) + $inconsistencia = true; } - } else { - if($result->numRows() > 0) {//Version Light o Serenos - $int = new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora('00:00'), new MECON_Tiempo_Hora('00:00')); - while( $r = $result->fetchRow() ) { - if($r[0] == 'E') - $int = new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora( $r[1] ), new MECON_Tiempo_Hora( $r[1] )); - if($r[0] == 'S' && $int != null) { - $int->setFin( new MECON_Tiempo_Hora( $r[1] ) ); + else + { + if($result->numRows() > 0) + {//Version Light o Serenos + $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora('00:00'), + new Mecon_Tiempo_Hora('00:00')); + while( $r = $result->fetchRow() ) + { + if($r[0] == 'E') + { + // if($int != null) + //$inconsistencia = true; + $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora( $r[1] ), + new Mecon_Tiempo_Hora( $r[1] )); + } + if($r[0] == 'S') + { + if($int != null) + { + $int->setFin( new Mecon_Tiempo_Hora( $r[1] ) ); + $this->agregarIntervalo( $int ); + $int = null; + } + //else + // $inconsistencia = true; + } + } + if($int != null) + { + $int->setFin( new Hora('24:00') ); $this->agregarIntervalo( $int ); $int = null; } } - if($int != null) { - $int->setFin( new MECON_Tiempo_Hora('24:00') ); + } + } + else + { + $inconsistencia = false; + if($funcion != 'SE') + {//Version tough + $int = null; + if(!is_null($accesos)) + { + foreach( $accesos as $r ) + { + if($r[0] == 'E') + { + if($int != null) + $inconsistencia = true; + $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora( $r[1] ), + new Mecon_Tiempo_Hora( $r[1] )); + } + if($r[0] == 'S') + { + if($int != null) + { + $int->setFin( new Mecon_Tiempo_Hora( $r[1] ) ); + $this->agregarIntervalo( $int ); + $int = null; + } + else + $inconsistencia = true; + } + } + } + if($int != null) + $inconsistencia = true; + } + else + { + //Version Light o Serenos + $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora('00:00'), + new Mecon_Tiempo_Hora('00:00')); + + if(!is_null($accesos)) + { + foreach( $accesos as $r ) + { + if($r[0] == 'E') + { + // if($int != null) + //$inconsistencia = true; + $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora( $r[1] ), + new Mecon_Tiempo_Hora( $r[1] )); + } + if($r[0] == 'S') + { + if($int != null) + { + $int->setFin( new Mecon_Tiempo_Hora( $r[1] ) ); + $this->agregarIntervalo( $int ); + $int = null; + } + //else + // $inconsistencia = true; + } + } + } + if($int != null) + { + $int->setFin( new Hora('24:00') ); $this->agregarIntervalo( $int ); $int = null; } } - } + } + return $inconsistencia; } - /* - * - * Completa las salidas del medio del dia. - * - */ - function CompletarSalidas() { + /** + * Completa las salidas del medio del dia. + * + */ + function CompletarSalidas() + { if(count($this->intervalos) > 0) { $p = reset($this->intervalos); $u = end($this->intervalos); @@ -119,14 +245,13 @@ class MECON_Tiempo_Banda { /** - * Agrega un intervalo a la banda - * Chequeando superposiciones y en orden - * - * @param Intervalo $intervalo Intervalo a agregar. - */ - function agregarIntervalo($intervalo) { - if(! is_a($intervalo, "mecon_tiempo_intervalo")) - return false; + * Agrega un intervalo a la banda + * Chequeando superposiciones y en orden + * + * @param Intervalo $intervalo Intervalo a agregar. + */ + function agregarIntervalo($intervalo) + { if ($intervalo->invertido()) { $intervalo->_chequear(); $this->agregarIntervalo(new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora('00:00'), new MECON_Tiempo_Hora ('24:00'))); @@ -138,9 +263,9 @@ class MECON_Tiempo_Banda { // recorre el vector de intervalos foreach( $this->intervalos as $i ) { // si se superpone con alguno, fusionar con ese - if($i->seSuperpone($intervalo)) + if($i->seSuperpone($intervalo) || $i->esAdyacente($intervalo)) { $intervalo->fusionar($i); - else { + } else { if($i->inicio->greater($intervalo->inicio) && ! $insertado) { array_push($n_intervalos, $intervalo); $insertado = true; @@ -155,22 +280,19 @@ class MECON_Tiempo_Banda { } /** - * Saca - * - * - */ - function sacarBanda($banda) { + * Saca. + */ + function sacarBanda($banda) + { foreach($banda->intervalos as $i) - $this->sacarIntervalo($i); + $this->sacarIntervalo($i); } /** - * Saca un intervalo de una banda horaria. - * - */ - function sacarIntervalo($intervalo) { - if(! is_a($intervalo, "mecon_tiempo_intervalo")) - return false; + * Saca un intervalo de una banda horaria. + */ + function sacarIntervalo($intervalo) + { // Si el intervalo está vacío, no hace nada. $dur = $intervalo->getDuracion(); if ($dur->isEmpty()) { @@ -198,9 +320,11 @@ class MECON_Tiempo_Banda { } - function sacarTiempo($t) { - if(! is_a($t, "date_span")) - return false; + /** + * Saca. + */ + function sacarTiempo($t) + { $n_int = array(); while(count($this->intervalos) > 0) { $int = array_shift($this->intervalos); @@ -210,8 +334,7 @@ class MECON_Tiempo_Banda { #con cortar alcanza $ini = new MECON_Tiempo_Hora(); $ini->copy($int->inicio); - $ini->add - ($t); + $ini->add($t); /*TODO guardar este tiempo como rechazado*/ $int->cortar($ini); $t->setFromSeconds(0); @@ -226,51 +349,45 @@ class MECON_Tiempo_Banda { $this->intervalos = $n_int; } - /* - * Chequea si el intervalo pedido esta cubierto por la banda, si faltan - * horas en la banta se retorna el tiempo que falta - * - * @return Date_Span el periodo faltante - * - */ - function chequearIntervalo($intervalo) { - if(! is_a($intervalo, "mecon_tiempo_intervalo")) - return false; + /** + * Chequea si el intervalo pedido esta cubierto por la banda, si faltan + * horas en la banta se retorna el tiempo que falta + * + * @return Date_Span el periodo faltante + */ + function chequearIntervalo($intervalo) + { $t = new MECON_Tiempo_Hora(); foreach ($this->intervalos as $i) - $t->add - ($i->superponer($intervalo)); + $t->add($i->superponer($intervalo)); $d = $intervalo->getDuracion(); $d->subtract($t); return $d; } - /* - * Chequea si la banda(parametro) esta cubierto por la banda(this), - * si faltan horas en la banda(this) para llegar a banda(parametro) - * se retorna el tiempo que falta - * - * @return Date_Span el periodo faltante - * - */ - function chequearBanda($banda) { - if(! is_a($banda, "mecon_tiempo_banda")) - return false; + /** + * Chequea si la banda(parametro) esta cubierto por la banda(this), + * si faltan horas en la banda(this) para llegar a banda(parametro) + * se retorna el tiempo que falta + * + * @return Date_Span el periodo faltante + */ + function chequearBanda($banda) + { $f = new MECON_Tiempo_Hora(); foreach ($banda->intervalos as $i) - $f->add - ($this->chequearIntervalo($i)); + $f->add($this->chequearIntervalo($i)); return $f; } - /* - * Devuelve una representacion del objeto como un string. - * - * @return string Representacion del objeto. - * - */ - function toString() { + /** + * Devuelve una representacion del objeto como un string. + * + * @return string Representacion del objeto. + */ + function toString() + { $s = ''; $t = count($this->intervalos); for ($n = 0; $n < ($t - 1); $n++) { @@ -283,7 +400,8 @@ class MECON_Tiempo_Banda { return $s; } - function getIntervalos() { + function getIntervalos() + { return $this->intervalos; } @@ -298,9 +416,8 @@ class MECON_Tiempo_Banda { * * @return object Banda Bnada anterior al punto de corte. */ - function cortar($c) { - if(!is_a($c, 'mecon_tiempo_hora') and !is_a($c, 'mecon_tiempo_intervalo')) - return false; + function cortar($c) + { $b = $this->__clone(); $b->intervalos = array(); $intervalos = array(); @@ -324,11 +441,11 @@ class MECON_Tiempo_Banda { * * @return object Date_Span Tiempo total. */ - function total() { + function total() + { $t = new Date_Span; foreach ($this->intervalos as $i) { - $t->add - ($i->getDuracion()); + $t->add($i->getDuracion()); } return $t; } @@ -338,25 +455,48 @@ class MECON_Tiempo_Banda { * * @return object Date_Span Tiempo total. */ - function getDuracion() { + function getDuracion() + { return $this->total(); } + /** + * Chequea si el período pasado como argumento se superpone con la banda. + * @param $periodo Puede ser un MECON_Tiempo_Intervalo o MECON_Tiempo_Banda. + * @return true si se superpone, false si no. + */ + function seSuperpone($periodo) + { + $intervalos = array($periodo); + if (is_a($periodo, 'mecon_tiempo_banda')) { + $intervalos = $periodo->intervalos; + } + foreach ($intervalos as $i) { + if ($i->seSuperpone($this->intervalos)) { + return true; + } + } + return false; + } + /** * Resetea la banda. */ - function flush() { + function flush() + { $this->intervalos = array(); } - function copy($b) { + function copy($b) + { $this->flush(); foreach ($b->intervalos as $i) { $this->intervalos[] = $i->__clone(); } } - function __clone() { + function __clone() + { $class = get_class($this); $b = new $class; $b->copy($this);