# 🔧 Correções Críticas - Subscription & WhatsApp Extras

## 🐛 Problemas Corrigidos

### 1. **Instâncias WhatsApp Extras Sumindo**

**Problema:** Ao fazer upgrade/downgrade, as instâncias extras de WhatsApp compradas separadamente estavam sendo perdidas.

**Causa:** O sistema estava cancelando as subscriptions antigas sem transferir as instâncias extras para a nova subscription.

**Solução Aplicada:**

#### ProrationService
- ✅ Preserva `whatsapp_extra_qty` ao aplicar proration
- ✅ Preserva `whatsapp_extra_billing_exempt`
- ✅ Registra no log as extras preservadas

#### WebhookController
- ✅ Busca subscriptions anteriores antes de cancelar
- ✅ Transfere todas as extras para a nova subscription
- ✅ Mantém isenções de cobrança
- ✅ Logs detalhados de transferências

#### PaymentController
- ✅ Mesma lógica no `fulfillOrder()`
- ✅ Garante que extras não sejam perdidas em nenhum fluxo

### 2. **Histórico de Pagamentos Não Aparecia**

**Problema:** A seção de histórico de pagamentos só aparecia se o usuário tivesse subscription ativa.

**Solução:** Histórico agora é sempre exibido, independente de ter subscription ou não.

### 3. **Sistema de Renovação com QR Code**

**Novo:** Endpoint para renovar assinatura e gerar QR Code de pagamento.

**Funcionalidades:**
- ✅ Aplica créditos automaticamente
- ✅ Gera QR Code PIX
- ✅ Se crédito cobrir tudo, renova gratuitamente
- ✅ Mostra valor final após créditos

---

## 📋 Mudanças Técnicas

### 1. ProrationService.php

**Método `applyProration()` modificado:**

```php
// PRESERVAR extras compradas separadamente
$whatsappExtraQty = $subscription->whatsapp_extra_qty ?? 0;
$whatsappExtraBillingExempt = $subscription->whatsapp_extra_billing_exempt ?? false;

// Atualizar o plano
$subscription->plan_id = $newPlan->id;

// PRESERVAR extras
$subscription->whatsapp_extra_qty = $whatsappExtraQty;
$subscription->whatsapp_extra_billing_exempt = $whatsappExtraBillingExempt;
```

### 2. WebhookController.php

**Antes de cancelar subscriptions antigas:**

```php
// Transferir extras da subscription anterior
$previousSubscriptions = \App\Models\Subscription::where('user_id', $payment->user_id)
    ->where('id', '!=', $subscription->id)
    ->where('status', 'active')
    ->get();

foreach ($previousSubscriptions as $prevSub) {
    if ($prevSub->whatsapp_extra_qty > 0) {
        $subscription->whatsapp_extra_qty = ($subscription->whatsapp_extra_qty ?? 0) + $prevSub->whatsapp_extra_qty;
        // Log da transferência
    }
}

// DEPOIS cancelar as antigas
```

### 3. PaymentController.php

Mesma lógica aplicada no `fulfillOrder()`.

### 4. SubscriptionController.php

**Novo método `renew()`:**

```php
POST /api/v1/subscriptions/renew
Body: {
  "gateway": "openpix"
}
```

**Resposta:**
```json
{
  "message": "Pagamento de renovação gerado!",
  "payment": {
    "id": 123,
    "amount": 25.80,
    "base_amount": 50.00,
    "credit_applied": 24.20,
    "qr_code": "...",
    "qr_code_url": "..."
  }
}
```

### 5. SubscriptionPage.tsx

**Histórico sempre visível:**

```tsx
// Sempre mostrar (removido condicional)
<PaymentHistorySection onRefresh={handlePaymentRefresh} />
```

---

## 🧪 Como Testar

### Teste 1: Preservação de Instâncias Extras

```bash
# 1. Criar subscription com plano básico
# 2. Comprar instâncias extras de WhatsApp
# 3. Fazer upgrade para plano Pro
# 4. Verificar se as extras ainda estão lá

# Via API:
GET /api/v1/subscriptions/current

# Verificar:
{
  "subscription": {
    "whatsapp_extra_qty": 2,  // ← Deve estar preservado
    "plan": {
      "name": "Pro"
    }
  }
}
```

### Teste 2: Renovação com QR Code

```bash
# Gerar renovação
POST /api/v1/subscriptions/renew
{
  "gateway": "openpix"
}

# Retorna QR Code para pagamento
```

### Teste 3: Histórico de Pagamentos

1. Acesse: `https://gestor.jf.eng.br/subscription`
2. Verifique se a seção "Histórico de Pagamentos" aparece
3. Deve mostrar todos os pagamentos (mesmo sem subscription ativa)

---

## 📊 Logs para Verificar

Após upgrade/downgrade, verificar nos logs:

```log
[INFO] WhatsApp extras transferred from previous subscription
  from_subscription_id: 5
  to_subscription_id: 6
  quantity: 2

[INFO] Previous subscriptions cancelled
  extras_transferred: 2
```

---

## 🚀 Deploy

```bash
cd /var/www/gestorstream

# 1. Backend
git pull origin main
cd backend
php artisan config:clear
php artisan cache:clear
php artisan route:clear

# 2. Frontend
cd ../frontend
npm run build

# 3. Nginx
sudo nginx -s reload
```

---

## ✅ Checklist de Validação

Após deploy, testar:

- [ ] Fazer upgrade - instâncias extras preservadas?
- [ ] Fazer downgrade - instâncias extras preservadas?
- [ ] Histórico de pagamentos aparece em /subscription?
- [ ] Renovação com `/subscriptions/renew` funciona?
- [ ] QR Code é gerado na renovação?
- [ ] Créditos são aplicados automaticamente na renovação?
- [ ] Logs mostram transferência de extras?

---

## 🔄 Fluxo Correto Agora

### Cenário: Upgrade com Extras

1. **Estado inicial:**
   - Plano Basic (R$ 50)
   - 2 instâncias WhatsApp extras

2. **Usuário faz upgrade para Pro (R$ 100)**

3. **Sistema:**
   - Calcula proration
   - Cria nova subscription com plano Pro
   - **Transfere 2 extras** da antiga para a nova
   - Cancela subscription antiga
   - Ativa nova subscription

4. **Estado final:**
   - Plano Pro (R$ 100)
   - **2 instâncias WhatsApp extras** ✅ Preservadas!

---

## 📝 Arquivos Modificados

1. ✅ `backend/app/Services/ProrationService.php`
2. ✅ `backend/app/Http/Controllers/Api/WebhookController.php`
3. ✅ `backend/app/Http/Controllers/Api/PaymentController.php`
4. ✅ `backend/app/Http/Controllers/Api/SubscriptionController.php` (novo método `renew()`)
5. ✅ `backend/routes/api.php` (nova rota `/subscriptions/renew`)
6. ✅ `frontend/src/pages/SubscriptionPage.tsx`

---

**Data:** 2026-01-12  
**Tipo:** Correções Críticas  
**Status:** Implementado, aguardando deploy e teste
