2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
3 // +--------------------------------------------------------------------+
5 // +--------------------------------------------------------------------+
6 // | Sistema de Horas Extra - Ministerio de Economía - Argentina |
7 // +--------------------------------------------------------------------+
8 // | Creado: lun abr 22 16:05:33 ART 2002 |
9 // | Autor: Gonzalo Merayo <gmeray@mecon.gov.ar> |
10 // +--------------------------------------------------------------------+
18 require_once 'DB.php'; // FIXME - esto debe volar!!!
19 require_once 'Tiempo/Intervalo.php';
22 * Representa un conjunto de entradas y salidas para formar una banda horaria
27 * @author Gonzalo Merayo <gmeray@mecon.gov.ar>
34 $this->intervalos = array();
37 function Cargar($agente, $fecha)
39 // FIXME - lo que es base de datos debe VOLAR!!!!!!!
40 $dsn = "mysql://intranet:intranet@intranet-db/bandas";
41 $db =& DB::connect($dsn , true);
43 die($db->getMessage());
45 $funcion = $db->getOne(
47 FROM novedades.estado as E, novedades.web003 as S
49 E.nrodoc = $agente AND
50 S.nrodoc = $agente AND
51 S.codep = E.dependencia"
54 $fecha = $fecha->format("%Y%m%d");
55 $query = "SELECT A.tipo_acceso, A.hora
56 FROM agentes G, accesos A
60 AND A.inconsistencia = 0
62 $result = $db->query($query);
63 if(DB::isError($result))
64 die($result->getMessage());
69 while( $r = $result->fetchRow() )
71 if($r[0] == 'E') $int = new Intervalo(new Hora( $r[1] ), new Hora( $r[1] ));
72 if($r[0] == 'S' && $int != null)
74 $int->setFin( new Hora( $r[1] ) );
75 $this->agregarIntervalo( $int );
82 if($result->numRows() > 0)
83 {//Version Light o Serenos
84 $int = new Intervalo(new Hora('00:00'), new Hora('00:00'));
85 while( $r = $result->fetchRow() )
87 if($r[0] == 'E') $int = new Intervalo(new Hora( $r[1] ), new Hora( $r[1] ));
88 if($r[0] == 'S' && $int != null)
90 $int->setFin( new Hora( $r[1] ) );
91 $this->agregarIntervalo( $int );
97 $int->setFin( new Hora('24:00') );
98 $this->agregarIntervalo( $int );
107 * Completa las salidas del medio del dia.
110 function CompletarSalidas()
112 if(count($this->intervalos) > 0)
114 $p = reset($this->intervalos);
115 $u = end($this->intervalos);
117 $this->intervalos = array($p);
123 * Agrega un intervalo a la banda
124 * Chequeando superposiciones y en orden
126 * @param Intervalo $intervalo Intervalo a agregar.
128 function agregarIntervalo($intervalo)
130 if(! is_a($intervalo, "intervalo")) return false;
131 if ($intervalo->invertido()) {
132 $intervalo->_chequear();
133 $this->agregarIntervalo(new Intervalo(new Hora('00:00'), new Hora ('24:00')));
134 $this->sacarIntervalo($intervalo);
137 $n_intervalos = array();
139 // recorre el vector de intervalos
140 foreach( $this->intervalos as $i )
142 // si se superpone con alguno, fusionar con ese
143 if($i->seSuperpone($intervalo))
144 $intervalo->fusionar($i);
146 if($i->inicio->greater($intervalo->inicio) && ! $insertado)
148 array_push($n_intervalos, $intervalo);
151 array_push($n_intervalos, $i);
154 if(! $insertado ) array_push($n_intervalos,$intervalo);
155 $this->intervalos = $n_intervalos;
164 function sacarBanda($banda)
166 foreach($banda->intervalos as $i)
167 $this->sacarIntervalo($i);
171 * Saca un intervalo de una banda horaria.
174 function sacarIntervalo($intervalo)
176 if(! is_a($intervalo, "intervalo")) return false;
177 // Si el intervalo está vacío, no hace nada.
178 $dur = $intervalo->getDuracion();
179 if ($dur->isEmpty()) {
182 $n_intervalos = array();
183 // recorre el vector de intervalos
184 foreach( $this->intervalos as $i )
186 if($i->seSuperpone($intervalo)) {
187 $a = $i->cortar($intervalo);
188 $d = $a->getDuracion();
189 if($d->toSeconds() > 0) {
190 $n_intervalos[] = $a;
192 $d = $i->getDuracion();
193 if($d->toSeconds() > 0) {
194 $n_intervalos[] = $i;
197 $n_intervalos[] = $i;
200 $this->intervalos = $n_intervalos;
205 function sacarTiempo($t)
207 if(! is_a($t, "time_span")) return false;
209 while(count($this->intervalos) > 0)
211 $int = array_shift($this->intervalos);
212 if($t->toSeconds() > 0){
213 $d = $int->getDuracion();
218 $ini->copy($int->inicio);
220 /*TODO guardar este tiempo como rechazado*/$int->cortar($ini);
221 $t->setFromSeconds(0);
223 #con cortar no alcanza y hay que sacar...
224 $t->subtract($int->getDuracion());
225 /*TODO guardar int como rechazado*/
230 $this->intervalos = $n_int;
234 * Chequea si el intervalo pedido esta cubierto por la banda, si faltan
235 * horas en la banta se retorna el tiempo que falta
237 * @return Time_Span el periodo faltante
240 function chequearIntervalo($intervalo)
242 if(! is_a($intervalo, "intervalo")) return false;
244 foreach ($this->intervalos as $i)
245 $t->add($i->superponer($intervalo));
246 $d = $intervalo->getDuracion();
252 * Chequea si la banda(parametro) esta cubierto por la banda(this),
253 * si faltan horas en la banda(this) para llegar a banda(parametro)
254 * se retorna el tiempo que falta
256 * @return Time_Span el periodo faltante
259 function chequearBanda($banda)
261 if(! is_a($banda, "banda")) return false;
263 foreach ($banda->intervalos as $i)
264 $f->add($this->chequearIntervalo($i));
270 * Devuelve una representacion del objeto como un string.
272 * @return string Representacion del objeto.
278 $t = count($this->intervalos);
279 for ($n = 0; $n < ($t - 1); $n++) {
280 $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . '] | ';
284 $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . ']';
289 function getIntervalos() {
290 return $this->intervalos;
294 * Corta una banda, devolviendo la banda previa al punto de corte.
296 * La banda actual queda con los intervalos posteriores al punto de corte
297 * y se devuelve la banda con los intervalos anteriores.
298 * El punto de corte puede ser tanto una hora como un intervalo.
300 * @param mixed $c Donde cortar.
302 * @return object Banda Bnada anterior al punto de corte.
306 if(!is_a($c, 'hora') and !is_a($c, 'intervalo')) return false;
307 $b = $this->__clone();
308 $b->intervalos = array();
309 $intervalos = array();
310 foreach ($this->intervalos as $i) {
312 $da = $a->getDuracion();
313 if (!$da->isEmpty()) {
314 $b->agregarIntervalo($a);
316 $di = $i->getDuracion();
317 if (!$di->isEmpty()) {
321 $this->intervalos = $intervalos;
326 * Devuelve el timpo total que contiene la banda.
328 * @return object Time_Span Tiempo total.
332 foreach ($this->intervalos as $i) {
333 $t->add($i->getDuracion());
339 * Alias de Banda::total() para compatibilidad con Intervalo.
341 * @return object Time_Span Tiempo total.
343 function getDuracion() {
344 return $this->total();
351 $this->intervalos = array();
356 foreach ($b->intervalos as $i) {
357 $this->intervalos[] = $i->__clone();
362 $class = get_class($this);