]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/Tiempo/Intervalo.php
3fff5b402d6c19eca00e79d21102ceb419f45eb4
[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     // XXX - Amplié el método para comparar con varios intervalos a la vez,
119     // si el argumento no es un array, anda de todas maneras.
120     function seSuperpone($intervalos)
121     {
122         if (!is_array($intervalos)) {
123             $intervalos = array($intervalos);
124         }
125         foreach ($intervalos as $i) {
126             if ($i->fin->greater($this->inicio) &&
127                     $this->fin->greater($i->inicio))
128             {
129                 return true;
130             }
131             if ($this->fin->greater($i->inicio) &&
132                     $i->fin->greater($this->inicio))
133             {
134                 return true;
135             }
136         }
137         return false;
138     }
139
140     function fusionar($f)
141     {
142         if (!$this->seSuperpone($f)) {
143             return false;
144         }
145         if ($f->fin->greater($this->fin)) {
146             $this->fin = $f->fin;
147         }
148         if ($f->inicio->lower($this->inicio)) {
149             $this->inicio = $f->inicio;
150         }
151         return true;
152     }
153
154     function superponer($i)
155     {
156         $inicio = $this->inicio;
157         $fin = $this->fin;
158         if ($this->inicio->lower($i->inicio)) {
159             $inicio = $i->inicio;
160         }
161         if ($this->fin->greater($i->fin)) {
162             $fin = $i->fin;
163         }
164         $fin->subtract($inicio);
165         return $fin;
166     }
167
168     /**
169      * Corta un intervalo, devolviendo el intervalo previo al punto de corte.
170      * El intervalo actual queda con el intervalo posterior al punto de corte.
171      * El punto de corte puede ser tanto una hora como un intervalo.
172      *
173      * @param mixed $c Donde cortar.
174      *
175      * @return object Intervalo Intervalo anterior al punto de corte.
176      */
177     function cortar($c)
178     {
179         if(is_a($c, 'mecon_tiempo_hora')) {
180             return $this->cortarHora($c);
181         } elseif (is_a($c, 'mecon_tiempo_intervalo')) {
182             return $this->cortarIntervalo($c);
183         } else {
184             return false;
185         }
186     }
187
188     /**
189      * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
190      * El intervalo actual queda con el intervalo posterior a la hora de corte.
191      *
192      * @param mixed $h Donde cortar.
193      *
194      * @return object Intervalo Intervalo anterior a la hora de corte.
195      */
196     function cortarHora($h)
197     {
198         $class = get_class($this);
199         $r = new $class;
200         $r->copy($this);
201         if($this->inicio->greater($h)) {
202             $r->setFin($r->inicio);
203             return $r;
204         }
205         if($this->fin->lowerEqual($h)) {
206             $this->setInicio($this->fin);
207         } else {
208             $this->setInicio($h);
209             $r->setFin($h);
210         }
211         return $r;
212     }
213
214     /**
215      * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
216      * El intervalo actual queda con el intervalo posterior al intervalo de corte.
217      *
218      * @param mixed $i Donde cortar.
219      *
220      * @return object Intervalo Intervalo anterior al intervalo de corte.
221      */
222     function cortarIntervalo($i)
223     {
224         $ant = $this->cortarHora($i->inicio);
225         $this->cortarHora($i->fin);
226         return $ant;
227     }
228
229     function toString() {
230         return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format();
231     }
232
233     function copy($i)
234     {
235         $this->inicio = $i->inicio->__clone();
236         $this->fin    = $i->fin->__clone();
237         return true;
238     }
239
240     function __clone()
241     {
242         $class = get_class($this);
243         $i = new $class;
244         $i->copy($this);
245         return $i;
246     }
247
248 }
249
250 ?>