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: lun abr 22 16:05:33 ART 2002
22 Autor: Gonzalo Merayo <gmeray@mecon.gov.ar>
23 -------------------------------------------------------------------------------
25 -----------------------------------------------------------------------------*/
27 require_once 'DB.php'; // FIXME - esto debe volar!!!
28 require_once 'MECON/Tiempo/Intervalo.php';
31 * Representa un conjunto de entradas y salidas para formar una banda horaria
36 * @author Gonzalo Merayo <gmeray@mecon.gov.ar>
43 $this->intervalos = array();
46 function Cargar($agente, $fecha)
48 // FIXME - lo que es base de datos debe VOLAR!!!!!!!
49 $dsn = "mysql://intranet:intranet@intranet-db/bandas";
50 $db =& DB::connect($dsn , true);
52 die($db->getMessage());
54 $funcion = $db->getOne(
56 FROM novedades.estado as E, novedades.web003 as S
58 E.nrodoc = $agente AND
59 S.nrodoc = $agente AND
60 S.codep = E.dependencia"
63 $fecha = $fecha->format("%Y%m%d");
64 $query = "SELECT A.tipo_acceso, A.hora
65 FROM agentes G, accesos A
69 AND A.inconsistencia = 0
71 $result = $db->query($query);
72 if(DB::isError($result))
73 die($result->getMessage());
78 while( $r = $result->fetchRow() )
80 if($r[0] == 'E') $int = new Intervalo(new Hora( $r[1] ), new Hora( $r[1] ));
81 if($r[0] == 'S' && $int != null)
83 $int->setFin( new Hora( $r[1] ) );
84 $this->agregarIntervalo( $int );
91 if($result->numRows() > 0)
92 {//Version Light o Serenos
93 $int = new Intervalo(new Hora('00:00'), new Hora('00:00'));
94 while( $r = $result->fetchRow() )
96 if($r[0] == 'E') $int = new Intervalo(new Hora( $r[1] ), new Hora( $r[1] ));
97 if($r[0] == 'S' && $int != null)
99 $int->setFin( new Hora( $r[1] ) );
100 $this->agregarIntervalo( $int );
106 $int->setFin( new Hora('24:00') );
107 $this->agregarIntervalo( $int );
116 * Completa las salidas del medio del dia.
119 function CompletarSalidas()
121 if(count($this->intervalos) > 0)
123 $p = reset($this->intervalos);
124 $u = end($this->intervalos);
126 $this->intervalos = array($p);
132 * Agrega un intervalo a la banda
133 * Chequeando superposiciones y en orden
135 * @param Intervalo $intervalo Intervalo a agregar.
137 function agregarIntervalo($intervalo)
139 if(! is_a($intervalo, "intervalo")) return false;
140 if ($intervalo->invertido()) {
141 $intervalo->_chequear();
142 $this->agregarIntervalo(new Intervalo(new Hora('00:00'), new Hora ('24:00')));
143 $this->sacarIntervalo($intervalo);
146 $n_intervalos = array();
148 // recorre el vector de intervalos
149 foreach( $this->intervalos as $i )
151 // si se superpone con alguno, fusionar con ese
152 if($i->seSuperpone($intervalo))
153 $intervalo->fusionar($i);
155 if($i->inicio->greater($intervalo->inicio) && ! $insertado)
157 array_push($n_intervalos, $intervalo);
160 array_push($n_intervalos, $i);
163 if(! $insertado ) array_push($n_intervalos,$intervalo);
164 $this->intervalos = $n_intervalos;
173 function sacarBanda($banda)
175 foreach($banda->intervalos as $i)
176 $this->sacarIntervalo($i);
180 * Saca un intervalo de una banda horaria.
183 function sacarIntervalo($intervalo)
185 if(! is_a($intervalo, "intervalo")) return false;
186 // Si el intervalo está vacío, no hace nada.
187 $dur = $intervalo->getDuracion();
188 if ($dur->isEmpty()) {
191 $n_intervalos = array();
192 // recorre el vector de intervalos
193 foreach( $this->intervalos as $i )
195 if($i->seSuperpone($intervalo)) {
196 $a = $i->cortar($intervalo);
197 $d = $a->getDuracion();
198 if($d->toSeconds() > 0) {
199 $n_intervalos[] = $a;
201 $d = $i->getDuracion();
202 if($d->toSeconds() > 0) {
203 $n_intervalos[] = $i;
206 $n_intervalos[] = $i;
209 $this->intervalos = $n_intervalos;
214 function sacarTiempo($t)
216 if(! is_a($t, "date_span")) return false;
218 while(count($this->intervalos) > 0)
220 $int = array_shift($this->intervalos);
221 if($t->toSeconds() > 0){
222 $d = $int->getDuracion();
227 $ini->copy($int->inicio);
229 /*TODO guardar este tiempo como rechazado*/$int->cortar($ini);
230 $t->setFromSeconds(0);
232 #con cortar no alcanza y hay que sacar...
233 $t->subtract($int->getDuracion());
234 /*TODO guardar int como rechazado*/
239 $this->intervalos = $n_int;
243 * Chequea si el intervalo pedido esta cubierto por la banda, si faltan
244 * horas en la banta se retorna el tiempo que falta
246 * @return Date_Span el periodo faltante
249 function chequearIntervalo($intervalo)
251 if(! is_a($intervalo, "intervalo")) return false;
253 foreach ($this->intervalos as $i)
254 $t->add($i->superponer($intervalo));
255 $d = $intervalo->getDuracion();
261 * Chequea si la banda(parametro) esta cubierto por la banda(this),
262 * si faltan horas en la banda(this) para llegar a banda(parametro)
263 * se retorna el tiempo que falta
265 * @return Date_Span el periodo faltante
268 function chequearBanda($banda)
270 if(! is_a($banda, "banda")) return false;
272 foreach ($banda->intervalos as $i)
273 $f->add($this->chequearIntervalo($i));
279 * Devuelve una representacion del objeto como un string.
281 * @return string Representacion del objeto.
287 $t = count($this->intervalos);
288 for ($n = 0; $n < ($t - 1); $n++) {
289 $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . '] | ';
293 $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . ']';
298 function getIntervalos() {
299 return $this->intervalos;
303 * Corta una banda, devolviendo la banda previa al punto de corte.
305 * La banda actual queda con los intervalos posteriores al punto de corte
306 * y se devuelve la banda con los intervalos anteriores.
307 * El punto de corte puede ser tanto una hora como un intervalo.
309 * @param mixed $c Donde cortar.
311 * @return object Banda Bnada anterior al punto de corte.
315 if(!is_a($c, 'hora') and !is_a($c, 'intervalo')) return false;
316 $b = $this->__clone();
317 $b->intervalos = array();
318 $intervalos = array();
319 foreach ($this->intervalos as $i) {
321 $da = $a->getDuracion();
322 if (!$da->isEmpty()) {
323 $b->agregarIntervalo($a);
325 $di = $i->getDuracion();
326 if (!$di->isEmpty()) {
330 $this->intervalos = $intervalos;
335 * Devuelve el timpo total que contiene la banda.
337 * @return object Date_Span Tiempo total.
341 foreach ($this->intervalos as $i) {
342 $t->add($i->getDuracion());
348 * Alias de Banda::total() para compatibilidad con Intervalo.
350 * @return object Date_Span Tiempo total.
352 function getDuracion() {
353 return $this->total();
360 $this->intervalos = array();
365 foreach ($b->intervalos as $i) {
366 $this->intervalos[] = $i->__clone();
371 $class = get_class($this);