# 📱 Geração de QR Code do Estabelecimento

## 📋 Resumo

Documentação sobre **quando e como** o QR code do estabelecimento é gerado.

---

## ⚠️ PROBLEMA IDENTIFICADO

Atualmente, o QR code está sendo gerado **ANTES** de criar o estabelecimento no banco de dados, usando um `timestamp` aleatório ao invés do ID real do estabelecimento. Isso faz com que o QR code **não contenha o ID real** do estabelecimento.

---

## 🔍 Momento Atual da Geração

### **1. Se o usuário NÃO fornece QR code:**

**Momento:** ANTES de criar o estabelecimento no banco de dados

**Código:** `controllers/establishmentController.js` (linhas 208-214)

```javascript
let finalQrCode = qrCode;
if (!finalQrCode) {
    // Gerar QR code único baseado em timestamp + random
    const timestamp = Date.now();
    const random = Math.random().toString(36).substring(2, 8);
    finalQrCode = generateQRCode(timestamp, type || 'Loja') + '_' + random;
    console.log('✅ QR code gerado automaticamente:', finalQrCode);
}
```

**Problema:** O QR code é gerado com `timestamp` ao invés do ID real do estabelecimento, que só existe após a criação.

---

### **2. Se o usuário fornece QR code mas está DUPLICADO:**

**Momento:** DEPOIS de tentar criar o estabelecimento e detectar erro de duplicação

**Código:** `controllers/establishmentController.js` (linhas 307-317)

```javascript
if (dbError.code === '23505' && dbError.constraint === 'establishments_qr_code_key') {
    // Gerar QR code único automaticamente
    const timestamp = Date.now();
    const random = Math.random().toString(36).substring(2, 8);
    const uniqueQrCode = generateQRCode(timestamp, type || 'Loja') + '_' + random;
    
    establishmentData.qr_code = uniqueQrCode;
    
    // Tentar criar novamente com QR code único
    try {
        let establishment = await Establishment.create(establishmentData);
        // ...
    }
}
```

**Problema:** Mesmo problema - QR code gerado com `timestamp` ao invés do ID real.

---

## ✅ SOLUÇÃO RECOMENDADA

O QR code deve ser gerado **DEPOIS** de criar o estabelecimento, quando já temos o ID real (`establishment_id` ou `est_id`).

### **Fluxo Ideal:**

```
1. Criar estabelecimento no banco (sem QR code ou com QR code temporário)
   ↓
2. Banco retorna o ID real do estabelecimento (establishment_id)
   ↓
3. Gerar QR code usando o ID real do estabelecimento
   ↓
4. Atualizar estabelecimento com o QR code gerado
   ↓
5. Retornar estabelecimento completo com QR code correto
```

---

## 🔧 Implementação Sugerida

### **Opção 1: Gerar QR code após criação (Recomendado)**

```javascript
// 1. Criar estabelecimento SEM QR code (ou com placeholder)
const establishmentData = {
    name,
    type,
    // ... outros campos ...
    qr_code: null, // Será gerado depois
};

// 2. Criar estabelecimento no banco
let establishment = await Establishment.create(establishmentData);

// 3. Gerar QR code usando o ID real
const realQrCode = generateQRCode(
    establishment.establishment_id || establishment.est_id,
    establishment.type || 'Loja'
);

// 4. Atualizar estabelecimento com QR code real
await Establishment.update(establishment.establishment_id, {
    qr_code: realQrCode
});
```

### **Opção 2: Gerar QR code no modelo durante criação**

Modificar `models/EstablishmentsModel.js` para gerar QR code automaticamente após criar o registro:

```javascript
create: async (establishmentData) => {
    // ... criar estabelecimento ...
    
    const result = await client.query(`
        INSERT INTO establishments (...)
        VALUES (...)
        RETURNING *
    `, ...);
    
    const establishment = result.rows[0];
    
    // Se não tem QR code, gerar usando o ID real
    if (!establishment.qr_code) {
        const realQrCode = generateQRCode(
            establishment.establishment_id || establishment.est_id,
            establishment.type || 'Loja'
        );
        
        // Atualizar com QR code gerado
        await client.query(`
            UPDATE establishments
            SET qr_code = $1
            WHERE establishment_id = $2 OR est_id = $2
        `, [realQrCode, establishment.establishment_id || establishment.est_id]);
        
        establishment.qr_code = realQrCode;
    }
    
    return establishment;
}
```

---

## 📊 Formato Atual do QR Code

### **Função `generateQRCode`:**
```javascript
function generateQRCode(establishmentId, establishmentType = null) {
    // Formato: MAKTUBIA_{TYPE}_{ID}_{HASH}
    const typePrefix = establishmentType 
        ? establishmentType.toUpperCase().replace(/\s+/g, '_').substring(0, 10)
        : 'EST';
    
    // Gerar hash único baseado no ID e timestamp
    const hash = crypto.createHash('md5')
        .update(`${establishmentId}-${Date.now()}-${Math.random()}`)
        .digest('hex')
        .substring(0, 8)
        .toUpperCase();
    
    const qrCode = `MAKTUBIA_${typePrefix}_${establishmentId}_${hash}`;
    
    return qrCode;
}
```

**Problema:** Se `establishmentId` for um timestamp aleatório (como está sendo feito), o QR code não contém o ID real do estabelecimento.

---

## 🔍 Situação Atual

### **QR Code Gerado Antes da Criação:**
```
QR Code: MAKTUBIA_LOJA_1234567890123_A1B2C3D4
         └─────┬─────┘ └─────┬──────┘ └───┬───┘
           Prefixo     Timestamp    Hash
```

**Problema:** O `1234567890123` é um timestamp, não o ID real do estabelecimento.

### **QR Code Ideal (Após Criação):**
```
QR Code: MAKTUBIA_LOJA_5_A1B2C3D4
         └─────┬─────┘ └┬┘ └───┬───┘
           Prefixo    ID Real  Hash
```

**Vantagem:** O `5` é o ID real do estabelecimento, permitindo extrair o ID diretamente do QR code.

---

## ✅ Benefícios de Gerar Após Criação

1. ✅ **QR Code contém ID real** - Permite extrair o ID diretamente do QR code
2. ✅ **Consistência** - QR code sempre corresponde ao ID real do estabelecimento
3. ✅ **Rastreabilidade** - Mais fácil rastrear estabelecimentos pelo QR code
4. ✅ **Validação** - Pode validar se o QR code pertence ao estabelecimento correto

---

## 🔄 Fluxo Atual vs. Ideal

### **Fluxo Atual (PROBLEMÁTICO):**
```
1. Usuário cria estabelecimento
2. Sistema gera QR code com timestamp
3. Sistema cria estabelecimento no banco
4. Estabelecimento criado com QR code que não contém ID real
```

### **Fluxo Ideal (RECOMENDADO):**
```
1. Usuário cria estabelecimento
2. Sistema cria estabelecimento no banco (sem QR code ou placeholder)
3. Banco retorna ID real do estabelecimento
4. Sistema gera QR code usando ID real
5. Sistema atualiza estabelecimento com QR code correto
```

---

## 📝 Recomendação

**Implementar Opção 1 ou Opção 2** para garantir que o QR code sempre contenha o ID real do estabelecimento, facilitando:
- Rastreabilidade
- Validação
- Extração do ID do estabelecimento a partir do QR code
- Consistência dos dados




