# Sistema de Associação entre Produtos e Usuários - Checkout Pro 2025

## 📋 Visão Geral

Este documento descreve a implementação da associação entre produtos e usuários no Checkout Pro 2025. Cada produto passa a ter um dono (`usuario_id`), permitindo que usuários comuns gerenciem apenas seus próprios produtos, enquanto administradores mantêm acesso total ao sistema.

---

## 🗄️ Estrutura da Tabela `produtos`

### Nova Coluna Adicionada

| Campo | Tipo | Descrição |
|-------|------|-----------|
| `usuario_id` | INT(11) NULL | ID do usuário dono do produto (chave estrangeira para `usuarios.id`) |

### Índices

- **KEY**: `idx_usuario_id` (`usuario_id`)

---

## 🔄 Migração de Dados

### Arquivo de Migração

**Localização**: `config/sql_migrations/2025_02_add_usuario_id_produtos.sql`

### Como Executar

1. **Acesse seu banco de dados** (via phpMyAdmin, MySQL Workbench, ou linha de comando)

2. **Execute o arquivo SQL**:
   ```sql
   -- Execute o conteúdo de: config/sql_migrations/2025_02_add_usuario_id_produtos.sql
   ```

3. **Ajuste o ID do admin** (se necessário):
   ```sql
   -- Verifique o ID do seu admin
   SELECT id, nome, email FROM usuarios WHERE tipo = 'admin' ORDER BY id ASC LIMIT 1;
   
   -- Se o ID for diferente de 1, ajuste a migração:
   UPDATE produtos SET usuario_id = SEU_ID_AQUI WHERE usuario_id IS NULL;
   ```

### O que a Migração Faz

1. **Adiciona a coluna `usuario_id`** na tabela `produtos`
2. **Cria índice** para melhor performance
3. **Atribui produtos existentes** ao primeiro admin encontrado
4. **Mantém retrocompatibilidade** (coluna permite NULL)

---

## 👥 Regras de Acesso e Visualização

### Administradores

- ✅ **Vêem todos os produtos** (sem filtro por `usuario_id`)
- ✅ **Podem criar produtos** (automaticamente associados ao seu próprio ID)
- ✅ **Podem editar qualquer produto**
- ✅ **Podem excluir qualquer produto**
- ✅ **Acesso total ao dashboard** (produtos, pedidos, credenciais, pixel, etc.)

### Usuários Comuns

- ✅ **Vêem apenas seus próprios produtos** (`produtos.usuario_id = usuario_logado().id`)
- ✅ **Podem criar produtos** (automaticamente associados ao seu próprio ID)
- ✅ **Podem editar apenas seus próprios produtos**
- ✅ **Podem excluir apenas seus próprios produtos**
- ✅ **Acesso restrito**:
  - ❌ Não podem acessar `/dashboard/pages/credenciais.php`
  - ❌ Não podem acessar `/dashboard/pages/pixel.php`
  - ❌ Não podem acessar outras páginas administrativas
  - ✅ Podem acessar `/dashboard/pages_usuario/meus_produtos.php`

---

## 📁 Estrutura de Arquivos

```
CHECKOUT PRO 2025/
├── config/
│   └── sql_migrations/
│       └── 2025_02_add_usuario_id_produtos.sql  # Migração SQL
├── dashboard/
│   ├── pages/
│   │   └── produtos.php              # Dashboard admin (todos os produtos)
│   └── pages_usuario/
│       └── meus_produtos.php          # Área do usuário (apenas seus produtos)
└── docs/
    └── produtos_usuarios.md          # Esta documentação
```

---

## 🔧 Implementação Técnica

### 1. Dashboard Admin (`dashboard/pages/produtos.php`)

#### Criação de Produto

```php
// Admin cria produto associado ao seu próprio ID
$sql = "INSERT INTO produtos (usuario_id, nome, descricao, ...) 
        VALUES (:usuario_id, :nome, :descricao, ...)";
$stmt->execute([
    ':usuario_id' => $usuario_logado_id,  // ID do admin
    // ... outros campos
]);
```

#### Listagem de Produtos

```php
// Admin vê TODOS os produtos (sem filtro)
$sql = "SELECT * FROM produtos";
$stmt = $pdo->query($sql);
$produtos = $stmt->fetchAll(PDO::FETCH_ASSOC);
```

#### Edição/Exclusão

