@extends('layouts.admin') @section('title', 'Mapa Operacional') @push('styles') @endpush @section('content') @php // Serializar reservas para o Alpine.js $reservationsJson = []; foreach ($reservations as $roomId => $resGroup) { foreach ($resGroup as $res) { $reservationsJson[] = [ 'id' => $res->id, 'locator' => $res->locator, 'room_id' => $res->room_id, 'status' => $res->status, 'guest_name' => $res->guest?->full_name ?? 'Hóspede', 'check_in' => $res->check_in_expected->format('Y-m-d'), 'check_out' => $res->check_out_expected->format('Y-m-d'), 'adults' => $res->adults, 'children' => $res->children, 'total_expected' => $res->total_expected, 'notes' => $res->notes, 'sales_channel' => $res->salesChannel?->name, 'channel_icon_html' => $res->salesChannel?->icon_html, 'channel_badge_color'=> $res->salesChannel?->badge_color, 'check_in_realized' => $res->check_in_realized?->format('d/m/Y H:i'), 'check_out_realized' => $res->check_out_realized?->format('d/m/Y H:i'), ]; } } $timelineDatesJson = array_map(fn($d) => $d->format('Y-m-d'), $timelineDates); $statusLabels = [ 'provisional' => 'Provisória', 'confirmed' => 'Confirmada', 'checked_in' => 'In-House', 'checked_out' => 'Check-Out', 'canceled' => 'Cancelada', 'no_show' => 'No-Show', ]; // Montar lista de quartos simplificada para o Alpine (inclui category_id para o simulador) $roomsList = []; foreach ($categories as $cat) { foreach ($cat->rooms as $room) { $roomsList[$room->id] = [ 'id' => $room->id, 'name' => $room->name, 'category' => $cat->name, 'room_category_id' => $cat->id, ]; } } @endphp
{{-- ═══════════════ TOOLBAR ═══════════════ --}}
Hoje
Pré-reservado Reservado Hospedado Finalizado Bloqueado Saída/Entrada
@if($categories->isEmpty())

Inventário Vazio

Cadastre Categorias e UHs para ativar o Mapa.

Iniciar Inventário
@else {{-- ═══════════════ MAPA em GRID ═══════════════ --}}
{{-- Construção do CSS Grid --}} @php $totalCols = 1 + count($timelineDates); $gridTemplateColumns = "160px " . implode(' ', array_fill(0, count($timelineDates), 'minmax(56px, 1fr)')); @endphp
{{-- HEADER ROW --}}
UH
@foreach($timelineDates as $date) @php $isToday = $date->isToday(); $isWeekend = $date->isWeekend(); @endphp
{{ $date->isoFormat('ddd') }}
{{ $date->format('d') }}
{{ $date->isoFormat('MMM') }}
@endforeach {{-- BODY ROWS por categoria --}} @foreach($categories as $category) {{-- Separator de categoria --}}
{{ $category->name }} ({{ $category->short_code }}) — R$ {{ number_format($category->base_price, 2, ',', '.') }} base
@forelse($category->rooms as $room) {{-- Coluna Room Label --}}
@php $statusColors = ['available' => 'var(--color-success)', 'dirty' => '#f59e0b', 'maintenance' => 'var(--color-danger)', 'out_of_order' => '#94a3b8']; $dotColor = $statusColors[$room->status] ?? '#94a3b8'; @endphp
{{ $room->name }}
@if($room->floor)
{{ $room->floor }}
@endif
{{-- Células de dias deste quarto --}} @foreach($timelineDates as $di => $date) @php $isToday = $date->isToday(); $cellDate = $date->format('Y-m-d'); @endphp
{{-- ① Cauda diagonal (checkout) — só na célula em que checkout = checkin --}} {{-- ② Bloco principal — renderizado UMA VEZ, na célula de check-in --}}
@endforeach @empty
Sem UHs cadastradas
+ Adicionar quartos a esta categoria
@endforelse @endforeach
{{-- /map-grid --}}
{{-- /map-scroll-container --}}
{{-- /map-wrapper --}} {{-- ═══ DRAG HINT (badge flutuante durante o arraste) ═══ --}}
{{-- ═══════════════ MODAL: CORES DE STATUS ═══════════════ --}} {{-- ═══════════════ MODAL: NOVA RESERVA ═══════════════ --}} {{-- ═══════════════ PAINEL DE DETALHES DA RESERVA ═══════════════ --}}
{{-- Overlay para fechar o painel de detalhes --}}
@endif {{-- ═══════════════ TOAST de Feedback ═══════════════ --}}
{{-- /x-data --}} @push('scripts') @endpush @endsection