]> git.llucax.com Git - mecon/samurai.git/blobdiff - lib/SAMURAI/Perfil.php
Cambios varios para que funcione bien con Netscape (Aunque ya no se si es asi)
[mecon/samurai.git] / lib / SAMURAI / Perfil.php
index ba3bbcf7cb01735959939c92697dd98b180c2118..acbce4ed588ec9fcb4ed85a3225295c6ca8eba48 100644 (file)
@@ -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