2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
3 // +--------------------------------------------------------------------+
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 // +--------------------------------------------------------------------+
18 require_once 'Tiempo/Hora.php';
21 * Representa un Intervalo entre 2 horas del mismo dia
25 * @author Gonzalo Merayo <gmeray@mecon.gov.ar>
30 * Hora de inicio del intervalo
38 * Hora de fin del intervalo
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.
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;
68 if($a->lower($this->inicio))
71 $this->fin = $this->inicio;
78 return $this->fin->lower($this->inicio);
81 function setInicio( $inicio ) {
82 if(! is_a($inicio, "hora")) return false;
83 $this->inicio = $inicio;
94 function setFin( $fin )
96 if(! is_a($fin, "hora")) return false;
101 function getDuracion()
104 $c->copy($this->fin);
105 $c->subtract($this->inicio);
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 )
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;
125 function fusionar( $f )
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;
136 function superponer( $i )
138 if(! is_a($i, "intervalo")) return false;
139 $inicio = $this->inicio;
141 if($this->inicio->lower($i->inicio)) $inicio = $i->inicio;
142 if($this->fin->greater( $i->fin )) $fin = $i->fin;
143 $fin->subtract($inicio);
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.
152 * @param mixed $c Donde cortar.
154 * @return object Intervalo Intervalo anterior al punto de corte.
158 if(is_a($c, 'hora')) {
159 return $this->cortarHora($c);
160 } elseif (is_a($c, 'intervalo')) {
161 return $this->cortarIntervalo($c);
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.
171 * @param mixed $h Donde cortar.
173 * @return object Intervalo Intervalo anterior a la hora de corte.
175 function cortarHora($h)
177 if (!is_a($h, 'hora')) return false;
178 $class = get_class($this);
181 if($this->inicio->greater($h)) {
182 $r->setFin($r->inicio);
185 if($this->fin->lowerEqual($h)) {
186 $this->setInicio($this->fin);
188 $this->setInicio($h);
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.
198 * @param mixed $i Donde cortar.
200 * @return object Intervalo Intervalo anterior al intervalo de corte.
202 function cortarIntervalo($i)
204 if (!is_a($i, 'intervalo')) return false;
205 $ant = $this->cortarHora($i->inicio);
206 $this->cortarHora($i->fin);
210 function toString() {
211 return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format();
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());
222 $class = get_class($this);
224 $i->inicio = $this->inicio->__clone();
225 $i->fin = $this->fin->__clone();