@push('styles')
@endpush
@php
// Los counts ahora se basan en TODOS los proyectos del user
// (no solo los del filtro activo) — calculados en el controller.
$totalProjects = $allProjectsCount;
$activeCount = $statusCounts['active'] ?? 0;
$pendingCount = ($statusCounts['required'] ?? 0) + ($statusCounts['on_development'] ?? 0);
$failedCount = $statusCounts['failed'] ?? 0;
$pausedCount = $statusCounts['paused'] ?? 0;
$archivedCount = $statusCounts['archived'] ?? 0;
// Lista de proyectos con problema (failed) — para el banner top y CTA Atención.
$failedProjects = $projects->where('pipeline_status', \App\Models\TenantProject::STATUS_FAILED);
// Total mensual: monetario sigue basándose en el filtro visible (lo que
// el cliente ve abajo). Si todos están en trial, mostramos el monto
// futuro (cuando salgan de trial) para que sepa cuánto va a pagar.
$monthlyActive = $projects->where('pipeline_status', 'active')->sum('amount_usd');
$monthlyPotential = $projects->whereNotIn('pipeline_status', ['paused', 'failed', 'archived'])
->sum('amount_usd');
$earliestTrial = $projects->whereNotNull('trial_ends_at')
->filter(fn($p) => $p->trial_ends_at && $p->trial_ends_at->isFuture())
->sortBy('trial_ends_at')
->first();
@endphp
@php
// Welcome screen persistente. Aparece para:
// · Users fresh (< 24hs) con proyecto en provisión → modo "in-progress"
// · Users fresh sin ningún proyecto → modo "no-projects" (3 pasos)
// · Cualquier user con ?welcome=1 manual
// Se oculta automáticamente cuando el primer proyecto está active
// o con ?hide-welcome=1 (dismiss explícito).
$isFreshUser = $user->created_at && $user->created_at->isAfter(now()->subDay());
$hasInProgress = $projects->whereIn('pipeline_status', ['required', 'on_development'])->isNotEmpty();
$hasNoProjects = $allProjectsCount === 0;
$showWelcome = (request('welcome') || ($isFreshUser && ($hasInProgress || $hasNoProjects))) && !request('hide-welcome');
$onboardingMode = $hasNoProjects ? 'no-projects' : 'in-progress';
$firstProject = $projects->first();
@endphp
@if($showWelcome && $onboardingMode === 'no-projects')
¡Bienvenido a BewPro, {{ $user->first_name ?: explode('@', $user->email)[0] }}!
Acá vas a gestionar tus sitios web, suscripciones y soporte. Te dejamos los próximos pasos para arrancar.
1
Completá tu perfil
Datos personales y de facturación para que tu sitio se entregue a tiempo.
@if($pct >= 20)
Base de datos configurada y credenciales de acceso listas
@else
Configurando base de datos segura...
@endif
@if($pct >= 40)
Certificado de seguridad SSL (HTTPS) registrado
@elseif($pct >= 20)
Registrando certificado de seguridad SSL...
@else
Instalando certificado de seguridad SSL
@endif
@if($pct >= 70)
Plantilla de diseño deluxe y código clonado
@elseif($pct >= 40)
Copiando archivos del modelo deluxe...
@else
Copiando archivos del modelo deluxe
@endif
@if($pct >= 90)
Optimizaciones de velocidad y SEO aplicadas
@elseif($pct >= 70)
Aplicando optimizaciones de velocidad de carga...
@else
Aplicando optimizaciones de velocidad de carga
@endif
@if($pct >= 100)
Panel de administración en línea y listo para usar
@elseif($pct >= 90)
Creando credenciales finales del administrador...
@else
Creando credenciales finales del administrador
@endif
El reproductor se cargará automáticamente cuando el sitio web esté activo.Este video interactivo te enseñará a subir tu logo, cambiar títulos y personalizar textos.
📌 ¿Qué aprenderás en este tutorial rápido?
Paso 1: Acceder al panel de administración del sitio web.
Paso 2: Subir el logo de tu negocio en la barra de navegación.
Paso 3: Cambiar los títulos principales del banner Hero y guardar los cambios.
@endif
{{-- Atención requerida — proyectos con provisión fallada.
Aparece arriba de cualquier otro banner. Cada item linkea al detalle
del proyecto + soporte. Si el sync trajo info de error en
prospect_email/name lo mostramos como contexto. --}}
@if($failedCount > 0)
@endif
{{-- Trial expiring banner (Bloque B). Aparece si algún proyecto tiene
trial_ends_at en los próximos 7 días. CTA al Stripe Billing Portal
si el customer tiene billing usable; si no, deriva a soporte. --}}
@if($trialEndingSoon->isNotEmpty())
Tu trial termina pronto
Para mantener tu sitio activo, configurá un método de pago antes de que termine el período de prueba.
@endif
{{-- Banner soft de captura de datos: aparece si hay proyectos activos sin
prospect real / asesor / tier. Click → linkea al primer incompleto.
Sólo se muestra cuando hay incompletos; no compite con failed/trial. --}}
@if(($incompleteCount ?? 0) > 0)
{{ $incompleteCount }} {{ $incompleteCount === 1 ? 'proyecto necesita' : 'proyectos necesitan' }} datos de cliente / asesor / tier.Completalos para tener tracking comercial al día.
@php
// Primer proyecto incompleto para deep-link al editor.
$firstIncomplete = $projects->first(function ($p) use ($user) {
if (!in_array($p->pipeline_status, [\App\Models\TenantProject::STATUS_ACTIVE, \App\Models\TenantProject::STATUS_ON_DEVELOPMENT], true)) return false;
return empty($p->prospect_email)
|| $p->prospect_email === $user->email
|| empty($p->closer_user_id)
|| empty($p->tier);
});
@endphp
@if($firstIncomplete)
Empezar por {{ \Illuminate\Support\Str::limit($firstIncomplete->project_name, 30) }}
@endif
{{ $project->project_name }}
@if($project->product_name)
{{ $project->product_label }}
@endif
@if(!$project->delivery_status || $project->delivery_status === \App\Models\TenantProject::DELIVERY_COMPLETED)
{{-- no badge para completed (es el estado default) --}}
@else
{{ $deliveryLabel }}
@endif
@if($project->trial_ends_at && $project->trial_ends_at->isFuture())
Trial hasta {{ $project->trial_ends_at->format('d/m/Y') }}
@endif
@php
// Mostrar prospect info solo cuando aporta — si prospect_name = project_name
// y prospect_email = email del user logueado, no aporta info nueva.
$showName = $project->prospect_name && trim($project->prospect_name) !== trim($project->project_name);
$showEmail = $project->prospect_email && $project->prospect_email !== $user->email;
@endphp
@if($showName || $showEmail)
@if($project->domain && $project->isReachable())
{{ $project->domain }}
@if(!$project->isLive())
en desarrollo
@endif
{{-- Botón "Abrir admin" — atajo al panel de admin del sitio del cliente.
Solo si sitio responde y pipeline_status=active (no on_development). --}}
@if($project->isLive())
@php
// Antigüedad: fecha de alta + tiempo desde alta. Mostramos created_at
// siempre (es el dato estable) y last_synced_at como freshness check
// si difiere significativamente.
$alta = $project->created_at;
$sync = $project->last_synced_at;
$isStale = $sync && $sync->lt(now()->subHours(2));
@endphp
@if($alta)
{{ $alta->format('d/m/Y') }}{{ $alta->diffForHumans() }}
@if($project->isProvisioning() && $alta->lt(now()->subHour()))
{{ $alta->diffForHumans(now(), \Carbon\CarbonInterface::DIFF_ABSOLUTE) }} en {{ $project->status_badge[0] }}
@elseif($sync && $isStale)
sync {{ $sync->diffForHumans() }}
@endif
@else
—
@endif
{{-- ACCIÓN PRIMARIA: entrar al admin del sitio.
En mobile pasa a full-width para ser tappable. --}}
@if($project->isReachable() && $project->admin_url)
Entrar al admin
@elseif($project->isProvisioning())
Provisionando...
@endif
{{-- Acciones secundarias: detalle + delivery + billing portal --}}
{{-- Marcar entrega: solo si el proyecto es active/on_dev
(no tiene sentido sobre failed/archived). --}}
@if(in_array($project->pipeline_status, [\App\Models\TenantProject::STATUS_ACTIVE, \App\Models\TenantProject::STATUS_ON_DEVELOPMENT], true))
@endif
@if($project->hasUsableBilling())
@endif
{{-- Borrar: solo visible si la policy delete() autoriza
(failed/archived/paused/required + owner o reseller).
Active queda explicitamente excluido. --}}
@can('delete', $project)
@endcan
@endforeach
@endif
{{-- ════════ Modal: marcar / editar estado de entrega ════════
Reutilizado por la tabla principal y por las cards de "En entrega".
Se popula vía data-* en el botón trigger. --}}
{{-- ════════ Modal: borrar proyecto desde la tabla ════════
Reusado por cualquier botón trash en filas (failed/archived/paused/required).
Populated via data-* en el botón trigger. --}}