X-Git-Url: https://git.llucax.com/mecon/meconlib.git/blobdiff_plain/ca4b879d4e173dbbd1aa86b81df026df2d5e9d74..ab08e58537352a82e34dab0684ae5997ece1899c:/lib/MECON/Feriado.php?ds=inline diff --git a/lib/MECON/Feriado.php b/lib/MECON/Feriado.php index 71aecd6..05cbd13 100644 --- a/lib/MECON/Feriado.php +++ b/lib/MECON/Feriado.php @@ -24,10 +24,9 @@ Autor: Leandro Lucarella $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. @@ -129,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; @@ -154,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 { @@ -176,7 +175,7 @@ class MECON_Feriado extends Date { * @access public */ function esLaborable() { - return getTipo() == 'laborable'; + return $this->getTipo() == 'laborable'; } /** @@ -187,7 +186,7 @@ class MECON_Feriado extends Date { * @access public */ function esNoLaborable() { - return getTipo() == 'no laborable'; + return $this->getTipo() == 'no laborable'; } /** @@ -198,7 +197,7 @@ class MECON_Feriado extends Date { * @access public */ function esFeriado() { - return getTipo() == 'feriado'; + return $this->getTipo() == 'feriado'; } /** @@ -213,20 +212,23 @@ class MECON_Feriado extends Date { * @access public */ function esAsueto() { - return getTipo() == 'asueto'; + 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). @@ -240,9 +242,9 @@ class MECON_Feriado extends Date { * * @return bool false si no se encontró nada (o hubo error). * - * @todo Pasar a método estático. + * @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; @@ -296,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 '
';var_dump($diaHabil);print '
'; + * } + * } + * @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$