# Guia de Deploy — Portal de Dados Segunor
## Deploy via cPanel/FTP (sem SSH)

---

## 1. Preparar o ambiente local

```bash
# Instalar dependências PHP
composer install --optimize-autoloader --no-dev

# Gerar chave da aplicação
php artisan key:generate
# Copiar o valor APP_KEY gerado
```

## 2. Criar base de dados (phpMyAdmin)

1. Aceder ao cPanel → phpMyAdmin
2. Criar base de dados: `segunor_dados`
3. Criar utilizador com todas as permissões sobre essa BD
4. Importar o ficheiro `database/schema.sql`
5. Verificar que todas as tabelas foram criadas (13 tabelas)

**IMPORTANTE:** As passwords dos utilizadores iniciais no SQL são placeholder.
Após o primeiro deploy, use `php artisan tinker` ou phpMyAdmin para gerar hashes bcrypt reais:
```php
// No phpMyAdmin, execute:
UPDATE admin_users SET password = '$2y$12$...' WHERE email = 'admin@segunor.pt';
```

Ou simplesmente faça login com qualquer password e altere — o sistema força alteração no primeiro login.

**Método alternativo (recomendado):** Após upload, aceda a `dados.segunor.pt/admin/login` e use as credenciais:
- Email: `admin@segunor.pt` / Password: `Segunor2025!`
- O sistema pedirá para alterar a password imediatamente.

## 3. Configurar .env

Copiar `.env.example` para `.env` e preencher:

```env
APP_KEY=base64:XXXXXXXX  # Gerado no passo 1
APP_URL=https://dados.segunor.pt

DB_HOST=localhost
DB_DATABASE=segunor_dados
DB_USERNAME=seu_user
DB_PASSWORD=sua_password

MAIL_HOST=mail.segunor.pt
MAIL_PORT=465
MAIL_USERNAME=noreply@segunor.pt
MAIL_PASSWORD=password_do_email
MAIL_ENCRYPTION=ssl

R2_ACCESS_KEY_ID=sua_access_key
R2_SECRET_ACCESS_KEY=seu_secret
R2_BUCKET=segunor-dados
R2_ENDPOINT=https://SEU_ACCOUNT_ID.r2.cloudflarestorage.com

TURNSTILE_SITE_KEY=sua_site_key
TURNSTILE_SECRET_KEY=seu_secret_key
```

## 4. Upload via FTP

### Estrutura no servidor:
```
dados.segunor.pt/          ← Document root → public/
├── public_html/           ← Aqui vai o conteúdo de public/
│   ├── index.php          (editado — ver abaixo)
│   ├── .htaccess
│   └── ...
├── segunor-dados/         ← Código Laravel (fora do public_html)
│   ├── app/
│   ├── bootstrap/
│   ├── config/
│   ├── database/
│   ├── resources/
│   ├── routes/
│   ├── storage/
│   ├── vendor/
│   ├── .env
│   ├── artisan
│   └── composer.json
```

### Passos de upload:

1. **Upload da aplicação** para `segunor-dados/` (fora de public_html)
2. **Upload do conteúdo de `public/`** para `public_html/`
3. **Editar `public_html/index.php`** — alterar paths:

```php
<?php
use Illuminate\Http\Request;
define('LARAVEL_START', microtime(true));

if (file_exists($maintenance = __DIR__.'/../segunor-dados/storage/framework/maintenance.php')) {
    require $maintenance;
}

require __DIR__.'/../segunor-dados/vendor/autoload.php';

(require_once __DIR__.'/../segunor-dados/bootstrap/app.php')
    ->handleRequest(Request::capture());
```

4. **Colocar `.env`** em `segunor-dados/.env`

### Alternativa (se o domínio aponta diretamente):

Se puder configurar o document root no cPanel para apontar para `segunor-dados/public/`:
- Basta fazer upload de tudo para `segunor-dados/`
- Configurar no cPanel: Domínios → dados.segunor.pt → Document Root → `/segunor-dados/public`
- Não precisa de editar o index.php

## 5. Permissões de pastas

Via cPanel File Manager, definir permissões **775** em:
```
segunor-dados/storage/
segunor-dados/storage/framework/cache/
segunor-dados/storage/framework/sessions/
segunor-dados/storage/framework/views/
segunor-dados/storage/logs/
segunor-dados/bootstrap/cache/
```

## 6. Configurar Cron Job (Scheduler)

No cPanel → Cron Jobs, adicionar:
```
* * * * * cd /home/UTILIZADOR/segunor-dados && php artisan schedule:run >> /dev/null 2>&1
```

(Substituir `/home/UTILIZADOR/` pelo caminho real)

O scheduler executa automaticamente:
- Limpeza RGPD mensal (anonimização após 12 meses)

## 7. Configurar Cloudflare Turnstile

1. Aceder a https://dash.cloudflare.com → Turnstile
2. Adicionar site: `dados.segunor.pt`
3. Copiar Site Key e Secret Key para o `.env`

## 8. Verificações pós-deploy

- [ ] Aceder a `https://dados.segunor.pt` — deve aparecer a página inicial
- [ ] Aceder a `https://dados.segunor.pt/admin/login` — deve aparecer o login
- [ ] Login com `admin@segunor.pt` / `Segunor2025!` — deve pedir alterar password
- [ ] Testar submissão pública com dados de teste
- [ ] Verificar envio de email de confirmação
- [ ] Importar CSV de snapshot de teste
- [ ] Testar download de comprovativo (URL assinada R2)

---

## Credenciais iniciais

| Utilizador | Email | Password | Role |
|---|---|---|---|
| Administrador | admin@segunor.pt | Segunor2025! | Admin |
| Recursos Humanos | rh@segunor.pt | Segunor2025! | RH |
| Contabilidade | contabilidade@segunor.pt | Segunor2025! | Contabilidade |

**Todas as passwords devem ser alteradas no primeiro login.**

---

## Checklist de Segurança e RGPD

### Segurança
- [x] HTTPS obrigatório (configurar no cPanel/Cloudflare)
- [x] CSRF protection em todos os formulários
- [x] Rate limiting por IP nas submissões
- [x] Cloudflare Turnstile (anti-bot)
- [x] Bloqueio/degradação de IPs suspeitos
- [x] Passwords com requisitos fortes (10+ chars, maiúsc/minúsc/núm/especial)
- [x] 2FA opcional (TOTP ou email)
- [x] Sessões encriptadas, cookie secure + httpOnly
- [x] Audit log completo de todas as ações admin
- [x] Ficheiros armazenados em R2 privado (sem URLs públicas)
- [x] URLs assinadas temporárias (15 min) para downloads
- [x] XSS protection via Blade escaping
- [x] SQL injection protection via Eloquent/prepared statements
- [x] Deteção de IP fora de Portugal (flag, não bloqueia)
- [x] Score de suspeita automático
- [x] Separação de roles (Admin/RH/Contabilidade)

### RGPD
- [x] Retenção de 12 meses, com anonimização automática
- [x] Comando `php artisan rgpd:cleanup` para limpeza
- [x] Página pública de exercício de direitos RGPD
- [x] Notificação por email de pedidos RGPD
- [x] Gestão de pedidos RGPD no admin
- [x] Política de privacidade (base, a rever por jurídico)
- [x] Consentimento explícito no formulário (checkbox obrigatória)
- [x] Emails de confirmação sem dados pessoais
- [x] Hash do IP para auditoria pós-anonimização
- [x] Contabilidade com acesso limitado (sem contactos/documentos)
