]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/Tiempo/Intervalo.php
(no commit message)
[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 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 Intervalo( $inicio = null, $fin = null, $chequear = true ) {
63     if (is_null($inicio)) $inicio = new Hora;
64     if (is_null($fin)) $fin = new Hora;
65     if(!is_a($inicio, 'hora')) return false;
66     if(!is_a($fin,    'hora')) return false;
67     $this->inicio = $inicio;
68     $this->fin    = $fin;
69     if ($chequear) {
70         $this->_chequear();
71     }
72   }
73
74   function _chequear()
75   {
76     $a = $this->fin;
77     if($a->lower($this->inicio))
78     {
79       $tmp = $this->fin;
80       $this->fin = $this->inicio;
81       $this->inicio = $tmp;
82     }
83   }
84
85   function invertido()
86   {
87     return $this->fin->lower($this->inicio);
88   }
89   
90   function setInicio( $inicio ) {
91     if(! is_a($inicio, "hora")) return false;
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     if(! is_a($fin, "hora")) return false;
106     $this->fin = $fin;
107     $this->_chequear();
108   }
109
110   function getDuracion()
111   {
112     $c = new 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)) $intervalos = array($intervalos);
123     foreach ($intervalos as $i) {
124         if (is_a($i, "intervalo")) {
125             if ($i->fin->greaterEqual($this->inicio) &&
126                 $this->fin->greaterEqual($i->inicio)) return true;
127             if ($this->fin->greaterEqual($i->inicio) &&
128                 $i->fin->greaterEqual($this->inicio)) return true;
129         }
130     }
131     return false;
132   }
133
134   function fusionar( $f )
135   {
136     if(! is_a($f, "intervalo")) return false;
137     if(! $this->seSuperpone( $f )) return false;
138     if($f->fin->greater($this->fin))
139       $this->fin = $f->fin;
140     if($f->inicio->lower($this->inicio))
141       $this->inicio = $f->inicio;
142     return true;
143   }
144
145   function superponer( $i )
146   {
147     if(! is_a($i, "intervalo")) return false;
148     $inicio = $this->inicio;
149     $fin = $this->fin;
150     if($this->inicio->lower($i->inicio)) $inicio = $i->inicio;
151     if($this->fin->greater( $i->fin   )) $fin = $i->fin;
152     $fin->subtract($inicio);
153     return $fin;
154   }
155
156   /**
157    * Corta un intervalo, devolviendo el intervalo previo al punto de corte.
158    * El intervalo actual queda con el intervalo posterior al punto de corte.
159    * El punto de corte puede ser tanto una hora como un intervalo.
160    *
161    * @param mixed $c Donde cortar.
162    *
163    * @return object Intervalo Intervalo anterior al punto de corte.
164    */
165   function cortar($c)
166   {
167     if(is_a($c, 'hora')) {
168         return $this->cortarHora($c);
169     } elseif (is_a($c, 'intervalo')) {
170         return $this->cortarIntervalo($c);
171     } else {
172         return false;
173     }
174   }
175
176   /**
177    * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
178    * El intervalo actual queda con el intervalo posterior a la hora de corte.
179    *
180    * @param mixed $h Donde cortar.
181    *
182    * @return object Intervalo Intervalo anterior a la hora de corte.
183    */
184   function cortarHora($h)
185   {
186     if (!is_a($h, 'hora')) return false;
187     $class = get_class($this);
188     $r = new $class;
189     $r->copy($this);
190     if($this->inicio->greater($h)) {
191       $r->setFin($r->inicio);
192       return $r;
193     }
194     if($this->fin->lowerEqual($h)) {
195       $this->setInicio($this->fin);
196     }else{
197       $this->setInicio($h);
198       $r->setFin($h);
199     }
200     return $r;
201   }
202
203   /**
204    * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
205    * El intervalo actual queda con el intervalo posterior al intervalo de corte.
206    *
207    * @param mixed $i Donde cortar.
208    *
209    * @return object Intervalo Intervalo anterior al intervalo de corte.
210    */
211   function cortarIntervalo($i)
212   {
213     if (!is_a($i, 'intervalo')) return false;
214     $ant = $this->cortarHora($i->inicio);
215     $this->cortarHora($i->fin);
216     return $ant;
217   }
218
219     function toString() {
220         return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format();
221     }
222
223     function copy($int = null) {
224         if (!(is_a($int, 'intervalo'))) return false; 
225         $this->inicio = new Hora($int->inicio->get());
226         $this->fin = new Hora($int->fin->get());
227         return true;  
228     }
229
230   function __clone() {
231     $class = get_class($this);
232     $i = new $class;
233     $i->inicio = $this->inicio->__clone();
234     $i->fin    = $this->fin->__clone();
235     return $i;
236   }
237
238 }
239
240 ?>