# TasquinhaPOS — Instalação no cPanel

Guia para `mytasca.movimento-palco.pt` (cPanel partilhado, sem SSH).

---

## 1. Preparar o pacote (no teu computador)

Antes de fazer upload, gera os assets de produção:

```bash
composer install --no-dev --optimize-autoloader
npm install
npm run build
```

Cria um `.zip` da pasta TasquinhaPOS **incluindo**:

- `app/`, `bootstrap/`, `config/`, `database/`, `public/`, `resources/`, `routes/`, `storage/`, `vendor/`
- `artisan`, `composer.json`, `composer.lock`, `package.json`, `.env.example`
- `install.php`
- `public/build/` (gerado pelo `npm run build`)

**NÃO** incluir:

- `.env`, `.git/`, `node_modules/`, `storage/logs/*.log`, `storage/framework/cache/*`, `storage/framework/sessions/*`, `storage/framework/views/*`

---

## 2. Criar a base de dados no cPanel

1. cPanel → **MySQL® Databases**.
2. **Create New Database** → nome ex.: `mytasca_db` (cPanel adiciona o prefixo da conta automaticamente, fica algo como `movpalco_mytasca_db`).
3. **Add New User** → nome ex.: `mytasca_usr`, password forte.
4. **Add User To Database** → seleciona ambos → **All Privileges** → Make Changes.
5. Apontar:
   - **DB name:** `movpalco_mytasca_db` (o nome final apresentado)
   - **DB user:** `movpalco_mytasca_usr`
   - **DB pass:** ⟨password que escolheste⟩
   - **Host:** `localhost`
   - **Port:** `3306`

---

## 3. Configurar o subdomínio

1. cPanel → **Subdomains** (ou **Domains**).
2. Cria/edita `mytasca.movimento-palco.pt`.
3. **Document Root:** aponta para `public_html/mytasca/public` (vamos pôr o projeto em `public_html/mytasca/` mas servir só `public/`).

> ⚠️ É **crítico** que o Document Root seja `.../public` — não a raiz do projeto. Caso contrário o `.env` fica acessível pela web.

Se não conseguires alterar o Document Root nesse painel:
- Coloca o conteúdo de `public/` na raiz do subdomínio,
- Edita `index.php` para apontar `__DIR__.'/../'` → caminho absoluto da pasta com a app.
- (Posso gerar essa variante se for necessário, diz.)

---

## 4. Upload + extrair

1. cPanel → **File Manager** → entra em `public_html/`.
2. Cria pasta `mytasca/`.
3. Upload do `.zip` para `public_html/mytasca/`.
4. Extract.
5. Confirma a estrutura:
   ```
   public_html/mytasca/
   ├── app/
   ├── bootstrap/
   ├── public/         ← Document Root do subdomínio
   │   ├── index.php
   │   └── install.php  ← move install.php para AQUI (ver passo 5)
   ├── vendor/
   ├── ...
   └── install.php
   ```

---

## 5. Mover o instalador para `public/`

O `install.php` tem que ser **acessível pela web**. File Manager → **Move** `install.php` para `public_html/mytasca/public/install.php`.

Edita as duas linhas no topo do `install.php` para apontarem para a raiz do projeto:

Encontra:
```php
$base = __DIR__;
```

Substitui por:
```php
$base = dirname(__DIR__);
```

(Isto faz o instalador procurar `vendor/`, `.env`, etc. um nível acima — na raiz do projeto, não dentro de `public/`.)

---

## 6. Permissões

File Manager → seleciona as pastas → **Permissions**:

- `storage/` e tudo dentro: **775** (ou 755 se a conta cPanel correr como dono)
- `bootstrap/cache/`: **775**

Normalmente o cPanel já põe permissões corretas no upload, mas verifica.

---

## 7. Correr o instalador

1. Visita: **https://mytasca.movimento-palco.pt/install.php**
2. Confere que todos os requisitos têm ✓ verde.
3. Preenche:

   **Aplicação**
   - URL pública: `https://mytasca.movimento-palco.pt`
   - Nome: `Mytasca`

   **Base de dados**
   - Host: `localhost`
   - Porto: `3306`
   - BD: `movpalco_mytasca_db`
   - Utilizador: `movpalco_mytasca_usr`
   - Password: ⟨a tua⟩

   **Admin**
   - Nome: `Administrador`
   - Email: `admin@movimento-palco.pt`
   - PIN: `1111` (muda já depois)
   - Password: ⟨forte, ≥ 8 chars⟩

   **Seed:** ✅ marcar na primeira instalação para teres dados de demo. Desmarca se queres começar limpo.

