{"id":864,"date":"2026-03-15T17:54:02","date_gmt":"2026-03-15T18:54:02","guid":{"rendered":"https:\/\/habanasbeachclub.com\/?page_id=864"},"modified":"2026-03-15T18:33:34","modified_gmt":"2026-03-15T19:33:34","slug":"gestionar-reservas","status":"publish","type":"page","link":"https:\/\/habanasbeachclub.com\/en\/gestionar-reservas\/","title":{"rendered":"Manage Booking"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"864\" class=\"elementor elementor-864\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-67d124b e-flex e-con-boxed e-con e-parent\" data-id=\"67d124b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-76814ab elementor-widget elementor-widget-shortcode\" data-id=\"76814ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:wght@300;400;600;700&family=Montserrat:wght@300;400;500;600&display=swap\" rel=\"stylesheet\">\n    <style>\n        \/* BASE *\/\n        .gr-wrap * { box-sizing: border-box; margin: 0; padding: 0; }\n\n        .gr-wrap {\n            background: linear-gradient(135deg, #0a3d2e 0%, #0f5940 100%);\n            min-height: 80vh;\n            padding: 60px 20px;\n            font-family: 'Montserrat', sans-serif;\n        }\n\n        .gr-container {\n            max-width: 680px;\n            margin: 0 auto;\n        }\n\n        \/* CABECERA *\/\n        .gr-header {\n            text-align: center;\n            margin-bottom: 50px;\n        }\n        .gr-header .gr-linea {\n            width: 60px;\n            height: 1px;\n            background: #d4af37;\n            margin: 0 auto 20px;\n        }\n        .gr-header h1 {\n            font-family: 'Cormorant Garamond', serif;\n            font-size: 2.8rem;\n            font-weight: 300;\n            color: #fff;\n            letter-spacing: 4px;\n            text-transform: uppercase;\n            line-height: 1.2;\n            margin-bottom: 12px;\n        }\n        .gr-header p {\n            font-size: 0.8rem;\n            color: rgba(255,255,255,0.6);\n            letter-spacing: 2px;\n            text-transform: uppercase;\n        }\n        .gr-header .gr-linea-bottom {\n            width: 60px;\n            height: 1px;\n            background: #d4af37;\n            margin: 20px auto 0;\n        }\n\n        \/* OCULTAR T\u00cdTULO DE P\u00c1GINA *\/\n        h1.entry-title,\n        .page-title,\n        .elementor-heading-title,\n        h1.page-title {\n            display: none !important;\n        }\n\n        \/* TARJETA *\/\n        .gr-card {\n            background: #faf8f4;\n            backdrop-filter: blur(10px);\n            border: 1px solid rgba(212,175,55,0.4);\n            border-radius: 20px;\n            padding: 45px 50px;\n            box-shadow: 0 20px 60px rgba(0,0,0,0.15);\n        }\n\n        \/* PASO *\/\n        .gr-paso {\n            display: none;\n        }\n        .gr-paso.activo {\n            display: block;\n        }\n\n        .gr-paso-titulo {\n            font-family: 'Cormorant Garamond', serif;\n            font-size: 1.6rem;\n            font-weight: 400;\n            color: #0a3d2e;\n            letter-spacing: 2px;\n            text-transform: uppercase;\n            margin-bottom: 8px;\n        }\n        .gr-paso-desc {\n            font-size: 0.78rem;\n            color: rgba(0,0,0,0.5);\n            letter-spacing: 1px;\n            margin-bottom: 35px;\n            line-height: 1.6;\n        }\n\n        \/* FORMULARIO *\/\n        .gr-grupo {\n            margin-bottom: 22px;\n        }\n        .gr-grupo label {\n            display: block;\n            font-size: 0.7rem;\n            letter-spacing: 2px;\n            text-transform: uppercase;\n            color: rgba(0,0,0,0.45);\n            margin-bottom: 8px;\n        }\n        .gr-wrap .gr-grupo input,\n        .gr-wrap .gr-grupo select {\n            width: 100% !important;\n            background: #f5f3ee !important;\n            border: 1px solid #0a3d2e !important;\n            border-radius: 12px !important;\n            padding: 14px 18px !important;\n            color: #1a1a1a !important;\n            font-family: 'Montserrat', sans-serif !important;\n            font-size: 0.85rem !important;\n            letter-spacing: 1px !important;\n            outline: none !important;\n            transition: border-color 0.3s !important;\n        }\n        .gr-wrap .gr-grupo input:focus,\n        .gr-wrap .gr-grupo select:focus {\n            border-color: #d4af37 !important;\n        }\n        .gr-wrap .gr-grupo input::placeholder {\n            color: rgba(0,0,0,0.25) !important;\n        }\n        .gr-grupo select option {\n            background: #fff;\n            color: #1a1a1a;\n        }\n        .gr-grupo input[type=\"text\"] {\n            text-transform: none;\n            letter-spacing: 2px;\n        }\n\n        \/* BOTONES *\/\n        .gr-btn {\n            width: 100%;\n            padding: 16px 30px;\n            background: transparent;\n            border: 1px solid #d4af37;\n            color: #d4af37;\n            font-family: 'Montserrat', sans-serif;\n            font-size: 0.7rem;\n            font-weight: 600;\n            letter-spacing: 3px;\n            text-transform: uppercase;\n            cursor: pointer;\n            border-radius: 12px;\n            transition: all 0.3s;\n            margin-top: 10px;\n        }\n        .gr-btn:hover {\n            background: #d4af37;\n            color: #0a3d2e;\n        }\n        .gr-btn:disabled {\n            opacity: 0.4;\n            cursor: not-allowed;\n        }\n        .gr-btn-secundario {\n            background: transparent;\n            border: 1px solid rgba(0,0,0,0.15);\n            color: rgba(0,0,0,0.4);\n            margin-top: 12px;\n        }\n        .gr-btn-secundario:hover {\n            background: rgba(0,0,0,0.04);\n            color: rgba(0,0,0,0.6);\n            border-color: rgba(0,0,0,0.25);\n        }\n\n        \/* INFO RESERVA *\/\n        .gr-info-reserva {\n            background: rgba(212,175,55,0.06);\n            border: 1px solid rgba(212,175,55,0.25);\n            border-radius: 16px;\n            padding: 25px 30px;\n            margin-bottom: 30px;\n        }\n        .gr-info-reserva .gr-info-fila {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            padding: 8px 0;\n            border-bottom: 1px solid rgba(0,0,0,0.06);\n        }\n        .gr-info-reserva .gr-info-fila:last-child {\n            border-bottom: none;\n        }\n        .gr-info-reserva .gr-info-label {\n            font-size: 0.65rem;\n            letter-spacing: 2px;\n            text-transform: uppercase;\n            color: rgba(0,0,0,0.4);\n        }\n        .gr-info-reserva .gr-info-valor {\n            font-size: 0.82rem;\n            color: #1a1a1a;\n            font-weight: 500;\n            letter-spacing: 1px;\n        }\n        .gr-badge-tipo {\n            background: rgba(212,175,55,0.15);\n            border: 1px solid rgba(212,175,55,0.3);\n            color: #d4af37;\n            font-size: 0.6rem;\n            letter-spacing: 2px;\n            padding: 3px 10px;\n            border-radius: 20px;\n            text-transform: uppercase;\n        }\n\n        \/* OPCIONES *\/\n        .gr-opciones {\n            display: grid;\n            grid-template-columns: 1fr 1fr;\n            gap: 15px;\n            margin-bottom: 30px;\n        }\n        .gr-opcion {\n            background: #f5f3ee;\n            border: 1px solid rgba(0,0,0,0.08);\n            border-radius: 16px;\n            padding: 25px 20px;\n            cursor: pointer;\n            text-align: center;\n            transition: all 0.3s;\n        }\n        .gr-opcion:hover,\n        .gr-opcion.seleccionada {\n            border-color: #d4af37;\n            background: rgba(212,175,55,0.08);\n        }\n        .gr-opcion svg {\n            display: block;\n            margin: 0 auto 12px;\n            opacity: 0.5;\n        }\n        .gr-opcion.seleccionada svg { opacity: 1; }\n        .gr-opcion-titulo {\n            font-family: 'Cormorant Garamond', serif;\n            font-size: 1.1rem;\n            color: #1a1a1a;\n            letter-spacing: 1px;\n            margin-bottom: 6px;\n        }\n        .gr-opcion-desc {\n            font-size: 0.65rem;\n            color: rgba(0,0,0,0.4);\n            letter-spacing: 1px;\n            line-height: 1.5;\n        }\n\n        \/* AVISO LIMITE *\/\n        .gr-aviso {\n            background: rgba(212,175,55,0.08);\n            border-left: 2px solid #d4af37;\n            padding: 14px 18px;\n            margin-bottom: 22px;\n            border-radius: 0 3px 3px 0;\n        }\n        .gr-aviso p {\n            font-size: 0.72rem;\n            color: rgba(0,0,0,0.55);\n            letter-spacing: 1px;\n            line-height: 1.6;\n        }\n        .gr-aviso span { color: #0a3d2e; font-weight: 600; }\n\n        \/* ERROR *\/\n        .gr-error {\n            background: rgba(220,53,69,0.06);\n            border: 1px solid rgba(220,53,69,0.2);\n            border-radius: 12px;\n            padding: 14px 18px;\n            margin-bottom: 20px;\n            display: none;\n        }\n        .gr-error p {\n            font-size: 0.72rem;\n            color: #c0392b;\n            letter-spacing: 1px;\n        }\n\n        \/* CONFIRMACI\u00d3N *\/\n        .gr-confirmacion {\n            text-align: center;\n            padding: 20px 0;\n        }\n        .gr-confirmacion svg {\n            display: block;\n            margin: 0 auto 20px;\n        }\n        .gr-confirmacion h2 {\n            font-family: 'Cormorant Garamond', serif;\n            font-size: 2rem;\n            font-weight: 300;\n            color: #0a3d2e;\n            letter-spacing: 3px;\n            text-transform: uppercase;\n            margin-bottom: 10px;\n        }\n        .gr-confirmacion p {\n            font-size: 0.75rem;\n            color: rgba(0,0,0,0.5);\n            letter-spacing: 1px;\n            line-height: 1.8;\n        }\n        .gr-confirmacion .gr-codigo-bono {\n            display: inline-block;\n            background: rgba(212,175,55,0.08);\n            border: 1px solid rgba(212,175,55,0.4);\n            color: #0a3d2e;\n            font-size: 1.1rem;\n            letter-spacing: 4px;\n            padding: 12px 30px;\n            border-radius: 12px;\n            margin: 20px 0;\n        }\n\n        \/* LOADING *\/\n        .gr-loading {\n            display: none;\n            text-align: center;\n            padding: 20px 0;\n        }\n        .gr-loading-dots {\n            display: flex;\n            justify-content: center;\n            gap: 8px;\n        }\n        .gr-loading-dots span {\n            width: 8px;\n            height: 8px;\n            border-radius: 50%;\n            background: #d4af37;\n            animation: gr-pulse 1.2s infinite;\n        }\n        .gr-loading-dots span:nth-child(2) { animation-delay: 0.2s; }\n        .gr-loading-dots span:nth-child(3) { animation-delay: 0.4s; }\n        @keyframes gr-pulse {\n            0%, 80%, 100% { opacity: 0.2; transform: scale(0.8); }\n            40% { opacity: 1; transform: scale(1); }\n        }\n\n        \/* RESPONSIVE *\/\n        @media (max-width: 600px) {\n            .gr-card { padding: 30px 22px; }\n            .gr-header h1 { font-size: 2rem; }\n            .gr-opciones { grid-template-columns: 1fr; }\n        }\n    <\/style>\n    \n    <div class=\"gr-wrap\">\n        <div class=\"gr-container\">\n\n            <!-- CABECERA -->\n            <div class=\"gr-header\">\n                <div class=\"gr-linea\"><\/div>\n                <h1>Manage<br>Booking<\/h1>\n                <p>Habana's Beach Club<\/p>\n                <div class=\"gr-linea-bottom\"><\/div>\n            <\/div>\n\n            <!-- TARJETA -->\n            <div class=\"gr-card\">\n\n                <!-- PASO 1: Introducir c\u00f3digo -->\n                <div class=\"gr-paso activo\" id=\"gr-paso-1\">\n                    <div class=\"gr-paso-titulo\">Enter your code<\/div>\n                    <div class=\"gr-paso-desc\">\n                        You will find the booking code in the confirmation email you received at the time of purchase.\n                    <\/div>\n\n                    <div id=\"gr-error-codigo\" class=\"gr-error\">\n                        <p id=\"gr-error-texto\"><\/p>\n                    <\/div>\n\n                    <div class=\"gr-grupo\">\n                        <label>Reservation code<\/label>\n                        <input type=\"text\" id=\"gr-codigo-input\" placeholder=\"E.g.: BRU-202601-143052\" maxlength=\"30\" autocomplete=\"off\">\n                    <\/div>\n\n                    <div class=\"gr-loading\" id=\"gr-loading-1\">\n                        <div class=\"gr-loading-dots\"><span><\/span><span><\/span><span><\/span><\/div>\n                    <\/div>\n\n                    <button class=\"gr-btn\" id=\"gr-btn-verificar\" onclick=\"grVerificarCodigo()\">\n                        Verify code\n                    <\/button>\n                <\/div>\n\n                <!-- PASO 2: Elegir acci\u00f3n -->\n                <div class=\"gr-paso\" id=\"gr-paso-2\">\n                    <div class=\"gr-paso-titulo\">Your booking<\/div>\n                    <div class=\"gr-paso-desc\">\n                        Choose what you want to do with your reservation.\n                    <\/div>\n\n                    <!-- Datos de la reserva encontrada -->\n                    <div class=\"gr-info-reserva\" id=\"gr-info-reserva\">\n                        <div class=\"gr-info-fila\">\n                            <span class=\"gr-info-label\">Type<\/span>\n                            <span class=\"gr-badge-tipo\" id=\"gr-info-tipo\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"gr-info-fila\">\n                            <span class=\"gr-info-label\">Name<\/span>\n                            <span class=\"gr-info-valor\" id=\"gr-info-nombre\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"gr-info-fila\">\n                            <span class=\"gr-info-label\">Date booked<\/span>\n                            <span class=\"gr-info-valor\" id=\"gr-info-fecha\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"gr-info-fila\">\n                            <span class=\"gr-info-label\">Valid until<\/span>\n                            <span class=\"gr-info-valor\" id=\"gr-info-expira\">\u2014<\/span>\n                        <\/div>\n                    <\/div>\n\n                    <!-- Opciones -->\n                    <div class=\"gr-opciones\" id=\"gr-opciones\">\n                        <div class=\"gr-opcion\" id=\"gr-op-fecha\" onclick=\"grSeleccionarOpcion('fecha')\">\n                            <svg width=\"28\" height=\"28\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"#d4af37\" stroke-width=\"1.2\">\n                                <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"\/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"\/>\n                                <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"\/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"\/>\n                                <line x1=\"8\" y1=\"14\" x2=\"8.01\" y2=\"14\"\/><line x1=\"12\" y1=\"14\" x2=\"12.01\" y2=\"14\"\/>\n                                <line x1=\"16\" y1=\"14\" x2=\"16.01\" y2=\"14\"\/>\n                            <\/svg>\n                            <div class=\"gr-opcion-titulo\">Change date<\/div>\n                            <div class=\"gr-opcion-desc\">Choose a new date now<\/div>\n                        <\/div>\n                        <div class=\"gr-opcion\" id=\"gr-op-bono\" onclick=\"grSeleccionarOpcion('bono')\">\n                            <svg width=\"28\" height=\"28\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"#d4af37\" stroke-width=\"1.2\">\n                                <path d=\"M20 12V22H4V12\"\/><path d=\"M22 7H2v5h20V7z\"\/><path d=\"M12 22V7\"\/>\n                                <path d=\"M12 7H7.5a2.5 2.5 0 010-5C11 2 12 7 12 7z\"\/>\n                                <path d=\"M12 7h4.5a2.5 2.5 0 000-5C13 2 12 7 12 7z\"\/>\n                            <\/svg>\n                            <div class=\"gr-opcion-titulo\">Book later<\/div>\n                            <div class=\"gr-opcion-desc\">Save your booking and choose a date at a later date<\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div id=\"gr-error-paso2\" class=\"gr-error\">\n                        <p id=\"gr-error-texto-2\"><\/p>\n                    <\/div>\n\n                    <!-- Formulario cambio de fecha -->\n                    <div id=\"gr-form-fecha\" style=\"display:none;\">\n                        <div class=\"gr-aviso\">\n                            <p>Select the new date and time. Remember that you have until <span id=\"gr-fecha-limite-texto\">\u2014<\/span> to make the exchange.<\/p>\n                        <\/div>\n                        <div class=\"gr-grupo\">\n                            <label>New date<\/label>\n                            <input type=\"date\" id=\"gr-nueva-fecha\">\n                        <\/div>\n                        <div class=\"gr-grupo\">\n                            <label>New time<\/label>\n                            <select id=\"gr-nueva-hora\">\n                                <option value=\"\">- Select time -<\/option>\n                            <\/select>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"gr-loading\" id=\"gr-loading-2\">\n                        <div class=\"gr-loading-dots\"><span><\/span><span><\/span><span><\/span><\/div>\n                    <\/div>\n\n                    <button class=\"gr-btn\" id=\"gr-btn-confirmar\" onclick=\"grConfirmarCambio()\" disabled>\n                        Confirm change\n                    <\/button>\n                <\/div>\n\n                <!-- PASO 3: Confirmaci\u00f3n -->\n                <div class=\"gr-paso\" id=\"gr-paso-3\">\n                    <div class=\"gr-confirmacion\">\n                        <svg width=\"50\" height=\"50\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"#d4af37\" stroke-width=\"1.2\">\n                            <path d=\"M22 11.08V12a10 10 0 11-5.93-9.14\"\/>\n                            <polyline points=\"22 4 12 14.01 9 11.01\"\/>\n                        <\/svg>\n                        <h2 id=\"gr-confirm-titulo\">Change made<\/h2>\n                        <p id=\"gr-confirm-texto\">\u2014<\/p>\n                    <\/div>\n                <\/div>\n\n            <\/div>\n            <!-- \/gr-card -->\n\n        <\/div>\n    <\/div>\n\n    <script>\n    var grDatosReserva = null;\n    var grOpcionSeleccionada = null;\n\n    \/\/ ---- PASO 1: Verificar c\u00f3digo ----\n    function grVerificarCodigo() {\n        var codigo = document.getElementById('gr-codigo-input').value.trim();\n        if (!codigo) { grMostrarError('gr-error-codigo', 'gr-error-texto', 'Introduce tu c\u00f3digo de reserva.'); return; }\n\n        grOcultarError('gr-error-codigo');\n        document.getElementById('gr-btn-verificar').disabled = true;\n        document.getElementById('gr-loading-1').style.display = 'block';\n\n        jQuery.ajax({\n            url: 'https:\/\/habanasbeachclub.com\/wp-admin\/admin-ajax.php',\n            type: 'POST',\n            data: { action: 'gr_buscar_codigo', nonce: '3e587f36f9', codigo: codigo },\n            success: function(resp) {\n                document.getElementById('gr-loading-1').style.display = 'none';\n                document.getElementById('gr-btn-verificar').disabled = false;\n                if (resp.success) {\n                    grDatosReserva = resp.data;\n                    grMostrarPaso2(resp.data);\n                } else {\n                    grMostrarError('gr-error-codigo', 'gr-error-texto', resp.data.mensaje);\n                }\n            },\n            error: function() {\n                document.getElementById('gr-loading-1').style.display = 'none';\n                document.getElementById('gr-btn-verificar').disabled = false;\n                grMostrarError('gr-error-codigo', 'gr-error-texto', 'Error de conexi\u00f3n. Int\u00e9ntalo de nuevo.');\n            }\n        });\n    }\n\n    \/\/ ---- PASO 2: Mostrar datos ----\n    function grMostrarPaso2(datos) {\n        document.getElementById('gr-info-tipo').textContent    = datos.tipo;\n        document.getElementById('gr-info-nombre').textContent  = datos.nombre;\n        document.getElementById('gr-info-fecha').textContent   = datos.fecha_formateada;\n        document.getElementById('gr-info-expira').textContent  = datos.expiracion_formateada;\n        document.getElementById('gr-fecha-limite-texto').textContent = datos.expiracion_formateada;\n\n        \/\/ Fecha m\u00ednima: ma\u00f1ana\n        var hoy = new Date();\n        hoy.setDate(hoy.getDate() + 1);\n        var minFecha = hoy.toISOString().split('T')[0];\n        document.getElementById('gr-nueva-fecha').min = minFecha;\n        document.getElementById('gr-nueva-fecha').max = datos.expiracion_iso;\n\n        \/\/ Si es pendiente: ocultar opciones y mostrar solo el calendario\n        var elOpciones  = document.getElementById('gr-opciones');\n        var elFormFecha = document.getElementById('gr-form-fecha');\n        var elConfirmar = document.getElementById('gr-btn-confirmar');\n\n        if (datos.es_pendiente) {\n            if (elOpciones)  elOpciones.style.display  = 'none';\n            if (elFormFecha) elFormFecha.style.display = 'block';\n            if (elConfirmar) elConfirmar.disabled       = false;\n            grOpcionSeleccionada = 'fecha';\n        } else {\n            if (elOpciones)  elOpciones.style.display  = 'grid';\n            if (elFormFecha) elFormFecha.style.display = 'none';\n            if (elConfirmar) elConfirmar.disabled       = true;\n            grOpcionSeleccionada = null;\n        }\n\n        grCargarHoras(datos.tipo, '');\n        grCambiarPaso('gr-paso-1', 'gr-paso-2');\n    }\n\n    \/\/ ---- Cargar horas seg\u00fan tipo y d\u00eda de semana ----\n    function grCargarHoras(tipo, fechaStr) {\n        var sel = document.getElementById('gr-nueva-hora');\n        sel.innerHTML = '<option value=\"\">\u2014 Selecciona hora \u2014<\/option>';\n        var horas = [];\n\n        if (tipo === 'Brunch' || tipo === 'Bono Regalo' || tipo === 'Bono Premium') {\n            if (fechaStr) {\n                var fecha = new Date(fechaStr + 'T12:00:00');\n                var diaSemana = fecha.getDay();\n                var esFinDeSemana = (diaSemana === 0 || diaSemana === 6);\n                if (esFinDeSemana) {\n                    var slots = ['9:30','10:00','10:30','11:00','11:30'];\n                    slots.forEach(function(h) { horas.push(h); });\n                } else {\n                    var h = 10;\n                    while (h <= 13) {\n                        var hh = Math.floor(h);\n                        var mm = (h % 1 === 0) ? '00' : '30';\n                        horas.push(hh + ':' + mm);\n                        h += 0.5;\n                    }\n                }\n            } else {\n                sel.innerHTML = '<option value=\"\">\u2014 Primero elige la fecha \u2014<\/option>';\n                return;\n            }\n        } else {\n            var h2 = 13;\n            while (h2 <= 22.5) {\n                var hh2 = Math.floor(h2);\n                var mm2 = (h2 % 1 === 0) ? '00' : '30';\n                horas.push(hh2 + ':' + mm2);\n                h2 += 0.5;\n            }\n        }\n\n        horas.forEach(function(h) {\n            var opt = document.createElement('option');\n            opt.value = h; opt.textContent = h;\n            sel.appendChild(opt);\n        });\n    }\n\n    \/\/ Recargar horas cuando cambia la fecha\n    document.getElementById('gr-nueva-fecha').addEventListener('change', function() {\n        if (grDatosReserva) {\n            grCargarHoras(grDatosReserva.tipo, this.value);\n        }\n    });\n\n    \/\/ ---- Seleccionar opci\u00f3n ----\n    function grSeleccionarOpcion(opcion) {\n        grOpcionSeleccionada = opcion;\n        document.getElementById('gr-op-fecha').classList.remove('seleccionada');\n        document.getElementById('gr-op-bono').classList.remove('seleccionada');\n        document.getElementById('gr-form-fecha').style.display = 'none';\n\n        if (opcion === 'fecha') {\n            document.getElementById('gr-op-fecha').classList.add('seleccionada');\n            document.getElementById('gr-form-fecha').style.display = 'block';\n        } else {\n            document.getElementById('gr-op-bono').classList.add('seleccionada');\n        }\n        document.getElementById('gr-btn-confirmar').disabled = false;\n        grOcultarError('gr-error-paso2');\n    }\n\n    \/\/ ---- PASO 3: Confirmar cambio ----\n    function grConfirmarCambio() {\n        grOcultarError('gr-error-paso2');\n\n        if (!grOpcionSeleccionada) {\n            grMostrarError('gr-error-paso2', 'gr-error-texto-2', 'Selecciona una opci\u00f3n antes de continuar.');\n            return;\n        }\n\n        var nuevaFecha = '', nuevaHora = '';\n        if (grOpcionSeleccionada === 'fecha') {\n            nuevaFecha = document.getElementById('gr-nueva-fecha').value;\n            nuevaHora  = document.getElementById('gr-nueva-hora').value;\n            if (!nuevaFecha || !nuevaHora) {\n                grMostrarError('gr-error-paso2', 'gr-error-texto-2', 'Selecciona la nueva fecha y hora.');\n                return;\n            }\n        }\n\n        document.getElementById('gr-btn-confirmar').disabled = true;\n        document.getElementById('gr-loading-2').style.display = 'block';\n\n        jQuery.ajax({\n            url: 'https:\/\/habanasbeachclub.com\/wp-admin\/admin-ajax.php',\n            type: 'POST',\n            data: {\n                action:         'gr_procesar_cambio',\n                nonce:          '3e587f36f9',\n                codigo:         grDatosReserva.codigo,\n                tipo:           grDatosReserva.tipo,\n                tabla:          grDatosReserva.tabla,\n                record_id:      grDatosReserva.record_id,\n                gc_record_id:   grDatosReserva.gc_record_id || '',\n                es_pendiente:   grDatosReserva.es_pendiente ? 'true' : 'false',\n                detalle:        grDatosReserva.detalle || '',\n                fecha_original: grDatosReserva.fecha_original || '',\n                nombre:         grDatosReserva.nombre,\n                email:          grDatosReserva.email,\n                opcion:         grOpcionSeleccionada,\n                nueva_fecha:    nuevaFecha,\n                nueva_hora:     nuevaHora,\n                expiracion:     grDatosReserva.expiracion_iso\n            },\n            success: function(resp) {\n                document.getElementById('gr-loading-2').style.display = 'none';\n                if (resp.success) {\n                    grMostrarConfirmacion(resp.data);\n                } else {\n                    document.getElementById('gr-btn-confirmar').disabled = false;\n                    grMostrarError('gr-error-paso2', 'gr-error-texto-2', resp.data.mensaje);\n                }\n            },\n            error: function() {\n                document.getElementById('gr-loading-2').style.display = 'none';\n                document.getElementById('gr-btn-confirmar').disabled = false;\n                grMostrarError('gr-error-paso2', 'gr-error-texto-2', 'Error de conexi\u00f3n. Int\u00e9ntalo de nuevo.');\n            }\n        });\n    }\n\n    \/\/ ---- Mostrar confirmaci\u00f3n ----\n    function grMostrarConfirmacion(datos) {\n        document.getElementById('gr-confirm-titulo').textContent = datos.titulo;\n        document.getElementById('gr-confirm-texto').innerHTML    = datos.mensaje;\n        grCambiarPaso('gr-paso-2', 'gr-paso-3');\n    }\n\n    \/\/ ---- Helpers ----\n    function grCambiarPaso(desde, hasta) {\n        document.getElementById(desde).classList.remove('activo');\n        document.getElementById(hasta).classList.add('activo');\n    }\n    function grMostrarError(divId, textoId, msg) {\n        document.getElementById(textoId).textContent = msg;\n        document.getElementById(divId).style.display = 'block';\n    }\n    function grOcultarError(divId) {\n        document.getElementById(divId).style.display = 'none';\n    }\n\n    \/\/ Enter en input c\u00f3digo\n    document.getElementById('gr-codigo-input').addEventListener('keypress', function(e) {\n        if (e.key === 'Enter') grVerificarCodigo();\n    });\n    <\/script>\n\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-864","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Gestionar Reserva - HABANA&#039;S<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/habanasbeachclub.com\/en\/gestionar-reservas\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gestionar Reserva - HABANA&#039;S\" \/>\n<meta property=\"og:url\" content=\"https:\/\/habanasbeachclub.com\/en\/gestionar-reservas\/\" \/>\n<meta property=\"og:site_name\" content=\"HABANA&#039;S\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-15T19:33:34+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/habanasbeachclub.com\/gestionar-reservas\/\",\"url\":\"https:\/\/habanasbeachclub.com\/gestionar-reservas\/\",\"name\":\"Gestionar Reserva - HABANA&#039;S\",\"isPartOf\":{\"@id\":\"https:\/\/habanasbeachclub.com\/#website\"},\"datePublished\":\"2026-03-15T18:54:02+00:00\",\"dateModified\":\"2026-03-15T19:33:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/habanasbeachclub.com\/gestionar-reservas\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/habanasbeachclub.com\/gestionar-reservas\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/habanasbeachclub.com\/gestionar-reservas\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/habanasbeachclub.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gestionar Reserva\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/habanasbeachclub.com\/#website\",\"url\":\"https:\/\/habanasbeachclub.com\/\",\"name\":\"HABANA'S\",\"description\":\"Beach club\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/habanasbeachclub.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gestionar Reserva - HABANA&#039;S","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/habanasbeachclub.com\/en\/gestionar-reservas\/","og_locale":"en_GB","og_type":"article","og_title":"Gestionar Reserva - HABANA&#039;S","og_url":"https:\/\/habanasbeachclub.com\/en\/gestionar-reservas\/","og_site_name":"HABANA&#039;S","article_modified_time":"2026-03-15T19:33:34+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/habanasbeachclub.com\/gestionar-reservas\/","url":"https:\/\/habanasbeachclub.com\/gestionar-reservas\/","name":"Gestionar Reserva - HABANA&#039;S","isPartOf":{"@id":"https:\/\/habanasbeachclub.com\/#website"},"datePublished":"2026-03-15T18:54:02+00:00","dateModified":"2026-03-15T19:33:34+00:00","breadcrumb":{"@id":"https:\/\/habanasbeachclub.com\/gestionar-reservas\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/habanasbeachclub.com\/gestionar-reservas\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/habanasbeachclub.com\/gestionar-reservas\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/habanasbeachclub.com\/"},{"@type":"ListItem","position":2,"name":"Gestionar Reserva"}]},{"@type":"WebSite","@id":"https:\/\/habanasbeachclub.com\/#website","url":"https:\/\/habanasbeachclub.com\/","name":"HABANA'S","description":"Beach club","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/habanasbeachclub.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"}]}},"_links":{"self":[{"href":"https:\/\/habanasbeachclub.com\/en\/wp-json\/wp\/v2\/pages\/864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/habanasbeachclub.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/habanasbeachclub.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/habanasbeachclub.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/habanasbeachclub.com\/en\/wp-json\/wp\/v2\/comments?post=864"}],"version-history":[{"count":6,"href":"https:\/\/habanasbeachclub.com\/en\/wp-json\/wp\/v2\/pages\/864\/revisions"}],"predecessor-version":[{"id":874,"href":"https:\/\/habanasbeachclub.com\/en\/wp-json\/wp\/v2\/pages\/864\/revisions\/874"}],"wp:attachment":[{"href":"https:\/\/habanasbeachclub.com\/en\/wp-json\/wp\/v2\/media?parent=864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}