# Fluxo Completo: Jogos Individuais, Bolões e Conferência

Documentação do fluxo da plataforma desde a criação do jogo até o resultado e conferência.

---

## Visão Geral do Fluxo

```mermaid
flowchart TB
    subgraph entrada [Entrada]
        JogoIndividual[Jogo Individual]
        Bolao[Bolão]
        Fechamento[Fechamento]
    end
    
    subgraph selecao [Seleção]
        View[View - Escolha dezenas]
        CampoExtra[Campo extra se houver]
    end
    
    subgraph persistencia [Persistência]
        CarrinhoUtil[CarrinhoUtil]
        BolaoController[BolaoController]
        Grupo[grupo]
        BolaoTable[bolao]
    end
    
    subgraph sorteio [Pós-sorteio]
        Concurso[Concurso - numeros_sorteio]
        Conferir[ConcursoController::conferirAction]
        Resultado[Resultado - valor_premio]
    end
    
    JogoIndividual --> View
    Bolao --> View
    Fechamento --> View
    View --> CampoExtra
    CampoExtra --> CarrinhoUtil
    CarrinhoUtil --> BolaoController
    BolaoController --> Grupo
    BolaoController --> BolaoTable
    Concurso --> Conferir
    Conferir --> Resultado
```

---

## 1. Jogos Individuais

### Fluxo
1. Usuário acessa página da loteria (ex: `/apostar-na-mega-sena`)
2. Seleciona dezenas no volante (e campo extra: mês ST, trevos MM, time TM)
3. JavaScript monta payload: `numeros`, `dezenas`, `id_loteria`, `id_concurso`
4. Envia para `BolaoController::add_meu_bolao` ou fluxo equivalente
5. `CarrinhoUtil::addItem()` adiciona ao carrinho (sessão)
6. Na finalização: cria `grupo` (individual=1) + `bolao` com jogos

### Formato por loteria
- **LF, MG, QN, LM, DS:** array de números
- **ST:** números + último elemento = mês (1-12)
- **TM:** 10 números + índice do time (TimesDao)
- **SS:** formato XY (coluna.dígito), ex: 11, 25, 37
- **MM:** dezenas (7-50) + trevos (1-6); `numeros_on` com meta

---

## 2. Bolões

### Fluxo
1. Usuário acessa "Criar bolão" (ex: `criar-bolao-mega-sena` → loteria=MG)
2. Define: quantidade de cotas, valor por cota, tipo (bolão ou fechamento)
3. Para fechamento: usa matriz (grupos de números) para gerar combinações
4. `BolaoController::fazer_meu_bolaoAction` ou `fazer_meu_fechamentoAction`
5. Cria `grupo` (individual=0) + `bolao` com todos os jogos serializados

### Filtros para listagem
`GrupoDao::getBoloesParaVenda`:
- individual = 0
- cotas != 0, cotas_disponiveis != 0
- bloqueado != TRUE

### Multiplicadores
Cada loteria tem função `_gerarMultiplos*` para calcular quantos bilhetes de cada faixa uma aposta múltipla gera:
- Lotofácil: `_gerarMultiplosLoto`
- Mega-Sena: `_gerarMultiplosMega`
- Quina: `_gerarMultiplosQuina`
- Dupla Sena: `_gerarMultiplosDupla`
- Dia de Sorte: `_gerarMultiplosDiaDeSorte`
- Lotomania: `_gerarMultiplosLotomania`

---

## 3. Conferência

### Disparo
`ConcursoController::conferirAction($id_concurso)` — conferência administrativa por concurso.

### Fluxo interno
1. Carrega bolões do concurso
2. Obtém números sorteados (`numeros_sorteio`, `numeros_sorteio2` para DS)
3. Obtém `resultado_premiacao` (valores por faixa)
4. Para cada bolão: `_conferirBolao()`

### Lógica por sigla

| Sigla | Lógica |
|-------|--------|
| **MM** | Separa dezenas e trevos; usa `_calcularMultiplosMaisMilionariaFaixa`; soma prêmio por faixa 2+1 até 6+2 |
| **SS** | Agrupa jogados por coluna (1-7); compara cada coluna com sorteio; conta acertos por coluna |
| **ST** | Ignora último elemento (mês) para contar acertos nas dezenas; confere mês separado; soma `valor_premio_mes_sorte` |
| **TM** | Inclui time; `valor_premio_time` se acertar time |
| **DS** | Usa `numeros_sorteio` e `numeros_sorteio2`; pode premiar em ambos os sorteios |
| **LF, MG, QN, LM** | `array_uintersect` entre sorteados e jogados; multiplicadores por quantidade marcada |

### resultado_premiacao
Serialized na tabela `concurso`:
- `vl` = array de valores por faixa (índice = acertos - minimo_acerto)
- Para ST: `mes_sorte`, `valor_premio_mes_sorte`
- Para TM: `time`
- Para MM: 10 faixas (2+1, 2+2, ..., 6+2)

### Saída
Registros em tabela de resultado com: `id_bolao`, `premiado`, `valor_premio`, `numeros_acertados`.

---

## 4. Exibição de Resultados

- Cada loteria tem `resultadosAction()` e view `resultados.php`
- Exibe último concurso, histórico, maiores premiações
- Para MM: usar `_formatarTrevosSorteados`, `_formatarApostaMaisMilionariaModal` (global-functions.php)
- Para SS: `_formatarApostasViewBolao`, `_formatarApostasViewCarrinho` com sigla SS

---

## 5. Horários de Bloqueio (Configuration.php)

- `HORA_BLOQUEIO_INDIVIDUAL`: 17:00
- `HORA_BLOQUEIO_INDIVIDUAL_SABADO`: 15:00
- `HORA_BLOQUEIO_INDIVIDUAL_DOMINGO`: 15:00
- `HORA_BLOQUEIO_BOLOES`: 20:00
- `HORA_BLOQUEIO_SUPER_SETE`: 17:30 (SS tem horário diferente)
