**Gerar scripts sql**
php artisan migrate --pretend

php artisan cache:clear && php artisan config:clear && php artisan route:cache && php artisan view:clear && php artisan route:list

**Resolver problemas de dependências Vue/Laravel Mix - Node.js v12**
# ✅ RESOLVIDO: Build funcionando com JavaScript básico sem Vue.js
# � Assets compilados: app.js (74.3 KiB) + app.css (184 KiB)

# SOLUÇÃO 1: Usar dependências compatíveis com Node 12 (SEM Vue.js) ✅ APLICADA
cd /var/www/html/gestao
rm -rf node_modules package-lock.json
npm cache clean --force
npm install
npm run dev

# SOLUÇÃO 2: Atualizar Node.js (Recomendado para longo prazo)
# Instalar NodeSource repository
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -

# Instalar Node.js 18 LTS
sudo apt-get install -y nodejs

# Verificar versão
node --version  # Deve mostrar v18.x.x
npm --version

# Reinstalar dependências com Node 18
cd /var/www/html/gestao
rm -rf node_modules package-lock.json
npm cache clean --force
npm install
npm run dev

# SOLUÇÃO 3: Usar Vue.js após atualizar Node.js
# (Só executar após SOLUÇÃO 2)
npm install vue@^3.2.0 @vue/compiler-sfc@^3.2.0 vue-loader@^16.8.0 --save-dev
# Depois descomentar .vue() no webpack.mix.js

npm run dev

npm run watch

**Baixar biblioteca para pdf**
composer require smalot/pdfparser


npm install

yarn install

composer install

composer update

**em alteraçoes**
composer dump-autoload

cp .env.example .env

php artisan key:generate

**STORAGE LINK - Solução para VirtualBox Shared Folders**
# ❌ O comando padrão NÃO funciona em VirtualBox shared folders (erro: Protocol error):
# php artisan storage:link

# ✅ Usar esta solução alternativa com bind mount:
mkdir -p public/storage
sudo mount --bind storage/app/public public/storage

# ✅ Ou usar a função criada no ~/.bashrc:
storage_link    # Para vincular
storage_unlink  # Para desvincular

# Verificar se funcionou:
ls -la public/storage/
mount | grep "public/storage"

# Testar acesso web:
echo "teste" > storage/app/public/teste.txt
curl http://localhost/gestao/public/storage/teste.txt
rm storage/app/public/teste.txt

**IMPORTANTE:** 
- O storage será acessível em: /gestao/public/storage/arquivo.ext
- O bind mount persiste até o reboot da VM
- Para tornar permanente, adicionar ao /etc/fstab ou executar storage_link após boot

**Verificar se storage está funcionando**
echo "<?php echo 'Storage test: ' . (file_exists(public_path('storage')) ? 'OK' : 'ERRO'); ?>" | php
ls -la public/ | grep storage

---

# 📁 Documentação - UploadFtpController

## 📍 Localização
`app/Http/Controllers/Admin/Ged/UploadFtpController.php`

## 🎯 Propósito
Controller responsável por gerenciar upload, listagem e exclusão de arquivos PDF em servidor FTP através de uma interface web administrativa.

## 🔧 Funcionalidades

### 1. **index()** - Listagem de Arquivos FTP
- **Rota**: GET `/admin/ged/upload-ftp`
- **Função**: Lista arquivos e diretórios do servidor FTP
- **Parâmetros**: 
  - `path` (opcional): Caminho do diretório FTP (padrão: `/`)
- **Retorna**: View com lista de arquivos, diretórios e breadcrumbs
- **Storage**: `\Storage::disk('ftp')->files($path)`

### 2. **store()** - Upload de Arquivos
- **Rota**: POST `/admin/ged/upload-ftp`
- **Função**: Faz upload de múltiplos arquivos PDF para o FTP
- **Validações**:
  - ✅ Arquivo obrigatório (array)
  - ✅ Tamanho máximo: 10MB por arquivo
  - ✅ Extensão: Apenas PDF
  - ✅ Não permite duplicatas
