X-Git-Url: https://git.llucax.com/mecon/samurai.git/blobdiff_plain/d0ae155a8be2168110755cce58865068b34bfe91..6c96af7186fde066713c880405778e445eff079b:/lib/SAMURAI/Perfil.php diff --git a/lib/SAMURAI/Perfil.php b/lib/SAMURAI/Perfil.php index ba3bbcf..acbce4e 100644 --- a/lib/SAMURAI/Perfil.php +++ b/lib/SAMURAI/Perfil.php @@ -26,8 +26,6 @@ #require_once 'PEAR.php'; - - // +X2C Class 208 :SAMURAI_Perfil /** * Clase para el manejo de los perfies. @@ -75,6 +73,14 @@ class SAMURAI_Perfil { */ 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; + /** * Gets Id. * @@ -167,6 +173,29 @@ class SAMURAI_Perfil { $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 @@ -191,6 +220,7 @@ class SAMURAI_Perfil { $this->_id = null; $this->_descripcion = null; $this->_tipo = null; + $this->_permisos = null; } } // -X2C @@ -204,12 +234,11 @@ class SAMURAI_Perfil { */ function _obtenerDatosDb() // ~X2C { - $sql = include 'Perfil/consultas.php'; //Incluyo las consultas de este objeto nada mas. + $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']); @@ -217,12 +246,6 @@ class SAMURAI_Perfil { else { $this->setDescripcion(); } - if (isset($re['tipo_perfil'])) { - $this->setTipo($re['tipo_perfil']); - } - else { - $this->setTipo(); - } if (isset($re['responsable'])) { $this->setResponsable($re['responsable']); } @@ -230,6 +253,24 @@ class SAMURAI_Perfil { $this->setResponsable(); } } + //OBTENGO EL TIPO DE PERFIL + $tmp = $sql['verificar_asociacion']; + $dbh = $this->_db->prepare($tmp); + $tmp = array ($this->getId(), $_SESSION['samurai']['id_sistema']); + $res = $this->_db->execute($dbh,$tmp); + $re = $res->fetchrow(DB_FETCHMODE_ASSOC); + $this->setTipo($re['tipo_perfil']); + + //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(), $_SESSION['samurai']['id_sistema']); + $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 @@ -244,7 +285,19 @@ class SAMURAI_Perfil { */ function guardarDatos($accion = grabar) // ~X2C { - trigger_error('Not implemented!', E_USER_WARNING); + $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 @@ -257,7 +310,40 @@ class SAMURAI_Perfil { */ function _grabarDb() // ~X2C { - trigger_error('Not implemented!', E_USER_WARNING); + //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('perfil', $datos, DB_AUTOQUERY_INSERT); + if (PEAR::isError($res)) { + return $res; + } + } + //GRABO EN PERFIL_SIST + $datos = array ('id_perfil' => $this->getId(), + 'id_sistema' => $_SESSION['samurai']['id_sistema'], + 'tipo_perfil' => $this->getTipo(), + 'responsable' => $this->getResponsable(), + ); + $res = $this->_db->autoExecute('perfil_sist', $datos, DB_AUTOQUERY_INSERT); } // -X2C @@ -270,7 +356,46 @@ class SAMURAI_Perfil { */ function _borrarDb() // ~X2C { - trigger_error('Not implemented!', E_USER_WARNING); + $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(), $_SESSION['samurai']['id_sistema']); + $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(), $_SESSION['samurai']['id_sistema']); + $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 @@ -281,7 +406,27 @@ class SAMURAI_Perfil { */ function _modificarDb() // ~X2C { - trigger_error('Not implemented!', E_USER_WARNING); + //Modifico la tabla perfil_sist + $datos = array ( + 'tipo_perfil' => $this->getTipo(), + 'responsable' => $this->getResponsable(), + ); + $res = $this->_db->autoExecute('perfil_sist', $datos, DB_AUTOQUERY_UPDATE, 'id_perfil ='.$this->getId().' AND id_sistema='.$_SESSION['samurai']['id_sistema']); + 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 @@ -290,28 +435,221 @@ class SAMURAI_Perfil { * 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) // ~X2C + function _getIdPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C { - trigger_error('Not implemented!', E_USER_WARNING); + //OBTENGO LOS ID DE LA BASE + $rta = array(); + $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true); + $consulta = $sql['obtener_id_perfiles']; + if ($id_sistema) { + $consulta.= $sql['obtener_id_perfiles3']; + } + if ($filtro) { //Verifico si se paso un filtro + $tmp2 = $consulta.$sql['obtener_id_perfiles2']; + //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 /** * @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) // ~X2C + function getPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C { - trigger_error('Not implemented!', E_USER_WARNING); + $rta = array (); + foreach (SAMURAI_Perfil::_getIdPerfiles($db, $filtro, $id_sistema) as $id) { + $tmp = new SAMURAI_Perfil($db,$id); + 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 + * + * @return array() + * @access public + * @static + */ + function getArrayPerfiles($db, $filtro = null) // ~X2C + { + //FORECHEO LO QUE ME DEVUELVA GET PERMISOS + $rta = array (); + foreach (SAMURAI_Perfil::getPerfiles($db, $filtro) 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('perm_perfil_sist', $datos, DB_AUTOQUERY_INSERT); + foreach ($this->getPermisos() as $permiso) { + list($id, $obs) = split ('##',$permiso); + $datos = array ($id, $this->getId(), $_SESSION['samurai']['id_sistema'], $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(), $_SESSION['samurai']['id_sistema']); + 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 ($_SESSION['samurai']['id_sistema']); + $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); + if ($perf->getDescripcion() != $this->getDescripcion()) { + return new PEAR_Error("El perfil \"".$perf->getDescripcion()."\" contiene los mismos permisos."); + } + } + } + return true; } // -X2C