|
| 1 | +## Escopo |
| 2 | + |
| 3 | +Implementar e ajustar o fluxo de pagamento via Pagarme (Core v5 Orders + Checkout) para o curso ao vivo “Codando com IA”, sem liberar área de acesso ou enviar e-mails por enquanto, garantindo associação/criação de usuário e notificações no Discord. |
| 4 | + |
| 5 | +## Requisitos Confirmados |
| 6 | + |
| 7 | +- **Preço:** R$ 588,00 (58800 centavos), parcelamento em até 12x sem juros. |
| 8 | +- **Métodos de pagamento:** cartão de crédito, boleto e pix. |
| 9 | +- **Acesso/e-mails:** nenhum acesso adicional nem e-mails de confirmação neste momento. |
| 10 | +- **Usuário:** reutilizar usuário existente pelo e-mail ou criar um novo se não existir. |
| 11 | +- **Webhooks:** reutilizar o fluxo já existente, com tratamento específico para o produto do curso. |
| 12 | +- **URLs e metadados:** `success_url` = `/curso-ao-vivo/codando-com-ia/sucesso`; `product_slug` = `curso-ao-vivo-codando-com-ia-v1`. |
| 13 | + |
| 14 | +## Estado Atual |
| 15 | + |
| 16 | +- **POST `/api/pagarme/codando-com-ia/checkout`** já cria a Order + Checkout, retornando `payment_url`. |
| 17 | +- **GET `/api/pagarme/codando-com-ia/orders/{orderId}`** consulta a Order no Core v5, validando `product_slug`. |
| 18 | +- **POST `/api/pagarme/notification`** processa webhooks; atualmente o fluxo é focado em Subscription e apenas registra quando não encontra subscription para este produto. |
| 19 | + |
| 20 | +## Plano de Implementação |
| 21 | + |
| 22 | +### 1. Plano (`codando-com-ia-v1`) |
| 23 | + |
| 24 | +- Garantir via seed/migração idempotente a existência do plano com: |
| 25 | + - `slug`: `codando-com-ia-v1` |
| 26 | + - `name`: `Codando com IA (Ao Vivo) v1` |
| 27 | + - `price_in_cents`: `58800` |
| 28 | + - `duration_in_months`: `0` |
| 29 | + - `details`: JSON opcional |
| 30 | + |
| 31 | +### 2. Checkout (`POST /api/pagarme/codando-com-ia/checkout`) |
| 32 | + |
| 33 | +- Sanitizar telefone (já implementado) e aceitar ausência sem falhar. |
| 34 | +- Localizar usuário pelo e-mail; se não existir, criar com nome, e-mail, telefone (se válido) e senha aleatória hasheada; atualizar dados faltantes quando reaproveitar usuários. |
| 35 | +- Incluir `customer.metadata.user_id` no payload enviado ao Pagarme. |
| 36 | +- Manter preço, métodos aceitos, parcelas sem juros, `success_url` e metadados existentes. |
| 37 | +- Após sucesso na criação da Order: |
| 38 | + - Criar `Subscription` vinculada ao plano `codando-com-ia-v1` com `status = pending`, `acquisition_type = purchase`, `provider_id = order.id`, `price_paid_in_cents = order.amount` e `payment_method = null` (até atualização via webhook). |
| 39 | +- Retornar `checkoutLink`, `pagarmeOrderID`, `amount`, `status` (sem autenticar/logar o usuário nem disparar e-mails). |
| 40 | + |
| 41 | +### 3. Status (`GET /api/pagarme/codando-com-ia/orders/{orderId}`) |
| 42 | + |
| 43 | +- Manter lógica atual de validação do `product_slug` e retorno filtrado dos dados da Order. |
| 44 | + |
| 45 | +### 4. Webhooks (`POST /api/pagarme/notification`) |
| 46 | + |
| 47 | +- Para eventos `order.*` onde `metadata.product_slug === curso-ao-vivo-codando-com-ia-v1` ou Subscription vinculada ao plano `codando-com-ia-v1`: |
| 48 | + - `findOrCreate` do `User` (atualizando nome/telefone ausentes). |
| 49 | + - Localizar ou criar a `Subscription` pendente vinculada ao plano. |
| 50 | + - Atualizar `status` e campos `payment_method`, `boleto_url`, `boleto_barcode` / `qr_code` diretamente (não usar `changeStatus` para evitar `upgradeUserToPro`). |
| 51 | + - Enviar mensagem ao Discord no canal `notificacoes-compras` com resumo do evento (comprador, método, valor, `orderId`, status e contexto). |
| 52 | + - Não liberar acesso, não enviar e-mails. |
| 53 | + - Garantir idempotência atualizando apenas dados necessários. |
| 54 | + |
| 55 | +### 5. Segurança e Resiliência |
| 56 | + |
| 57 | +- Manter uso de Basic Auth para chamadas à API Pagarme. |
| 58 | +- Tolerar telefones inválidos/vazios sem lançar exceções. |
| 59 | +- Preservar e detalhar logs de erro no checkout. |
| 60 | + |
| 61 | +### 6. Testes Automatizados |
| 62 | + |
| 63 | +- **Checkout:** garantir criação/associação do usuário e subscription pendente, além do retorno do `payment_url`. |
| 64 | +- **Status:** confirmar 200 quando o `product_slug` bate e 404 caso contrário. |
| 65 | +- **Webhooks:** simular `order.created`, `order.closed`, `order.paid`, `order.canceled/failed` para validar atualizações da subscription, criação/atualização de usuário e envio de notificações ao Discord (mockado), assegurando que não há promoção a PRO. |
| 66 | + |
| 67 | +### 7. Pós-Implementação |
| 68 | + |
| 69 | +- Rodar migration/seed para criar o plano. |
| 70 | +- Executar `php artisan test` para validar o backend. |
| 71 | +- Certificar que o webhook do Pagarme aponta para `/api/pagarme/notification` e que `PAGARME_API_KEY` correta está configurada no `.env` de cada ambiente. |
0 commit comments