// +----------------------------------------------------------------------+ // // $Id$ // $Author$ // $URL$ // $Date$ // $Rev$ // require_once 'PEAR.php'; require_once 'SAMURAI/DB.php'; require_once 'Date.php'; /** * Clase para el manejo de los sistemas. * * @access public */ class SAMURAI_Sistema { /** * Identificador del sistema. * * @var int $id * @access protected */ var $_id = null; /** * Nombre del sistema. * * @var string $nombre * @access protected */ var $_nombre = null; /** * Descripcion del sistema. * * @var string $descripcion * @access protected */ var $_descripcion = null; /** * Fecha en la cual se inicio el sistema. * * @var date $fecha_inicio * @access protected */ var $_fecha_inicio = null; /** * Fecha en la cual se dio por terminado el desarrollo del sistema. * * @var date $fecha_fin * @access protected */ var $_fecha_fin = null; /** * Fecha de implementacion del sistema. * * @var date $fecha_implementacion * @access protected */ var $_fecha_implementacion = null; /** * Texto con los datos del o de los contacto/s en el area usuario. * * @var string $contacto * @access protected */ var $_contacto = null; /** * Objeto Samurai_DB * * @var SAMURAI_DB $db * @access protected */ var $_db; /** * Login del responsable de los ultimos cambios del sistema. * * @var string $responsable * @access protected */ var $_responsable = null; /** * Array asociativo (id - descripcion) con los permisos asociados al sistema. * * @var array $permisos * @access protected */ var $_permisos = null; /** * Array con los permisos asociados al sistema * * @var array $asociaciones * @access protected */ var $_asociaciones = null; /** * indica si el sistema esta activo o no. * * @var int $estado * @access protected */ var $_estado = 1; /** * Gets Asociaciones. * * @return array * @access public */ function getAsociaciones() { return $this->_asociaciones; } /** * Sets Asociaciones. * * @param array $asociaciones Asociaciones. * * @return void * @access public */ function setAsociaciones($asociaciones) { $this->_asociaciones = $asociaciones; } /** * Gets Estado. * * @return int * @access public */ function getEstado() { return $this->_estado; } /** * Sets Estado. * * @param int $estado Estado. * * @return void * @access public */ function setEstado($estado) { $this->_estado = $estado; } /** * Constructor. Si recibe como parametro el identificador busca en la DB los datos. * * @param SAMURAI_DB &$db Objeto Conexion * @param int $id Identificador del sistema * * @return void * @access public */ function SAMURAI_Sistema(&$db, $id = null) { $this->_db =& $db; $this->_id = $id; if (!is_null($id)) { $this->_obtenerDatosDb(); } } /** * Devuelve el identificador del sistema. * * @return int * @access public */ function getId() { return $this->_id; } /** * Devuelve el nombre del sistema. * * @return string * @access public */ function getNombre() { return $this->_nombre; } /** * Devuelve la descrpcion del sistema. * * @return string * @access public */ function getDescripcion() { return $this->_descripcion; } /** * Devuelve la fecha de inicio del sistema. * * @return &date * @access public */ function &getFechaInicio() { if ($this->_fecha_inicio) { return new Date ($this->_fecha_inicio.' 00:00:00'); } else { return null; } } /** * Devuelve la fecha de finalizacion del sistema. * * @return &date * @access public */ function &getFechaFin() { if ($this->_fecha_fin) { return new Date ($this->_fecha_fin.' 00:00:00'); } else { return null; } } /** * Devuelve la fecha de implementacion del sistema. * * @return &date * @access public */ function &getFechaImplementacion() { if ($this->_fecha_implementacion) { return new Date ($this->_fecha_implementacion.' 00:00:00'); } else { return null; } } /** * Devuelve el contacto del sistema. * * @return string * @access public */ function getContacto() { return $this->_contacto; } /** * Setea el nombre del sistema. * * @param string $nombre Nombre del sistema. * * @return void * @access public */ function setNombre($nombre = null) { $this->_nombre = $nombre; } /** * Setea la descripcion del sistema. * * @param string $descripcion Descripcion del sistema. * * @return void * @access public */ function setDescripcion($descripcion = null) { $this->_descripcion = $descripcion; } /** * Setea la fecha de inicio del sistema. * * @param date $fecha Fecha de inicio del sistema * * @return void * @access public */ function setFechaInicio($fecha = null) { if ($fecha && $fecha != '0000-00-00') { $this->_fecha_inicio = $fecha; } else { $this->_fecha_inicio = null; } } /** * Setea la fecha de finalizacion del sistema. * * @param date $fecha Fecha de finalizacion del sistema. * * @return void * @access public */ function setFechaFin($fecha = null) { if ($fecha && $fecha != '0000-00-00') { $this->_fecha_fin = $fecha; } else { $this->_fecha_fin = null; } } /** * Setea la fecha de implementacion del sistema. * * @param date $fecha Fecha de implementacion del sistema. * * @return void * @access public */ function setFechaImplementacion($fecha = null) { if ($fecha && $fecha != '0000-00-00') { $this->_fecha_implementacion = $fecha; } else { $this->_fecha_implementacion = null; } } /** * Setea el contacto del sistema. * * @param string $contacto Texto con la informacion del contacto. * * @return void * @access public */ function setContacto($contacto = null) { $this->_contacto = $contacto; } /** * Obtiene los datos del sistema de la DB. * * @return void * @access protected */ function _obtenerDatosDb() { $sql = parse_ini_file(dirname(__FILE__) . '/Sistema/consultas.ini', true); $tmp = $sql['obtener_datos_sistema'].$sql['obtener_datos_sistema2']; $dbh = $this->_db->prepare($tmp); $tmp = array ($this->getId()); $res = $this->_db->execute($dbh,$tmp); if ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) { if (isset($re['nombre_sistema'])) { $this->setNombre($re['nombre_sistema']); } if (isset($re['desc_sistema'])) { $this->setDescripcion($re['desc_sistema']); } if (isset($re['fecha_inicio'])) { $this->setFechaInicio($re['fecha_inicio']); } if (isset($re['fecha_fin'])) { $this->setFechaFin($re['fecha_fin']); } if (isset($re['fecha_implementacion'])) { $this->setFechaImplementacion($re['fecha_implementacion']); } if (isset($re['contacto'])) { $this->setContacto($re['contacto']); } if (isset($re['responsable'])) { $this->setResponsable($re['responsable']); } if (isset($re['estado'])) { $this->setEstado($re['estado']); } } $tmp = $sql['obtener_permisos']; $tmp.= $sql['borrar_permisos2']; $dbh = $this->_db->prepare($tmp); $tmp = array ($this->getId(),''); $res = $this->_db->execute($dbh,$tmp); $tmp = array(); $i = 0; while ($re = $res->fetchRow(DB_FETCHMODE_ORDERED)) { $tmp[] = $re['0']; $i++; } $this->_permisos = $tmp; $tmp = $sql['obtener_permisos']; $tmp.= $sql['obtener_permisos2']; $dbh = $this->_db->prepare($tmp); $tmp = array ($this->getId()); $res = $this->_db->execute($dbh,$tmp); $tmp = array(); $i = 0; while ($re = $res->fetchRow(DB_FETCHMODE_ORDERED)) { $tmp[$i]['id'] = $re['0']; $tmp[$i]['obs'] = $re['1']; $tmp[$i]['desc'] = $re['2']; $i++; } $this->_asociaciones = $tmp; } /** * Guarda la informacion del sistema en la base. * * @param string $accion Accion a realizar. Grabar, modificar o eliminar * * @return void * @access public */ function guardarDatos($accion = 'grabar') { $accion = strtolower($accion); switch ($accion) { case 'grabar': $res = $this->_grabarDb(); break; case 'modificar': $res = $this->_modificarDb(); break; case 'eliminar': $res = $this->_borrarDb(); break; } return $res; } /** * Devuelve el login del responsable de los ultimos cambios * * @return string * @access public */ function getResponsable() { return $this->_responsable; } /** * Setea el login del responsable de los ultimos cambios del sistema * * @param string $responsable String con el login del responsable del cambio * * @return void * @access public */ function setResponsable($responsable = null) { $this->_responsable = $responsable; } /** * Devuelve un array asociativo con los identificadores de los permisos * * @return array * @access public */ function getIdPermisos() { return $this->_permisos; } /** * Setea los permisos de un sistema * * @param int $permisos Array asociativo con los permisos * * @return void * @access public */ function setPermisos($permisos = null) { $this->_permisos = $permisos; } /** * @return int * @access public */ function getMaxIdSistema() { $sql = parse_ini_file(dirname(__FILE__) . '/Sistema/consultas.ini', true); $dbh = $this->_db->prepare($sql['obtener_max_id_sistemas']); $res = $this->_db->execute($dbh); $re = $res->fetchrow(DB_FETCHMODE_ASSOC); $res->free(); return $re['id_sistema']; } /** * Graba los datos en la Base de Datos * * @return void * @access protected */ function _grabarDb() { $idSistema = $this->_db->nextId('sistema'); $fecha_inicio = $this->getFechaInicio(); $fecha_fin = $this->getFechaFin(); $fecha_implementacion = $this->getFechaImplementacion(); //USO SECUENCIAS Y AUTOEXECUTE //Grabo el sistema $datos = array( 'id_sistema' => $idSistema, 'nombre_sistema' => $this->getNombre(), 'desc_sistema' => $this->getDescripcion(), 'fecha_inicio' => $fecha_inicio ? $fecha_inicio->format("%Y-%m-%d") : null, 'fecha_fin' => $fecha_fin ? $fecha_fin->format("%Y-%m-%d") : null, 'fecha_implementacion' => $fecha_implementacion ? $fecha_implementacion->format("%Y-%m-%d") : null, 'contacto' => $this->getContacto(), 'responsable' => $this->getResponsable(), 'estado' => $this->getEstado() ); $res = $this->_db->autoExecute('samurai.sistema', $datos, DB_AUTOQUERY_INSERT); if (PEAR::isError($res)) { return $res; } //Grabo los permisos $res = $this->_grabarPermisosDb($idSistema); if (PEAR::isError($res)) { return $res; } $this->_id = $idSistema; } /** * Borra los datos de la base de datos * * @return void * @access protected */ function _borrarDb() { $idSistema = $this->getId(); $responsable = $this->getResponsable(); //Cambio el estado al sistema $datos = array( 'responsable' => $responsable, 'estado' => 0 ); $res = $this->_db->autoExecute('samurai.sistema', $datos, DB_AUTOQUERY_UPDATE, 'id_sistema = '.$idSistema); if (PEAR::isError($res)) { return $res; } if ($idSistema == @$_SESSION['samurai']['id_sistema']){ $_SESSION['samurai']['id_sistema'] = ''; } } /** * Modifica los datos en base * * @return void * @access protected */ function _modificarDb() { //Grabo las modificaciones al sistema $idSistema = $this->getId(); $fecha_inicio = $this->getFechaInicio(); $fecha_fin = $this->getFechaFin(); $fecha_implementacion = $this->getFechaImplementacion(); //USO SECUENCIAS Y AUTOEXECUTE //Grabo el sistema $datos = array( 'nombre_sistema' => $this->getNombre(), 'desc_sistema' => $this->getDescripcion(), 'fecha_inicio' => $fecha_inicio ? $fecha_inicio->format("%Y-%m-%d") : null, 'fecha_fin' => $fecha_fin ? $fecha_fin->format("%Y-%m-%d") : null, 'fecha_implementacion' => $fecha_implementacion ? $fecha_implementacion->format("%Y-%m-%d") : null, 'contacto' => $this->getContacto(), 'responsable' => $this->getResponsable(), 'estado' => $this->getEstado() ); $res = $this->_db->autoExecute('samurai.sistema', $datos, DB_AUTOQUERY_UPDATE, 'id_sistema = '.$idSistema); if (PEAR::isError($res)) { return $res; } //Borro los permisos que no tengan observaciones $res = $this->_borrarPermisosDb($idSistema, ''); if (PEAR::isError($res)) { return $res; } //Grabo los permisos que selecciono $res = $this->_grabarPermisosDb($idSistema); if (PEAR::isError($res)) { return $res; } } /** * Graba los permisos del sistema en perm_sist * * @param int $idSistema Identificador del sistema * * @return void * @access protected */ function _grabarPermisosDb($idSistema) { $datos = array ('id_permiso','id_sistema','responsable'); $re = $this->_db->autoPrepare('samurai.perm_sist', $datos, DB_AUTOQUERY_INSERT); if (isset($this->_permisos)) { foreach ($this->_permisos as $permiso) { $datos = array ($permiso, $idSistema, $this->getResponsable()); $res = $this->_db->execute($re, $datos); if (PEAR::isError($res)) { return $res; } } } } /** * Borra los permisos que tenga asociado el sistema segun el criterio de observaciones * * @param int $idSistema Identificador del sistema * @param bool $observaciones Null u observacion de la asociacion a borrar * @param int $idPermiso Identificador del permiso a borrar * * @return void * @access protected */ function _borrarPermisosDb($idSistema, $observaciones = null, $idPermiso = null) { $sql = parse_ini_file(dirname(__FILE__) . '/Sistema/consultas.ini', true); $datos[] = $idSistema; $tmp = $sql['borrar_permisos']; if (isset($observaciones)) { $tmp.= $sql['borrar_permisos2']; $datos[] = $observaciones; } if (isset($idPermiso)) { $tmp.= $sql['borrar_permisos3']; $datos[] = $idPermiso; } $dbh = $this->_db->prepare($tmp); $res = $this->_db->execute($dbh, $datos); if (PEAR::isError($res)) { return $res; } } /** * Guarda en base las nuevas asociaciones que se van cargando y actualiza los datos del sistema. * * @param int $idPermiso Identificador del Permiso * @param string $observacion Observacion a agregar * * @return bool * @access public */ function guardarAsociacion($idPermiso, $observacion = '') { if (!$this->_existeAsociacion($idPermiso, $observacion)) { //Guardo la asociacion //Grabo el sistema $datos = array( 'id_permiso' => $idPermiso, 'id_sistema' => $this->getId(), 'observaciones' => $observacion, 'responsable' => $this->getResponsable(), ); $res = $this->_db->autoExecute('samurai.perm_sist', $datos, DB_AUTOQUERY_INSERT); //Recargo los datos del sistema $this->_obtenerDatosDb(); return null; } else { return new PEAR_Error('La Asociacion ya existe.'); } } /** * Elimina una asociacion de la base, y actualiza los datos del sistema. * * @param int $idPermiso Identificador del permiso a borrar * @param string $observacion Observacion de la asociacion a borrar (Puede ser vacia) * * @return bool * @access public */ function eliminarAsociacion($idPermiso, $observacion = '') { //TODO Arreglar el asco este $sql = parse_ini_file(dirname(__FILE__) . '/Sistema/consultas.ini', true); $res = ''; //Obtengo los id de los perfiles del permiso en el sistema $tmp = $sql['ea_obt_idperfil']; $dbh = $this->_db->prepare($tmp); $res = $this->_db->execute($dbh, array ($idPermiso, $observacion, $this->getId())); if (PEAR::isError($res)) { return $res; } $i = 0; $tmp = ''; while ($re = $res->fetchRow(DB_FETCHMODE_ORDERED)) { $tmp[] = $re['0']; $i++; } $PERFILES = $tmp; //Borro el permiso de los perfiles del sistema $tmp = $sql['ea_del_perm_perfil_sist']; $dbh = $this->_db->prepare($tmp); $res = $this->_db->execute($dbh, array ($idPermiso, $observacion, $this->getId())); if (PEAR::isError($res)) { return $res; } //Verifico si era el unico permiso de cada uno de los perfiles en los que estaba asignado if (@$PERFILES) { foreach ($PERFILES as $perfil) { //Cuento $tmp = $sql['ea_obt_cuenta_perfil']; $dbh = $this->_db->prepare($tmp); $res = $this->_db->execute($dbh, array ($perfil, $this->getId())); if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && $re['cuenta'] == 0) { //Borro perfil_sist $tmp = $sql['ea_del_perfil_sist']; $dbh = $this->_db->prepare($tmp); $res = $this->_db->execute($dbh, array ($perfil, $this->getId())); if (PEAR::isError($res)) { return $res; } //Borro perfil_sist_usuario $tmp = $sql['ea_del_perfil_sist_usuario']; $dbh = $this->_db->prepare($tmp); $res = $this->_db->execute($dbh, array ($perfil, $this->getId())); if (PEAR::isError($res)) { return $res; } //Verifico si hay otro sistema usando este perfil $tmp = $sql['ea_obt_cuenta_perfil_sist']; $dbh = $this->_db->prepare($tmp); $res = $this->_db->execute($dbh, array ($perfil)); if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && $re['cuenta'] == 0){ $tmp = $sql['ea_del_perfil']; $dbh = $this->_db->prepare($tmp); $res = $this->_db->execute($dbh, array ($perfil)); if (PEAR::isError($res)) { return $res; } } } } } //Borro la asociacion perm_sist $res = $this->_borrarPermisosDb($this->getId(), $observacion, $idPermiso); if (PEAR::isError($res)) { return $res; } //Recargo los datos del sistema $this->_obtenerDatosDb(); } /** * Actualiza los datos de la asociacion en la base de datos. * * @param int $idPermiso Identificador del permiso * @param string $observacion Observacion a insertar * @param string $obs_ant Observacion anterior * * @return bool * @access public */ function modificarAsociacion($idPermiso, $observacion = '', $obs_ant = '') { //Busco la nueva asociacion if (!$this->_existeAsociacion($idPermiso, $observacion)) { //Actualizo la asociacion $datos = array( 'id_permiso' => $idPermiso, 'id_sistema' => $this->getId(), 'observaciones' => $observacion, 'responsable' => $this->getResponsable(), ); $this->_db->autoExecute('samurai.perm_sist', $datos, DB_AUTOQUERY_UPDATE, 'id_sistema = '.$this->getId().' AND id_permiso = '.$idPermiso.' AND observaciones =\''.$obs_ant.'\''); //Recargo los datos del sistema $this->_obtenerDatosDb(); return null; } else { return new PEAR_Error('La Asociacion ya existe.'); } } /** * Chequea si existe la asociacion * * @param int $idPermiso Id del permiso a chequear * @param string $observacion Observacion a chequear * * @return bool * @access protected */ function _existeAsociacion($idPermiso, $observacion) { $sql = parse_ini_file(dirname(__FILE__) . '/Sistema/consultas.ini', true); $tmp = $sql['obtener_permisos'].$sql['obtener_permisos3'].$sql['obtener_permisos4']; $dbh = $this->_db->prepare($tmp); $tmp = array ($this->getId(),$idPermiso,$observacion); $res = $this->_db->execute($dbh,$tmp); $re = $res->fetchRow(); if (is_null($re)) { return false; } else { return true; } } /** * Devuelve el array de sistemas * * @param SAMURAI_DB &$db Base de Datos * @param bool $activos Indica si se deben buscar solamente los sistemas activos * * @return array(Sistema) * @access public * @static */ function getSistemas(&$db, $activos = true) { $rta = array (); foreach (SAMURAI_Sistema::_getIdSistemas($db, $activos) as $id) { $tmp = new SAMURAI_Sistema($db,$id); array_push($rta, $tmp); } return $rta; } /** * Devuleve un array con los identificadores de todos los sistemas. * * @param SAMURAI_DB &$db Base de Datos * @param bool $activos Indica si se deben buscar solamente los sistemas activos * * @return array(int) * @access protected * @static */ function _getIdSistemas(&$db, $activos = true) { //OBTENGO LOS ID DE LA BASE $rta = array(); $sql = parse_ini_file(dirname(__FILE__) . '/Sistema/consultas.ini', true); $consulta = $sql['obtener_datos_sistema']; if (@$activos) { $consulta.= $sql['obtener_datos_sistema3']; } $consulta.= $sql['obtener_datos_sistema4']; $dbh = $db->prepare($consulta); $res = $db->execute($dbh); while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) { array_push($rta,$re['id_sistema']); } $res->free(); return $rta; } /** * Devuelve un array asociativo en donde la clave es el identificador y el valor es el nombre del sistema * * @param SAMURAI_DB &$db Base de Datos * @param bool $activos Indica si se deben buscar solamente los sistemas activos * * @return array() * @access public * @static */ function getArraySistemas(&$db, $activos = true) { $rta = array (); foreach (SAMURAI_Sistema::getSistemas($db, $activos) as $sistema) { $rta[$sistema->getId()] = $sistema->getNombre(); } return $rta; } /** * Devuelve un array asociativo en donde la clave es el identificador y el valor es el nombre del sistema. Solo devuelve aquellos sistemas en los cuales el usuario tiene permisos. * * @param DB &$DB Conexion a la base de datos * * @return array() * @access public */ function getArraySistemasSeleccionar(&$DB) { $rta = array(); $sql = parse_ini_file(dirname(__FILE__) . '/Sistema/consultas.ini', true); //Verifico si tiene permiso developer en samurai $consulta = $sql['sistemas_seleccionar2']; $dbh = $DB->prepare($consulta); $res = $DB->execute($dbh, array(SAMURAI_PERM, $_SESSION['usuario'], SAMURAI_PERM_DEVELOPER)); $re = $res->fetchrow(DB_FETCHMODE_ASSOC); if ($re['cuenta']) { $consulta = $sql['obtener_datos_sistema']; $consulta.= $sql['obtener_datos_sistema3']; $consulta.= $sql['obtener_datos_sistema4']; $dbh = $DB->prepare($consulta); $res = $DB->execute($dbh); while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) { $rta[$re['id_sistema']] = $re['nombre_sistema']; } $res->free(); return $rta; } //Si no tiene permiso developer en samurai le muestro solo aquellos //sistemas en los cuales puede trabajar $consulta = $sql['sistemas_seleccionar']; $dbh = $DB->prepare($consulta); $res = $DB->execute($dbh, array($_SESSION['usuario'], SAMURAI_PERM_PERFIL_ALTA, SAMURAI_PERM_PERFIL_BAJA, SAMURAI_PERM_PERFIL_MODIF, SAMURAI_PERM_USUARIO_ALTA, SAMURAI_PERM_USUARIO_BAJA, SAMURAI_PERM_USUARIO_MODIF)); while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) { $rta[$re['id_sistema']] = $re['nombre_sistema']; } $res->free(); return $rta; } } ?>