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';
31 // +X2C Class 208 :SAMURAI_Perfil
33 * Clase para el manejo de los perfies.
37 class SAMURAI_Perfil {
39 * Identificador del perfil.
47 * Descripcion del perfil.
49 * @var string $descripcion
55 * Tipo de perfil. E = Externo. I = Interno. D = Dios.
71 * Responsable de las ultimas modificaciones
73 * @var string $responsable
79 * Array con los permisos asignados al perfil. Solo se cargan cuando se esta trabajando con el abm puesto que varian segun cada sistema.
81 * @var array(int) $permisos
115 function getDescripcion()
117 return $this->_descripcion;
122 * @param string $descripcion Descripcion.
127 function setDescripcion($descripcion)
129 $this->_descripcion = $descripcion;
145 * @param string $tipo Tipo.
150 function setTipo($tipo)
152 $this->_tipo = $tipo;
161 function getResponsable()
163 return $this->_responsable;
168 * @param string $responsable Responsable.
173 function setResponsable($responsable)
175 $this->_responsable = $responsable;
184 function getPermisos()
186 return $this->_permisos;
191 * @param array(int) $permisos Permisos.
196 function setPermisos($permisos)
198 $this->_permisos = $permisos;
203 // +X2C Operation 229
205 * Constructor. Si recibe un identificador como parametro, busca la informacion en la base.
207 * @param SAMURAI_DB &$db Objeto conexion
208 * @param int $id Identificador del perfil.
213 function SAMURAI_Perfil(&$db, $id = null) // ~X2C
218 $this->_obtenerDatosDb();
223 $this->_descripcion = null;
225 $this->_permisos = null;
230 // +X2C Operation 322
232 * Obtiene los datos de la base de datos
237 function _obtenerDatosDb() // ~X2C
239 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
240 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil2'];
241 $dbh = $this->_db->prepare($tmp);
242 $tmp = array ($this->getId());
243 $res = $this->_db->execute($dbh,$tmp);
244 if ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
245 if (isset($re['desc_perfil'])) {
246 $this->setDescripcion($re['desc_perfil']);
249 $this->setDescripcion();
251 if (isset($re['responsable'])) {
252 $this->setResponsable($re['responsable']);
255 $this->setResponsable();
258 //OBTENGO EL TIPO DE PERFIL
259 $tmp = $sql['verificar_asociacion'];
260 $dbh = $this->_db->prepare($tmp);
261 $tmp = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
262 $res = $this->_db->execute($dbh,$tmp);
263 $re = $res->fetchrow(DB_FETCHMODE_ASSOC);
264 $this->setTipo($re['tipo_perfil']);
266 //OBTENGO LOS PERMISOS QUE TIENE ASIGNADO EL PERFIL DESDE PERM_PERFIL_SIST
267 $tmp = $sql['obtener_permisos'];
268 $dbh = $this->_db->prepare($tmp);
269 $tmp = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
270 $res = $this->_db->execute($dbh,$tmp);
272 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
273 array_push($rta,$re['id_permiso'].'##'.$re['observaciones']);
275 $this->setPermisos($rta);
279 // +X2C Operation 323
281 * Redirecciona segun la accion correspondiente
283 * @param string $accion Representa la accion a desarrollar
288 function guardarDatos($accion = grabar) // ~X2C
290 $accion = strtolower($accion);
293 $res = $this->_grabarDb();
296 $res = $this->_modificarDb();
299 $res = $this->_borrarDb();
306 // +X2C Operation 324
308 * Graba la informacion del perfil en base
313 function _grabarDb() // ~X2C
316 if (!$this->getId()) {
317 //No existe el perfil. Lo cargo por primera vez.
318 $idPerfil = $this->_db->nextId('perfil');
319 $this->setId($idPerfil);
321 //GRABO EN PERM_PERFIL_SIST
322 $res = $this->_guardarPermisos();
323 if (PEAR::isError($res)) {
328 'id_perfil' => $idPerfil,
329 'desc_perfil' => $this->getDescripcion(),
330 'responsable' => $this->getResponsable(),
332 $res = $this->_db->autoExecute('perfil', $datos, DB_AUTOQUERY_INSERT);
333 if (PEAR::isError($res)) {
337 //GRABO EN PERFIL_SIST
338 $datos = array ('id_perfil' => $this->getId(),
339 'id_sistema' => $_SESSION['samurai']['id_sistema'],
340 'tipo_perfil' => $this->getTipo(),
341 'responsable' => $this->getResponsable(),
343 $res = $this->_db->autoExecute('perfil_sist', $datos, DB_AUTOQUERY_INSERT);
347 // +X2C Operation 325
349 * Borra la informacion del perfil de la base
354 function _borrarDb() // ~X2C
356 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
357 //Verifico en perfil_sist_usuario
358 $tmp = $sql['verif_perfil_sist_usuario'];
359 $dbh = $this->_db->prepare($tmp);
360 $datos = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
361 $res = $this->_db->execute($dbh, $datos);
362 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && !$re['cuenta'] == 0) {
363 return new PEAR_Error("Hay usuarios asociados al perfil seleccionado");
365 //Borro perm_perfil_sist
366 $res = $this->_borrarPermisos();
367 if (PEAR::isError($res)) {
371 $tmp = $sql['borrar_perfil_sist'];
372 $dbh = $this->_db->prepare($tmp);
373 $datos = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
374 $res = $this->_db->execute($dbh, $datos);
375 if (PEAR::isError($res)) {
378 //Verifico en perfil_sist (Perfil asociado a otros sistemas)
379 $tmp = $sql['verif_perfil_sist'];
380 $dbh = $this->_db->prepare($tmp);
381 $datos = array ($this->getId());
382 $res = $this->_db->execute($dbh, $datos);
383 if (PEAR::isError($res)) {
386 if (($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) && $re['cuenta'] == 0) {
388 $tmp = $sql['borrar_perfil'];
389 $dbh = $this->_db->prepare($tmp);
390 $datos = array ($this->getId());
391 $res = $this->_db->execute($dbh, $datos);
392 if (PEAR::isError($res)) {
399 // +X2C Operation 326
404 function _modificarDb() // ~X2C
406 //Modifico la tabla perfil_sist
408 'tipo_perfil' => $this->getTipo(),
409 'responsable' => $this->getResponsable(),
411 $res = $this->_db->autoExecute('perfil_sist', $datos, DB_AUTOQUERY_UPDATE, 'id_perfil ='.$this->getId().' AND id_sistema='.$_SESSION['samurai']['id_sistema']);
412 if (PEAR::isError($res)) {
415 //Modifico la tabla perm_perfil_sist
416 $res = $this->_borrarPermisos();
417 if (PEAR::isError($res)) {
420 return $this->_guardarPermisos();
424 // +X2C Operation 338
426 * Devuleve un array con los identificadores de todos los perfiles.
428 * @param SAMURAI_DB &$db Base de Datos
429 * @param string $filtro Fltro por descripcion del perfil
430 * @param int $id_sistema Identificador del sistema
436 function _getIdPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
438 //OBTENGO LOS ID DE LA BASE
440 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
441 $consulta = $sql['obtener_id_perfiles'];
443 $consulta.= $sql['obtener_id_perfiles3'];
445 if ($filtro) { //Verifico si se paso un filtro
446 $tmp2 = $consulta.$sql['obtener_id_perfiles2'];
447 //Reemplazo el filtro por ##?##
448 $consulta = ereg_replace ('##FILTRO##', $filtro, $tmp2);
450 $dbh = $db->prepare($consulta);
452 $tmp[] = $id_sistema;
453 $res = $db->execute($dbh, $tmp);
456 $res = $db->execute($dbh);
458 while ($re = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
459 array_push($rta,$re['id_perfil']);
466 // +X2C Operation 339
468 * @param SAMURAI_DB &$db Base de datos
469 * @param string $filtro Filtro por nombre del perfil
470 * @param int $id_sistema Identificador del sistema
472 * @return array(Perfil)
476 function getPerfiles(&$db, $filtro = null, $id_sistema = null) // ~X2C
479 foreach (SAMURAI_Perfil::_getIdPerfiles($db, $filtro, $id_sistema) as $id) {
480 $tmp = new SAMURAI_Perfil($db,$id);
481 array_push($rta, $tmp);
487 // +X2C Operation 356
489 * Devuelve la informacion de los perfiles en un array.
491 * @param SAMURAI_DB $db Base de Datos
492 * @param string $filtro Filtro por descripcion del perfil
498 function getArrayPerfiles($db, $filtro = null) // ~X2C
500 //FORECHEO LO QUE ME DEVUELVA GET PERMISOS
502 foreach (SAMURAI_Perfil::getPerfiles($db, $filtro) as $perfil) {
503 $rta[$perfil->getId()] = $perfil->getDescripcion();
509 // +X2C Operation 358
511 * Valida la existencia de un perfil con la descripcion que se pasa por parametro. Devuelve true si existe y false si no existe.
513 * @param SAMURAI_DB $db Base de Datos
514 * @param string $descripcion Descripcion a comparar
520 function existePerfil($db, $descripcion) // ~X2C
522 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
523 $tmp = $sql['obtener_datos_perfil'].$sql['obtener_datos_perfil3'];
524 $dbh = $db->prepare($tmp);
525 $tmp = array ($descripcion);
526 $res = $db->execute($dbh,$tmp);
527 $re = $res->fetchRow();
537 // +X2C Operation 360
539 * Valida la existencia de una asociacion entre el perfil y el sistema seleccionado. Devuelve true si existe y false en caso contraro.
541 * @param SAMURAI_DB $db Base de Datos
542 * @param int $id_perfil Identificador del perfil con el cual hacer la comparacion
543 * @param int $id_sistema Identificador del sistema con el cual hacer la compararcion
549 function existeAsociacion($db, $id_perfil, $id_sistema) // ~X2C
551 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
552 $tmp = $sql['verificar_asociacion'];
553 $dbh = $db->prepare($tmp);
554 $tmp = array ($id_perfil, $id_sistema);
555 $res = $db->execute($dbh,$tmp);
556 $re = $res->fetchRow();
566 // +X2C Operation 362
568 * Se encarga de guardar la relacion entre perfiles - permisos - sistemas
573 function _guardarPermisos() // ~X2C
575 //VERIFICO QUE NO HAYA UN PERFIL CON LOS MISMOS PERMISOS YA ASIGNADO AL SISTEMA
576 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
577 $tmp = $sql['verif_perm_perfil_sist'];
578 $dbh = $this->_db->prepare($tmp);
579 $tmp = array ($_SESSION['samurai']['id_sistema']);
580 $res = $this->_db->execute($dbh,$tmp);
582 while ($re = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
583 $perm[$re['id_perfil']][] = $re['id_permiso'].'##'.$re['observaciones'];
585 foreach ($perm as $p) {
586 $rta1 = array_diff($p, $this->getPermisos());
587 $rta2 = array_diff($this->getPermisos(), $p);
588 if (!$rta1 && !$rta2) {
589 return new PEAR_Error("Ya existe un perfil con esos mismos permisos");
593 //GRABO EN PERM_PERFIL_SIST
594 $datos = array ('id_permiso', 'id_perfil', 'id_sistema', 'observaciones', 'responsable');
595 $re = $this->_db->autoPrepare('perm_perfil_sist', $datos, DB_AUTOQUERY_INSERT);
596 foreach ($this->getPermisos() as $permiso) {
597 list($id, $obs) = split ('##',$permiso);
598 $datos = array ($id, $this->getId(), $_SESSION['samurai']['id_sistema'], $obs, $this->getResponsable());
599 $res = $this->_db->execute($re, $datos);
600 if (PEAR::isError($res)) {
607 // +X2C Operation 363
609 * Borra la asociacion de un perfil de un sistema con sus permisos
614 function _borrarPermisos() // ~X2C
616 $sql = parse_ini_file(dirname(__FILE__) . '/Perfil/consultas.ini', true);
617 $tmp = $sql['borrar_permisos'];
618 $dbh = $this->_db->prepare($tmp);
619 $tmp = array ($this->getId(), $_SESSION['samurai']['id_sistema']);
620 return $this->_db->execute($dbh,$tmp);
624 } // -X2C Class :SAMURAI_Perfil