# Validação Fases 38.1, 38.2, 38.4

Documento de validação conforme solicitado no plano de ação v2.

**Última verificação no projeto:** 2025-03

---

## 38.1 — Fluxos especiais Mega da Virada / Quina São João

### v1 (referência)

- **BolaoController::fazer_meu_quina_de_sao_joaoAction** e **fazer_meu_fechamento_mega_da_viradaAction**
- Ambos renderizam a mesma view `meu_fechamento` com `getConcurso($idLoteria, FALSE, TRUE)` para obter o concurso especial
- Fluxo: usuário acessa URL específica → seleciona loteria → preenche volante → cria bolão/fechamento

### v2 (atual)

| Aspecto | Status | Detalhes |
|---------|--------|----------|
| Páginas especiais | ✅ | `/mega-sena/mega-da-virada` e `/quina/quina-sao-joao` com volante e `getConcursoEspecial()` |
| Jogos individuais | ✅ | Adicionar ao carrinho com `id_concurso` do especial |
| Bolões existentes | ✅ | Link "Bolões Mega da Virada" → `/mega-sena/boloes` |
| Wizard criar bolão | ✅ | `ConcursoService::getProximos` usa `select` sem filtrar por `tipo`. Concursos especiais (tipo=2) com `data_sorteio >= hoje` são retornados junto com os regulares. O wizard lista o especial ao selecionar MG ou QN. |
| Admin criar bolão | ✅ | `/admin/boloes/criar` inclui MGE (Mega da Virada) |

### Verificação no código (38.1)

- `api/src/Service/ConcursoService.php`: `getProximos` → `$concursoDao->select` com `where`: `_deleted`, `data_sorteio >= hoje`, `id_loteria`. **Não** filtra por `tipo`, então especiais (tipo=2) entram na lista.
- `ConcursoDao::getConcurso($id, false, true)` usa `tipo=2` apenas quando chamado explicitamente para especial; o `select` do `getProximos` não aplica esse filtro.

### Conclusão 38.1

**✅ Equivalente.** O wizard `/criar-bolao` inclui o concurso especial na lista de concursos quando existir no banco com `data_sorteio >= hoje`.

---

## 38.2 — Modal de jogos no carrinho

### v1 (referência)

- **Carrinho/View/Carrinho/modal_jogos.php**
- Exibe detalhe completo de **um item** do carrinho:
  - Loteria, grupo, concurso, data sorteio, prêmio
  - Para cada jogo: dezenas formatadas (TM: time do coração, ST: mês da sorte, SS: colunas, MM: dezenas+trevos)
  - Suporta jogos individuais, bolões e teimosinha
- Disparado via CarrinhoController (modal AJAX)

### v2 (atual)

- **CarrinhoItemCard**
- Exibe: loteria, concurso, data sorteio, descrição, cotas (se bolão)
- **Números:** apenas o primeiro jogo (`formatarDezenas` usa `dezenas[0]`)
- Para bolão: não mostra números individuais de cada jogo
- **Sem** expandir/colapsar, **sem** modal de detalhe

### Verificação no código (38.2)

- `frontend/components/carrinho/CarrinhoItemCard.tsx`: confirmação — exibe apenas `formatarDezenas(item)` que usa `dezenas[0]`; sem expandir/colapsar; sem modal.

### Conclusão 38.2

**✅ Implementado (Fase 38.2).** O CarrinhoItemCard agora possui:
- Botão "Ver detalhes" / "Ver todos os jogos" para expandir
- Área expansível com todos os jogos formatados por sigla
- Formatação específica: TM (time), ST (mês), SS (col.dígito), MM (dezenas + trevos)
- API retorna `sigla` e `numeros_on` (MM) para formatação correta

---

## 38.4 — Painel do afiliado

### v1 (referência)

- **AfiliadoController::Action()** — painel do afiliado logado:
  - Link de indicação (`?m=afiliado&c=afiliado&a=link&uid=X&cod=Y`)
  - Botão compartilhar (Facebook)
  - Texto explicativo (comissão 10%, etc.)
- **GerenciarPedidosAfiliadoController** — lista/detalhe de pedidos dos indicados, aprovar/cancelar

### v2 (atual)

| Funcionalidade | v1 | v2 |
|----------------|----|----|
| Link de indicação | Afiliado index | `/indique` (getCodigoIndicacao) |
| Lista de indicados | GerenciarPedidosAfiliado | `/conta/indicacoes` (total, compradores, créditos, itens) |
| Aprovar/cancelar pedido | Afiliado (form) | Admin `/admin/afiliados` |
| Navegação | Menu "Seja um Afiliado" | Header: Indicações; Footer: Indique |

### Verificação no código (38.4)

- `frontend/app/indique/page.tsx`: usa `getCodigoIndicacao()` → `GET /api/v2/conta/codigo-indicacao`; exibe link personalizado; botão compartilhar WhatsApp.
- `frontend/app/conta/indicacoes/page.tsx`: usa `getIndicacoes()` → `GET /api/v2/conta/indicacoes`; exibe total_indicados, total_compradores, creditos_ganhos, lista de itens.
- `api/src/Controller/ClienteController.php`: `codigo-indicacao`, `indicacoes` implementados.
- `frontend/components/layout/Header.tsx`: link "Indicações" → `/conta/indicacoes`.
- `frontend/components/layout/Footer.tsx`: link "Indique" → `/indique`.

### Conclusão 38.4

**✅ Equivalente.** A v2 cobre o fluxo do afiliado:
- `/indique` — link personalizado e compartilhamento
- `/conta/indicacoes` — indicados, compradores, créditos ganhos
- Aprovação de pedidos feita pelo admin (modelo mais adequado)

O `/afiliado` na v2 é landing para não logados ("Quero ser afiliado"); o painel do afiliado logado está em `/indique` + `/conta/indicacoes`.

---

## Resumo

| Fase | Resultado | Ação sugerida |
|------|-----------|---------------|
| 38.1 | ✅ Equivalente | Nenhuma — getProximos inclui concursos especiais |
| 38.2 | ✅ Implementado | CarrinhoItemCard com expandir/colapsar e formatação por sigla |
| 38.4 | ✅ Equivalente | Nenhuma |

---

## Implementação 38.2 (concluída)

- **CarrinhoItemCard:** botão "Ver detalhes" / "Ver todos os jogos" com área expansível
- **formatarJogoCarrinho.ts:** formatação por sigla (TM, ST, SS, MM)
- **API CarrinhoService:** `sigla` e `numeros_on` (unserializado) nos itens