- **Processo**:
  1. Valida cada arquivo recebido
  2. Verifica se é PDF (.pdf)
  3. Checa duplicatas no FTP
  4. Salva no FTP: `\Storage::disk('ftp')->putFileAs($ftpPath, $file, $fileName)`
- **Retorna**: JSON (AJAX) ou redirect com mensagens de sucesso/erro

### 3. **destroy()** - Exclusão de Arquivos
- **Rota**: DELETE `/admin/ged/upload-ftp`
- **Função**: Remove arquivo específico do FTP
- **Autorização**: Gate `ged-upload-ftp-delete`
- **Parâmetros**:
  - `filename` (obrigatório): Nome do arquivo a deletar
  - `path` (opcional): Caminho do diretório
- **Storage**: `\Storage::disk('ftp')->delete($filename)`

## ⚙️ Configurações Necessárias

### Storage FTP
Configure em `config/filesystems.php`:
```php
'ftp' => [
    'driver' => 'ftp',
    'host' => env('FTP_HOST'),
    'username' => env('FTP_USERNAME'),
    'password' => env('FTP_PASSWORD'),
    'port' => env('FTP_PORT', 21),
    'root' => env('FTP_ROOT', '/'),
    'passive' => true,
    'ssl' => env('FTP_SSL', false),
    'timeout' => 30,
],
```

### Variáveis de Ambiente (.env)
```env
FTP_HOST=seu-servidor-ftp.com
FTP_USERNAME=usuario_ftp
FTP_PASSWORD=senha_ftp
FTP_PORT=21
FTP_ROOT=/
FTP_SSL=false
```

### Gate de Autorização
Configure em `AuthServiceProvider.php`:
```php
Gate::define('ged-upload-ftp-delete', function ($user) {
    return $user->hasPermission('ged-upload-ftp-delete');
});
```

## 🚀 Comandos de Teste

### Teste manual do FTP:
```bash
php artisan tinker
\Storage::disk('ftp')->files('/');
\Storage::disk('ftp')->directories('/');
```

### Verificar configuração:
```bash
php artisan config:show filesystems.disks.ftp
```

## 📋 Características Técnicas

- **Framework**: Laravel
- **Storage**: FTP Remoto (não local)
- **Tipos aceitos**: Apenas PDF
- **Tamanho máximo**: 10MB por arquivo
- **Upload múltiplo**: ✅ Sim
- **AJAX**: ✅ Suportado
- **Autorização**: ✅ Gates do Laravel
- **Validação**: ✅ Completa

## 🔍 Observações Importantes

1. **Não salva localmente**: Arquivos vão direto para o FTP, não passam por `storage/` ou `public/`
2. **Validação rigorosa**: Só aceita PDFs e verifica duplicatas
3. **Segurança**: Requer autorização para deletar arquivos
4. **Interface responsiva**: Suporta tanto requisições AJAX quanto formulários normais

## 🐛 Troubleshooting

### Erro: "Could not connect to FTP"
- Verificar credenciais FTP no `.env`
- Testar conectividade: `telnet FTP_HOST 21`

### Erro: "File already exists"
- Sistema não permite arquivos duplicados
- Renomear arquivo ou deletar o existente primeiro

### Erro: "Unauthorized"
- Usuário não tem permissão `ged-upload-ftp-delete`
- Verificar Gates e políticas de autorização



---

# ⏰ Laravel Scheduler - Configuração e Troubleshooting

## 📋 Configuração do Crontab

### Editar crontab:
```bash
crontab -e
```

### Configuração atual:
```bash
* * * * * cd /var/www/html/gestao && php artisan schedule:run >> /dev/null 2>&1
```

## 🔍 Teste Manual
```bash
cd /var/www/html/gestao && php artisan schedule:run
```

## 🐛 Troubleshooting - Cron não executa

### 1. **Verificar se o cron está ativo:**
```bash
sudo systemctl status cron
sudo systemctl start cron   # Se não estiver rodando
```

### 2. **Testar sem redirecionamento para ver erros:**
```bash
# Temporariamente usar:
* * * * * cd /var/www/html/gestao && php artisan schedule:run
```

