]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/Tiempo/Intervalo.php
Se agrega a la clase MLIB_PDF_Tabla y MLIB_PDF_Tabla_Estilo la posibilidad de
[mecon/meconlib.git] / lib / MLIB / Tiempo / Intervalo.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                                     mlib
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
6  
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
10 any later version.
11  
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15  
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA  02111-1307  USA
19 -------------------------------------------------------------------------------
20 Creado: lun abr 22 16:05:33 ART 2002
21 Autor:  Gonzalo Merayo <gmeray@mecon.gov.ar>
22 -------------------------------------------------------------------------------
23 $Id$
24 -----------------------------------------------------------------------------*/
25
26 require_once 'MLIB/Tiempo/Hora.php';
27
28 /**
29  * Representa un Intervalo entre 2 horas del mismo dia
30  *
31  * @package HE
32  * @version $Rev$
33  * @author  Gonzalo Merayo <gmeray@mecon.gov.ar>
34  */
35 class MLIB_Tiempo_Intervalo {
36     /**
37      *
38      * Hora de inicio del intervalo
39      *
40      * @var object Hora
41      */
42     var $inicio;
43
44     /**
45      *
46      * Hora de fin del intervalo
47      *
48      * @var object Hora
49      */
50     var $fin;
51
52     /**
53      * Constructor.
54      *
55      * @param Hora $inicio   Hora de inicio (por defecto cero).
56      * @param Hora $fin      Hora de fin (por defecto cero).
57      * @param bool $chequear Invierte el intervalo si la hora de
58      *                       fin es anterior a la de inicio.
59      *                       
60      */
61     function MLIB_Tiempo_Intervalo($inicio = null, $fin = null, $chequear = true)
62     {
63         if (!$inicio) {
64             $inicio = new MLIB_Tiempo_Hora;
65         }
66         if (!$fin) {
67             $fin = new MLIB_Tiempo_Hora;
68         }
69         $this->inicio = $inicio;
70         $this->fin    = $fin;
71         if ($chequear) {
72             $this->_chequear();
73         }
74     }
75
76     function _chequear()
77     {
78         $a = $this->fin;
79         if($a->lower($this->inicio)) {
80             $tmp = $this->fin;
81             $this->fin = $this->inicio;
82             $this->inicio = $tmp;
83         }
84     }
85
86     function invertido()
87     {
88         return $this->fin->lower($this->inicio);
89     }
90
91     function setInicio($inicio) {
92         $this->inicio = $inicio;
93         $this->_chequear();
94     }
95
96     /**
97      *
98      * setFin
99      *
100      * @param var $fin
101      *
102      */
103     function setFin($fin)
104     {
105         $this->fin = $fin;
106         $this->_chequear();
107     }
108
109     function getDuracion()
110     {
111         $c = new MLIB_Tiempo_Hora;
112         $c->copy($this->fin);
113         $c->subtract($this->inicio);
114         return $c;
115     }
116
117     /**
118      * Chequea si el intervalo se superpone con otros.
119      * @param $intervalos Intervalo o array de Intervalo con los cuales chequear.
120      * @return true si se superpone con uno o más intervalos.
121      */
122     function seSuperpone($intervalos)
123     {
124         if (!is_array($intervalos)) {
125             $intervalos = array($intervalos);
126         }
127         foreach ($intervalos as $i) {
128             if ($i->fin->greater($this->inicio) && $this->fin->greater($i->inicio)) {
129                 return true;
130             }
131             if ($this->fin->greater($i->inicio) && $i->fin->greater($this->inicio)) {
132                 return true;
133             }
134         }
135         return false;
136     }
137
138     /**
139      * Chequea si el intervalo es adyacente a otro.
140      * Ejemplo:
141      * <pre>
142      *       A            B
143      * |-----------|------------|  Adyacentes
144      *
145      *       A              B
146      * |-----------|   |--------|  No adyacentes
147      * </pre>
148      * @param $intervalo Intervalo con el cual chequear.
149      * @return true si se son adyacentes.
150      */
151     function esAdyacente($intervalo)
152     {
153         if ($intervalo->fin->equal($this->inicio) || $this->fin->equal($intervalo->inicio)) {
154             return true;
155         }
156         return false;
157     }
158
159     function fusionar($i)
160     {
161         if (!$this->seSuperpone($i) && !$this->esAdyacente($i)) {
162             return false;
163         }
164         if ($i->fin->greater($this->fin)) {
165             $this->fin = $i->fin;
166         }
167         if ($i->inicio->lower($this->inicio)) {
168             $this->inicio = $i->inicio;
169         }
170         return true;
171     }
172
173     function superponer($i)
174     {
175         $inicio = $this->inicio;
176         $fin = $this->fin;
177         if ($this->inicio->lower($i->inicio)) {
178             $inicio = $i->inicio;
179         }
180         if ($this->fin->greater($i->fin)) {
181             $fin = $i->fin;
182         }
183         $fin->subtract($inicio);
184         return $fin;
185     }
186
187     /**
188      * Corta un intervalo, devolviendo el intervalo previo al punto de corte.
189      * El intervalo actual queda con el intervalo posterior al punto de corte.
190      * El punto de corte puede ser tanto una hora como un intervalo.
191      *
192      * @param mixed $c Donde cortar.
193      *
194      * @return object Intervalo Intervalo anterior al punto de corte.
195      */
196     function cortar($c)
197     {
198         if(is_a($c, 'MLIB_tiempo_hora')) {
199             return $this->cortarHora($c);
200         } elseif (is_a($c, 'MLIB_tiempo_intervalo')) {
201             return $this->cortarIntervalo($c);
202         } else {
203             return false;
204         }
205     }
206
207     /**
208      * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
209      * El intervalo actual queda con el intervalo posterior a la hora de corte.
210      *
211      * @param mixed $h Donde cortar.
212      *
213      * @return object Intervalo Intervalo anterior a la hora de corte.
214      */
215     function cortarHora($h)
216     {
217         $class = get_class($this);
218         $r = new $class;
219         $r->copy($this);
220         if($this->inicio->greater($h)) {
221             $r->setFin($r->inicio);
222             return $r;
223         }
224         if($this->fin->lowerEqual($h)) {
225             $this->setInicio($this->fin);
226         } else {
227             $this->setInicio($h);
228             $r->setFin($h);
229         }
230         return $r;
231     }
232
233     /**
234      * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
235      * El intervalo actual queda con el intervalo posterior al intervalo de corte.
236      *
237      * @param mixed $i Donde cortar.
238      *
239      * @return object Intervalo Intervalo anterior al intervalo de corte.
240      */
241     function cortarIntervalo($i)
242     {
243         $ant = $this->cortarHora($i->inicio);
244         $this->cortarHora($i->fin);
245         return $ant;
246     }
247
248     function toString() {
249         return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format();
250     }
251
252     function copy($i)
253     {
254         $this->inicio = $i->inicio->__clone();
255         $this->fin    = $i->fin->__clone();
256         return true;
257     }
258
259     function __clone()
260     {
261         $class = get_class($this);
262         $i = new $class;
263         $i->copy($this);
264         return $i;
265     }
266
267 }
268
269 ?>