]> git.llucax.com Git - mecon/meconlib.git/blobdiff - lib/MECON/Feriado.php
Se borran tags de xmi2code.
[mecon/meconlib.git] / lib / MECON / Feriado.php
index 2ea14b2d210e630aa6f8eeb63cddb0fa71bdf1d4..8f4e9184486260a579d2c0adb0d53edc3cc56751 100644 (file)
@@ -24,10 +24,9 @@ Autor:  Leandro Lucarella <llucar@mecon.gov.ar>
 $Id$
 -----------------------------------------------------------------------------*/
 
-require_once 'MECON/DBO.php';
 require_once 'Date.php';
-require_once 'Time/Span.php';
-require_once 'HE/DB.php';
+require_once 'Date/Span.php';
+require_once 'PEAR.php';
 
 /**
  * Información sobre feriados.
@@ -61,12 +60,8 @@ class MECON_Feriado extends Date {
     /// Descripción del feriado.
     var $descripcion;
 
-    function MECON_Feriado($date = null, $db = null) {
-        if (is_a($db, 'db')) {
-            $this->_db = $db;
-        } else {
-            $this->_db = DB::connect('mysql://intranet:intranet@intranet-db.mecon.ar/novedades');
-        }
+    function MECON_Feriado($db, $date = null) {
+        $this->_db = $db;
         parent::Date($date);
     }
 
@@ -82,11 +77,41 @@ class MECON_Feriado extends Date {
             $this->desde = $date->desde;
             $this->descripcion = $date->descripcion;
         } else {
-            $this->_updateDBInfo($date);
+            $this->_updateDBInfo();
         }
     }
 
-    function _updateDBInfo($date = null, $db = null) {
+    function setYear($y) {
+        parent::setYear($y);
+        $this->_updateDBInfo();
+    }
+
+    function setMonth($m) {
+        parent::setMonth($m);
+        $this->_updateDBInfo();
+    }
+
+    function setDay($d) {
+        parent::setDay($d);
+        $this->_updateDBInfo();
+    }
+
+    function setHour($h) {
+        parent::setHour($h);
+        $this->_updateDBInfo();
+    }
+
+    function setMinute($m) {
+        parent::setMinute($m);
+        $this->_updateDBInfo();
+    }
+
+    function setSecond($s) {
+        parent::setSecond($s);
+        $this->_updateDBInfo();
+    }
+
+    function _updateDBInfo() {
         // Resetea valores.
         $this->desde = null;
         $this->descripcion = null;
@@ -103,7 +128,7 @@ class MECON_Feriado extends Date {
                 $this->_tipo = isset($tipo) ? $tipo : 'laborable';
                 // Verificamos si hay algo en la DB.
                 $fecha = $this->getDate();
-                $datos = $this->_db->getRow("SELECT * FROM novedades.feriado WHERE fecha = '$fecha'", null, DB_FETCH_ASSOC);
+                $datos = $this->_db->getRow("SELECT * FROM novedades.feriados WHERE fecha = '$fecha'", null, DB_FETCHMODE_ASSOC);
                 // Si hay un error, lo pasamos a quien nos llama.
                 if (DB::isError($datos)) {
                     return $datos;
@@ -128,8 +153,8 @@ class MECON_Feriado extends Date {
      */
     function getTipo() {
         if ($this->_tipo == 'asueto') {
-            $desde = new Time_Span($this->desde);
-            $hora = new Time_Span($this->format('%H:%M'));
+            $desde = new Date_Span($this->desde);
+            $hora = new Date_Span($this->format('%H:%M'));
             if ($hora->greaterEqual($desde)) {
                 return $this->_tipo;
             } else {
@@ -145,60 +170,34 @@ class MECON_Feriado extends Date {
     /**
      * Indica si un día es laborable.
      *
-     * @param  string $fecha Fecha de a verificar (el día actual por defecto).
-     * @param  string $hora  Hora en la que se quiere chequear si es laborable.
-     *
      * @return bool   false si no es laborable (o hubo error).
      *
      * @access public
      */
-    function esLaborable($fecha = '', $hora = '23:59') {
-
-        if ( $this->_tipo( $fecha, $hora ) == 'laborable' )
-            return true;
-        else
-            return false;
-
+    function esLaborable() {
+        return $this->getTipo() == 'laborable';
     }
 
     /**
      * Indica si un día es no laborable.
      *
-     * @param  string $fecha Fecha de a chequear (el día actual por
-     *                       defecto).
-     * @param  string $hora  Hora en la que se quiere chequear.
-     *
      * @return bool   false si no es no laborable (o hubo error).
      *
      * @access public
      */
-    function esNoLaborable( $fecha = '', $hora = '23:59' ) {
-
-        if ( $this->_tipo( $fecha, $hora ) == 'no laborable' )
-            return true;
-        else
-            return false;
-
+    function esNoLaborable() {
+        return $this->getTipo() == 'no laborable';
     }
 
     /**
      * Indica si un día es feriado.
      *
-     * @param  string $fecha Fecha de a chequear (el día actual por
-     *                       defecto).
-     * @param  string $hora  Hora en la que se quiere chequear.
-     *
      * @return bool   false si no es feriado (o hubo error).
      *
      * @access public
      */
-    function esFeriado( $fecha = '', $hora = '23:59' ) {
-
-        if ( $this->_tipo( $fecha, $hora ) == 'feriado' )
-            return true;
-        else
-            return false;
-
+    function esFeriado() {
+        return $this->getTipo() == 'feriado';
     }
 
     /**
@@ -212,26 +211,24 @@ class MECON_Feriado extends Date {
      *
      * @access public
      */
-    function esAsueto( $fecha = '', $hora = '23:59' ) {
-
-        if ( $this->_tipo( $fecha, $hora ) == 'asueto' )
-            return true;
-        else
-            return false;
-
+    function esAsueto() {
+        return $this->getTipo() == 'asueto';
     }
 
     /**
      * Busca feriados que se encuentren en un rango de fechas.
      *
      * Ejemplo:
-     * if ( $feriado->buscarRango( '2002/10/01', '2002/12/31' ) )
-     *     while ( $f = $feriado->siguiente() )
+     * @code
+     * if ($feriado->buscarRango('2002/10/01', '2002/12/31')) {
+     *     while ($f = $feriado->siguiente())
      *         var_dump( $f );
-     * elseif ( $feriado->error() )
-     *     die( 'Errores: ' . $feriado->errores();
-     * else
-     *     print( 'No se encontraron feriados en ese rango de fechas' );
+     * } elseif ($feriado->error()) {
+     *     trigger_error('Errores: ' . $feriado->errores(), E_USER_ERROR);
+     * } else {
+     *     echo 'No se encontraron feriados en ese rango de fechas';
+     * }
+     * @endcode
      *
      * @param  string $ini   Fecha de inicio del rango en donde buscar (por
      *                       defecto el primer día del mes en curso).
@@ -245,9 +242,9 @@ class MECON_Feriado extends Date {
      *
      * @return bool  false si no se encontró nada (o hubo error).
      *
-     * @access public
+     * @todo Pasar a método estático y usar Date en vez de strings para las fechas.
      */
-    function buscarRango( $ini = '', $fin = '', $orden = null ) {
+    function buscarRango($ini = '', $fin = '', $orden = null ) {
 
         $ini = empty( $ini ) ? strftime( '%Y/01/01', time() ) : $ini;
         $fin = empty( $fin ) ? strftime( '%Y/12/31', time() ) : $fin;
@@ -301,6 +298,67 @@ class MECON_Feriado extends Date {
 
     }
 
+    /**
+     * Busca dias habiles en un rango de fechas y los devuelve en un array.
+     *
+     * Ejemplo:
+     * @code
+     * $diasHabiles = $feriado->buscarDiasHabiles('2002/10/01', '2002/12/31');
+     * if (count($diasHabiles)) {
+     *     echo 'Cantidad de dias habiles en le rango: '. count($diasHabiles);
+     *     foreach ($diasHabiles as $diaHabil) {
+     *         print '<PRE>';var_dump($diaHabil);print '</PRE>';
+     *     }
+     * }
+     * @endcode
+     *
+     * @param  DB    $db    Conexión a la base de datos.
+     * @param  mixed $ini   Fecha de inicio del rango en donde buscar (por
+     *                      defecto el primer día del mes en curso). Puede ser
+     *                      un objeto Date.
+     * @param  mixed $fin   Fecha de fin del rango en donde buscar (por
+     *                      defecto el día del mes en curso). Puede ser un 
+     *                      objeto Date.
+     *
+     * @return mixed
+     * @static
+     */
+    function buscarDiasHabiles($db, $ini = '', $fin = '') {
+        //Acomodo las fechas pasadas por parametro
+        $ini = empty( $ini ) ? strftime( '%Y-%m-01', time() ) : $ini;
+        $fin = empty( $fin ) ? strftime( '%Y-%m-%d', time() ) : $fin;
+        $ini = (is_string($ini)) ? new Date($ini) : $ini;
+        $fin = (is_string($fin)) ? new Date($fin) : $fin;
+        
+        //Valido que $ini < $fin
+        if ($ini->after($fin)) {
+            return new PEAR_Error ('La fecha de fin debe ser anterior a la '.
+                    'fecha de inicio.');
+        }
+        
+        //Obtener los dias feriados entre $ini y $fin
+        $sql = "SELECT fecha FROM novedades.feriados WHERE YEAR(fecha) = ". 
+            $db->quote($ini->format("%Y")) . " OR YEAR(fecha) = " . 
+            $db->quote($ini->format("%Y"));
+
+        $feriados = $db->getCol($sql);
+        if (DB::IsError($feriados)) {
+            return $feriados;
+        }
+        
+        //Verifico fecha por fecha si es o no un dia habil
+        $ini =& $ini->getPrevDay();
+        while (!$ini->equals($fin)) {
+            $ini =& $ini->getNextDay();
+            //Verifico que la fecha no sea feriado ni sabado o domingo.
+            if (!in_array($ini->format("%Y-%m-%d"), $feriados) &&
+                    ($ini->getDayOfWeek() != 0) && 
+                    ($ini->getDayOfWeek() != 6)) {
+                $res[] = $ini;
+            }
+        }
+        return $res;
+    }
 }
 
 // $Id$