Auto commit: 2026-04-06T06:47:23.706Z
This commit is contained in:
parent
11ba79824c
commit
066b212d79
@ -10,21 +10,29 @@
|
||||
<h1 style="font-size:clamp(2.15rem,4vw,3.7rem);max-width:14ch;">Reserva cerrada.</h1>
|
||||
<p>
|
||||
{{ $booking->customer_name }} ya quedó registrado para <strong>{{ $booking->offer->title }}</strong>.
|
||||
Este paso cierra el funnel demo con un evento real de <code>booking_completed</code>.
|
||||
Aquí se ve el valor del MVP: un trayecto real terminó en una intención comercial medible y atribuible.
|
||||
</p>
|
||||
|
||||
<div class="list">
|
||||
<div class="list-item">Booking UUID: {{ $booking->uuid }}</div>
|
||||
<div class="list-item">Estado: {{ ucfirst($booking->status) }}</div>
|
||||
<div class="list-item">Importe: {{ $booking->amount ? '€'.number_format((float) $booking->amount, 2) : 'Pendiente' }}</div>
|
||||
<div class="list-item">Comisión estimada: {{ $booking->commission_amount ? '€'.number_format((float) $booking->commission_amount, 2) : 'Pendiente' }}</div>
|
||||
</div>
|
||||
|
||||
<div class="notice">
|
||||
<strong>Qué demuestra este cierre:</strong>
|
||||
el taxi no fue solo transporte. Funcionó como disparador de una reserva adicional con valor económico visible.
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<aside class="card">
|
||||
<span class="eyebrow">Resumen de atribución</span>
|
||||
<span class="eyebrow">Lectura de negocio</span>
|
||||
<div class="list">
|
||||
<div class="list-item">Ride vinculado: {{ $booking->ride?->uuid ?? 'Reserva directa' }}</div>
|
||||
<div class="list-item">Recomendación vinculada: {{ $booking->recommendation?->id ? '#'.$booking->recommendation->position : 'No' }}</div>
|
||||
<div class="list-item">Canal de origen: {{ $booking->ride?->source_channel ? ucfirst($booking->ride->source_channel) : 'Directo' }}</div>
|
||||
<div class="list-item">Zona: {{ $booking->ride?->context_zone ?: ($booking->offer->location_label ?: 'General') }}</div>
|
||||
<div class="list-item">Recomendación vinculada: {{ $booking->recommendation?->id ? 'Top '.$booking->recommendation->position : 'No' }}</div>
|
||||
<div class="list-item">Email cliente: {{ $booking->customer_email ?: 'No informado' }}</div>
|
||||
</div>
|
||||
<div class="cta-row" style="margin-top:18px;">
|
||||
|
||||
@ -4,34 +4,64 @@
|
||||
@section('meta_description', $offer->excerpt ?: 'Detalle de oferta contextual con reserva simple en TAXILANZ Demo.')
|
||||
|
||||
@section('content')
|
||||
@php
|
||||
$categoryLabels = [
|
||||
'restaurant' => 'Restaurante',
|
||||
'experience' => 'Experiencia',
|
||||
'activity' => 'Actividad',
|
||||
'service' => 'Servicio',
|
||||
];
|
||||
@endphp
|
||||
<section class="split">
|
||||
<article class="card offer-card">
|
||||
<div class="offer-visual" aria-hidden="true"></div>
|
||||
<div>
|
||||
<span class="eyebrow">4 · Detalle de oferta</span>
|
||||
<span class="eyebrow">4 · Propuesta contextual</span>
|
||||
<h1 style="font-size:clamp(2.15rem,4vw,3.6rem);max-width:14ch;">{{ $offer->title }}</h1>
|
||||
<p>{{ $offer->description ?: $offer->excerpt }}</p>
|
||||
<p>
|
||||
{{ $offer->description ?: $offer->excerpt }}
|
||||
Esta pantalla debe sentirse como una continuación natural del trayecto: útil, cercana y rápida de confirmar.
|
||||
</p>
|
||||
<div class="offer-meta" style="margin-top:16px;">
|
||||
<span class="pill">{{ ucfirst($offer->category) }}</span>
|
||||
<span class="pill">{{ $categoryLabels[$offer->category] ?? ucfirst($offer->category) }}</span>
|
||||
@if($offer->location_label)<span class="pill">{{ $offer->location_label }}</span>@endif
|
||||
@if($offer->price_from)<span class="pill">Desde €{{ number_format((float) $offer->price_from, 0) }}</span>@endif
|
||||
@if($offer->duration_minutes)<span class="pill">{{ $offer->duration_minutes }} min</span>@endif
|
||||
@if($offer->available_now)<span class="pill">Disponible hoy</span>@endif
|
||||
</div>
|
||||
|
||||
@if($recommendation)
|
||||
<div class="notice" style="margin-top:18px;">
|
||||
<strong>Contexto de recomendación:</strong>
|
||||
esta visita viene del trayecto #{{ $ride?->id }} y de la sugerencia en posición {{ $recommendation->position }}.
|
||||
El clic ya cuenta como <code>recommendation_clicked</code>.
|
||||
<strong>Por qué aparece ahora:</strong>
|
||||
esta propuesta viene del trayecto hacia <strong>{{ $ride?->destination_label ?? ($offer->location_label ?: 'tu zona') }}</strong>
|
||||
y quedó posicionada como recomendación #{{ $recommendation->position }} por su cercanía y facilidad de cierre.
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="stats" style="margin-top:18px;">
|
||||
<div class="stat">
|
||||
<strong>{{ $offer->location_label ?: 'Zona activa' }}</strong>
|
||||
<span>cerca del destino o de la siguiente parada</span>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<strong>{{ $offer->duration_minutes ? $offer->duration_minutes.' min' : 'Flexible' }}</strong>
|
||||
<span>encaja mejor cuando la decisión es simple</span>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<strong>{{ $offer->price_from ? '€'.number_format((float) $offer->price_from, 0) : 'Consultar' }}</strong>
|
||||
<span>ticket visible para atribución comercial</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<aside class="card">
|
||||
<span class="eyebrow">5 · Reserva simple</span>
|
||||
<h2>Confirma en menos de un minuto</h2>
|
||||
<p>Este formulario crea la reserva y registra <code>booking_started</code> y <code>booking_completed</code>.</p>
|
||||
<p>
|
||||
Sin registro largo y sin checkout complejo. Justo lo necesario para que la demo enseñe conversión real,
|
||||
no solo intención.
|
||||
</p>
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="errors">
|
||||
@ -77,6 +107,11 @@
|
||||
</label>
|
||||
<button class="btn" type="submit">Confirmar reserva</button>
|
||||
</form>
|
||||
|
||||
<div class="notice">
|
||||
<strong>Lectura demo:</strong>
|
||||
al confirmar, el panel puede atribuir esta reserva al trayecto y a la recomendación que la activó.
|
||||
</div>
|
||||
</aside>
|
||||
</section>
|
||||
@endsection
|
||||
|
||||
@ -10,11 +10,26 @@
|
||||
<span class="eyebrow">2 · Taxi confirmado</span>
|
||||
<h1>Tu taxi llega en {{ $ride->eta_minutes ?? 6 }} min.</h1>
|
||||
<p>
|
||||
Mientras esperas, mostramos propuestas que encajan con tu destino y tu momento.
|
||||
Aquí es donde TAXILANZ deja claro que no vende “más catálogo”, sino mejores decisiones justo a tiempo.
|
||||
Perfecto. Mientras llega, TAXILANZ no te enseña un catálogo infinito: te propone solo opciones que
|
||||
encajan con este trayecto, cerca de tu destino y fáciles de decidir ahora mismo.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="stats">
|
||||
<div class="stat">
|
||||
<strong>{{ $ride->eta_minutes ?? 6 }} min</strong>
|
||||
<span>ventana de atención antes de subir</span>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<strong>{{ $recommendations->count() }}</strong>
|
||||
<span>opciones priorizadas, no ruido</span>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<strong>1 toque</strong>
|
||||
<span>para pasar del trayecto a la reserva</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="list" style="margin-top:0;">
|
||||
<div class="list-item"><strong>Recogida:</strong> {{ $ride->pickup_label }}</div>
|
||||
<div class="list-item"><strong>Destino:</strong> {{ $ride->destination_label }}</div>
|
||||
@ -25,19 +40,19 @@
|
||||
<aside class="card orb-wrap">
|
||||
<div class="stack">
|
||||
<div class="mini-card">
|
||||
<small>Señal capturada</small>
|
||||
<h3>Ride creado</h3>
|
||||
<p>La solicitud ya quedó registrada con contexto para atribución y operación.</p>
|
||||
<small>Qué está pasando</small>
|
||||
<h3>Momento de máxima intención</h3>
|
||||
<p>El usuario ya resolvió movilidad. Ahora está mucho más abierto a una siguiente decisión simple y útil.</p>
|
||||
</div>
|
||||
<div class="mini-card">
|
||||
<small>Motor simple</small>
|
||||
<h3>Solo 2–3 opciones</h3>
|
||||
<p>La lógica prioriza relevancia, disponibilidad y facilidad de cierre, no volumen.</p>
|
||||
<small>Cómo decide el motor</small>
|
||||
<h3>Cercanía + facilidad + timing</h3>
|
||||
<p>Priorizamos propuestas que pueden encajar hoy, sin desviar demasiado la ruta ni pedir demasiada energía.</p>
|
||||
</div>
|
||||
<div class="mini-card success">
|
||||
<small>Objetivo demo</small>
|
||||
<h3>Provocar clic útil</h3>
|
||||
<p>Si el usuario entra al detalle y reserva, el panel ya puede contar una historia de impacto.</p>
|
||||
<small>Lo importante en la demo</small>
|
||||
<h3>Taxi → sugerencia → clic</h3>
|
||||
<p>El objetivo aquí no es fidelización compleja. Es demostrar que el trayecto activa demanda accionable.</p>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
@ -49,30 +64,49 @@
|
||||
<span class="eyebrow">3 · Recomendaciones</span>
|
||||
<h2>Encajan con tu ruta ahora</h2>
|
||||
</div>
|
||||
<p>Estas vistas ya están generando eventos <code>recommendation_viewed</code>.</p>
|
||||
<p>Primero relevancia. Después variedad. Siempre con contexto.</p>
|
||||
</div>
|
||||
|
||||
<div class="cards">
|
||||
@foreach ($recommendations as $recommendation)
|
||||
<article class="card offer-card">
|
||||
<div class="offer-visual" aria-hidden="true"></div>
|
||||
<div>
|
||||
<div class="offer-meta">
|
||||
<span class="pill">Top {{ $recommendation->position }}</span>
|
||||
<span class="pill">Score {{ (int) $recommendation->score }}</span>
|
||||
@if($recommendation->offer->location_label)
|
||||
<span class="pill">{{ $recommendation->offer->location_label }}</span>
|
||||
@endif
|
||||
@if ($recommendations->isEmpty())
|
||||
<div class="notice">
|
||||
No hay recomendaciones activas para este trayecto todavía. La solicitud sí quedó registrada y lista para atribución.
|
||||
</div>
|
||||
@else
|
||||
<div class="cards">
|
||||
@foreach ($recommendations as $recommendation)
|
||||
<article class="card offer-card">
|
||||
<div class="offer-visual" aria-hidden="true"></div>
|
||||
<div>
|
||||
<div class="offer-meta">
|
||||
<span class="pill">Top {{ $recommendation->position }}</span>
|
||||
<span class="pill">{{ $recommendation->position === 1 ? 'Parada rápida' : 'Plan al llegar' }}</span>
|
||||
@if($recommendation->offer->available_now)
|
||||
<span class="pill">Disponible hoy</span>
|
||||
@endif
|
||||
@if($recommendation->offer->location_label)
|
||||
<span class="pill">{{ $recommendation->offer->location_label }}</span>
|
||||
@endif
|
||||
</div>
|
||||
<h3 style="margin-top:14px;">{{ $recommendation->offer->title }}</h3>
|
||||
<p>{{ $recommendation->offer->excerpt }}</p>
|
||||
|
||||
<div class="list" style="margin-top:14px;">
|
||||
@if($recommendation->offer->duration_minutes)
|
||||
<div class="list-item"><strong>Duración:</strong> {{ $recommendation->offer->duration_minutes }} min · pensada para decidir sin fricción</div>
|
||||
@endif
|
||||
@if($recommendation->offer->price_from)
|
||||
<div class="list-item"><strong>Desde:</strong> €{{ number_format((float) $recommendation->offer->price_from, 0) }} · ticket claro para mostrar impacto comercial</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="notice" style="margin-top:14px;">
|
||||
<strong>Por qué encaja:</strong> {{ $recommendation->reason }}
|
||||
</div>
|
||||
</div>
|
||||
<h3 style="margin-top:14px;">{{ $recommendation->offer->title }}</h3>
|
||||
<p>{{ $recommendation->offer->excerpt }}</p>
|
||||
<div class="notice" style="margin-top:14px;">
|
||||
<strong>Por qué encaja:</strong> {{ $recommendation->reason }}
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn" href="{{ route('offers.show', $recommendation->offer->slug) }}?ride={{ $ride->id }}&recommendation={{ $recommendation->id }}">Ver detalle y reservar</a>
|
||||
</article>
|
||||
@endforeach
|
||||
</div>
|
||||
<a class="btn" href="{{ route('offers.show', $recommendation->offer->slug) }}?ride={{ $ride->id }}&recommendation={{ $recommendation->id }}">Ver detalle y reservar</a>
|
||||
</article>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
</section>
|
||||
@endsection
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user