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 'HE/Intervalo.php';
21 * Representa un conjunto de entradas y salidas para formar una banda horaria
26 * @author Gonzalo Merayo <gmeray@mecon.gov.ar>
33 $this->intervalos = array();
36 function Cargar($agente, $fecha)
38 $dsn = "mysql://intranet:intranet@intranet-db/bandas";
39 $db = DB::connect( $dsn , true);
41 die($db->getMessage());
42 $fecha = $fecha->format("%Y%m%d");
43 $query = "SELECT A.tipo_acceso, A.hora
44 FROM agentes G, accesos A
48 AND A.inconsistencia = 0
50 $result = $db->query($query);
51 if(DB::isError($result))
52 die($result->getMessage());
54 $sip =& new HE_DB_Persona;
55 $datos = $sip->obtener($agente);
56 $age =& new HE_DB_Agente;
57 $ag = $age->obtener($agente, $datos['codep']);
58 $funcion = @$ag['funcion'];
63 while( $r = $result->fetchRow() )
65 if($r[0] == 'E') $int = new Intervalo(new Hora( $r[1] ), new Hora( $r[1] ));
66 if($r[0] == 'S' && $int != null)
68 $int->setFin( new Hora( $r[1] ) );
69 $this->agregarIntervalo( $int );
76 if($result->numRows() > 0)
77 {//Version Light o Serenos
78 $int = new Intervalo(new Hora('00:00'), new Hora('00:00'));
79 while( $r = $result->fetchRow() )
81 if($r[0] == 'E') $int = new Intervalo(new Hora( $r[1] ), new Hora( $r[1] ));
82 if($r[0] == 'S' && $int != null)
84 $int->setFin( new Hora( $r[1] ) );
85 $this->agregarIntervalo( $int );
91 $int->setFin( new Hora('24:00') );
92 $this->agregarIntervalo( $int );
101 * Completa las salidas del medio del dia.
104 function CompletarSalidas()
106 if(count($this->intervalos) > 0)
108 $p = reset($this->intervalos);
109 $u = end($this->intervalos);
111 $this->intervalos = array($p);
117 * Agrega un intervalo a la banda
118 * Chequeando superposiciones y en orden
120 * @param Intervalo $intervalo Intervalo a agregar.
122 function agregarIntervalo($intervalo)
124 if(! is_a($intervalo, "intervalo")) return false;
125 if ($intervalo->invertido()) {
126 $intervalo->_chequear();
127 $this->agregarIntervalo(new Intervalo(new Hora('00:00'), new Hora ('24:00')));
128 $this->sacarIntervalo($intervalo);
131 $n_intervalos = array();
133 // recorre el vector de intervalos
134 foreach( $this->intervalos as $i )
136 // si se superpone con alguno, fusionar con ese
137 if($i->seSuperpone($intervalo))
138 $intervalo->fusionar($i);
140 if($i->inicio->greater($intervalo->inicio) && ! $insertado)
142 array_push($n_intervalos, $intervalo);
145 array_push($n_intervalos, $i);
148 if(! $insertado ) array_push($n_intervalos,$intervalo);
149 $this->intervalos = $n_intervalos;
158 function sacarBanda($banda)
160 foreach($banda->intervalos as $i)
161 $this->sacarIntervalo($i);
165 * Saca un intervalo de una banda horaria.
168 function sacarIntervalo($intervalo)
170 if(! is_a($intervalo, "intervalo")) return false;
171 // Si el intervalo está vacío, no hace nada.
172 $dur = $intervalo->getDuracion();
173 if ($dur->isEmpty()) {
176 $n_intervalos = array();
177 // recorre el vector de intervalos
178 foreach( $this->intervalos as $i )
180 if($i->seSuperpone($intervalo)) {
181 $a = $i->cortar($intervalo);
182 $d = $a->getDuracion();
183 if($d->toSeconds() > 0) {
184 $n_intervalos[] = $a;
186 $d = $i->getDuracion();
187 if($d->toSeconds() > 0) {
188 $n_intervalos[] = $i;
191 $n_intervalos[] = $i;
194 $this->intervalos = $n_intervalos;
199 function sacarTiempo($t)
201 if(! is_a($t, "time_span")) return false;
203 while(count($this->intervalos) > 0)
205 $int = array_shift($this->intervalos);
206 if($t->toSeconds() > 0){
207 $d = $int->getDuracion();
212 $ini->copy($int->inicio);
214 /*TODO guardar este tiempo como rechazado*/$int->cortar($ini);
215 $t->setFromSeconds(0);
217 #con cortar no alcanza y hay que sacar...
218 $t->subtract($int->getDuracion());
219 /*TODO guardar int como rechazado*/
224 $this->intervalos = $n_int;
228 * Chequea si el intervalo pedido esta cubierto por la banda, si faltan
229 * horas en la banta se retorna el tiempo que falta
231 * @return Time_Span el periodo faltante
234 function chequearIntervalo($intervalo)
236 if(! is_a($intervalo, "intervalo")) return false;
238 foreach ($this->intervalos as $i)
239 $t->add($i->superponer($intervalo));
240 $d = $intervalo->getDuracion();
246 * Chequea si la banda(parametro) esta cubierto por la banda(this),
247 * si faltan horas en la banda(this) para llegar a banda(parametro)
248 * se retorna el tiempo que falta
250 * @return Time_Span el periodo faltante
253 function chequearBanda($banda)
255 if(! is_a($banda, "banda")) return false;
257 foreach ($banda->intervalos as $i)
258 $f->add($this->chequearIntervalo($i));
264 * Devuelve una representacion del objeto como un string.
266 * @return string Representacion del objeto.
272 $t = count($this->intervalos);
273 for ($n = 0; $n < ($t - 1); $n++) {
274 $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . '] | ';
278 $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . ']';
283 function getIntervalos() {
284 return $this->intervalos;
288 * Corta una banda, devolviendo la banda previa al punto de corte.
290 * La banda actual queda con los intervalos posteriores al punto de corte
291 * y se devuelve la banda con los intervalos anteriores.
292 * El punto de corte puede ser tanto una hora como un intervalo.
294 * @param mixed $c Donde cortar.
296 * @return object Banda Bnada anterior al punto de corte.
300 if(!is_a($c, 'hora') and !is_a($c, 'intervalo')) return false;
301 $b = $this->__clone();
302 $b->intervalos = array();
303 $intervalos = array();
304 foreach ($this->intervalos as $i) {
306 $da = $a->getDuracion();
307 if (!$da->isEmpty()) {
308 $b->agregarIntervalo($a);
310 $di = $i->getDuracion();
311 if (!$di->isEmpty()) {
315 $this->intervalos = $intervalos;
320 * Devuelve el timpo total que contiene la banda.
322 * @return object Time_Span Tiempo total.
326 foreach ($this->intervalos as $i) {
327 $t->add($i->getDuracion());
333 * Alias de Banda::total() para compatibilidad con Intervalo.
335 * @return object Time_Span Tiempo total.
337 function getDuracion() {
338 return $this->total();
345 $this->intervalos = array();
350 foreach ($b->intervalos as $i) {
351 $this->intervalos[] = $i->__clone();
356 $class = get_class($this);