4. Clica **Instalar TasquinhaPOS**.
5. Aguarda. No fim vais ver "✅ Instalação concluída". O `install.php` é apagado automaticamente.

> Se algo correr mal, o ficheiro fica para tentares de novo. Apaga `storage/installed.lock` antes de re-tentar.

---

## 8. Cron job para a fila (impressões + web push)

A fila está em `database` (não há Redis no cPanel partilhado), por isso precisas de um cron a processar jobs.

cPanel → **Cron Jobs** → adiciona:

- **Frequência:** Once per minute (`* * * * *`)
- **Command:**
  ```
  cd /home/movpalco/public_html/mytasca && /usr/local/bin/php artisan queue:work --stop-when-empty --max-time=55 >> storage/logs/queue.log 2>&1
  ```

Ajusta:
- `/home/movpalco/` → caminho real da tua home (vê em File Manager → barra de cima).
- `/usr/local/bin/php` → caminho real do PHP (cPanel → **MultiPHP Manager** ou pergunta no support; muitos cPanel usam `/usr/local/bin/ea-php83`).

> `--stop-when-empty` faz o worker terminar quando não há jobs, evitando processos zombie.
> `--max-time=55` garante que termina antes do próximo cron arrancar.

---

## 9. Cron para o scheduler do Laravel (opcional mas recomendado)

cPanel → **Cron Jobs** → adiciona segundo job:

- **Frequência:** Once per minute
- **Command:**
  ```
  cd /home/movpalco/public_html/mytasca && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
  ```

---

## 10. Verificações finais

Visita:

- ✅ `https://mytasca.movimento-palco.pt/` → POS (pede PIN)
- ✅ `https://mytasca.movimento-palco.pt/admin` → Filament (login: email + password)
- ❌ `https://mytasca.movimento-palco.pt/.env` → deve dar **403/404** (NUNCA conteúdo)
- ❌ `https://mytasca.movimento-palco.pt/storage/logs/laravel.log` → deve dar **403/404**

Se algum dos dois últimos retornar conteúdo, o Document Root está mal configurado — corrige antes de pôr em produção.

---

## 11. Notificações em tempo real (KDS / push)

A configuração da instalação põe `BROADCAST_CONNECTION=log`. Resultado:

- ✅ **Web Push** (notificações no telemóvel do waiter quando ticket fica pronto) — **funciona** porque é entregue por FCM/APNS, não precisa de WebSocket.
- ❌ **Atualização instantânea do KDS via WebSocket** — **desligada**. O KDS continua a funcionar mas atualiza só por refresh manual / polling Livewire.

Se quiseres realtime via WebSocket no cPanel, precisas:
- Ou um VPS com Reverb a correr como serviço (`php artisan reverb:start --host=0.0.0.0`),
- Ou um serviço gerido tipo **Pusher** ou **Ably** — basta mudar `BROADCAST_CONNECTION=pusher` + credenciais no `.env`.

---

## 12. Atualizações futuras

Para fazer deploy de uma versão nova:

1. Localmente: `git pull && composer install --no-dev -o && npm run build`
2. Faz upload dos ficheiros alterados (ou novo zip da pasta).
3. Via cPanel **Cron Jobs** → adiciona job **once** (executa uma vez):
   ```
   cd /home/movpalco/public_html/mytasca && /usr/local/bin/php artisan migrate --force && /usr/local/bin/php artisan config:cache && /usr/local/bin/php artisan route:cache && /usr/local/bin/php artisan view:cache
   ```
   Apaga o cron depois de correr.

Em alternativa, instala o **Terminal** do cPanel (se a tua conta o tiver) para correr os mesmos comandos manualmente.

---

## 13. PINs por defeito (se fizeste seed)

| Role     | Email                 | PIN  |
|----------|-----------------------|------|
| admin    | admin@tasquinha.test  | 1111 |
| manager  | maria@tasquinha.test  | 2222 |
| cashier  | joao@tasquinha.test   | 3333 |
| waiter   | ana@tasquinha.test    | 4444 |
| kitchen  | pedro@tasquinha.test  | 5555 |

**Muda os PINs imediatamente** no painel `/admin` → Users.

---

## Suporte / debug

- Logs: `public_html/mytasca/storage/logs/laravel.log` (via File Manager)
- Cron logs: `storage/logs/queue.log` (cria-se quando o cron corre)
- Limpar caches em emergência: apaga manualmente `bootstrap/cache/config.php`, `bootstrap/cache/routes-v7.php`, `bootstrap/cache/services.php` (recriam-se sozinhos).
