# Creación de usuarios del GBS SMART

## Visión general

Este manual detalla el procedimiento para la creación de usuarios de GBS SMART.

* Todo usuario debe tener una cuenta en el LDAP para iniciar sesión.
* Todas las configuraciones y datos de GBS Smart se encuentran dentro del esquema *SMART*.
* La tabla `User` contiene información básica sobre el usuario.
* La tabla `UserPermission` relaciona usuarios con sus permisos a través de los campos `UserId` y `PermissionId` (ver [Lista de permisos disponibles](#lista-de-permissoes-disponiveis)).
* La tabla `UserStation` relaciona usuarios con estaciones a través de los campos `UserId` y `StationId`.

## Procedimiento

### Crear un nuevo puesto de trabajo en la tabla *Station*

Para crear un nuevo puesto de trabajo, o estación, inserte un registro en la tabla `SMART.Station` llenando las siguientes columnas:

* `StationId`: Rellene con un ID incremental de la estación.
* `Description`: Rellene con el nombre de la estación.
* `MandatoryConference`: Indique si las transacciones del puesto deberán ir a conferencia obligatoria (`1` para sí, `0` para no).
* `CityId`: Indique el ID de la ciudad en la que se ubica la estación.

{% hint style="info" %}
El ID de la estación (`StationId`) se usará en los próximos pasos.
{% endhint %}

### Crear un nuevo usuario en la tabla *User*

Para crear un nuevo usuario, inserte un registro en la tabla `SMART.User` llenando las siguientes columnas:

* `CPF`: Rellene con el CPF del usuario.
* `Username`: Rellene con el nombre de usuario.
* `Admin`: Indique si el usuario es administrador (`1` para sí, `0` para no).
* `Active`: Indique si el usuario está activo (`1` para activo, `0` para inactivo). El valor predeterminado es `1`.
* `Pguid` (opcional): Rellene con el PGUID del usuario en la base biométrica.

{% hint style="info" %}
La columna `UserId` es auto incremental. El ID del usuario será utilizado en los próximos pasos.
{% endhint %}

### Asignar permisos al usuario en la tabla *UserPermission*

Después de crear el usuario, es necesario asignar sus permisos. Para ello, inserte un registro en la tabla `SMART.UserPermission` por cada permiso que el usuario debe tener, relacionando el `UserId` con el `PermissionId`.

#### Lista de permisos disponibles

El `PermissionId` está especificado en la siguiente tabla:

<table><thead><tr><th width="120">PermissionId</th><th>Descripción</th><th width="150">PermissionName</th></tr></thead><tbody><tr><td>1</td><td>Permiso de listado de registro civil, 2ª vía, etc.</td><td>CIVIL</td></tr><tr><td>2</td><td>Permiso de listado de registro criminal.</td><td>CRIMINAL</td></tr><tr><td>3</td><td>Permiso de visualización de la pantalla de layout.</td><td>LAYOUT</td></tr><tr><td>4</td><td>Permiso de visualización de la pantalla de búsqueda avanzada.</td><td>PESQUISA</td></tr><tr><td>5</td><td>Permiso para realizar captura de biometrias.</td><td>CAPTURA</td></tr><tr><td>6</td><td>Permiso para realizar descarga de biometrias, impresión de protocolo y expediente.</td><td>DOWNLOAD</td></tr><tr><td>7</td><td>Permiso para realizar verificación de biográficos.</td><td>CONFERENCE</td></tr><tr><td>8</td><td>Permiso para realizar la baja de malotes.</td><td>PACKAGE</td></tr></tbody></table>

### Asociar el usuario a una estación en la tabla *UserStation*

Inserte un registro en la tabla `UserStation` relacionando el `UserId` con el `StationId`. La estación debe estar configurada previamente en la tabla `SMART.Station`, como se explicó anteriormente.

* `UserId`: Utilice el `UserId` del usuario, tal como consta en la tabla `SMART.User`.
* `StationId`: Rellene con el ID de la estación a la cual el usuario será asociado, tal como consta en la tabla `SMART.Station`.

### *Procedure* de creación de Usuario, asignación de puesto y permisos

```sql
DELIMITER //
CREATE PROCEDURE InsertNewUser(
	IN p_CPF VARCHAR(14),
	IN p_Username VARCHAR(64),
	IN p_Admin TINYINT(1),
	IN p_Active TINYINT(1),
	IN p_Pguid VARCHAR(100),
	IN p_StationId INT,
	IN p_Permissions VARCHAR(100) -- Permisos separados por comas (ej: '1,4,5,6,7')
)
BEGIN
	DECLARE user_id INT;
	DECLARE perm_pos INT DEFAULT 1;
	DECLARE perm_length INT;
	DECLARE current_permission VARCHAR(10);
	DECLARE done INT DEFAULT 0;

	-- Inserta un nuevo usuario en la tabla User
	INSERT INTO `User` (`CPF`, `Username`, `Admin`, `Active`, `Pguid`)
	VALUES (p_CPF, p_Username, p_Admin, p_Active, p_Pguid);

	-- Obtiene el último ID insertado en la tabla User
	SET user_id = LAST_INSERT_ID();

	-- Bucle para insertar los permisos
	read_loop: LOOP
		SET perm_length = LOCATE(',', p_Permissions, perm_pos) - perm_pos;
		IF perm_length < 0 THEN
			SET perm_length = LENGTH(p_Permissions) - perm_pos + 1;
			SET done = 1;
		END IF;
		SET current_permission = SUBSTRING(p_Permissions, perm_pos, perm_length);

		-- Insertar permiso en la tabla UserPermission
		INSERT INTO `UserPermission` (`UserId`, `PermissionId`)
		VALUES (user_id, current_permission);

		IF done = 1 THEN
			LEAVE read_loop;
		END IF;

		SET perm_pos = LOCATE(',', p_Permissions, perm_pos) + 1;
	END LOOP read_loop;

	-- Inserta asociación del nuevo usuario con una estación en la tabla UserStation
	INSERT INTO `UserStation` (`UserId`, `StationId`)
	VALUES (user_id, p_StationId);
END //
DELIMITER ;
```

#### Ejemplo de llamada al *procedure*

**Argumentos:**

* **CPF** (solo números)
* **Username** (igual al LDAP)
* **Admin** (`0`: false, `1`: true)
* **Activo** (`0`: false, `1`: true)
* **PGUID** del GBDS (buscar CPF en el GBDS)
* **ID de la estación**
* **Permisos** separados por comas

Llamar al procedimiento almacenado para insertar un nuevo usuario:

```sql
CALL InsertNewUser('12345678900', 'new_user', 0, 1, NULL, 1,'1,4,5,6,7');
```

El ejemplo anterior crea un nuevo usuario con CPF `123.456.789-00`, nombre de usuario `new_user`, no administrador, activo, sin PGUID, asociado a la estación con ID `1` y con los permisos `1,4,5,6,7`.
