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.
35 class SAMURAI_Perfil {
37 * Identificador del perfil.
45 * Descripcion del perfil.
47 * @var string $descripcion
53 * Tipo de perfil. E = Externo. I = Interno. D = Dios.
69 * Responsable de las ultimas modificaciones
71 * @var string $responsable
77 * Array con los permisos asignados al perfil. Solo se cargan cuando se esta trabajando con el abm puesto que varian segun cada sistema.
79 * @var array(int) $permisos
113 function getDescripcion()
115 return $this->_descripcion;
120 * @param string $descripcion Descripcion.
125 function setDescripcion($descripcion)
127 $this->_descripcion = $descripcion;
143 * @param string $tipo Tipo.
148 function setTipo($tipo)
150 $this->_tipo = $tipo;
159 function getResponsable()
161 return $this->_responsable;
166 * @param string $responsable Responsable.
171 function setResponsable($responsable)
173 $this->_responsable = $responsable;
182 function getPermisos()
184 return $this->_permisos;
189 * @param array(int) $permisos Permisos.
194 function setPermisos($permisos)
196 $this->_permisos = $permisos;
201 // +X2C Operation 229
203 * Constructor. Si recibe un identificador como parametro, busca la informacion en la base.
205 * @param SAMURAI_DB &$db Objeto conexion
206 * @param int $id Identificador del perfil.
211 function SAMURAI_Perfil(&$db, $id = null) // ~X2C
216 $this->_obtenerDatosDb();
221 $this->_descripcion = null;
223 $this->_permisos = null;
228 // +X2C Operation 322
230 * Obtiene los datos de la base de datos
235 function _obtenerDatosDb() // ~X2C
237 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
238 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil2'];
239 $dbh = $this->_db->prepare($tmp);
240 $tmp = array ($this->getId());
241 $res = $this->_db->execute($dbh,$tmp);
242 if ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
243 if (isset($re['desc_perfil'])) {
244 $this->setDescripcion($re['desc_perfil']);
247 $this->setDescripcion();
249 if (isset($re['responsable'])) {
250 $this->setResponsable($re['responsable']);
253 $this->setResponsable();
256 //OBTENGO EL TIPO DE PERFIL
257 $tmp = $sql['verificar_asociacion'];
258 $dbh = $this->_db->prepare($tmp);
259 $tmp = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
260 $res = $this->_db->execute($dbh,$tmp);
261 $re = $res->fetchrow(DB_FETCHMODE_ASSOC);
262 $this->setTipo($re['tipo_perfil']);
264 //OBTENGO LOS PERMISOS QUE TIENE ASIGNADO EL PERFIL DESDE PERM_PERFIL_SIST
265 $tmp = $sql['obtener_permisos'];
266 $dbh = $this->_db->prepare($tmp);
267 $tmp = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
268 $res = $this->_db->execute($dbh,$tmp);
270 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
271 array_push($rta,$re['id_permiso'].'##'.$re['observaciones']);
273 $this->setPermisos($rta);
277 // +X2C Operation 323
279 * Redirecciona segun la accion correspondiente
281 * @param string $accion Representa la accion a desarrollar
286 function guardarDatos($accion = grabar) // ~X2C
288 $accion = strtolower($accion);
291 $res = $this->_grabarDb();
294 $res = $this->_modificarDb();
297 $res = $this->_borrarDb();
304 // +X2C Operation 324
306 * Graba la informacion del perfil en base
311 function _grabarDb() // ~X2C
313 //Obtengo el id del perfil de ser necesario
315 if (!$this->getId()) {
316 //No existe el perfil. Lo cargo por primera vez.
317 $idPerfil = $this->_db->nextId('perfil');
318 $this->setId($idPerfil);
322 //GRABO EN PERM_PERFIL_SIST
323 $res = $this->_guardarPermisos();
324 if (PEAR::isError($res)) {
331 'id_perfil' => $idPerfil,
332 'desc_perfil' => $this->getDescripcion(),
333 'responsable' => $this->getResponsable(),
335 $res = $this->_db->autoExecute('perfil', $datos, DB_AUTOQUERY_INSERT);
336 if (PEAR::isError($res)) {
340 //GRABO EN PERFIL_SIST
341 $datos = array ('id_perfil' => $this->getId(),
342 'id_sistema' => $_SESSION['samurai']['id_sistema'],
343 'tipo_perfil' => $this->getTipo(),
344 'responsable' => $this->getResponsable(),
346 $res = $this->_db->autoExecute('perfil_sist', $datos, DB_AUTOQUERY_INSERT);
350 // +X2C Operation 325
352 * Borra la informacion del perfil de la base
357 function _borrarDb() // ~X2C
359 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
360 //Verifico en perfil_sist_usuario
361 $tmp = $sql['verif_perfil_sist_usuario'];
362 $dbh = $this->_db->prepare($tmp);
363 $datos = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
364 $res = $this->_db->execute($dbh, $datos);
365 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && !$re['cuenta'] == 0) {
366 return new PEAR_Error("Hay usuarios asociados al perfil seleccionado");
368 //Borro perm_perfil_sist
369 $res = $this->_borrarPermisos();
370 if (PEAR::isError($res)) {
374 $tmp = $sql['borrar_perfil_sist'];
375 $dbh = $this->_db->prepare($tmp);
376 $datos = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
377 $res = $this->_db->execute($dbh, $datos);
378 if (PEAR::isError($res)) {
381 //Verifico en perfil_sist (Perfil asociado a otros sistemas)
382 $tmp = $sql['verif_perfil_sist'];
383 $dbh = $this->_db->prepare($tmp);
384 $datos = array ($this->getId());
385 $res = $this->_db->execute($dbh, $datos);
386 if (PEAR::isError($res)) {
389 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && $re['cuenta'] == 0) {
391 $tmp = $sql['borrar_perfil'];
392 $dbh = $this->_db->prepare($tmp);
393 $datos = array ($this->getId());
394 $res = $this->_db->execute($dbh, $datos);
395 if (PEAR::isError($res)) {
402 // +X2C Operation 326
407 function _modificarDb() // ~X2C
409 //Modifico la tabla perfil_sist
411 'tipo_perfil' => $this->getTipo(),
412 'responsable' => $this->getResponsable(),
414 $res = $this->_db->autoExecute('perfil_sist', $datos, DB_AUTOQUERY_UPDATE, 'id_perfil ='.$this->getId().' AND id_sistema='.$_SESSION['samurai']['id_sistema']);
415 if (PEAR::isError($res)) {
419 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
420 $res = $this->_verifPermisos();
421 if (PEAR::isError($res)) {
424 //Modifico la tabla perm_perfil_sist
425 $res = $this->_borrarPermisos();
426 if (PEAR::isError($res)) {
429 return $this->_guardarPermisos();
433 // +X2C Operation 338
435 * Devuleve un array con los identificadores de todos los perfiles.
437 * @param SAMURAI_DB &$db Base de Datos
438 * @param string $filtro Fltro por descripcion del perfil
439 * @param int $id_sistema Identificador del sistema
445 function _getIdPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
447 //OBTENGO LOS ID DE LA BASE
449 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
450 $consulta = $sql['obtener_id_perfiles'];
452 $consulta.= $sql['obtener_id_perfiles3'];
454 if ($filtro) { //Verifico si se paso un filtro
455 $tmp2 = $consulta.$sql['obtener_id_perfiles2'];
456 //Reemplazo el filtro por ##?##
457 $consulta = ereg_replace ('##FILTRO##', $filtro, $tmp2);
459 $consulta.= $sql['obtener_id_perfiles4'];
460 $dbh = $db->prepare($consulta);
462 $tmp[] = $id_sistema;
463 $res = $db->execute($dbh, $tmp);
466 $res = $db->execute($dbh);
468 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
469 array_push($rta,$re['id_perfil']);
476 // +X2C Operation 339
478 * @param SAMURAI_DB &$db Base de datos
479 * @param string $filtro Filtro por nombre del perfil
480 * @param int $id_sistema Identificador del sistema
482 * @return array(Perfil)
486 function getPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
489 foreach (SAMURAI_Perfil::_getIdPerfiles($db, $filtro, $id_sistema) as $id) {
490 $tmp = new SAMURAI_Perfil($db,$id);
491 array_push($rta, $tmp);
497 // +X2C Operation 356
499 * Devuelve la informacion de los perfiles en un array.
501 * @param SAMURAI_DB $db Base de Datos
502 * @param string $filtro Filtro por descripcion del perfil
508 function getArrayPerfiles($db, $filtro = null) // ~X2C
510 //FORECHEO LO QUE ME DEVUELVA GET PERMISOS
512 foreach (SAMURAI_Perfil::getPerfiles($db, $filtro) as $perfil) {
513 $rta[$perfil->getId()] = $perfil->getDescripcion();
519 // +X2C Operation 358
521 * Valida la existencia de un perfil con la descripcion que se pasa por parametro. Devuelve true si existe y false si no existe.
523 * @param SAMURAI_DB $db Base de Datos
524 * @param string $descripcion Descripcion a comparar
530 function existePerfil($db, $descripcion) // ~X2C
532 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
533 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil3'];
534 $dbh = $db->prepare($tmp);
535 $tmp = array ($descripcion);
536 $res = $db->execute($dbh,$tmp);
537 $re = $res->fetchRow();
547 // +X2C Operation 360
549 * Valida la existencia de una asociacion entre el perfil y el sistema seleccionado. Devuelve true si existe y false en caso contraro.
551 * @param SAMURAI_DB $db Base de Datos
552 * @param int $id_perfil Identificador del perfil con el cual hacer la comparacion
553 * @param int $id_sistema Identificador del sistema con el cual hacer la compararcion
559 function existeAsociacion($db, $id_perfil, $id_sistema) // ~X2C
561 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
562 $tmp = $sql['verificar_asociacion'];
563 $dbh = $db->prepare($tmp);
564 $tmp = array ($id_perfil, $id_sistema);
565 $res = $db->execute($dbh,$tmp);
566 $re = $res->fetchRow();
576 // +X2C Operation 362
578 * Se encarga de guardar la relacion entre perfiles - permisos - sistemas
583 function _guardarPermisos() // ~X2C
585 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
586 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
587 $res = $this->_verifPermisos();
588 if (PEAR::isError($res)) {
592 //GRABO EN PERM_PERFIL_SIST
593 $datos = array ('id_permiso', 'id_perfil', 'id_sistema', 'observaciones', 'responsable');
594 $re = $this->_db->autoPrepare('perm_perfil_sist', $datos, DB_AUTOQUERY_INSERT);
595 foreach ($this->getPermisos() as $permiso) {
596 list($id, $obs) = split ('##',$permiso);
597 $datos = array ($id, $this->getId(), $_SESSION['samurai']['id_sistema'], $obs, $this->getResponsable());
598 $res = $this->_db->execute($re, $datos);
599 if (PEAR::isError($res)) {
606 // +X2C Operation 363
608 * Borra la asociacion de un perfil de un sistema con sus permisos
613 function _borrarPermisos() // ~X2C
615 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
616 $tmp = $sql['borrar_permisos'];
617 $dbh = $this->_db->prepare($tmp);
618 $tmp = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
619 return $this->_db->execute($dbh,$tmp);
623 // +X2C Operation 376
625 * Verifica si se puede insertar
630 function _verifPermisos() // ~X2C
632 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
633 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
634 $tmp = $sql['verif_perm_perfil_sist'];
635 $dbh = $this->_db->prepare($tmp);
636 $tmp = array ($_SESSION['samurai']['id_sistema']);
637 $res = $this->_db->execute($dbh,$tmp);
639 while ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
640 $perm[$re['id_perfil']][] = $re['id_permiso'].'##'.$re['observaciones'];
642 foreach ($perm as $key => $p) {
643 $rta1 = array_diff($p, $this->getPermisos());
644 $rta2 = array_diff($this->getPermisos(), $p);
645 if (!$rta1 && !$rta2) {
646 $perf = new SAMURAI_Perfil($this->_db, $key);
647 return new PEAR_Error("El perfil \"".$perf->getDescripcion()."\" contiene los mismos permisos.");
654 } // -X2C Class :SAMURAI_Perfil