]> git.llucax.com Git - mecon/meconlib.git/commitdiff
Se agrega versión preeliminar (ni anda todavía) del objeto MECON_Feriado.
authorLeandro Lucarella <llucax@gmail.com>
Mon, 5 Jan 2004 22:39:14 +0000 (22:39 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Mon, 5 Jan 2004 22:39:14 +0000 (22:39 +0000)
lib/MECON/Feriado.php [new file with mode: 0644]

diff --git a/lib/MECON/Feriado.php b/lib/MECON/Feriado.php
new file mode 100644 (file)
index 0000000..2ea14b2
--- /dev/null
@@ -0,0 +1,307 @@
+<?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$
+?>