]> git.llucax.com Git - mecon/meconlib.git/blob - lib/Tiempo/Intervalo.php
c02c49e921e3ff2bc97b5a4665460e8ad8ec1635
[mecon/meconlib.git] / lib / Tiempo / Intervalo.php
1 <?php
2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
3 // +--------------------------------------------------------------------+
4 // |                          HORAS EXTRA                               |
5 // +--------------------------------------------------------------------+
6 // |    Sistema de Horas Extra - Ministerio de Economía - Argentina     |
7 // +--------------------------------------------------------------------+
8 // | Creado: lun abr 22 16:05:33 ART 2002                               |
9 // | Autor:  Gonzalo Merayo <gmeray@mecon.gov.ar>                    |
10 // +--------------------------------------------------------------------+
11 //
12 // $URL$
13 // $Rev$
14 // $Date$
15 // $Author$
16 //
17
18 require_once 'HE/Hora.php';
19
20 /**
21  * Representa un Intervalo entre 2 horas del mismo dia
22  *
23  * @package HE
24  * @version $Rev$
25  * @author  Gonzalo Merayo <gmeray@mecon.gov.ar>
26  */
27 class Intervalo {
28   /**
29    *
30    * Hora de inicio del intervalo
31    *
32    * @var object Hora
33    */
34   var $inicio;    
35   
36   /**
37    *
38    * Hora de fin del intervalo
39    *
40    * @var object Hora
41    */
42   var $fin;
43
44   /**
45    * Constructor.
46    *
47    * @param Hora $inicio   Hora de inicio (por defecto cero).
48    * @param Hora $fin      Hora de fin (por defecto cero).
49    * @param bool $chequear Invierte el intervalo si la hora de
50    *                       fin es anterior a la de inicio.
51    *                       
52    */
53   function Intervalo( $inicio = null, $fin = null, $chequear = true ) {
54     if (is_null($inicio)) $inicio = new Hora;
55     if (is_null($fin)) $fin = new Hora;
56     if(!is_a($inicio, 'hora')) return false;
57     if(!is_a($fin,    'hora')) return false;
58     $this->inicio = $inicio;
59     $this->fin    = $fin;
60     if ($chequear) {
61         $this->_chequear();
62     }
63   }
64
65   function _chequear()
66   {
67     $a = $this->fin;
68     if($a->lower($this->inicio))
69     {
70       $tmp = $this->fin;
71       $this->fin = $this->inicio;
72       $this->inicio = $tmp;
73     }
74   }
75
76   function invertido()
77   {
78     return $this->fin->lower($this->inicio);
79   }
80   
81   function setInicio( $inicio ) {
82     if(! is_a($inicio, "hora")) return false;
83     $this->inicio = $inicio;
84     $this->_chequear();
85   }
86
87   /**
88    *
89    * setFin
90    *
91    * @param var $fin
92    *
93    */
94   function setFin( $fin )
95   {
96     if(! is_a($fin, "hora")) return false;
97     $this->fin = $fin;
98     $this->_chequear();
99   }
100
101   function getDuracion()
102   {
103     $c = new Hora;
104     $c->copy($this->fin);
105     $c->subtract($this->inicio);
106     return $c;
107   }
108
109   // XXX - Amplié el método para comparar con varios intervalos a la vez,
110   // si el argumento no es un array, anda de todas maneras.
111   function seSuperpone( $intervalos )
112   {
113     if (!is_array($intervalos)) $intervalos = array($intervalos);
114     foreach ($intervalos as $i) {
115         if (is_a($i, "intervalo")) {
116             if ($i->fin->greaterEqual($this->inicio) &&
117                 $this->fin->greaterEqual($i->inicio)) return true;
118             if ($this->fin->greaterEqual($i->inicio) &&
119                 $i->fin->greaterEqual($this->inicio)) return true;
120         }
121     }
122     return false;
123   }
124
125   function fusionar( $f )
126   {
127     if(! is_a($f, "intervalo")) return false;
128     if(! $this->seSuperpone( $f )) return false;
129     if($f->fin->greater($this->fin))
130       $this->fin = $f->fin;
131     if($f->inicio->lower($this->inicio))
132       $this->inicio = $f->inicio;
133     return true;
134   }
135
136   function superponer( $i )
137   {
138     if(! is_a($i, "intervalo")) return false;
139     $inicio = $this->inicio;
140     $fin = $this->fin;
141     if($this->inicio->lower($i->inicio)) $inicio = $i->inicio;
142     if($this->fin->greater( $i->fin   )) $fin = $i->fin;
143     $fin->subtract($inicio);
144     return $fin;
145   }
146
147   /**
148    * Corta un intervalo, devolviendo el intervalo previo al punto de corte.
149    * El intervalo actual queda con el intervalo posterior al punto de corte.
150    * El punto de corte puede ser tanto una hora como un intervalo.
151    *
152    * @param mixed $c Donde cortar.
153    *
154    * @return object Intervalo Intervalo anterior al punto de corte.
155    */
156   function cortar($c)
157   {
158     if(is_a($c, 'hora')) {
159         return $this->cortarHora($c);
160     } elseif (is_a($c, 'intervalo')) {
161         return $this->cortarIntervalo($c);
162     } else {
163         return false;
164     }
165   }
166
167   /**
168    * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
169    * El intervalo actual queda con el intervalo posterior a la hora de corte.
170    *
171    * @param mixed $h Donde cortar.
172    *
173    * @return object Intervalo Intervalo anterior a la hora de corte.
174    */
175   function cortarHora($h)
176   {
177     if (!is_a($h, 'hora')) return false;
178     $class = get_class($this);
179     $r = new $class;
180     $r->copy($this);
181     if($this->inicio->greater($h)) {
182       $r->setFin($r->inicio);
183       return $r;
184     }
185     if($this->fin->lowerEqual($h)) {
186       $this->setInicio($this->fin);
187     }else{
188       $this->setInicio($h);
189       $r->setFin($h);
190     }
191     return $r;
192   }
193
194   /**
195    * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
196    * El intervalo actual queda con el intervalo posterior al intervalo de corte.
197    *
198    * @param mixed $i Donde cortar.
199    *
200    * @return object Intervalo Intervalo anterior al intervalo de corte.
201    */
202   function cortarIntervalo($i)
203   {
204     if (!is_a($i, 'intervalo')) return false;
205     $ant = $this->cortarHora($i->inicio);
206     $this->cortarHora($i->fin);
207     return $ant;
208   }
209
210     function toString() {
211         return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format();
212     }
213
214     function copy($int = null) {
215         if (!(is_a($int, 'intervalo'))) return false; 
216         $this->inicio = new Hora($int->inicio->get());
217         $this->fin = new Hora($int->fin->get());
218         return true;  
219     }
220
221   function __clone() {
222     $class = get_class($this);
223     $i = new $class;
224     $i->inicio = $this->inicio->__clone();
225     $i->fin    = $this->fin->__clone();
226     return $i;
227   }
228
229 }
230
231 // $Id$
232 ?>