# Criação de usuários do GBS SMART

## Visão Geral

Este manual detalha o procedimento para criação de usuários do GBS SMART.

* Todo usuário deve ter uma conta no LDAP para login.
* Todas as configurações e dados do GBS Smart ficam dentro do schema *SMART*.
* A tabela `User` contém informações básicas sobre o usuário.
* A tabela `UserPermission` relaciona usuários com suas permissões através dos campos `UserId` e `PermissionId` (ver [Lista de Permissões Disponíveis](#lista-de-permissoes-disponiveis)).
* A tabela `UserStation` relaciona usuários com estações através dos campos `UserId` e `StationId`.

## Procedimento

### Criar um novo posto de trabalho na tabela *Station*

Para criar um novo posto de trabalho, ou estação, insira um registro na tabela `SMART.Station` preenchendo as seguintes colunas:

* `StationId`: Preencha com um ID incremental da estação.
* `Description`: Preencha com o nome da estação.
* `MandatoryConference`: Indique se as transações do posto deverão ir para conferência obrigatória (`1` para sim, `0` para não).
* `CityId`: Indique o ID da cidade em que a estação se localiza.

{% hint style="info" %}
O ID da estação (`StationId`) será usado nos próximos passos.
{% endhint %}

### Criar um novo usuário na tabela *User*

Para criar um novo usuário, insira um registro na tabela `SMART.User` preenchendo as seguintes colunas:

* `CPF`: Preencha com o CPF do usuário.
* `Username`: Preencha com o nome de usuário.
* `Admin`: Indique se o usuário é administrador (`1` para sim, `0` para não).
* `Active`: Indique se o usuário está ativo (`1` para ativo, `0` para inativo). O valor padrão é `1`.
* `Pguid` (opcional): Preencha com o PGUID do usuário na base biométrica.

{% hint style="info" %}
A coluna `UserId` é auto incremental. O ID do usuário será ser usado nos próximos passos.
{% endhint %}

### Atribuir permissões ao usuário na tabela *UserPermission*

Após criar o usuário, é preciso atribuir suas permissões. Para isso, insira um registro na tabela `SMART.UserPermission` para cada permissão que o usuário deve ter, relacionando o `UserId` com o `PermissionId`.

#### Lista de permissões disponíveis

O `PermissionId` está especificado na tabela a seguir:

<table><thead><tr><th width="120">PermissionId</th><th>Descrição</th><th width="150">PermissionName</th></tr></thead><tbody><tr><td>1</td><td>Permissão de listagem de cadastro civil, 2º via, etc.</td><td>CIVIL</td></tr><tr><td>2</td><td>Permissão de listagem de cadastro criminal.</td><td>CRIMINAL</td></tr><tr><td>3</td><td>Permissão de visualização da tela de layout.</td><td>LAYOUT</td></tr><tr><td>4</td><td>Permissão de visualização da tela de busca avançada.</td><td>PESQUISA</td></tr><tr><td>5</td><td>Permissão para realizar captura de biometrias.</td><td>CAPTURA</td></tr><tr><td>6</td><td>Permissão para realizar download de biometrias, impressão de protocolo e prontuário.</td><td>DOWNLOAD</td></tr><tr><td>7</td><td>Permissão para realizar conferência de biográficos.</td><td>CONFERENCE</td></tr><tr><td>8</td><td>Permissão para realizar a baixa de malotes.</td><td>PACKAGE</td></tr></tbody></table>

### Associar o usuário a uma estação na tabela *UserStation*

Insira um registro na tabela `UserStation` relacionando o `UserId` com o `StationId`. A estação deve estar configurada previamente na tabela `SMART.Station`, como explicado anteriormente.

* `UserId`: Utilize o `UserId` do usuário, como consta na tabela `SMART.User`.
* `StationId`: Preencha com o ID da estação à qual o usuário será associado, como consta na tabela `SMART.Station`.

### *Procedure* de criação de Usuário, alocação de posto e permissões

```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) -- Permissões separadas por vírgula (ex: '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;

	-- Insere um novo usuário na tabela User
	INSERT INTO `User` (`CPF`, `Username`, `Admin`, `Active`, `Pguid`)
	VALUES (p_CPF, p_Username, p_Admin, p_Active, p_Pguid);

	-- Obtém o último ID inserido na tabela User
	SET user_id = LAST_INSERT_ID();

	-- Loop para inserir as permissões
	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);

		-- Inserir permissão na tabela 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;

	-- Insere associação do novo usuário com uma estação na tabela UserStation
	INSERT INTO `UserStation` (`UserId`, `StationId`)
	VALUES (user_id, p_StationId);
END //
DELIMITER ;
```

#### Exemplo de chamada do *procedure*

**Argumentos:**

* **CPF** (somente números)
* **Username** (igual ao LDAP)
* **Admin** (`0`: false, `1`: true)
* **Ativo** (`0`: false, `1`: true)
* **PGUID** do GBDS (procurar CPF no GBDS)
* **ID da estação**
* **Permissões** separadas por vírgula

Chamar o procedimento armazenado para inserir um novo usuário:

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

O exemplo acima cria um novo usuário com CPF `123.456.789-00`, nome de usuário `new_user`, não administrador, ativo, sem PGUID, associado à estação com ID `1` e com as permissões `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/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.
