# 🔧 Correção do Sistema de Afiliados

## 📋 Problema Identificado

Quando um usuário se cadastrava através de um link de afiliado e realizava o pagamento, a indicação aparecia como **"Inativa"** no painel do afiliado, mesmo após o pagamento ter sido aprovado.

### Causa Raiz

1. **Referrals criados com `is_active = false`** por padrão na tabela `affiliate_referrals`
2. **O método `markAsConverted()` não estava sendo executado corretamente** ou não estava atualizando o campo `is_active`
3. **Faltavam logs detalhados** para rastrear o fluxo de ativação

## ✅ Correções Implementadas

### 1. **Correção no AffiliateService** (`backend/app/Services/AffiliateService.php`)

**Mudanças:**
- ✅ Substituída a chamada `$referral->markAsConverted()` por atualização direta via `update()`
- ✅ Garantido que `is_active = true` é definido quando há pagamento aprovado
- ✅ Adicionada verificação para reativar referrals já convertidos
- ✅ Adicionados logs detalhados em cada etapa do processo
- ✅ Chamada explícita para `updateEarnings()` do afiliado após criação da comissão

**Novo fluxo:**
```php
if (!$referral->converted_at) {
    $referral->update([
        'converted_at' => now(),
        'is_active' => true,
    ]);
} else {
    if (!$referral->is_active) {
        $referral->update(['is_active' => true]);
    }
}
```

### 2. **Comando de Diagnóstico** (`backend/app/Console/Commands/FixAffiliateReferrals.php`)

Criado comando artisan para:
- ✅ Diagnosticar referrals inativos que têm comissões
- ✅ Identificar usuários com pagamentos mas referral inativo
- ✅ Corrigir automaticamente os problemas encontrados
- ✅ Modo `--dry-run` para testar sem aplicar alterações
- ✅ Modo `--verbose` para ver detalhes completos
- ✅ Exibir estatísticas antes e depois das correções

**Uso:**
```bash
# Diagnosticar sem fazer alterações
php artisan affiliates:fix-referrals --dry-run --verbose

# Aplicar correções
php artisan affiliates:fix-referrals --verbose
```

### 3. **Atualização no Model User** (`backend/app/Models/User.php`)

**Mudanças:**
- ✅ Adicionado relacionamento `referralRecord()` para acessar o registro de referral
- ✅ Adicionados campos `referred_by`, `referral_code_used`, `referred_at` ao `$fillable`

### 4. **Scripts de Execução**

Criados scripts para facilitar a execução:
- ✅ `fix_affiliate_referrals.sh` (Linux/Mac)
- ✅ `fix_affiliate_referrals.ps1` (Windows PowerShell)

## 🚀 Como Executar a Correção

### No Servidor (Ubuntu)

```bash
# 1. Tornar o script executável
chmod +x fix_affiliate_referrals.sh

# 2. Executar o script
./fix_affiliate_referrals.sh
```

O script irá:
1. Executar diagnóstico em modo dry-run
2. Mostrar todos os problemas encontrados
3. Perguntar se deseja aplicar as correções
4. Aplicar as correções se confirmado
5. Mostrar estatísticas finais

### No Windows (Desenvolvimento)

```powershell
# Executar o script PowerShell
.\fix_affiliate_referrals.ps1
```

### Execução Manual

```bash
# No servidor
cd /var/www/gestorstream/backend

# Diagnóstico (sem fazer alterações)
php artisan affiliates:fix-referrals --dry-run --verbose

# Aplicar correções
php artisan affiliates:fix-referrals --verbose

# Verificar resultado
php artisan affiliates:fix-referrals --dry-run
```

## 📊 O Que o Comando Faz

### 1. **Diagnóstico Completo**
- Lista total de referrals (ativos, inativos, convertidos)
- Identifica referrals com comissões mas marcados como inativos
- Identifica usuários com pagamentos mas referral inativo

### 2. **Correções Aplicadas**
Para cada referral problemático:
- ✅ Marca `is_active = true`
- ✅ Define `converted_at` se não estiver definido
- ✅ Atualiza estatísticas do afiliado (`updateEarnings()`)

### 3. **Estatísticas**
Mostra comparação antes/depois:
- Referrals ativos
- Referrals inativos
- Diferença após correção

## 🎯 Fluxo Correto Após Correção

### 1. **Usuário se Registra com Link de Afiliado**
```
GET /register?ref=ABC123
↓
Cookie/Session salva: affiliate_ref=ABC123
↓
POST /api/v1/auth/register (com referral_code)
↓
AffiliateService::createReferral()
↓
AffiliateReferral criado com is_active=false
```

