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
85 * Identificador del sistema en el cual se esta trabajando
121 function getDescripcion()
123 return $this->_descripcion;
128 * @param string $descripcion Descripcion.
133 function setDescripcion($descripcion)
135 $this->_descripcion = $descripcion;
151 * @param string $tipo Tipo.
156 function setTipo($tipo)
158 $this->_tipo = $tipo;
167 function getResponsable()
169 return $this->_responsable;
174 * @param string $responsable Responsable.
179 function setResponsable($responsable)
181 $this->_responsable = $responsable;
190 function getPermisos()
192 return $this->_permisos;
197 * @param array(int) $permisos Permisos.
202 function setPermisos($permisos)
204 $this->_permisos = $permisos;
209 // +X2C Operation 229
211 * Constructor. Si recibe un identificador como parametro, busca la informacion en la base.
213 * @param SAMURAI_DB &$db Objeto conexion
214 * @param int $id Identificador del perfil.
215 * @param int $idSistema Identificador del sistema en el que se esta trabajando
220 function SAMURAI_Perfil(&$db, $id = null, $idSistema = null) // ~X2C
223 $this->_idSistema = $idSistema;
226 $this->_obtenerDatosDb();
231 $this->_descripcion = null;
233 $this->_permisos = null;
238 // +X2C Operation 322
240 * Obtiene los datos de la base de datos
245 function _obtenerDatosDb() // ~X2C
247 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
248 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil2'];
249 $dbh = $this->_db->prepare($tmp);
250 $tmp = array ($this->getId());
251 $res = $this->_db->execute($dbh,$tmp);
252 if ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
253 if (isset($re['desc_perfil'])) {
254 $this->setDescripcion($re['desc_perfil']);
257 $this->setDescripcion();
259 if (isset($re['responsable'])) {
260 $this->setResponsable($re['responsable']);
263 $this->setResponsable();
266 //OBTENGO EL TIPO DE PERFIL
267 $tmp = $sql['verificar_asociacion'];
268 $dbh = $this->_db->prepare($tmp);
269 $tmp = array ($this->getId(), $this->_idSistema);
270 $res = $this->_db->execute($dbh,$tmp);
271 $re = $res->fetchrow(DB_FETCHMODE_ASSOC);
272 $this->setTipo($re['tipo_perfil']);
274 //OBTENGO LOS PERMISOS QUE TIENE ASIGNADO EL PERFIL DESDE PERM_PERFIL_SIST
275 $tmp = $sql['obtener_permisos'];
276 $dbh = $this->_db->prepare($tmp);
277 $tmp = array ($this->getId(), $this->_idSistema);
278 $res = $this->_db->execute($dbh,$tmp);
280 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
281 array_push($rta,$re['id_permiso'].'##'.$re['observaciones']);
283 $this->setPermisos($rta);
287 // +X2C Operation 323
289 * Redirecciona segun la accion correspondiente
291 * @param string $accion Representa la accion a desarrollar
296 function guardarDatos($accion = grabar) // ~X2C
298 $accion = strtolower($accion);
301 $res = $this->_grabarDb();
304 $res = $this->_modificarDb();
307 $res = $this->_borrarDb();
314 // +X2C Operation 324
316 * Graba la informacion del perfil en base
321 function _grabarDb() // ~X2C
323 //Obtengo el id del perfil de ser necesario
325 if (!$this->getId()) {
326 //No existe el perfil. Lo cargo por primera vez.
327 $idPerfil = $this->_db->nextId('perfil');
328 $this->setId($idPerfil);
332 //GRABO EN PERM_PERFIL_SIST
333 $res = $this->_guardarPermisos();
334 if (PEAR::isError($res)) {
341 'id_perfil' => $idPerfil,
342 'desc_perfil' => $this->getDescripcion(),
343 'responsable' => $this->getResponsable(),
345 $res = $this->_db->autoExecute('perfil', $datos, DB_AUTOQUERY_INSERT);
346 if (PEAR::isError($res)) {
350 //GRABO EN PERFIL_SIST
351 $datos = array ('id_perfil' => $this->getId(),
352 'id_sistema' => $this->_idSistema,
353 'tipo_perfil' => $this->getTipo(),
354 'responsable' => $this->getResponsable(),
356 $res = $this->_db->autoExecute('perfil_sist', $datos, DB_AUTOQUERY_INSERT);
360 // +X2C Operation 325
362 * Borra la informacion del perfil de la base
367 function _borrarDb() // ~X2C
369 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
370 //Verifico en perfil_sist_usuario
371 $tmp = $sql['verif_perfil_sist_usuario'];
372 $dbh = $this->_db->prepare($tmp);
373 $datos = array ($this->getId(), $this->_idSistema);
374 $res = $this->_db->execute($dbh, $datos);
375 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && !$re['cuenta'] == 0) {
376 return new PEAR_Error("Hay usuarios asociados al perfil seleccionado");
378 //Borro perm_perfil_sist
379 $res = $this->_borrarPermisos();
380 if (PEAR::isError($res)) {
384 $tmp = $sql['borrar_perfil_sist'];
385 $dbh = $this->_db->prepare($tmp);
386 $datos = array ($this->getId(), $this->_idSistema);
387 $res = $this->_db->execute($dbh, $datos);
388 if (PEAR::isError($res)) {
391 //Verifico en perfil_sist (Perfil asociado a otros sistemas)
392 $tmp = $sql['verif_perfil_sist'];
393 $dbh = $this->_db->prepare($tmp);
394 $datos = array ($this->getId());
395 $res = $this->_db->execute($dbh, $datos);
396 if (PEAR::isError($res)) {
399 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && $re['cuenta'] == 0) {
401 $tmp = $sql['borrar_perfil'];
402 $dbh = $this->_db->prepare($tmp);
403 $datos = array ($this->getId());
404 $res = $this->_db->execute($dbh, $datos);
405 if (PEAR::isError($res)) {
412 // +X2C Operation 326
417 function _modificarDb() // ~X2C
419 //Modifico la tabla perfil_sist
421 'tipo_perfil' => $this->getTipo(),
422 'responsable' => $this->getResponsable(),
424 $res = $this->_db->autoExecute('perfil_sist', $datos,
425 DB_AUTOQUERY_UPDATE, 'id_perfil ='.$this->getId().' AND
426 id_sistema='.$this->_idSistema);
427 if (PEAR::isError($res)) {
431 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
432 $res = $this->_verifPermisos();
433 if (PEAR::isError($res)) {
436 //Modifico la tabla perm_perfil_sist
437 $res = $this->_borrarPermisos();
438 if (PEAR::isError($res)) {
441 return $this->_guardarPermisos();
445 // +X2C Operation 338
447 * Devuleve un array con los identificadores de todos los perfiles.
449 * @param SAMURAI_DB &$db Base de Datos
450 * @param string $filtro Fltro por descripcion del perfil
451 * @param int $id_sistema Identificador del sistema
457 function _getIdPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
459 //OBTENGO LOS ID DE LA BASE
461 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
462 $consulta = $sql['obtener_id_perfiles'];
464 $consulta.= $sql['obtener_id_perfiles3'];
466 if ($filtro) { //Verifico si se paso un filtro
467 $tmp2 = $consulta.$sql['obtener_id_perfiles2'];
468 //Reemplazo el filtro por ##?##
469 $consulta = ereg_replace ('##FILTRO##', $filtro, $tmp2);
471 $consulta.= $sql['obtener_id_perfiles4'];
472 $dbh = $db->prepare($consulta);
474 $tmp[] = $id_sistema;
475 $res = $db->execute($dbh, $tmp);
478 $res = $db->execute($dbh);
480 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
481 array_push($rta,$re['id_perfil']);
488 // +X2C Operation 339
490 * Devuelve un array de perfiles
492 * @param SAMURAI_DB &$db Base de datos
493 * @param string $filtro Filtro por nombre del perfil
494 * @param int $id_sistema Identificador del sistema
496 * @return array(Perfil)
500 function getPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
503 foreach (SAMURAI_Perfil::_getIdPerfiles($db, $filtro, $id_sistema) as $id) {
504 $tmp = new SAMURAI_Perfil($db,$id, $id_sistema);
505 array_push($rta, $tmp);
511 // +X2C Operation 356
513 * Devuelve la informacion de los perfiles en un array.
515 * @param SAMURAI_DB $db Base de Datos
516 * @param string $filtro Filtro por descripcion del perfil
517 * @param int $id_sistema Identificador del sistema con el que se esta trabajando
523 function getArrayPerfiles($db, $filtro = null, $id_sistema = null) // ~X2C
525 //FORECHEO LO QUE ME DEVUELVA GET PERMISOS
527 foreach (SAMURAI_Perfil::getPerfiles($db, $filtro, $id_sistema) as $perfil) {
528 $rta[$perfil->getId()] = $perfil->getDescripcion();
534 // +X2C Operation 358
536 * Valida la existencia de un perfil con la descripcion que se pasa por parametro. Devuelve true si existe y false si no existe.
538 * @param SAMURAI_DB $db Base de Datos
539 * @param string $descripcion Descripcion a comparar
545 function existePerfil($db, $descripcion) // ~X2C
547 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
548 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil3'];
549 $dbh = $db->prepare($tmp);
550 $tmp = array ($descripcion);
551 $res = $db->execute($dbh,$tmp);
552 $re = $res->fetchRow();
562 // +X2C Operation 360
564 * Valida la existencia de una asociacion entre el perfil y el sistema seleccionado. Devuelve true si existe y false en caso contraro.
566 * @param SAMURAI_DB $db Base de Datos
567 * @param int $id_perfil Identificador del perfil con el cual hacer la comparacion
568 * @param int $id_sistema Identificador del sistema con el cual hacer la compararcion
574 function existeAsociacion($db, $id_perfil, $id_sistema) // ~X2C
576 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
577 $tmp = $sql['verificar_asociacion'];
578 $dbh = $db->prepare($tmp);
579 $tmp = array ($id_perfil, $id_sistema);
580 $res = $db->execute($dbh,$tmp);
581 $re = $res->fetchRow();
591 // +X2C Operation 362
593 * Se encarga de guardar la relacion entre perfiles - permisos - sistemas
598 function _guardarPermisos() // ~X2C
600 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
601 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
602 $res = $this->_verifPermisos();
603 if (PEAR::isError($res)) {
607 //GRABO EN PERM_PERFIL_SIST
608 $datos = array ('id_permiso', 'id_perfil', 'id_sistema', 'observaciones', 'responsable');
609 $re = $this->_db->autoPrepare('perm_perfil_sist', $datos, DB_AUTOQUERY_INSERT);
610 foreach ($this->getPermisos() as $permiso) {
611 list($id, $obs) = split ('##',$permiso);
612 $datos = array ($id, $this->getId(), $this->_idSistema, $obs, $this->getResponsable());
613 $res = $this->_db->execute($re, $datos);
614 if (PEAR::isError($res)) {
621 // +X2C Operation 363
623 * Borra la asociacion de un perfil de un sistema con sus permisos
628 function _borrarPermisos() // ~X2C
630 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
631 $tmp = $sql['borrar_permisos'];
632 $dbh = $this->_db->prepare($tmp);
633 $tmp = array ($this->getId(), $this->_idSistema);
634 return $this->_db->execute($dbh,$tmp);
638 // +X2C Operation 376
640 * Verifica si se puede insertar
645 function _verifPermisos() // ~X2C
647 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
648 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
649 $tmp = $sql['verif_perm_perfil_sist'];
650 $dbh = $this->_db->prepare($tmp);
651 $tmp = array ($this->_idSistema);
652 $res = $this->_db->execute($dbh,$tmp);
654 while ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
655 $perm[$re['id_perfil']][] = $re['id_permiso'].'##'.$re['observaciones'];
657 foreach ($perm as $key => $p) {
658 $rta1 = array_diff($p, $this->getPermisos());
659 $rta2 = array_diff($this->getPermisos(), $p);
660 if (!$rta1 && !$rta2) {
661 $perf = new SAMURAI_Perfil($this->_db, $key, $this->_idSistema);
662 if ($perf->getDescripcion() != $this->getDescripcion()) {
663 return new PEAR_Error("El perfil \"".$perf->getDescripcion()."\" contiene los mismos permisos.");
671 } // -X2C Class :SAMURAI_Perfil