false, 'message' => 'Datos no recibidos' ]); exit; } $nombre = isset($data['nombre']) ? trim($data['nombre']) : ''; $telefono = isset($data['telefono']) ? trim($data['telefono']) : ''; $dni = isset($data['dni']) ? trim($data['dni']) : ''; $fecha = isset($data['fecha']) ? $data['fecha'] : ''; $horario = isset($data['horario']) ? $data['horario'] : ''; $tipo = isset($data['tipo']) ? $data['tipo'] : ''; $numeroCancha = isset($data['numeroCancha']) ? intval($data['numeroCancha']) : 0; $monto = isset($data['monto']) ? floatval($data['monto']) : 0; $incluirQuincho = isset($data['incluirQuincho']) ? $data['incluirQuincho'] : false; $montoQuincho = isset($data['montoQuincho']) ? floatval($data['montoQuincho']) : 0; $idCancha = isset($data['idCancha']) ? intval($data['idCancha']) : null; // Validar datos requeridos if (empty($nombre) || empty($telefono) || empty($dni) || empty($fecha) || empty($horario) || empty($tipo) || $numeroCancha === 0 || $monto === 0) { echo json_encode([ 'success' => false, 'message' => 'Datos incompletos' ]); exit; } try { // Escapar datos para evitar SQL injection $nombre = mysqli_real_escape_string($conexion, $nombre); $telefono = mysqli_real_escape_string($conexion, $telefono); $dni = mysqli_real_escape_string($conexion, $dni); $fecha = mysqli_real_escape_string($conexion, $fecha); $horario = mysqli_real_escape_string($conexion, $horario); $tipo = mysqli_real_escape_string($conexion, $tipo); // Buscar o crear cliente $sqlBuscarCliente = "SELECT ID_Cliente FROM clientes WHERE DNI = '$dni'"; $resBuscar = mysqli_query($conexion, $sqlBuscarCliente); if (!$resBuscar) { throw new Exception("Error al buscar cliente: " . mysqli_error($conexion)); } $cliente = mysqli_fetch_assoc($resBuscar); if ($cliente) { // Cliente existe, actualizar datos $idCliente = $cliente['ID_Cliente']; $sqlActualizarCliente = "UPDATE clientes SET Nombre = '$nombre', Telefono = '$telefono' WHERE ID_Cliente = $idCliente"; if (!mysqli_query($conexion, $sqlActualizarCliente)) { throw new Exception("Error al actualizar cliente: " . mysqli_error($conexion)); } } else { // Crear nuevo cliente $sqlCrearCliente = "INSERT INTO clientes (Nombre, Telefono, DNI) VALUES ('$nombre', '$telefono', '$dni')"; if (!mysqli_query($conexion, $sqlCrearCliente)) { throw new Exception("Error al crear cliente: " . mysqli_error($conexion)); } $idCliente = mysqli_insert_id($conexion); } // Obtener los datos de la cancha usada para calcular el cupón $sqlObtenerCancha = "SELECT ID_Cancha, Cant_Reservas_Cupon, Descuento_Cupon, Cant_Faltas, Duracion_Cupon FROM canchas WHERE Tipo = '$tipo' LIMIT 1"; $resCancha = mysqli_query($conexion, $sqlObtenerCancha); if (!$resCancha) { throw new Exception("Error al obtener cancha: " . mysqli_error($conexion)); } $cancha = mysqli_fetch_assoc($resCancha); if (!$cancha) { throw new Exception("No existe cancha del tipo especificado"); } $idCancha = $cancha['ID_Cancha']; $umbral = intval($cancha['Cant_Reservas_Cupon']); $descuentoCupon = floatval($cancha['Descuento_Cupon']); $maxFaltas = intval($cancha['Cant_Faltas']); $duracionCupon = intval($cancha['Duracion_Cupon']); // Buscar fila de cupón existente para el cliente y tipo de cancha $sqlBuscarCupon = "SELECT ID_Cupon, Cantidad_Reservas, Cantidad_Faltas, Ultima_Fecha, Descuento FROM cupones WHERE ID_Cliente = $idCliente AND Tipo = '$tipo' LIMIT 1"; $resCupon = mysqli_query($conexion, $sqlBuscarCupon); if (!$resCupon) { throw new Exception("Error al buscar cupón: " . mysqli_error($conexion)); } $cupon = mysqli_fetch_assoc($resCupon); if (!$cupon) { $sqlCrearCupon = "INSERT INTO cupones (Cantidad_Reservas, Cantidad_Faltas, Tipo, Ultima_Fecha, Descuento, ID_Cliente) VALUES (0, 0, '$tipo', NULL, 0, $idCliente)"; if (!mysqli_query($conexion, $sqlCrearCupon)) { throw new Exception("Error al crear cupón: " . mysqli_error($conexion)); } $cupon = [ 'ID_Cupon' => mysqli_insert_id($conexion), 'Cantidad_Reservas' => 0, 'Cantidad_Faltas' => 0, 'Ultima_Fecha' => null, 'Descuento' => 0 ]; } $cantidadReservasCupon = intval($cupon['Cantidad_Reservas']); $cantidadFaltasCupon = intval($cupon['Cantidad_Faltas']); $ultimaFechaCupon = $cupon['Ultima_Fecha']; // Caducidad del cupón if ($duracionCupon > 0 && !empty($ultimaFechaCupon)) { $fechaUltima = new DateTime($ultimaFechaCupon); $fechaUltima->modify("+{$duracionCupon} days"); $fechaActual = new DateTime(); if ($fechaActual > $fechaUltima) { $cantidadReservasCupon = 0; $cantidadFaltasCupon = 0; $ultimaFechaCupon = null; $sqlResetCupon = "UPDATE cupones SET Cantidad_Reservas = 0, Cantidad_Faltas = 0, Ultima_Fecha = NULL, Descuento = 0 WHERE ID_Cupon = {$cupon['ID_Cupon']}"; if (!mysqli_query($conexion, $sqlResetCupon)) { throw new Exception("Error al resetear cupón vencido: " . mysqli_error($conexion)); } } } // Si la cantidad de faltas supera el máximo permitido, reiniciamos el conteo de reservas if ($maxFaltas > 0 && $cantidadFaltasCupon > $maxFaltas) { $cantidadReservasCupon = 0; $cantidadFaltasCupon = 0; $ultimaFechaCupon = null; $sqlResetCupon = "UPDATE cupones SET Cantidad_Reservas = 0, Cantidad_Faltas = 0, Ultima_Fecha = NULL, Descuento = 0 WHERE ID_Cupon = {$cupon['ID_Cupon']}"; if (!mysqli_query($conexion, $sqlResetCupon)) { throw new Exception("Error al resetear cupón por faltas: " . mysqli_error($conexion)); } } // Convertir horario a formato DATETIME $fechaHora = $fecha . ' ' . $horario . ':00'; $descuentoAplicado = 0; $montoFinal = $monto; $valorCupon = $descuentoCupon; if ($umbral > 0 && ($cantidadReservasCupon + 1) >= $umbral) { $descuentoAplicado = $valorCupon; $montoFinal = round($monto * (1 - $descuentoAplicado), 2); $cantidadReservasCupon = 0; $cantidadFaltasCupon = 0; $ultimaFechaCupon = date('Y-m-d H:i:s'); } else { $cantidadReservasCupon += 1; $ultimaFechaCupon = date('Y-m-d H:i:s'); } $sqlActualizarCupon = "UPDATE cupones SET Cantidad_Reservas = $cantidadReservasCupon, Cantidad_Faltas = $cantidadFaltasCupon, Ultima_Fecha = " . ($ultimaFechaCupon ? "'$ultimaFechaCupon'" : "NULL") . ", Descuento = $descuentoAplicado WHERE ID_Cupon = {$cupon['ID_Cupon']}"; if (!mysqli_query($conexion, $sqlActualizarCupon)) { throw new Exception("Error al actualizar cupón: " . mysqli_error($conexion)); } // Obtener ID del usuario desde la sesión $id_usuario = isset($_SESSION['id_usuario']) ? intval($_SESSION['id_usuario']) : null; // Insertar reserva de cancha $sqlInsertarReserva = "INSERT INTO reservas (Fecha_Hora, Monto, Numero, Estado, ID_Cliente, ID_Cancha, Descuento, ID_Usuario) VALUES ('$fechaHora', $montoFinal, $numeroCancha, 0, $idCliente, $idCancha, $descuentoAplicado, $id_usuario)"; if (!mysqli_query($conexion, $sqlInsertarReserva)) { throw new Exception("Error al insertar reserva: " . mysqli_error($conexion)); } $idReserva = mysqli_insert_id($conexion); // Si incluye quincho, insertar reserva de quincho if ($incluirQuincho && $montoQuincho > 0) { // Obtener ID_Cancha para quincho $sqlObtenerQuincho = "SELECT ID_Cancha FROM canchas WHERE Tipo = 'Q'"; $resQuincho = mysqli_query($conexion, $sqlObtenerQuincho); if (!$resQuincho) { throw new Exception("Error al obtener quincho: " . mysqli_error($conexion)); } $quincho = mysqli_fetch_assoc($resQuincho); if ($quincho) { $idQuincho = $quincho['ID_Cancha']; // El quincho se reserva por el día completo, entonces el número es 1 (hay un solo quincho) $sqlInsertarQuincho = "INSERT INTO reservas (Fecha_Hora, Monto, Numero, Estado, ID_Cliente, ID_Cancha, Descuento, ID_Usuario) VALUES ('$fechaHora', $montoQuincho, 1, 0, $idCliente, $idQuincho, 0, $id_usuario)"; if (!mysqli_query($conexion, $sqlInsertarQuincho)) { throw new Exception("Error al insertar reserva de quincho: " . mysqli_error($conexion)); } } } echo json_encode([ 'success' => true, 'message' => 'Reserva confirmada exitosamente', 'id_reserva' => $idReserva, 'id_cliente' => $idCliente ]); } catch (Exception $e) { echo json_encode([ 'success' => false, 'message' => $e->getMessage() ]); } ?>