- **Sem verificação de `usuario_id`** (admin pode editar/excluir qualquer produto)

### 2. Área do Usuário (`dashboard/pages_usuario/meus_produtos.php`)

#### Criação de Produto

```php
// Usuário cria produto associado ao seu próprio ID
$sql = "INSERT INTO produtos (usuario_id, nome, descricao, ...) 
        VALUES (:usuario_id, :nome, :descricao, ...)";
$stmt->execute([
    ':usuario_id' => $usuario_id,  // ID do usuário comum
    // ... outros campos
]);
```

#### Listagem de Produtos

```php
// Usuário vê APENAS seus produtos
$sql = "SELECT * FROM produtos WHERE usuario_id = :usuario_id ORDER BY data_criacao DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute([':usuario_id' => $usuario_id]);
$produtos = $stmt->fetchAll(PDO::FETCH_ASSOC);
```

#### Edição de Produto

```php
// Verifica se o produto pertence ao usuário
$sql_verificar = "SELECT id FROM produtos WHERE id = :id AND usuario_id = :usuario_id";
$stmt_verificar = $pdo->prepare($sql_verificar);
$stmt_verificar->execute([':id' => $produto_id, ':usuario_id' => $usuario_id]);
$produto_valido = $stmt_verificar->fetch(PDO::FETCH_ASSOC);

if (!$produto_valido) {
    // Erro: produto não encontrado ou sem permissão
} else {
    // Atualiza o produto
    $sql = "UPDATE produtos SET ... WHERE id = :id AND usuario_id = :usuario_id";
}
```

#### Exclusão de Produto

```php
// Usuário pode excluir APENAS seus produtos
$sql = "DELETE FROM produtos WHERE id = :id AND usuario_id = :usuario_id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => $produto_id, ':usuario_id' => $usuario_id]);
```

### 3. Order Bumps (Produtos Adicionais)

#### Criação de Order Bump

- **Admin**: Order bump pertence ao mesmo usuário do produto principal
- **Usuário**: Order bump pertence ao próprio usuário

```php
// Buscar usuario_id do produto principal
$sql_principal = "SELECT usuario_id FROM produtos WHERE id = :id LIMIT 1";
$stmt_principal = $pdo->prepare($sql_principal);
$stmt_principal->execute([':id' => $produto_principal_id]);
$produto_principal = $stmt_principal->fetch(PDO::FETCH_ASSOC);
$usuario_id_principal = $produto_principal['usuario_id'] ?? $usuario_logado_id;

// Criar produto adicional com mesmo usuario_id
$sql_insert_produto = "INSERT INTO produtos (usuario_id, nome, descricao, ...) 
                       VALUES (:usuario_id, :nome, :descricao, ...)";
$stmt->execute([':usuario_id' => $usuario_id_principal, ...]);
```

#### Remoção de Order Bump

- **Admin**: Pode remover qualquer order bump
- **Usuário**: Pode remover apenas order bumps de seus produtos

```php
// Verificar se o order bump pertence a um produto do usuário
$sql_verificar = "SELECT pa.produto_principal_id, p.usuario_id 
                 FROM produtos_adicionais pa
                 INNER JOIN produtos p ON p.id = pa.produto_principal_id
                 WHERE pa.id = :id AND p.usuario_id = :usuario_id";
```

---

## 🛡️ Proteção de Páginas Restritas

### Páginas Administrativas

As seguintes páginas são **restritas apenas para administradores**:

- `dashboard/pages/credenciais.php` - Configuração de credenciais do Mercado Pago
- `dashboard/pages/pixel.php` - Configuração do Facebook Pixel
- `dashboard/pages/dashboard.php` - Dashboard principal (pode ser ajustado no futuro)
- `dashboard/pages/pedidos.php` - Listagem de pedidos (pode ser ajustado no futuro)
- `dashboard/pages/carrinhos.php` - Recuperação de vendas (pode ser ajustado no futuro)

**Como funciona:**

```php
// No início de cada página administrativa:
require_once __DIR__ . '/../require_auth.php';
// require_auth.php já verifica se é admin e redireciona usuários comuns
```

### Área do Usuário

A página `dashboard/pages_usuario/meus_produtos.php` é **restrita apenas para usuários comuns**:

```php
// No início da página:
require_once __DIR__ . '/../../backend/auth_helper.php';
requer_usuario('/dashboard/index.php');  // Redireciona admins para dashboard admin
```

