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