# Design das Novas Tabelas do Banco de Dados

Este documento detalha o design das novas tabelas do banco de dados MySQL para o Módulo de Gestão do Espaço Digital, levando em consideração o esquema de banco de dados existente e os requisitos funcionais.

## Requisitos do Módulo de Gestão do Espaço Digital

Baseado na imagem fornecida, os requisitos são:

1.  **Controle de uso de computadores institucionais**
2.  **Monitoramento de tempo de acesso e quantidade de impressões**
3.  **Chat integrado para suporte ao usuário**
4.  **Restrição de acesso a sites e conteúdos inadequados**

## Análise do Esquema Existente

O esquema existente (`schema.sql`) contém diversas tabelas, algumas das quais podem ser relevantes ou servir de base para o novo módulo. As tabelas notáveis incluem `users`, `permissions`, `userpermissions`, que podem ser reutilizadas para autenticação e autorização.

## Novas Tabelas Propostas

Para atender aos requisitos do Módulo de Gestão do Espaço Digital, as seguintes tabelas são propostas:

### 1. `computers`

Esta tabela armazenará informações sobre os computadores institucionais.

| Campo             | Tipo                      | Nulo | Chave      | Descrição                               |
| :---------------- | :------------------------ | :--- | :--------- | :-------------------------------------- |
| `id`              | INT UNSIGNED AUTO_INCREMENT | NÃO  | PRIMARY KEY | Identificador único do computador       |
| `name`            | VARCHAR(120)              | NÃO  |            | Nome ou identificador do computador     |
| `location`        | VARCHAR(120)              | SIM  |            | Localização física do computador        |
| `ip_address`      | VARCHAR(45)               | SIM  |            | Endereço IP do computador               |
| `mac_address`     | VARCHAR(17)               | SIM  | UNIQUE     | Endereço MAC do computador (se aplicável) |
| `description`     | TEXT                      | SIM  |            | Descrição adicional do computador       |
| `created_at`      | TIMESTAMP                 | NÃO  |            | Data e hora de criação do registro      |
| `updated_at`      | TIMESTAMP                 | NÃO  |            | Data e hora da última atualização       |

### 2. `computer_sessions`

Esta tabela registrará as sessões de uso dos computadores.

| Campo             | Tipo                      | Nulo | Chave      | Descrição                               |
| :---------------- | :------------------------ | :--- | :--------- | :-------------------------------------- |
| `id`              | INT UNSIGNED AUTO_INCREMENT | NÃO  | PRIMARY KEY | Identificador único da sessão           |
| `computer_id`     | INT UNSIGNED              | NÃO  | FOREIGN KEY | ID do computador (`computers.id`)       |
| `user_id`         | INT UNSIGNED              | NÃO  | FOREIGN KEY | ID do usuário (`users.id`)              |
| `login_time`      | DATETIME                  | NÃO  |            | Data e hora de início da sessão         |
| `logout_time`     | DATETIME                  | SIM  |            | Data e hora de término da sessão        |
| `duration_minutes`| INT                       | SIM  |            | Duração da sessão em minutos            |
| `created_at`      | TIMESTAMP                 | NÃO  |            | Data e hora de criação do registro      |
| `updated_at`      | TIMESTAMP                 | NÃO  |            | Data e hora da última atualização       |

### 3. `print_jobs`

Esta tabela registrará os trabalhos de impressão.

| Campo             | Tipo                      | Nulo | Chave      | Descrição                               |
| :---------------- | :------------------------ | :--- | :--------- | :-------------------------------------- |
| `id`              | INT UNSIGNED AUTO_INCREMENT | NÃO  | PRIMARY KEY | Identificador único do trabalho de impressão |
| `session_id`      | INT UNSIGNED              | NÃO  | FOREIGN KEY | ID da sessão (`computer_sessions.id`)   |
| `user_id`         | INT UNSIGNED              | NÃO  | FOREIGN KEY | ID do usuário (`users.id`)              |
| `computer_id`     | INT UNSIGNED              | NÃO  | FOREIGN KEY | ID do computador (`computers.id`)       |
| `file_name`       | VARCHAR(255)              | NÃO  |            | Nome do arquivo impresso                |
| `pages`           | INT                       | NÃO  |            | Número de páginas impressas             |
| `print_time`      | DATETIME                  | NÃO  |            | Data e hora da impressão                 |
| `status`          | VARCHAR(50)               | NÃO  |            | Status do trabalho (e.g., 'concluído', 'erro') |
| `created_at`      | TIMESTAMP                 | NÃO  |            | Data e hora de criação do registro      |
| `updated_at`      | TIMESTAMP                 | NÃO  |            | Data e hora da última atualização       |

### 4. `chat_messages`

Esta tabela armazenará as mensagens do chat de suporte.

| Campo             | Tipo                      | Nulo | Chave      | Descrição                               |
| :---------------- | :------------------------ | :--- | :--------- | :-------------------------------------- |
| `id`              | INT UNSIGNED AUTO_INCREMENT | NÃO  | PRIMARY KEY | Identificador único da mensagem         |
| `sender_id`       | INT UNSIGNED              | NÃO  | FOREIGN KEY | ID do remetente (`users.id`)            |
| `receiver_id`     | INT UNSIGNED              | SIM  | FOREIGN KEY | ID do destinatário (`users.id`)         |
| `message`         | TEXT                      | NÃO  |            | Conteúdo da mensagem                    |
| `timestamp`       | DATETIME                  | NÃO  |            | Data e hora do envio da mensagem        |
| `read_at`         | DATETIME                  | SIM  |            | Data e hora em que a mensagem foi lida  |
| `created_at`      | TIMESTAMP                 | NÃO  |            | Data e hora de criação do registro      |
| `updated_at`      | TIMESTAMP                 | NÃO  |            | Data e hora da última atualização       |

