# La Vicc — Gestor + Club

Monólito **Laravel 13** com **MySQL/MariaDB** (SQLite opcional em dev), dois módulos por subdomínio compartilhando o mesmo banco:

| Módulo | Domínio local | Descrição |
|--------|---------------|-----------|
| **Gestor** | `gestor.lavicc.test` | Cadastro, ciclo, acertos, financeiro |
| **Club** | `club.lavicc.test` | Programa de fidelidade (revendedoras) |

Protótipos de referência em [`andre/`](andre/).

## Requisitos

- PHP 8.3+
- Composer 2
- Node 20+
- MySQL/MariaDB (ex.: XAMPP) ou SQLite para desenvolvimento

## Setup rápido

```bash
composer install
cp .env.example .env
php artisan key:generate
php artisan migrate --seed
php artisan storage:link
npm install && npm run build
```

### Banco de dados (XAMPP)

Crie o banco `lavicc` no phpMyAdmin e configure no `.env`:

```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lavicc
DB_USERNAME=root
DB_PASSWORD=
```

### E-mail (AWS SES via SMTP)

Em desenvolvimento sem SES, use `MAIL_MAILER=log` (mensagens em `storage/logs`).

Em produção (ou para testar envio real), use SMTP do SES — **não** precisa do pacote `aws/aws-sdk-php`:

```env
MAIL_MAILER=smtp
MAIL_HOST=email-smtp.<região>.amazonaws.com
MAIL_PORT=587
MAIL_SCHEME=null
MAIL_USERNAME=<smtp-username-ses>
MAIL_PASSWORD=<smtp-password-ses>
MAIL_FROM_ADDRESS="endereco-verificado@seudominio.com"
MAIL_FROM_NAME="La Vicc"
```

- `MAIL_SCHEME` aceita só `null`/`smtp` (porta 587, STARTTLS) ou `smtps` (porta 465). Não use `tls`.
- `MAIL_FROM_ADDRESS` deve ser identidade ou domínio **já verificados** na SES.
- Em conta SES em **sandbox**, só envia para destinatários verificados.
- O e-mail de convite Club (`Definir senha`) é enfileirado (`ShouldQueue`): rode `php artisan queue:work`.

### Virtual host (Apache/XAMPP)

Aponte o `DocumentRoot` para `public/` do projeto (Gestor e Club no mesmo diretório):

```apache
DocumentRoot "C:/caminho/para/vivalavicc/public"
```

Inclua `AllowOverride All` e `Require all granted` no bloco `<Directory>`.

### Hosts locais

```
127.0.0.1 gestor.lavicc.test club.lavicc.test
```

### Jueri

```env
JUERI_BASE_URL=https://jueri.com.br/sis
JUERI_CLIENTE_SISTEMA=<slug-do-tenant>
JUERI_TOKEN=<token-bearer>
JUERI_SYNC_INTERVAL=15
JUERI_WEBHOOK_SECRET=<secret-forte>
# Status Jueri (fk_status_pedido_id): 1=Aberto, 2=Baixado, 3=Cancelado, 4=Perdido
JUERI_PEDIDO_STATUS_ABERTOS=1
```

**Sync manual** (inline, não precisa de queue):

```bash
php artisan jueri:sync revendedores   # credenciais + paginação
php artisan jueri:sync pedidos        # maleta Club + acertos Gestor (modelo consignado)
php artisan jueri:sync financeiro
php artisan jueri:sync                # os três, nessa ordem
```

**Pontuação Club (consignado):** elegibilidade e faixas “Vendas acima” usam o `valor_total` do **pedido baixado**, não a tabela `vendas` do Jueri.

**Maleta no Club:** `tem_maleta` só fica `true` se existir pedido operacional com status **Aberto** (`JUERI_PEDIDO_STATUS_ABERTOS`, padrão `1`). Baixado (`2`), cancelado (`3`) e perdido (`4`) não contam — alinhado à API Jueri.

Se os cards ficarem zerados ou errados após deploy:

