class MECON_Tiempo_Banda {
var $intervalos;
+ var $db;
- function MECON_Tiempo_Banda() {
+ /**
+ * Constructor.
+ * @param $db Conexión opcional a una base de datos.
+ */
+ function MECON_Tiempo_Banda($db = null)
+ {
+ $this->db = $db;
$this->intervalos = array();
}
- function Cargar($agente, $fecha) {
- // FIXME - lo que es base de datos debe VOLAR!!!!!!!
- $dsn = "mysql://intranet:intranet@intranet-db.mecon.ar/bandas";
- $db =& DB::connect($dsn , true);
- if(DB::isError($db))
- die($db->getMessage());
+ /**
+ * 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
- E.nrodoc = $agente AND
- S.nrodoc = $agente AND
- S.codep = E.dependencia"
- );
+ $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 MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora( $r[1] ), new MECON_Tiempo_Hora( $r[1] ));
- if($r[0] == 'S' && $int != null) {
- $int->setFin( new MECON_Tiempo_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')
- $int = new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora( $r[1] ), new MECON_Tiempo_Hora( $r[1] ));
- if($r[0] == 'S' && $int != null) {
- $int->setFin( new MECON_Tiempo_Hora( $r[1] ) );
+ 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) {
- $int->setFin( new MECON_Tiempo_Hora('24:00') );
+ }
+ }
+ else
+ {
+ $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() {
+ /**
+ * Completa las salidas del medio del dia.
+ *
+ */
+ function CompletarSalidas()
+ {
if(count($this->intervalos) > 0) {
$p = reset($this->intervalos);
$u = end($this->intervalos);
/**
- * Agrega un intervalo a la banda
- * Chequeando superposiciones y en orden
- *
- * @param Intervalo $intervalo Intervalo a agregar.
- */
- function agregarIntervalo($intervalo) {
- if(! is_a($intervalo, "mecon_tiempo_intervalo"))
- return false;
+ * Agrega un intervalo a la banda
+ * Chequeando superposiciones y en orden
+ *
+ * @param Intervalo $intervalo Intervalo a agregar.
+ */
+ function agregarIntervalo($intervalo)
+ {
if ($intervalo->invertido()) {
$intervalo->_chequear();
$this->agregarIntervalo(new MECON_Tiempo_Intervalo(new MECON_Tiempo_Hora('00:00'), new MECON_Tiempo_Hora ('24:00')));
// recorre el vector de intervalos
foreach( $this->intervalos as $i ) {
// si se superpone con alguno, fusionar con ese
- if($i->seSuperpone($intervalo))
+ if($i->seSuperpone($intervalo) || $i->esAdyacente($intervalo)) {
$intervalo->fusionar($i);
- else {
+ } else {
if($i->inicio->greater($intervalo->inicio) && ! $insertado) {
array_push($n_intervalos, $intervalo);
$insertado = true;
}
/**
- * Saca
- *
- *
- */
- function sacarBanda($banda) {
+ * Saca.
+ */
+ function sacarBanda($banda)
+ {
foreach($banda->intervalos as $i)
- $this->sacarIntervalo($i);
+ $this->sacarIntervalo($i);
}
/**
- * Saca un intervalo de una banda horaria.
- *
- */
- function sacarIntervalo($intervalo) {
- if(! is_a($intervalo, "mecon_tiempo_intervalo"))
- return false;
+ * Saca un intervalo de una banda horaria.
+ */
+ function sacarIntervalo($intervalo)
+ {
// Si el intervalo está vacío, no hace nada.
$dur = $intervalo->getDuracion();
if ($dur->isEmpty()) {
}
- function sacarTiempo($t) {
- if(! is_a($t, "date_span"))
- return false;
+ /**
+ * Saca.
+ */
+ function sacarTiempo($t)
+ {
$n_int = array();
while(count($this->intervalos) > 0) {
$int = array_shift($this->intervalos);
#con cortar alcanza
$ini = new MECON_Tiempo_Hora();
$ini->copy($int->inicio);
- $ini->add
- ($t);
+ $ini->add($t);
/*TODO guardar este tiempo como rechazado*/
$int->cortar($ini);
$t->setFromSeconds(0);
$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, "mecon_tiempo_intervalo"))
- return false;
+ /**
+ * 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));
+ $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, "mecon_tiempo_banda"))
- return false;
+ /**
+ * 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));
+ $f->add($this->chequearIntervalo($i));
return $f;
}
- /*
- * Devuelve una representacion del objeto como un string.
- *
- * @return string Representacion del objeto.
- *
- */
- function 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++) {
return $s;
}
- function getIntervalos() {
+ function getIntervalos()
+ {
return $this->intervalos;
}
*
* @return object Banda Bnada anterior al punto de corte.
*/
- function cortar($c) {
- if(!is_a($c, 'mecon_tiempo_hora') and !is_a($c, 'mecon_tiempo_intervalo'))
- return false;
+ function cortar($c)
+ {
$b = $this->__clone();
$b->intervalos = array();
$intervalos = array();
*
* @return object Date_Span Tiempo total.
*/
- function total() {
+ function total()
+ {
$t = new Date_Span;
foreach ($this->intervalos as $i) {
- $t->add
- ($i->getDuracion());
+ $t->add($i->getDuracion());
}
return $t;
}
*
* @return object Date_Span Tiempo total.
*/
- function getDuracion() {
+ 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() {
+ function flush()
+ {
$this->intervalos = array();
}
- function copy($b) {
+ function copy($b)
+ {
$this->flush();
foreach ($b->intervalos as $i) {
$this->intervalos[] = $i->__clone();
}
}
- function __clone() {
+ function __clone()
+ {
$class = get_class($this);
$b = new $class;
$b->copy($this);