]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/Tiempo/Intervalo.php
Se modifica Intervalo::seSuperpone() para que no tome como superpuestos a
[mecon/meconlib.git] / lib / MECON / Tiempo / Intervalo.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                              Ministerio de Economía
4                                     meconlib
5 -------------------------------------------------------------------------------
6 This file is part of meconlib.
7  
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)
11 any later version.
12  
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.
16  
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 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'MECON/Tiempo/Hora.php';
28
29 /**
30  * Representa un Intervalo entre 2 horas del mismo dia
31  *
32  * @package HE
33  * @version $Rev$
34  * @author  Gonzalo Merayo <gmeray@mecon.gov.ar>
35  */
36 class MECON_Tiempo_Intervalo {
37     /**
38      *
39      * Hora de inicio del intervalo
40      *
41      * @var object Hora
42      */
43     var $inicio;
44
45     /**
46      *
47      * Hora de fin del intervalo
48      *
49      * @var object Hora
50      */
51     var $fin;
52
53     /**
54      * Constructor.
55      *
56      * @param Hora $inicio   Hora de inicio (por defecto cero).
57      * @param Hora $fin      Hora de fin (por defecto cero).
58      * @param bool $chequear Invierte el intervalo si la hora de
59      *                       fin es anterior a la de inicio.
60      *                       
61      */
62     function MECON_Tiempo_Intervalo($inicio = null, $fin = null, $chequear = true)
63     {
64         if (!$inicio) {
65             $inicio = new MECON_Tiempo_Hora;
66         }
67         if (!$fin) {
68             $fin = new MECON_Tiempo_Hora;
69         }
70         $this->inicio = $inicio;
71         $this->fin    = $fin;
72         if ($chequear) {
73             $this->_chequear();
74         }
75     }
76
77     function _chequear()
78     {
79         $a = $this->fin;
80         if($a->lower($this->inicio)) {
81             $tmp = $this->fin;
82             $this->fin = $this->inicio;
83             $this->inicio = $tmp;
84         }
85     }
86
87     function invertido()
88     {
89         return $this->fin->lower($this->inicio);
90     }
91
92     function setInicio($inicio) {
93         $this->inicio = $inicio;
94         $this->_chequear();
95     }
96
97     /**
98      *
99      * setFin
100      *
101      * @param var $fin
102      *
103      */
104     function setFin($fin)
105     {
106         $this->fin = $fin;
107         $this->_chequear();
108     }
109
110     function getDuracion()
111     {
112         $c = new MECON_Tiempo_Hora;
113         $c->copy($this->fin);
114         $c->subtract($this->inicio);
115         return $c;
116     }
117
118     /**
119      * Chequea si el intervalo se superpone con otros.
120      * @param $intervalos Intervalo o array de Intervalo con los cuales chequear.
121      * @return true si se superpone con uno o más intervalos.
122      */
123     function seSuperpone($intervalos)
124     {
125         if (!is_array($intervalos)) {
126             $intervalos = array($intervalos);
127         }
128         foreach ($intervalos as $i) {
129             if ($i->fin->greater($this->inicio) && $this->fin->greater($i->inicio)) {
130                 return true;
131             }
132             if ($this->fin->greater($i->inicio) && $i->fin->greater($this->inicio)) {
133                 return true;
134             }
135         }
136         return false;
137     }
138
139     /**
140      * Chequea si el intervalo es adyacente a otro.
141      * Ejemplo:
142      * <pre>
143      *       A            B
144      * |-----------|------------|  Adyacentes
145      *
146      *       A              B
147      * |-----------|   |--------|  No adyacentes
148      * </pre>
149      * @param $intervalo Intervalo con el cual chequear.
150      * @return true si se son adyacentes.
151      */
152     function esAdyacente($intervalo)
153     {
154         if ($i->fin->equal($this->inicio) || $this->fin->equal($i->inicio)) {
155             return true;
156         }
157         return false;
158     }
159
160     function fusionar($i)
161     {
162         if (!$this->seSuperpone($i) && !$this->esAdyacente($i)) {
163             return false;
164         }
165         if ($i->fin->greater($this->fin)) {
166             $this->fin = $i->fin;
167         }
168         if ($i->inicio->lower($this->inicio)) {
169             $this->inicio = $i->inicio;
170         }
171         return true;
172     }
173
174     function superponer($i)
175     {
176         $inicio = $this->inicio;
177         $fin = $this->fin;
178         if ($this->inicio->lower($i->inicio)) {
179             $inicio = $i->inicio;
180         }
181         if ($this->fin->greater($i->fin)) {
182             $fin = $i->fin;
183         }
184         $fin->subtract($inicio);
185         return $fin;
186     }
187
188     /**
189      * Corta un intervalo, devolviendo el intervalo previo al punto de corte.
190      * El intervalo actual queda con el intervalo posterior al punto de corte.
191      * El punto de corte puede ser tanto una hora como un intervalo.
192      *
193      * @param mixed $c Donde cortar.
194      *
195      * @return object Intervalo Intervalo anterior al punto de corte.
196      */
197     function cortar($c)
198     {
199         if(is_a($c, 'mecon_tiempo_hora')) {
200             return $this->cortarHora($c);
201         } elseif (is_a($c, 'mecon_tiempo_intervalo')) {
202             return $this->cortarIntervalo($c);
203         } else {
204             return false;
205         }
206     }
207
208     /**
209      * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
210      * El intervalo actual queda con el intervalo posterior a la hora de corte.
211      *
212      * @param mixed $h Donde cortar.
213      *
214      * @return object Intervalo Intervalo anterior a la hora de corte.
215      */
216     function cortarHora($h)
217     {
218         $class = get_class($this);
219         $r = new $class;
220         $r->copy($this);
221         if($this->inicio->greater($h)) {
222             $r->setFin($r->inicio);
223             return $r;
224         }
225         if($this->fin->lowerEqual($h)) {
226             $this->setInicio($this->fin);
227         } else {
228             $this->setInicio($h);
229             $r->setFin($h);
230         }
231         return $r;
232     }
233
234     /**
235      * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
236      * El intervalo actual queda con el intervalo posterior al intervalo de corte.
237      *
238      * @param mixed $i Donde cortar.
239      *
240      * @return object Intervalo Intervalo anterior al intervalo de corte.
241      */
242     function cortarIntervalo($i)
243     {
244         $ant = $this->cortarHora($i->inicio);
245         $this->cortarHora($i->fin);
246         return $ant;
247     }
248
249     function toString() {
250         return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format();
251     }
252
253     function copy($i)
254     {
255         $this->inicio = $i->inicio->__clone();
256         $this->fin    = $i->fin->__clone();
257         return true;
258     }
259
260     function __clone()
261     {
262         $class = get_class($this);
263         $i = new $class;
264         $i->copy($this);
265         return $i;
266     }
267
268 }
269
270 ?>