284 lines
12 KiB
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);
|
|
}
|
|
} |