### 5. `chat_conversations`

Esta tabela agrupará as mensagens em conversas.

| Campo             | Tipo                      | Nulo | Chave      | Descrição                               |
| :---------------- | :------------------------ | :--- | :--------- | :-------------------------------------- |
| `id`              | INT UNSIGNED AUTO_INCREMENT | NÃO  | PRIMARY KEY | Identificador único da conversa         |
| `user_id`         | INT UNSIGNED              | NÃO  | FOREIGN KEY | ID do usuário que iniciou a conversa (`users.id`) |
| `agent_id`        | INT UNSIGNED              | SIM  | FOREIGN KEY | ID do agente de suporte (`users.id`)    |
| `status`          | VARCHAR(50)               | NÃO  |            | Status da conversa (e.g., 'aberta', 'fechada') |
| `started_at`      | DATETIME                  | NÃO  |            | Data e hora de início da conversa       |
| `closed_at`       | DATETIME                  | SIM  |            | Data e hora de fechamento da conversa   |
| `created_at`      | TIMESTAMP                 | NÃO  |            | Data e hora de criação do registro      |
| `updated_at`      | TIMESTAMP                 | NÃO  |            | Data e hora da última atualização       |

### 6. `blocked_websites`

Esta tabela armazenará os sites bloqueados.

| Campo             | Tipo                      | Nulo | Chave      | Descrição                               |
| :---------------- | :------------------------ | :--- | :--------- | :-------------------------------------- |
| `id`              | INT UNSIGNED AUTO_INCREMENT | NÃO  | PRIMARY KEY | Identificador único do site bloqueado   |
| `url_pattern`     | VARCHAR(255)              | NÃO  | UNIQUE     | Padrão de URL a ser bloqueado (e.g., `*.facebook.com`) |
| `description`     | TEXT                      | SIM  |            | Descrição do motivo do bloqueio         |
| `created_at`      | TIMESTAMP                 | NÃO  |            | Data e hora de criação do registro      |
| `updated_at`      | TIMESTAMP                 | NÃO  |            | Data e hora da última atualização       |

### 7. `access_logs`

Esta tabela registrará as tentativas de acesso a sites, incluindo os bloqueados.

| Campo             | Tipo                      | Nulo | Chave      | Descrição                               |
| :---------------- | :------------------------ | :--- | :--------- | :-------------------------------------- |
| `id`              | INT UNSIGNED AUTO_INCREMENT | NÃO  | PRIMARY KEY | Identificador único do log de acesso    |
| `user_id`         | INT UNSIGNED              | NÃO  | FOREIGN KEY | ID do usuário (`users.id`)              |
| `computer_id`     | INT UNSIGNED              | NÃO  | FOREIGN KEY | ID do computador (`computers.id`)       |
| `url`             | VARCHAR(2048)             | NÃO  |            | URL acessada                            |
| `access_time`     | DATETIME                  | NÃO  |            | Data e hora da tentativa de acesso      |
| `blocked`         | TINYINT(1)                | NÃO  |            | Indica se o acesso foi bloqueado (0=não, 1=sim) |
| `blocked_reason`  | TEXT                      | SIM  |            | Motivo do bloqueio (se aplicável)       |
| `created_at`      | TIMESTAMP                 | NÃO  |            | Data e hora de criação do registro      |
| `updated_at`      | TIMESTAMP                 | NÃO  |            | Data e hora da última atualização       |

## Relacionamentos entre as Tabelas

As novas tabelas se relacionarão com a tabela `users` existente e entre si da seguinte forma:

*   `computers.id` (PK) <-> `computer_sessions.computer_id` (FK)
*   `users.id` (PK) <-> `computer_sessions.user_id` (FK)
*   `computer_sessions.id` (PK) <-> `print_jobs.session_id` (FK)
*   `users.id` (PK) <-> `print_jobs.user_id` (FK)
*   `computers.id` (PK) <-> `print_jobs.computer_id` (FK)
*   `users.id` (PK) <-> `chat_messages.sender_id` (FK)
*   `users.id` (PK) <-> `chat_messages.receiver_id` (FK)
*   `chat_conversations.id` (PK) <-> `chat_messages.conversation_id` (FK) (Adicionar `conversation_id` na tabela `chat_messages`)
*   `users.id` (PK) <-> `chat_conversations.user_id` (FK)
*   `users.id` (PK) <-> `chat_conversations.agent_id` (FK)
*   `users.id` (PK) <-> `access_logs.user_id` (FK)
*   `computers.id` (PK) <-> `access_logs.computer_id` (FK)

## Considerações Adicionais

*   **Tabela `users` existente**: A tabela `users` existente será utilizada para gerenciar os usuários do sistema. É importante garantir que ela contenha os campos necessários para identificação de usuários e, possivelmente, um campo para indicar o tipo de usuário (e.g., 'aluno', 'professor', 'administrador', 'agente de suporte').
*   **Índices**: Índices serão criados nas chaves estrangeiras para otimização de consultas.
*   **Tipos de Dados**: Os tipos de dados foram escolhidos para otimizar o armazenamento e a performance, considerando as necessidades de cada campo.
*   **Timestamps**: `created_at` e `updated_at` são campos padrão para auditoria e rastreamento de alterações.

Este design inicial pode ser ajustado conforme a evolução dos requisitos e a integração com o sistema existente.

