2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
3 // +----------------------------------------------------------------------+
5 // +----------------------------------------------------------------------+
6 // | Copyright (c) 1997-2003 The PHP Group |
7 // +----------------------------------------------------------------------+
8 // | This source file is subject to version 2.02 of the PHP license, |
9 // | that is bundled with this package in the file LICENSE, and is |
10 // | available at through the world-wide-web at |
11 // | http://www.php.net/license/2_02.txt. |
12 // | If you did not receive a copy of the PHP license and are unable to |
13 // | obtain it through the world-wide-web, please send a note to |
14 // | license@php.net so we can mail you a copy immediately. |
15 // +----------------------------------------------------------------------+
16 // | Created: Tue May 27 11:20:04 2003
17 // | Author: Martin Marrese - Myrna Degano <mmarre@mecon.gov.ar - mdegan@mecon.gov.ar>
18 // +----------------------------------------------------------------------+
27 #require_once 'PEAR.php';
29 // +X2C Class 208 :SAMURAI_Perfil
31 * Clase para el manejo de los perfies.
32 @see \ref page_samurai_html_perfil
36 class SAMURAI_Perfil {
38 * Identificador del perfil.
46 * Descripcion del perfil.
48 * @var string $descripcion
60 * Responsable de las ultimas modificaciones
62 * @var string $responsable
68 * Array con los permisos asignados al perfil. Solo se cargan cuando se esta trabajando con el abm puesto que varian segun cada sistema.
70 * @var array(int) $permisos
76 * Identificador del sistema en el cual se esta trabajando
112 function getDescripcion()
114 return $this->_descripcion;
119 * @param string $descripcion Descripcion.
124 function setDescripcion($descripcion)
126 $this->_descripcion = $descripcion;
135 function getResponsable()
137 return $this->_responsable;
142 * @param string $responsable Responsable.
147 function setResponsable($responsable)
149 $this->_responsable = $responsable;
158 function getPermisos()
160 return $this->_permisos;
165 * @param array(int) $permisos Permisos.
170 function setPermisos($permisos)
172 $this->_permisos = $permisos;
177 // +X2C Operation 229
179 * Constructor. Si recibe un identificador como parametro, busca la informacion en la base.
181 * @param SAMURAI_DB &$db Objeto conexion
182 * @param int $id Identificador del perfil.
183 * @param int $idSistema Identificador del sistema en el que se esta trabajando
188 function SAMURAI_Perfil(&$db, $id = null, $idSistema = null) // ~X2C
191 $this->_idSistema = $idSistema;
194 $this->_obtenerDatosDb();
199 $this->_descripcion = null;
200 $this->_permisos = null;
205 // +X2C Operation 322
207 * Obtiene los datos de la base de datos
212 function _obtenerDatosDb() // ~X2C
214 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
215 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil2'];
216 $dbh = $this->_db->prepare($tmp);
217 $tmp = array ($this->getId());
218 $res = $this->_db->execute($dbh,$tmp);
219 if ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
220 if (isset($re['desc_perfil'])) {
221 $this->setDescripcion($re['desc_perfil']);
224 $this->setDescripcion();
226 if (isset($re['responsable'])) {
227 $this->setResponsable($re['responsable']);
230 $this->setResponsable();
234 //OBTENGO LOS PERMISOS QUE TIENE ASIGNADO EL PERFIL DESDE PERM_PERFIL_SIST
235 $tmp = $sql['obtener_permisos'];
236 $dbh = $this->_db->prepare($tmp);
237 $tmp = array ($this->getId(), $this->_idSistema);
238 $res = $this->_db->execute($dbh,$tmp);
240 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
241 array_push($rta,$re['id_permiso'].'##'.$re['observaciones']);
243 $this->setPermisos($rta);
247 // +X2C Operation 323
249 * Redirecciona segun la accion correspondiente
251 * @param string $accion Representa la accion a desarrollar
256 function guardarDatos($accion = 'grabar') // ~X2C
258 $accion = strtolower($accion);
261 $res = $this->_grabarDb();
264 $res = $this->_modificarDb();
267 $res = $this->_borrarDb();
274 // +X2C Operation 324
276 * Graba la informacion del perfil en base
281 function _grabarDb() // ~X2C
283 //Obtengo el id del perfil de ser necesario
285 if (!$this->getId()) {
286 //No existe el perfil. Lo cargo por primera vez.
287 $idPerfil = $this->_db->nextId('perfil');
288 $this->setId($idPerfil);
292 //GRABO EN PERM_PERFIL_SIST
293 $res = $this->_guardarPermisos();
294 if (PEAR::isError($res)) {
301 'id_perfil' => $idPerfil,
302 'desc_perfil' => $this->getDescripcion(),
303 'responsable' => $this->getResponsable(),
305 $res = $this->_db->autoExecute('samurai.perfil', $datos, DB_AUTOQUERY_INSERT);
306 if (PEAR::isError($res)) {
310 //GRABO EN PERFIL_SIST
311 $datos = array ('id_perfil' => $this->getId(),
312 'id_sistema' => $this->_idSistema,
313 'responsable' => $this->getResponsable(),
315 $res = $this->_db->autoExecute('samurai.perfil_sist', $datos, DB_AUTOQUERY_INSERT);
319 // +X2C Operation 325
321 * Borra la informacion del perfil de la base
326 function _borrarDb() // ~X2C
328 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
329 //Verifico en perfil_sist_usuario
330 $tmp = $sql['verif_perfil_sist_usuario'];
331 $dbh = $this->_db->prepare($tmp);
332 $datos = array ($this->getId(), $this->_idSistema);
333 $res = $this->_db->execute($dbh, $datos);
334 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && !$re['cuenta'] == 0) {
335 return new PEAR_Error("Hay usuarios asociados al perfil seleccionado");
337 //Borro perm_perfil_sist
338 $res = $this->_borrarPermisos();
339 if (PEAR::isError($res)) {
343 $tmp = $sql['borrar_perfil_sist'];
344 $dbh = $this->_db->prepare($tmp);
345 $datos = array ($this->getId(), $this->_idSistema);
346 $res = $this->_db->execute($dbh, $datos);
347 if (PEAR::isError($res)) {
350 //Verifico en perfil_sist (Perfil asociado a otros sistemas)
351 $tmp = $sql['verif_perfil_sist'];
352 $dbh = $this->_db->prepare($tmp);
353 $datos = array ($this->getId());
354 $res = $this->_db->execute($dbh, $datos);
355 if (PEAR::isError($res)) {
358 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && $re['cuenta'] == 0) {
360 $tmp = $sql['borrar_perfil'];
361 $dbh = $this->_db->prepare($tmp);
362 $datos = array ($this->getId());
363 $res = $this->_db->execute($dbh, $datos);
364 if (PEAR::isError($res)) {
371 // +X2C Operation 326
376 function _modificarDb() // ~X2C
378 //Modifico la tabla perfil_sist
380 'responsable' => $this->getResponsable(),
382 $res = $this->_db->autoExecute('samurai.perfil_sist', $datos,
383 DB_AUTOQUERY_UPDATE, 'id_perfil ='.$this->getId().' AND
384 id_sistema='.$this->_idSistema);
385 if (PEAR::isError($res)) {
389 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
390 $res = $this->_verifPermisos();
391 if (PEAR::isError($res)) {
394 //Modifico la tabla perm_perfil_sist
395 $res = $this->_borrarPermisos();
396 if (PEAR::isError($res)) {
399 return $this->_guardarPermisos();
403 // +X2C Operation 338
405 * Devuleve un array con los identificadores de todos los perfiles.
407 * @param SAMURAI_DB &$db Base de Datos
408 * @param string $filtro Fltro por descripcion del perfil
409 * @param int $id_sistema Identificador del sistema
415 function _getIdPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
417 //OBTENGO LOS ID DE LA BASE
419 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
421 $consulta = $sql['obtener_id_perfiles'];
422 $consulta.= $sql['obtener_id_perfiles3'];
425 $consulta = $sql['obtener_id_perfiles5'];
427 if ($filtro && $id_sistema) { //Verifico si se paso un filtro
428 $tmp2 = $consulta.$sql['obtener_id_perfiles2'];
429 //Reemplazo el filtro por ##?##
430 $consulta = ereg_replace ('##FILTRO##', $filtro, $tmp2);
433 $tmp2 = $consulta.$sql['obtener_id_perfiles6'];
434 //Reemplazo el filtro por ##?##
435 $consulta = ereg_replace ('##FILTRO##', $filtro, $tmp2);
437 $consulta.= $sql['obtener_id_perfiles4'];
438 $dbh = $db->prepare($consulta);
440 $tmp[] = $id_sistema;
441 $res = $db->execute($dbh, $tmp);
444 $res = $db->execute($dbh);
446 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
447 array_push($rta,$re['id_perfil']);
454 // +X2C Operation 339
456 * Devuelve un array de perfiles
458 * @param SAMURAI_DB &$db Base de datos
459 * @param string $filtro Filtro por nombre del perfil
460 * @param int $id_sistema Identificador del sistema
462 * @return array(Perfil)
466 function getPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
469 foreach (SAMURAI_Perfil::_getIdPerfiles($db, $filtro, $id_sistema) as $id) {
470 $tmp = new SAMURAI_Perfil($db,$id, $id_sistema);
471 array_push($rta, $tmp);
477 // +X2C Operation 356
479 * Devuelve la informacion de los perfiles en un array.
481 * @param SAMURAI_DB $db Base de Datos
482 * @param string $filtro Filtro por descripcion del perfil
483 * @param int $id_sistema Identificador del sistema con el que se esta trabajando
489 function getArrayPerfiles($db, $filtro = null, $id_sistema = null) // ~X2C
491 //FORECHEO LO QUE ME DEVUELVA GET PERMISOS
493 foreach (SAMURAI_Perfil::getPerfiles($db, $filtro, $id_sistema) as $perfil) {
494 $rta[$perfil->getId()] = $perfil->getDescripcion();
500 // +X2C Operation 358
502 * Valida la existencia de un perfil con la descripcion que se pasa por parametro. Devuelve true si existe y false si no existe.
504 * @param SAMURAI_DB $db Base de Datos
505 * @param string $descripcion Descripcion a comparar
511 function existePerfil($db, $descripcion) // ~X2C
513 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
514 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil3'];
515 $dbh = $db->prepare($tmp);
516 $tmp = array ($descripcion);
517 $res = $db->execute($dbh,$tmp);
518 $re = $res->fetchRow();
528 // +X2C Operation 360
530 * Valida la existencia de una asociacion entre el perfil y el sistema seleccionado. Devuelve true si existe y false en caso contraro.
532 * @param SAMURAI_DB $db Base de Datos
533 * @param int $id_perfil Identificador del perfil con el cual hacer la comparacion
534 * @param int $id_sistema Identificador del sistema con el cual hacer la compararcion
540 function existeAsociacion($db, $id_perfil, $id_sistema) // ~X2C
542 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
543 $tmp = $sql['verificar_asociacion'];
544 $dbh = $db->prepare($tmp);
545 $tmp = array ($id_perfil, $id_sistema);
546 $res = $db->execute($dbh,$tmp);
547 $re = $res->fetchRow();
557 // +X2C Operation 362
559 * Se encarga de guardar la relacion entre perfiles - permisos - sistemas
564 function _guardarPermisos() // ~X2C
566 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
567 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
568 $res = $this->_verifPermisos();
569 if (PEAR::isError($res)) {
573 //GRABO EN PERM_PERFIL_SIST
574 $datos = array ('id_permiso', 'id_perfil', 'id_sistema', 'observaciones', 'responsable');
575 $re = $this->_db->autoPrepare('samurai.perm_perfil_sist', $datos, DB_AUTOQUERY_INSERT);
576 foreach ($this->getPermisos() as $permiso) {
577 list($id, $obs) = split ('##',$permiso);
578 $datos = array ($id, $this->getId(), $this->_idSistema, $obs, $this->getResponsable());
579 $res = $this->_db->execute($re, $datos);
580 if (PEAR::isError($res)) {
587 // +X2C Operation 363
589 * Borra la asociacion de un perfil de un sistema con sus permisos
594 function _borrarPermisos() // ~X2C
596 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
597 $tmp = $sql['borrar_permisos'];
598 $dbh = $this->_db->prepare($tmp);
599 $tmp = array ($this->getId(), $this->_idSistema);
600 return $this->_db->execute($dbh,$tmp);
604 // +X2C Operation 376
606 * Verifica si se puede insertar
611 function _verifPermisos() // ~X2C
613 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
614 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
615 $tmp = $sql['verif_perm_perfil_sist'];
616 $dbh = $this->_db->prepare($tmp);
617 $tmp = array ($this->_idSistema);
618 $res = $this->_db->execute($dbh,$tmp);
620 while ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
621 $perm[$re['id_perfil']][] = $re['id_permiso'].'##'.$re['observaciones'];
623 foreach ($perm as $key => $p) {
624 $rta1 = array_diff($p, $this->getPermisos());
625 $rta2 = array_diff($this->getPermisos(), $p);
626 if (!$rta1 && !$rta2) {
627 $perf = new SAMURAI_Perfil($this->_db, $key, $this->_idSistema);
628 if ($perf->getDescripcion() != $this->getDescripcion()) {
629 return new PEAR_Error("El perfil \"".$perf->getDescripcion()."\" contiene los mismos permisos.");
638 * Metodo que devuelve los datos necesarios para listar perfiles.
640 * @param SAMURAI_DB &$db Base de Datos
641 * @param string $filtro Filtro de perfiles
642 * @param int $id_sistema Identificador del sistema
648 function getPerfilesPager(&$db, $filtro = null, $id_sistema = null) {
650 //@TODO REEMPLAZA A getPerfiles
651 $where[] = 'p.id_perfil = ps.id_perfil';
653 $where[] = 'ps.id_sistema = '. $id_sistema;
656 $where[] = 'p.desc_perfil LIKE '. $db->quote("%$filtro%");
659 $where = implode (' AND ', $where);
662 SELECT p.id_perfil, p.desc_perfil AS descripcion
663 FROM samurai.perfil AS p, samurai.perfil_sist AS ps
665 ORDER BY p.desc_perfil
668 return $db->query ($sql);
671 } // -X2C Class :SAMURAI_Perfil