### 3. **Criar log temporário para debug:**
```bash
* * * * * cd /var/www/html/gestao && php artisan schedule:run >> /tmp/laravel-cron.log 2>&1
```

### 4. **Verificar caminho absoluto do PHP:**
```bash
which php
# Usar caminho completo:
* * * * * cd /var/www/html/gestao && /usr/bin/php artisan schedule:run >> /dev/null 2>&1
```

### 5. **Verificar permissões:**
```bash
ls -la /var/www/html/gestao/artisan
# Deve ter permissão de execução
chmod +x /var/www/html/gestao/artisan
```

### 6. **Verificar usuário do cron:**
```bash
# Verificar se está no crontab do usuário correto
crontab -l
# Ou verificar crontab do root
sudo crontab -l
# Verificar outros usuários
sudo crontab -u ubuntu -l
```

### ⚠️ **IMPORTANTE - Remover crons duplicados:**
```bash
# Se houver crons antigos em /var/www/html/adm, remover:
sudo crontab -u ubuntu -e  # Deletar linhas antigas
sudo crontab -e             # Manter apenas a linha correta
```

### 7. **Verificar logs do sistema:**
```bash
grep CRON /var/log/syslog
tail -f /var/log/syslog | grep CRON
```

### 8. **Testar comando completo manualmente:**
```bash
# Simular exatamente o que o cron faz:
cd /var/www/html/gestao && /usr/bin/php artisan schedule:run
```

## ✅ **Configuração Recomendada Final:**

```bash
# Usando caminho absoluto do PHP e log para debug
* * * * * cd /var/www/html/gestao && /usr/bin/php artisan schedule:run >> /tmp/laravel-cron.log 2>&1

# Após confirmar funcionamento, usar:
* * * * * cd /var/www/html/gestao && /usr/bin/php artisan schedule:run >> /dev/null 2>&1
```

## 🕐 **Horários dos Comandos Agendados:**

### `ldap:import ldap`:
- **Frequência**: A cada 6 horas
- **Horário**: Entre 8h00 - 21h00
- **Dias**: Segunda a Sábado
- **Próximas execuções**: 8h00, 14h00, 20h00

### `app:importar-nacional-gps`:
- **Frequência**: A cada 6 horas  
- **Horário**: Entre 8h00 - 21h00
- **Dias**: Segunda a Sábado
- **Próximas execuções**: 8h00, 14h00, 20h00

## 🧪 **Para Teste Rápido:**
Temporariamente altere no `app/Console/Kernel.php`:
```php
->everyMinute()  // Em vez de ->everySixHours()
```

## 📝 **Comandos Úteis:**

```bash
# Ver último comando executado no cron
grep CRON /var/log/syslog | tail -5

# Verificar se Laravel detecta comandos agendados
php artisan schedule:list

# Executar manualmente um comando específico
php artisan app:importar-nacional-gps

# Verificar se o arquivo artisan existe e tem permissões
ls -la artisan
```

## 🚨 **PROBLEMA IDENTIFICADO - Dois Crontabs Ativos:**

### ⚠️ **Conflito: Dois usuários executando Laravel Scheduler:**

**Usuário `ubuntu`** (PROBLEMA):
```bash
sudo crontab -u ubuntu -l
*/1 * * * * /usr/bin/php /var/www/html/suporte/public/inc/mail/hesk_imap.php  # ✅ OK
* * * * * cd /var/www/html/adm && php artisan schedule:run                    # ❌ REMOVER
```

**Usuário `root`** (CORRETO):
```bash
sudo crontab -l  
* * * * * cd /var/www/html/gestao && php artisan schedule:run                 # ✅ MANTER
```

### 🔥 **Consequências do problema:**
- Execuções duplicadas e conflitantes
- Um cron tenta executar no caminho antigo (`/adm`)
- Outro executa no caminho correto (`/gestao`)
- Possíveis travamentos e erros de concorrência

### ⚠️ **AÇÃO NECESSÁRIA - Remover cron duplicado:**
```bash
# 1. Editar cron do usuário ubuntu
sudo crontab -u ubuntu -e

# 2. DELETAR esta linha:
# * * * * * cd /var/www/html/adm && php artisan schedule:run >> /dev/null 2>&1

# 3. MANTER apenas:
# */1 * * * * /usr/bin/php /var/www/html/suporte/public/inc/mail/hesk_imap.php >/dev/null 2>&1

# 4. Salvar e sair (Ctrl+X, Y, Enter)
```

