@push('styles') @endpush @php [$badgeLabel, $badgeClass] = $project->status_badge; @endphp
@if(session('error'))
{{ session('error') }}
@endif @if(session('success'))
{{ session('success') }}
@endif

{{ $project->project_name }}

@if($project->product_name) {{ $project->product_label }} @endif
{{ $badgeLabel }}
@if($statusDescription) @php $bannerClass = match ($project->pipeline_status) { \App\Models\TenantProject::STATUS_ACTIVE => 'is-active', \App\Models\TenantProject::STATUS_FAILED, \App\Models\TenantProject::STATUS_PAUSED => 'is-failed', default => '', }; $bannerIcon = match ($project->pipeline_status) { \App\Models\TenantProject::STATUS_ACTIVE => 'fa-check-circle', \App\Models\TenantProject::STATUS_FAILED => 'fa-triangle-exclamation', \App\Models\TenantProject::STATUS_PAUSED => 'fa-pause-circle', default => 'fa-info-circle', }; @endphp
{{ $statusDescription }}
@endif
{{-- 1. Tu sitio --}}
Tu sitio
@if($project->domain) {{-- ACCIÓN PRIMARIA: entrar al admin del sitio. Lo más usado por el Customer (90% de visitas) — botón grande primary, no enterrado al final. --}} @if($project->isReachable() && $project->admin_url)
Entrar al admin del sitio Editá contenido, fotos, productos, FAQs, equipo, etc. Si no tenés las credenciales, pedilas acá .
@endif
{{ $project->domain }} @if($project->isReachable()) Sitio en línea @elseif($project->pipeline_status === \App\Models\TenantProject::STATUS_FAILED) Provisionado pendiente — te contactamos por email @endif
{{-- Provisioning visual: progress bar + ETA cuando aún se está armando. Da info útil al cliente en lugar de "preparando..." vacío. --}} @if($project->isProvisioning()) @php [$pct, $etaText] = $project->provisioning_eta; @endphp
Progreso de la Instalación
{{ $etaText }} {{ $pct }}%
  • @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
@endif @else Asignaremos un dominio una vez completado el provisioning. @endif
{{-- 1.5 Estado de entrega — capa CD/reseller (delivery_status). Visible solo si user puede gestionarlo (policy manageDelivery). Editor inline: radio + textarea + Save. Sin modal. --}} @can('manageDelivery', $project)
Estado de entrega
@php $deliveryStatus = $project->delivery_status ?? \App\Models\TenantProject::DELIVERY_COMPLETED; $isCompleted = $deliveryStatus === \App\Models\TenantProject::DELIVERY_COMPLETED; $deliveryAge = $project->updated_at ?? $project->created_at; [$dLabel, $dBadge, $dIcon] = $project->delivery_badge; @endphp
{{ $dLabel }} @if($deliveryAge && !$isCompleted) Desde hace {{ $deliveryAge->diffForHumans(null, true) }} @elseif($isCompleted) Sin pendientes @endif
@if(!$isCompleted && $project->delivery_notes)
NOTAS

{{ $project->delivery_notes }}

@endif {{-- Editor inline. Auto-abierto si tracking sin notas (te empuja a llenar). --}}
delivery_notes ? 'open' : '' }}> {{ $isCompleted ? 'Marcar estado de entrega' : 'Editar estado' }}
@csrf @method('PATCH')
{{-- Plantillas rápidas (Phase B): clicks pre-llenan textarea --}}
@php $tpl = [ 'Dominio custom pendiente', 'Módulos extra a sumar', 'Ajustes finales con el cliente', 'Esperando contenido del cliente', 'Logo / branding pendiente', ]; @endphp @foreach($tpl as $t) @endforeach
@endcan {{-- 1.6 Datos del cliente final + asesoría — solo visible para owner/reseller (policy manageDelivery). Editor inline. --}} @can('manageDelivery', $project)
Datos del cliente + asesoría
@php $hasProspect = ($project->prospect_name && trim($project->prospect_name) !== trim($project->project_name)) || ($project->prospect_email && $project->prospect_email !== $user->email); $hasCloser = !empty($project->closer_user_id); $hasTier = !empty($project->tier); $isComplete = $hasProspect && $hasCloser && $hasTier; @endphp {{-- Resumen visible siempre --}}
Cliente final @if($hasProspect) {{ $project->prospect_name ?: '—' }} @if($project->prospect_email && $project->prospect_email !== $user->email) {{ $project->prospect_email }} @endif @else Falta capturar @endif
Asesor @if($hasCloser) @php $closerUser = $closers->firstWhere('id', $project->closer_user_id); @endphp {{ $closerUser ? trim($closerUser->first_name . ' ' . $closerUser->last_name) ?: $closerUser->email : "#{$project->closer_user_id}" }} @else Sin asignar @endif
Tier @if($hasTier) {{ $project->tier }} @else @endif
{{-- Editor inline (auto-abierto si falta data) --}}
{{ $isComplete ? 'Editar datos' : 'Completar datos' }}
@csrf @method('PATCH')
@endcan {{-- 2. Tu suscripción --}}
Tu suscripción
Producto {{ $project->product_name ? $project->product_label : 'Suscripción BewPro' }}
Plan @if($subscription['amount_usd'] !== null) USD {{ number_format($subscription['amount_usd'], 2) }} / mes @else — @endif
Estado @if($subscription['status']) {{ ucfirst($subscription['status']) }} @else No disponible @endif
Próximo cobro @if($subscription['next_charge_at']) {{ $subscription['next_charge_at']->format('d/m/Y') }} ({{ $subscription['next_charge_at']->diffForHumans() }}) @else @endif
@if($subscription['trial_ends_at'])
Trial hasta {{ $subscription['trial_ends_at']->format('d/m/Y') }}
@endif @if($subscription['cancel_at'])
Cancela el {{ $subscription['cancel_at']->format('d/m/Y') }}
@endif
{{-- 3. Acciones --}}
Acciones
@if($project->hasUsableBilling())
@csrf
@endif Solicitar soporte Solicitar reembolso
{{-- 4. ¿Querés más? --}}
¿Querés más?

Si necesitás módulos extras (galería, formularios, integraciones), cambiar de plan, o adquirir un proyecto nuevo, contactanos:

Abrir ticket
{{-- ════════ Zona peligrosa: borrar proyecto ════════ Solo visible si la policy delete() autoriza (failed/archived/paused/required + owner o reseller). Active queda explicitamente protegido. --}} @can('delete', $project)
Zona peligrosa

Borrar proyecto definitivamente

Limpia Stripe (cancela suscripción) + DNS Hostinger + VPS HestiaCP (cpanel user + DB + archivos) + marca Airtable como Archived con audit trail + borra el registro local. Sólo disponible para estados failed / archived / paused / required. Esta acción no se puede deshacer fácilmente.

{{-- Modal de confirmación con razón obligatoria --}} @endcan @push('scripts') @endpush