// +----------------------------------------------------------------------+ // // $Id$ // $Author$ // $URL$ // $Date$ // $Rev$ // #require_once 'PEAR.php'; // +X2C Class 208 :SAMURAI_Perfil /** * Clase para el manejo de los perfies. @see \ref page_samurai_html_perfil * * @access public */ class SAMURAI_Perfil { /** * Identificador del perfil. * * @var int $id * @access protected */ var $_id; /** * Descripcion del perfil. * * @var string $descripcion * @access protected */ var $_descripcion; /** * @var SAMURAI_DB $db * @access protected */ var $_db; /** * Responsable de las ultimas modificaciones * * @var string $responsable * @access protected */ var $_responsable; /** * Array con los permisos asignados al perfil. Solo se cargan cuando se esta trabajando con el abm puesto que varian segun cada sistema. * * @var array(int) $permisos * @access private */ var $_permisos; /** * Identificador del sistema en el cual se esta trabajando * * @var int $idSistema * @access protected */ var $_idSistema; /** * Gets Id. * * @return int * @access public */ function getId() { return $this->_id; } /** * Sets Id. * * @param int $id Id. * * @return void * @access public */ function setId($id) { $this->_id = $id; } /** * Gets Descripcion. * * @return string * @access public */ function getDescripcion() { return $this->_descripcion; } /** * Sets Descripcion. * * @param string $descripcion Descripcion. * * @return void * @access public */ function setDescripcion($descripcion) { $this->_descripcion = $descripcion; } /** * Gets Responsable. * * @return string * @access public */ function getResponsable() { return $this->_responsable; } /** * Sets Responsable. * * @param string $responsable Responsable. * * @return void * @access public */ function setResponsable($responsable) { $this->_responsable = $responsable; } /** * Gets Permisos. * * @return array(int) * @access public */ function getPermisos() { return $this->_permisos; } /** * Sets Permisos. * * @param array(int) $permisos Permisos. * * @return void * @access public */ function setPermisos($permisos) { $this->_permisos = $permisos; } // ~X2C // +X2C Operation 229 /** * Constructor. Si recibe un identificador como parametro, busca la informacion en la base. * * @param SAMURAI_DB &$db Objeto conexion * @param int $id Identificador del perfil. * @param int $idSistema Identificador del sistema en el que se esta trabajando * * @return void * @access public */ function SAMURAI_Perfil(&$db, $id = null, $idSistema = null) // ~X2C { $this->_db = $db; $this->_idSistema = $idSistema; if (!is_null($id)) { $this->setId($id); $this->_obtenerDatosDb(); } else { //INICIALIZO LA VI $this->_id = null; $this->_descripcion = null; $this->_permisos = null; } } // -X2C // +X2C Operation 322 /** * Obtiene los datos de la base de datos * * @return void * @access protected */ function _obtenerDatosDb() // ~X2C { $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true); $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil2']; $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['desc_perfil'])) { $this->setDescripcion($re['desc_perfil']); } else { $this->setDescripcion(); } if (isset($re['responsable'])) { $this->setResponsable($re['responsable']); } else { $this->setResponsable(); } } //OBTENGO LOS PERMISOS QUE TIENE ASIGNADO EL PERFIL DESDE PERM_PERFIL_SIST $tmp = $sql['obtener_permisos']; $dbh = $this->_db->prepare($tmp); $tmp = array ($this->getId(), $this->_idSistema); $res = $this->_db->execute($dbh,$tmp); $rta = array (); while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) { array_push($rta,$re['id_permiso'].'##'.$re['observaciones']); } $this->setPermisos($rta); } // -X2C // +X2C Operation 323 /** * Redirecciona segun la accion correspondiente * * @param string $accion Representa la accion a desarrollar * * @return mixed * @access public */ function guardarDatos($accion = 'grabar') // ~X2C { $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; } // -X2C // +X2C Operation 324 /** * Graba la informacion del perfil en base * * @return mixed * @access protected */ function _grabarDb() // ~X2C { //Obtengo el id del perfil de ser necesario $nuevo = 0; if (!$this->getId()) { //No existe el perfil. Lo cargo por primera vez. $idPerfil = $this->_db->nextId('perfil'); $this->setId($idPerfil); $nuevo = 1; } //GRABO EN PERM_PERFIL_SIST $res = $this->_guardarPermisos(); if (PEAR::isError($res)) { return $res; } //GRABO EN PERFIL if ($nuevo) { $datos = array ( 'id_perfil' => $idPerfil, 'desc_perfil' => $this->getDescripcion(), 'responsable' => $this->getResponsable(), ); $res = $this->_db->autoExecute('samurai.perfil', $datos, DB_AUTOQUERY_INSERT); if (PEAR::isError($res)) { return $res; } } //GRABO EN PERFIL_SIST $datos = array ('id_perfil' => $this->getId(), 'id_sistema' => $this->_idSistema, 'responsable' => $this->getResponsable(), ); $res = $this->_db->autoExecute('samurai.perfil_sist', $datos, DB_AUTOQUERY_INSERT); } // -X2C // +X2C Operation 325 /** * Borra la informacion del perfil de la base * * @return mixed * @access protected */ function _borrarDb() // ~X2C { $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true); //Verifico en perfil_sist_usuario $tmp = $sql['verif_perfil_sist_usuario']; $dbh = $this->_db->prepare($tmp); $datos = array ($this->getId(), $this->_idSistema); $res = $this->_db->execute($dbh, $datos); if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && !$re['cuenta'] == 0) { return new PEAR_Error("Hay usuarios asociados al perfil seleccionado"); } //Borro perm_perfil_sist $res = $this->_borrarPermisos(); if (PEAR::isError($res)) { return $res; } //Borro perfil_sist $tmp = $sql['borrar_perfil_sist']; $dbh = $this->_db->prepare($tmp); $datos = array ($this->getId(), $this->_idSistema); $res = $this->_db->execute($dbh, $datos); if (PEAR::isError($res)) { return $res; } //Verifico en perfil_sist (Perfil asociado a otros sistemas) $tmp = $sql['verif_perfil_sist']; $dbh = $this->_db->prepare($tmp); $datos = array ($this->getId()); $res = $this->_db->execute($dbh, $datos); if (PEAR::isError($res)) { return $res; } if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && $re['cuenta'] == 0) { //Borro perfil $tmp = $sql['borrar_perfil']; $dbh = $this->_db->prepare($tmp); $datos = array ($this->getId()); $res = $this->_db->execute($dbh, $datos); if (PEAR::isError($res)) { return $res; } } } // -X2C // +X2C Operation 326 /** * @return mixed * @access protected */ function _modificarDb() // ~X2C { //Modifico la tabla perfil_sist $datos = array ( 'responsable' => $this->getResponsable(), ); $res = $this->_db->autoExecute('samurai.perfil_sist', $datos, DB_AUTOQUERY_UPDATE, 'id_perfil ='.$this->getId().' AND id_sistema='.$this->_idSistema); if (PEAR::isError($res)) { return $res; } //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA $res = $this->_verifPermisos(); if (PEAR::isError($res)) { return $res; } //Modifico la tabla perm_perfil_sist $res = $this->_borrarPermisos(); if (PEAR::isError($res)) { return $res; } return $this->_guardarPermisos(); } // -X2C // +X2C Operation 338 /** * Devuleve un array con los identificadores de todos los perfiles. * * @param SAMURAI_DB &$db Base de Datos * @param string $filtro Fltro por descripcion del perfil * @param int $id_sistema Identificador del sistema * * @return array(int) * @access protected * @static */ function _getIdPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C { //OBTENGO LOS ID DE LA BASE $rta = array(); $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true); if ($id_sistema) { $consulta = $sql['obtener_id_perfiles']; $consulta.= $sql['obtener_id_perfiles3']; } else { $consulta = $sql['obtener_id_perfiles5']; } if ($filtro && $id_sistema) { //Verifico si se paso un filtro $tmp2 = $consulta.$sql['obtener_id_perfiles2']; //Reemplazo el filtro por ##?## $consulta = ereg_replace ('##FILTRO##', $filtro, $tmp2); } elseif ($filtro) { $tmp2 = $consulta.$sql['obtener_id_perfiles6']; //Reemplazo el filtro por ##?## $consulta = ereg_replace ('##FILTRO##', $filtro, $tmp2); } $consulta.= $sql['obtener_id_perfiles4']; $dbh = $db->prepare($consulta); if ($id_sistema) { $tmp[] = $id_sistema; $res = $db->execute($dbh, $tmp); } else { $res = $db->execute($dbh); } while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) { array_push($rta,$re['id_perfil']); } $res->free(); return $rta; } // -X2C // +X2C Operation 339 /** * Devuelve un array de perfiles * * @param SAMURAI_DB &$db Base de datos * @param string $filtro Filtro por nombre del perfil * @param int $id_sistema Identificador del sistema * * @return array(Perfil) * @access public * @static */ function getPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C { $rta = array (); foreach (SAMURAI_Perfil::_getIdPerfiles($db, $filtro, $id_sistema) as $id) { $tmp = new SAMURAI_Perfil($db,$id, $id_sistema); array_push($rta, $tmp); } return $rta; } // -X2C // +X2C Operation 356 /** * Devuelve la informacion de los perfiles en un array. * * @param SAMURAI_DB $db Base de Datos * @param string $filtro Filtro por descripcion del perfil * @param int $id_sistema Identificador del sistema con el que se esta trabajando * * @return array() * @access public * @static */ function getArrayPerfiles($db, $filtro = null, $id_sistema = null) // ~X2C { //FORECHEO LO QUE ME DEVUELVA GET PERMISOS $rta = array (); foreach (SAMURAI_Perfil::getPerfiles($db, $filtro, $id_sistema) as $perfil) { $rta[$perfil->getId()] = $perfil->getDescripcion(); } return $rta; } // -X2C // +X2C Operation 358 /** * Valida la existencia de un perfil con la descripcion que se pasa por parametro. Devuelve true si existe y false si no existe. * * @param SAMURAI_DB $db Base de Datos * @param string $descripcion Descripcion a comparar * * @return bool * @access public * @static */ function existePerfil($db, $descripcion) // ~X2C { $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true); $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil3']; $dbh = $db->prepare($tmp); $tmp = array ($descripcion); $res = $db->execute($dbh,$tmp); $re = $res->fetchRow(); if (is_null($re)) { return false; } else { return true; } } // -X2C // +X2C Operation 360 /** * Valida la existencia de una asociacion entre el perfil y el sistema seleccionado. Devuelve true si existe y false en caso contraro. * * @param SAMURAI_DB $db Base de Datos * @param int $id_perfil Identificador del perfil con el cual hacer la comparacion * @param int $id_sistema Identificador del sistema con el cual hacer la compararcion * * @return bool * @access public * @static */ function existeAsociacion($db, $id_perfil, $id_sistema) // ~X2C { $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true); $tmp = $sql['verificar_asociacion']; $dbh = $db->prepare($tmp); $tmp = array ($id_perfil, $id_sistema); $res = $db->execute($dbh,$tmp); $re = $res->fetchRow(); if (is_null($re)) { return false; } else { return true; } } // -X2C // +X2C Operation 362 /** * Se encarga de guardar la relacion entre perfiles - permisos - sistemas * * @return mixed * @access protected */ function _guardarPermisos() // ~X2C { $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true); //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA $res = $this->_verifPermisos(); if (PEAR::isError($res)) { return $res; } //GRABO EN PERM_PERFIL_SIST $datos = array ('id_permiso', 'id_perfil', 'id_sistema', 'observaciones', 'responsable'); $re = $this->_db->autoPrepare('samurai.perm_perfil_sist', $datos, DB_AUTOQUERY_INSERT); foreach ($this->getPermisos() as $permiso) { list($id, $obs) = split ('##',$permiso); $datos = array ($id, $this->getId(), $this->_idSistema, $obs, $this->getResponsable()); $res = $this->_db->execute($re, $datos); if (PEAR::isError($res)) { return $res; } } } // -X2C // +X2C Operation 363 /** * Borra la asociacion de un perfil de un sistema con sus permisos * * @return mixed * @access protected */ function _borrarPermisos() // ~X2C { $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true); $tmp = $sql['borrar_permisos']; $dbh = $this->_db->prepare($tmp); $tmp = array ($this->getId(), $this->_idSistema); return $this->_db->execute($dbh,$tmp); } // -X2C // +X2C Operation 376 /** * Verifica si se puede insertar * * @return mixed * @access protected */ function _verifPermisos() // ~X2C { //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true); $tmp = $sql['verif_perm_perfil_sist']; $dbh = $this->_db->prepare($tmp); $tmp = array ($this->_idSistema); $res = $this->_db->execute($dbh,$tmp); $perm = array(); while ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) { $perm[$re['id_perfil']][] = $re['id_permiso'].'##'.$re['observaciones']; } foreach ($perm as $key => $p) { $rta1 = array_diff($p, $this->getPermisos()); $rta2 = array_diff($this->getPermisos(), $p); if (!$rta1 && !$rta2) { $perf = new SAMURAI_Perfil($this->_db, $key, $this->_idSistema); if ($perf->getDescripcion() != $this->getDescripcion()) { return new PEAR_Error("El perfil \"".$perf->getDescripcion()."\" contiene los mismos permisos."); } } } return true; } // -X2C /** * Metodo que devuelve los datos necesarios para listar perfiles. * * @param SAMURAI_DB &$db Base de Datos * @param string $filtro Filtro de perfiles * @param int $id_sistema Identificador del sistema * * @return mixed * @access public * @static */ function getPerfilesPager(&$db, $filtro = null, $id_sistema = null) { //@TODO REEMPLAZA A getPerfiles $where[] = 'p.id_perfil = ps.id_perfil'; if ($id_sistema) { $where[] = 'ps.id_sistema = '. $id_sistema; } if ($filtro) { $where[] = 'p.desc_perfil LIKE '. $db->quote("%$filtro%"); } $where = implode (' AND ', $where); $sql = " SELECT p.id_perfil, p.desc_perfil AS descripcion FROM samurai.perfil AS p, samurai.perfil_sist AS ps WHERE $where ORDER BY p.desc_perfil "; return $db->query ($sql); } } // -X2C Class :SAMURAI_Perfil ?>