package org.example.saladeconciertos; 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.ComboBox; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.scene.control.ButtonType; import java.io.InputStream; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class EscogerEvento { // Datos de conexión a la base de datos 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"; // Método para mostrar la ventana de selección de eventos public void mostrarVentanaSeleccionEvento(Stage mainStage, VentaBoletos ventaBoletos) { // Crear y configurar el label para seleccionar un evento Label selectEventLabel = new Label("Seleccione un evento:"); selectEventLabel.getStyleClass().add("label"); // Crear y configurar el ComboBox para listar los eventos ComboBox<String> eventComboBox = new ComboBox<>(); // Crear y configurar el label para mostrar el evento seleccionado Label selectedEventLabel = new Label("Evento seleccionado: Ninguno"); selectedEventLabel.getStyleClass().add("label"); // Crear y configurar el botón de confirmación Button confirmButton = new Button("Confirmar"); confirmButton.getStyleClass().add("button"); // Crear y configurar el botón de generar reporte Button reportButton = new Button("Generar Reporte"); reportButton.getStyleClass().add("button"); // Cargar eventos desde la base de datos try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { String query = "SELECT id, nombre FROM conciertos"; Statement statement = conexion.createStatement(); ResultSet resultSet = statement.executeQuery(query); // Añadir los eventos al ComboBox while (resultSet.next()) { int id = resultSet.getInt("id"); String nombre = resultSet.getString("nombre"); eventComboBox.getItems().add(id + " - " + nombre); } } catch (SQLException e) { System.out.println("Error al cargar los eventos."); e.printStackTrace(); } // Actualizar el label cuando se selecciona un evento eventComboBox.setOnAction(e -> { String selectedEvent = eventComboBox.getValue(); if (selectedEvent != null) { selectedEventLabel.setText("Evento seleccionado: " + selectedEvent); } }); // Acción del botón de confirmación confirmButton.setOnAction(e -> { String selectedEvent = eventComboBox.getValue(); if (selectedEvent != null) { int eventId = Integer.parseInt(selectedEvent.split(" - ")[0]); ventaBoletos.setEventId(eventId); ventaBoletos.cargarInformacionEvento(); ventaBoletos.mostrarVentanaVentaBoletos(mainStage); } else { ventaBoletos.mostrarAlerta("Advertencia", "No se ha seleccionado un evento", "Por favor, seleccione un evento."); } }); // Acción del botón de generar reporte reportButton.setOnAction(e -> { String selectedEvent = eventComboBox.getValue(); if (selectedEvent != null) { int eventId = Integer.parseInt(selectedEvent.split(" - ")[0]); generarReporte(eventId, selectedEvent.split(" - ")[1]); } else { ventaBoletos.mostrarAlerta("Advertencia", "No se ha seleccionado un evento", "Por favor, seleccione un evento."); } }); // 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 layout principal VBox layout = new VBox(20, logo, selectEventLabel, eventComboBox, selectedEventLabel, confirmButton, reportButton); layout.setAlignment(Pos.CENTER); layout.setPadding(new Insets(20)); // Crear y configurar la escena Scene scene = new Scene(layout, 400, 400); scene.getStylesheets().add(getClass().getResource("/styles.css").toExternalForm()); mainStage.setScene(scene); mainStage.show(); } // Método para convertir IDs de asientos a nombres de asientos private String convertirIdAsientoANombre(int seatId) { int fila = (seatId - 1) / 5; int numero = (seatId - 1) % 5 + 1; char filaLetra = (char) ('A' + fila); return filaLetra + String.valueOf(numero); } // Método para generar el reporte de boletos vendidos private void generarReporte(int eventId, String eventName) { List<String> seatDetails = new ArrayList<>(); StringBuilder reportContent = new StringBuilder(); reportContent.append("Reporte de Boletos Vendidos\n"); // Obtener la fecha del evento String eventDate = ""; try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { String eventQuery = "SELECT fecha FROM conciertos WHERE id = ?"; PreparedStatement eventStatement = conexion.prepareStatement(eventQuery); eventStatement.setInt(1, eventId); ResultSet eventResultSet = eventStatement.executeQuery(); if (eventResultSet.next()) { eventDate = eventResultSet.getDate("fecha").toString(); } } catch (SQLException e) { System.out.println("Error al obtener la fecha del evento."); e.printStackTrace(); } reportContent.append("Evento: ").append(eventName).append(" - Fecha: ").append(eventDate).append("\n\n"); try (Connection conexion = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { String query = "SELECT a.id, a.precio_base, b.fechaVenta FROM asientos a JOIN boleto b ON a.id = b.id_asiento WHERE b.idevento = ? AND b.status = 'vendido'"; PreparedStatement statement = conexion.prepareStatement(query); statement.setInt(1, eventId); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { int seatId = resultSet.getInt("id"); double price = resultSet.getDouble("precio_base"); Date saleDate = resultSet.getDate("fechaVenta"); String seatName = convertirIdAsientoANombre(seatId); String seatDetail = "Asiento: " + seatName + ", Precio: $" + price + ", Fecha de Venta: " + saleDate; seatDetails.add(seatDetail); reportContent.append(seatDetail).append("\n"); } } catch (SQLException e) { System.out.println("Error al generar el reporte."); e.printStackTrace(); } // Mostrar el reporte en una alerta mostrarAlertaConBotonPDF("Reporte de Boletos Vendidos", "Detalles del Reporte", reportContent.toString(), eventName, seatDetails); } // Método para mostrar una alerta con un botón para generar PDF private void mostrarAlertaConBotonPDF(String titulo, String encabezado, String contenido, String eventName, List<String> seatDetails) { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle(titulo); alert.setHeaderText(encabezado); alert.setContentText(contenido); ButtonType buttonTypePDF = new ButtonType("Generar PDF"); alert.getButtonTypes().add(buttonTypePDF); alert.showAndWait().ifPresent(response -> { if (response == buttonTypePDF) { // Generar el PDF del reporte usando la clase PDFGenerator InputStream qrImageStream = getClass().getResourceAsStream("/qrcode.png"); // Cambia esto por la ruta de tu imagen QR String timestamp = new java.text.SimpleDateFormat("yyyy-MM-dd HH_mm").format(new java.util.Date()); String pdfFileName = "Reporte_"+eventName.replace(" ", "_")+"_" + timestamp + ".pdf"; PDFGenerator.generarPDF(eventName, "", "", 0.0, qrImageStream, String.join("\n", seatDetails), pdfFileName); } }); } // Método para mostrar una alerta private void mostrarAlerta(String titulo, String encabezado, String contenido) { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle(titulo); alert.setHeaderText(encabezado); alert.setContentText(contenido); alert.showAndWait(); } }