Files
Complejo_Cap1tan/php/Guardar_Reserva.php
T
MarcosFlorSalcedo 8ec55e40fc 1ra Versión
2026-07-14 18:24:27 -03:00

226 lines
9.2 KiB
PHP

<?php
session_start();
require_once 'conexion.php';
header('Content-Type: application/json');
// Obtener datos del POST
$data = json_decode(file_get_contents("php://input"), true);
if (!$data) {
echo json_encode([
'success' => 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()
]);
}
?>