@extends('templates.adminlte') @section('content-header')

Eventos

@endsection @section('main-content') @php $now = \Carbon\Carbon::now('America/Mexico_City'); $resolveEventSubtotal = static function ($event) { if ((float) $event->price > 0) { return (float) $event->price; } return $event->packages->sum(function ($package) { $quantity = (int) ($package->pivot->quantity ?? 1); $unitPrice = (float) (($package->pivot->price ?? 0) > 0 ? $package->pivot->price : $package->price); return $unitPrice * max($quantity, 1); }); }; $resolveEventTotal = static function ($event) use ($resolveEventSubtotal) { $subtotal = $resolveEventSubtotal($event); $discount = (float) $event->discount; $discountAmount = $discount > 1 ? $discount : $subtotal * $discount; return max($subtotal - $discountAmount + (float) $event->travel_expenses, 0); }; $eventsToday = $events->filter(fn($event) => \Carbon\Carbon::parse($event->event_date, 'America/Mexico_City')->isToday())->count(); $eventsWithCrew = $events->filter(fn($event) => $event->employees->isNotEmpty())->count(); $customEvents = $events->filter(fn($event) => $event->packages->isEmpty() && $event->products->isNotEmpty())->count(); $projectedRevenue = $events->sum(fn($event) => $resolveEventTotal($event)); $upcomingEventsCount = $events->filter(fn($event) => \Carbon\Carbon::parse($event->event_date, 'America/Mexico_City')->gte($now->copy()->startOfDay()))->count(); $nearestEvent = $events->first(fn($event) => \Carbon\Carbon::parse($event->event_date, 'America/Mexico_City')->gte($now->copy()->startOfDay())) ?: $events->first(); @endphp
Agenda comercial {{ $rangeLabel }}

Listado operativo de eventos

Consulta contrataciones dentro de un rango de fechas específico. Por defecto la vista carga la semana actual para que la agenda empiece en el periodo más operativo.

Filtro de agenda

Rango de fechas

date_range
restart_alt Semana actual

Rango activo

{{ $rangeLabel }}

{{ $events->count() }} eventos encontrados en este periodo.

Eventos en rango

{{ $events->count() }}

contrataciones visibles con el filtro actual.

Eventos hoy

{{ $eventsToday }}

requieren seguimiento inmediato en la agenda.

Con personal asignado

{{ $eventsWithCrew }}

eventos ya ligados a equipo operativo.

Ingreso proyectado

${{ number_format($projectedRevenue, 2) }}

estimado con precio, descuento y viáticos.

Directorio de agenda

Eventos programados

Consulta cliente, fecha, paquete, responsable y monto dentro del rango seleccionado.

{{ $events->count() }} en rango {{ $upcomingEventsCount }} pendientes {{ $customEvents }} personalizados
@if ($nearestEvent)

Próximo evento relevante

{{ $nearestEvent->client_name ?: 'Cliente sin nombre' }} · {{ \Carbon\Carbon::parse($nearestEvent->event_date, 'America/Mexico_City')->locale('es')->isoFormat('D MMM YYYY, HH:mm') }}

@endif
@forelse ($events as $event) @php $eventDate = \Carbon\Carbon::parse($event->event_date, 'America/Mexico_City'); $packageNames = $event->packages ->map(function ($package) { $quantity = max((int) ($package->pivot->quantity ?? 1), 1); return $quantity > 1 ? $package->name . ' x' . $quantity : $package->name; }) ->filter() ->implode(', '); $responsible = $event->employees->first(); $eventTotal = $resolveEventTotal($event); if ($eventDate->lt($now->copy()->startOfDay())) { $statusLabel = 'Finalizado'; $statusBadge = 'border-primary-600/60 bg-primary-700/70 text-primary-100'; $statusDot = 'bg-primary-200'; } elseif ($eventDate->isToday()) { $statusLabel = 'Hoy'; $statusBadge = 'border-warning/30 bg-warning/10 text-warning'; $statusDot = 'bg-warning'; } elseif ($eventDate->between($now->copy()->startOfDay(), $now->copy()->endOfWeek(), true)) { $statusLabel = 'Esta semana'; $statusBadge = 'border-secondary/30 bg-secondary/10 text-secondary'; $statusDot = 'bg-secondary'; } else { $statusLabel = 'Programado'; $statusBadge = 'border-accent/30 bg-accent/10 text-accent'; $statusDot = 'bg-accent'; } @endphp @empty @endforelse
Cliente Fecha Tipo y paquete Responsable Estatus Monto Acciones

{{ $event->client_name ?: 'Cliente sin nombre' }}

{{ $event->event_address ?: 'Sin dirección del evento' }}

{{ $eventDate->locale('es')->isoFormat('D MMM YYYY') }}

{{ $eventDate->format('H:i') }} hrs

{{ optional($event->typeEvent)->name ?: 'Sin tipo' }}

{{ $packageNames !== '' ? \Illuminate\Support\Str::limit($packageNames, 52) : ($event->products->isNotEmpty() ? 'Paquete personalizado' : 'Sin paquete asignado') }}

@if ($responsible)

{{ $responsible->name }}

{{ $responsible->phone ?: 'Sin telefono registrado' }}

@else Sin asignar @endif
{{ $statusLabel }}

${{ number_format($eventTotal, 2) }}

visibility edit
@csrf @method('DELETE')
celebration

No hay eventos en este rango

Ajusta el filtro de fechas o registra una nueva contratación para alimentar la agenda operativa de este periodo.

{{ $rangeLabel }}

add_circle Registrar evento

Mostrando {{ $events->count() }} {{ \Illuminate\Support\Str::plural('evento', $events->count()) }} dentro de {{ $rangeLabel }}.

add_circle Agregar evento
@endsection