BookTicket/src/main/java/org/example/saladeconciertos/VentaBoletos.java

284 lines
12 KiB
Java

package org.example.saladeconciertos;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.effect.DropShadow;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
public class VentaBoletos extends Application {
private static final String DB_URL = "jdbc:mysql://sql10.freesqldatabase.com:3306/sql10766655";
private static final String DB_USER = "sql10766655";
private static final String DB_PASSWORD = "7BZbRjEkXZ";
private List<Integer> selectedSeats = new ArrayList<>();
private Map<Integer, Double> seatPrices = new HashMap<>();
private String eventName = "";
private String eventDate = "";
private int eventId = 0;
private GridPane seatGrid;
private Stage mainStage;
@Override
public void start(Stage mainStage) {
this.mainStage = mainStage;
EscogerEvento escogerEvento = new EscogerEvento();
escogerEvento.mostrarVentanaSeleccionEvento(mainStage, this);
}
public int getEventId() {
return eventId;
}
public void setEventId(int eventId) {
this.eventId = eventId;
}
public void cargarInformacionEvento() {
try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
String eventQuery = "SELECT nombre, fecha FROM conciertos WHERE id = ?";
PreparedStatement eventStatement = conexion.prepareStatement(eventQuery);
eventStatement.setInt(1, eventId);
ResultSet eventResultSet = eventStatement.executeQuery();
if (eventResultSet.next()) {
eventName = eventResultSet.getString("nombre");
eventDate = eventResultSet.getString("fecha");
}
} catch (SQLException e) {
System.out.println("Error al cargar la información del evento.");
e.printStackTrace();
}
}
public void mostrarVentanaVentaBoletos(Stage mainStage) {
int totalSeats = 0;
Map<Integer, String> seatStatus = new HashMap<>();
try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
String seatQuery = "SELECT a.id, a.precio_base, b.status FROM asientos a JOIN boleto b ON a.id = b.id_asiento WHERE b.idevento = ?";
PreparedStatement seatStatement = conexion.prepareStatement(seatQuery);
seatStatement.setInt(1, eventId);
ResultSet seatResultSet = seatStatement.executeQuery();
while (seatResultSet.next()) {
int seatId = seatResultSet.getInt("id");
double precio = seatResultSet.getDouble("precio_base");
String status = seatResultSet.getString("status");
seatStatus.put(seatId, status);
seatPrices.put(seatId, precio);
totalSeats++;
}
} catch (SQLException e) {
System.out.println("Error en la conexión a la base de datos.");
e.printStackTrace();
}
mainStage.setTitle("Gestión de Boletos");
// Modificado: Título con el nombre del evento
Label titleLabel = new Label(eventName);
titleLabel.getStyleClass().add("title");
// Agregar el logo de la aplicación
ImageView logo = new ImageView(new Image(getClass().getResourceAsStream("/logo.png")));
logo.setFitWidth(100);
logo.setFitHeight(100);
// Crear y configurar el label de bienvenida
Label welcomeLabel = new Label("Seleccione sus asientos");
seatGrid = new GridPane();
seatGrid.getStyleClass().add("seat-grid");
seatGrid.setHgap(10); // Espaciado horizontal entre celdas
seatGrid.setVgap(10); // Espaciado vertical entre celdas
seatGrid.setPadding(new Insets(20)); // Padding alrededor del GridPane
// Crear y configurar el botón de confirmación
Button confirmButton = new Button("Confirmar Compra");
confirmButton.getStyleClass().add("button");
int cols = 5;
int rows = (int) Math.ceil((double) totalSeats / cols);
for (int seatNumber = 1; seatNumber <= totalSeats; seatNumber++) {
int row = (seatNumber - 1) / cols;
int col = (seatNumber - 1) % cols;
char rowLetter = (char) ('A' + row);
String seatLabel = rowLetter + String.valueOf(col + 1);
Button seatButton = new Button(seatLabel);
seatButton.getStyleClass().add("seat-button");
seatButton.setMinSize(80, 40); // Tamaño mínimo de cada botón
seatButton.setMaxSize(80, 40); // Tamaño máximo de cada botón
seatButton.setPadding(new Insets(10)); // Padding dentro de cada botón
int finalSeatNumber = seatNumber;
if ("vendido".equals(seatStatus.getOrDefault(finalSeatNumber, "disponible"))) {
seatButton.setDisable(true);
} else {
seatButton.setOnAction(e -> {
if (!selectedSeats.contains(finalSeatNumber)) {
selectedSeats.add(finalSeatNumber);
seatButton.setStyle("-fx-background-color: #45a049;");
} else {
selectedSeats.remove(Integer.valueOf(finalSeatNumber));
seatButton.setStyle("");
}
});
}
seatGrid.add(seatButton, col, row);
}
confirmButton.setOnAction(e -> {
if (selectedSeats.isEmpty()) {
mostrarAlerta("Advertencia", "No se han seleccionado asientos", "Por favor, seleccione al menos un asiento.");
} else {
final List<Integer> finalSelectedSeats = new ArrayList<>(selectedSeats);
final Map<Integer, Double> finalSeatPrices = new HashMap<>(seatPrices);
final String finalEventName = eventName;
final String finalEventDate = eventDate;
VentanaPago ventanaPago = new VentanaPago(this);
ventanaPago.mostrarVentanaPago(finalSelectedSeats, finalSeatPrices, finalEventName, finalEventDate);
}
});
// Nuevo: Botón para regresar a la ventana de selección de eventos
Button backButton = new Button("Regresar");
backButton.getStyleClass().add("button");
backButton.setOnAction(e -> {
EscogerEvento escogerEvento = new EscogerEvento();
escogerEvento.mostrarVentanaSeleccionEvento(mainStage, this);
});
// Añadir sombra al botón "Regresar"
DropShadow shadow = new DropShadow();
shadow.setColor(Color.rgb(0, 0, 0, 0.25));
shadow.setRadius(10);
shadow.setOffsetX(0);
shadow.setOffsetY(2);
backButton.setEffect(shadow);
// Colocar el botón "Regresar" en la esquina superior izquierda
BorderPane borderPane = new BorderPane();
borderPane.setPadding(new Insets(10));
borderPane.setTop(backButton);
BorderPane.setAlignment(backButton, Pos.TOP_LEFT);
VBox mainLayout = new VBox(20, logo, titleLabel, welcomeLabel, seatGrid, confirmButton);
mainLayout.setAlignment(Pos.TOP_CENTER);
mainLayout.setPadding(new Insets(20));
borderPane.setCenter(mainLayout);
Scene mainScene = new Scene(borderPane, 540, 600);
mainScene.getStylesheets().add(getClass().getResource("/styles.css").toExternalForm());
mainStage.setScene(mainScene);
mainStage.show();
}
public void refrescarInterfaz() {
selectedSeats.clear();
Map<Integer, String> seatStatus = cargarEstadoAsientos();
seatGrid.getChildren().clear();
int totalSeats = seatStatus.size();
int cols = 5;
int rows = (int) Math.ceil((double) totalSeats / cols);
for (int seatNumber = 1; seatNumber <= totalSeats; seatNumber++) {
int row = (seatNumber - 1) / cols;
int col = (seatNumber - 1) % cols;
char rowLetter = (char) ('A' + row);
String seatLabel = rowLetter + String.valueOf(col + 1);
Button seatButton = new Button(seatLabel);
seatButton.getStyleClass().add("seat-button");
seatButton.setMinSize(80, 40); // Tamaño mínimo de cada botón
seatButton.setMaxSize(80, 40); // Tamaño máximo de cada botón
seatButton.setPadding(new Insets(10)); // Padding dentro de cada botón
int finalSeatNumber = seatNumber;
if ("vendido".equals(seatStatus.getOrDefault(finalSeatNumber, "disponible"))) {
seatButton.setDisable(true);
} else {
seatButton.setOnAction(e -> {
if (!selectedSeats.contains(finalSeatNumber)) {
selectedSeats.add(finalSeatNumber);
seatButton.setStyle("-fx-background-color: #45a049;");
} else {
selectedSeats.remove(Integer.valueOf(finalSeatNumber));
seatButton.setStyle("");
}
});
}
seatGrid.add(seatButton, col, row);
}
}
private Map<Integer, String> cargarEstadoAsientos() {
Map<Integer, String> seatStatus = new HashMap<>();
try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
String query = "SELECT id_asiento, status FROM boleto WHERE idevento = ?";
PreparedStatement statement = conexion.prepareStatement(query);
statement.setInt(1, eventId);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
int seatId = resultSet.getInt("id_asiento");
String status = resultSet.getString("status");
seatStatus.put(seatId, status);
}
} catch (SQLException e) {
System.out.println("Error al cargar el estado de los asientos.");
e.printStackTrace();
}
return seatStatus;
}
public void mostrarAlerta(String titulo, String encabezado, String contenido) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle(titulo);
alert.setHeaderText(encabezado);
alert.setContentText(contenido);
alert.showAndWait();
}
public void actualizarEstadoBoletos(List<Integer> selectedSeats, int idevento) {
try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
String updateQuery = "UPDATE boleto SET status = 'vendido', fechaVenta = CURDATE() WHERE id_asiento = ? AND idevento = ?";
PreparedStatement preparedStatement = conexion.prepareStatement(updateQuery);
for (int seat : selectedSeats) {
preparedStatement.setInt(1, seat);
preparedStatement.setInt(2, idevento);
preparedStatement.executeUpdate();
}
System.out.println("Estado de los boletos actualizado correctamente.");
} catch (SQLException e) {
System.out.println("Error al actualizar el estado de los boletos.");
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}