let state = {
cliente_id: "",
rut: "",
nombre: "",
apellidoPaterno: "",
apellidoMaterno: "",
email: "",
sucursal: "",
tipoBusqueda: "",
especialidad: "",
servicio: "",
profesional: null,
horaReservada: "",
fecha: "",
hora: "",
precio: 0,
comision: 0,
tiempo_duracion: 0,
impuesto: 0,
id_sku: 0,
tokensc: "",
iframe: false,
history: [], // Array para mantener el historial de pasos
};
let profesionalList = [];
let especialidadList = [];
let sucursalList = [];
let servicioList = [];
let imgServidor = "https://www.kola.cl";
var servicio_escogido;
var profesionalSeleccionado;
var txt_disponible = "disponible";
var txt_reservado = "reservada";
var txt_nodisponible = "no disponible";
var txt_no_se_puede_realizar = "esta hora no esta disponible para reservar";
var txt_no_hay_horas_dispobibles = "lo sentimos, el profesional no tiene disponibilidad horaria";
var txt_fecha = "fecha";
var txt_hora_inicio = "hora inicio";
var txt_hora_fin = "hora termino";
var txt_reserva_exitosa = "felicitaciones ha reservado esta hora";
var txt_aceptar = "aceptar";
var sucursalId;
var usuario;
var Toast;
var usuario = localStorage.getItem("cliente");
const idioma = navigator.language || navigator.userLanguage;
var id_prof;
var buscarTimeout;
var lafoto;
var id_serv;
var id_sucursal;
var una_sucursal = false;
var diccionarioCompleto = [];
var nomenclatura = [];
var configuracion;
// Datos de ejemplo (simulando backend
// Estado de la aplicación
// Configuración de SweetAlert2
// Inicialización
function init() {
// Ocultar todos los pasos excepto el primero
$(".step").removeClass("active previous");
$("#step1").addClass("active");
// Event listeners para botones de navegación
$(".btn-next").on("click", handleNext);
$(".option-btn").on("click", handleOptionSelect);
$(".btn-back").on("click", handleBack);
// Event listeners para filtros
$("#searchProfesional").on("input", filterProfesionales);
$("#filterEspecialidad").on("change", filterProfesionales);
$("#filterSucursal").on("change", filterProfesionales);
const params = new URLSearchParams(window.location.search);
const profesional = params.get('profesional');
const servicio = params.get('servicio');
if (params.get('iframe')) {
localStorage.setItem('iframe', params.get('iframe'));
}
if (localStorage.getItem('iframe')) {
state.iframe = localStorage.getItem('iframe');
}
state.iframe = params.get('iframe');
const paso = params.get('step');
// const paso = getUrlParameter('step');
if (usuario) {
$("#loader").show();
usuario = JSON.parse(usuario);
state.cliente_id = usuario.id;
state.rut = usuario.rut;
state.nombre = usuario.nombre;
state.apellidoPaterno = usuario.apellido_paterno;
state.apellidoMaterno = usuario.apellido_materno;
state.email = usuario.correo;
$("#step1").hide();
}
if (profesional) {
$('#filtrosProfesional').hide();
//$('#btnBackProfesionales').hide(); // Ocultar el botón
console.log("Profesional:", profesional);
$('#filterSucursal').val("-1");
state.sucursal = $('#filterSucursal').val();
id_prof = profesional;
id_serv = servicio;
id_sucursal = state.sucursal;
if (usuario == null) {
showStep("step1");
} else {
$('#btnBackProfesionales').removeClass("btn-back");
$('#btnBackProfesionales').hide();
obtenerEspecialidad(state.sucursal);
loadServicios(-1, -1, id_prof);
if (id_serv && id_sucursal) {
loadProfesionales(id_serv, id_sucursal, null, id_prof);
}
else if (id_serv) {
loadProfesionales(id_serv, -1, null, id_prof);
}
else if (id_sucursal) {
loadProfesionales(-1, id_sucursal, null, id_prof);
}
else {
loadProfesionales(-1, -1, null, id_prof);
}
showStep("step5");
}
}
// console.log("Usuario:", usuario);
// Event listener para el botón finalizar
// $(".btn-finish").on("click", handleFinish);
}
function diccionario(callback) {
$("#loader").show();
let fechaActual = moment().format("YYYY-MM-DD");
let configuracionLocalStorage = localStorage.getItem("configuracion");
let fechaActualizacionLocalStorage = localStorage.getItem("fechaActualizacion");
configuracion = JSON.parse(configuracionLocalStorage);
const fechaActualDate = new Date(fechaActual);
const fechaActualizacionDate = new Date(fechaActualizacionLocalStorage);
if (fechaActualDate.getTime() > fechaActualizacionDate.getTime()) {
localStorage.removeItem("diccionario");
localStorage.removeItem("configuracion");
localStorage.removeItem("fechaActualizacion");
localStorage.removeItem("nomenclatura");
obtenerDiccionarioDelServidor();
}
else {
obtenerDiccionarioDelServidor();
}
if (!state.iframe) {
init();
}
//
}
function obtenerDiccionarioDelServidor() {
$.ajax({
url: "api/diccionario",
type: "get",
success: function (response) {
if (response.code == 0) {
localStorage.setItem("diccionario", JSON.stringify(response.diccionario));
localStorage.setItem("configuracion", JSON.stringify(response.configuracion));
localStorage.setItem("nomenclatura", JSON.stringify(response.nomenclatura));
localStorage.setItem("fechaActualizacion", JSON.stringify(moment().format("YYYY-MM-DD")));
diccionarioCompleto = JSON.parse(localStorage.getItem("diccionario"));
nomenclatura = JSON.parse(localStorage.getItem("nomenclatura"));
configuracion = JSON.parse(localStorage.getItem("configuracion"));
if (typeof callback === "function") callback();
}
},
});
}
function traducir(texto, idioma) {
const entrada = diccionarioCompleto.find(element => element.clave === texto);
return entrada && entrada[idioma] ? entrada[idioma] : '$' + texto;
}
function obtenerNomenclatura(clave, idioma) {
let entrada;
if (clave.endsWith('s')) {
entrada = nomenclatura.find(element => element.clave_pl === clave);
} else {
entrada = nomenclatura.find(element => element.clave === clave);
}
if (entrada) {
const nomenclatura = entrada.nomenclature.find(nom => nom.idioma === idioma);
if (nomenclatura) {
if (clave.endsWith('s')) { // si la clave termina en 's', es plural
return nomenclatura.plural;
} else {
return nomenclatura.singular;
}
}
}
return 'N$' + clave;
}
function showStep(stepId) {
const $currentStep = $(".step.active");
const $nextStep = $(`#${stepId}`);
// Guardar el paso actual en el historial
state.history.push($currentStep.attr("id"));
$currentStep.removeClass("active").addClass("previous");
$nextStep.removeClass("previous").addClass("active");
// Si estamos yendo al paso de servicios, asegurarnos de que los servicios se carguen
if (stepId === "step4A" && state.especialidad) {
loadServicios(state.especialidad, state.sucursal);
}
// Mostrar/ocultar botón de retroceso
if (state.history.length > 0) {
$(".btn-back").show();
} else {
$(".btn-back").hide();
}
}
function handleNext(e) {
const currentStep = $(e.target).closest(".step");
const nextStepId = $(e.target).data("next");
// Validar y guardar datos según el paso actual
if (!validateStep(currentStep.attr("id"))) {
return;
}
showStep(nextStepId);
}
function handleBack() {
if (state.history.length > 0) {
const previousStepId = state.history.pop();
const $currentStep = $(".step.active");
const $previousStep = $(`#${previousStepId}`);
$currentStep.removeClass("active");
$previousStep.removeClass("previous").addClass("active");
// Mostrar/ocultar botón de retroceso
if (state.history.length > 0) {
$(".btn-back").show();
} else {
$(".btn-back").hide();
}
// Hacer scroll al elemento con ID "superior" usando jQuery
const $superior = $("#superior");
if ($superior.length) {
$("html, body").animate({
scrollTop: $superior.offset().top
}, 500); // 500 ms de duración para animación suave
}
}
}
// Validación de pasos
function validateStep(stepId) {
switch (stepId) {
case "step1":
state.rut = $("#rut").val();
if (!state.rut) {
showError(traducir("Por favor ingresa tu RUT/DNI", configuracion.idioma));
return false;
}
break;
case "step1A":
state.nombre = $("#nombre").val();
if (!state.nombre) {
showError(traducir("Por favor ingresa tu nombre", configuracion.idioma));
return false;
}
break;
case "step1B":
state.apellidoPaterno = $("#apellidoPaterno").val();
if (!state.apellidoPaterno) {
showError(traducir("Por favor ingresa tu apellido paterno", configuracion.idioma));
return false;
}
break;
case "step1C":
/* state.apellidoMaterno = $("#apellidoMaterno").val();
if (!state.apellidoMaterno) {
showError(traducir("Por favor ingresa tu apellido materno", configuracion.idioma));
return false;
}*/
break;
case "step1D":
state.email = $("#correoElectronico").val();
console.log($("#correoElectronico").val());
if (!state.email || !isValidEmail(state.email)) {
showError(traducir("Por favor ingresa un email válido", configuracion.idioma));
return false;
} else {
crearCliente();
}
break;
}
return true;
}
// Mostrar errores con SweetAlert2
function showError(message) {
Toast.fire({
icon: "error",
title: message,
timer: 3000,
showConfirmButton: false,
//timerProgressBar: false,/*probando/*
});
}
// Validación de email
function isValidEmail(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
// Manejador unificado para botones de opciones
function handleOptionSelect(e) {
const $button = $(e.target);
const type = $button.data("type");
const sucursal = $button.data("sucursal-id");
const especialidad = $button.data("especialidad-id");
const servicio = $button.data("servicio");
if (sucursal) {
state.sucursal = sucursal;
showStep("step3");
} else if (type) {
state.tipoBusqueda = type;
if (type === "especialidad") {
showStep("step4");
} else {
showStep("step5");
const sucursalListSelect = $("#filterSucursal");
const especialidadListSelect = $("#filterEspecialidad");
const servicioListSelect = $("#filterServicio");
especialidadListSelect.val("-1");
servicioListSelect.val("-1");
var especialidadId = especialidadListSelect.val();
loadServicios(especialidadId, state.sucursal);
// $sucursalList
state.servicio = servicioListSelect.val();
loadProfesionales(state.servicio, state.sucursal);
}
} else if (especialidad) {
state.especialidad = especialidad;
showStep("step4A");
} else if (servicio) {
state.servicio = servicio;
showStep("step5");
// loadProfesionales(state.servicio, state.sucursal);
}
}
// Filtrado de profesionales
function filterProfesionales() {
const searchTerm = $("#searchProfesional").val().toLowerCase();
const especialidadFilter = $("#filterEspecialidad").val();
const sucursalFilter = $("#filterSucursal").val();
$(".profesional-card").each(function () {
const $card = $(this);
const nombre = $card.find("h3").text().toLowerCase();
const especialidad = $card.find("p").first().text();
const sucursal = state.sucursal;
const matchesSearch = nombre.includes(searchTerm);
const matchesEspecialidad =
!especialidadFilter || especialidad === especialidadFilter;
const matchesSucursal = !sucursalFilter || sucursal === sucursalFilter;
$card.toggle(matchesSearch && matchesEspecialidad && matchesSucursal);
});
}
// Manejadores de reserva
function handleFinish() {
usuario = JSON.parse(localStorage.getItem('cliente'));
// console.log('usuario', usuario);
if (window.history.replaceState) {
const cleanUrl = window.location.origin + window.location.pathname;
window.history.replaceState({}, document.title, cleanUrl);
obtenerSucursal();
}
if (usuario && id_prof) {
$('#btnVolverSucursal').removeClass('btn-back');
$('#btnVolverSucursal').hide();
$(".btn-back").hide()
$('#btnReservar').show()
$('#confirmacionTitle').show()
$('#btnVolver').show()
$('#btnOtraReserva').hide()
$('#otraReserva').hide()
$("#searchProfesional").val("");
$("#filterEspecialidad").val("-1");
$("#filterSucursal").val("-1");
$(".servicios-grid").empty();
state = {
cliente_id: usuario.id,
rut: usuario.rut,
nombre: usuario.nombre,
apellidoPaterno: usuario.apellido_paterno,
apellidoMaterno: usuario.apellido_materno,
email: usuario.correo,
sucursal: "",
tipoBusqueda: "",
especialidad: "",
servicio: "",
profesional: id_prof,
horaReservada: "",
fecha: "",
hora: "",
precio: 0,
comision: 0,
tiempo_duracion: 0,
history: [],
};
loadProfesionales(-1, -1, null, id_prof);
showStep("step5");
}
else if (usuario) {
if (sucursalList.length == 1) {
$('#btnVolverBusqueda').removeClass('btn-back');
$('#btnVolverBusqueda').hide();
state = {
cliente_id: usuario.id,
rut: usuario.rut,
nombre: usuario.nombre,
apellidoPaterno: usuario.apellido_paterno,
apellidoMaterno: usuario.apellido_materno,
email: usuario.correo,
sucursal: sucursalList[0].id,
tipoBusqueda: "",
especialidad: "",
servicio: "",
profesional: null,
horaReservada: "",
fecha: "",
hora: "",
precio: 0,
comision: 0,
tiempo_duracion: 0,
history: [],
};
$("#searchProfesional").val("");
$("#filterEspecialidad").val("");
$("#filterSucursal").val("");
$(".servicios-grid").empty();
$(".profesionales-list").empty();
$("#fichaProfesionalFoto").attr("src", "").attr("alt", "");
$("#fichaProfesionalNombre").text("");
$("#fichaProfesionalEspecialidad").text("");
$("#fichaProfesionalSucursal").text("");
$("#fichaProfesionalServicios").empty();
$("#fichaProfesionalHorarios").empty();
$('#btnReservar').show()
$('#confirmacionTitle').show()
$('#btnVolver').show()
$('#btnOtraReserva').hide()
$('#otraReserva').hide()
showStep("step3")
} else {
$('#btnVolverSucursal').removeClass('btn-back');
$('#btnVolverSucursal').hide();
state = {
cliente_id: usuario.id,
rut: usuario.rut,
nombre: usuario.nombre,
apellidoPaterno: usuario.apellido_paterno,
apellidoMaterno: usuario.apellido_materno,
email: usuario.correo,
sucursal: "",
tipoBusqueda: "",
especialidad: "",
servicio: "",
profesional: null,
horaReservada: "",
fecha: "",
hora: "",
precio: 0,
comision: 0,
tiempo_duracion: 0,
history: [],
};
$("#searchProfesional").val("");
$("#filterEspecialidad").val("");
$("#filterSucursal").val("");
$(".servicios-grid").empty();
$(".profesionales-list").empty();
$("#fichaProfesionalFoto").attr("src", "").attr("alt", "");
$("#fichaProfesionalNombre").text("");
$("#fichaProfesionalEspecialidad").text("");
$("#fichaProfesionalSucursal").text("");
$("#fichaProfesionalServicios").empty();
$("#fichaProfesionalHorarios").empty();
$('#btnReservar').show()
$('#confirmacionTitle').show()
$('#btnVolver').show()
$('#btnOtraReserva').hide()
$('#otraReserva').hide()
showStep("step2")
}
}
else if (id_prof) {
$("#rut").val("");
$("#nombre").val("");
$("#apellidoPaterno").val("");
$("#apellidoMaterno").val("");
$("#email").val("");
$("#searchProfesional").val("");
$("#filterEspecialidad").val("");
$("#filterSucursal").val("-1");
$(".servicios-grid").empty();
$("#nombreProfesional").text("");
$("#horaReservada").text("");
$("#nombrePaciente").text("");
state = {
cliente_id: "",
rut: "",
nombre: "",
apellidoPaterno: "",
apellidoMaterno: "",
email: "",
sucursal: "",
tipoBusqueda: "",
especialidad: "",
servicio: "",
profesional: id_prof,
horaReservada: "",
fecha: "",
hora: "",
precio: 0,
comision: 0,
tiempo_duracion: 0,
history: [],
};
$('#btnReservar').show()
$('#confirmacionTitle').show()
$('#btnVolver').show()
$('#btnOtraReserva').hide()
$('#otraReserva').hide()
//loadProfesionales(state.servicio, state.sucursal,id_prof);
showStep("step1");
}
else {
// Limpiar todos los campos del formulario
$("#rut").val("");
$("#nombre").val("");
$("#apellidoPaterno").val("");
$("#apellidoMaterno").val("");
$("#email").val("");
$("#searchProfesional").val("");
$("#filterEspecialidad").val("");
$("#filterSucursal").val("");
// Limpiar el grid de servicios
$(".servicios-grid").empty();
// Limpiar la lista de profesionales
$(".profesionales-list").empty();
// Limpiar el resumen de reserva
$("#nombreProfesional").text("");
$("#horaReservada").text("");
$("#nombrePaciente").text("");
// Limpiar la ficha profesional
$("#fichaProfesionalFoto").attr("src", "").attr("alt", "");
$("#fichaProfesionalNombre").text("");
$("#fichaProfesionalEspecialidad").text("");
$("#fichaProfesionalSucursal").text("");
$("#fichaProfesionalServicios").empty();
$("#fichaProfesionalHorarios").empty();
// Reiniciar el estado
state = {
cliente_id: "",
rut: "",
nombre: "",
apellidoPaterno: "",
apellidoMaterno: "",
email: "",
sucursal: "",
tipoBusqueda: "",
especialidad: "",
servicio: "",
profesional: null,
horaReservada: "",
fecha: "",
hora: "",
precio: 0,
comision: 0,
tiempo_duracion: 0,
history: [],
};
$('#btnReservar').show()
$('#confirmacionTitle').show()
$('#btnVolver').show()
$('#btnOtraReserva').hide()
$('#otraReserva').hide()
$("#step1").show();
// Ocultar todos los pasos
showStep("step1");
}
}
function limpiadorDeFiltros() {
}
function obtenerSucursal() {
// $("#loader").show();
if (usuario) {
$('#btnVolverSucursal').removeClass('btn-back');
$('#btnVolverSucursal').hide();
$('#registro').hide();
}
$.ajax({
url: "api/sucursalesSite",
type: "get",
success: function (response) {
if (!usuario || !id_prof) {
$("#loader").hide();
}
if (response.sucursales) {
const $sucursalList = $("#sucursales-grid");
const sucursalListSelect = $("#filterSucursal");
$sucursalList.empty().off('click', '.option-btn rectangulo');
sucursalListSelect.empty().off('change');
sucursalListSelect.append(`
`);
sucursalList = response.sucursales;
const params = new URLSearchParams(window.location.search);
const paso = params.get('step');
const tokensc = params.get('tokensc');
console.log(JSON.stringify(usuario));
if (paso != 'confirmacion' && paso != 'rechazo') {
if (response.sucursales.length == 1) {
$('#step2').hide();
state.sucursal = response.sucursales[0].id;
sucursalId = response.sucursales[0].id;
sucursalListSelect.hide();
$('#btnVolverBusqueda').removeClass('btn-back');
$('#btnVolverBusqueda').hide();
una_sucursal = true;
if (usuario && !id_prof) {
$('#btnVolverBusqueda').removeClass('btn-back');
$('#btnVolverBusqueda').hide();
showStep("step3");
}
obtenerEspecialidad(sucursalId);
} else {
if (usuario) {
showStep("step2")
}
// showStep("step2");
response.sucursales.forEach((sucursales) => {
state.sucursal = sucursales;
$sucursalList.append(`
`);
sucursalListSelect.append(`
`);
});
$sucursalList.find(".option-btn").on("click", function (event) {
const sucursalId = $(this).data("sucursal-id");
sucursalListSelect.val(sucursalId);
if (id_prof) {
obtenerEspecialidad(sucursalId);
loadServicios(-1, sucursalId, id_prof);
loadProfesionales(-1, sucursalId, null, id_prof);
showStep("step5");
}
// Si hay un usuario pero no hay profesional, se ejecuta lógica estándar
else {
handleOptionSelect.call(this, event);
obtenerEspecialidad(sucursalId);
// Puedes agregar showStep("step3"); aquí si aplica para este flujo
}
// 1) Primero llamas a handleOptionSelect (si necesita event o 'this')
// showStep("step3");
});
sucursalListSelect.on("change", function () {
state.tipoBusqueda = '';
var id_sucursal = $(this).val();
$("#filterServicio").val("-1");
var servicioId = $("#filterServicio").val();
//console.log("scursal seleccionada:", id_sucursal);
loadServicios(servicioId, id_sucursal);
obtenerEspecialidad(id_sucursal);
loadProfesionales(servicioId, id_sucursal);
})
}
}
else {
state = JSON.parse(localStorage.getItem('state_reserva'));
usuario = JSON.parse(localStorage.getItem('usuario'));
if (paso == 'rechazo') {
profesionalList = JSON.parse(localStorage.getItem('profesionales'));
servicioList = JSON.parse(localStorage.getItem('servicios'));
handleReserva(state.profesional, state.servicio, state.sucursal, 'rechazo');
} else {
if (tokensc == state.tokensc) {
agendar();
} else {
handleFinish();
// showStep("step1");
}
}
}
if (state.iframe) {
init();
}
//console.log(state.tipoBusqueda);
}
},
});
}
function buscarCliente() {
var dni = document.getElementById("rut").value;
document.getElementById("nombre").value = "";
document.getElementById("apellidoPaterno").value = "";
document.getElementById("apellidoMaterno").value = "";
document.getElementById("correoElectronico").value = "";
dni = limpiarRut(dni);
$("#loader").show();
if (dni == '' || dni == null || dni == undefined) {
$("#loader").hide();
validateStep("step1");
} else {
$.ajax({
url: "api/buscarCliente",
type: "post",
data: { dni: dni },
success: function (response) {
//console.log(response.cliente);
$("#loader").hide();
if (response.cliente) {
state.cliente_id = response.cliente.id;
state.rut = response.cliente.rut;
state.nombre = response.cliente.nombre;
state.apellidoPaterno = response.cliente.apellido_paterno;
if (id_prof) {
$('.btn-back').hide();
$('#registro').hide();
obtenerEspecialidad(state.sucursal);
loadServicios(-1, -1, id_prof);
console.log("Servicio:", id_serv);
if (id_serv != null && id_serv && id_sucursal) {
loadProfesionales(id_serv, id_sucursal, null, id_prof);
}
else if (id_serv) {
loadProfesionales(id_serv, -1, null, id_prof);
}
else if (id_sucursal) {
loadProfesionales(-1, id_sucursal, null, id_prof);
}
else {
loadProfesionales(-1, -1, null, id_prof);
}
showStep("step5");
}
else if (una_sucursal) {
$('#btnVolverBusqueda').addClass("btn-back");
$('#btnVolverBusqueda').show();
$('#registro').hide();
showStep("step3");
}
else {
$('#registro').hide();
showStep("step2");
}
} else {
showStep("step1A");
}
},
});
}
}
var timeoutId = null;
function buscarCorreo() {
// var dni = document.getElementById("rut").value;
var correo = document.getElementById("correoElectronico").value;
// dni = limpiarRut(dni);
//$("#loader").show();
if (timeoutId !== null) {
clearTimeout(timeoutId);
}
timeoutId = setTimeout(function () {
$.ajax({
url: "api/buscarCliente",
type: "post",
data: { correo: correo },
success: function (response) {
//console.log(response.cliente);
$("#loader").hide();
if (response.cliente) {
Swal.fire('Ya existe un usuario con este correo', '', 'info');
document.getElementById("correoElectronico").value = "";
} else {
// showStep("step1A");
}
},
});
}, 500);
}
function crearCliente() {
var csrfToken = $('meta[name="csrf-token"]').attr('content');
$("#loader").show();
datos = {
_token: csrfToken,
dni: document.getElementById("rut").value,
nombre: document.getElementById("nombre").value,
apellido_paterno: document.getElementById("apellidoPaterno").value,
apellido_materno: document.getElementById("apellidoMaterno").value,
correo: document.getElementById("correoElectronico").value
}
$.ajax({
url: '/crearCliente',
type: 'POST',
data: JSON.stringify(datos),
contentType: 'application/json',
success: function (response) {
if (response.code == 0) {
$("#loader").hide();
state.cliente_id = response.cliente.id;
state.rut = response.cliente.rut;
state.nombre = response.cliente.nombre;
state.apellidoPaterno = response.cliente.apellido_paterno;
console.log("id_prof", id_prof);
if (id_prof) {
$('#btnBackProfesionales').removeClass("btn-back");
$('#btnBackProfesionales').hide();
$('#registro').hide();
obtenerEspecialidad(state.sucursal);
loadServicios(-1, -1, id_prof);
loadProfesionales(-1, -1, null, id_prof);
showStep("step5");
}
else if (una_sucursal) {
$('#btnVolverBusqueda').removeClass("btn-back");
$('#btnVolverBusqueda').hide();
$('#registro').hide();
showStep("step3");
}
else {
$('#btnVolverSucursal').removeClass("btn-back");
$('#btnVolverSucursal').hide();
$('#registro').show();
showStep("step2");
}
// window.location.replace("../");
}
//alert('Datos guardados con éxito:', response);
},
error: function (error) {
Swal.fire('Hubo un error intente mas tarde', '', 'info');
$("#loader").hide();
}
});
}
function limpiarRut(rut) {
return rut.replace(/[\.\-]/g, "").toUpperCase();
}
function obtenerEspecialidad(id_sucursal) {
$.ajax({
url: "api/especialidadesSite",
type: "post",
data: { id_sucursal: id_sucursal },
success: function (response) {
//console.log(response.especialidades);
if (response.especialidades) {
const $especialidadList = $("#especialidades-grid");
const especialidadListSelect = $("#filterEspecialidad");
$especialidadList.empty().off('click', '.option-btn');
especialidadListSelect.empty().off('change');
// state.rut = response.cliente.rut;
especialidadListSelect.append(`
`);
especialidadList = response.especialidades;
especialidadList.forEach((especialidades) => {
state.especialidad = especialidades;
$especialidadList.append(`
`);
especialidadListSelect.append(`
`);
});
$especialidadList
.find(".option-btn")
.on("click", function (event) {
handleOptionSelect.call(this, event);
var especialidadId = $(this).data("especialidad-id");
especialidadListSelect.val(especialidadId);
});
$("#filterEspecialidad").on("change", function () {
var especialidadId = $(this).val();
//console.log("Especialidad seleccionada:", especialidadId);
var id_sucursal_seleccionada = $("#sucursalSelect").val();
//console.log("Sucursal seleccionada especialidad:", id_sucursal_seleccionada);
loadServicios(especialidadId, id_sucursal, function (servicios) {
if (servicios.length > 0) {
const primerServicioId = servicios[0].id;
$("#filterServicio").val(primerServicioId);
loadProfesionales(primerServicioId, id_sucursal);// importante: disparar el evento
}
});
});
}
},
});
}
// Carga de datos
function loadServicios(especialidadId, id_sucursal, callback, id_profesional) {
// console.log("Cargando servicios para sucursal:", id_sucursal);
if (id_profesional) {
id_profesional = id_profesional;
}
$("#loader").show();
$.ajax({
url: "api/serviciosSite",
type: "post",
data: { id_especialidad: especialidadId, id_sucursal: id_sucursal, id_profesional: id_profesional },
success: function (response) {
if (response.servicios) {
if (state.tipoBusqueda == "especialidad") {
$("#loader").hide();
}
state.servicios = response.servicios;
servicioList = response.servicios;
localStorage.setItem('servicios', JSON.stringify(servicioList));
const $serviciosGrid = $("#step4A .servicios-grid");
const servicioListSelect = $("#filterServicio");
// Limpiar contenido y quitar listeners anteriores
$serviciosGrid.empty().off('click', '.option-btn');
servicioListSelect.empty().off('change');
servicioListSelect.append(`
`);
// Generar botones y opciones del select
servicioList.forEach((servicio) => {
const $button = $(`
`);
$serviciosGrid.append($button);
const $option = $(`
`);
servicioListSelect.append($option);
});
// Registrar eventos
$serviciosGrid.on('click', '.option-btn', function () {
const servicioId = parseInt($(this).data('servicio'), 10);
const precio = parseFloat($(this).data('precio'));
const comision = parseFloat($(this).data('comision'));
const tiempo = parseFloat($(this).data('tiempo'));
state.servicio = servicioId;
state.precio = precio;
state.comision = comision;
state.tiempo_duracion = tiempo;
// Cambia visualmente el select sin activar change
servicioListSelect.val(servicioId);
// Ejecuta la lógica de profesionales
loadProfesionales(servicioId, id_sucursal);
});
servicioListSelect.on("change", function () {
const sucursalListSelect = $("#filterSucursal");
const sucursal_id = sucursalListSelect.val();
//console.log("Sucursal seleccionada servicio:", sucursal_id);
const servicioId = $(this).val();
const $selectedOption = $(this).find("option:selected");
const precio = parseFloat($selectedOption.data("precio"));
const comision = parseFloat($selectedOption.data("comision"));
const tiempo = parseFloat($selectedOption.data("tiempo"));
state.servicio = servicioId;
state.precio = precio;
state.comision = comision;
state.tiempo_duracion = tiempo;
// console.log("Servicio seleccionado:", servicioId);
if (especialidadId != -1 && servicioId == -1) {
const especialidadListSelect = $("#filterEspecialidad");
especialidadListSelect.val("-1");
loadServicios(especialidadListSelect.val(), sucursal_id);
}
id_prof = null;
// console.log("pro seleccionado:", id_prof);
loadProfesionales(servicioId, sucursal_id);
});
if (typeof callback === "function") {
callback(servicioList);
}
// 🟢 Seleccionar automáticamente el primer servicio (si existe)
if (servicioList.length > 0) {
// const firstServicio = servicioList[0];
// servicioListSelect.val(firstServicio.id).trigger("change"); // Esto activa el .on("change")
}
}
},
});
}
function loadSelectPro(servicioId, id_sucursal) {
loadProfesionales(servicioId, id_sucursal);
}
// Evento keyup separado
function loadProfesionales(id_servicio, id_sucursal, buscar, id_prof) {
const $profesionalesList = $(".profesionales-list");
$profesionalesList.empty();
const servicioListSelect = $("#filterServicio");
state.fecha = moment().format("YYYY-MM-DD");
$("#loader").show();
$.ajax({
url: "api/listaProfesionalesSite",
type: "post",
data: { id_servicio: id_servicio, id_sucursal: id_sucursal, fecha: state.fecha, buscar: buscar, id_prof: id_prof },
success: function (response) {
if (response.code == 0) {
$("#loader").hide();
profesionalList = response.profesionales;
localStorage.setItem('profesionales', JSON.stringify(profesionalList));
if (profesionalList.length == 0) {
if (id_prof) {
$profesionalesList.append(`
${traducir('El profesional no atiende en esta sucursal, seleccione otra sucursal', configuracion.idioma)}
`);
} else {
$profesionalesList.append(`${traducir('No hay profesionales disponibles.', configuracion.idioma)}
`);
}
} else {
profesionalList.forEach((profesional) => {
lafoto = ('./img/nofoto-' + configuracion.idioma + '.png');
if (profesional.imagen != null) {
lafoto = imgServidor + profesional.imagen;
// $lafoto = $foto->nombre_archivo;
}
var profesionales;
if (state.tipoBusqueda === "especialidad" && servicioListSelect.val() != -1) {
profesionales = `
${profesional.nombre} ${profesional.apellido_paterno}
${traducir('especialidad', configuracion.idioma)} : ${profesional.especialidad.map((e) => `${e.nombre}`).join("")}
${traducir('servicio', configuracion.idioma)} : ${profesional.servicios[0].nombre}
${traducir('fecha de reserva', configuracion.idioma)}: ${profesional.servicios[0].horaLibre.fecha}
${traducir('hora tiempo', configuracion.idioma)}:${profesional.servicios[0].horaLibre.hora_inicio}
${traducir('lugar', configuracion.idioma)}: ${resolverSucursal(profesional.servicios[0].id_sucursal)}
${traducir('costo servicio', configuracion.idioma)}:
${formatearMiles(profesional.servicios[0].precio)}
`
} else {
let serviciosHTML = "";
if (Array.isArray(profesional.servicios)) {
for (let servicio of profesional.servicios) {
const sucursal_id = $('#filterSucursal').val();
if (sucursal_id == -1) {
serviciosHTML += `
${traducir('especialidad', configuracion.idioma)}: ${profesional.especialidad.map((e) => `${e.nombre}`).join("")}
${traducir('servicio', configuracion.idioma)}: ${servicio.nombre}
${traducir('fecha de reserva', configuracion.idioma)}: ${servicio.horaLibre.fecha}
${traducir('hora tiempo', configuracion.idioma)}: ${servicio.horaLibre.hora_inicio}
${traducir('lugar', configuracion.idioma)}: ${resolverSucursal(servicio.id_sucursal)}
${traducir('costo servicio', configuracion.idioma)}: ${formatearMiles(servicio.precio)}
`;
} else {
serviciosHTML += `
${traducir('especialidad', configuracion.idioma)}: ${profesional.especialidad.map((e) => `${e.nombre}`).join("")}
${traducir('servicio', configuracion.idioma)}: ${servicio.nombre}
${traducir('fecha de reserva', configuracion.idioma)}: ${servicio.horaLibre.fecha}
${traducir('hora tiempo', configuracion.idioma)}: ${servicio.horaLibre.hora_inicio}
${traducir('costo servicio', configuracion.idioma)}: ${formatearMiles(servicio.precio)}
`;
}
}
}
profesionales = `
${profesional.nombre} ${profesional.apellido_paterno}
`;
}
$profesionalesList.append(profesionales);
});
}
showStep("step5");
$(".option-btn").on("click", function () {
const profesionalId = $(this).data("profesional-id");
const servicioId = $(this).data("servicio-id");
const sucursalId = $(this).data("sucursal-id");
state.impuesto = $(this).data("val-imp");
const action = $(this).data("action");
if (action === "ver-mas") {
if (sucursalId) {
//console.log('ENTRE POR SUCURSAL')
handleVerMasHoras(profesionalId, servicioId, sucursalId);
}
else if (servicioId) {
state.servicio = servicioId;
//console.log('ENTRE POR SERVICIO')
handleVerMasHoras(profesionalId, servicioId);
} else {
//console.log('ENTRE POR PROFESIONAL')
handleVerMasHoras(profesionalId);
}
} else {
if (sucursalId) {
//console.log('ENTRE POR SUCURSAL')
handleReserva(profesionalId, servicioId, sucursalId);
}
else if (servicioId) {
// console.log('ENTRE POR SERVICIO')
// console.log("profesionalId" + profesionalId + "servicioId" + servicioId)
handleReserva(profesionalId, servicioId);
} else {
// console.log('ENTRE POR PROFESIONAL')
handleReserva(profesionalId);
}
}
});
} else {
$("#loader").hide();
}
},
});
}
function formatearMiles(numero) {
const redondeado = Math.round(numero);
return '$' + redondeado.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
function buscarProfesional() {
const buscar = $("#searchProfesional").val();
const servicioId = $("#filterServicio").val();
const id_sucursal = $("#filterSucursal").val();
loadProfesionales(servicioId, id_sucursal, buscar);
}
function handleReserva(profesionalId, servicioId, sucursalId, accion = 'no-agendar') {
const params = new URLSearchParams(window.location.search);
const paso = params.get('step');
if (accion != 'agendar') {
$('#btnOtraReserva').hide()
$('#otraReserva').hide()
}
if (accion == 'rechazo') {
$('#btnReservar').hide()
$('#btnVolver').removeClass('btn-back')
$('#btnVolver').hide()
$('#btnOtraReserva').show()
$('#confirmacionTitle').text('Reserva Rechazada o Cancelada')
}
if (sucursalId) {
state.sucursal = sucursalId
}
state.servicio = servicioId
// console.log("profesionalId" + profesionalId + "servicioId handleReserva" + state.servicio)
if (state.servicio) {
servicioId = state.servicio
}
if (servicioId) {
const profesional = profesionalList.find((p) => p.id === profesionalId);
const servicio = profesional.servicios.find((s) => s.id === servicioId);
//console.log(JSON.stringify(servicio))
// servicio.horaLibre.fecha
//console.log(servicio.horaLibre.fecha)
state.fecha = servicio.horaLibre.fecha;
state.profesional = profesional.id;
//console.log(JSON.stringify(servicio));
state.horaReservada = servicio.horaLibre.hora_inicio;
state.tiempo_duracion = servicio.tiempo;
state.servicio = servicioId
state.id_box = servicio.id_box;
state.precio = servicio.precio;
state.comision = servicio.comision;
state.impuesto = servicio.imp;
state.id_sku = servicio.pos_id_sku;
// Actualizar resumen
$("#nombreProfesional").text(profesional.nombre + " " + profesional.apellido_paterno + " " + profesional.apellido_materno);
$("#servicioReservado").text(resolverServicio(state.servicio));
$("#costoServicio").text(formatearMiles(state.precio));
$("#sucursalReservada").text(resolverSucursal(state.sucursal));
$('#fechaReserva').text(state.fecha);
$("#horaReservada").text(state.fecha + " " + state.horaReservada);
$('#costoServicio').text(formatearMiles(state.precio));
$("#nombrePaciente").text(state.nombre + " " + state.apellidoPaterno);
showStep("confirmacion");
} else {
const profesional = profesionalList.find((p) => p.id === profesionalId);
const servicio = profesional.servicios.find((s) => s.id === state.servicio);
// console.log('dede pro servicio: '+ JSON.stringify(servicio))
state.fecha = moment().format("YYYY-MM-DD");
state.profesional = profesional.id;
//console.log(JSON.stringify(profesional.servicios) + " " + profesional.servicios[0].tiempo);
state.horaReservada = servicio.horaLibre.hora_inicio;
state.tiempo_duracion = servicio.tiempo;
state.id_box = servicio.id_box;
state.precio = servicio.precio;
state.comision = servicio.comision;
state.impuesto = servicio.imp;
state.id_sku = servicio.pos_id_sku;
// Actualizar resumen
$("#nombreProfesional").text(profesional.nombre + " " + profesional.apellido_paterno + " " + profesional.apellido_materno);
$("#servicioReservado").text(resolverServicio(state.servicio));
$("#costoServicio").text(formatearMiles(state.precio));
$("#sucursalReservada").text(resolverSucursal(state.sucursal));
$('#costoServicio').text(formatearMiles(state.precio));
$('#fechaReserva').text(state.fecha);
$("#horaReservada").text(state.fecha + " " + state.horaReservada);
$("#nombrePaciente").text(state.nombre + " " + state.apellidoPaterno);
showStep("confirmacion");
}
}
function handleVerMasHoras(profesionalId, servicioId, sucursalId) {
$("#loader").show();
$('#btnOtraReserva').hide()
$('#otraReserva').hide()
if (servicioId) {
state.servicio = servicioId
}
if (sucursalId) {
state.sucursal = sucursalId
}
const profesional = profesionalList.find((p) => p.id === profesionalId);
state.profesional = profesional;
if (!profesional) return;
//$("#fichaProfesionalServiciosTitle").text('Servicio:' + resolverServicio(state.servicio));
$("#fichaProfesionalServiciosTitle").text('' + resolverServicio(state.servicio));
// Actualizar la ficha del profesional
var lafoto = ('./img/nofoto-' + configuracion.idioma + '.png');
if (profesional.imagen != null) {
lafoto = imgServidor + profesional.imagen;
// $lafoto = $foto->nombre_archivo;
}
$("#fichaProfesionalFoto")
.attr("src", lafoto)
.attr("alt", profesional.nombre);
$("#fichaProfesionalNombre").text(profesional.nombre + " " + profesional.apellido_paterno + " " + profesional.apellido_materno);
$("#fichaProfesionalEspecialidad").text(profesional.especialidad.map((e) => `${e.nombre} `).join(""));
$("#fichaProfesionalSucursal").text(`Sucursal: ${resolverSucursal(state.sucursal)} `);
const especialidad = Object.values(especialidadList).find(
(e) => e.nombre === profesional.especialidad
);
const $serviciosList = $("#fichaProfesionalServicios");
$serviciosList.empty();
const $horariosGrid = $('#fichaProfesionalHorarios');
$horariosGrid.empty().hide();
$('#calendar').show();
/*if (especialidad) {
especialidad.servicios.forEach((servicio) => {
$serviciosList.append(`
< div class="servicio-item" >
${servicio}
>
`);
});
}*/
// Cargar horarios
// Event listeners para los botones de reserva
/* $(".btn-reservar").on("click", function () {
const servicio = $(this).data("servicio");
state.servicio = servicio;
state.profesional = profesional;
showStep("confirmacion");
});
*/
// Event listeners para los horarios
state.profesional = profesionalId;
servicioCalendario();
// Mostrar el paso de la ficha
showStep("step6");
}
function resolverSucursal($id) {
var sucursal = sucursalList.find((sucursales) => sucursales.id === $id);
if (sucursal.nombre != '' || sucursal.nombre != null) {
return sucursal.nombre;
} else {
return "";
}
}
function resolverServicio($id) {
var servicio = servicioList.find((servicio) => servicio.id === $id);
if (servicio.nombre != '' || servicio.nombre != null) {
return servicio.nombre;
} else {
return "";
}
}
function escapeHTML(str) {
return String(str)
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'")
.replace(/\+/g, "+"); // escapa el signo +
}
function servicioCalendario(fecha_inicio) {
seleccion = "";
var hoy;
if (fecha_inicio) {
const fechaParametro = moment(fecha_inicio);
const hoyReal = moment(); // Fecha actual real
// Si es el mismo mes y año => usar hoy
if (fechaParametro.isSame(hoyReal, 'month') && fechaParametro.isSame(hoyReal, 'year')) {
hoy = hoyReal.toDate();
}
// Si es anterior al mes actual => no mostrar nada
else if (fechaParametro.isBefore(hoyReal, 'month') && fechaParametro.isSame(hoyReal, 'year')) {
$("#loader").hide();
return; // evita renderizar el calendario
}
// Para otros casos (mes futuro o año diferente) => usar la fecha dada
else {
hoy = fechaParametro.toDate();
}
} else {
hoy = new Date(); // No se pasó ninguna fecha
}
// Calcula la fecha de fin sumando 2 meses a la fecha actual
var fechaFin = new Date(hoy.getFullYear(), hoy.getMonth(), hoy.getDate() + 32);
// Formatea la fecha en el formato "YYYY-MM-DD"
var fechaInicioStr = hoy.toISOString().slice(0, 10);
// Asegura que hora y minutos tengan 2 dígitos
var hora = String(hoy.getHours()).padStart(2, '0');
var minutos = String(hoy.getMinutes()).padStart(2, '0');
// Concatena la hora al string
fechaInicioStr += " " + hora + ":" + minutos;
var horaActual = new Date().getHours();
var fechaFinStr = fechaFin.toISOString().slice(0, 10);
var csrfToken = $('meta[name="csrf-token"]').attr('content');
// $("#loader").show();
$('#calendar').fullCalendar('destroy');
$.ajax({
url: '/horasDisponiblesSite',
method: 'POST',
data: {
_token: csrfToken,
"servicio_id": state.servicio,
"profesional_id": state.profesional,
"sucursal_id": state.sucursal,
"fecha_inicio": fechaInicioStr,
"fecha_fin": fechaFinStr + " 23:59:59"
},
success: function (response) {
var eventos = [];
if (response.body && response.body.horas_disponibles) {
for (const fecha in response.body.horas_disponibles) {
if (response.body.horas_disponibles.hasOwnProperty(fecha)) {
const horas = response.body.horas_disponibles[fecha];
for (var i = 0; i < horas.length; i++) {
let titulo = "";
let color = "";
const fechaHoraFin = moment(fecha + " " + horas[i].hora_fin, "YYYY-MM-DD HH:mm");
if (fechaHoraFin > moment()) {
} else {
// titulo = txt_nodisponible;
// color = '#808080'
}
titulo = txt_disponible;
color = '#008000';
var evento = {
reserva: horas[i], // Store the hour details
title: titulo,
description: '
divFecha: ' +
escapeHTML(fecha) + + '
Hora: ' + horas[i].hora_inicio +
'
Hora fin: ' + horas[i].hora_fin +
'
Estado: ' + (horas[i].reserva ? txt_reservado : txt_disponible),
start: moment(fecha + ' ' + horas[i].hora_inicio, "YYYY-MM-DD HH:mm"),
end: moment(fecha + ' ' + horas[i].hora_fin, "YYYY-MM-DD HH:mm"),
color: color,
textColor: '#ffffff'
};
$("#loader").hide();
eventos.push(evento);
}
}
}
}
$("#loader").hide();
cargarCalendario(eventos, hoy);
// Ahora "eventos" contiene los datos del servicio
// //console.log(eventos);
},
error: function (error) {
// Manejar errores aquí.
$("#loader").hide();
console.error(error);
}
});
}
function cargarCalendario(eventos, day) {
minTime = eventos[0].reserva.hora_inicio;
maxTime = 0;
eventos.forEach(element => {
if (parseInt(minTime) > parseInt(element.reserva.hora)) {
minTime = element.reserva.hora
}
if (parseInt(maxTime) < parseInt(element.reserva.horaFin)) {
maxTime = element.reserva.horaFin
}
});
console.log(eventos[0].reserva);
$("#loader").hide();
if (eventos != '') {
$('#calendar').fullCalendar({
header: {
left: 'prev',
center: 'title',
right: 'next',
},
defaultDate: day,
defaultView: 'month',
firstDay: 1,
buttonIcons: true,
weekNumbers: false,
editable: false,
eventLimit: 1,
events: eventos,
minTime: minTime,
maxTime: maxTime,
allDaySlot: false,
dayMaxEventRows: true,
eventLimitText: function (n) {
if (n === 1) {
return '+1';
} else {
return '+' + n;
}
},
dayClick: function (date, jsEvent, view, calEvent) {
},
eventDataTransform: function (eventData) {
//console.log(eventData);
return {
...eventData, // incluye lo que ya trae
reserva: eventData.reserva // asegura que se preserve
};
},
eventClick: function (calEvent, jsEvent, view) {
$('#calendar').hide();
// const $horariosGrid = $('#fichaProfesionalHorarios');
// $horariosGrid.empty().show();
const fechaSeleccionada = calEvent.start.format('DD-MM-YYYY');
console.log(calEvent);
// console.log(calEvent.reserva)
seleccion = calEvent.reserva;
state.id_box = seleccion.id_box;
state.horaReservada = seleccion.hora_inicio;
state.fecha = fechaSeleccionada;
state.profesional = seleccion.id_profesional;
const profesional = profesionalList.find((p) => p.id === state.profesional);
const servicio = profesional.servicios.find((s) => s.id === state.servicio);
console.log('Servicio: ' + JSON.stringify(servicio)); //console.log(servicio);
state.profesional = profesional.id;
state.tiempo_duracion = servicio.tiempo;
state.id_box = servicio.id_box;
state.precio = servicio.precio;
state.comision = servicio.comision;
state.id_sku = servicio.pos_id_sku;
$("#nombreProfesional").text(profesional.nombre + " " + profesional.apellido_paterno + " " + profesional.apellido_materno);
$("#servicioReservado").text(resolverServicio(state.servicio));
$("#sucursalReservada").text(resolverSucursal(state.sucursal));
$('#costoServicio').text(formatearMiles(state.precio));
$('#fechaReserva').text(state.fecha);
$("#horaReservada").text(state.fecha + " " + state.horaReservada);
$("#nombrePaciente").text(state.nombre + " " + state.apellidoPaterno);
// state.profesional = profesional;
showStep("confirmacion");
// handleReserva(profesional.id, state.servicio, state.sucursal);
/* $horariosGrid.append(`
`);
$horariosGrid.on("click", ".horario-btn.disponible", function () {
const hora = $(this).text().trim();
state.id_box = $(this).attr("data-box");
state.horaReservada = hora;
state.fecha = fechaSeleccionada;
const profesional = profesionalList.find((p) => p.id === state.profesional);
$("#nombreProfesional").text(profesional.nombre + " " + profesional.apellido_paterno + " " + profesional.apellido_materno);
$("#servicioReservado").text(resolverServicio(state.servicio));
$("#sucursalReservada").text(resolverSucursal(state.sucursal));
$("#horaReservada").text(state.fecha + " " + state.horaReservada);
$("#nombrePaciente").text(state.nombre + " " + state.apellidoPaterno);
// state.profesional = profesional;
showStep("confirmacion");
});
$horariosGrid.append(`
`);
$('#volverCalendario').on('click', function () {
$horariosGrid.hide();
$('#loader').show();
$('#fichaProfesionalHorariosTitle').text(
'Horario Disponible'
);
$('#calendar').fullCalendar('destroy');
servicioCalendario();
$('#calendar').show();
}); */
},
eventLimitClick: function (cellInfo, jsEvent) {
// 1) Ocultar calendario y mostrar el contenedor de horarios
$('#calendar').hide();
const $horariosGrid = $('#fichaProfesionalHorarios');
$horariosGrid.empty().show();
const fechaSeleccionada = cellInfo.date.format('DD-MM-YYYY');
// 2) Extraer los “segmentos” de ese día.
// Intentamos usar allSegs, pero si viene undefined, fallback a segs, o a [].
const segmentos = cellInfo.allSegs || cellInfo.segs || [];
// 3) De cada segmento, obtenemos el “evento original” de estas formas:
// - seg.event (funciona en algunos builds de v3)
// - seg.footprint.eventInstance.def (fallback cuando seg.event es null)
const eventosDelDia = segmentos.map(seg => {
if (seg.event) {
// si FullCalendar aún conserva .event como tu objeto original
return seg.event;
}
// en cambio, muchas compilaciones de v3 guardan el evento en footprint.eventInstance.def
if (
seg.footprint &&
seg.footprint.eventInstance &&
seg.footprint.eventInstance.def
) {
return seg.footprint.eventInstance.def;
}
return null;
}).filter(e => e !== null); // eliminamos posibles nulls
// //console.log('eventosDelDia (desde eventLimitClick):', eventosDelDia[0].miscProps.reserva);
$('#fichaProfesionalHorariosTitle').text(
traducir('disponibilidad profesionales', configuracion.idioma) + ': ' + fechaSeleccionada
);
// 4) Iterar y leer “reserva” de cada evento
eventosDelDia.forEach(evento => {
// Aquí “evento” ya debe incluir .reserva si usaste eventDataTransform ó si lo pasaste desde tu AJAX
const seleccion = evento.miscProps.reserva;
console.log(seleccion);
if (!seleccion) return; // seguridad
$horariosGrid.append(`
`);
});
$horariosGrid.on("click", ".horario-btn.disponible", function () {
const hora = $(this).data("hora-inicio");
state.horaReservada = hora;
state.fecha = fechaSeleccionada;
const servicioId = $(this).data("servicio-id");
state.servicio = servicioId;
const profesional = profesionalList.find((p) => p.id === state.profesional);
const servicio = profesional.servicios.find((s) => s.id === state.servicio);
console.log('Servicio: ' + JSON.stringify(servicio)); //console.log(servicio);
state.profesional = profesional.id;
state.tiempo_duracion = servicio.tiempo;
state.id_box = servicio.id_box;
state.precio = servicio.precio;
state.comision = servicio.comision;
state.id_sku = servicio.pos_id_sku;
// handleReserva(profesional.id, state.servicio, state.sucursal);
$("#nombreProfesional").text(profesional.nombre + " " + profesional.apellido_paterno + " " + profesional.apellido_materno);
$("#servicioReservado").text(resolverServicio(state.servicio));
$("#sucursalReservada").text(resolverSucursal(state.sucursal));
$('#costoServicio').text(formatearMiles(state.precio));
$('#fechaReserva').text(state.fecha);
$("#horaReservada").text(state.fecha + " " + state.horaReservada);
$("#nombrePaciente").text(state.nombre + " " + state.apellidoPaterno);
// state.profesional = profesional;
showStep("confirmacion");
});
$horariosGrid.append(`
`);
$('#volverCalendario').on('click', function () {
$('#loader').show();
$horariosGrid.hide();
$('#fichaProfesionalHorariosTitle').text(
traducir('disponibilidad profesionales', configuracion.idioma)
);
$('#calendar').fullCalendar('destroy');
servicioCalendario();
$('#calendar').show();
});
return false; // evita que FullCalendar muestre el popover de eventos
}
});
} else {
Swal.fire(txt_no_hay_horas_dispobibles, '', 'info').then((result) => {
/* Read more about isConfirmed, isDenied below */
if (result.isConfirmed) {
///location.reload();
//$('#agenda').modal('hide');
} else if (result.isDenied) {
Swal.fire('Changes are not saved', '', 'info')
}
});
}
cambiarMes()
}
function cambiarMes() {
let mesActual = $('#calendar').fullCalendar('getView').intervalStart.format('YYYY-MM');
$(document).on('click', '.fc-prev-button, .fc-next-button', function () {
// Esperamos a que la vista se actualice luego del clic
setTimeout(function () {
$('#loader').show();
let nuevaVista = $('#calendar').fullCalendar('getView');
let nuevoMes = nuevaVista.intervalStart.format('YYYY-MM');
if (nuevoMes !== mesActual) {
mesActual = nuevoMes; // Actualizamos
console.log('Mes cambiado a:', nuevoMes);
servicioCalendario(nuevaVista.intervalStart.format());
// cargarCosas(nuevaVista.intervalStart, nuevaVista.intervalEnd);
} else {
console.log('No se cambió el mes, no se ejecuta nada.');
}
}, 10); // Un pequeño delay para asegurar que la vista se actualizó
});
}
function agendar() {
var csrfToken = $('meta[name="csrf-token"]').attr('content');
$("#loader").show();
$("#guardarDatos").prop("disabled", true);
const params = new URLSearchParams(window.location.search);
const id_operacion = params.get('id_operacion');
const folio = params.get('folio');
// Intentamos obtener el PDF desde el backend (puede o no existir)
fetch('/api/pdf-exenta')
.then(response => response.json())
.then(data => {
let emision_boleta = null;
// Si vino un PDF, lo almacenamos local y lo usamos
if (data.pdf) {
localStorage.setItem('emision_boleta_exenta', data.pdf);
emision_boleta = data.pdf;
} else {
// Si no existe, limpiamos por si había algo viejo
localStorage.removeItem('emision_boleta_exenta');
}
var datos = {
_token: csrfToken,
cliente_id: state.cliente_id,
servicio_id: state.servicio,
profesional_id: state.profesional,
sucursal_id: state.sucursal,
box_id: state.id_box,
fecha: state.fecha + ' ' + state.horaReservada,
valor_servicio: Math.round(state.precio),
valor_comision: state.comision,
tiempo_atencion: state.tiempo_duracion,
pos_detalle_operaciones_id: parseInt(id_operacion),
emision_boleta: emision_boleta, // Puede ser null
folio: folio
};
$.ajax({
url: 'api/crearReservaSite',
type: 'POST',
data: JSON.stringify(datos),
contentType: 'application/json',
headers: {
'X-CSRF-TOKEN': csrfToken
},
xhrFields: {
withCredentials: true
},
success: function (response) {
$("#loader").hide();
if (response.code == 0) {
$('#calendar').fullCalendar('destroy');
$('#btnReservar').hide();
$('#btnVolver').removeClass('btn-back').hide();
$('#btnOtraReserva').show();
$('#confirmacionTitle').hide();
$('#otraReserva').show();
profesionalList = JSON.parse(localStorage.getItem('profesionales'));
servicioList = JSON.parse(localStorage.getItem('servicios'));
handleReserva(state.profesional, state.servicio, state.sucursal, 'agendar');
localStorage.removeItem('state_reserva');
}
},
error: function (error) {
console.error('Error al guardar datos:', error);
$("#loader").hide();
}
});
})
.catch(error => {
// Si hay error al obtener el PDF, seguimos igual sin él
console.warn('No se encontró PDF exento, se continúa sin él.');
var datos = {
_token: csrfToken,
cliente_id: state.cliente_id,
servicio_id: state.servicio,
profesional_id: state.profesional,
sucursal_id: state.sucursal,
box_id: state.id_box,
fecha: state.fecha + ' ' + state.horaReservada,
valor_servicio: Math.round(state.precio),
valor_comision: state.comision,
tiempo_atencion: state.tiempo_duracion,
pos_detalle_operaciones_id: parseInt(id_operacion),
emision_boleta: null, // explícitamente nulo
folio: folio
};
$.ajax({
url: 'api/crearReservaSite',
type: 'POST',
data: JSON.stringify(datos),
contentType: 'application/json',
headers: {
'X-CSRF-TOKEN': csrfToken
},
xhrFields: {
withCredentials: true
},
success: function (response) {
$("#loader").hide();
if (response.code == 0) {
$('#calendar').fullCalendar('destroy');
$('#btnReservar').hide();
$('#btnVolver').removeClass('btn-back').hide();
$('#btnOtraReserva').show();
$('#confirmacionTitle').hide();
$('#otraReserva').show();
profesionalList = JSON.parse(localStorage.getItem('profesionales'));
servicioList = JSON.parse(localStorage.getItem('servicios'));
handleReserva(state.profesional, state.servicio, state.sucursal, 'agendar');
localStorage.removeItem('state_reserva');
}
},
error: function (error) {
console.error('Error al guardar datos (sin PDF):', error);
$("#loader").hide();
}
});
});
}
function webPay() {
$("#loader").show();
var csrfToken = $('meta[name="csrf-token"]').attr('content');
var carro = [{
id_producto: state.id_sku,
cant: 1,
netoTotal: Math.round(Math.round(state.precio) / (1 + parseFloat(state.impuesto))),
total: Math.round(state.precio),
montoIVA: Math.round(state.precio) - (Math.round(Math.round(state.precio) / (1 + parseFloat(state.impuesto)))),
}]
// alert(state.impuesto);
var datosWebPay = {
_token: csrfToken,
total: Math.round(state.precio),
totalNeto: Math.round(Math.round(state.precio) / (1 + parseFloat(state.impuesto))),
totalIva: Math.round(state.precio) - (Math.round(Math.round(state.precio) / (1 + parseFloat(state.impuesto)))),
totalImpuestoEspecifico: 0,
id_sucursal: state.sucursal,
id_comprador: state.cliente_id,
iframe: state.iframe,
carro: JSON.stringify(carro),
};
state.tokensc = csrfToken;
// state.iframe = iframe;
// alert( Math.round(Math.round(state.precio) / (1 + parseFloat(state.impuesto))),);
localStorage.setItem('state_reserva', JSON.stringify(state));
$.ajax({
url: 'api/guardarOperacionClinica',
type: 'POST',
data: JSON.stringify(datosWebPay),
contentType: 'application/json',
success: function (response) {
if (response.code == 0) {
$("#loader").hide();
$("#confirmacion").hide();
$("#titulo").hide();
$("#redirect").show();
$('#loader2').show();
$('#webpay').hide();// Muestra el mensaje
// Espera 1 segundo antes de redirigir (puedes ajustar el tiempo)
setTimeout(function () {
window.top.location.href = response.redirect_url;
}, 2000);
}
else {
$("#loader").hide();
}
},
error: function (error) {
console.error('Error al guardar datos:', error);
}
});
}
function pagarYReserva() {
showStep("webpay");
// $('#webpay-redirect-message').show();
// $("#confirmacion").hide();
}
function mercadoPago() {
$("#loader").show();
var csrfToken = $('meta[name="csrf-token"]').attr('content');
var carro = [{
id_producto: state.id_sku,
cant: 1,
netoTotal: Math.round(Math.round(state.precio) / (1 + parseFloat(state.impuesto))),
total: Math.round(state.precio),
montoIVA: Math.round(state.precio) - (Math.round(Math.round(state.precio) / (1 + parseFloat(state.impuesto)))),
}]
// alert(state.impuesto);
var datosMercadoPago = {
_token: csrfToken,
total: Math.round(state.precio),
totalNeto: Math.round(Math.round(state.precio) / (1 + parseFloat(state.impuesto))),
totalIva: Math.round(state.precio) - (Math.round(Math.round(state.precio) / (1 + parseFloat(state.impuesto)))),
totalImpuestoEspecifico: 0,
id_sucursal: state.sucursal,
id_comprador: state.cliente_id,
iframe: state.iframe,
carro: JSON.stringify(carro),
};
state.tokensc = csrfToken;
const profesional = profesionalList.find((p) => p.id === state.profesional);
const servicio = profesional.servicios.find((s) => s.id === state.servicio);
const items = [
{
id: servicio.pos_id_sku,
title: servicio.nombre,
description: servicio.descripcion,
quantity: 1,
currency_id: "CLP",
unit_price: Math.round(servicio.precio),
}
];
state.tokensc = csrfToken;
localStorage.setItem('state_reserva', JSON.stringify(state));
$.ajax({
url: '/mercadoPago', // cambia esta URL a la ruta real en tu Laravel
type: 'POST',
data: JSON.stringify({ items: items, _token: csrfToken, datosMercadoPago: datosMercadoPago }),
contentType: 'application/json',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
success: function (response) {
if (response.code == 0) {
$("#loader").hide();
$("#confirmacion").hide();
$('#webpay').hide();// Muestra el mensaje
$("#redirect-mercado-pago").show();
$('#loader3').show();
setTimeout(function () {
window.top.location.href = response.redirect_url;
}, 2000);
}
console.log('Preferencia creada:', response);
// Redireccionar al link de pago
// window.location.href = response.init_point;
},
error: function (error) {
console.error('Error al crear preferencia:', error);
}
});
}
document.addEventListener('DOMContentLoaded', function () {
const params = new URLSearchParams(window.location.search);
const paso = params.get('step');
const tokensc = params.get('tokensc');
if (paso == 'confirmacion' || paso == 'rechazo') {
$("#step1").hide();
$("#loader").show();
}
// $('#webpay-redirect-message').hide();
$('#redirect').hide();
$('#loader2').hide();
$('#loader3').hide();
$('#redirect-mercado-pago').hide();
// alert(paso);
Toast = Swal.mixin({
toast: true,
position: "center",
showConfirmButton: false,
timer: 3000,
timerProgressBar: true,
customClass: {
popup: "colored-toast",
},
});
$("#searchProfesional").on("keyup", function () {
clearTimeout(buscarTimeout); // Limpiar temporizador anterior
buscarTimeout = setTimeout(function () {
buscarProfesional(); // Llamar la función después de 1 segundo
}, 1000);
});
if (params.get('iframe')) {
localStorage.setItem('iframe', params.get('iframe'));
}
state.iframe = params.get('iframe');
diccionario();
obtenerSucursal();
});