]> git.llucax.com Git - mecon/meconlib.git/blobdiff - lib/MECON/Tiempo/Banda.php
Se modifica Intervalo::seSuperpone() para que no tome como superpuestos a
[mecon/meconlib.git] / lib / MECON / Tiempo / Banda.php
index 4ab49b8d9938abcb46a20aa0e65a880ddcefd312..a235e03a64d9b552613d1c0818ced0f032f4cbb9 100644 (file)
@@ -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 Acceso A, Agente_Credencial AC, 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);