@push('styles') @endpush
@if(session('success'))
{{ session('success') }}
@endif @if(session('error'))
{{ session('error') }}
@endif {{-- Seguimientos pendientes — tabla (partial) --}} @include('modules.clients.reseller.missiles._followups_table') {{-- Prep pendiente — tabla (partial) --}} @include('modules.clients.reseller.missiles._prep_table') {{-- ════════ Scope toggle (Pendientes / Convertidos / Todos) ════════ --}} @php $qsKeep = request()->except(['scope', 'status', 'page']); $scopeOptions = [ 'pending' => ['label' => 'Pendientes', 'desc' => 'draft + branding + ready', 'icon' => 'fa-rocket', 'tone' => 'primary'], 'launched' => ['label' => 'Convertidos', 'desc' => 'misiles ya acertados', 'icon' => 'fa-bullseye', 'tone' => 'success'], 'all' => ['label' => 'Todos', 'desc' => 'incluye rechazados', 'icon' => 'fa-eye', 'tone' => 'secondary'], ]; @endphp
Ver:
@foreach($scopeOptions as $key => $opt) @php $url = route('reseller.missiles.index', array_merge($qsKeep, ['scope' => $key])); $isActive = $scopeFilter === $key; @endphp {{ $opt['label'] }} {{ $scopeCounts[$key] }} @endforeach
@if($scopeFilter === 'pending') Vista por defecto — oculta los ya convertidos @elseif($scopeFilter === 'launched') Solo misiles ya acertados — link a tenant activo en la columna de status @endif {{-- Toggle "Sin contactar" — separado del scope, se combina con él --}} @if(($untouchedCount ?? 0) > 0 || ($contactFilter ?? '') === 'untouched') @php $contactQs = request()->except(['contact', 'page']); $untouchedActive = ($contactFilter ?? '') === 'untouched'; $untouchedUrl = $untouchedActive ? route('reseller.missiles.index', $contactQs) : route('reseller.missiles.index', array_merge($contactQs, ['contact' => 'untouched'])); @endphp Sin contactar {{ $untouchedCount }} @if($untouchedActive)@endif @endif @if(!empty($isCloserOnly)) Cartera del Reseller — read-only en estructura, podés contactar y trackear @endif
{{-- ════════ Embudo: tasas de conversión (no solo conteos) ════════ --}}
Lead → Lanzado
{{ $funnel['rate_lead_launched'] }}%
{{ $funnel['launched'] }} de {{ $funnel['pipeline_total'] }} leads
Lanzado → Contactado
{{ $funnel['rate_launched_contacted'] }}%
{{ $funnel['contacted'] }} de {{ $funnel['launched'] }} lanzados
Lanzado → Pagando
{{ $funnel['rate_launched_paying'] }}%
{{ $funnel['converted'] }} convertidos
Follow-ups vencidos
{{ $followupCounts['overdue'] }}
{{ $followupCounts['today'] }} hoy · {{ $followupCounts['total'] }} agendados
{{-- ════════ Stats cards por estado ════════ --}} @php $cards = [ ['key' => '', 'label' => 'Total', 'count' => $counts['total'], 'icon' => 'fa-rocket', 'tone' => 'primary'], ['key' => 'draft', 'label' => 'Recopilando', 'count' => $counts['draft'], 'icon' => 'fa-pencil', 'tone' => 'light'], ['key' => 'branding_pending', 'label' => 'Branding req.', 'count' => $counts['branding_pending'], 'icon' => 'fa-palette', 'tone' => 'warning'], ['key' => 'ready', 'label' => 'Listos', 'count' => $counts['ready'], 'icon' => 'fa-circle-check', 'tone' => 'success'], ['key' => 'launched', 'label' => 'Enviados', 'count' => $counts['launched'], 'icon' => 'fa-paper-plane', 'tone' => 'info'], ['key' => 'rejected', 'label' => 'Rechazados', 'count' => $counts['rejected'], 'icon' => 'fa-xmark', 'tone' => 'danger'], ]; @endphp
@foreach($cards as $c) @continue($c['count'] === 0 && $c['key'] !== '') @endforeach
{{-- ════════ Toolbar de filtros estratégicos ════════ --}}
@if($statusFilter)@endif
@if(count($activeFilters) > 0) Limpiar @endif @if(auth()->user()->hasAnyRole(['System Admin', 'Super Admin'])) Comando @endif Tablero de seguimiento Salud de productos
{{-- ════════ Chips de filtros activos (removibles individualmente) ════════ --}} @if(count($activeFilters) > 0) @php $filterLabels = [ 'status' => 'Estado', 'product' => 'Producto', 'closer' => 'Asesor', 'date_from' => 'Desde', 'date_to' => 'Hasta', 'completeness' => 'Completitud', 'prep' => 'Prep', 'q' => 'Búsqueda', ]; @endphp
Filtros activos: @foreach($activeFilters as $key => $value) @php // Etiqueta humana del valor (closer → nombre, status → label, etc.) $valueLabel = $value; if ($key === 'closer') { $c = $closers->firstWhere('id', (int)$value); $valueLabel = $c ? (trim($c->first_name.' '.$c->last_name) ?: $c->email) : "#$value"; } elseif ($key === 'completeness') { $valueLabel = $value === 'complete' ? 'completos' : 'incompletos'; } // URL al mismo filtro pero sin esta key $removeQuery = request()->except([$key, 'page']); @endphp {{ $filterLabels[$key] ?? $key }}: {{ $valueLabel }} @endforeach
@endif {{-- ════════ Sub-stats por producto (cuando NO se filtró producto específico) ════════ --}} @if($productStats->count() > 0 && !$productFilter)
Por producto: @foreach($productStats as $slug => $ps) {{ $slug }} {{ $ps->total }} @if($ps->ready > 0) ·{{ $ps->ready }}✓ @endif @endforeach
@endif {{-- ════════ Banner contextual de "Lanzar todos los filtrados" ════════ --}} @if(count($launchableIds) > 0 && count($activeFilters) > 0)
{{ count($launchableIds) }} misil(es) launcheable(s) con los filtros actuales.
@endif {{-- ════════ Tabla principal ════════ Los inline forms (launch, delete) NO pueden estar dentro de otro form. El bulk-launch se hace via fetch/JS-built form (cdBulkLaunch()). --}}

Misiles ({{ $missiles->total() }})

0 seleccionados
@if($missiles->isEmpty())

Sin misiles cargados

Empezá a recopilar leads acá. Cada misil tiene su subdomain + producto + email del cliente y se lanza cuando esté listo.

@else
{{-- ════════ Quick-add row siempre visible al tope ════════ Pattern Airtable: tipear campos, Tab entre ellos, Enter o botón "+" → AJAX POST → row aparece debajo → inputs limpios + focus al primero para rapid-fire. Sin recargar página. --}} @foreach($missiles as $m) @include('modules.clients.reseller.missiles._row', ['m' => $m, 'cores' => $cores, 'closers' => $closers]) @endforeach
Proyecto / Subdominio Prospecto Producto Outreach Estado Actualizado Acciones
se auto-resuelve
{{ $missiles->links() }}
@endif
{{-- ════════ Modal: crear / editar misil ════════ --}} {{-- ════════ Modal: Bulk import multilínea ════════ --}} {{-- ════════ Modal: Outreach (timeline + form) ════════ --}} @push('scripts') @endpush