Files
RRBEC/doc/Banco de dados/Modelagem de Banco de Dados.md

424 lines
16 KiB
Markdown

# Modelagem de Banco de Dados para BarApp, GarçomApp e Gestão do Bar
Este documento apresenta a modelagem de banco de dados proposta para suportar as funcionalidades dos aplicativos BarApp (cliente), GarçomApp (interno) e o novo Aplicativo de Gestão do Bar, incluindo as entidades, seus atributos e os relacionamentos entre elas.
## 1. Visão Geral do Modelo
O modelo de dados é projetado para ser relacional, utilizando chaves primárias (PK) e chaves estrangeiras (FK) para estabelecer os relacionamentos. Os tipos de dados são genéricos e devem ser adaptados ao SGBD (Sistema Gerenciador de Banco de Dados) escolhido (e.g., PostgreSQL, MySQL, SQL Server).
## 2. Tabelas e Atributos
### 2.1. `Usuarios` (Clientes do BarApp)
Armazena as informações dos usuários que utilizam o aplicativo cliente.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_usuario`|UUID|PK (Chave Primária)|
|`nome_completo`|VARCHAR(255)|NOT NULL|
|`email`|VARCHAR(255)|NOT NULL, UNIQUE|
|`senha_hash`|VARCHAR(255)|NOT NULL (Armazenar hash da senha)|
|`id_google`|VARCHAR(255)|NULLABLE, UNIQUE (Para login social)|
|`data_cadastro`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`ultimo_login`|TIMESTAMP|NULLABLE|
|`limite_tickets_produto`|INTEGER|DEFAULT 10 (Regra de negócio: limite de tickets por produto)|
### 2.2. `Garcons` (Usuários do GarçomApp)
Armazena as informações dos funcionários do bar que utilizam o aplicativo interno.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_garcom`|UUID|PK|
|`nome_completo`|VARCHAR(255)|NOT NULL|
|`usuario`|VARCHAR(50)|NOT NULL, UNIQUE (Nome de usuário para login)|
|`senha_hash`|VARCHAR(255)|NOT NULL (Armazenar hash da senha)|
|`data_cadastro`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`ativo`|BOOLEAN|NOT NULL, DEFAULT TRUE|
### 2.3. `Produtos`
Armazena os itens do cardápio do bar.
| Atributo | Tipo de Dado | Restrições/Observações |
| ---------------- | -------------- | --------------------------------------------------------- |
| `id_produto` | UUID | PK |
| `nome` | VARCHAR(255) | NOT NULL |
| `descricao` | TEXT | NULLABLE |
| `preco` | DECIMAL(10, 2) | NOT NULL |
| `custo_unitario` | DECIMAL(10, 2) | NULLABLE (Para cálculo de lucratividade) |
| `estoque_atual` | INTEGER | NOT NULL, DEFAULT 0 |
| `estoque_minimo` | INTEGER | DEFAULT 0 (Para alertas de estoque baixo) |
| `url_imagem` | VARCHAR(255) | NULLABLE |
| `disponivel` | BOOLEAN | NOT NULL, DEFAULT TRUE (Indica se está no cardápio ativo) |
| `id_categoria` | UUID | FK para `CategoriasProduto` |
### 2.4. `CategoriasProduto`
Armazena as categorias dos produtos do cardápio.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_categoria`|UUID|PK|
|`nome_categoria`|VARCHAR(100)|NOT NULL, UNIQUE|
### 2.5. `Tickets`
Armazena os tickets comprados pelos clientes.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_ticket`|UUID|PK|
|`id_usuario`|UUID|FK para `Usuarios` (Usuário que comprou o ticket)|
|`id_produto`|UUID|FK para `Produtos`|
|`data_compra`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`data_validade`|TIMESTAMP|NULLABLE (Prazo de validade do ticket)|
|`status`|ENUM|NOT NULL ('comprado', 'utilizado', 'transferido')|
|`data_uso`|TIMESTAMP|NULLABLE (Data e hora em que o ticket foi utilizado)|
|`id_comanda_origem`|UUID|NULLABLE, FK para `Comandas` (Se o ticket foi gerado de uma comanda paga)|
### 2.6. `HistoricoTickets`
Registra o histórico de eventos de cada ticket (compra, uso, transferência).
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_historico`|UUID|PK|
|`id_ticket`|UUID|FK para `Tickets`|
|`tipo_evento`|ENUM|NOT NULL ('compra', 'uso', 'transferencia_enviada', 'transferencia_recebida')|
|`data_evento`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`id_usuario_origem`|UUID|NULLABLE, FK para `Usuarios` (Usuário que enviou/usou)|
|`id_usuario_destino`|UUID|NULLABLE, FK para `Usuarios` (Usuário que recebeu)|
|`observacoes`|TEXT|NULLABLE|
### 2.7. `CestasCompras`
Representa a cesta de compras temporária de um usuário.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_cesta`|UUID|PK|
|`id_usuario`|UUID|FK para `Usuarios`|
|`data_criacao`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`status`|ENUM|NOT NULL ('ativa', 'finalizada', 'cancelada')|
### 2.8. `ItensCesta`
Armazena os produtos dentro de uma cesta de compras.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_item_cesta`|UUID|PK|
|`id_cesta`|UUID|FK para `CestasCompras`|
|`id_produto`|UUID|FK para `Produtos`|
|`quantidade`|INTEGER|NOT NULL, > 0|
|`preco_unitario`|DECIMAL(10, 2)|NOT NULL|
### 2.9. `MetodosPagamento`
Tabela de lookup para os métodos de pagamento aceitos.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_metodo`|INTEGER|PK|
|`nome_metodo`|VARCHAR(50)|NOT NULL, UNIQUE ('Pix', 'Credito', 'Debito')|
### 2.10. `CartoesCadastrados`
Armazena os tokens de cartões de crédito/débito para pagamentos futuros. **Importante: Nunca armazenar dados sensíveis do cartão diretamente.**
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_cartao`|UUID|PK|
|`id_usuario`|UUID|FK para `Usuarios`|
|`ultimos_digitos`|VARCHAR(4)|NULLABLE (Para exibição ao usuário)|
|`bandeira`|VARCHAR(50)|NULLABLE|
|`token_pagamento`|VARCHAR(255)|NOT NULL (Token gerado pelo gateway de pagamento)|
|`data_cadastro`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`ativo`|BOOLEAN|NOT NULL, DEFAULT TRUE|
### 2.11. `Eventos`
Armazena as informações dos eventos do bar.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_evento`|UUID|PK|
|`nome_evento`|VARCHAR(255)|NOT NULL|
|`data_evento`|TIMESTAMP|NOT NULL|
|`descricao`|TEXT|NULLABLE|
|`preco_ingresso`|DECIMAL(10, 2)|NOT NULL|
|`url_imagem`|VARCHAR(255)|NULLABLE|
|`ativo`|BOOLEAN|NOT NULL, DEFAULT TRUE|
### 2.12. `Ingressos`
Armazena os ingressos comprados pelos clientes para eventos.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_ingresso`|UUID|PK|
|`id_usuario`|UUID|FK para `Usuarios`|
|`id_evento`|UUID|FK para `Eventos`|
|`nome_ingresso`|VARCHAR(255)|NULLABLE (Ex: "Ingresso Pista", "Ingresso VIP")|
|`data_compra`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`data_uso`|TIMESTAMP|NULLABLE (Data e hora em que o ingresso foi validado)|
|`status`|ENUM|NOT NULL ('comprado', 'utilizado')|
### 2.13. `FilaKaraoke`
Gerencia a fila de pessoas para o karaokê.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_fila_karaoke`|UUID|PK|
|`nome_cantor`|VARCHAR(255)|NOT NULL|
|`nome_musica`|VARCHAR(255)|NULLABLE|
|`posicao`|INTEGER|NOT NULL, UNIQUE (Ordem na fila)|
|`data_entrada`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`status`|ENUM|NOT NULL ('na_fila', 'cantando', 'cantou')|
### 2.14. `Comandas`
Armazena as comandas de consumo dos clientes.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_comanda`|UUID|PK|
|`id_garcom`|UUID|FK para `Garcons` (Garçom que abriu a comanda)|
|`id_usuario_cliente`|UUID|NULLABLE, FK para `Usuarios` (Se o cliente for identificado no app)|
|`numero_mesa`|VARCHAR(50)|NULLABLE|
|`nome_cliente`|VARCHAR(255)|NULLABLE (Nome do cliente, se não for usuário do app)|
|`data_abertura`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`data_fechamento`|TIMESTAMP|NULLABLE|
|`status`|ENUM|NOT NULL ('aberta', 'aguardando_pagamento', 'paga', 'fechada')|
|`valor_total`|DECIMAL(10, 2)|NOT NULL, DEFAULT 0.00|
### 2.15. `ItensComanda`
Armazena os produtos adicionados a cada comanda.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_item_comanda`|UUID|PK|
|`id_comanda`|UUID|FK para `Comandas`|
|`id_produto`|UUID|FK para `Produtos`|
|`quantidade`|INTEGER|NOT NULL, > 0|
|`preco_unitario`|DECIMAL(10, 2)|NOT NULL|
|`status_cozinha`|ENUM|NOT NULL ('na_fila', 'preparando', 'pronto', 'entregue')|
|`observacoes`|TEXT|NULLABLE|
### 2.16. `PagamentosComanda`
Registra os pagamentos efetuados para as comandas (total ou parcial).
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_pagamento_comanda`|UUID|PK|
|`id_comanda`|UUID|FK para `Comandas`|
|`id_usuario`|UUID|NULLABLE, FK para `Usuarios` (Se pago via BarApp)|
|`valor_pago`|DECIMAL(10, 2)|NOT NULL|
|`id_metodo_pagamento`|INTEGER|FK para `MetodosPagamento`|
|`data_pagamento`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`tipo_pagamento`|ENUM|NOT NULL ('total', 'parcial')|
|`id_transacao_gateway`|VARCHAR(255)|NULLABLE (ID da transação no gateway de pagamento)|
### 2.17. `Notificacoes`
Armazena as notificações para usuários (clientes ou garçons).
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_notificacao`|UUID|PK|
|`id_usuario_destino`|UUID|NOT NULL (FK para `Usuarios` ou `Garcons` ou `Funcionarios`)|
|`tipo_usuario_destino`|ENUM|NOT NULL ('cliente', 'garcom', 'gestao')|
|`tipo_notificacao`|ENUM|NOT NULL ('pagamento_comanda', 'pedido_pronto', 'transferencia_ticket_recebida', 'estoque_baixo', 'novo_cadastro_cliente', 'novo_evento_criado')|
|`mensagem`|TEXT|NOT NULL|
|`data_envio`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`lida`|BOOLEAN|NOT NULL, DEFAULT FALSE|
|`referencia_id`|UUID|NULLABLE (ID do ticket, comanda, etc. relacionado)|
### 2.18. `Funcionarios` (Usuários do Aplicativo de Gestão)
Armazena informações de todos os funcionários, incluindo aqueles que usam o GarçomApp e os administrativos.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_funcionario`|UUID|PK|
|`nome_completo`|VARCHAR(255)|NOT NULL|
|`cpf`|VARCHAR(14)|NOT NULL, UNIQUE|
|`data_contratacao`|DATE|NOT NULL|
|`salario_base`|DECIMAL(10, 2)|NOT NULL|
|`cargo`|VARCHAR(100)|NOT NULL|
|`dados_bancarios`|TEXT|NULLABLE (Informações para pagamento, criptografadas)|
|`usuario_sistema`|VARCHAR(50)|NULLABLE, UNIQUE (Para login no app de gestão)|
|`senha_hash_sistema`|VARCHAR(255)|NULLABLE (Hash da senha para login no app de gestão)|
|`ativo`|BOOLEAN|NOT NULL, DEFAULT TRUE|
|`id_garcom_associado`|UUID|NULLABLE, FK para `Garcons` (Se for também um garçom)|
### 2.19. `PagamentosSalario`
Registra os pagamentos de salário efetuados aos funcionários.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_pagamento`|UUID|PK|
|`id_funcionario`|UUID|FK para `Funcionarios`|
|`valor_bruto`|DECIMAL(10, 2)|NOT NULL|
|`descontos`|DECIMAL(10, 2)|NOT NULL, DEFAULT 0.00|
|`valor_liquido`|DECIMAL(10, 2)|NOT NULL|
|`data_pagamento`|DATE|NOT NULL|
|`periodo_referencia`|VARCHAR(20)|NOT NULL (Ex: "2025-05")|
|`holerite_url`|VARCHAR(255)|NULLABLE (URL para PDF do holerite, se gerado)|
### 2.20. `Fornecedores`
Armazena informações dos fornecedores de mercadorias.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_fornecedor`|UUID|PK|
|`nome_fantasia`|VARCHAR(255)|NOT NULL|
|`razao_social`|VARCHAR(255)|NULLABLE|
|`cnpj`|VARCHAR(18)|NULLABLE, UNIQUE|
|`contato`|VARCHAR(255)|NULLABLE (Telefone, E-mail)|
|`endereco`|TEXT|NULLABLE|
### 2.21. `EntradasMercadoria`
Registra as entradas de mercadorias no estoque.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_entrada`|UUID|PK|
|`id_fornecedor`|UUID|FK para `Fornecedores`|
|`data_entrada`|TIMESTAMP|NOT NULL, DEFAULT CURRENT_TIMESTAMP|
|`numero_nota_fiscal`|VARCHAR(100)|NULLABLE|
|`valor_total`|DECIMAL(10, 2)|NOT NULL|
|`observacoes`|TEXT|NULLABLE|
|`id_funcionario_responsavel`|UUID|FK para `Funcionarios` (Quem registrou a entrada)|
### 2.22. `ItensEntradaMercadoria`
Detalha os itens de cada entrada de mercadoria.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_item_entrada`|UUID|PK|
|`id_entrada`|UUID|FK para `EntradasMercadoria`|
|`id_produto`|UUID|FK para `Produtos`|
|`quantidade`|INTEGER|NOT NULL, > 0|
|`custo_unitario_compra`|DECIMAL(10, 2)|NOT NULL (Custo na data da compra)|
### 2.23. `Permissoes`
Define os tipos de permissão para os usuários do aplicativo de gestão.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_permissao`|UUID|PK|
|`nome_permissao`|VARCHAR(100)|NOT NULL, UNIQUE (Ex: 'gerenciar_produtos', 'ver_dashboard_vendas')|
|`descricao`|TEXT|NULLABLE|
### 2.24. `FuncionarioPermissoes`
Tabela de ligação para atribuir permissões a funcionários.
|Atributo|Tipo de Dado|Restrições/Observações|
|---|---|---|
|`id_funcionario_permissao`|UUID|PK|
|`id_funcionario`|UUID|FK para `Funcionarios`|
|`id_permissao`|UUID|FK para `Permissoes`|
## 3. Relacionamentos
Abaixo estão os principais relacionamentos entre as tabelas, incluindo as novas adições:
- **`Usuarios`**
- `Usuarios.id_usuario` 1:N `Tickets.id_usuario`
- `Usuarios.id_usuario` 1:N `CartoesCadastrados.id_usuario`
- `Usuarios.id_usuario` 1:N `Ingressos.id_usuario`
- `Usuarios.id_usuario` 1:N `HistoricoTickets.id_usuario_origem`
- `Usuarios.id_usuario` 1:N `HistoricoTickets.id_usuario_destino`
- `Usuarios.id_usuario` 1:N `CestasCompras.id_usuario`
- `Usuarios.id_usuario` 1:N `Comandas.id_usuario_cliente` (Opcional)
- `Usuarios.id_usuario` 1:N `PagamentosComanda.id_usuario` (Opcional)
- `Usuarios.id_usuario` 1:N `Notificacoes.id_usuario_destino` (quando `tipo_usuario_destino` é 'cliente')
- **`Garcons`**
- `Garcons.id_garcom` 1:N `Comandas.id_garcom`
- `Garcons.id_garcom` 1:N `Notificacoes.id_usuario_destino` (quando `tipo_usuario_destino` é 'garcom')
- `Garcons.id_garcom` 1:1 `Funcionarios.id_garcom_associado` (Opcional, se um garçom também for um funcionário de gestão)
- **`Produtos`**
- `Produtos.id_produto` 1:N `Tickets.id_produto`
- `Produtos.id_produto` 1:N `ItensCesta.id_produto`
- `Produtos.id_produto` 1:N `ItensComanda.id_produto`
- `Produtos.id_produto` 1:N `ItensEntradaMercadoria.id_produto`
- `Produtos.id_categoria` N:1 `CategoriasProduto.id_categoria`
- **`Tickets`**
- `Tickets.id_ticket` 1:N `HistoricoTickets.id_ticket`
- **`CestasCompras`**
- `CestasCompras.id_cesta` 1:N `ItensCesta.id_cesta`
- **`Eventos`**
- `Eventos.id_evento` 1:N `Ingressos.id_evento`
- **`Comandas`**
- `Comandas.id_comanda` 1:N `ItensComanda.id_comanda`
- `Comandas.id_comanda` 1:N `PagamentosComanda.id_comanda`
- `Comandas.id_comanda` 1:N `Tickets.id_comanda_origem` (Opcional)
- **`MetodosPagamento`**
- `MetodosPagamento.id_metodo` 1:N `PagamentosComanda.id_metodo_pagamento`
- **`Funcionarios`**
- `Funcionarios.id_funcionario` 1:N `PagamentosSalario.id_funcionario`
- `Funcionarios.id_funcionario` 1:N `EntradasMercadoria.id_funcionario_responsavel`
- `Funcionarios.id_funcionario` 1:N `FuncionarioPermissoes.id_funcionario`
- `Funcionarios.id_funcionario` 1:N `Notificacoes.id_usuario_destino` (quando `tipo_usuario_destino` é 'gestao')
- **`Fornecedores`**
- `Fornecedores.id_fornecedor` 1:N `EntradasMercadoria.id_fornecedor`
- **`EntradasMercadoria`**
- `EntradasMercadoria.id_entrada` 1:N `ItensEntradaMercadoria.id_entrada`
- **`Permissoes`**
- `Permissoes.id_permissao` 1:N `FuncionarioPermissoes.id_permissao`
Esta modelagem expandida fornece uma base robusta para o desenvolvimento de todos os três aplicativos, garantindo a integridade, a organização e a escalabilidade dos dados para as operações do bar.