arreglos varios antes de la primera version en produccion
This commit is contained in:
+69
-8
@@ -138,14 +138,18 @@
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="nombre">Nombre *</label>
|
||||
<input type="text" id="nombre" name="nombre" autocomplete="name" required>
|
||||
<input type="text" id="nombre" name="nombre" autocomplete="given-name" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="apellidos">Apellidos *</label>
|
||||
<input type="text" id="apellidos" name="apellidos" autocomplete="family-name" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="email">Email *</label>
|
||||
<input type="email" id="email" name="email" autocomplete="email" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="telefono">Teléfono *</label>
|
||||
<input type="tel" id="telefono" name="telefono" autocomplete="tel" required>
|
||||
@@ -209,7 +213,57 @@
|
||||
// === EasyAppointments config ===
|
||||
// IMPORTANTE: Después de configurar EasyAppointments, ve al admin (http://localhost:8888)
|
||||
// y crea al menos un Provider. Anota su ID y ponlo aquí.
|
||||
const PROVIDER_ID = 1;
|
||||
const PROVIDER_ID = 5;
|
||||
|
||||
// ---- Horario desde EasyAppointments (Settings → Business, company_working_plan) ----
|
||||
// Si la petición falla se mantiene el horario estático del HTML.
|
||||
async function loadSchedule() {
|
||||
try {
|
||||
const res = await fetch('/ea-api/v1/settings/company_working_plan');
|
||||
if (!res.ok) return;
|
||||
const setting = await res.json();
|
||||
const plan = JSON.parse(setting.value);
|
||||
|
||||
const DAYS = [
|
||||
['monday', 'Lunes'], ['tuesday', 'Martes'], ['wednesday', 'Miércoles'],
|
||||
['thursday', 'Jueves'], ['friday', 'Viernes'], ['saturday', 'Sábado'], ['sunday', 'Domingo']
|
||||
];
|
||||
const fmt = t => t.replace(/^0/, '');
|
||||
// "09:00-18:00 con pausa 14:30-15:00" → "9:00 — 14:30 / 15:00 — 18:00"
|
||||
const dayLabel = p => {
|
||||
if (!p || !p.start || !p.end) return null; // cerrado
|
||||
const breaks = (p.breaks || []).slice().sort((a, b) => a.start.localeCompare(b.start));
|
||||
const segs = [];
|
||||
let cur = p.start;
|
||||
for (const b of breaks) {
|
||||
if (b.start > cur) segs.push(fmt(cur) + ' — ' + fmt(b.start));
|
||||
if (b.end > cur) cur = b.end;
|
||||
}
|
||||
if (cur < p.end) segs.push(fmt(cur) + ' — ' + fmt(p.end));
|
||||
return segs.length ? segs.join(' / ') : null;
|
||||
};
|
||||
|
||||
// Agrupa días consecutivos con el mismo horario.
|
||||
const groups = [];
|
||||
for (const [key, nombre] of DAYS) {
|
||||
const label = dayLabel(plan[key]);
|
||||
const last = groups[groups.length - 1];
|
||||
if (last && last.label === label) last.dias.push(nombre);
|
||||
else groups.push({ label, dias: [nombre] });
|
||||
}
|
||||
const rows = groups.map(g => {
|
||||
const dias = g.dias.length === 1 ? g.dias[0]
|
||||
: g.dias.length === 2 ? g.dias[0] + ' y ' + g.dias[1]
|
||||
: g.dias[0] + ' a ' + g.dias[g.dias.length - 1];
|
||||
return g.label
|
||||
? `<div class="schedule-row"><span>${esc(dias)}</span><span>${esc(g.label)}</span></div>`
|
||||
: `<div class="schedule-row closed"><span>${esc(dias)}</span><span>Cerrado</span></div>`;
|
||||
}).join('');
|
||||
if (rows) document.querySelector('.schedule').innerHTML = rows;
|
||||
} catch (e) {
|
||||
console.warn('No se pudo cargar el horario desde EA; se muestra el estático.');
|
||||
}
|
||||
}
|
||||
|
||||
// ---- Service selector state ----
|
||||
let selectedServices = []; // [{id, nombre, duracion}]
|
||||
@@ -293,7 +347,7 @@
|
||||
renderServiceSelector(categorias);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
if (selectorContainer) selectorContainer.innerHTML = '<p class="services-loading">No se pudieron cargar los servicios desde EasyAppointments.</p>';
|
||||
if (selectorContainer) selectorContainer.innerHTML = '<p class="services-loading">No se pudieron cargar los servicios. Inténtalo más tarde o llámanos.</p>';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -580,6 +634,11 @@
|
||||
if (selectedServices.length === 0) { alert('Selecciona al menos un servicio'); return; }
|
||||
if (!selectedDate || !selectedHora) { alert('Selecciona día y hora'); return; }
|
||||
|
||||
const nombre = form.nombre.value.trim();
|
||||
const apellidos = form.apellidos.value.trim();
|
||||
// EasyAppointments exige nombre y apellido al crear el cliente.
|
||||
if (!nombre || !apellidos) { alert('Escribe tu nombre y tus apellidos'); return; }
|
||||
|
||||
const email = form.email.value.trim();
|
||||
if (!email) { alert('El email es obligatorio'); return; }
|
||||
|
||||
@@ -591,7 +650,8 @@
|
||||
// El servidor (server-side) busca/crea el cliente y crea la cita
|
||||
// contra EasyAppointments. El navegador solo envía la selección.
|
||||
const payload = {
|
||||
nombre: form.nombre.value.trim(),
|
||||
nombre: nombre,
|
||||
apellidos: apellidos,
|
||||
email: email,
|
||||
telefono: form.telefono.value.trim(),
|
||||
mensaje: form.mensaje.value.trim(),
|
||||
@@ -616,7 +676,7 @@
|
||||
renderSlots(savedDate, savedDow);
|
||||
form.style.display = 'none';
|
||||
result.className = 'booking-result booking-success';
|
||||
result.textContent = '¡Reserva confirmada! Te esperamos. Gestionada con EasyAppointments.';
|
||||
result.textContent = '¡Reserva confirmada! Te esperamos.';
|
||||
} else {
|
||||
const err = await res.json().catch(() => ({}));
|
||||
result.className = 'booking-result booking-error';
|
||||
@@ -625,7 +685,7 @@
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
result.className = 'booking-result booking-error';
|
||||
result.textContent = err.message || 'No se pudo conectar con EasyAppointments.';
|
||||
result.textContent = 'No se pudo completar la reserva. Inténtalo de nuevo o llámanos.';
|
||||
}
|
||||
|
||||
result.style.display = 'block';
|
||||
@@ -635,6 +695,7 @@
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
loadSchedule();
|
||||
loadServices();
|
||||
initCalendar();
|
||||
initBookingForm();
|
||||
|
||||
Reference in New Issue
Block a user