### ✅ **Configuração CORRETA - Tudo no usuário `ubuntu`:**

**IMPORTANTE: Neste sistema, o cron só funciona no usuário `ubuntu`**

**Crontab do usuário `ubuntu` (CONFIGURAÇÃO ÚNICA):**
```bash
sudo crontab -u ubuntu -e
# Configuração completa:
*/1 * * * * /usr/bin/php /var/www/html/suporte/public/inc/mail/hesk_imap.php >/dev/null 2>&1
*/1 * * * * /usr/bin/php /var/www/html/suporte/public/inc/mail/hesk_pipe.php >/dev/null 2>&1
* * * * * cd /var/www/html/gestao && /usr/bin/php artisan schedule:run >> /dev/null 2>&1
0 7 * * * /sbin/reboot
5 7 * * * cd /var/www/html/gestao && /usr/bin/php artisan cache:clear && /usr/bin/php artisan config:clear && /usr/bin/php artisan route:cache && /usr/bin/php artisan view:clear >> /tmp/laravel-cache-clean.log 2>&1
```

**Crontab do usuário `root` (NÃO FUNCIONA NESTE SISTEMA):**
```bash
# O usuário root não executa crons neste ambiente
# Manter vazio ou não usar
```

### 🎯 **Características deste sistema:**
- ✅ Todos os crons devem estar no usuário `ubuntu`
- ✅ Sistema HESK e Laravel no mesmo usuário
- ✅ Reinicialização do servidor via usuário `ubuntu`
- ❌ Usuário `root` não executa crons automaticamente
- ✅ Controle centralizado no usuário `ubuntu`

---

## 🔄 **Reinicialização Automática do Servidor**

### **Adicionar reinício diário às 7h:**
```bash
sudo crontab -e
```

### **Configuração completa do crontab do usuário `ubuntu`:**
```bash
sudo crontab -u ubuntu -e
```

**Conteúdo completo:**
```bash
# Sistema de Suporte (HESK) - processamento de emails
*/1 * * * * /usr/bin/php /var/www/html/suporte/public/inc/mail/hesk_imap.php >/dev/null 2>&1
*/1 * * * * /usr/bin/php /var/www/html/suporte/public/inc/mail/hesk_pipe.php >/dev/null 2>&1

# Laravel Scheduler (Gestão) - a cada minuto  
* * * * * cd /var/www/html/gestao && /usr/bin/php artisan schedule:run >> /dev/null 2>&1

# Reinicialização automática do servidor - todos os dias às 7h
0 7 * * * /sbin/reboot

# Limpeza de cache Laravel - todos os dias às 7:05 (após reinício)
5 7 * * * cd /var/www/html/gestao && /usr/bin/php artisan cache:clear && /usr/bin/php artisan config:clear && /usr/bin/php artisan route:cache && /usr/bin/php artisan view:clear >> /tmp/laravel-cache-clean.log 2>&1
```

### 🕐 **Explicação do cron de reinício:**
```bash
0 7 * * *  # Minuto=0, Hora=7, Dia=*, Mês=*, DiaSemana=*
# Executa às 7:00 todos os dias da semana
```

### ⏰ **Outras opções de horário:**
```bash
# Reiniciar às 6h da manhã
0 6 * * * /sbin/reboot

# Reiniciar às 7h30
30 7 * * * /sbin/reboot  

# Reiniciar apenas de segunda a sexta às 7h
0 7 * * 1-5 /sbin/reboot

# Reiniciar apenas nos fins de semana às 8h
0 8 * * 0,6 /sbin/reboot
```

### 🛡️ **Comandos de reinício disponíveis:**
```bash
# Opção 1: Reinício imediato (recomendado)
0 7 * * * /sbin/reboot

# Opção 2: Shutdown e reinício
0 7 * * * /sbin/shutdown -r now

# Opção 3: Reinício com delay de 1 minuto
0 7 * * * /sbin/shutdown -r +1

# Opção 4: Reinício usando systemctl
0 7 * * * /bin/systemctl reboot
```

