# Creación de usuarios de 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`.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.griaule.com/gbs/es/componentes-web/smart_createuser.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
