+<?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
+-------------------------------------------------------------------------------
+ Ministerio de Economía
+ meconlib
+-------------------------------------------------------------------------------
+This file is part of meconlib.
+
+meconlib is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your option)
+any later version.
+
+meconlib is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License; if not,
+write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Boston, MA 02111-1307 USA
+-------------------------------------------------------------------------------
+Creado: mié abr 10 18:05:33 ART 2002 |
+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';
+
+/**
+ * Información sobre feriados.
+ *
+ * Abstracción para hacer ABM sobre la información de los días feriados.
+ * También sirve para hacer consultas y búsquedas.
+ *
+ * @package HE
+ * @version $Rev$
+ * @author Leandro Lucarella <llucar@mecon.gov.ar>
+ * @todo Probar. Agregar _updateDBInfo() a todas las funciones de Date que
+ * modifiquen la fecha.
+ */
+class MECON_Feriado extends Date {
+
+ /**
+ * Base de datos a usar para las consultas.
+ * @private
+ */
+ var $_db;
+
+ /**
+ * Tipo de día (Feriado, Laborable o No Laborable).
+ * @private
+ */
+ var $_tipo;
+
+ /// Hora en la que empieza el feriado.
+ var $desde;
+
+ /// 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');
+ }
+ parent::Date($date);
+ }
+
+ function setDate($date = null) {
+ parent::setDate($date);
+ $this->_updateDBInfo($date);
+ }
+
+ function copy($date) {
+ parent::copy($date);
+ if (@$date->_tipo) {
+ $this->_tipo = $date->_tipo;
+ $this->desde = $date->desde;
+ $this->descripcion = $date->descripcion;
+ } else {
+ $this->_updateDBInfo($date);
+ }
+ }
+
+ function _updateDBInfo($date = null, $db = null) {
+ // Resetea valores.
+ $this->desde = null;
+ $this->descripcion = null;
+ // Se fija según el tipo de día.
+ $dia = $this->format('%w');
+ switch ($dia) {
+ case 0: // Domingo.
+ $this->_tipo = 'feriado';
+ break;
+ case 6: // Sábado.
+ $tipo = 'no laborable';
+ // sigue abajo, no hay break.
+ default: // Cualquier día.
+ $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);
+ // Si hay un error, lo pasamos a quien nos llama.
+ if (DB::isError($datos)) {
+ return $datos;
+ // Si hay un resultado, actualizamos los datos.
+ } elseif ($datos) {
+ $this->_tipo = $datos['tipo'];
+ $this->desde = $datos['desde'];
+ $this->descripcion = $datos['descripcion'];
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Obtiene el tipo de día (teniendo en cuenta la hora).
+ *
+ * Si el día es asueto se fija la hora almacenada en esta fecha y devuelve
+ * 'asueto' o 'laborable' dependiendo de a partir de qué hora se declaró el
+ * asueto.
+ *
+ * @return 'laborable', 'no laborable', 'asueto' o 'feriado'.
+ */
+ function getTipo() {
+ if ($this->_tipo == 'asueto') {
+ $desde = new Time_Span($this->desde);
+ $hora = new Time_Span($this->format('%H:%M'));
+ if ($hora->greaterEqual($desde)) {
+ return $this->_tipo;
+ } else {
+ // Posible pitfall, en teoría sólo puede declararse asueto un
+ // día laborable.
+ return 'laborable';
+ }
+ } else {
+ return $this->_tipo;
+ }
+ }
+
+ /**
+ * 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;
+
+ }
+
+ /**
+ * 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;
+
+ }
+
+ /**
+ * 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;
+
+ }
+
+ /**
+ * Indica si un día es asueto.
+ *
+ * @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 asueto (o hubo error).
+ *
+ * @access public
+ */
+ function esAsueto( $fecha = '', $hora = '23:59' ) {
+
+ if ( $this->_tipo( $fecha, $hora ) == 'asueto' )
+ return true;
+ else
+ return false;
+
+ }
+
+ /**
+ * Busca feriados que se encuentren en un rango de fechas.
+ *
+ * Ejemplo:
+ * 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' );
+ *
+ * @param string $ini Fecha de inicio del rango en donde buscar (por
+ * defecto el primer día del mes en curso).
+ * @param string $fin Fecha de fin del rango en donde buscar (por
+ * defecto el último día del mes en curso).
+ * @param array $orden Órden de los resultados. Es un array
+ * asociativo con el campo por el cual ordenar
+ * como clave y si es descendente o ascendente
+ * como valor. Por defecto se toma fecha
+ * ascendente.
+ *
+ * @return bool false si no se encontró nada (o hubo error).
+ *
+ * @access public
+ */
+ function buscarRango( $ini = '', $fin = '', $orden = null ) {
+
+ $ini = empty( $ini ) ? strftime( '%Y/01/01', time() ) : $ini;
+ $fin = empty( $fin ) ? strftime( '%Y/12/31', time() ) : $fin;
+ $ord = ( $ord != 'fecha' and $ord != 'descripcion' and $ord != 'tipo' ) ? 'fecha' : $ord;
+
+ // Valida ambas fechas y que una sea anterior a la otra.
+ if ( ! $this->_es_anterior( $ini, $fin ) )
+ return false;
+
+ // Si no se especifica orden lo inicializa.
+ if ( is_null( $orden ) )
+ $orden = array('fecha' => HE_DB_ASC);
+
+ // Genera un array con las clausulas del ORDER BY del query
+ $order = array();
+ foreach ( $orden as $campo => $ord )
+ $order[] = sprintf( "%s %s", $campo, $ord );
+
+ // Si no son arrays sale con error.
+ if ( ! is_array( $campos ) or ! is_array( $orden ) ) {
+ $this->raiseError( 'Parámetro incorrecto, no es un array', HE_ERROR );
+ return false;
+ }
+
+ // Prepara el query con el rango de fechas
+ $query = sprintf(
+ 'SELECT *
+ FROM
+ %s.%s
+ WHERE
+ %s <= fecha AND
+ fecha <= %s
+ %s',
+ $this->_basededatos,
+ $this->_tabla,
+ $this->_db->quote( $ini ),
+ $this->_db->quote( $fin ),
+ $order ? ( ' ORDER BY ' . join( ',', $order ) ) : ''
+ );
+
+ $resultado =& $this->_db->query( $query );
+ if ( DB::isError( $resultado ) ) { // Hubo un error
+ $this->_error->agregar( $resultado );
+ return false;
+ } elseif ( $resultado->numRows() ) { // Tiene algún resultado
+ $this->_resultado =& $resultado;
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+}
+
+// $Id$
+?>