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>
38 class MECON_Tiempo_Banda {
42 function MECON_Tiempo_Banda() {
43 $this->intervalos = array();
46 function Cargar($agente, $fecha) {
47 // FIXME - lo que es base de datos debe VOLAR!!!!!!!
48 $dsn = "mysql://intranet:intranet@intranet-db.mecon.ar/bandas";
49 $db =& DB::connect($dsn , true);
51 die($db->getMessage());
53 $funcion = $db->getOne(
55 FROM novedades.estado as E, novedades.web003 as S
57 E.nrodoc = $agente AND
58 S.nrodoc = $agente AND
59 S.codep = E.dependencia"
62 $fecha = $fecha->format("%Y%m%d");
63 $query = "SELECT A.tipo_acceso, A.hora
64 FROM agentes G, accesos A
68 AND A.inconsistencia = 0
70 $result = $db->query($query);
71 if(DB::isError($result))
72 die($result->getMessage());
74 if($funcion != 'SE') {//Version tough
76 while( $r = $result->fetchRow() ) {
78 $int = new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora( $r[1] ), new MECON_Tiempo_Hora( $r[1] ));
79 if($r[0] == 'S' && $int != null) {
80 $int->setFin( new MECON_Tiempo_Hora( $r[1] ) );
81 $this->agregarIntervalo( $int );
86 if($result->numRows() > 0) {//Version Light o Serenos
87 $int = new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora('00:00'), new MECON_Tiempo_Hora('00:00'));
88 while( $r = $result->fetchRow() ) {
90 $int = new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora( $r[1] ), new MECON_Tiempo_Hora( $r[1] ));
91 if($r[0] == 'S' && $int != null) {
92 $int->setFin( new MECON_Tiempo_Hora( $r[1] ) );
93 $this->agregarIntervalo( $int );
98 $int->setFin( new MECON_Tiempo_Hora('24:00') );
99 $this->agregarIntervalo( $int );
108 * Completa las salidas del medio del dia.
111 function CompletarSalidas() {
112 if(count($this->intervalos) > 0) {
113 $p = reset($this->intervalos);
114 $u = end($this->intervalos);
116 $this->intervalos = array($p);
122 * Agrega un intervalo a la banda
123 * Chequeando superposiciones y en orden
125 * @param Intervalo $intervalo Intervalo a agregar.
127 function agregarIntervalo($intervalo) {
128 if(! is_a($intervalo, "mecon_tiempo_intervalo"))
130 if ($intervalo->invertido()) {
131 $intervalo->_chequear();
132 $this->agregarIntervalo(new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora('00:00'), new MECON_Tiempo_Hora ('24:00')));
133 $this->sacarIntervalo($intervalo);
136 $n_intervalos = array();
138 // recorre el vector de intervalos
139 foreach( $this->intervalos as $i ) {
140 // si se superpone con alguno, fusionar con ese
141 if($i->seSuperpone($intervalo))
142 $intervalo->fusionar($i);
144 if($i->inicio->greater($intervalo->inicio) && ! $insertado) {
145 array_push($n_intervalos, $intervalo);
148 array_push($n_intervalos, $i);
152 array_push($n_intervalos,$intervalo);
153 $this->intervalos = $n_intervalos;
162 function sacarBanda($banda) {
163 foreach($banda->intervalos as $i)
164 $this->sacarIntervalo($i);
168 * Saca un intervalo de una banda horaria.
171 function sacarIntervalo($intervalo) {
172 if(! is_a($intervalo, "mecon_tiempo_intervalo"))
174 // Si el intervalo está vacío, no hace nada.
175 $dur = $intervalo->getDuracion();
176 if ($dur->isEmpty()) {
179 $n_intervalos = array();
180 // recorre el vector de intervalos
181 foreach( $this->intervalos as $i ) {
182 if($i->seSuperpone($intervalo)) {
183 $a = $i->cortar($intervalo);
184 $d = $a->getDuracion();
185 if($d->toSeconds() > 0) {
186 $n_intervalos[] = $a;
188 $d = $i->getDuracion();
189 if($d->toSeconds() > 0) {
190 $n_intervalos[] = $i;
193 $n_intervalos[] = $i;
196 $this->intervalos = $n_intervalos;
201 function sacarTiempo($t) {
202 if(! is_a($t, "date_span"))
205 while(count($this->intervalos) > 0) {
206 $int = array_shift($this->intervalos);
207 if($t->toSeconds() > 0) {
208 $d = $int->getDuracion();
209 if($d->greater($t)) {
211 $ini = new MECON_Tiempo_Hora();
212 $ini->copy($int->inicio);
215 /*TODO guardar este tiempo como rechazado*/
217 $t->setFromSeconds(0);
219 #con cortar no alcanza y hay que sacar...
220 $t->subtract($int->getDuracion());
221 /*TODO guardar int como rechazado*/
226 $this->intervalos = $n_int;
230 * Chequea si el intervalo pedido esta cubierto por la banda, si faltan
231 * horas en la banta se retorna el tiempo que falta
233 * @return Date_Span el periodo faltante
236 function chequearIntervalo($intervalo) {
237 if(! is_a($intervalo, "mecon_tiempo_intervalo"))
239 $t = new MECON_Tiempo_Hora();
240 foreach ($this->intervalos as $i)
242 ($i->superponer($intervalo));
243 $d = $intervalo->getDuracion();
249 * Chequea si la banda(parametro) esta cubierto por la banda(this),
250 * si faltan horas en la banda(this) para llegar a banda(parametro)
251 * se retorna el tiempo que falta
253 * @return Date_Span el periodo faltante
256 function chequearBanda($banda) {
257 if(! is_a($banda, "mecon_tiempo_banda"))
259 $f = new MECON_Tiempo_Hora();
260 foreach ($banda->intervalos as $i)
262 ($this->chequearIntervalo($i));
268 * Devuelve una representacion del objeto como un string.
270 * @return string Representacion del objeto.
273 function toString() {
275 $t = count($this->intervalos);
276 for ($n = 0; $n < ($t - 1); $n++) {
277 $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . '] | ';
281 $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . ']';
286 function getIntervalos() {
287 return $this->intervalos;
291 * Corta una banda, devolviendo la banda previa al punto de corte.
293 * La banda actual queda con los intervalos posteriores al punto de corte
294 * y se devuelve la banda con los intervalos anteriores.
295 * El punto de corte puede ser tanto una hora como un intervalo.
297 * @param mixed $c Donde cortar.
299 * @return object Banda Bnada anterior al punto de corte.
301 function cortar($c) {
302 if(!is_a($c, 'mecon_tiempo_hora') and !is_a($c, 'mecon_tiempo_intervalo'))
304 $b = $this->__clone();
305 $b->intervalos = array();
306 $intervalos = array();
307 foreach ($this->intervalos as $i) {
309 $da = $a->getDuracion();
310 if (!$da->isEmpty()) {
311 $b->agregarIntervalo($a);
313 $di = $i->getDuracion();
314 if (!$di->isEmpty()) {
318 $this->intervalos = $intervalos;
323 * Devuelve el timpo total que contiene la banda.
325 * @return object Date_Span Tiempo total.
329 foreach ($this->intervalos as $i) {
337 * Alias de Banda::total() para compatibilidad con Intervalo.
339 * @return object Date_Span Tiempo total.
341 function getDuracion() {
342 return $this->total();
349 $this->intervalos = array();
354 foreach ($b->intervalos as $i) {
355 $this->intervalos[] = $i->__clone();
360 $class = get_class($this);