# LABRE-DX Contest — Sistema de Apuração (Laravel)

Sistema de apuração do **LABRE-DX Contest** — Fase 0 (migração incremental).

## Pré-requisitos

- PHP 8.2+ (Laragon já inclui)
- MySQL 8+ (banco **radio_log** já existente)
- Composer
- Laragon (Windows)

---

## Instalação no Laragon

### 1. Extrair o projeto

Extraia o ZIP em:
```
C:\laragon\www\projetos\labre-contest\
```

O Laragon detecta automaticamente e cria o virtual host:
`http://labre-contest.test`

### 2. Instalar dependências PHP

Abra o terminal do Laragon na pasta do projeto:
```bash
cd C:\laragon\www\projetos\labre-contest
composer install
```

### 3. Configurar o .env

O arquivo `.env` já vem pré-configurado para o Laragon com o banco `radio_log`.
Ajuste apenas se sua senha do MySQL for diferente de vazia:

```env
DB_DATABASE=radio_log
DB_USERNAME=root
DB_PASSWORD=          # vazio por padrão no Laragon
```

### 4. Gerar a chave da aplicação

```bash
php artisan key:generate
```

### 5. Criar apenas as tabelas do Laravel (NÃO toca no banco radio_log)

As tabelas do contest (logs_cabecalhos, qsos_result, etc.) já existem.
Este comando cria APENAS as tabelas internas do Laravel:

```bash
php artisan migrate
```

Tabelas criadas pelo migrate:
- `users`            — autenticação
- `sessions`         — sessões de login
- `cache`            — cache do framework
- `jobs`             — filas de processamento
- `failed_jobs`      — filas com erro
- `activity_log`     — auditoria de operações

### 6. Criar o usuário administrador

```bash
php artisan db:seed
```

Credenciais criadas:
- **E-mail:** `admin@admin.com`
- **Senha:**  `admin2026`

> ⚠️ Altere a senha após o primeiro login em produção!

### 7. Copiar o cty.dat

O arquivo `cty.dat` que estava em `legacy/pages/cty.dat` deve ser copiado para:
```
storage\app\contest\cty.dat
```

### 8. Copiar os scripts legados

Copie todos os arquivos `.php` do sistema anterior para:
```
legacy\pages\
```

### 9. Acessar o sistema

Abra: `http://labre-contest.test`

---

## Como funciona o Contest Ativo

O sistema **não usa datas no .env**. As datas de início e fim são lidas
diretamente da tabela `contest_date` do banco `radio_log`.

O contest ativo é identificado pelo campo `flag = 1`.

```sql
-- Ver contests cadastrados
SELECT id, name, start_date, end_date, flag FROM contest_date;

-- Ativar um contest
UPDATE contest_date SET flag = 1 WHERE id = 4;

-- Desativar todos os outros
UPDATE contest_date SET flag = 0 WHERE id != 4;
```

---

## Estrutura do Projeto

```
app/
  Http/Controllers/       → Controllers por domínio
    Auth/                 → Login / Logout
    Dashboard/            → Painel principal
    Logs/                 → Gerenciamento de LOGs
    Processamento/        → Etapas A, 1-11
    Relatorios/           → Relatórios e exportações
  Models/                 → Eloquent — mapeiam tabelas reais do radio_log
    ContestDate.php       → contest_date (flag=1 = ativo)
    LogCabecalho.php      → logs_cabecalhos
    LogQso.php            → logs_qsos
    QsoResult.php         → qsos_result (43 colunas)
    Categoria.php         → categorias
    BandFreq.php          → band_freq
    ClubBrasil.php        → clubsbrasil
    Dxcclist.php          → dxcclist
    Estadual.php          → estaduais
    Exchange.php          → exchange
    Operacao.php          → operacoes
    Record.php            → records
    ResultadoFinal.php    → resultados_final
    StagingScore.php      → staging_scores
  Services/Contest/       → Lógica de negócio (Fase 2)
    QsoPontuador.php      → Calcula pontos por QSO
    DxccResolver.php      → Resolve DXCC via cty.dat
  Providers/
    AppServiceProvider.php → Compartilha $contestAtivo com todas as views
config/
  contest.php             → Configurações do contest (sem datas — vêm do BD)
database/
  migrations/             → Apenas tabelas Laravel (NÃO do contest)
  seeders/                → Cria usuário admin@admin.com
legacy/
  pages/                  → Scripts PHP originais (copie aqui)
resources/views/          → Blade templates
routes/
  web.php                 → Todas as rotas (autenticadas via middleware auth)
storage/app/contest/      → cty.dat, logs Cabrillo, temporários
```

---

## Tabelas do Banco radio_log mapeadas

| Tabela | Model Laravel | Observação |
|--------|--------------|------------|
| contest_date | ContestDate | flag=1 = contest ativo |
| logs_cabecalhos | LogCabecalho | PK composta (id, callsign) |
| logs_qsos | LogQso | FK → logs_cabecalhos.id |
| qsos_result | QsoResult | rst_received (não rst_rcvd!) |
| categorias | Categoria | 73 categorias, unique: concatenado |
| band_freq | BandFreq | PK = Id (maiúsculo) |
| clubsbrasil | ClubBrasil | |
| dxcclist | Dxcclist | PK composta (Id, Prefixo, GMT) |
| estaduais | Estadual | Estações HQ das seccionais |
| exchange | Exchange | PK = idexchange |
| operacoes | Operacao | |
| records | Record | |
| resultados_final | ResultadoFinal | |
| staging_scores | StagingScore | PK = callsign (string) |

---

*PY6MV / Marcone — LABRE-DX Contest 2026*
