From: Leandro Lucarella Date: Mon, 5 Jan 2004 22:39:14 +0000 (+0000) Subject: Se agrega versión preeliminar (ni anda todavía) del objeto MECON_Feriado. X-Git-Tag: svn_import~154 X-Git-Url: https://git.llucax.com/mecon/meconlib.git/commitdiff_plain/97e3375caa48923b554fe437eee118b369836999 Se agrega versión preeliminar (ni anda todavía) del objeto MECON_Feriado. --- diff --git a/lib/MECON/Feriado.php b/lib/MECON/Feriado.php new file mode 100644 index 0000000..2ea14b2 --- /dev/null +++ b/lib/MECON/Feriado.php @@ -0,0 +1,307 @@ + +------------------------------------------------------------------------------- +$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 + * @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$ +?>