### 2. **Usuário Faz Primeiro Pagamento**
```
Pagamento aprovado
↓
Webhook recebe confirmação
↓
AffiliateService::createCommission()
↓
Atualiza referral: is_active=true, converted_at=now()
↓
Cria AffiliateCommission
↓
Marca comissão como aprovada
↓
Atualiza estatísticas do afiliado
↓
✅ Referral aparece como ATIVO no painel
```

### 3. **Renovações Subsequentes**
```
Pagamento de renovação aprovado
↓
AffiliateService::createCommission()
↓
Garante que referral.is_active=true
↓
Cria comissão com taxa correta (15% ou 10%)
↓
Atualiza estatísticas do afiliado
```

## 🔍 Verificação Pós-Correção

### 1. **Verificar no Banco de Dados**

```sql
-- Listar todos os referrals e seu status
SELECT 
    ar.id,
    ar.is_active,
    ar.converted_at,
    u.name as referred_user,
    u.email,
    COUNT(ac.id) as commissions_count,
    SUM(ac.commission_amount) as total_earnings
FROM affiliate_referrals ar
LEFT JOIN users u ON ar.referred_user_id = u.id
LEFT JOIN affiliate_commissions ac ON ar.id = ac.referral_id
GROUP BY ar.id
ORDER BY ar.created_at DESC;

-- Verificar referrals inativos que têm comissões (deve retornar 0)
SELECT 
    ar.id,
    ar.is_active,
    COUNT(ac.id) as commissions
FROM affiliate_referrals ar
LEFT JOIN affiliate_commissions ac ON ar.id = ac.referral_id
WHERE ar.is_active = false
GROUP BY ar.id
HAVING commissions > 0;
```

### 2. **Verificar no Painel do Afiliado**

1. Acesse `/affiliate`
2. Clique na aba **"Indicações"**
3. Verifique que usuários com pagamentos aparecem como **"Ativo"** (badge verde)
4. Clique na aba **"Comissões"**
5. Verifique que as comissões estão aparecendo corretamente

### 3. **Verificar Logs**

```bash
# No servidor
tail -f /var/www/gestorstream/backend/storage/logs/laravel.log | grep -i affiliate

# Procurar por:
# - "Affiliate referral marked as converted"
# - "Affiliate commission created successfully"
# - "referral_is_active: true"
```

## 📝 Logs Adicionados

O sistema agora registra:

1. **Quando referral é convertido:**
   ```
   Affiliate referral marked as converted
   - referral_id
   - referred_user_id
   - affiliate_id
   ```

2. **Quando referral é reativado:**
   ```
   Affiliate referral reactivated
   - referral_id
   - referred_user_id
   ```

3. **Quando comissão é criada:**
   ```
   Affiliate commission created successfully
   - commission_id
   - affiliate_id
   - referral_id
   - payment_id
   - amount
   - rate
   - type
   - referral_is_active
   - referral_converted_at
   ```

## ⚠️ Prevenção de Problemas Futuros

### 1. **Monitoramento**

Execute o comando de diagnóstico periodicamente:
```bash
# Verificar se há problemas
php artisan affiliates:fix-referrals --dry-run
```

### 2. **Testes**

Sempre que houver alterações no sistema de pagamentos ou afiliados:
1. Criar conta de afiliado
2. Usar link de referência em navegador anônimo
3. Fazer pagamento de teste
4. Verificar se referral fica ativo
5. Verificar se comissão é criada

### 3. **Logs**

Monitorar logs do Laravel para erros relacionados a afiliados:
```bash
grep -i "affiliate" /var/www/gestorstream/backend/storage/logs/laravel.log
```

## 🎉 Benefícios das Correções

1. ✅ **Referrals ativos corretamente** - Indicações aparecem como ativas após pagamento
2. ✅ **Estatísticas precisas** - Contadores de referrals ativos/inativos corretos
3. ✅ **Rastreabilidade** - Logs detalhados de todo o processo
4. ✅ **Manutenção fácil** - Comando de diagnóstico automático
5. ✅ **Histórico preservado** - Correção não perde dados, apenas atualiza status
6. ✅ **Prevenção** - Código corrigido previne problema em novos cadastros

## 📞 Suporte

Se após executar as correções ainda houver problemas:

1. Execute o comando com `--verbose` e salve a saída
2. Verifique os logs do Laravel
3. Execute as queries SQL de verificação
4. Compartilhe os resultados para análise

## 🔗 Arquivos Modificados

1. `backend/app/Services/AffiliateService.php` - Lógica de ativação corrigida
2. `backend/app/Models/User.php` - Relacionamento adicionado
3. `backend/app/Console/Commands/FixAffiliateReferrals.php` - Novo comando
4. `fix_affiliate_referrals.sh` - Script bash
5. `fix_affiliate_referrals.ps1` - Script PowerShell
6. `CORRECAO_SISTEMA_AFILIADOS.md` - Esta documentação