### ⚠️ **Considerações importantes:**
- ✅ **Backup automático**: Configure backups antes da reinicialização
- ✅ **Logs**: A reinicialização será registrada nos logs do sistema
- ✅ **Serviços**: Todos os serviços reiniciarão automaticamente
- ⚠️ **Conexões ativas**: Usuários conectados serão desconectados
- ⚠️ **Processos**: Processos em execução serão finalizados

### 📝 **Verificar se funcionou:**
```bash
# Ver quando foi a última reinicialização
last reboot

# Ver logs de reinicialização
grep reboot /var/log/syslog

# Verificar uptime do sistema
uptime
```

---

## 🧹 **Limpeza Automática de Cache Laravel**

### **Cache clean diário às 7:05:**
```bash
5 7 * * * cd /var/www/html/gestao && /usr/bin/php artisan cache:clear && /usr/bin/php artisan config:clear && /usr/bin/php artisan route:cache && /usr/bin/php artisan view:clear >> /tmp/laravel-cache-clean.log 2>&1
```

### 🕐 **Explicação do timing:**
- **7:00** → Servidor reinicia
- **7:05** → Laravel limpa e reconstroi cache (após sistema estabilizar)

### 📋 **O que o comando faz:**
```bash
php artisan cache:clear    # Limpa cache da aplicação
php artisan config:clear   # Limpa cache de configuração  
php artisan route:cache    # Reconstroi cache de rotas (otimização)
php artisan view:clear     # Limpa cache de views compiladas
# route:list foi removido pois só lista rotas (não necessário no cron)
```

### 🚀 **Benefícios da limpeza automática:**
- ✅ **Performance**: Remove cache corrompido
- ✅ **Configurações**: Aplica mudanças de `.env`
- ✅ **Rotas**: Otimiza roteamento com cache rebuild
- ✅ **Views**: Remove views compiladas antigas
- ✅ **Timing perfeito**: Executa após reinicialização

### 📝 **Comandos para monitorar:**
```bash
# Ver log da limpeza de cache
cat /tmp/laravel-cache-clean.log

# Ver últimas execuções
tail -f /tmp/laravel-cache-clean.log

# Testar comando manualmente
cd /var/www/html/gestao && php artisan cache:clear && php artisan config:clear && php artisan route:cache && php artisan view:clear

# Verificar se cache foi recriado
ls -la bootstrap/cache/
```

### ⏰ **Outras opções de horário:**
```bash
# A cada 6 horas
0 */6 * * * cd /var/www/html/gestao && php artisan cache:clear...

# Apenas segunda a sexta às 7:05
5 7 * * 1-5 cd /var/www/html/gestao && php artisan cache:clear...

# Duas vezes por dia (7:05 e 19:05)
5 7,19 * * * cd /var/www/html/gestao && php artisan cache:clear...
```

### ✅ **Verificar configuração do usuário ubuntu:**
```bash
# Ver configuração completa do crontab ubuntu
sudo crontab -u ubuntu -l

# Verificar se Laravel Scheduler está configurado
sudo crontab -u ubuntu -l | grep artisan    # DEVE retornar 1 linha

# Verificar se HESK está configurado  
sudo crontab -u ubuntu -l | grep hesk       # DEVE retornar 2 linhas

# Verificar se reinicialização está configurada
sudo crontab -u ubuntu -l | grep reboot     # DEVE retornar 1 linha

# Verificar se limpeza de cache está configurada
sudo crontab -u ubuntu -l | grep "cache:clear"  # DEVE retornar 1 linha

# Confirmar que root NÃO tem crons (se retornar erro, é normal)
sudo crontab -l | grep -v "^#" || echo "Root não tem crons - CORRETO"
```

### 🚨 **IMPORTANTE:**
- ✅ HESK permanece no usuário `ubuntu`
- ✅ Laravel Scheduler apenas no usuário `root`
- ❌ Laravel Scheduler NÃO deve estar em dois usuários