1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
5 -------------------------------------------------------------------------------
6 This file is part of meconlib.
8 meconlib is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2 of the License, or (at your option)
13 meconlib is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License; if not,
18 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA 02111-1307 USA
20 -------------------------------------------------------------------------------
21 Creado: mié abr 10 18:05:33 ART 2002 |
22 Autor: Leandro Lucarella <llucar@mecon.gov.ar>
23 -------------------------------------------------------------------------------
25 -----------------------------------------------------------------------------*/
27 require_once 'MECON/DBO.php';
28 require_once 'Date.php';
29 require_once 'Time/Span.php';
30 require_once 'HE/DB.php';
33 * Información sobre feriados.
35 * Abstracción para hacer ABM sobre la información de los días feriados.
36 * También sirve para hacer consultas y búsquedas.
40 * @author Leandro Lucarella <llucar@mecon.gov.ar>
41 * @todo Probar. Agregar _updateDBInfo() a todas las funciones de Date que
42 * modifiquen la fecha.
44 class MECON_Feriado extends Date {
47 * Base de datos a usar para las consultas.
53 * Tipo de día (Feriado, Laborable o No Laborable).
58 /// Hora en la que empieza el feriado.
61 /// Descripción del feriado.
64 function MECON_Feriado($date = null, $db = null) {
65 if (is_a($db, 'db')) {
68 $this->_db = DB::connect('mysql://intranet:intranet@intranet-db.mecon.ar/novedades');
73 function setDate($date = null) {
74 parent::setDate($date);
75 $this->_updateDBInfo($date);
78 function copy($date) {
81 $this->_tipo = $date->_tipo;
82 $this->desde = $date->desde;
83 $this->descripcion = $date->descripcion;
85 $this->_updateDBInfo($date);
89 function _updateDBInfo($date = null, $db = null) {
92 $this->descripcion = null;
93 // Se fija según el tipo de día.
94 $dia = $this->format('%w');
97 $this->_tipo = 'feriado';
100 $tipo = 'no laborable';
101 // sigue abajo, no hay break.
102 default: // Cualquier día.
103 $this->_tipo = isset($tipo) ? $tipo : 'laborable';
104 // Verificamos si hay algo en la DB.
105 $fecha = $this->getDate();
106 $datos = $this->_db->getRow("SELECT * FROM novedades.feriado WHERE fecha = '$fecha'", null, DB_FETCH_ASSOC);
107 // Si hay un error, lo pasamos a quien nos llama.
108 if (DB::isError($datos)) {
110 // Si hay un resultado, actualizamos los datos.
112 $this->_tipo = $datos['tipo'];
113 $this->desde = $datos['desde'];
114 $this->descripcion = $datos['descripcion'];
121 * Obtiene el tipo de día (teniendo en cuenta la hora).
123 * Si el día es asueto se fija la hora almacenada en esta fecha y devuelve
124 * 'asueto' o 'laborable' dependiendo de a partir de qué hora se declaró el
127 * @return 'laborable', 'no laborable', 'asueto' o 'feriado'.
130 if ($this->_tipo == 'asueto') {
131 $desde = new Time_Span($this->desde);
132 $hora = new Time_Span($this->format('%H:%M'));
133 if ($hora->greaterEqual($desde)) {
136 // Posible pitfall, en teoría sólo puede declararse asueto un
146 * Indica si un día es laborable.
148 * @param string $fecha Fecha de a verificar (el día actual por defecto).
149 * @param string $hora Hora en la que se quiere chequear si es laborable.
151 * @return bool false si no es laborable (o hubo error).
155 function esLaborable($fecha = '', $hora = '23:59') {
157 if ( $this->_tipo( $fecha, $hora ) == 'laborable' )
165 * Indica si un día es no laborable.
167 * @param string $fecha Fecha de a chequear (el día actual por
169 * @param string $hora Hora en la que se quiere chequear.
171 * @return bool false si no es no laborable (o hubo error).
175 function esNoLaborable( $fecha = '', $hora = '23:59' ) {
177 if ( $this->_tipo( $fecha, $hora ) == 'no laborable' )
185 * Indica si un día es feriado.
187 * @param string $fecha Fecha de a chequear (el día actual por
189 * @param string $hora Hora en la que se quiere chequear.
191 * @return bool false si no es feriado (o hubo error).
195 function esFeriado( $fecha = '', $hora = '23:59' ) {
197 if ( $this->_tipo( $fecha, $hora ) == 'feriado' )
205 * Indica si un día es asueto.
207 * @param string $fecha Fecha de a chequear (el día actual por
209 * @param string $hora Hora en la que se quiere chequear.
211 * @return bool false si no es asueto (o hubo error).
215 function esAsueto( $fecha = '', $hora = '23:59' ) {
217 if ( $this->_tipo( $fecha, $hora ) == 'asueto' )
225 * Busca feriados que se encuentren en un rango de fechas.
228 * if ( $feriado->buscarRango( '2002/10/01', '2002/12/31' ) )
229 * while ( $f = $feriado->siguiente() )
231 * elseif ( $feriado->error() )
232 * die( 'Errores: ' . $feriado->errores();
234 * print( 'No se encontraron feriados en ese rango de fechas' );
236 * @param string $ini Fecha de inicio del rango en donde buscar (por
237 * defecto el primer día del mes en curso).
238 * @param string $fin Fecha de fin del rango en donde buscar (por
239 * defecto el último día del mes en curso).
240 * @param array $orden Órden de los resultados. Es un array
241 * asociativo con el campo por el cual ordenar
242 * como clave y si es descendente o ascendente
243 * como valor. Por defecto se toma fecha
246 * @return bool false si no se encontró nada (o hubo error).
250 function buscarRango( $ini = '', $fin = '', $orden = null ) {
252 $ini = empty( $ini ) ? strftime( '%Y/01/01', time() ) : $ini;
253 $fin = empty( $fin ) ? strftime( '%Y/12/31', time() ) : $fin;
254 $ord = ( $ord != 'fecha' and $ord != 'descripcion' and $ord != 'tipo' ) ? 'fecha' : $ord;
256 // Valida ambas fechas y que una sea anterior a la otra.
257 if ( ! $this->_es_anterior( $ini, $fin ) )
260 // Si no se especifica orden lo inicializa.
261 if ( is_null( $orden ) )
262 $orden = array('fecha' => HE_DB_ASC);
264 // Genera un array con las clausulas del ORDER BY del query
266 foreach ( $orden as $campo => $ord )
267 $order[] = sprintf( "%s %s", $campo, $ord );
269 // Si no son arrays sale con error.
270 if ( ! is_array( $campos ) or ! is_array( $orden ) ) {
271 $this->raiseError( 'Parámetro incorrecto, no es un array', HE_ERROR );
275 // Prepara el query con el rango de fechas
286 $this->_db->quote( $ini ),
287 $this->_db->quote( $fin ),
288 $order ? ( ' ORDER BY ' . join( ',', $order ) ) : ''
291 $resultado =& $this->_db->query( $query );
292 if ( DB::isError( $resultado ) ) { // Hubo un error
293 $this->_error->agregar( $resultado );
295 } elseif ( $resultado->numRows() ) { // Tiene algún resultado
296 $this->_resultado =& $resultado;