<?php error_reporting(E_ALL); ini_set('display_errors', 1); include 'conexion.php'; header('Content-Type: application/json'); $rawData = file_get_contents("php://input"); $data = json_decode($rawData, true); // Verificar si los datos están bien formateados if (!isset($data['asientos']) || !is_array($data['asientos']) || !isset($data['nombre_comprador'])) { echo json_encode(["error" => "Datos inválidos", "datosRecibidos" => $data]); exit; } $nombreComprador = $data['nombre_comprador']; $conexionBD->begin_transaction(); try { $boletosComprados = []; foreach ($data['asientos'] as $idAsiento) { // Verificar si el asiento sigue disponible y obtener el precio $stmtVerificar = $conexionBD->prepare(" SELECT a.estado, a.numero_asiento, a.id_zona, z.nombre_zona, z.precio, c.id_concierto, c.nombre_concierto, c.artista, c.fecha FROM asientos a JOIN zonas z ON a.id_zona = z.id_zona JOIN conciertos c ON z.id_concierto = c.id_concierto WHERE a.id_asiento = ?"); $stmtVerificar->bind_param("i", $idAsiento); $stmtVerificar->execute(); $resultado = $stmtVerificar->get_result()->fetch_assoc(); if (!$resultado || $resultado['estado'] !== 'disponible') { throw new Exception("El asiento ID $idAsiento ya está ocupado o no existe."); } // Marcar el asiento como ocupado $stmtActualizar = $conexionBD->prepare("UPDATE asientos SET estado = 'ocupado' WHERE id_asiento = ?"); if (!$stmtActualizar) throw new Exception("Error en la preparación de la actualización: " . $conexionBD->error); $stmtActualizar->bind_param("i", $idAsiento); if (!$stmtActualizar->execute()) throw new Exception("Error al actualizar asiento: " . $stmtActualizar->error); // Insertar el boleto en la base de datos $stmtBoleto = $conexionBD->prepare("INSERT INTO boletos (id_concierto, id_zona, id_asiento, nombre_comprador, precio, fecha_concierto, artista) VALUES (?, ?, ?, ?, ?, ?, ?)"); if (!$stmtBoleto) throw new Exception("Error en la preparación del insert de boletos: " . $conexionBD->error); $stmtBoleto->bind_param("iiisdss", $resultado['id_concierto'], $resultado['id_zona'], $idAsiento, $nombreComprador, $resultado['precio'], $resultado['fecha'], $resultado['artista']); if (!$stmtBoleto->execute()) throw new Exception("Error al insertar boleto: " . $stmtBoleto->error); // Obtener el ID del boleto recién insertado $idBoleto = $stmtBoleto->insert_id; // Insertar la venta en la tabla "ventas" $stmtVenta = $conexionBD->prepare("INSERT INTO ventas (id_concierto, id_boleto) VALUES (?, ?)"); if (!$stmtVenta) throw new Exception("Error en la preparación del insert de ventas: " . $conexionBD->error); $stmtVenta->bind_param("ii", $resultado['id_concierto'], $idBoleto); if (!$stmtVenta->execute()) throw new Exception("Error al registrar la venta: " . $stmtVenta->error); // Guardar datos del boleto para enviarlos al frontend $boletosComprados[] = [ 'nombre_concierto' => $resultado['nombre_concierto'], 'artista' => $resultado['artista'], 'fecha' => $resultado['fecha'], 'zona' => $resultado['nombre_zona'], 'numero_asiento' => $resultado['numero_asiento'], 'precio' => $resultado['precio'], 'nombre_comprador' => $nombreComprador ]; } $conexionBD->commit(); echo json_encode(["success" => true, "message" => "¡Compra realizada con éxito! El boleto ha sido generado y registrado en ventas.", "boletos" => $boletosComprados]); } catch (Exception $e) { $conexionBD->rollback(); echo json_encode(["error" => $e->getMessage()]); } exit; ?>