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
54 * Tipo de perfil. E = Externo. I = Interno. D = Dios.
70 * Responsable de las ultimas modificaciones
72 * @var string $responsable
78 * Array con los permisos asignados al perfil. Solo se cargan cuando se esta trabajando con el abm puesto que varian segun cada sistema.
80 * @var array(int) $permisos
86 * Identificador del sistema en el cual se esta trabajando
122 function getDescripcion()
124 return $this->_descripcion;
129 * @param string $descripcion Descripcion.
134 function setDescripcion($descripcion)
136 $this->_descripcion = $descripcion;
152 * @param string $tipo Tipo.
157 function setTipo($tipo)
159 $this->_tipo = $tipo;
168 function getResponsable()
170 return $this->_responsable;
175 * @param string $responsable Responsable.
180 function setResponsable($responsable)
182 $this->_responsable = $responsable;
191 function getPermisos()
193 return $this->_permisos;
198 * @param array(int) $permisos Permisos.
203 function setPermisos($permisos)
205 $this->_permisos = $permisos;
210 // +X2C Operation 229
212 * Constructor. Si recibe un identificador como parametro, busca la informacion en la base.
214 * @param SAMURAI_DB &$db Objeto conexion
215 * @param int $id Identificador del perfil.
216 * @param int $idSistema Identificador del sistema en el que se esta trabajando
221 function SAMURAI_Perfil(&$db, $id = null, $idSistema = null) // ~X2C
224 $this->_idSistema = $idSistema;
227 $this->_obtenerDatosDb();
232 $this->_descripcion = null;
234 $this->_permisos = null;
239 // +X2C Operation 322
241 * Obtiene los datos de la base de datos
246 function _obtenerDatosDb() // ~X2C
248 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
249 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil2'];
250 $dbh = $this->_db->prepare($tmp);
251 $tmp = array ($this->getId());
252 $res = $this->_db->execute($dbh,$tmp);
253 if ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
254 if (isset($re['desc_perfil'])) {
255 $this->setDescripcion($re['desc_perfil']);
258 $this->setDescripcion();
260 if (isset($re['responsable'])) {
261 $this->setResponsable($re['responsable']);
264 $this->setResponsable();
267 //OBTENGO EL TIPO DE PERFIL
268 $tmp = $sql['verificar_asociacion'];
269 $dbh = $this->_db->prepare($tmp);
270 $tmp = array ($this->getId(), $this->_idSistema);
271 $res = $this->_db->execute($dbh,$tmp);
272 $re = $res->fetchrow(DB_FETCHMODE_ASSOC);
273 $this->setTipo($re['tipo_perfil']);
275 //OBTENGO LOS PERMISOS QUE TIENE ASIGNADO EL PERFIL DESDE PERM_PERFIL_SIST
276 $tmp = $sql['obtener_permisos'];
277 $dbh = $this->_db->prepare($tmp);
278 $tmp = array ($this->getId(), $this->_idSistema);
279 $res = $this->_db->execute($dbh,$tmp);
281 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
282 array_push($rta,$re['id_permiso'].'##'.$re['observaciones']);
284 $this->setPermisos($rta);
288 // +X2C Operation 323
290 * Redirecciona segun la accion correspondiente
292 * @param string $accion Representa la accion a desarrollar
297 function guardarDatos($accion = grabar) // ~X2C
299 $accion = strtolower($accion);
302 $res = $this->_grabarDb();
305 $res = $this->_modificarDb();
308 $res = $this->_borrarDb();
315 // +X2C Operation 324
317 * Graba la informacion del perfil en base
322 function _grabarDb() // ~X2C
324 //Obtengo el id del perfil de ser necesario
326 if (!$this->getId()) {
327 //No existe el perfil. Lo cargo por primera vez.
328 $idPerfil = $this->_db->nextId('perfil');
329 $this->setId($idPerfil);
333 //GRABO EN PERM_PERFIL_SIST
334 $res = $this->_guardarPermisos();
335 if (PEAR::isError($res)) {
342 'id_perfil' => $idPerfil,
343 'desc_perfil' => $this->getDescripcion(),
344 'responsable' => $this->getResponsable(),
346 $res = $this->_db->autoExecute('samurai.perfil', $datos, DB_AUTOQUERY_INSERT);
347 if (PEAR::isError($res)) {
351 //GRABO EN PERFIL_SIST
352 $datos = array ('id_perfil' => $this->getId(),
353 'id_sistema' => $this->_idSistema,
354 'tipo_perfil' => $this->getTipo(),
355 'responsable' => $this->getResponsable(),
357 $res = $this->_db->autoExecute('samurai.perfil_sist', $datos, DB_AUTOQUERY_INSERT);
361 // +X2C Operation 325
363 * Borra la informacion del perfil de la base
368 function _borrarDb() // ~X2C
370 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
371 //Verifico en perfil_sist_usuario
372 $tmp = $sql['verif_perfil_sist_usuario'];
373 $dbh = $this->_db->prepare($tmp);
374 $datos = array ($this->getId(), $this->_idSistema);
375 $res = $this->_db->execute($dbh, $datos);
376 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && !$re['cuenta'] == 0) {
377 return new PEAR_Error("Hay usuarios asociados al perfil seleccionado");
379 //Borro perm_perfil_sist
380 $res = $this->_borrarPermisos();
381 if (PEAR::isError($res)) {
385 $tmp = $sql['borrar_perfil_sist'];
386 $dbh = $this->_db->prepare($tmp);
387 $datos = array ($this->getId(), $this->_idSistema);
388 $res = $this->_db->execute($dbh, $datos);
389 if (PEAR::isError($res)) {
392 //Verifico en perfil_sist (Perfil asociado a otros sistemas)
393 $tmp = $sql['verif_perfil_sist'];
394 $dbh = $this->_db->prepare($tmp);
395 $datos = array ($this->getId());
396 $res = $this->_db->execute($dbh, $datos);
397 if (PEAR::isError($res)) {
400 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && $re['cuenta'] == 0) {
402 $tmp = $sql['borrar_perfil'];
403 $dbh = $this->_db->prepare($tmp);
404 $datos = array ($this->getId());
405 $res = $this->_db->execute($dbh, $datos);
406 if (PEAR::isError($res)) {
413 // +X2C Operation 326
418 function _modificarDb() // ~X2C
420 //Modifico la tabla perfil_sist
422 'tipo_perfil' => $this->getTipo(),
423 'responsable' => $this->getResponsable(),
425 $res = $this->_db->autoExecute('samurai.perfil_sist', $datos,
426 DB_AUTOQUERY_UPDATE, 'id_perfil ='.$this->getId().' AND
427 id_sistema='.$this->_idSistema);
428 if (PEAR::isError($res)) {
432 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
433 $res = $this->_verifPermisos();
434 if (PEAR::isError($res)) {
437 //Modifico la tabla perm_perfil_sist
438 $res = $this->_borrarPermisos();
439 if (PEAR::isError($res)) {
442 return $this->_guardarPermisos();
446 // +X2C Operation 338
448 * Devuleve un array con los identificadores de todos los perfiles.
450 * @param SAMURAI_DB &$db Base de Datos
451 * @param string $filtro Fltro por descripcion del perfil
452 * @param int $id_sistema Identificador del sistema
458 function _getIdPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
460 //OBTENGO LOS ID DE LA BASE
462 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
463 $consulta = $sql['obtener_id_perfiles'];
465 $consulta.= $sql['obtener_id_perfiles3'];
467 if ($filtro) { //Verifico si se paso un filtro
468 $tmp2 = $consulta.$sql['obtener_id_perfiles2'];
469 //Reemplazo el filtro por ##?##
470 $consulta = ereg_replace ('##FILTRO##', $filtro, $tmp2);
472 $consulta.= $sql['obtener_id_perfiles4'];
473 $dbh = $db->prepare($consulta);
475 $tmp[] = $id_sistema;
476 $res = $db->execute($dbh, $tmp);
479 $res = $db->execute($dbh);
481 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
482 array_push($rta,$re['id_perfil']);
489 // +X2C Operation 339
491 * Devuelve un array de perfiles
493 * @param SAMURAI_DB &$db Base de datos
494 * @param string $filtro Filtro por nombre del perfil
495 * @param int $id_sistema Identificador del sistema
497 * @return array(Perfil)
501 function getPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
504 foreach (SAMURAI_Perfil::_getIdPerfiles($db, $filtro, $id_sistema) as $id) {
505 $tmp = new SAMURAI_Perfil($db,$id, $id_sistema);
506 array_push($rta, $tmp);
512 // +X2C Operation 356
514 * Devuelve la informacion de los perfiles en un array.
516 * @param SAMURAI_DB $db Base de Datos
517 * @param string $filtro Filtro por descripcion del perfil
518 * @param int $id_sistema Identificador del sistema con el que se esta trabajando
524 function getArrayPerfiles($db, $filtro = null, $id_sistema = null) // ~X2C
526 //FORECHEO LO QUE ME DEVUELVA GET PERMISOS
528 foreach (SAMURAI_Perfil::getPerfiles($db, $filtro, $id_sistema) as $perfil) {
529 $rta[$perfil->getId()] = $perfil->getDescripcion();
535 // +X2C Operation 358
537 * Valida la existencia de un perfil con la descripcion que se pasa por parametro. Devuelve true si existe y false si no existe.
539 * @param SAMURAI_DB $db Base de Datos
540 * @param string $descripcion Descripcion a comparar
546 function existePerfil($db, $descripcion) // ~X2C
548 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
549 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil3'];
550 $dbh = $db->prepare($tmp);
551 $tmp = array ($descripcion);
552 $res = $db->execute($dbh,$tmp);
553 $re = $res->fetchRow();
563 // +X2C Operation 360
565 * Valida la existencia de una asociacion entre el perfil y el sistema seleccionado. Devuelve true si existe y false en caso contraro.
567 * @param SAMURAI_DB $db Base de Datos
568 * @param int $id_perfil Identificador del perfil con el cual hacer la comparacion
569 * @param int $id_sistema Identificador del sistema con el cual hacer la compararcion
575 function existeAsociacion($db, $id_perfil, $id_sistema) // ~X2C
577 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
578 $tmp = $sql['verificar_asociacion'];
579 $dbh = $db->prepare($tmp);
580 $tmp = array ($id_perfil, $id_sistema);
581 $res = $db->execute($dbh,$tmp);
582 $re = $res->fetchRow();
592 // +X2C Operation 362
594 * Se encarga de guardar la relacion entre perfiles - permisos - sistemas
599 function _guardarPermisos() // ~X2C
601 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
602 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
603 $res = $this->_verifPermisos();
604 if (PEAR::isError($res)) {
608 //GRABO EN PERM_PERFIL_SIST
609 $datos = array ('id_permiso', 'id_perfil', 'id_sistema', 'observaciones', 'responsable');
610 $re = $this->_db->autoPrepare('samurai.perm_perfil_sist', $datos, DB_AUTOQUERY_INSERT);
611 foreach ($this->getPermisos() as $permiso) {
612 list($id, $obs) = split ('##',$permiso);
613 $datos = array ($id, $this->getId(), $this->_idSistema, $obs, $this->getResponsable());
614 $res = $this->_db->execute($re, $datos);
615 if (PEAR::isError($res)) {
622 // +X2C Operation 363
624 * Borra la asociacion de un perfil de un sistema con sus permisos
629 function _borrarPermisos() // ~X2C
631 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
632 $tmp = $sql['borrar_permisos'];
633 $dbh = $this->_db->prepare($tmp);
634 $tmp = array ($this->getId(), $this->_idSistema);
635 return $this->_db->execute($dbh,$tmp);
639 // +X2C Operation 376
641 * Verifica si se puede insertar
646 function _verifPermisos() // ~X2C
648 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
649 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
650 $tmp = $sql['verif_perm_perfil_sist'];
651 $dbh = $this->_db->prepare($tmp);
652 $tmp = array ($this->_idSistema);
653 $res = $this->_db->execute($dbh,$tmp);
655 while ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
656 $perm[$re['id_perfil']][] = $re['id_permiso'].'##'.$re['observaciones'];
658 foreach ($perm as $key => $p) {
659 $rta1 = array_diff($p, $this->getPermisos());
660 $rta2 = array_diff($this->getPermisos(), $p);
661 if (!$rta1 && !$rta2) {
662 $perf = new SAMURAI_Perfil($this->_db, $key, $this->_idSistema);
663 if ($perf->getDescripcion() != $this->getDescripcion()) {
664 return new PEAR_Error("El perfil \"".$perf->getDescripcion()."\" contiene los mismos permisos.");
672 } // -X2C Class :SAMURAI_Perfil