# 📋 Análise: Merchant vs Establishment - Qual é o Correto?

## 🔍 **Análise da Situação Atual**

### **Estrutura Atual do Sistema:**

1. **Tabela `establishments`** (Estabelecimentos)
   - Representa a **loja física** (entidade comercial)
   - Campos: `name`, `type`, `address`, `phone`, `qr_code`, `created_by`
   - `created_by` = ID do usuário que criou (dono)

2. **Tabela `merchants`** (Merchants)
   - Relação entre `user_id` e `establishment_id`
   - Representa um **usuário associado a um estabelecimento**
   - Campos: `can_create_campaigns`, `can_set_custom_points`
   - **Problema:** Parece redundante com `establishments.created_by`

3. **Identificação Implícita de Merchant**
   - Sistema identifica merchant quando `establishments.created_by = user_id`
   - Não usa a tabela `merchants` para isso

---

## ❓ **Pergunta: Qual é o Correto?**

### **Opção 1: Merchant = Loja (Recomendado)**

**Conceito:**
- **Merchant** = A loja/estabelecimento comercial (entidade física)
- **Merchant Owner** = O dono/proprietário (usuário que criou)

**Estrutura:**
```sql
-- Tabela merchants (loja)
CREATE TABLE merchants (
    merchant_id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,          -- Nome da loja
    type VARCHAR(50),                    -- Tipo de loja
    address TEXT,
    phone VARCHAR(50),
    email VARCHAR(120),
    qr_code VARCHAR(100) UNIQUE,
    owner_id INTEGER REFERENCES users(user_id),  -- Dono (created_by)
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

**Vantagens:**
- ✅ Terminologia padrão (merchant = loja em sistemas de pagamento)
- ✅ Mais simples (uma tabela ao invés de duas)
- ✅ API mais intuitiva: `/api/merchants` ao invés de `/api/establishments`
- ✅ Menos confusão conceitual

**Como funciona:**
- Quando um usuário cria uma loja, ele se torna o **owner** (dono)
- O sistema identifica automaticamente que ele é **merchant owner**
- A loja em si é o **merchant**

---

### **Opção 2: Manter Establishment (Atual)**

**Conceito:**
- **Establishment** = A loja física
- **Merchant** = O dono/proprietário (usuário que criou)

**Estrutura Atual:**
```sql
-- Tabela establishments (loja)
CREATE TABLE establishments (
    establishment_id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    created_by INTEGER REFERENCES users(user_id),  -- Dono
    ...
);

-- Tabela merchants (relação usuário ↔ estabelecimento)
CREATE TABLE merchants (
    merchant_id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(user_id),
    establishment_id INTEGER REFERENCES establishments(establishment_id),
    can_create_campaigns BOOLEAN,
    ...
);
```

**Desvantagens:**
- ❌ Confusão entre "establishment" e "merchant"
- ❌ Terminologia duplicada
- ❌ Tabela `merchants` parece redundante
- ❌ API com `/api/establishments` é menos intuitiva

---

## ✅ **Recomendação Final**

### **Usar "Merchant" para a Loja (Opção 1)**

**Razões:**
1. ✅ **Terminologia Padrão**: Em sistemas de pagamento/fidelização, "merchant" é a loja
2. ✅ **Mais Simples**: Uma tabela `merchants` ao invés de `establishments` + `merchants`
3. ✅ **API Mais Intuitiva**: `/api/merchants` faz mais sentido que `/api/establishments`
4. ✅ **Menos Confusão**: Não há dúvida sobre o que é "merchant" vs "establishment"

**Estrutura Proposta:**
```sql
-- Tabela merchants (loja)
CREATE TABLE merchants (
    merchant_id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,              -- Nome da loja
    type VARCHAR(50),                        -- Tipo de loja
    address TEXT,
    phone VARCHAR(50),
    email VARCHAR(120),
    qr_code VARCHAR(100) UNIQUE,
    owner_id INTEGER REFERENCES users(user_id),  -- Dono da loja
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabela campaigns (campanhas da loja)
CREATE TABLE campaigns (
    campaign_id VARCHAR(64) PRIMARY KEY,
    merchant_id VARCHAR(64) REFERENCES merchants(merchant_id),  -- Referência à loja
    ...
);

-- Tabela purchases (compras na loja)
CREATE TABLE purchases (
    purchase_id VARCHAR(64) PRIMARY KEY,
    merchant_id VARCHAR(64) REFERENCES merchants(merchant_id),  -- Referência à loja
    ...
);
```

**Identificação de Merchant Owner:**
- Um usuário é considerado **merchant owner** quando `merchants.owner_id = user_id`
- Não precisa de tabela adicional ou role específica

---

## 📊 **Comparação de Terminologia**

| Conceito Atual | Conceito Recomendado | Descrição |
|----------------|---------------------|-----------|
| `establishments` | `merchants` | A loja/estabelecimento físico |
| `establishments.created_by` | `merchants.owner_id` | Dono/proprietário da loja |
| `merchants` (tabela) | Remover | Redundante |
| "Estabelecimento" | "Merchant" | Terminologia mais simples |
| `/api/establishments` | `/api/merchants` | API mais intuitiva |

---

## 🔄 **Migração Necessária (Se Aplicar Opção 1)**

### **1. Renomear Tabela:**
```sql
ALTER TABLE establishments RENAME TO merchants;
```

### **2. Renomear Colunas:**
```sql
ALTER TABLE merchants RENAME COLUMN establishment_id TO merchant_id;
ALTER TABLE merchants RENAME COLUMN created_by TO owner_id;
```

### **3. Atualizar Referências:**
```sql
-- Atualizar campaigns
ALTER TABLE campaigns RENAME COLUMN est_id TO merchant_id;
ALTER TABLE campaigns RENAME COLUMN establishment_id TO merchant_id;

-- Atualizar purchases
ALTER TABLE purchases RENAME COLUMN establishment_id TO merchant_id;
```

### **4. Atualizar Código:**
- Renomear `EstablishmentsModel` → `MerchantsModel`
- Renomear `establishmentRoutes` → `merchantRoutes`
- Atualizar todos os endpoints `/api/establishments` → `/api/merchants`
- Atualizar variáveis e comentários

---

## ✅ **Conclusão**

**Recomendação:** Usar **"Merchant"** para representar a loja/estabelecimento.

**Benefícios:**
- ✅ Terminologia mais clara e padrão
- ✅ Menos confusão conceitual
- ✅ API mais intuitiva
- ✅ Código mais simples

**Próximo Passo:** Decidir se quer manter "establishments" ou migrar para "merchants" como terminologia principal.

