-<?php
-// vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
-// +--------------------------------------------------------------------+
-// | HORAS EXTRA |
-// +--------------------------------------------------------------------+
-// | Sistema de Horas Extra - Ministerio de Economía - Argentina |
-// +--------------------------------------------------------------------+
-// | Creado: lun abr 22 16:05:33 ART 2002 |
-// | Autor: Gonzalo Merayo <gmeray@mecon.gov.ar> |
-// +--------------------------------------------------------------------+
-//
-// $URL$
-// $Rev$
-// $Date$
-// $Author$
-//
+<?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
+-------------------------------------------------------------------------------
+ Ministerio de Economía
+ meconlib
+-------------------------------------------------------------------------------
+This file is part of meconlib.
+
+meconlib is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your option)
+any later version.
+
+meconlib is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License; if not,
+write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Boston, MA 02111-1307 USA
+-------------------------------------------------------------------------------
+Creado: lun abr 22 16:05:33 ART 2002
+Autor: Gonzalo Merayo <gmeray@mecon.gov.ar>
+-------------------------------------------------------------------------------
+$Id$
+-----------------------------------------------------------------------------*/
require_once 'DB.php'; // FIXME - esto debe volar!!!
require_once 'MECON/Tiempo/Intervalo.php';
* @version $Rev$
* @author Gonzalo Merayo <gmeray@mecon.gov.ar>
*/
-class Banda {
+class MECON_Tiempo_Banda {
- var $intervalos;
+ var $intervalos;
+ var $db;
- function Banda() {
- $this->intervalos = array();
- }
-
- function Cargar($agente, $fecha)
- {
- // FIXME - lo que es base de datos debe VOLAR!!!!!!!
- $dsn = "mysql://intranet:intranet@intranet-db/bandas";
- $db =& DB::connect($dsn , true);
- if(DB::isError($db))
- die($db->getMessage());
+ /**
+ * Constructor.
+ * @param $db Conexión opcional a una base de datos.
+ */
+ function MECON_Tiempo_Banda($db = null)
+ {
+ $this->db = $db;
+ $this->intervalos = array();
+ }
+
+ /**
+ * Funcion que se encarga de cargar los intervalos de tiempo de un agente.
+ * Devuelve true en caso de detectar una inconsistecia de reloj o false en caso contrario
+ *
+ * @param $agente Documento del agente
+ * @param $accesos Array o Date Variable que puede ser un array con todos los accesos
+ * de un agente o un objeto Date que indica la fecha de la banda a procesar
+ * @param $db Conexión opcional a una base de datos.
+ */
+ function cargar($agente, $accesos, $db = null)
+ {
+ if ($db) {
+ $this->db = $db;
+ }
- $funcion = $db->getOne(
- "SELECT E.funcion
- FROM novedades.estado as E, novedades.web003 as S
- WHERE
+ $funcion = $this->db->getOne(
+ "SELECT E.funcion
+ FROM novedades.estado as E, novedades.web003 as S
+ WHERE
E.nrodoc = $agente AND
S.nrodoc = $agente AND
S.codep = E.dependencia"
- );
+ );
- $fecha = $fecha->format("%Y%m%d");
- $query = "SELECT A.tipo_acceso, A.hora
- FROM agentes G, accesos A
- WHERE G.cred = A.cred
- AND G.docu = $agente
- AND A.fecha = $fecha
- AND A.inconsistencia = 0
- ORDER BY A.hora";
- $result = $db->query($query);
- if(DB::isError($result))
- die($result->getMessage());
+ if (is_a($accesos,'date')) {
+ $fecha =& $accesos;
+ $fecha = $fecha->format("%Y%m%d");
+ $query = "SELECT TA.tipo_acceso, A.hora
+ FROM Acceso A, Agente_Credencial AC, Tipo_Acceso TA
+ WHERE AC.credencial = A.credencial
+ AND A.fecha = '$fecha'
+ AND AC.agente = $agente
+ AND TA.puerta = A.puerta
+ AND AC.desde <= '$fecha'
+ AND ( AC.hasta >= '$fecha'
+ OR AC.hasta IS NULL)
+ ORDER BY A.hora";
+ $result = $this->db->query($query);
+ if(DB::isError($result))
+ trigger_error($result->getMessage(), E_USER_ERROR);
- if($funcion != 'SE')
- {//Version tough
- $int == null;
- while( $r = $result->fetchRow() )
- {
- if($r[0] == 'E') $int = new Intervalo(new Hora( $r[1] ), new Hora( $r[1] ));
- if($r[0] == 'S' && $int != null)
- {
- $int->setFin( new Hora( $r[1] ) );
- $this->agregarIntervalo( $int );
- $int = null;
- }
- }
- }
- else
- {
- if($result->numRows() > 0)
- {//Version Light o Serenos
- $int = new Intervalo(new Hora('00:00'), new Hora('00:00'));
- while( $r = $result->fetchRow() )
- {
- if($r[0] == 'E') $int = new Intervalo(new Hora( $r[1] ), new Hora( $r[1] ));
- if($r[0] == 'S' && $int != null)
- {
- $int->setFin( new Hora( $r[1] ) );
- $this->agregarIntervalo( $int );
- $int = null;
- }
+ $inconsistencia = false;
+ if($funcion != 'SE')
+ {//Version tough
+ $int = null;
+ while( $r = $result->fetchRow() )
+ {
+ if($r[0] == 'E')
+ {
+ if($int != null)
+ $inconsistencia = true;
+ $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora( $r[1] ),
+ new Mecon_Tiempo_Hora( $r[1] ));
+ }
+ if($r[0] == 'S')
+ {
+ if($int != null)
+ {
+ $int->setFin( new Mecon_Tiempo_Hora( $r[1] ) );
+ $this->agregarIntervalo( $int );
+ $int = null;
+ }
+ else
+ $inconsistencia = true;
+ }
+ }
+ if($int != null)
+ $inconsistencia = true;
+ }
+ else
+ {
+ if($result->numRows() > 0)
+ {//Version Light o Serenos
+ $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora('00:00'),
+ new Mecon_Tiempo_Hora('00:00'));
+ while( $r = $result->fetchRow() )
+ {
+ if($r[0] == 'E')
+ {
+ // if($int != null)
+ //$inconsistencia = true;
+ $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora( $r[1] ),
+ new Mecon_Tiempo_Hora( $r[1] ));
+ }
+ if($r[0] == 'S')
+ {
+ if($int != null)
+ {
+ $int->setFin( new Mecon_Tiempo_Hora( $r[1] ) );
+ $this->agregarIntervalo( $int );
+ $int = null;
+ }
+ //else
+ // $inconsistencia = true;
+ }
+ }
+ if($int != null)
+ {
+ $int->setFin( new Hora('24:00') );
+ $this->agregarIntervalo( $int );
+ $int = null;
+ }
+ }
+ }
}
- if($int != null)
+ else
{
- $int->setFin( new Hora('24:00') );
- $this->agregarIntervalo( $int );
- $int = null;
- }
- }
+ $inconsistencia = false;
+ if($funcion != 'SE')
+ {//Version tough
+ $int = null;
+ if(!is_null($accesos))
+ {
+ foreach( $accesos as $r )
+ {
+ if($r[0] == 'E')
+ {
+ if($int != null)
+ $inconsistencia = true;
+ $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora( $r[1] ),
+ new Mecon_Tiempo_Hora( $r[1] ));
+ }
+ if($r[0] == 'S')
+ {
+ if($int != null)
+ {
+ $int->setFin( new Mecon_Tiempo_Hora( $r[1] ) );
+ $this->agregarIntervalo( $int );
+ $int = null;
+ }
+ else
+ $inconsistencia = true;
+ }
+ }
+ }
+ if($int != null)
+ $inconsistencia = true;
+ }
+ else
+ {
+ //Version Light o Serenos
+ $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora('00:00'),
+ new Mecon_Tiempo_Hora('00:00'));
+
+ if(!is_null($accesos))
+ {
+ foreach( $accesos as $r )
+ {
+ if($r[0] == 'E')
+ {
+ // if($int != null)
+ //$inconsistencia = true;
+ $int = new Mecon_Tiempo_Intervalo(new Mecon_Tiempo_Hora( $r[1] ),
+ new Mecon_Tiempo_Hora( $r[1] ));
+ }
+ if($r[0] == 'S')
+ {
+ if($int != null)
+ {
+ $int->setFin( new Mecon_Tiempo_Hora( $r[1] ) );
+ $this->agregarIntervalo( $int );
+ $int = null;
+ }
+ //else
+ // $inconsistencia = true;
+ }
+ }
+ }
+ if($int != null)
+ {
+ $int->setFin( new Hora('24:00') );
+ $this->agregarIntervalo( $int );
+ $int = null;
+ }
+ }
+ }
+ return $inconsistencia;
}
- }
- /*
- *
- * Completa las salidas del medio del dia.
- *
- */
- function CompletarSalidas()
- {
- if(count($this->intervalos) > 0)
+ /**
+ * Completa las salidas del medio del dia.
+ *
+ */
+ function CompletarSalidas()
{
- $p = reset($this->intervalos);
- $u = end($this->intervalos);
- $p->setFin($u->fin);
- $this->intervalos = array($p);
+ if(count($this->intervalos) > 0) {
+ $p = reset($this->intervalos);
+ $u = end($this->intervalos);
+ $p->setFin($u->fin);
+ $this->intervalos = array($p);
+ }
}
- }
- /**
- * Agrega un intervalo a la banda
- * Chequeando superposiciones y en orden
- *
- * @param Intervalo $intervalo Intervalo a agregar.
- */
- function agregarIntervalo($intervalo)
- {
- if(! is_a($intervalo, "intervalo")) return false;
- if ($intervalo->invertido()) {
- $intervalo->_chequear();
- $this->agregarIntervalo(new Intervalo(new Hora('00:00'), new Hora ('24:00')));
- $this->sacarIntervalo($intervalo);
- return true;
- }
- $n_intervalos = array();
- $insertado = false;
- // recorre el vector de intervalos
- foreach( $this->intervalos as $i )
+ /**
+ * Agrega un intervalo a la banda
+ * Chequeando superposiciones y en orden
+ *
+ * @param Intervalo $intervalo Intervalo a agregar.
+ */
+ function agregarIntervalo($intervalo)
{
- // si se superpone con alguno, fusionar con ese
- if($i->seSuperpone($intervalo))
- $intervalo->fusionar($i);
- else{
- if($i->inicio->greater($intervalo->inicio) && ! $insertado)
- {
- array_push($n_intervalos, $intervalo);
- $insertado = true;
+ if ($intervalo->invertido()) {
+ $intervalo->_chequear();
+ $this->agregarIntervalo(new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora('00:00'), new MECON_Tiempo_Hora ('24:00')));
+ $this->sacarIntervalo($intervalo);
+ return true;
+ }
+ $n_intervalos = array();
+ $insertado = false;
+ // recorre el vector de intervalos
+ foreach( $this->intervalos as $i ) {
+ // si se superpone con alguno, fusionar con ese
+ if($i->seSuperpone($intervalo) || $i->esAdyacente($intervalo)) {
+ $intervalo->fusionar($i);
+ } else {
+ if($i->inicio->greater($intervalo->inicio) && ! $insertado) {
+ array_push($n_intervalos, $intervalo);
+ $insertado = true;
+ }
+ array_push($n_intervalos, $i);
+ }
}
- array_push($n_intervalos, $i);
- }
+ if(! $insertado )
+ array_push($n_intervalos,$intervalo);
+ $this->intervalos = $n_intervalos;
+ return true;
}
- if(! $insertado ) array_push($n_intervalos,$intervalo);
- $this->intervalos = $n_intervalos;
- return true;
- }
-
- /**
- * Saca
- *
- *
- */
- function sacarBanda($banda)
- {
- foreach($banda->intervalos as $i)
- $this->sacarIntervalo($i);
- }
- /**
- * Saca un intervalo de una banda horaria.
- *
- */
- function sacarIntervalo($intervalo)
- {
- if(! is_a($intervalo, "intervalo")) return false;
- // Si el intervalo está vacío, no hace nada.
- $dur = $intervalo->getDuracion();
- if ($dur->isEmpty()) {
- return true;
+ /**
+ * Saca.
+ */
+ function sacarBanda($banda)
+ {
+ foreach($banda->intervalos as $i)
+ $this->sacarIntervalo($i);
}
- $n_intervalos = array();
- // recorre el vector de intervalos
- foreach( $this->intervalos as $i )
+
+ /**
+ * Saca un intervalo de una banda horaria.
+ */
+ function sacarIntervalo($intervalo)
{
- if($i->seSuperpone($intervalo)) {
- $a = $i->cortar($intervalo);
- $d = $a->getDuracion();
- if($d->toSeconds() > 0) {
- $n_intervalos[] = $a;
+ // Si el intervalo está vacío, no hace nada.
+ $dur = $intervalo->getDuracion();
+ if ($dur->isEmpty()) {
+ return true;
}
- $d = $i->getDuracion();
- if($d->toSeconds() > 0) {
- $n_intervalos[] = $i;
+ $n_intervalos = array();
+ // recorre el vector de intervalos
+ foreach( $this->intervalos as $i ) {
+ if($i->seSuperpone($intervalo)) {
+ $a = $i->cortar($intervalo);
+ $d = $a->getDuracion();
+ if($d->toSeconds() > 0) {
+ $n_intervalos[] = $a;
+ }
+ $d = $i->getDuracion();
+ if($d->toSeconds() > 0) {
+ $n_intervalos[] = $i;
+ }
+ } else {
+ $n_intervalos[] = $i;
+ }
}
- } else {
- $n_intervalos[] = $i;
- }
+ $this->intervalos = $n_intervalos;
+ return true;
+
}
- $this->intervalos = $n_intervalos;
- return true;
-
- }
- function sacarTiempo($t)
- {
- if(! is_a($t, "date_span")) return false;
- $n_int = array();
- while(count($this->intervalos) > 0)
+ /**
+ * Saca.
+ */
+ function sacarTiempo($t)
{
- $int = array_shift($this->intervalos);
- if($t->toSeconds() > 0){
- $d = $int->getDuracion();
- if($d->greater($t))
- {
- #con cortar alcanza
- $ini = new Hora();
- $ini->copy($int->inicio);
- $ini->add($t);
- /*TODO guardar este tiempo como rechazado*/$int->cortar($ini);
- $t->setFromSeconds(0);
- }else{
- #con cortar no alcanza y hay que sacar...
- $t->subtract($int->getDuracion());
- /*TODO guardar int como rechazado*/
+ $n_int = array();
+ while(count($this->intervalos) > 0) {
+ $int = array_shift($this->intervalos);
+ if($t->toSeconds() > 0) {
+ $d = $int->getDuracion();
+ if($d->greater($t)) {
+#con cortar alcanza
+ $ini = new MECON_Tiempo_Hora();
+ $ini->copy($int->inicio);
+ $ini->add($t);
+ /*TODO guardar este tiempo como rechazado*/
+ $int->cortar($ini);
+ $t->setFromSeconds(0);
+ } else {
+#con cortar no alcanza y hay que sacar...
+ $t->subtract($int->getDuracion());
+ /*TODO guardar int como rechazado*/
+ }
+ }
+ $n_int[] = $int;
}
- }
- $n_int[] = $int;
+ $this->intervalos = $n_int;
}
- $this->intervalos = $n_int;
- }
- /*
- * Chequea si el intervalo pedido esta cubierto por la banda, si faltan
- * horas en la banta se retorna el tiempo que falta
- *
- * @return Date_Span el periodo faltante
- *
- */
- function chequearIntervalo($intervalo)
- {
- if(! is_a($intervalo, "intervalo")) return false;
- $t = new Hora();
- foreach ($this->intervalos as $i)
- $t->add($i->superponer($intervalo));
- $d = $intervalo->getDuracion();
- $d->subtract($t);
- return $d;
- }
+ /**
+ * Chequea si el intervalo pedido esta cubierto por la banda, si faltan
+ * horas en la banta se retorna el tiempo que falta
+ *
+ * @return Date_Span el periodo faltante
+ */
+ function chequearIntervalo($intervalo)
+ {
+ $t = new MECON_Tiempo_Hora();
+ foreach ($this->intervalos as $i)
+ $t->add($i->superponer($intervalo));
+ $d = $intervalo->getDuracion();
+ $d->subtract($t);
+ return $d;
+ }
- /*
- * Chequea si la banda(parametro) esta cubierto por la banda(this),
- * si faltan horas en la banda(this) para llegar a banda(parametro)
- * se retorna el tiempo que falta
- *
- * @return Date_Span el periodo faltante
- *
- */
- function chequearBanda($banda)
- {
- if(! is_a($banda, "banda")) return false;
- $f = new Hora();
- foreach ($banda->intervalos as $i)
- $f->add($this->chequearIntervalo($i));
- return $f;
- }
+ /**
+ * Chequea si la banda(parametro) esta cubierto por la banda(this),
+ * si faltan horas en la banda(this) para llegar a banda(parametro)
+ * se retorna el tiempo que falta
+ *
+ * @return Date_Span el periodo faltante
+ */
+ function chequearBanda($banda)
+ {
+ $f = new MECON_Tiempo_Hora();
+ foreach ($banda->intervalos as $i)
+ $f->add($this->chequearIntervalo($i));
+ return $f;
+ }
- /*
- * Devuelve una representacion del objeto como un string.
- *
- * @return string Representacion del objeto.
- *
- */
- function toString()
- {
- $s = '';
- $t = count($this->intervalos);
- for ($n = 0; $n < ($t - 1); $n++) {
- $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . '] | ';
+ /**
+ * Devuelve una representacion del objeto como un string.
+ *
+ * @return string Representacion del objeto.
+ */
+ function toString()
+ {
+ $s = '';
+ $t = count($this->intervalos);
+ for ($n = 0; $n < ($t - 1); $n++) {
+ $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . '] | ';
+ }
+ $n = $t - 1;
+ if ($n != -1) {
+ $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . ']';
+ }
+ return $s;
}
- $n = $t - 1;
- if ($n != -1) {
- $s .= "intervalo $n: [" . $this->intervalos[$n]->toString() . ']';
+
+ function getIntervalos()
+ {
+ return $this->intervalos;
}
- return $s;
- }
- function getIntervalos() {
- return $this->intervalos;
- }
+ /**
+ * Corta una banda, devolviendo la banda previa al punto de corte.
+ *
+ * La banda actual queda con los intervalos posteriores al punto de corte
+ * y se devuelve la banda con los intervalos anteriores.
+ * El punto de corte puede ser tanto una hora como un intervalo.
+ *
+ * @param mixed $c Donde cortar.
+ *
+ * @return object Banda Bnada anterior al punto de corte.
+ */
+ function cortar($c)
+ {
+ $b = $this->__clone();
+ $b->intervalos = array();
+ $intervalos = array();
+ foreach ($this->intervalos as $i) {
+ $a = $i->cortar($c);
+ $da = $a->getDuracion();
+ if (!$da->isEmpty()) {
+ $b->agregarIntervalo($a);
+ }
+ $di = $i->getDuracion();
+ if (!$di->isEmpty()) {
+ $intervalos[] = $i;
+ }
+ }
+ $this->intervalos = $intervalos;
+ return $b;
+ }
- /**
- * Corta una banda, devolviendo la banda previa al punto de corte.
- *
- * La banda actual queda con los intervalos posteriores al punto de corte
- * y se devuelve la banda con los intervalos anteriores.
- * El punto de corte puede ser tanto una hora como un intervalo.
- *
- * @param mixed $c Donde cortar.
- *
- * @return object Banda Bnada anterior al punto de corte.
- */
- function cortar($c)
- {
- if(!is_a($c, 'hora') and !is_a($c, 'intervalo')) return false;
- $b = $this->__clone();
- $b->intervalos = array();
- $intervalos = array();
- foreach ($this->intervalos as $i) {
- $a = $i->cortar($c);
- $da = $a->getDuracion();
- if (!$da->isEmpty()) {
- $b->agregarIntervalo($a);
- }
- $di = $i->getDuracion();
- if (!$di->isEmpty()) {
- $intervalos[] = $i;
- }
+ /**
+ * Devuelve el timpo total que contiene la banda.
+ *
+ * @return object Date_Span Tiempo total.
+ */
+ function total()
+ {
+ $t = new Date_Span;
+ foreach ($this->intervalos as $i) {
+ $t->add($i->getDuracion());
+ }
+ return $t;
}
- $this->intervalos = $intervalos;
- return $b;
- }
- /**
- * Devuelve el timpo total que contiene la banda.
- *
- * @return object Date_Span Tiempo total.
- */
- function total() {
- $t = new Date_Span;
- foreach ($this->intervalos as $i) {
- $t->add($i->getDuracion());
+ /**
+ * Alias de Banda::total() para compatibilidad con Intervalo.
+ *
+ * @return object Date_Span Tiempo total.
+ */
+ function getDuracion()
+ {
+ return $this->total();
}
- return $t;
- }
- /**
- * Alias de Banda::total() para compatibilidad con Intervalo.
- *
- * @return object Date_Span Tiempo total.
- */
- function getDuracion() {
- return $this->total();
- }
+ /**
+ * Chequea si el período pasado como argumento se superpone con la banda.
+ * @param $periodo Puede ser un MECON_Tiempo_Intervalo o MECON_Tiempo_Banda.
+ * @return true si se superpone, false si no.
+ */
+ function seSuperpone($periodo)
+ {
+ $intervalos = array($periodo);
+ if (is_a($periodo, 'mecon_tiempo_banda')) {
+ $intervalos = $periodo->intervalos;
+ }
+ foreach ($intervalos as $i) {
+ if ($i->seSuperpone($this->intervalos)) {
+ return true;
+ }
+ }
+ return false;
+ }
- /**
- * Resetea la banda.
- */
- function flush() {
- $this->intervalos = array();
- }
+ /**
+ * Resetea la banda.
+ */
+ function flush()
+ {
+ $this->intervalos = array();
+ }
- function copy($b) {
- $this->flush();
- foreach ($b->intervalos as $i) {
- $this->intervalos[] = $i->__clone();
+ function copy($b)
+ {
+ $this->flush();
+ foreach ($b->intervalos as $i) {
+ $this->intervalos[] = $i->__clone();
+ }
}
- }
- function __clone() {
- $class = get_class($this);
- $b = new $class;
- $b->copy($this);
- return $b;
- }
+ function __clone()
+ {
+ $class = get_class($this);
+ $b = new $class;
+ $b->copy($this);
+ return $b;
+ }
}
-// $Id$
?>