{{-- Mis Proyectos — vista CLIENT-FACING (owner del proyecto). Branding por proyecto: intenta cargar el favicon/logo desde el dominio del tenant (sin necesidad de saber el path exacto, el navegador resuelve la URL del propio sitio). Si falla, fallback a avatar con inicial del nombre. Diferencia con index.blade.php (reseller): sin handoff / showcase / delivery_notes (esos viven en /reseller/projects). --}} @push('styles') @endpush
{{-- Trial banner ──────────────────────────────────────────────── --}} @if($trialEndingSoon && $trialEndingSoon->count() > 0)
Tu período de prueba está por terminar
Agregá un método de pago para que tus proyectos sigan funcionando sin interrupciones. Gestionar pagos →
@endif {{-- Provisioning banner ──────────────────────────────────────── --}} @php $provisioning = $projects->whereIn('pipeline_status', ['required', 'on_development']); @endphp @if($provisioning->count() > 0)
{{ $provisioning->count() === 1 ? 'Tu proyecto se está preparando' : "{$provisioning->count()} proyectos se están preparando" }}
Recibirás un email con las credenciales cuando esté listo (~20-30 min desde la compra). Revisá la carpeta de spam si no llega.
@endif {{-- Stats cards ──────────────────────────────────────────────── --}}
{{ $activeCount }}
{{ $activeCount === 1 ? 'proyecto activo' : 'proyectos activos' }}
${{ number_format($mrrUsd, 0) }}/mes
tu plan mensual
@if($nextBilling)
{{ $nextBilling->next_billing_date->format('d/m') }}
próximo cobro · {{ $nextBilling->project_name }}
@else
sin próximo cobro programado
@endif
{{-- Empty state o grilla de proyectos ────────────────────────── --}} @if($projects->count() === 0) @else

Tus proyectos ({{ $projects->count() }})

Sumar proyecto
@foreach($projects as $project) @php [$badgeLabel, $badgeClass] = $project->status_badge; $isLive = $project->isLive() && $project->domain; $isProvisioning = $project->isProvisioning(); $isFailed = $project->pipeline_status === \App\Models\TenantProject::STATUS_FAILED; $isPaused = $project->pipeline_status === \App\Models\TenantProject::STATUS_PAUSED; // Hero color tone según estado $heroTone = $isLive ? 'tone-success' : ($isFailed ? 'tone-danger' : ($isPaused ? 'tone-warning' : 'tone-info')); // Status dot color $dotColor = $isLive ? 'green' : ($isFailed ? 'red' : ($isPaused ? 'amber' : 'blue')); // Inicial para el avatar fallback $initial = strtoupper(mb_substr($project->project_name, 0, 1, 'UTF-8')); // URL del logo del tenant — cacheado en master DB por // bewpro:refresh-tenant-logos (scraping diario del home // del tenant). Si null, fallback al avatar con inicial. $logoUrl = $project->logo_url; @endphp
{{-- Hero con avatar y status floating --}}
{{ $badgeLabel }}
@if($logoUrl) {{-- Intento de cargar logo del tenant — onerror cambia a fallback --}} {{ $project->project_name }} @else
{{ $initial }}
@endif
{{-- Body --}}

{{ $project->project_name }}

@if($project->domain) {{ $project->domain }} @endif @if($project->trial_ends_at && $project->trial_ends_at->isFuture())
🎁 Prueba hasta {{ $project->trial_ends_at->format('d/m') }}
@endif
Plan
{{ $project->product_label ?? $project->product_name ?? '—' }}
Precio
@if($project->amount_usd > 0) ${{ number_format($project->amount_usd, 0) }}/mes @else @endif
Próximo cobro
@if($project->next_billing_date) {{ $project->next_billing_date->format('d/m/y') }} @if($project->next_billing_date->isPast()) ⚠ vencido @endif @else @endif
Activo desde
{{ $project->created_at->format('M Y') }}
@if($isProvisioning)
Configurando tu sitio (~20-30 min)
@elseif($isFailed)
Hubo un problema. Contactá soporte
@endif {{-- Acciones --}}
@if($isLive) Abrir admin @endif Gestionar
@endforeach
@endif {{-- Soporte ──────────────────────────────────────────────────── --}}
¿Necesitás ayuda?
Respondemos en menos de 4 horas hábiles. Adjuntá screenshots si es algo visual.
Abrir un ticket