+ /**
+ * Busca dias habiles en un rango de fechas y los devuelve en un array.
+ *
+ * Ejemplo:
+ * @code
+ * $diasHabiles = $feriado->buscarDiasHabiles('2002/10/01', '2002/12/31');
+ * if (count($diasHabiles)) {
+ * echo 'Cantidad de dias habiles en le rango: '. count($diasHabiles);
+ * foreach ($diasHabiles as $diaHabil) {
+ * print '<PRE>';var_dump($diaHabil);print '</PRE>';
+ * }
+ * }
+ * @endcode
+ *
+ * @param DB $db Conexión a la base de datos.
+ * @param mixed $ini Fecha de inicio del rango en donde buscar (por
+ * defecto el primer día del mes en curso). Puede ser
+ * un objeto Date.
+ * @param mixed $fin Fecha de fin del rango en donde buscar (por
+ * defecto el día del mes en curso). Puede ser un
+ * objeto Date.
+ *
+ * @return mixed
+ * @static
+ */
+ function buscarDiasHabiles($db, $ini = '', $fin = '') {
+ //Acomodo las fechas pasadas por parametro
+ $ini = empty( $ini ) ? strftime( '%Y-%m-01', time() ) : $ini;
+ $fin = empty( $fin ) ? strftime( '%Y-%m-%d', time() ) : $fin;
+ $ini = (is_string($ini)) ? new Date($ini) : $ini;
+ $fin = (is_string($fin)) ? new Date($fin) : $fin;
+
+ //Valido que $ini < $fin
+ if ($ini->after($fin)) {
+ return new PEAR_Error ('La fecha de fin debe ser anterior a la '.
+ 'fecha de inicio.');
+ }
+
+ //Obtener los dias feriados entre $ini y $fin
+ $sql = "SELECT fecha FROM novedades.feriados WHERE YEAR(fecha) = ".
+ $db->quote($ini->format("%Y")) . " OR YEAR(fecha) = " .
+ $db->quote($ini->format("%Y"));
+
+ $feriados = $db->getCol($sql);
+ if (DB::IsError($feriados)) {
+ return $feriados;
+ }
+
+ //Verifico fecha por fecha si es o no un dia habil
+ $ini =& $ini->getPrevDay();
+ while (!$ini->equals($fin)) {
+ $ini =& $ini->getNextDay();
+ //Verifico que la fecha no sea feriado ni sabado o domingo.
+ if (!in_array($ini->format("%Y-%m-%d"), $feriados) &&
+ ($ini->getDayOfWeek() != 0) &&
+ ($ini->getDayOfWeek() != 6)) {
+ $res[] = $ini;
+ }
+ }
+ return $res;
+ }