---

## ✅ Fluxo de Checkout (Intacto)

O fluxo de checkout **continua funcionando exatamente como antes**:

1. **`dados_pessoais.php?produto_id=X`**
   - Busca produto por ID (sem filtro por `usuario_id`)
   - Qualquer produto pode ser acessado via link público

2. **`checkout.php?produto_id=X`**
   - Busca produto por ID (sem filtro por `usuario_id`)
   - Exibe checkout normalmente

3. **Pagamento**
   - Processa pagamento normalmente
   - Registra em `transacoes` normalmente

4. **Registro em `transacoes`**
   - Mantém todos os campos existentes
   - Não requer alterações

### Por que o Checkout Funciona?

O checkout é **público** e não requer autenticação. Ele busca produtos diretamente por ID, sem verificar `usuario_id`. Isso permite que:

- ✅ Links de checkout continuem funcionando
- ✅ Produtos sejam acessíveis publicamente
- ✅ Nenhuma alteração seja necessária no fluxo de pagamento

---

## 🔄 Retrocompatibilidade

### Produtos Sem `usuario_id`

- Produtos com `usuario_id = NULL` ainda funcionam
- O sistema trata `NULL` como "produto sem dono"
- Admin pode atribuir produtos sem dono a si mesmo ou a outros usuários

### Queries Retrocompatíveis

Todas as queries incluem tratamento de erro para caso a coluna `usuario_id` não exista:

```php
try {
    $sql = "INSERT INTO produtos (usuario_id, nome, ...) VALUES (:usuario_id, :nome, ...)";
    // ...
} catch (PDOException $e) {
    if (strpos($e->getMessage(), 'usuario_id') !== false) {
        // Retrocompatibilidade: insere sem usuario_id
        $sql = "INSERT INTO produtos (nome, ...) VALUES (:nome, ...)";
        // ...
    }
}
```

---

## 📊 Consultas Úteis

### Verificar Produtos por Usuário

```sql
-- Produtos de um usuário específico
SELECT id, nome, preco_atual, usuario_id 
FROM produtos 
WHERE usuario_id = 2;

-- Produtos sem dono
SELECT id, nome, preco_atual 
FROM produtos 
WHERE usuario_id IS NULL;

-- Contagem de produtos por usuário
SELECT u.nome, u.email, COUNT(p.id) as total_produtos
FROM usuarios u
LEFT JOIN produtos p ON p.usuario_id = u.id
GROUP BY u.id, u.nome, u.email
ORDER BY total_produtos DESC;
```

### Atribuir Produtos a um Usuário

```sql
-- Atribuir todos os produtos sem dono ao admin (ID = 1)
UPDATE produtos 
SET usuario_id = 1 
WHERE usuario_id IS NULL;

-- Atribuir produtos específicos a um usuário
UPDATE produtos 
SET usuario_id = 2 
WHERE id IN (10, 11, 12);
```

---

## 🚀 Próximos Passos

1. **Executar migração SQL**: Execute `config/sql_migrations/2025_02_add_usuario_id_produtos.sql`
2. **Verificar produtos existentes**: Confirme que produtos foram atribuídos corretamente
3. **Testar criação de produtos**: Crie produtos como admin e como usuário comum
4. **Testar edição/exclusão**: Verifique que usuários só podem editar/excluir seus produtos
5. **Testar checkout**: Confirme que links de checkout continuam funcionando

---

## ⚠️ Notas Importantes

- ⚠️ **Segurança**: Sempre verifique `usuario_id` ao editar/excluir produtos na área do usuário
- ⚠️ **Performance**: O índice `idx_usuario_id` melhora a performance das queries filtradas
- ⚠️ **Retrocompatibilidade**: O sistema mantém compatibilidade com produtos sem `usuario_id`
- ⚠️ **Checkout Público**: O checkout não verifica `usuario_id`, permitindo acesso público aos produtos

---

## 🆘 Suporte

Em caso de dúvidas ou problemas:

1. Verifique se a migração SQL foi executada corretamente
2. Confirme que a coluna `usuario_id` existe na tabela `produtos`
3. Verifique os logs de erro do PHP
4. Confirme que os usuários estão logados corretamente

---

**Última atualização**: Janeiro 2025  
**Versão do sistema**: Checkout Pro 2025


