@extends('adminlte::page') @section('title', $instalacao->nome) @section('content_header') @stop @section('content') @php $statusLabels = [ 'ativa' => 'Ativa', 'inativa' => 'Inativa', 'manutencao' => 'Manutenção', 'erro' => 'Erro', ]; $domainBase = config('gestao.domain_base', 'waygest.com.br'); $frontendUrl = 'https://'.$instalacao->slug.'.'.$domainBase; $apiTokenInstalacao = $instalacao->getConfiguracaoEnv('API_TOKEN'); $podeExecutarArtisanApi = auth()->check() && auth()->user()->can('gestao-write'); $podeSshTailLog = $podeExecutarArtisanApi && config('gestao.ssh_log_tail_enabled'); $modoSuspensaoEfetivo = $instalacao->modoSuspensaoEfetivo(); $modosSuspensaoEtiqueta = \App\Models\Instalacao::modosSuspensaoEtiqueta(); $sshTailMeta = data_get($instalacao->metadados, 'ssh_log_tail'); $sshTailMetaOk = is_array($sshTailMeta) && filled(trim((string) ($sshTailMeta['host'] ?? ''))) && filled(trim((string) ($sshTailMeta['user'] ?? ''))) && filled(trim((string) ($sshTailMeta['remote_deploy_path'] ?? ''))); $stripeDash = \App\Support\Billing\StripeDashboardLinks::baseUrl(); $urlStripeCustomer = \App\Support\Billing\StripeDashboardLinks::customerUrl($instalacao->psp_customer_id); $urlStripeSub = \App\Support\Billing\StripeDashboardLinks::subscriptionUrl($instalacao->psp_subscription_id); $cor1 = $instalacao->cor1 ?? '#6C63FF'; $cor2 = $instalacao->cor2 ?? '#2D3142'; $tenantCronUiEnabled = (bool) config('gestao.tenant_cron.enabled', false) && filled(trim((string) config('gestao.tenant_cron.api_base_path', ''))); $tenantCronMeta = data_get($instalacao->metadados, 'tenant_cron'); $tenantCronRegistado = is_array($tenantCronMeta) && ! empty($tenantCronMeta['registered_at']); @endphp
Ficha comercial · Instalação #{{ $instalacao->id }}
Operação whitelabel · slug {{ $instalacao->slug }}
· criada em {{ $instalacao->created_at->format('d/m/Y') }}
No cPanel, vá em Domínios → Zone Editor (ou Editor de zona), selecione o domínio {{ $cname['zone'] }} e clique em Adicionar registro.
Isso fará {{ $cname['full_domain'] }} apontar para a Vercel. Após salvar, aguarde alguns minutos e clique em Refresh no domínio na Vercel.
{{ $statusLabels[$instalacao->status] ?? ucfirst($instalacao->status) }}
Status operacional
{{ $instalacao->versao ?? '—' }}
Versão do produto
{{ $instalacao->plano_label ?? '—' }}
Plano comercial
{{ $instalacao->suspensa_comercialmente ? 'Suspensa' : 'Activa' }}
Situação comercial
{{ $instalacao->slug }}
{{ $instalacao->nome }}
{{ $instalacao->database_username }}
Usado como Authorization: Bearer com X-Instalacao-Id: {{ $instalacao->id }}.
Corresponde a LOGS_GESTAO_TOKEN em env/.env.{{ $instalacao->slug }}.
Nenhum API_TOKEN configurado.
Sincronizado via webhooks quando configurado; metadata instalacao_id na subscrição.
Alterar estado comercial (manual)
Webhooks PSP só alteram a flag de suspensão — nunca o modo. Toda alteração manual exige motivo e gera evento em eventos comerciais.
@if($instalacao->suspensa_comercialmente) @else @endifStripe (operador)
GESTAO_STRIPE_DASHBOARD_BASE para atalhos ao Dashboard.
@endif
@can('gestao-write')
@if(config('gestao.psp.stripe_secret_key') && $instalacao->psp_customer_id)
@endif
@endcan
Portal: defina GESTAO_STRIPE_SECRET_KEY e configure o Customer Portal na Stripe.
Portal: aguarde sincronização do psp_customer_id (webhook).
Não foi possível carregar faturas. Verifique a chave e os logs.
@elseif(empty($stripeInvoices['invoices']))Nenhuma fatura encontrada para este cliente.
@else| Fatura | Data | Estado | Pago | |
|---|---|---|---|---|
{{ \Illuminate\Support\Str::limit((string) ($inv['number'] ?? $inv['id'] ?? ''), 32) }} |
{{ $created ? $created->format('d/m/Y H:i') : '—' }} | {{ $inv['status'] ?? '—' }} | {{ $paidFmt }} | @if(!empty($inv['hosted_invoice_url'])) Ver @endif @if(!empty($inv['invoice_pdf'])) PDF @endif |
Últimas {{ count($stripeInvoices['invoices']) }} faturas via API Stripe.
@endif{{ session('ssh_tail_output_resumo') }}
Nenhum registro em LogInstalacao para esta instalação.
Os envios da API aparecem aqui quando LOGS_GESTAO_* estiver configurado.
Leitura das últimas linhas de storage/logs/laravel.log via SSH só leitura quando o envio para a API não estiver a funcionar.
Crie duas tarefas cron com periodicidade * * * * * (cada minuto) e cole cada comando no campo Command.
1. schedule:run (tenant {{ $instalacao->slug }})
{{ $manualCron['schedule'] }}
2. queue:work (fila Redis {{ $instalacao->slug }})
{{ $manualCron['worker'] }}
Regista no cPanel schedule:run e queue:work com
--env={{ $instalacao->slug }} e fila Redis {{ $instalacao->slug }}
(padrão produção Waygest).
Base API: {{ config('gestao.tenant_cron.api_base_path') }}
· PHP: {{ config('gestao.tenant_cron.php_binary') ?: (config('gestao.deploy_homologacao.php_binary') ?: '/usr/local/bin/ea-php83') }}
{{ session('artisan_output_resumo') }}
Perfil {{ $rotina['profile'] ?? '—' }}
· --env={{ $rotina['env'] ?? '—' }}
@if(!empty($rotina['base_path']))
· pasta {{ $rotina['base_path'] }}
@endif
php artisan {{ $step['command'] ?? '?' }} --env={{ $rotina['env'] ?? '?' }}
@if($step['ok'] ?? false)
— OK
@else
— Erro (exit {{ $step['exit_code'] ?? '?' }})
@endif
{{ $step['output'] ?? '' }}
Executa cache clear, migrations do core e addons:migrate-installed na API compartilhada com --env={{ $instalacao->slug }} (só muda o env do tenant), sem git pull.
Pasta: API_PATH ou GESTAO_API_CRON_BASE_PATH (ex.: /home/waygest/api.waygest.com.br).
Equivalente ao terminal no servidor cPanel (PHP 8.3).
php artisan {{ $cmd }} --env={{ $instalacao->slug }}Em lote (vários tenants em sequência): Atualizar APIs (tenants) · Homologação (pasta dedicada): Atualizar API Homologação
Executa a sequência de cache/clear e migrations na API desta instalação, sem git pull. Equivalente ao terminal, com saída por comando abaixo.
Homologação (--env={{ $deployHomologConfig['artisan_env'] ?? 'homologacao' }})
php artisan {{ $cmd }}Produção (--env={{ $deployProdConfig['artisan_env'] ?? 'producao' }})
php artisan {{ $cmd }}Deploy em lote (git pull + rotina por tenant): Homologação · Produção · Atualizar APIs (cache/migrate/addons por slug): tenants em sequência · API Homologação
Executa na API, com --env={{ $instalacao->slug }}: optimize:clear, config:clear, cache:clear, config:cache, route:clear e migrate --force.
Executa db:seed --force com a classe em GESTAO_INSTALACAO_SEED_CLASS. Pode alterar dados existentes.
Ações de migrations/seeder/deploy exigem papel super_admin (permissão gestao-write).