]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/Feriado.php
2ea14b2d210e630aa6f8eeb63cddb0fa71bdf1d4
[mecon/meconlib.git] / lib / MECON / Feriado.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                              Ministerio de Economía
4                                     meconlib
5 -------------------------------------------------------------------------------
6 This file is part of meconlib.
7
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)
11 any later version.
12
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.
16  
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 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'MECON/DBO.php';
28 require_once 'Date.php';
29 require_once 'Time/Span.php';
30 require_once 'HE/DB.php';
31
32 /**
33  * Información sobre feriados.
34  *
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.
37  *
38  * @package HE
39  * @version $Rev$
40  * @author  Leandro Lucarella <llucar@mecon.gov.ar>
41  * @todo Probar. Agregar _updateDBInfo() a todas las funciones de Date que
42  *       modifiquen la fecha.
43  */
44 class MECON_Feriado extends Date {
45
46     /**
47      * Base de datos a usar para las consultas.
48      * @private
49      */
50     var $_db;
51
52     /**
53      * Tipo de día (Feriado, Laborable o No Laborable).
54      * @private
55      */
56     var $_tipo;
57
58     /// Hora en la que empieza el feriado.
59     var $desde;
60
61     /// Descripción del feriado.
62     var $descripcion;
63
64     function MECON_Feriado($date = null, $db = null) {
65         if (is_a($db, 'db')) {
66             $this->_db = $db;
67         } else {
68             $this->_db = DB::connect('mysql://intranet:intranet@intranet-db.mecon.ar/novedades');
69         }
70         parent::Date($date);
71     }
72
73     function setDate($date = null) {
74         parent::setDate($date);
75         $this->_updateDBInfo($date);
76     }
77
78     function copy($date) {
79         parent::copy($date);
80         if (@$date->_tipo) {
81             $this->_tipo = $date->_tipo;
82             $this->desde = $date->desde;
83             $this->descripcion = $date->descripcion;
84         } else {
85             $this->_updateDBInfo($date);
86         }
87     }
88
89     function _updateDBInfo($date = null, $db = null) {
90         // Resetea valores.
91         $this->desde = null;
92         $this->descripcion = null;
93         // Se fija según el tipo de día.
94         $dia = $this->format('%w');
95         switch ($dia) {
96             case 0: // Domingo.
97                 $this->_tipo = 'feriado';
98                 break;
99             case 6: // Sábado.
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)) {
109                     return $datos;
110                 // Si hay un resultado, actualizamos los datos.
111                 } elseif ($datos) {
112                     $this->_tipo = $datos['tipo'];
113                     $this->desde = $datos['desde'];
114                     $this->descripcion = $datos['descripcion'];
115                 }
116         }
117         return true;
118     }
119
120     /**
121      * Obtiene el tipo de día (teniendo en cuenta la hora).
122      * 
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
125      * asueto.
126      *
127      * @return 'laborable', 'no laborable', 'asueto' o 'feriado'.
128      */
129     function getTipo() {
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)) {
134                 return $this->_tipo;
135             } else {
136                 // Posible pitfall, en teoría sólo puede declararse asueto un
137                 // día laborable.
138                 return 'laborable';
139             }
140         } else {
141             return $this->_tipo;
142         }
143     }
144
145     /**
146      * Indica si un día es laborable.
147      *
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.
150      *
151      * @return bool   false si no es laborable (o hubo error).
152      *
153      * @access public
154      */
155     function esLaborable($fecha = '', $hora = '23:59') {
156
157         if ( $this->_tipo( $fecha, $hora ) == 'laborable' )
158             return true;
159         else
160             return false;
161
162     }
163
164     /**
165      * Indica si un día es no laborable.
166      *
167      * @param  string $fecha Fecha de a chequear (el día actual por
168      *                       defecto).
169      * @param  string $hora  Hora en la que se quiere chequear.
170      *
171      * @return bool   false si no es no laborable (o hubo error).
172      *
173      * @access public
174      */
175     function esNoLaborable( $fecha = '', $hora = '23:59' ) {
176
177         if ( $this->_tipo( $fecha, $hora ) == 'no laborable' )
178             return true;
179         else
180             return false;
181
182     }
183
184     /**
185      * Indica si un día es feriado.
186      *
187      * @param  string $fecha Fecha de a chequear (el día actual por
188      *                       defecto).
189      * @param  string $hora  Hora en la que se quiere chequear.
190      *
191      * @return bool   false si no es feriado (o hubo error).
192      *
193      * @access public
194      */
195     function esFeriado( $fecha = '', $hora = '23:59' ) {
196
197         if ( $this->_tipo( $fecha, $hora ) == 'feriado' )
198             return true;
199         else
200             return false;
201
202     }
203
204     /**
205      * Indica si un día es asueto.
206      *
207      * @param  string $fecha Fecha de a chequear (el día actual por
208      *                       defecto).
209      * @param  string $hora  Hora en la que se quiere chequear.
210      *
211      * @return bool   false si no es asueto (o hubo error).
212      *
213      * @access public
214      */
215     function esAsueto( $fecha = '', $hora = '23:59' ) {
216
217         if ( $this->_tipo( $fecha, $hora ) == 'asueto' )
218             return true;
219         else
220             return false;
221
222     }
223
224     /**
225      * Busca feriados que se encuentren en un rango de fechas.
226      *
227      * Ejemplo:
228      * if ( $feriado->buscarRango( '2002/10/01', '2002/12/31' ) )
229      *     while ( $f = $feriado->siguiente() )
230      *         var_dump( $f );
231      * elseif ( $feriado->error() )
232      *     die( 'Errores: ' . $feriado->errores();
233      * else
234      *     print( 'No se encontraron feriados en ese rango de fechas' );
235      *
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
244      *                       ascendente.
245      *
246      * @return bool  false si no se encontró nada (o hubo error).
247      *
248      * @access public
249      */
250     function buscarRango( $ini = '', $fin = '', $orden = null ) {
251
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;
255
256         // Valida ambas fechas y que una sea anterior a la otra.
257         if ( ! $this->_es_anterior( $ini, $fin ) )
258             return false;
259
260         // Si no se especifica orden lo inicializa.
261         if ( is_null( $orden ) )
262             $orden = array('fecha' => HE_DB_ASC);
263
264         // Genera un array con las clausulas del ORDER BY del query
265         $order = array();
266         foreach ( $orden as $campo => $ord )
267             $order[] = sprintf( "%s %s", $campo, $ord );
268             
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 );
272             return false;
273         }
274
275         // Prepara el query con el rango de fechas
276         $query = sprintf(
277             'SELECT *
278                 FROM
279                     %s.%s
280                 WHERE
281                     %s <= fecha AND
282                     fecha <= %s
283                 %s',
284             $this->_basededatos,
285             $this->_tabla,
286             $this->_db->quote( $ini ),
287             $this->_db->quote( $fin ),
288             $order ? ( ' ORDER BY ' . join( ',', $order ) ) : ''
289         );
290
291         $resultado =& $this->_db->query( $query );
292         if ( DB::isError( $resultado ) ) {   // Hubo un error
293             $this->_error->agregar( $resultado );
294             return false;
295         } elseif ( $resultado->numRows() ) { // Tiene algún resultado
296             $this->_resultado =& $resultado;
297             return true;
298         } else {
299             return false;
300         }
301
302     }
303
304 }
305
306 // $Id$
307 ?>