$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.
/// 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);
}
$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;
$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;
*/
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 {
/**
* 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';
}
/**
*
* @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).
*
* @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;
}
+ /**
+ * 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$