```bash
php artisan club:status              # diagnóstico por status (1 Aberto, 2 Baixado…)
php artisan jueri:sync pedidos       # reimporta pedidos com status normalizado
php artisan club:fix-maletas         # backfill status do payload + recalcula tem_maleta
```

Confirme no `.env`: `JUERI_PEDIDO_STATUS_ABERTOS=1` (não use `2`/`3`/`4`).

**Banco limpo para 1º sync real** (sem dados demo que colidem `jueri_id`):

```bash
php artisan migrate:fresh --seed --seeder=MinimalSeeder
```

Login: `admin@lavicc.com` / `Lv!cC-H0ml0g-2026#Seg`

**Webhook:** `POST http://gestor.lavicc.test/integrations/jueri/webhook`  
Header `X-Jueri-Key` = `JUERI_WEBHOOK_SECRET`. Requer `php artisan queue:work` (jobs async).

**Club — matrícula e login automáticos**

- O sync de **pedidos** operacionais matricula a revendedora no Club (`ClubMembro`) e, se houver **e-mail válido** no cadastro Jueri e o endereço ainda não estiver em uso, cria um `User` (`role=revendedora`) e enfileira o e-mail **Definir senha** (link no domínio Club).
- Sem e-mail (ou e-mail já usado): só o membro; login continua manual na aba Usuários.
- Em produção: configure `MAIL_*`, `CLUB_DOMAIN` e mantenha `php artisan queue:work` (a notificação é `ShouldQueue`).
- Backfill após o 1º sync ou após deploy:

```bash
php artisan club:status              # inclui totais de membros, users e gaps de e-mail/login
php artisan club:bootstrap-membros --dry-run
php artisan club:bootstrap-membros   # membros faltantes + logins pendentes
```

**Testes automatizados** (API simulada com `Http::fake`):

```bash
php artisan test tests/Feature/Jueri/
php artisan test tests/Feature/Club/ClubBootstrapCommandTest.php
php artisan test tests/Feature/Club/ClubProvisioningTest.php
php artisan test tests/Feature/Club/ClubMaletaMetricsTest.php
```

Fixtures em `tests/Fixtures/Jueri/` — após um sync real, exporte `jueri_payload` anonimizado para enriquecer os testes.

## Usuários demo (seed)

| E-mail | Senha | Módulo |
|--------|-------|--------|
| admin@lavicc.com | Lv!cC-H0ml0g-2026#Seg | Gestor (`gestor.lavicc.test`) |
| operador@lavicc.com | Lv!cC-H0ml0g-2026#Seg | Club (operador) |
| club-admin@lavicc.com | Lv!cC-H0ml0g-2026#Seg | Club (admin) |
| ana@email.com | Lv!cC-H0ml0g-2026#Seg | Club (revendedora Ouro) |
| julia@email.com | Lv!cC-H0ml0g-2026#Seg | Club (revendedora Diamante) |
| pedro@email.com | Lv!cC-H0ml0g-2026#Seg | Club (revendedora Prata) |

### Seeds demo Gestor

`php artisan migrate:fresh --seed` popula também o **GestorDemoSeeder**: ~531 revendedoras ativas, HQ, caixa e financeiro de Jun/2026 alinhados ao protótipo `andre/LaViccGestor.html`. Os 7 cadastros do Club permanecem no seed fundacional; o bloco demo é fictício e pode ser omitido no futuro com um flag dedicado.

## Desenvolvimento

Com XAMPP + Vite:

```bash
npm run dev
```

Acesse `http://gestor.lavicc.test` e `http://club.lavicc.test`.

Gestor e Club usam cookies de sessão distintos por subdomínio — é possível manter os dois logados no mesmo navegador (ex.: admin no Gestor e revendedora no Club). Após deploy com sessão compartilhada antiga, limpe cookies de `*.lavicc.test` ou `*.vivalavicc.app` uma vez.

Scheduler (sync Jueri a cada 15 min):

```bash
php artisan schedule:work
```

Queue:

```bash
php artisan queue:work
```
